From f8a6d51d0b21a4398eb70cca797b7772ba7e5284 Mon Sep 17 00:00:00 2001 From: Quarter Date: Wed, 3 Jul 2024 21:56:59 +0300 Subject: [PATCH 01/42] Finished destruction development for rocket motors --- .../block/BlockBipropellantRocketMotor.java | 58 +++++++++++++++++- .../block/BlockRocketMotor.java | 30 ++++++--- .../advancedRocketry/client/ClientProxy.java | 27 ++++++-- .../client/render/RendererBrokenPart.java | 27 ++++++++ .../client/render/RendererRocket.java | 1 - .../advbipropellantrocketmotor.json | 16 ++--- .../blockstates/advrocketmotor.json | 16 ++--- .../blockstates/bipropellantrocketmotor.json | 16 ++--- .../blockstates/nuclearrocketmotor.json | 16 ++--- .../blockstates/rocketmotor.json | 16 ++--- ...ketmotor.mtl => advbipropellantrocket.mtl} | 2 +- ...ketmotor.obj => advbipropellantrocket.obj} | 2 +- .../{advrocketmotor.mtl => advrocket.mtl} | 2 +- .../{advrocketmotor.obj => advrocket.obj} | 2 +- ...rocketmotor.mtl => bipropellantrocket.mtl} | 2 +- ...rocketmotor.obj => bipropellantrocket.obj} | 2 +- ...clearrocketmotor.mtl => nuclearrocket.mtl} | 2 +- ...clearrocketmotor.obj => nuclearrocket.obj} | 2 +- .../models/{rocketmotor.mtl => rocket.mtl} | 2 +- .../models/{rocketmotor.obj => rocket.obj} | 2 +- .../models/advbipropellantcombustion.png | Bin 4537 -> 0 bytes .../textures/models/advbipropellantrocket.png | Bin 0 -> 4628 bytes .../models/advbipropellantrocket_0.png | Bin 0 -> 4472 bytes .../models/advbipropellantrocket_1.png | Bin 0 -> 9494 bytes .../models/advbipropellantrocket_2.png | Bin 0 -> 9427 bytes .../models/advbipropellantrocket_3.png | Bin 0 -> 9633 bytes .../textures/models/advcombustion.png | Bin 4745 -> 0 bytes .../textures/models/advrocket.png | Bin 0 -> 4856 bytes .../textures/models/advrocket_0.png | Bin 0 -> 4771 bytes .../textures/models/advrocket_1.png | Bin 0 -> 9836 bytes .../textures/models/advrocket_2.png | Bin 0 -> 9649 bytes .../textures/models/advrocket_3.png | Bin 0 -> 9871 bytes .../models/bipropellantcombustion.png | Bin 4537 -> 0 bytes .../textures/models/bipropellantrocket.png | Bin 0 -> 4628 bytes .../textures/models/bipropellantrocket_0.png | Bin 0 -> 4473 bytes .../textures/models/bipropellantrocket_1.png | Bin 0 -> 9516 bytes .../textures/models/bipropellantrocket_2.png | Bin 0 -> 9472 bytes .../textures/models/bipropellantrocket_3.png | Bin 0 -> 9677 bytes .../textures/models/combustion.png | Bin 4745 -> 0 bytes .../textures/models/nuclearengine.png | Bin 4474 -> 0 bytes .../textures/models/nuclearrocket.png | Bin 0 -> 4518 bytes .../textures/models/nuclearrocket_0.png | Bin 0 -> 4396 bytes .../textures/models/nuclearrocket_1.png | Bin 0 -> 9291 bytes .../textures/models/nuclearrocket_2.png | Bin 0 -> 9383 bytes .../textures/models/nuclearrocket_3.png | Bin 0 -> 9535 bytes .../textures/models/rocket.png | Bin 0 -> 4856 bytes .../textures/models/rocket_0.png | Bin 0 -> 4666 bytes .../textures/models/rocket_1.png | Bin 0 -> 10416 bytes .../textures/models/rocket_2.png | Bin 0 -> 10096 bytes .../textures/models/rocket_3.png | Bin 0 -> 10425 bytes .../textures/models/tank_1.png | Bin 0 -> 8829 bytes .../textures/models/tank_2.png | Bin 0 -> 9177 bytes .../textures/models/tank_3.png | Bin 0 -> 9764 bytes 53 files changed, 178 insertions(+), 65 deletions(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java rename src/main/resources/assets/advancedrocketry/models/block/models/{advbipropellantrocketmotor.mtl => advbipropellantrocket.mtl} (52%) rename src/main/resources/assets/advancedrocketry/models/block/models/{advbipropellantrocketmotor.obj => advbipropellantrocket.obj} (99%) rename src/main/resources/assets/advancedrocketry/models/block/models/{advrocketmotor.mtl => advrocket.mtl} (58%) rename src/main/resources/assets/advancedrocketry/models/block/models/{advrocketmotor.obj => advrocket.obj} (99%) rename src/main/resources/assets/advancedrocketry/models/block/models/{bipropellantrocketmotor.mtl => bipropellantrocket.mtl} (58%) rename src/main/resources/assets/advancedrocketry/models/block/models/{bipropellantrocketmotor.obj => bipropellantrocket.obj} (99%) rename src/main/resources/assets/advancedrocketry/models/block/models/{nuclearrocketmotor.mtl => nuclearrocket.mtl} (61%) rename src/main/resources/assets/advancedrocketry/models/block/models/{nuclearrocketmotor.obj => nuclearrocket.obj} (99%) rename src/main/resources/assets/advancedrocketry/models/block/models/{rocketmotor.mtl => rocket.mtl} (64%) rename src/main/resources/assets/advancedrocketry/models/block/models/{rocketmotor.obj => rocket.obj} (99%) delete mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advbipropellantcombustion.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_0.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_1.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_2.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_3.png delete mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advcombustion.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advrocket.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advrocket_0.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advrocket_1.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advrocket_2.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/advrocket_3.png delete mode 100644 src/main/resources/assets/advancedrocketry/textures/models/bipropellantcombustion.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket_0.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket_1.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket_2.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket_3.png delete mode 100644 src/main/resources/assets/advancedrocketry/textures/models/combustion.png delete mode 100644 src/main/resources/assets/advancedrocketry/textures/models/nuclearengine.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/nuclearrocket.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/nuclearrocket_0.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/nuclearrocket_1.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/nuclearrocket_2.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/nuclearrocket_3.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/rocket.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/rocket_0.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/rocket_1.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/rocket_2.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/rocket_3.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/tank_1.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/tank_2.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/tank_3.png diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java index a375c2313..fddb9c485 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java @@ -3,14 +3,22 @@ import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import zmaster587.advancedRocketry.api.IRocketEngine; +import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.libVulpes.block.BlockFullyRotatable; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public class BlockBipropellantRocketMotor extends BlockFullyRotatable implements IRocketEngine { @@ -36,7 +44,55 @@ public int getFuelConsumptionRate(World world, int x, int y, int z) { @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, @Nonnull ItemStack stack) { - + NBTTagCompound compound = stack.getTagCompound(); + int stage = 0; + if (compound != null && compound.hasKey("destruction_stage")) { + stage = compound.getInteger("destruction_stage"); + } world.setBlockState(pos, state.withProperty(FACING, EnumFacing.DOWN)); + + TileEntity te = world.getTileEntity(pos); + ((TileBrokenPart) te).setStage(stage); + } + +// @Override +// public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { +// if (!worldIn.isRemote) { +// TileEntity te = worldIn.getTileEntity(pos); +// ((TileBrokenPart) te).transition(); +// } +// return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); +// } + + @Override + public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { + if (!world.isRemote && !player.isCreative()) { + ItemStack drop = new ItemStack(this.getItemDropped(state, world.rand, 0)); + + TileBrokenPart tile = (TileBrokenPart) te; + NBTTagCompound compound = new NBTTagCompound(); + compound.setInteger("destruction_stage", tile.getStage()); + drop.setTagCompound(compound); + + world.spawnEntity(new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), drop)); + } + + super.harvestBlock(world, player, pos, state, te, stack); + } + + @Override + public void getDrops(final NonNullList drops, final IBlockAccess world, final BlockPos pos, final IBlockState state, final int fortune) { + // no drops here + } + + @Override + public boolean hasTileEntity(IBlockState state) { + return true; + } + + @Nullable + @Override + public TileEntity createTileEntity(final World worldIn, final IBlockState state) { + return new TileBrokenPart(10, 0.1F); } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java index 86aa18612..b25b683c3 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java @@ -4,9 +4,11 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; @@ -48,19 +50,29 @@ public IBlockState getActualState(@Nonnull IBlockState state, IBlockAccess world return state; } + @Override + public int getThrust(World world, BlockPos pos) { + return 10; + } + + @Override + public int getFuelConsumptionRate(World world, int x, int y, int z) { + return 1; + } + @Override public boolean isOpaqueCube(@Nonnull IBlockState state) { return false; } @Override - public int getThrust(World world, BlockPos pos) { - return 10; + public boolean isBlockNormalCube(@Nonnull final IBlockState state) { + return false; } @Override - public int getFuelConsumptionRate(World world, int x, int y, int z) { - return 1; + public EnumBlockRenderType getRenderType(final IBlockState state) { + return EnumBlockRenderType.INVISIBLE; } @Override @@ -86,19 +98,19 @@ public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, Entity // } @Override - public void breakBlock(final World world, final BlockPos pos, final IBlockState state) { - if (!world.isRemote) { + public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { + if (!world.isRemote && !player.isCreative()) { ItemStack drop = new ItemStack(this.getItemDropped(state, world.rand, 0)); - TileBrokenPart te = (TileBrokenPart) world.getTileEntity(pos); + TileBrokenPart tile = (TileBrokenPart) te; NBTTagCompound compound = new NBTTagCompound(); - compound.setInteger("destruction_stage", te.getStage()); + compound.setInteger("destruction_stage", tile.getStage()); drop.setTagCompound(compound); world.spawnEntity(new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), drop)); } - super.breakBlock(world, pos, state); + super.harvestBlock(world, player, pos, state, te, stack); } @Override diff --git a/src/main/java/zmaster587/advancedRocketry/client/ClientProxy.java b/src/main/java/zmaster587/advancedRocketry/client/ClientProxy.java index 8a6f186f3..e00154bea 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/ClientProxy.java +++ b/src/main/java/zmaster587/advancedRocketry/client/ClientProxy.java @@ -30,11 +30,15 @@ import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.client.registry.IRenderFactory; import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; import zmaster587.advancedRocketry.AdvancedRocketry; import zmaster587.advancedRocketry.api.AdvancedRocketryBlocks; import zmaster587.advancedRocketry.api.AdvancedRocketryItems; import zmaster587.advancedRocketry.api.stations.ISpaceObject; +import zmaster587.advancedRocketry.backwardCompat.ModelFormatException; +import zmaster587.advancedRocketry.backwardCompat.WavefrontObject; import zmaster587.advancedRocketry.block.BlockCrystal; import zmaster587.advancedRocketry.block.CrystalColorizer; import zmaster587.advancedRocketry.client.model.ModelRocket; @@ -47,6 +51,7 @@ import zmaster587.advancedRocketry.event.PlanetEventHandler; import zmaster587.advancedRocketry.event.RocketEventHandler; import zmaster587.advancedRocketry.stations.SpaceObjectManager; +import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.advancedRocketry.tile.TileFluidTank; import zmaster587.advancedRocketry.tile.TileRocketAssemblingMachine; import zmaster587.advancedRocketry.tile.cables.TileDataPipe; @@ -64,16 +69,31 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; +@Mod.EventBusSubscriber(value = Side.CLIENT) public class ClientProxy extends CommonProxy { private static final zmaster587.advancedRocketry.dimension.DimensionManager dimensionManagerClient = new zmaster587.advancedRocketry.dimension.DimensionManager(); + private static final Map models = new HashMap<>(); + + public static WavefrontObject getModel(ResourceLocation location) { + WavefrontObject model = models.getOrDefault(location, null); + if (model == null) { + try { + model = new WavefrontObject(location); + models.put(location, model); + } catch (ModelFormatException e) { + e.printStackTrace(); + } + } + return model; + } @Override public void registerRenderers() { - - ClientRegistry.bindTileEntitySpecialRenderer(TileRocketAssemblingMachine.class, new RendererRocketAssemblingMachine()); ClientRegistry.bindTileEntitySpecialRenderer(TilePrecisionAssembler.class, new RendererPrecisionAssembler()); ClientRegistry.bindTileEntitySpecialRenderer(TileCuttingMachine.class, new RendererCuttingMachine()); @@ -104,6 +124,7 @@ public void registerRenderers() { ClientRegistry.bindTileEntitySpecialRenderer(zmaster587.advancedRocketry.tile.multiblock.machine.TileCentrifuge.class, new zmaster587.advancedRocketry.client.render.multiblocks.RenderCentrifuge()); ClientRegistry.bindTileEntitySpecialRenderer(TilePrecisionLaserEtcher.class, new RendererPrecisionLaserEtcher()); ClientRegistry.bindTileEntitySpecialRenderer(TileSolarArray.class, new RendererSolarArray()); + ClientRegistry.bindTileEntitySpecialRenderer(TileBrokenPart.class, new RendererBrokenPart()); //ClientRegistry.bindTileEntitySpecialRenderer(TileModelRenderRotatable.class, modelBlock); @@ -240,8 +261,6 @@ public void preInitItems() { public void preinit() { OBJLoader.INSTANCE.addDomain("advancedrocketry"); registerRenderers(); - - } private void registerFluidModel(IFluidBlock fluidBlock) { diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java new file mode 100644 index 000000000..2ce1a70e5 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java @@ -0,0 +1,27 @@ +package zmaster587.advancedRocketry.client.render; + +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.util.ResourceLocation; +import zmaster587.advancedRocketry.backwardCompat.WavefrontObject; +import zmaster587.advancedRocketry.client.ClientProxy; +import zmaster587.advancedRocketry.tile.TileBrokenPart; + +public class RendererBrokenPart extends TileEntitySpecialRenderer { + + @Override + public void render(TileBrokenPart tile, double x, double y, double z, float t, int damage, float a) { + GlStateManager.pushMatrix(); + GlStateManager.translate((float) x, (float) y, (float) z); + + ResourceLocation res = tile.getBlockType().getRegistryName(); + String name = tile.getBlockType().getUnlocalizedName().split("\\.")[1].toLowerCase(); + String pathToTexture = "textures/models/" + name + "_" + tile.getStage() / 3 + ".png"; + this.bindTexture(new ResourceLocation(res.getResourceDomain(), pathToTexture)); + + WavefrontObject model = ClientProxy.getModel(new ResourceLocation(res.getResourceDomain(), "models/block/models/" + name + ".obj")); + model.renderAll(); + + GlStateManager.popMatrix(); + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/RendererRocket.java b/src/main/java/zmaster587/advancedRocketry/client/render/RendererRocket.java index 61a0f1fb1..57a958948 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/RendererRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/RendererRocket.java @@ -166,7 +166,6 @@ public void doRender(@Nonnull Entity entity, double x, double y, double z, float for (TileEntity tile : storage.getTileEntityList()) { TileEntitySpecialRenderer renderer = TileEntityRendererDispatcher.instance.renderers.get(tile.getClass()); if (renderer != null) { - if (tileEntityBlockChiseled == null || !tileEntityBlockChiseled.isInstance(tile)) { TileEntityRendererDispatcher.instance.render(tile, tile.getPos().getX(), tile.getPos().getY(), tile.getPos().getZ(), f1); } diff --git a/src/main/resources/assets/advancedrocketry/blockstates/advbipropellantrocketmotor.json b/src/main/resources/assets/advancedrocketry/blockstates/advbipropellantrocketmotor.json index 362c031ce..9c42ab421 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/advbipropellantrocketmotor.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/advbipropellantrocketmotor.json @@ -4,16 +4,16 @@ "textures": { "#None": "advancedrocketry:/models/advbipropellantcombustion" }, - "model": "advancedrocketry:models/advbipropellantrocketmotor.obj", + "model": "advancedrocketry:models/advbipropellantrocket.obj", "transform": "forge:default-block" }, "variants": { - "facing=north": { "model": "advancedrocketry:models/advbipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 90 }, - "facing=south": { "model": "advancedrocketry:models/advbipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 90, "y": 180 }, - "facing=west": { "model": "advancedrocketry:models/advbipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 90, "y": 270 }, - "facing=east": { "model": "advancedrocketry:models/advbipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 90, "y": 90 }, - "facing=up": { "model": "advancedrocketry:models/advbipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 180 }, - "facing=down": { "model": "advancedrocketry:models/advbipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion" }, - "inventory": { "model": "advancedrocketry:models/advbipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion"} + "facing=north": { "model": "advancedrocketry:models/advbipropellantrocket.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 90 }, + "facing=south": { "model": "advancedrocketry:models/advbipropellantrocket.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 90, "y": 180 }, + "facing=west": { "model": "advancedrocketry:models/advbipropellantrocket.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 90, "y": 270 }, + "facing=east": { "model": "advancedrocketry:models/advbipropellantrocket.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 90, "y": 90 }, + "facing=up": { "model": "advancedrocketry:models/advbipropellantrocket.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion", "x": 180 }, + "facing=down": { "model": "advancedrocketry:models/advbipropellantrocket.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion" }, + "inventory": { "model": "advancedrocketry:models/advbipropellantrocket.obj", "texture": "advancedrocketry:textures/models/advbipropellantcombustion"} } } diff --git a/src/main/resources/assets/advancedrocketry/blockstates/advrocketmotor.json b/src/main/resources/assets/advancedrocketry/blockstates/advrocketmotor.json index f91ec760f..84ff1f773 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/advrocketmotor.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/advrocketmotor.json @@ -4,16 +4,16 @@ "textures": { "#None": "advancedrocketry:/models/advcombustion" }, - "model": "advancedrocketry:models/advrocketmotor.obj", + "model": "advancedrocketry:models/advrocket.obj", "transform": "forge:default-block" }, "variants": { - "facing=north": { "model": "advancedrocketry:models/advrocketmotor.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 90 }, - "facing=south": { "model": "advancedrocketry:models/advrocketmotor.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 90, "y": 180 }, - "facing=west": { "model": "advancedrocketry:models/advrocketmotor.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 90, "y": 270 }, - "facing=east": { "model": "advancedrocketry:models/advrocketmotor.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 90, "y": 90 }, - "facing=up": { "model": "advancedrocketry:models/advrocketmotor.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 180 }, - "facing=down": { "model": "advancedrocketry:models/advrocketmotor.obj", "texture": "advancedrocketry:textures/models/advcombustion" }, - "inventory": { "model": "advancedrocketry:models/advrocketmotor.obj", "texture": "advancedrocketry:textures/models/advcombustion"} + "facing=north": { "model": "advancedrocketry:models/advrocket.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 90 }, + "facing=south": { "model": "advancedrocketry:models/advrocket.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 90, "y": 180 }, + "facing=west": { "model": "advancedrocketry:models/advrocket.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 90, "y": 270 }, + "facing=east": { "model": "advancedrocketry:models/advrocket.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 90, "y": 90 }, + "facing=up": { "model": "advancedrocketry:models/advrocket.obj", "texture": "advancedrocketry:textures/models/advcombustion", "x": 180 }, + "facing=down": { "model": "advancedrocketry:models/advrocket.obj", "texture": "advancedrocketry:textures/models/advcombustion" }, + "inventory": { "model": "advancedrocketry:models/advrocket.obj", "texture": "advancedrocketry:textures/models/advcombustion"} } } diff --git a/src/main/resources/assets/advancedrocketry/blockstates/bipropellantrocketmotor.json b/src/main/resources/assets/advancedrocketry/blockstates/bipropellantrocketmotor.json index 3f744738c..36bea8b6a 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/bipropellantrocketmotor.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/bipropellantrocketmotor.json @@ -4,18 +4,18 @@ "textures": { "#None": "advancedrocketry:/models/bipropellantcombustion" }, - "model": "advancedrocketry:models/bipropellantrocketmotor.obj", + "model": "advancedrocketry:models/bipropellantrocket.obj", "transform": "forge:default-block" }, "variants": { - "facing=north": { "model": "advancedrocketry:models/bipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 90 }, - "facing=south": { "model": "advancedrocketry:models/bipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 90, "y": 180 }, - "facing=west": { "model": "advancedrocketry:models/bipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 90, "y": 270 }, - "facing=east": { "model": "advancedrocketry:models/bipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 90, "y": 90 }, - "facing=up": { "model": "advancedrocketry:models/bipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 180 }, - "facing=down": { "model": "advancedrocketry:models/bipropellantrocketmotor.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png" }, + "facing=north": { "model": "advancedrocketry:models/bipropellantrocket.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 90 }, + "facing=south": { "model": "advancedrocketry:models/bipropellantrocket.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 90, "y": 180 }, + "facing=west": { "model": "advancedrocketry:models/bipropellantrocket.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 90, "y": 270 }, + "facing=east": { "model": "advancedrocketry:models/bipropellantrocket.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 90, "y": 90 }, + "facing=up": { "model": "advancedrocketry:models/bipropellantrocket.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png", "x": 180 }, + "facing=down": { "model": "advancedrocketry:models/bipropellantrocket.obj", "texture": "advancedrocketry:textures/models/bipropellantcombustion.png" }, "inventory": { - "model": "advancedrocketry:models/bipropellantrocketmotor.obj", + "model": "advancedrocketry:models/bipropellantrocket.obj", "textures": { "layer0": "advancedrocketry:textures/models/bipropellantcombustion.png" } diff --git a/src/main/resources/assets/advancedrocketry/blockstates/nuclearrocketmotor.json b/src/main/resources/assets/advancedrocketry/blockstates/nuclearrocketmotor.json index 12ae68144..8b318ce39 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/nuclearrocketmotor.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/nuclearrocketmotor.json @@ -4,18 +4,18 @@ "textures": { "#None": "advancedrocketry:/models/nuclearcombustion" }, - "model": "advancedrocketry:models/bipropellantrocketmotor.obj", + "model": "advancedrocketry:models/nuclearrocket.obj", "transform": "forge:default-block" }, "variants": { - "facing=north": { "model": "advancedrocketry:models/nuclearrocketmotor.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 90 }, - "facing=south": { "model": "advancedrocketry:models/nuclearrocketmotor.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 90, "y": 180 }, - "facing=west": { "model": "advancedrocketry:models/nuclearrocketmotor.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 90, "y": 270 }, - "facing=east": { "model": "advancedrocketry:models/nuclearrocketmotor.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 90, "y": 90 }, - "facing=up": { "model": "advancedrocketry:models/nuclearrocketmotor.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 180 }, - "facing=down": { "model": "advancedrocketry:models/nuclearrocketmotor.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png" }, + "facing=north": { "model": "advancedrocketry:models/nuclearrocket.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 90 }, + "facing=south": { "model": "advancedrocketry:models/nuclearrocket.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 90, "y": 180 }, + "facing=west": { "model": "advancedrocketry:models/nuclearrocket.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 90, "y": 270 }, + "facing=east": { "model": "advancedrocketry:models/nuclearrocket.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 90, "y": 90 }, + "facing=up": { "model": "advancedrocketry:models/nuclearrocket.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png", "x": 180 }, + "facing=down": { "model": "advancedrocketry:models/nuclearrocket.obj", "texture": "advancedrocketry:textures/models/nuclearcombustion.png" }, "inventory": { - "model": "advancedrocketry:models/bipropellantrocketmotor.obj", + "model": "advancedrocketry:models/nuclearrocket.obj", "textures": { "layer0": "advancedrocketry:textures/models/nuclearcombustion.png" } diff --git a/src/main/resources/assets/advancedrocketry/blockstates/rocketmotor.json b/src/main/resources/assets/advancedrocketry/blockstates/rocketmotor.json index d41bf7e67..a9acbbecc 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/rocketmotor.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/rocketmotor.json @@ -4,18 +4,18 @@ "textures": { "#None": "advancedrocketry:/models/combustion" }, - "model": "advancedrocketry:models/rocketmotor.obj", + "model": "advancedrocketry:models/rocket.obj", "transform": "forge:default-block" }, "variants": { - "facing=north": { "model": "advancedrocketry:models/rocketmotor.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 90 }, - "facing=south": { "model": "advancedrocketry:models/rocketmotor.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 90, "y": 180 }, - "facing=west": { "model": "advancedrocketry:models/rocketmotor.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 90, "y": 270 }, - "facing=east": { "model": "advancedrocketry:models/rocketmotor.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 90, "y": 90 }, - "facing=up": { "model": "advancedrocketry:models/rocketmotor.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 180 }, - "facing=down": { "model": "advancedrocketry:models/rocketmotor.obj", "texture": "advancedrocketry:textures/models/combustion.png" }, + "facing=north": { "model": "advancedrocketry:models/rocket.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 90 }, + "facing=south": { "model": "advancedrocketry:models/rocket.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 90, "y": 180 }, + "facing=west": { "model": "advancedrocketry:models/rocket.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 90, "y": 270 }, + "facing=east": { "model": "advancedrocketry:models/rocket.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 90, "y": 90 }, + "facing=up": { "model": "advancedrocketry:models/rocket.obj", "texture": "advancedrocketry:textures/models/combustion.png", "x": 180 }, + "facing=down": { "model": "advancedrocketry:models/rocket.obj", "texture": "advancedrocketry:textures/models/combustion.png" }, "inventory": { - "model": "advancedrocketry:models/rocketmotor.obj", + "model": "advancedrocketry:models/rocket.obj", "textures": { "layer0": "advancedrocketry:textures/models/combustion.png" } diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocketmotor.mtl b/src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocket.mtl similarity index 52% rename from src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocketmotor.mtl rename to src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocket.mtl index 84466e27b..250c3c6ff 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocketmotor.mtl +++ b/src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocket.mtl @@ -2,4 +2,4 @@ # Material Count: 1 newmtl Material -map_Kd advancedrocketry:models/advbipropellantcombustion +map_Kd advancedrocketry:models/advbipropellantrocket diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocketmotor.obj b/src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocket.obj similarity index 99% rename from src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocketmotor.obj rename to src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocket.obj index bb2d98a50..e7a2a2b56 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocketmotor.obj +++ b/src/main/resources/assets/advancedrocketry/models/block/models/advbipropellantrocket.obj @@ -1,6 +1,6 @@ # Blender v2.78 (sub 0) OBJ File: '' # www.blender.org -mtllib advbipropellantrocketmotor.mtl +mtllib advbipropellantrocket.mtl o Material v 0.050000 0.760000 0.400000 v 0.093301 0.577936 0.425000 diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/advrocketmotor.mtl b/src/main/resources/assets/advancedrocketry/models/block/models/advrocket.mtl similarity index 58% rename from src/main/resources/assets/advancedrocketry/models/block/models/advrocketmotor.mtl rename to src/main/resources/assets/advancedrocketry/models/block/models/advrocket.mtl index afa57a192..9e0eaaefc 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/advrocketmotor.mtl +++ b/src/main/resources/assets/advancedrocketry/models/block/models/advrocket.mtl @@ -2,4 +2,4 @@ # Material Count: 1 newmtl Material -map_Kd advancedrocketry:models/advcombustion +map_Kd advancedrocketry:models/advrocket diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/advrocketmotor.obj b/src/main/resources/assets/advancedrocketry/models/block/models/advrocket.obj similarity index 99% rename from src/main/resources/assets/advancedrocketry/models/block/models/advrocketmotor.obj rename to src/main/resources/assets/advancedrocketry/models/block/models/advrocket.obj index 8def6833c..8ed8c0f4b 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/advrocketmotor.obj +++ b/src/main/resources/assets/advancedrocketry/models/block/models/advrocket.obj @@ -1,6 +1,6 @@ # Blender v2.78 (sub 0) OBJ File: '' # www.blender.org -mtllib advrocketmotor.mtl +mtllib advrocket.mtl o Material v 0.050000 0.760000 0.400000 v 0.093301 0.577936 0.425000 diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocketmotor.mtl b/src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocket.mtl similarity index 58% rename from src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocketmotor.mtl rename to src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocket.mtl index 9c1dd0767..908e4affa 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocketmotor.mtl +++ b/src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocket.mtl @@ -2,4 +2,4 @@ # Material Count: 1 newmtl Material -map_Kd advancedrocketry:models/bipropellantcombustion +map_Kd advancedrocketry:models/bipropellantrocket diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocketmotor.obj b/src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocket.obj similarity index 99% rename from src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocketmotor.obj rename to src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocket.obj index 3a085169d..c8314220b 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocketmotor.obj +++ b/src/main/resources/assets/advancedrocketry/models/block/models/bipropellantrocket.obj @@ -1,6 +1,6 @@ # Blender v2.77 (sub 0) OBJ File: 'combustion.blend' # www.blender.org -mtllib bipropellantrocketmotor.mtl +mtllib bipropellantrocket.mtl o rocketmotor v 0.500000 0.456373 0.220000 v 0.302010 0.456373 0.302010 diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocketmotor.mtl b/src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocket.mtl similarity index 61% rename from src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocketmotor.mtl rename to src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocket.mtl index e9a9666f8..5c49b9236 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocketmotor.mtl +++ b/src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocket.mtl @@ -2,4 +2,4 @@ # Material Count: 2 newmtl Material -map_Kd advancedrocketry:models/nuclearengine +map_Kd advancedrocketry:models/nuclearrocket diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocketmotor.obj b/src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocket.obj similarity index 99% rename from src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocketmotor.obj rename to src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocket.obj index 66c8741c8..5e345e18b 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocketmotor.obj +++ b/src/main/resources/assets/advancedrocketry/models/block/models/nuclearrocket.obj @@ -1,6 +1,6 @@ # Blender v2.79 (sub 0) OBJ File: 'rocket.blend' # www.blender.org -mtllib nuclearrocketmotor.mtl +mtllib nuclearrocket.mtl o rocketmotor v 0.302010 0.456373 0.302010 v 0.500000 0.005000 -0.000500 diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/rocketmotor.mtl b/src/main/resources/assets/advancedrocketry/models/block/models/rocket.mtl similarity index 64% rename from src/main/resources/assets/advancedrocketry/models/block/models/rocketmotor.mtl rename to src/main/resources/assets/advancedrocketry/models/block/models/rocket.mtl index ff7f7bf57..b192a1f1f 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/rocketmotor.mtl +++ b/src/main/resources/assets/advancedrocketry/models/block/models/rocket.mtl @@ -2,4 +2,4 @@ # Material Count: 1 newmtl Material -map_Kd advancedrocketry:models/combustion +map_Kd advancedrocketry:models/rocket diff --git a/src/main/resources/assets/advancedrocketry/models/block/models/rocketmotor.obj b/src/main/resources/assets/advancedrocketry/models/block/models/rocket.obj similarity index 99% rename from src/main/resources/assets/advancedrocketry/models/block/models/rocketmotor.obj rename to src/main/resources/assets/advancedrocketry/models/block/models/rocket.obj index ebe6651f0..64ca9614c 100644 --- a/src/main/resources/assets/advancedrocketry/models/block/models/rocketmotor.obj +++ b/src/main/resources/assets/advancedrocketry/models/block/models/rocket.obj @@ -1,6 +1,6 @@ # Blender v2.77 (sub 0) OBJ File: 'combustion.blend' # www.blender.org -mtllib rocketmotor.mtl +mtllib rocket.mtl o rocketmotor v 0.500000 0.456373 0.220000 v 0.302010 0.456373 0.302010 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantcombustion.png b/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantcombustion.png deleted file mode 100644 index aa01bbb103415d625a3500a7ff35a26ff4252c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4537 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 X<5GPeD>3FN00000NkvXXu0mjfe)g;K diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket.png b/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket.png new file mode 100644 index 0000000000000000000000000000000000000000..86a9aefe142eb38d67663e07a551911bd50b8440 GIT binary patch literal 4628 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 KMNUMnLSTa38RHxP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_0.png b/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_0.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e6db9f1976de27bca153bf62f6a8cbe89a690b GIT binary patch literal 4472 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 KMNUMnLSTY2289j) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_1.png b/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c46e27949e8c68cab6ec31f8edc5fe582c0bdaf GIT binary patch literal 9494 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 MiM4T&;kl6i1^PdQwg3PC literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_2.png b/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f5dbc7f73e043d9f4b3a6c155535e10ac1aeefd0 GIT binary patch literal 9427 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_3.png b/src/main/resources/assets/advancedrocketry/textures/models/advbipropellantrocket_3.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9480900443f3cfc0bfc6e88698427b50e83e78 GIT binary patch literal 9633 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 F_8+ibw1ofw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advcombustion.png b/src/main/resources/assets/advancedrocketry/textures/models/advcombustion.png deleted file mode 100644 index 22d995ec5524ac06e55c266d1b2846f8413dc7ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4745 zcmV;45_av0P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3#rlH|G#g#YstJ_0v@&oYV8O^mlyczWkW**&~df@4NawiS=FReehW@+0M4x`feom<8wdcccHeQ3vIQ0 zH+8(G&UfH7<^81cc=%bwe!K5Cav@4f7?on&DI|Zt^J77>Pe`4!eTP(|UFCZ%j+3O1 zO9bR6_daLuzX#~2Ab+mhuhIXy`X%_WzxUHGvD7z4T>R;SAb%eG8{%&pr!R}*&kt0- zfcZm^&sp`H{dm{25>b5_<=rPbHiviHSMxSUATx0m|;xRAP%WJvecM6H97or3#iaZkH0bwAxzhJ-W_DowYjSJ9kDLY2+b8 zM;Udr(I@nodCJsTW}R*J6<1ow#L`t(U2XLp+(s#O-m-OZt;I1=M1|42XYSR{)pS3pth{e&5PKRg%(qv z$i6LF;ZbEk9830?owHd)wdfePv-T-|)xh3C=9G|SdUmRPYh?2FI+wOptcqx_%G1t5 zt+P-ZvuwoHW?7l~-Lw1a0kXSD=Q`{(?vJ>nbSO12$v`K%v8_rTx8?F7xVcYMa)rFQ zu2ih9N0HSrlAsAfnF(C#Cu4O&_p3i~J)!7bBIDgQ6G|^D?LL~9lI9?IM(-jMK+q%p#$#q&VFA(n;6#JGwMzB+F$WqyTuB6>} z8VBbEhR%Lc>M>7P*ksnFkqr(GNx`I2WEFuATTwWYYzPhvOb2cdKDUXmc!{M!Ocn6j z9?$_FYMz?9#TIH>#)KntONpqMNF!~MLWGlZ?}(+F9f_3{R;gWdQ)hv}B2@b&dPj=4 zJRU0u-V6VAE*)-z;Bkvunve|)kAi1u35+Cb58kiAj%HlnzSM)eSWl3Ye4M_NCYy8{ zcuw{w_O07P#(*DqzM&{|ponT47|C6tPyGFLoP@PB5i`G+8_XrbneW*uydeAARqH zI5`kYtE791Xt5>l9*a4M4jl=glVuzFNQ6dVB-|k^OS_F)%0b1>97lY2Hh9!}P}{Y+f|I8si~Z;t3Bo6317jH6 z;=T_$CXT@pOa5i4hxrSOjLGn(<_$HpSsq+!6rr?WqGcyFz^2w3O6&ny26!ZL`eoW) ziMvzD7?b=S*-FM*TG7N!(vS#yEtyNmf@I-2Hf53qxs6dLtXU{E3XiNhV5lK1v5YWU zubN@SLyCq7{7!rpv#BIhYoq2E?a&%*5F!Vgm@Y0#Z-(=&*>>O)%iWrkgD(PV z_{;X#C3TR+B#7yG+VFf{>Nd+L<`PyU9p0R%7flj?*(Ww5l%oM#*#Wc5P5c?f(J zs#@e><3a?O5}!NJaM%b_+cpp|t0% z;&y)>t!K_jjL>f?5KJHf7j7J+DYobjZ&HRR0ZzFRUrpdM8XnY}4k8T85bDA4u7Y?Z zWOP_8iuL^$hJRSw+`XWOzaq(LN}Xp!s!H*j=4h2V03lHr9qP5Iq)qpek_ z;t)Wn;0<9$0vZ;^x_;ghE$vHW!VtWRv@It7Nvjv*xs7qQNHR@irNUH;Mz9XrL%oFn zQ)akt1(QZ}(=LU*1Nmrypyqc2?u8L);N^pN(Pq4&dOo4G_I-3Du@t zp0j2r%H&5~=H-xPtp$}fP_uAS$n!3)Ad)*IJwfDB>)yF^<1gRe}3a=1Mih%V`#F>yMTAGn`QJeSIK_a_?`*c zRRCi}p}w0rT)QV`Hha+yAY$4sK2_{}<|i@%Ia$V@)@recZDj)gLG2B2T-mOWkqDGK>4vHihk~M7eb#Hv0{Zjf#c_U3q#|qh+FDx7=%Tdz8-)3W9Yvv=)z{ z5KO=94usO0Nb-{Q96DLA6?lc%%hbwRNZx4LqML)x(57hL*1C1;OKwv!Xk_UaXxNy& zsa(BeEXxANT(l(vO+uV>ct%r{gU|;}qgm}teOi-fzJL)o)I6V?g)pjE=eTD~Zh33u z0S9w=r6Jwa?3wl-AZy&{hnWQNh5n#2ooK_ zu99g3tg^qlL5%BNnFAbeGdoczY@juq?mi*W@I;?d5lJj)^5iEDh6KR!yv*4Atp1+n3JRwJnQS8x~cBsJj=W9&l*tk76W`D@hme;n|OnGdeb&I z?-NH@Nmhx^iDM>Rkob}7N{in(7hM*3X2i^-=ZPc4VzG;rE@mZDBc39Ts+vyuLbk;! z=Pk}!rN-L#Zo(+40!vr63n2Zz8| zk+Ro4-rd(dw|{%u^ZNl_;c}nE28`N}Df*~l#Y=RQ8g#U*ff(21bEFxqFA))LdAt7OeCJta* z9((XS>`YI0S9QH#mqk_PA$x>uyyWic-uvBq>U`&X-xXJ`T#+>6%8%bB3KJ|#MF<6n zKp>G4W`4+U&P7Ve`|tmT7d5nlA8p5G^>2U0uni<24y?st%=ROjOP5~bMUF!OOs7*` z`SMq>Y?CnXQ4|%+vH*|>x}6qjTE5T##MP_UWUtpF2xFp1plbp|PF1SJkw@EEpduvC za*DD#JER`e<5Q@h2>(^M{Sm)iJ{0z_A<@YzPar(q9-g@h8grZ_v z>N8`G8cG=Wb-@V*$LX@Z{twnS)&U5D2~N9%locD>8{EGAck(jhc`!$2Kv7ggQ)G&! zv%0#dXps8|!q{0niXqV;Fud;k{8Gyybb4Zy3uzYfv^XI>Ul!E8M z97#d9)53OahI1~upW`?t-~YiotlhiGM<4xm?=QY|;Tt4LOs?iU59Y`K(zN8#rPoN) z6x$Y*l|agfixHjW&_ttr5lJ3# ztlLMbwd5L>PL||!-9ElIIdo1E#aJzy-SLQ1XI?@9a0h*SZw7#ATR1)Ei2&y27jT>w z;dIKx-#=6;6?6SLq^gpnwLU~a41n)Vh|_3qZ`baiYITsq!5oqA*A!^FN!P76d4d0Q z!6*u{yZ~S@7yvK}JUVT6Z;x))f}?2~swOB4Nzdt1R2gL@nItpvEJrsC0Bp;yGf?Cy z9oMDXvRPPK#GA|xUyepjMON&aimX6a45Sc9QPZI|Wow%zEu*F}EmF!#lH~=egjRb$ zyF#T70AS{ML{UQQhq(O?LY7VSCm1b@G>-Rxp6?+Puv#`kN`#bTc}AS1Se8kgrsTP# ztUxru8M;Q1*Jm1L3xMsdO%%6Nr*P^`$f~+jnKd`EhQww+29wM$@{ZIyhkESWaaZIN(&%L#~3EYULqq2b3vRFLk;&wV12by4ey9Vt%9C5toB4ve0E4*N5 zZ_lnj1-(U8z=?&^`|ayb@XM0+{BUn>YwIzan-jv(W4!4uTbt9v?*T6iah(AAq)jrm=Rz;ZwY&H`mwb59cxL4ol6NGdEvnqpk5D X_#>q|(1wC900000NkvXXu0mjf4l4v4 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advrocket.png b/src/main/resources/assets/advancedrocketry/textures/models/advrocket.png new file mode 100644 index 0000000000000000000000000000000000000000..479f8327c7a46eb8732a1b45efeec63888132e53 GIT binary patch literal 4856 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 eT6(k!I{pIy!^!@Q)G*or0000@nD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advrocket_0.png b/src/main/resources/assets/advancedrocketry/textures/models/advrocket_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbbbed0b99a1ab1e99684e198e1bbb4a5914357 GIT binary patch literal 4771 zcmV;U5?t+xP)EX>4Tx04UFukxM87Q@&j`P zjw@bQY^C#N@t*31^$B}+M(Hx!8E1kirqM9Svr3vAJ+j)OxI|??Qo-Nm`=`Zah-(#7 z9HV5g(0xDZ4}N#+Cj0veN%aw^dG@^bP6%zo_m<~<9eLjOF$ACB(k}TkhcNUZ`c_Hn zIDp0tIKL`s#tvL;LhEBzcXVG0$_ylv@OCQSG!HE|P`6mz0J;bD|$!pl#hpv=l zFI9MVZFz5hp7Hx5@&kNha;q|#1w8-&010qNS#tmY4#WTe4#WYKD-Ig~014-MR9JLU zVRs;Ka&Km7Y-J#Hd2nSQWq4_3004N}t(a+&;9Ju4B_mr*y^;j;`A2O&@QG36+HgzIvT#!-Fu6UdjJesIjtLIjoL zLJlkRaKgUl873~~xMSfQ;{*^JtEt2mC%^=d;|M2~)Y3{7%x2s!C5GddFX7s4*WL^j z%PTN71{Q+|e|@;WyZKKJch0mB1z*2ng$(w4_rIx7z%1d|gn%s?#W0OG|EfY8w}^EKog4LQTiw@6Y* z#7Qx1+zN&m5au1CobZL+59EFeHz)PCaEt#7IcL!QKag`k_eb3R1hr*#ZeGNmEVP*V zMD}gb3Xdui;#jiB?3~RbYD34lowZN#s|IWbnNvcR>9JJ%*2u%#>s;DaA)B1`s@&}? z)H(~rG0R45?I|mMzk7CnJwbLC>0F1M#{ChOln$i^E*a=VH?~#D!!&VfIBpbp82Cf4)2%kc(d5f1=8pKoq zuk8UH*h9@zQ@7YcP0N^YWNs-D6%%QsO;U((a_$|mbh9I|vcf90i*D*HFj$0YzeMjy z@s?-D3WE2-f1OK*+aP${qL$K)6daGj&e9SXN!A{AzXle~xxRg=hwb7$K~nN@`cj%~ z(rvJFvOi(BZVwp)`(WoAib4m9sJ4NVj1qm~@9)M*SW6@EvjGn#Mjx|o*JhU6b*Wcx~blo2;`GNos|Z@YOg?7LS1IQRxl#unb|3 zzIQ^L9Ehb=(mh4A*phdT#WRQw9SNY5WgGfPghpW`wnJFR1?x2k>{J8BK_jD(@-P!n zQ-X)<(^AVe*)z0aO_b`M;?%NQ+HKTQ4k~u$IO4mr$)nbT+OEwNoID*_>_^u~5I!je zjA3w#aUXO{HU>*9`In_0?k_wtCc~SWH`LH(d2p#wgwleGmYvi9d$iV2Vh_kNz$1~< zFVpr)+?`6sndJA#Rx;MoiY9K7hD6wF$y`DfBn!{6MEfdFW;oxPnFF6#u4z&Z zz6hwXU(Dl|)Ik=LAg1SO!}EEm+bpAamarn}@a9ClXp#UtePT00IU2B)EjFb^Rxi|> zhrm~%szn|)E<}Jw;xhsbhs`jxZ36*A{+w;l5@Q!)mhK79+EElyX_*g|tCc~i!`@ZP z9f?vUZui&Gdgh$O2>qr4!2}|3;bwz0#TNbHP0A1@z$sVas|kEY!-IO$L4;u$LOnR% zRS=Jaj1G%MvA+Mp@DFR7yBGBES0p)2sq>6TRVjYc9F27vD*q@VJr3bhGQ3cyDZiU; zw6zLV90CXxydlg?K*PgW*UvW5(!N9{3}JVXw#CFhY4u_}w>i!hNv4UcRCv^)5v+su zP;Vi?lo`gYU{Xpydi~ga49TEcO@|^RI)%KL3}cqJOvlPle)1i&Jto+~x^&u<)U;=OVhh9=8)7ua3w<{7=rRkB|U z-!nnG3Sg`#)OT}-Yxl&=o?f&Ah?usEPZfKg`H4(GPL^TQS}hhaQzq~q)ZPHcmF)@{ ziExVaMx7x}Z=Zl1x&<>2YQjEmNsKKG#z<_{jc?V5EO z?Y--)X0RO^Ax7rMu$59Bwpb+*<<^DR>^C?zDjFJe<>^_CmWhVla<9qlQ9eH?2-e-u zT0D+IF#Ym75K3zz$xGUE=w!WC;1yyoQ!8sBd828IZVoy_o1%SN>(;F=xlP5Ok)>mx zVdLpdmn1>*~&>vJDryHfn7!^@stXa9lTZho!<*jhhR#Os` zcW4T!+>&BF^|)Q1(Gy9lsJ*2K;o!|XSf@l6f%s$Q<*XVB$wAv+Mv5{CfwgvDo@z*= zHp@cz&rEB10{pgwU~w4^8(>6bfPJR(m__-gHA?n^!;1=D(bXV@g7;txo}@`OS!jb7 zP#P-j;vhXGeF&KkK+)Es3m_MI4WHz=-8)ev1E^7NTT8jKrcG56&{2+PQ#$+X)+g)< zJP^=ul}sC8mHpKXVqEXa9N>7H*@;5o1Fhk7_YR51PV^}ik;H-~Pp(6%iIGd0;LTU4 zMaNStkVom#5L9Y`x_0xGM#Wy$u&Qd?S~NerHB#H$e*sJnW~S%|{}^Ioyd)@yhyf%RL;T_g6E!9lkb9vmv^3rB z?##~YTy|#1_nb387p+N)ktdnVoHO&D%lkg>^PZ8;ojaExh2^?1^LhSUsaMf%wlH38 zV4-!N_dSU?9AL#>z({=pQ3zzz^u;PzzJ*F{GgPApzqy?D3bZT-a{A1{CRfuQHu>UW zi%-5h-^57S#B#gI-&u|rNTH7vwSa8V{M+P?-RAek z{RV2aItsZm>@KZX7L$K+{zE z&WEBrj=Xf|-coYq(li=lBWV{6uINx=pFeLNpTN?>Js4&US1(=0)-7XL=~$={C!U0? zs2Ie;Lkw=uqwo}<5myol(f!3`zA0G}o47GE59#R9j~-EOYGLksx7!GocwDgxgX9Vxl~4UXr+vTSrZcG@$HAc&DG2t9cSMO82u2vYj4$L|cX zLUD`35Nb{s45T4xK%r3LEN7vx?T+X(@~Dq)Lb+7p?JyL4VaS_hWV195#e6m5kS0&b zCuR5zQ4m2c(B}l3E7NJv9@`hcWfKuL`acnK%ZjB{O1Qf9{-1k ze4jE!fuE);LqXU0U8XS^G)>HDQVPpfSL9=vCRXJvY^#lY!JvsE^dlc0shFNCfDxAw zj}gYQg$;wQi5v_2L@Ym`6cm)wvpQmmrX)#lsGlL~ix8-(&BEgRV<|40CUPW5Mk!C; z=#m2z-f!e}gp|9QAy&;`mQ0rN@F~p_nt)wuR)s-3^=UFg(?xnXDKy zB(E`yjW<#y%xdUb7Hk^u!NMZBW>}5~ZrgG>flO|YlcYVmuqV4~X-I>68m z1o5IMqS_!9({bAr3h`Xgi^!_P&=j8Ui3M0BJ|$D^I`DkBoyV(ui00A*xNeUYS4O2o zLX|=q$Y@fPlt}k=l3IowafpEt+DPNgV0&F!nBc)mtBD+Cku)_mC6-4xbm(nbJrT$t z6(sgEHtV`zI5`@nVvgtd7hinJ`!G5u$3j0&c=almE5whO#LA`es&h}Q$L936$N7W|Lm|*K z1;3MfnP7NcLMcPhmU6g!`DdIxdjc2Ee}(zEYn=t7~i+KA0skXecJ$n`5tix(G{ zj%H`ie2(+qpT`?-9Krtmukz$`R93bk22tlwrWq;-jDHl-h(T&Aa|@#gD?P^oOf#f#sOJm>NLdmrGz zgIWG=_wH9xi;dYl3E8LW#lZF@QvqS9*T=|sj;b8fb`Q7j+{DPpR{ky|o!E%YYMh#y zdUR#jA%QuFxs}!My?giKlg~foA0B?|9TKHHj(zzteo}tKf!7Z3qm)DT@ zS(Q$xyt%H8$;p>6IWfs!77FZa&?Q&Pm>8QNO?VkuI>2niW-Um^j(wdl^B1-@O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advrocket_1.png b/src/main/resources/assets/advancedrocketry/textures/models/advrocket_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f54c5c75ec4015387b7f1cff3b6ceceb1e4dc96f GIT binary patch literal 9836 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%0Dwl!g~$HPG{lw#3DaAXPS+o+DlTLQaYY1 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 DfB)gK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/advrocket_3.png b/src/main/resources/assets/advancedrocketry/textures/models/advrocket_3.png new file mode 100644 index 0000000000000000000000000000000000000000..34e237e1175d305c8bee54374f198533002f0a0e GIT binary patch literal 9871 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/bipropellantcombustion.png b/src/main/resources/assets/advancedrocketry/textures/models/bipropellantcombustion.png deleted file mode 100644 index aa01bbb103415d625a3500a7ff35a26ff4252c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4537 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 X<5GPeD>3FN00000NkvXXu0mjfe)g;K diff --git a/src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket.png b/src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket.png new file mode 100644 index 0000000000000000000000000000000000000000..86a9aefe142eb38d67663e07a551911bd50b8440 GIT binary patch literal 4628 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 KMNUMnLSTa38RHxP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket_0.png b/src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket_0.png new file mode 100644 index 0000000000000000000000000000000000000000..97ecac206150cc47b9721f121b7bc3366b9b6b12 GIT binary patch literal 4473 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 LNkvXXu0mjf0rGfD literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket_1.png b/src/main/resources/assets/advancedrocketry/textures/models/bipropellantrocket_1.png new file mode 100644 index 0000000000000000000000000000000000000000..58cf48378833cdeeb797fac9b2bcd7df1f8f5c40 GIT binary patch literal 9516 zcmeHrcUV*D_HMvJQ;Jj(rFTOT5?Tx`)F8bIf|3f65=cT51QbxDDjxg+|*z{s~{@~1lo@= z)U^cuifn(F_X6Lvvu77UAeNl7)+gweSU(XjDuqOLCyLMmyoe%1e=-RK^8ZkfVxRE2 zl1uk{0PA6flg?`Fw(x$f)*c%4!Q1{WyfXgAOF2ar#>f_RKGeGAca4tvmGGO5iTQ8) zsJ=m#$HDYq>*e6Jy0a-WOTmp}yd9dcnu8EVovVRC!fsnHzY8u89;&Tqhpc07BQ+sU zJ0K2gQ>R0E$Hirg#L2}PhsrzjVYQGAm$0oHqtpkZ2Ha1BXD44ItZivlH_zYLDsOw( zaet_exbG>a?_y`an?G;lnwiF*&Pgtd7=b1`n<;a`Rff&+_8HUbyu1 z%+aifgZ;adF{eY&m%)W68r&Hv1Vqr}r-yyMEheYAYEkeo7kDIR)9n|UbDLeU?OdaE zeoG(i#(8zoZ#k*eifmdNtDmkqF@>B9*<|ivzTn&M2rH_Y^Mt(&sgyj@!bT@#dxtbN zrY!Y>_(eaOKQ-X=>NQyCtvP_6JECd(?W?;rOA<8nNm@iivS`b7hTOevB$GKm&!TVa ziKU=MoK%?{$fw9iLV3l?GD4?6TN3`lHs7H%18>?(ZI_f^T{>`F&Xy{hlWco7R>|f; zRkB0ohclEcy@cE4eMS!o$_KbU^j4Kt!?TvT^o7XppWTi@ei-Lodx`M)Voy3pN;?<9 z%O8LnwXt>bSejO`{y_fNUNcqwafT@`-TzH-qM6!KSy#QqLI>NV@Z*rfO5YNBfUm)$&F83FlxM0?pxWSO~IQ+p=9a&vEa&KbB8omPcWjf#V_V3fcbq7-%Oj8Vn)eFD)+d zhlY-B9oqdQVPh1zf}rRL++{DgHJ%i%zH43v^-W6|#l+_Pt%VETbp+cax`9%VkV>+* zYZ`KjsN#wl=3tyUn^Se|fqJSy1kWAkMs89YGQ^z0*Kt=f1Yb(^hEF}`J=yXcKYpy@ zw*~{g>QBWi_Zp4GSf$%Ur*x+LbysW zWW`Co$ZF3!SIz!+jdjGgG(&!m3|uicTf0a`IFx4X{HA*)M{6-(FASV^YGt<151UXt6Q%3@ zaJ8t#gK&jy_Tg{Ol+Z%eL8x1I(C#1lkxvR#YQpcU4m=zX2IVBBfa^5*BaO57r-0aF zPu2wT6x5@cM-l5Ok^UY&tXelDg45$9IYjSaMYX(JuVU;E@+_Cjmd@zcCzx5s)j9-= z_@4``+b9~F8Wq#-zL;vs$J=TkpSk<6(wUy%p5Z-*g9|C9DU$qy(&dLDy)bpp-kB!G zxwFoFaqJCBef@@aymKsyv?s38cQ2XVI`c7SuMo?_IODbMefa)_Dsv0ZpeBdtQAyPm znM{kww^yR=L&G6L;KZS9`~)UzBKEVm5v>FSPMbElnRX!8p?eKZ>)?*Vvbq)SriE-4 z8d=(CWQ-Ubb@4YEq`s}iOn-b-naP84lyYnYZK$)2CXcr$=Omud%UO&$BKuxK`7SiUY~@5OA*Wr&{B2$R*Shd{qFhVZJ*qV=hwo~ zrEkAjk>iIG64Wj>q-8ChuDHysj}prX&owH0f8~z9r_^0hBzvYG6b0x%g}TBE}!Rd><_wo!c;8e zmFnkAujhLu&m8Dt(A1($?DCOVH0WhlH}iEVyzi*gJf>59TW8wx@pLDKSHX4#y?SNe zw`?I9>fQWH2FEJuoXFND?}T~9nYEIi=*V>tWpSv!CujPYWe@8KD>pGdDr*itt`^v# z;rf~p#tS)378KjKObA3;9Xe}8MsN%$}iBz3C6{mMIbPI1Z-FJ#F6D+gF zSuCEheJl8ONk+v=#!hPGec|ic7xyRcIqj!ca_u5}$CW^t_?|8E?$NYw3wTxbbi%Mg z+Ce46iR5yAPogVDEzYYD9b}!Rd$X$sY_|0E%%-6FY*;{IDT~L&C=Cl!js|0|OZ)BH z&EcxnQWhPuu8CqE1D~I<^X9F7I#Q*USHF)}ZG!22+W=Af{`8|``6HuDNJpROi1oRx zT1|umGgF~I={VADM~d~pN(&OszSzdNvX7lX3l@! zdb+u~$<~g2RW(-cjXUO|f>4jkn9;aL(xAzoRsBoBomNo8fh9QJBr1p4b zcx2Kk+$A7$owg_&kjS8M)j#g*MZH>WR4MuE&E?BF`4Y0tW6j)qovy50oh*4lxf#vQ zhJq6amJ7|IxZ?K>RHo8|tOI7;mw0V%2Z>IWGzLVMI@~YrR$pZc3-FM9<#Xe9B%Xyu zLKLmPpJ?qYihiIUb(v?n6}2HAr-@NWbtFQmM{lw6CX6tB4;$>i5pn-s8cz&EKjhIS zZ0~O0^Q8Vq_3<7x0gNk|=j98gA1a6Tn!TCy00-?}r0nAF@h}lhHn~rQS6$%M^sCKKPiz zp9unS_L6}E^a&GVB%b1-fF)3HLSA_ECQuVE9il7Q@GO;Rb=K4xf7T7JMiA4~U`6>O0Rj&q9V_DR;qFO8`m2lW@FIcV z+hT~A$PR?=rY?5E#9Ty&LM4hI6c7qfu%18JS5ZuZRRl#PkdT(T`adavD|InfI^7Ei zf%y6PDfqz^C{z~+OifJ<0#$@4DuMw7m=@qk$NGakY2w=yKR9%WG(45;MJH1{MYcJy zIEoKlT}%vE7x_sJtm5_j0pU*r+t)kvG&%u-0WJ{0egFVO5eiiWLlwb_YLH*`fmIWe zKeRn*Kcfi56XK8cg1{7@5D$;PXwc|-zJJ>Lml`x{;QttiC6Pw)q2h^pzC=&D_^(F2 z+uZOw9k#*$$%%*~4o`V;lV|l7RmM=jB6n-@y>@ z5TZNL18{@}FvI?Wr;|y4Cg?Bw*5U_hp#h`>S-1ZAZis_i@=waqc=Vu}jTKPBewSUQP9 z^#Iz7>`9>b(f(YrCVLRA=-BPB!Bl`UR8&z^QAVh$z|<7~1lba)G@#74Sz%BG*pC$g z9;pv-Vu5ladthCN5HC-c9hL3GAc5@wp~Y@@2f(}|2X=$hp%Srl3e}oIaaR}H_Euz@ z@{eT`pos}sI#w4;Cj!=>iU=fB1qp>&Llu!wI8qS?hAJVUzu+kZGAZCcp|@LB1og8S zk;WAKj$1pf5D7brKROzXb%FfALjE22e=u3OQv5vs?|A-%{=uS6rTbB+Ze~<7+!-RC z{_lDI75EP(OJJ7L=+pqrf7sOjhC}^m2SY%YLJj!Ez7^5?$JLMUxRZBAn~2EHkU?Vc zKaxws`Vt8{83dyIV+rqy^>iTu)BI;E|1Ky0i#Aavz?4WhWjvS!#R9brLnwoBBxM*F zfrk^JDk?a*5?1Z6>@*6A?uVrkwOxP;1F8sU-JL2Dk@;EOvVX<Ao(MB|Bu^) zTPs3=MnS@qf8QPovVD8{J(;NO0d8V~{59RE?E#O(Y8T{TB{|DSJ z`ac`|KdJu;`=PBv@d^M&pexjylI2r$%r0zApsi#u+h3)%$U-+Na@(g6vJm!Ulk1Y+af{xE=U z+!O$WOmvKi9@99}E-qfqtfG*MAP{pRMpxVVL{q^vCyJ0B-^I+lt?L|q9Wm+eO{bch z3Fr4P$Tv5h(JoSXP}lp>CKze;sZY>@w4Xm!I zuE}$QoJEPUIbIbn*H^O1olu_*=urFA?>AVE75KESfo4v!~ z^I0#B=YnsINlpLVo=MT1-69ayCkZ6k$Fn1=8nL$Ap>=f{+JP*$m8^Nu$j0^sEE<{3Jh(9D$bpwjkZ2Gvu}`+Pi4d18oJ_d8ByOK96 zx8X%Imv#DQTpD?6vG0=39l&GR7mOVX43XK9q`=Ex3231fYX^KxR-Rm3Jd>fUcXxNU z!oz|B@6qSHNtU~{wQhH68DWy|F0P-WUZah*AHE>socz*N>7;AH{k*879V?4n9TN*i zo$lpcLQFY47CaXBF4WbjJGR z_!ulg@G4Q3d?TA0(KQJ^?R)sr)|Lii!`hl)g`X#PID?Ta`^=y?Gb1|(hiudZ36r93 zg*U~e3x@&EY=PeM~ZpSis{B=<+MtNl)i!0 zxV$`>C}d{b$knku$BqrYd)ppid&Z=YI*-aN;luB<;JGT>62`>w?a=-t%f9}8B46un z?I*z@nWr8a@aR<*$}c!}&d!dkYskyXSK1I^cXf@lEs~nOV@CXSJ9*R}#tpmb+9$uy zLmOdGX~R_tt*yJB;N+u|*l!PCvC1{;9Gt|1flNi=PId3WBt+)r>D?;~JOQRQHY<Ea@F6e~%m3(kQ>+ zHjgDPsnN%&Ohe5s6ZYY?yRrcLMK*oY`Kf?YuQE8zd6Wcta`N)3+tM8gF%8yxk1~sX z;X)=6FOLOWFS*m{dQ`5_+fldQ-VMoCTxo51o=3@FJ-$+L?=dqxai25`HFeiL+EG5W zW2s!-4pG_nPJXMs)_v=^P;1Nev*zl%ol5O`&nVP73@!DSvxxGc{lL!hVM(SY<@X*8 z4{O();MXfY(UbqRB_|+5bMbcYlWxIghx0dQ(~aBnNMz^mwLywQSCh)hw+fG4?F+ zucw*>@{5VSo<8Trmr^j0x6nwSMl2~Tnm_YX zaqpY&4CVpty)?5cV=N-$zP8Lww>%N|(UDOlM?=<|WM3DCj807KHPhS-d{hCU&bA8A zZAyK3GCz+b+GkN;IIHG#Ibl(jF&C|D?Nn3)eG~O>w{&)L_UvaqmV3gfUyRu_E7mNK z9AQ~QxG#~)8_#HXl%^Mc8(h9%m{(dLWqlyaHsNAdMOO|^( z5`(^PvUg~H7qcgg`|f&fSpr}hoIzSmgQRml>BFv(mR~IPZb z$yHHDcWJCHOV_SVq@kAH!h^P2#x}<4gU?M8H}>#hSwfiNvC*(j^1s3Hf(T)lK3^y3iK@tozx zaeEE=>IXC3vVVi!z0<|g_BP!59V}LV`71rS?M+PG)__@1umS@}B@S=;*wZETkc#KG zT)R`^%+-!HzSm0LZcIN6$sMe3nwe2JdD1M~$B-wMrHNB^w_Ty*@aow2C%vU(mA=z* zBXig7wpIikT-Y*4MhqmqaGv(vj4Vy;m>b-?8PJt|wE_Ecs15~E%N!izzCD$J%L*eH z;|IOh!!n9%YxRK}NtgZI!TPYtvoZQQ8~V|MPC*wNoS*ogYM1_PF6TH0!%;AJZfN|9 zYMf!h&FN_mjhZzU`x|q8r4Z_Hqq1=DhK7;sfdA%x!C0xTuc0FQSein=(qBff@vlrx zNP}v(#_EUG_iJpdoLgJh{5F3a(&dT>DHj`^_<&41bSSiC+0mikh+A$CsM3Fqob;R% zUF72#{pyu8hPwrTFh-6ftYU! zl3nAcD)~Y;=pr`3%LkKLYx0UiBP1EEd ziQ9!*V`5K2`E6Z`!uC7)?|my(y~eHdrNS|!guD7m{_xJI+SM;r1B)>+$rEiuHoOuI zLyKR$AAhfC$HYJWYP{;8b4CLq#f!-Go(UERtYIW7{AT|kbECmEw9X$-k#c#-gdvIp zU5{fUlRrF*Ng2tP^S7O44+^hVtXt+{HP)D`S-MQhm$hi?t?3m)~PEwxLIU-O%MSUy;_J5BuX9^*aA*J9xB^(5nvA6>Hf z)1EosPH|50L@TeBikv*N+#s8OzwBG_CuOrYyeIAwMlcu336=?a#H*wmb~B(;I@o$^X(_PB1&>O^B|mA z&mqn}2#yf)>gBi%kFN*DYv#wzzSS~$?4M&yzk0(bvZShs_WNf!s)KLm7K*X%}ymk?NMUeriJIu zcP(1KaO2?Quzi%t#?>v+6*k5a6Qouqo-VuwNB~2nff8*v$+} z#KfdA6_)IRM>4msrt8%2#-8etNgkH%g+uh8@=Hl6==Vi9mllo*HlaD24b*#jbzB@PgHarhV2zC#x1upEc+av*_QI zyXRRH^kYd)OKi~l5PKdA1sFNF1}mk{hP9)@or+WnR)rs-`WC_+YLG{NM~MCR({9ajUHDj$J`Si zkaa&^p=ni~y{@RgsB%_iAze6SMl{ALH!4J`j7Ati^vh>c?Xz3EB6-j98LEToaM=y# zD0}8VpS*bFuK1Ychn=2xEIU>v<3{z2PrN+8m&Yxta4XHi zSm81)MrA@FHbm9tCVM5;Fc@aEY|58^=p@G~c8C2#ElQ)3}J5y(mHq~(;(kbN^&&vw-aL%2d(*&Vp2Mc9lW|Z3vscW0|Nnz!^# zhl`e{-0k7|S%X7+gYPNwa6<2S2676I^P!!hY)lV(7(eWb0%^DmE$nvHoe-wbQZe$7 z3r$0wB?u{y%I9wl9+vL<#F33yXZ^HzQ|-BSZw~AD z-eUq0kD0`smi+C-O=AbJnhv5j=@Q4^rU*^uoKd<}eiN4|xvD;vcSVESs_DSO`S~$pv&afy(6DEEDs8@L>iW&OTY$3#nV!=r!RoSo<$$I9K7(hJTfotiDgtLl_+MYu0lAnK*P5Efj3lq7+xtMqJIrfx5IL9!+O z3(gx^q|-4}lzN-X#EH{di8*~$*8WS z_XbBDpDh2Jp>i<@#1cx@(lXK4()#^i1{}xI1Fop*)gRs4Xm6ea5fM2Ou0p(XLiARo zih)R!!_88WQ=afgi#(|)DX4sGuxnjiTw`8HRLT7v_k+R9Ebpg>Zhe4Ae^-E(hR+XG z9GIO^of%}&%zk1~;wogK)T-A=a735Oa@Yw59S9LSYTgiY62XGn0G+>Pxb@gtlYA@2rKFW$YACLGN&pis7s;9&E*;51NH z8|Pl-vu!!^!r_8X570q<#+_5{Fn_j1D(kM-?nZ;G^4>wihis8jx}RSOZ)YD`kFJ4o z@(ygPcBN1Y0@Bq$yFZ>?;ZRXwdm5EkJu^R((Kh&9_0`8&PJaR|zdw0bCI}?ZM+Oec z)<%X{0@Ym}Poz4MH6$ z0s@1WOt7(i%s;eNFw16oQEgPZ3{yrD3IJp?m!@PfEn=@ zJcI1?=LY>{J)1NCBM`vdAN+qo|DLa{Shn(t)us|WH=XKht3o#8#S*CmG7-D=6NM+L z5K)Rm7}1gB1VcF?2r!H?2?0Zs6fr2YlM@C7hyOyQPoXpL6as0J3Luv!13ZdExC&AQ zMSwYx2ud&%0f~p<;TSYb8G|4xAqg0aB3$to3S$}>Py*iV*QhqBhyWEHgGVCqC=3jR z1VTbNk`!T%Xhk@TsHCK*40j?Z5m2Zts?B}CYMAJ&LXh%5;@cWAalP`O>Y(aJ>nKSU4X+tOjWr$QpDl4Jk2o>dD>`#(tbfC;PSrKq~1aixqNWdNgIPpNa zk=^mmBn1zO^VY=X#$bWv0I9`qssmu&8V6Q`)uNH`3@XinN_A6(Y{mxOr2J#r2oNz5 z&%kTr86?0P9Erlhm9cPy1ssk=C}L5HFt`%-&&*?us6?`p&woO1N*0X!DMqXzm9Q1o zRwyLm*5nUGYvP?1eqa^;9r%ARnY&QEDgSpoe?tFY(V#KBsWew(nz7?q5`ppWdHxmn z4<<99m(m$DAN~KZsQ(Rz`ymHCz?Mq$`Nh9E>D-U2AL(%;Z?!fsc&o`^@q{0nOUHYW zh+8`dWckMw!39roCIQ|2r<8vmC;tnXV32TSBoU2(sgM-WFccg`f?-HXiZB$Ks7NFM zwTO3A`71k}>csHI(?}Z5K!pKS1W0$Qioh~Is~h@PytfN!vvh%Cg29zxzZ4VX$8P`Z z=l`AM5uD(7q!JzvBjA+){Spvxm##fki0& zzC4`5=I!bC&BSdsa3dq^uiK5=Z17n9O%iSaM)1z^FP$K$%%pmpHA(YFG=4vcVn=-JRgAfBC@9~Mw*x)?CX$rB^mpR?$ssZ`Otw^MUQ5h7UZ6(M< zSrDXbe%s2%#u;Q|)ojgFf)vY*4vP6LXh>a5m_?ZpN=4OOg%Od;`HO$ zE{(1&Cq_+Z?N|42a71V48RX?@`&{r{>b81Ezk2g?{JHqT^4gc;76NDE7wG98XAGT7 z``t74AHXLmJr%qC3i|qiErE8fZoZkjr^kBYjw~xzCo0E~9={N};uae(beF9uHA zs>}1@=fT?Y?oXfRUK#7};%RGZ(~A#%EYthZODyJ?p))u{=#&#`5<$_Xl9`5 z5`u%kdtnFDixGM`81>>#42#5_mdN6J?Pdwim`?@hC>;ZmY+HtUt}Ndv1Eaml&{iR+ zG&$8Y={V?i0{8m)%;CP>r%&%wTUlmtuAg{Yy8&$_>6;3N;uXfaco%ylyDMmMGOxv`f;B>i6t8^==nVIfT(0EF> zq&rKnX>s*PblXeQm^<@>qmEA;5xISC@XVLc$aG41lt6Hnj7OWPrF2wddQ=nwtfGDZ zk@@m&UVNWh7$U4#4p?7~l&3r5wx&TN6ZcdsT91QZN_!W zOeSY;kotZ%q5U>`PZ@ym)`QyJda}X?Zj#+-dlVx+)pgIE&taW8d+so_sK-5#MW$7# z+Kb}`>qSqY*}Z0Wk57uUVMEUpo!W)BeVsq#T9ypUe`wbXyCIX5hT@Xo3hrLD%#|rU z$yM->iV{!bFL;Pbd(jO}J)w+A)O>H#yrv`4bMLjW0Grj9o{|Q!5DTI7CcE3t?3%8T zS-<(k_2iqsEQt>oU^g>J>=xaW#k8>}^WJe)v+>+}U{h!>z=$Qr}tf!&4v1 z-<|i{d8f|}46_}j$tR2h7HpCqq-XeC(OpH*2 z4dQNR6aD}&e*Z52RP0zb{V3u3&1cDpV?q<)7vl}*qE_7M>MzCV#S2oamqee6-Sd1~ zy((DXl>iUNs4R>36omB_%iM_}AomG|eP$0*YiCKi@lbT{ezo^cW75P%A|Nk`@#ko? zXW#Cti1GINOj_pUX>wgm3=UkM%G|rxKPId2ZNiHao)=Aj~=r#wkM1)J)hWJZ5KB@M=yqqG*Q2&ulPS7h*P_D-?e6S z;D7*|;E>)fa{$&bFS^hd&#%6AWTbhyMZMry6!rYVj{g4sqtz_%(^r~UgmAaffDS(6 z#+H{AGvYD`(Zi#o+?p~^;KVC1nbzpZ#cgvIx3lDu0S!4Vgw7Km)6|aWhIh}Uw&fZg zoLKa&J}hm*f)HT&HaB;9k`ehZiBjG)IeBf?f7NgLlkG%ZNL*3Rd{pLoWOjDb+uFd) z_4O&MgV#?64|_Z-u%hg2GK!7O5DF8l{XRxj!TLU*pGOS#Z=4POBF*LQZX~QT>Z4(E zpQ5B6Z}OTW2W4qVL*sG=23cZ@cBDTX^@;6C8cEohm-hr?oZ4n$Krn3Vn-iW8ZXJs! z;v{(OK+9i`%svJKZ3d9V9MG6%X5@37o1za*JpNulEh%|5u^za_2bK1=tJ0#bikD1c zdb+RWJ@spHfDd&Hvj&5Qa@AKbc(M73+O>!*nTmiZw5K~a>r&3XyWZbei{*5tE~`-5 zr#?9p>Il0<1EIC6xpZXImbu2NRZX7D5 zl+WK>-$_JbaZF}h-}JUw)pPk5&E^V@cv~k)J3A8+g~4*Gs}BkX`Xyt_=jC?CWQ?S9 za`%kd?*PA4{EVx59KYMCgdJ<5jSt_E{O*XqGJ5LPFLO*^@0q)`aY#Qly2a z#jb4GQz4w2dU|@!dC&Wv=X1_`{(5FUGv>ao@9+EDfA{4MGcwTPj_!3KQOy}dtyK%9o&W)=(+oCnyQMkP~RNMMGSI|)qkq>w=%&o_k$lq>J5cLc8w z3n*(XKejy3~Z;zBCA} zc&Rq3<=a>9SHF67`pYVJx>d?Lqt~~e!#aHb@OjGxht(eDy6b=$@)R+cF=rMjGi^FjJxK z6(n%TFMoYEGmGJ0RId7M$#~j>XXbrJ<>=css3B;?1Er|!`QDH8ekEbOdC^WgY^iqo z-mLWXrIoL5C;R;P>T3Aci|Hx-^6L!W_f+O8Yw22gS-!kOeb-{#1*CuAGS~Yx{2*xF z^I*FV*Lr0Cdq3gy38R_d)Ws(bvx#*}AV}NMdY>pJ3E z+rswwe&alR_a6RY8E0*5!Qfj#|1Yi{HRH$kK|3E0z(e@)?#s*mK5LF+`>}m1xqgI; zcB*0zc;UHJbJb8~J4`9}Y|m(q@|-a4nbebOpcQG`UCrOLtezX+*U;J{+$IO{IdgEU z%7eZTX{DxytG>weRZ}&Iz97QI^r#G-o53vG`c9m<&m-B&gO+imrb(_9@$Ttse|aLb z_&TBGbvAcPhm*bzDuqttS>K%n9wWAYm5B2Dt$g_Bq9cO7dF4JvR_`%YN zS@Eh*?XrNDbJaC-E9crWN*ir-yd$trOXzGC?oc#h!ZFiuMEXT}qC?`Vr?M+t$E7A7 zJTACh{bu4VHLLu^-Bgd)%*tLq6ZyF;!qIfv1SQwM>_e~aq@9v~y3Bfu4Btql8ey3eoqjY(yqAtOOFJ43}+Y}^AsvGA$NJJ)DQX8fRU zjuNB$60`ZjwWGXY`yTA8;8$-xE~7V@9ylD&z8*Rq;RPS&proM6UM2U5l!wBk#>#8(k>10pSK3n`e}c zoP#KF)OG1e@Uu3q_;PoR$+mo}TftMbgIjqxHM!;IWR@)D&4Y`L!tdD0f|}?3 zX0jCVt<}R-C(Aj%Cd-1ZQ}96-anKCDp@tB7-lOSC+kKv~aVhajwU@;9ss-;g)ThV4 z?*7oL6x2M3X)OuHID9-Khqp|)ss;b@BKA=j^f#C;fA9e&A0bZflmF|RGb1Ws_ttR& zYsf6H?*wM_a2-b$k5Z$yvEAPaW1&7oZIDXX#;Pr zysM3?=tq5g?3=*;FE`6$qw~Hvy^Pk?*pp*|7ONYwS1c+u!c>dOopz9HIg{gR(hy?V;a}yX{u-mg-(%xb)AnI?F_;w|sVF`tsFw^;Vo$~$sjze5`;mteb0x844Ijxemom2hMp>w@;dZrHI6hFDEFBd|q zOCH{djy_`*bnQWbbBmjOxVg0NIejULApFWj6@G$EYgH($dtZp`tl)L=b4D2h_Wo=< zYO!GHsB=zp$;Wi~bq+Y|9jg{V*c)}!ifi-^l;BN{8BMhH9yqW~)32(2uvfT2ipagA z!3b*-{A`*UVwZI4oU3ipnX}bF6IR2MPnlkKBrfcH*wa$M#w8eTQlefm3egOTD_C{9 zAX^eRxnj%r(jJ0`EIQd?`K2QL`20GSyHPaZ4!+_%+4$tyiQ|-vkEaC|tM=WWSU=x( z;m*p4ao(=R$Se5FiaS~j*yrNDMTKAQDU4SgI>33yT|D2+(ynqsy7FK}7?vxdH-Dkb z1kF?$M0Sp!nNCY+S21036nHg#n&ObB&a^u%rJkr_9=@H- zTTOB<7tPtmqzl_cZ{I@}q1)2#b|Q`QMdZ1n!`RyL`7T7?(Az3FoqfsP;z8&q^LO}G z-AKzUmFt~3sg4f$Xp7HQV+oIKZ*qo(NupX?LLO;wy$~poqt+QrQ%^NNcK&?3a+UWz z+s(nm6OR=l@2d^Q81Q6&3jn=>y0Xdjv^V>770*y@_01X{bTBlWe$!~XRuv$bQ+^^k zKBoEr&Ur1s_oqbS_ZIXA?iUI#PZnhL9;rXQK zl)ga7<5S=E%ml>>$l9~mc$=v%$L~QN7%56BZ2J1pSm5mWL$(?Pqq0XHbMAWAeO)z@ zd^e0=y~@}PAL>CqS(#k!==zSV+4f4pZig`Usgj3+XI{8GPY#b`yPi{3fVIxCls)Ct zRhJ24EQ(oUV^(ubU^Dkr1{;LcuLM}za_m7gUnOjBi?aB@OsKTM>G@_{R7hNETeeEP zWlQGH&kKJdbWb|DSf%e_2>L+8{glj*tg)FBJ72avv>h`ABk5;a_I5hnJ%8B2vu#i4 zWGv41EK*Qzl=?;Wo_IvlP~N^&_qF|(bA(~_M-v0`ce=iC5fFk2pP6_FdW=pCKehur zZRiysA#);He!FzGUJ|d1q_d;%SgiNCQG=(U5AUETYAvk^T69_JiIZ*v_37B4slvIO zWWyeXvhg=xrMonTvH9^6*GRc6%v;%=eCp%S4Bvw?wTG6`(__)RPe&K-UY>r2z9o7s zt7|LILfuoR?cpBXS-T~JaE-Re5;;1Y!xMsH+=c z)zyDLS^)>D6yI1y?PitzEq12aV!LY1&Zo0J?5^aCp)t*ug7(h5kv>>ne*rQTgd_uEWOaXt8g~fa~H_Hck82FYrM96O}}uwaO#e1z-z`5mBJCJc#@Q-t2=NM z27wfmJ>78xXA%R9Cpl2u6vbw0>czkmqN3Po8GV?(yE@5{qU}v1nR*+T5xkuVXrh?1 z5|@G}1|V=HF>qi{R~I)r##2#jlNSU0-dKi;fj1!xXGJj!eIu|sl|}+1rI1oEh^8my z970Tq3#>pRk})P4Cx1`?SBhee42C-f3ia^tkn)h0qS73oa5NeXg(08_1Oz}p=w5CN zoF~MMerSW@JBJ2|PM}fT85F7;c!Lv%r!pCeVq(BP_y;+#OVIQL7Jn$%xZb3vGl)}Y13{OA{h!8wW;}687-{7(NCF; zFgj3N-8UsR(7z&ygr7KfCe39NLnJ^+E+kjL5IVpN{}Y};A^(w}Kl!t<^Ir@B)cxfD z6Z-dfZQ8OKSBwUgz}!%Z)ld}Muopw55-3E>=1(M!h$14Ti4Y>5M1~;AZ~_D^M}k9S zNz!PfESZc(!eGBpVcqBqoEw3(K?RUYQ2-tyl7K`YkungNG#Um$l86WhN=6P3LBWVb zvK$O83rFIAp)jOTfKI@<{A$$(6%nAqp>YTV4vB^!5r9cZJV_dYmz9P=h%z$LaxgMM zhJZwFQf=e`qiTdz6hlaTw{LUB$OXqBQ)#Y1dr{noR1f+eU^9v<$&`WH2pe1uC_{uC zLJld5M#E6QFq)HSbfC;PSm7`!IAT+rNWh!~IB`I^QCx8jB&fTa!{)|DVlaR^KxlCr z-2pIft^?j+)M+FfgGw`_Qe70qHf#fLQ2yN32b!3OW8gG!3=*IXhCpIqau^ug3@(E~ z!Z1h#1SW&|Bk~x1Dv?6=`d8?UmIW*PXhw`4m9S~nrYR)i=H~Z~R>L_!zhj~Q4E$f1 zOdY8nZvQi$KcGKZRA~$kD$UuDW{7tp5g7lR=O2N8GMNCgl+K`eVgH3w{|Tq?y&bdx zSt`xz7yYKBv)`}2hsTAoIoiPB%^`!q5xysvjyp#pZe|dO^7k!*BhJl%1WfZEt^E5s z4>d)+SDw*Mdqmfh{fC>Yu z2x#5SDgsOVsBXzW<2@Wn8>I^r69gs)0g4F*!@#96NNKU}+5R!l|2^&@@NmE#;5I^# zA>#n2$V3R541CGKWN-+y9GQS8elP!@!TVpk_oG+-U)%%IgTNEvau6935f5Y!MF8fT zoGb*7Ba;ZSco>?9``-NjSMEuhAz&B;90N!Go;?NV#@+Y#T2iRoee<=cg3H*0;{hx)4>yO7VBsbvH?g2b(;f~6i2OiY0;dQk%K&!xe z{q+(!6SyT5Vg$h<)hkIJ`?v{uieT+laX7I?HoRu$o??-2^(A5#|I^u z592kk0*7OV5d*A=xUlyeeXtrjTutNAvZ?W_AsXjfEB#LPDBF zr)-mp%Uin!ceGLcN2*^Fo$0%RZz%5{%%UvkzjA`_-~Om9;`0=QLp7ens8Q@bKAG~( zr>S|>Myluz_G%nbSEA+c5bDD~<5u(T9gRwkQ+4P6|5RCS*>BL%`DKl)9(Nix-yEceCll7nc3x7TwSV0%53VjNrv$} z;#MTs*O(7~&bio~znU`&$te$KBkX00kayH8O36P&pDj z2m9)C-%bvpxcV0?pb4>RHuXy%BqCT;rlzMCW(P$*JX}@ySy^6; z2P<@^yZE5rAwFYpZ~I_P{z_Z0!};=LbLg(kkBoB^i%WcRD(;8 zh+AM#^WvHs-Lz4?BfEn6LE4g|Gdm>@pNTgX*hWd(5|bktHGG4~#!=mSJ}XWfi|7=c z^*z}CrMUY_j-(jJmSoai6P?=?LWCF-vET;F%O+f+4`@$?g5V(vot(`aZLzxMSqzDU zp1p=gKE9lM*Vl(gH7My8%YMMLQRoB$o>6g<;Zkv7;y*NaMXCd3lsW z<>86 zuEL=QFAL?DhP4Xoxy7jAxth1&(?*2|@xzuN%Lp9~)ubG4(U_>9VU&e)!eV*1MCv4| z%|tswMq9GMl7EZy$DJ{_96sqUvuc9%5!(V<2!$;mA$8;Hho!l@@--2l_ZWeb_()Yu zM~XMQsZj8@OQ7ty5ih0Vbz^(@)o#QkaSP_WAfnksS&QVY?CxnwvS-AV;)JC5_GqdK zXo5a@*S_b;jslN-Yx5;j@k2v-x3*SbiNM0#6BUVy@^BNU_?W#@+$&hg zv-`I_sg<7*P#IlbkHoP!!51!GzsQeD3&NVlnP^KIXPbm|IhLC_84K7e8<-1h!(Mr! zggVR9dh=c4Hqr;MczZ`6*kZ!owf2c8(mLEgr)qyeMLa6X*v@}-vGm!hZ^H2Kt_gW& z(&+^HZU>+FN21_+_Z3FR#yG94NPfCLE6tU#031?djW)bi*WTDCmGjIo6)yBC>}EiF zJN;y{h_S%UxB-+qIgqk&~{ zd9mMfc0kn9`N%M5XM&X3kVYst%!F`{lmFT^*Ai$bJHs_N0&G)t{t!Xsk%jP9E$tD$=jp6XvpO~qVF_i6pI{zdrV4l$r?58Wo! z+-+`Y8P{U{HYb#%!WmQXMrzby^uE_Zi1}pTQA4HSnwhnxGs6)&*-@k0Qe-+DtyA3H zi=#&+pCgazO1BPkUVF?&xiU9Z>7S!KR#tQVVWw7kV1S-s>`ou$uN)10(x2f0PO?z6 zqHnZ`lvfd2$xl6Pbi}K})2FkeL#g>}dKXcnrWcReKd_>d*dbAPyR^*oXgk|T%M+(& z+@)8q5_PYLOpjlTC^6D*p1=2YSN`6JzLX_)r; z124&*mp}TTGSI%yCKrWxLQqjzCa+Z{BVZ|cb>*e4ZzhCOJ0OpFQNQ)8bLi&2$TYLe z==!Q+ETqtx-7|@c7#wI6t?JNzAz6QZ?!2s=`Fft{2odpNdOGS6QB6Q|q2OzbUwtP~ zbeWlLj5n3zyR zANOk7e#<}fe)y>2>;8TR507+ORnzCs)ANBlLUsV2*UgxQ>nixK9egmy6*L%%ih{Sg zGnp6SMAAla5gC@fA3lBB3NjXo6-PTbWHT%qa9hce}(6~d=akNT{A+on2pHD?=+ z|Jf9?q_y#sh~53K)QLsmw9(Q^kATUlIGsV|ZQ#1456RgIhK8Led3lGLyZU$DW}6q7 zN}cvxUkh$-)=EiFpZ_#Y4{R8;+dYv0H5MSur!172A_}XjC_7kLa6 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3#rlH|G#g#YstJ_0v@&oYV8O^mlyczWkW**&~df@4NawiS=FReehW@+0M4x`feom<8wdcccHeQ3vIQ0 zH+8(G&UfH7<^81cc=%bwe!K5Cav@4f7?on&DI|Zt^J77>Pe`4!eTP(|UFCZ%j+3O1 zO9bR6_daLuzX#~2Ab+mhuhIXy`X%_WzxUHGvD7z4T>R;SAb%eG8{%&pr!R}*&kt0- zfcZm^&sp`H{dm{25>b5_<=rPbHiviHSMxSUATx0m|;xRAP%WJvecM6H97or3#iaZkH0bwAxzhJ-W_DowYjSJ9kDLY2+b8 zM;Udr(I@nodCJsTW}R*J6<1ow#L`t(U2XLp+(s#O-m-OZt;I1=M1|42XYSR{)pS3pth{e&5PKRg%(qv z$i6LF;ZbEk9830?owHd)wdfePv-T-|)xh3C=9G|SdUmRPYh?2FI+wOptcqx_%G1t5 zt+P-ZvuwoHW?7l~-Lw1a0kXSD=Q`{(?vJ>nbSO12$v`K%v8_rTx8?F7xVcYMa)rFQ zu2ih9N0HSrlAsAfnF(C#Cu4O&_p3i~J)!7bBIDgQ6G|^D?LL~9lI9?IM(-jMK+q%p#$#q&VFA(n;6#JGwMzB+F$WqyTuB6>} z8VBbEhR%Lc>M>7P*ksnFkqr(GNx`I2WEFuATTwWYYzPhvOb2cdKDUXmc!{M!Ocn6j z9?$_FYMz?9#TIH>#)KntONpqMNF!~MLWGlZ?}(+F9f_3{R;gWdQ)hv}B2@b&dPj=4 zJRU0u-V6VAE*)-z;Bkvunve|)kAi1u35+Cb58kiAj%HlnzSM)eSWl3Ye4M_NCYy8{ zcuw{w_O07P#(*DqzM&{|ponT47|C6tPyGFLoP@PB5i`G+8_XrbneW*uydeAARqH zI5`kYtE791Xt5>l9*a4M4jl=glVuzFNQ6dVB-|k^OS_F)%0b1>97lY2Hh9!}P}{Y+f|I8si~Z;t3Bo6317jH6 z;=T_$CXT@pOa5i4hxrSOjLGn(<_$HpSsq+!6rr?WqGcyFz^2w3O6&ny26!ZL`eoW) ziMvzD7?b=S*-FM*TG7N!(vS#yEtyNmf@I-2Hf53qxs6dLtXU{E3XiNhV5lK1v5YWU zubN@SLyCq7{7!rpv#BIhYoq2E?a&%*5F!Vgm@Y0#Z-(=&*>>O)%iWrkgD(PV z_{;X#C3TR+B#7yG+VFf{>Nd+L<`PyU9p0R%7flj?*(Ww5l%oM#*#Wc5P5c?f(J zs#@e><3a?O5}!NJaM%b_+cpp|t0% z;&y)>t!K_jjL>f?5KJHf7j7J+DYobjZ&HRR0ZzFRUrpdM8XnY}4k8T85bDA4u7Y?Z zWOP_8iuL^$hJRSw+`XWOzaq(LN}Xp!s!H*j=4h2V03lHr9qP5Iq)qpek_ z;t)Wn;0<9$0vZ;^x_;ghE$vHW!VtWRv@It7Nvjv*xs7qQNHR@irNUH;Mz9XrL%oFn zQ)akt1(QZ}(=LU*1Nmrypyqc2?u8L);N^pN(Pq4&dOo4G_I-3Du@t zp0j2r%H&5~=H-xPtp$}fP_uAS$n!3)Ad)*IJwfDB>)yF^<1gRe}3a=1Mih%V`#F>yMTAGn`QJeSIK_a_?`*c zRRCi}p}w0rT)QV`Hha+yAY$4sK2_{}<|i@%Ia$V@)@recZDj)gLG2B2T-mOWkqDGK>4vHihk~M7eb#Hv0{Zjf#c_U3q#|qh+FDx7=%Tdz8-)3W9Yvv=)z{ z5KO=94usO0Nb-{Q96DLA6?lc%%hbwRNZx4LqML)x(57hL*1C1;OKwv!Xk_UaXxNy& zsa(BeEXxANT(l(vO+uV>ct%r{gU|;}qgm}teOi-fzJL)o)I6V?g)pjE=eTD~Zh33u z0S9w=r6Jwa?3wl-AZy&{hnWQNh5n#2ooK_ zu99g3tg^qlL5%BNnFAbeGdoczY@juq?mi*W@I;?d5lJj)^5iEDh6KR!yv*4Atp1+n3JRwJnQS8x~cBsJj=W9&l*tk76W`D@hme;n|OnGdeb&I z?-NH@Nmhx^iDM>Rkob}7N{in(7hM*3X2i^-=ZPc4VzG;rE@mZDBc39Ts+vyuLbk;! z=Pk}!rN-L#Zo(+40!vr63n2Zz8| zk+Ro4-rd(dw|{%u^ZNl_;c}nE28`N}Df*~l#Y=RQ8g#U*ff(21bEFxqFA))LdAt7OeCJta* z9((XS>`YI0S9QH#mqk_PA$x>uyyWic-uvBq>U`&X-xXJ`T#+>6%8%bB3KJ|#MF<6n zKp>G4W`4+U&P7Ve`|tmT7d5nlA8p5G^>2U0uni<24y?st%=ROjOP5~bMUF!OOs7*` z`SMq>Y?CnXQ4|%+vH*|>x}6qjTE5T##MP_UWUtpF2xFp1plbp|PF1SJkw@EEpduvC za*DD#JER`e<5Q@h2>(^M{Sm)iJ{0z_A<@YzPar(q9-g@h8grZ_v z>N8`G8cG=Wb-@V*$LX@Z{twnS)&U5D2~N9%locD>8{EGAck(jhc`!$2Kv7ggQ)G&! zv%0#dXps8|!q{0niXqV;Fud;k{8Gyybb4Zy3uzYfv^XI>Ul!E8M z97#d9)53OahI1~upW`?t-~YiotlhiGM<4xm?=QY|;Tt4LOs?iU59Y`K(zN8#rPoN) z6x$Y*l|agfixHjW&_ttr5lJ3# ztlLMbwd5L>PL||!-9ElIIdo1E#aJzy-SLQ1XI?@9a0h*SZw7#ATR1)Ei2&y27jT>w z;dIKx-#=6;6?6SLq^gpnwLU~a41n)Vh|_3qZ`baiYITsq!5oqA*A!^FN!P76d4d0Q z!6*u{yZ~S@7yvK}JUVT6Z;x))f}?2~swOB4Nzdt1R2gL@nItpvEJrsC0Bp;yGf?Cy z9oMDXvRPPK#GA|xUyepjMON&aimX6a45Sc9QPZI|Wow%zEu*F}EmF!#lH~=egjRb$ zyF#T70AS{ML{UQQhq(O?LY7VSCm1b@G>-Rxp6?+Puv#`kN`#bTc}AS1Se8kgrsTP# ztUxru8M;Q1*Jm1L3xMsdO%%6Nr*P^`$f~+jnKd`EhQww+29wM$@{ZIyhkESWaaZIN(&%L#~3EYULqq2b3vRFLk;&wV12by4ey9Vt%9C5toB4ve0E4*N5 zZ_lnj1-(U8z=?&^`|ayb@XM0+{BUn>YwIzan-jv(W4!4uTbt9v?*T6iah(AAq)jrm=Rz;ZwY&H`mwb59cxL4ol6NGdEvnqpk5D X_#>q|(1wC900000NkvXXu0mjf4l4v4 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/nuclearengine.png b/src/main/resources/assets/advancedrocketry/textures/models/nuclearengine.png deleted file mode 100644 index e9db5590374c7c0775c72603d2527236da485b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4474 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 M07*qoM6N<$g8N3E6#xJL diff --git a/src/main/resources/assets/advancedrocketry/textures/models/nuclearrocket.png b/src/main/resources/assets/advancedrocketry/textures/models/nuclearrocket.png new file mode 100644 index 0000000000000000000000000000000000000000..ad17768a90f46892bf79a3327259749fab492611 GIT binary patch literal 4518 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 Wxm1jHHyId2KzIXl{SsaGi2ne!cz#|0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/rocket.png b/src/main/resources/assets/advancedrocketry/textures/models/rocket.png new file mode 100644 index 0000000000000000000000000000000000000000..dbae1fbc0501eee7b8f972ff44acbb905db7127e GIT binary patch literal 4856 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 eT6(k!I{pIy!^!@Q)G*or0000 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/rocket_1.png b/src/main/resources/assets/advancedrocketry/textures/models/rocket_1.png new file mode 100644 index 0000000000000000000000000000000000000000..018d13e03251bba01e7db4b9d98bc1d66e81cfc3 GIT binary patch literal 10416 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 MG}I_mJ9p*30LIcJ*Z=?k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/rocket_2.png b/src/main/resources/assets/advancedrocketry/textures/models/rocket_2.png new file mode 100644 index 0000000000000000000000000000000000000000..95130237465822b80c1c34c5af939b2468832af6 GIT binary patch literal 10096 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/rocket_3.png b/src/main/resources/assets/advancedrocketry/textures/models/rocket_3.png new file mode 100644 index 0000000000000000000000000000000000000000..de572cc3202818b577bb91d64f6f6d25beb11cd3 GIT binary patch literal 10425 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 U8VEZ2z%2@7j5EiU>ARlzFFnjPy8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/advancedrocketry/textures/models/tank_2.png b/src/main/resources/assets/advancedrocketry/textures/models/tank_2.png new file mode 100644 index 0000000000000000000000000000000000000000..66e7bdb70399309fce135a49ede5468785b48ab2 GIT binary patch literal 9177 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 literal 0 HcmV?d00001 From a3a0dfff2ef3cdcf71dad0add6cc73c50897f2fe Mon Sep 17 00:00:00 2001 From: Quarter Date: Wed, 3 Jul 2024 22:01:51 +0300 Subject: [PATCH 02/42] - --- .../advancedrocketry/textures/models/tank_0.png | Bin 0 -> 8829 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/advancedrocketry/textures/models/tank_0.png diff --git a/src/main/resources/assets/advancedrocketry/textures/models/tank_0.png b/src/main/resources/assets/advancedrocketry/textures/models/tank_0.png new file mode 100644 index 0000000000000000000000000000000000000000..4e715f29677b77e05366aecd7b89b9e9b616dce7 GIT binary patch literal 8829 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 Date: Thu, 4 Jul 2024 00:11:07 +0300 Subject: [PATCH 03/42] Made rocket able to explode on start if there are the broken components inside --- .../advancedRocketry/entity/EntityRocket.java | 38 +++++++++++++++++++ .../advancedRocketry/util/IBreakable.java | 8 ++++ .../advancedRocketry/util/StorageChunk.java | 32 +++++++++++++++- 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/util/IBreakable.java diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java index 4ced94e0f..4c50f763e 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java @@ -1561,6 +1561,39 @@ public void prepareLaunch() { } } + private double gauss(double mean, double div) { + Random rand = world.rand; + return mean + (rand.nextDouble() - 0.5F) * 2F * div; + } + + public void explode() { + if (world.isRemote && Minecraft.getMinecraft().gameSettings.particleSetting < 2) { + AxisAlignedBB bb = getCollisionBoundingBox(); + double meanX = (bb.maxX + bb.minX) / 2; + double meanY = (bb.maxY + bb.minY) / 2; + double meanZ = (bb.maxZ + bb.minZ) / 2; + double divX = (bb.maxX - bb.minX) / 1.2; + double divY = (bb.maxY - bb.minY) / 1.2; + double divZ = (bb.maxZ - bb.minZ) / 1.2; + + if (Minecraft.getMinecraft().gameSettings.particleSetting < 1) { + for (int i = 0; i < 10; i++) { + AdvancedRocketry.proxy.spawnParticle("rocketSmoke", world, + gauss(meanX, divX), gauss(meanY, divY), gauss(meanZ, divZ), + (this.rand.nextFloat() - 0.5f) / 4f, (this.rand.nextFloat() - 0.5f) / 4f, (this.rand.nextFloat() - 0.5f) / 4f); + } + } + + for (int i = 0; i < 50; i++) { + AdvancedRocketry.proxy.spawnParticle("rocketFlame", world, + gauss(meanX, divX), gauss(meanY, divY), gauss(meanZ, divZ), + (this.rand.nextFloat() - 0.5f) / 4f, (this.rand.nextFloat() - 0.5f) / 4f, (this.rand.nextFloat() - 0.5f) / 4f); + } + } + + this.setDead(); + } + /** * Launches the rocket post determining its height, checking whether it can launch to the selected planet and whether it can exist, * among other factors. Also handles orbital height calculations @@ -1575,6 +1608,11 @@ public void launch() { this.stats.setWeight((int) storage.recalculateWeight()); + if (storage.shouldBreak()) { + this.explode(); + return; + } + if (ARConfiguration.getCurrentConfig().experimentalSpaceFlight && storage.getGuidanceComputer() != null && storage.getGuidanceComputer().isEmpty()) { allowLaunch = true; } else { diff --git a/src/main/java/zmaster587/advancedRocketry/util/IBreakable.java b/src/main/java/zmaster587/advancedRocketry/util/IBreakable.java new file mode 100644 index 000000000..70d02f6da --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/IBreakable.java @@ -0,0 +1,8 @@ +package zmaster587.advancedRocketry.util; + +public interface IBreakable { + + float getBreakingProbability(); + + boolean shouldBreak(); +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java index 55cbe0c10..92ad8cbce 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java +++ b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java @@ -37,6 +37,9 @@ import zmaster587.advancedRocketry.api.EntityRocketBase; import zmaster587.advancedRocketry.api.satellite.SatelliteBase; import zmaster587.advancedRocketry.api.stations.IStorageChunk; +import zmaster587.advancedRocketry.block.BlockBipropellantRocketMotor; +import zmaster587.advancedRocketry.block.BlockNuclearRocketMotor; +import zmaster587.advancedRocketry.block.BlockRocketMotor; import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.advancedRocketry.tile.TileGuidanceComputer; import zmaster587.advancedRocketry.tile.hatch.TileSatelliteHatch; @@ -52,7 +55,7 @@ import java.util.LinkedList; import java.util.List; -public class StorageChunk implements IBlockAccess, IStorageChunk, IWeighted { +public class StorageChunk implements IBlockAccess, IStorageChunk, IWeighted, IBreakable { public Chunk chunk; public WorldDummy world; @@ -741,6 +744,33 @@ public TileGuidanceComputer getGuidanceComputer() { return null; } + public float getBreakingProbability() { + float prob = 0; + + for (TileEntity te : tileEntities) { + if (te instanceof TileBrokenPart) { + TileBrokenPart brokenPart = (TileBrokenPart) te; + float additionalProb = 0; + + if (te.getBlockType() instanceof BlockNuclearRocketMotor) { + additionalProb = 1F; + } else if (te.getBlockType() instanceof BlockRocketMotor || te.getBlockType() instanceof BlockBipropellantRocketMotor) { + additionalProb = 0.2F; + } + prob += additionalProb * brokenPart.getStage() / 10; + if (prob >= 1) { + return Math.min(1, prob); + } + } + } + + return prob; + } + + public boolean shouldBreak() { + return world.rand.nextFloat() < this.getBreakingProbability(); + } + /** * @return destination ID or Constants.INVALID_PLANET if none */ From c20872a9eba301b20ac1c8a59c6b34d9f48592ca Mon Sep 17 00:00:00 2001 From: MrToffel Date: Thu, 4 Jul 2024 20:37:12 +0200 Subject: [PATCH 04/42] enable simple tree placement for terraforming --- .../atmosphere/AtmosphereHandler.java | 3 +++ .../dimension/DimensionProperties.java | 10 ++++++---- .../tile/satellite/TileTerraformingTerminal.java | 4 ++-- .../advancedRocketry/util/BiomeHandler.java | 15 +++++++++++++-- .../world/biome/BiomeGenAlienForest.java | 2 +- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/atmosphere/AtmosphereHandler.java b/src/main/java/zmaster587/advancedRocketry/atmosphere/AtmosphereHandler.java index 6dc2b9c12..b3711e857 100644 --- a/src/main/java/zmaster587/advancedRocketry/atmosphere/AtmosphereHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/atmosphere/AtmosphereHandler.java @@ -135,6 +135,8 @@ public static void onBlockChange(@Nonnull World world, @Nonnull BlockPos bpos) { } + // sure.. causes stackoverflow left right center + /* else if (!handler.getAtmosphereType(bpos).allowsCombustion()) { if (world.getBlockState(bpos).getBlock().isLeaves(world.getBlockState(bpos), world, bpos)) { if (!(Boolean)world.getBlockState(bpos).getValue(BlockLeaves.CHECK_DECAY)) { @@ -152,6 +154,7 @@ else if (!handler.getAtmosphereType(bpos).allowsCombustion()) { world.setBlockState(bpos, Blocks.DIRT.getDefaultState()); } } + */ //Gasses should automatically vaporize and dissipate if (handler.getAtmosphereType(bpos) == AtmosphereType.VACUUM) { diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index 8fd616303..1e7c76ae3 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -266,8 +266,8 @@ public HashedBlockPosition get_next_terraforming_block() { System.out.println("List is 0 - this should never happen!!"); return null; // this should never happen. Yes it would crash the game, but if it does, my code is wrong and needs to be fixed anyway } - return terraformingChangeList.remove(nextInt(0,terraformingChangeList.size())); - //return terraformingChangeList.remove(0); + //return terraformingChangeList.remove(nextInt(0,terraformingChangeList.size())); + return terraformingChangeList.remove(0); } public DimensionProperties(int id, String name) { this(id); @@ -1110,14 +1110,16 @@ public List getViableBiomes(boolean allow_single_biome) { viableBiomes.add(biome); } } - viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); + //if (allow_single_biome) + //viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); } else if (Temps.getTempFromValue(averageTemperature).hotterOrEquals(Temps.COLD)) { for (Biome biome : Biome.REGISTRY) { if (biome != null && !BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.HOT) && !isBiomeblackListed(biome)) { viableBiomes.add(biome); } } - viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); + //if (allow_single_biome) + //viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); } else if (Temps.getTempFromValue(averageTemperature).hotterOrEquals(Temps.FRIGID)) { for (Biome biome : Biome.REGISTRY) { diff --git a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java index 15a9a137e..d72452d85 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java @@ -140,7 +140,7 @@ public void setInventorySlotContents(int slot, @Nonnull ItemStack stack) { public void update() { super.update(); boolean has_redstone = world.isBlockIndirectlyGettingPowered(getPos()) != 0; - int powerrequired = 120; + int powerrequired = 1; if (!world.isRemote) { if (world.getTotalWorldTime() % 20 == 0) @@ -175,7 +175,7 @@ public void update() { SatelliteBiomeChanger sat = (SatelliteBiomeChanger) ItemSatelliteIdentificationChip.getSatellite(getStackInSlot(0)); IUniversalEnergy battery = sat.getBattery(); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 1000; i++) { //TODO: Better imp if (battery.getUniversalEnergyStored() > powerrequired) { diff --git a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java index 844f67178..02e9db679 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java @@ -1,6 +1,7 @@ package zmaster587.advancedRocketry.util; import net.minecraft.block.*; +import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Biomes; import net.minecraft.init.Blocks; @@ -26,12 +27,14 @@ import java.util.Random; import static zmaster587.advancedRocketry.util.AstronomicalBodyHelper.getAverageTemperature; +import static zmaster587.advancedRocketry.util.AstronomicalBodyHelper.getOrbitalPeriod; public class BiomeHandler { - public static void changeBiome(World world, Biome biomeId, BlockPos pos, boolean regen_vegetation) { + //try to not change this method definition again because it will mess up the REID mixin + public static void changeBiome(World world, Biome biomeId, BlockPos pos, boolean was_biome_remote) { Chunk chunk = world.getChunkFromBlockCoords(pos); Biome biome = world.getBiome(pos); @@ -53,12 +56,20 @@ public static void changeBiome(World world, Biome biomeId, BlockPos pos, boolean } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } + + if (!was_biome_remote) { + int treegen = biomeId.decorator.treesPerChunk; + if (world.rand.nextInt(16 * 16) < treegen) + biomeId.getRandomTreeFeature(world.rand).generate(world, world.rand, yy); + } decorateBiome(world, yy, biomeId); + PacketHandler.sendToNearby(new PacketBiomeIDChange(chunk, world, new HashedBlockPosition(pos)), world.provider.getDimension(), pos, 256); } + //for biome remote use - else if(regen_vegetation) { + else if(was_biome_remote) { BlockPos yy = world.getHeight(pos); while (!world.getBlockState(yy.down()).isOpaqueCube() && yy.getY() > 0) diff --git a/src/main/java/zmaster587/advancedRocketry/world/biome/BiomeGenAlienForest.java b/src/main/java/zmaster587/advancedRocketry/world/biome/BiomeGenAlienForest.java index 1aaccaea9..25c669a3f 100644 --- a/src/main/java/zmaster587/advancedRocketry/world/biome/BiomeGenAlienForest.java +++ b/src/main/java/zmaster587/advancedRocketry/world/biome/BiomeGenAlienForest.java @@ -43,7 +43,7 @@ public void decorate(World worldIn, Random rand, BlockPos pos) { @Override @Nonnull public WorldGenAbstractTree getRandomTreeFeature(Random rand) { - return noTree; + return alienTree; } @Override From 86cfaa2ac15de0195451d1e47631c157acf63ee9 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Sat, 6 Jul 2024 02:43:26 +0200 Subject: [PATCH 05/42] terraforming update: added heightmap terraforming --- build.gradle.kts | 4 +- .../dimension/DimensionManager.java | 1 - .../dimension/DimensionProperties.java | 239 +++++++++++------- .../item/ItemBiomeChanger.java | 11 +- .../satellite/SatelliteBiomeChanger.java | 2 +- .../satellite/TileTerraformingTerminal.java | 33 +-- .../advancedRocketry/util/BiomeHandler.java | 81 ++++-- .../util/TerraformingHelper.java | 193 ++++++++++++++ .../advancedRocketry/util/chunkdata.java | 89 +++++++ .../world/ChunkProviderPlanet.java | 64 +++-- 10 files changed, 550 insertions(+), 167 deletions(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java create mode 100644 src/main/java/zmaster587/advancedRocketry/util/chunkdata.java diff --git a/build.gradle.kts b/build.gradle.kts index e4daa9b23..e3cf19d3f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -155,12 +155,14 @@ dependencies { compileOnly(fg.deobf("dev.galacticraft:galacticraft-legacy:$gcVersion")) compileOnly(fg.deobf("mezz.jei:jei_${mcVersion}:${jeiVersion}:api")) - runtimeOnly(fg.deobf("mezz.jei:jei_${mcVersion}:${jeiVersion}")) + //runtimeOnly(fg.deobf("mezz.jei:jei_${mcVersion}:${jeiVersion}")) // I think this crashes the game for me when running from IntelliJ implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation ("net.minecraftforge:mergetool:0.2.3.3") // implementation ("zmaster587.libVulpes:libVulpes:1.12.2-0.4.2+:deobf") + + //compileOnly (fg.deobf("curse.maven:biomes-o-plenty-220318:2842510")) } tasks.processResources { diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java index be318ba03..05ec798b5 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java @@ -975,7 +975,6 @@ public void createAndLoadDimensions(boolean resetFromXml) { DimensionProperties loadedDim = (DimensionProperties) loadedPlanets.get(properties.getId()); if (loadedDim != null) { properties.copySatellites(loadedDim); - properties.copyTerraformedBiomes(loadedDim); } } if (properties.isNativeDimension) diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index 1e7c76ae3..15f9847b4 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -10,6 +10,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -40,10 +41,7 @@ import zmaster587.advancedRocketry.satellite.SatelliteBiomeChanger; import zmaster587.advancedRocketry.satellite.SatelliteWeatherController; import zmaster587.advancedRocketry.stations.SpaceObjectManager; -import zmaster587.advancedRocketry.util.AstronomicalBodyHelper; -import zmaster587.advancedRocketry.util.OreGenProperties; -import zmaster587.advancedRocketry.util.SpacePosition; -import zmaster587.advancedRocketry.util.SpawnListEntryNBT; +import zmaster587.advancedRocketry.util.*; import zmaster587.advancedRocketry.world.ChunkManagerPlanet; import zmaster587.advancedRocketry.world.provider.WorldProviderPlanet; import zmaster587.libVulpes.api.IUniversalEnergy; @@ -121,7 +119,6 @@ public class DimensionProperties implements Cloneable, IDimensionProperties { private String name; //public ExtendedBiomeProperties biomeProperties; private LinkedList allowedBiomes; - private LinkedList terraformedBiomes; private LinkedList craterBiomeWeights; private boolean isRegistered = false; //private boolean isTerraformed = false; @@ -152,9 +149,14 @@ public class DimensionProperties implements Cloneable, IDimensionProperties { private int seaLevel; private int generatorType; //public int target_sea_level; - public List terraformingChangeList; - public List terraformingChunkListCurrentCycle; - public BiomeProvider chunkMgrTerraformed; + + public TerraformingHelper terraformingHelper; + public List terraformingProtectedBlocks; + public List terraformingChunksDone; + + //class + + public List water_source_locked_positions; //public boolean water_can_exist; @@ -176,7 +178,6 @@ public DimensionProperties(int id) { craterOres = new ArrayList<>(); allowedBiomes = new LinkedList<>(); - terraformedBiomes = new LinkedList<>(); craterBiomeWeights = new LinkedList<>(); satellites = new HashMap<>(); requiredArtifacts = new LinkedList<>(); @@ -208,11 +209,13 @@ public DimensionProperties(int id) { generatorType = 0; //target_sea_level = seaLevel; - terraformingChangeList = new LinkedList<>(); - terraformingChunkListCurrentCycle = new LinkedList<>(); //water_can_exist = true; water_source_locked_positions = new ArrayList<>(); + + terraformingProtectedBlocks = new LinkedList<>(); + terraformingChunksDone = new LinkedList<>(); + ringAngle = 70; @@ -220,55 +223,75 @@ public DimensionProperties(int id) { //this.chunkMgrTerraformed = new ChunkManagerPlanet(net.minecraftforge.common.DimensionManager.getWorld(id), net.minecraftforge.common.DimensionManager.getWorld(getId()).getWorldInfo().getGeneratorOptions(), getTerraformedBiomes()); } - public void reset_chunkmgr(){ - World world = net.minecraftforge.common.DimensionManager.getWorld(getId()); + public void load_terraforming_helper(boolean reset) { getAverageTemp(); - setTerraformedBiomes(DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).getViableBiomes(false)); - chunkMgrTerraformed = new ChunkManagerPlanet(world, world.getWorldInfo().getGeneratorOptions(), getTerraformedBiomes()); - } + getViableBiomes(false); + if (reset) + terraformingChunksDone.clear(); + terraformingHelper = new TerraformingHelper(getId(), getBiomesEntries(getViableBiomes(false)), terraformingChunksDone); - public void add_chunk_to_terraforming_list(Chunk chunk) { - boolean is_there = false; - for (Chunk i : terraformingChunkListCurrentCycle) { - if (i.x == chunk.x && i.z == chunk.z) { - is_there = true; + Collection list = (net.minecraftforge.common.DimensionManager.getWorld(getId())).getChunkProvider().getLoadedChunks(); + if (!list.isEmpty()) { + for (Chunk chunk:list){ + add_chunk_to_terraforming_list(chunk); } } - if (!is_there) { - terraformingChunkListCurrentCycle.add(chunk); - for (int i = 0; i < 256; i++) { - int coord = i; - int x = (coord & 0xF) + chunk.x * 16; - int z = (coord >> 4) + chunk.z * 16; - terraformingChangeList.add(new HashedBlockPosition(x, 0, z)); + + } + public void registerProtectingBlock(BlockPos p) { + boolean already_registered = false; + for (BlockPos i : terraformingProtectedBlocks) { + if (i.equals(p)) { + already_registered = true; + break; } } + if (!already_registered) { + terraformingProtectedBlocks.add(p); + if (terraformingHelper != null) + terraformingHelper.recalculate_chunk_status(); + } } - private void reset_terraforming_chunk_positions(){ - terraformingChangeList.clear(); - terraformingChunkListCurrentCycle.clear(); - Collection list = (net.minecraftforge.common.DimensionManager.getWorld(getId())).getChunkProvider().getLoadedChunks(); - if (list.size() > 0) { - for (Chunk chunk:list){ - add_chunk_to_terraforming_list(chunk); + + public void unregisterProtectingBlock(BlockPos p) { + for (BlockPos i : terraformingProtectedBlocks) { + if (i.equals(p)) { + terraformingProtectedBlocks.remove(i); + if (terraformingHelper != null) + terraformingHelper.recalculate_chunk_status(); + break; } } } - public HashedBlockPosition get_next_terraforming_block() { - if (terraformingChangeList.size() == 0) { - //long startTime = System.currentTimeMillis(); - reset_terraforming_chunk_positions(); - //long endTime = System.currentTimeMillis(); - //long executionTime = endTime - startTime; // Time in milliseconds - //System.out.println("reset chunklist: "+executionTime+"ms"); - } - if (terraformingChangeList.size() == 0) { - System.out.println("List is 0 - this should never happen!!"); - return null; // this should never happen. Yes it would crash the game, but if it does, my code is wrong and needs to be fixed anyway + + public void add_block_to_terraforming_queue(BlockPos p){ + //boolean is_there = false; + //for (BlockPos i : terraformingHelper.terraformingqueue) { + // if (i.equals(p)) { + // is_there = true; + // } + //} + //if (!is_there) + terraformingHelper.add_position_to_queue(p); + } + public void add_chunk_to_terraforming_list(Chunk chunk) { + + if (terraformingHelper != null) { + chunkdata current_chunk = terraformingHelper.getChunkFromList(chunk.x, chunk.z); + if (current_chunk == null || !current_chunk.chunk_fully_generated) { + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + if (current_chunk == null || !current_chunk.fully_generated[x][z]) + // if a position in the chunk is already fully generated, skip + add_block_to_terraforming_queue(new BlockPos(chunk.x * 16 + x, 0, chunk.z * 16 + z)); + + } + } + } } - //return terraformingChangeList.remove(nextInt(0,terraformingChangeList.size())); - return terraformingChangeList.remove(0); } + public DimensionProperties(int id, String name) { this(id); this.name = name; @@ -306,10 +329,6 @@ public void copySatellites(DimensionProperties props) { this.tickingSatellites = props.tickingSatellites; } - public void copyTerraformedBiomes(DimensionProperties props) { - this.terraformedBiomes = props.terraformedBiomes; - } - @Override public Object clone() { try { @@ -719,7 +738,7 @@ public void setAtmosphereDensity(int atmosphereDensity) { int prevAtm = this.atmosphereDensity; this.atmosphereDensity = atmosphereDensity; - reset_chunkmgr(); + load_terraforming_helper(true); @@ -1045,14 +1064,6 @@ public void setBiomes(List biomes) { addBiomes(biomes); } - public List getTerraformedBiomes() { - return terraformedBiomes; - } - - public void setTerraformedBiomes(List biomes) { - terraformedBiomes.clear(); - terraformedBiomes.addAll(getBiomesEntries(biomes)); - } /** * Used to determine if a biome is allowed to spawn on ANY planet @@ -1060,18 +1071,28 @@ public void setTerraformedBiomes(List biomes) { * @param biome biome to check * @return true if the biome is not allowed to spawn on any Dimension */ - public boolean isBiomeblackListed(Biome biome) { + public boolean isBiomeblackListed(Biome biome, boolean is_NOT_terraforming) { + + if (!is_NOT_terraforming){ + String modId = biome.getRegistryName().getResourceDomain(); + + if (!modId.equals("minecraft") && !modId.equals("advancedrocketry")) { + return true; + } + } + if (biome.equals(AdvancedRocketryBiomes.spaceBiome)) return true; + return AdvancedRocketryBiomes.instance.getBlackListedBiomes().contains(Biome.getIdForBiome(biome)); } /** * @return a list of biomes allowed to spawn in this dimension */ - public List getViableBiomes(boolean allow_single_biome) { + public List getViableBiomes(boolean not_terraforming) { Random random = new Random(System.nanoTime()); List viableBiomes = new ArrayList<>(); - if (atmosphereDensity > AtmosphereTypes.LOW.value && random.nextInt(3) == 0 && allow_single_biome) { + if (atmosphereDensity > AtmosphereTypes.LOW.value && random.nextInt(3) == 0 && not_terraforming) { List list = new LinkedList<>(AdvancedRocketryBiomes.instance.getSingleBiome()); while (list.size() > 1) { @@ -1100,36 +1121,36 @@ public List getViableBiomes(boolean allow_single_biome) { } else if (Temps.getTempFromValue(averageTemperature).hotterOrEquals(Temps.HOT)) { for (Biome biome : Biome.REGISTRY) { - if (biome != null && (BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.HOT) || BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.OCEAN)) && !isBiomeblackListed(biome)) { + if (biome != null && (BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.HOT) || BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.OCEAN)) && !isBiomeblackListed(biome, not_terraforming)) { viableBiomes.add(biome); } } } else if (Temps.getTempFromValue(averageTemperature).hotterOrEquals(Temps.NORMAL)) { for (Biome biome : Biome.REGISTRY) { - if (biome != null && !BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.COLD) && !isBiomeblackListed(biome)) { + if (biome != null && !BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.COLD) && !isBiomeblackListed(biome, not_terraforming)) { viableBiomes.add(biome); } } - //if (allow_single_biome) + //if (not_terraforming) //viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); } else if (Temps.getTempFromValue(averageTemperature).hotterOrEquals(Temps.COLD)) { for (Biome biome : Biome.REGISTRY) { - if (biome != null && !BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.HOT) && !isBiomeblackListed(biome)) { + if (biome != null && !BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.HOT) && !isBiomeblackListed(biome, not_terraforming)) { viableBiomes.add(biome); } } - //if (allow_single_biome) + //if (not_terraforming) //viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); } else if (Temps.getTempFromValue(averageTemperature).hotterOrEquals(Temps.FRIGID)) { for (Biome biome : Biome.REGISTRY) { - if (biome != null && BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.COLD) && !isBiomeblackListed(biome)) { + if (biome != null && BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.COLD) && !isBiomeblackListed(biome, not_terraforming)) { viableBiomes.add(biome); } } } else { for (Biome biome : Biome.REGISTRY) { - if (biome != null && BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.COLD) && !isBiomeblackListed(biome)) { + if (biome != null && BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.COLD) && !isBiomeblackListed(biome, not_terraforming)) { viableBiomes.add(biome); } } @@ -1338,22 +1359,6 @@ private void readFromTechnicalNBT(NBTTagCompound nbt) { } else beaconLocations.clear(); - - //Load biomes - if (nbt.hasKey("biomesTerra")) { - - terraformedBiomes.clear(); - int[] biomeIds = nbt.getIntArray("biomesTerra"); - List biomesList = new ArrayList<>(); - - - for (int biomeId : biomeIds) { - biomesList.add(AdvancedRocketryBiomes.instance.getBiomeById(biomeId)); - } - - terraformedBiomes.addAll(getBiomesEntries(biomesList)); - } - //Satellites if (nbt.hasKey("satallites")) { @@ -1581,6 +1586,32 @@ public void readFromNBT(NBTTagCompound nbt) { } else fillerBlock = null; + +//terraforming data + if (nbt.hasKey("fullyGeneratedChunks")) { + terraformingChunksDone.clear(); + list = nbt.getTagList("fullyGeneratedChunks", NBT.TAG_COMPOUND); + for (NBTBase entry : list) { + assert entry instanceof NBTTagCompound; + int x = ((NBTTagCompound) entry).getInteger("x"); + int z = ((NBTTagCompound) entry).getInteger("z"); + terraformingChunksDone.add(new ChunkPos(x, z)); + } + } + + if (nbt.hasKey("terraformingProtectedBlocks")) { + terraformingProtectedBlocks.clear(); + list = nbt.getTagList("terraformingProtectedBlocks", NBT.TAG_COMPOUND); + for (NBTBase entry : list) { + assert entry instanceof NBTTagCompound; + int x = ((NBTTagCompound) entry).getInteger("x"); + int z = ((NBTTagCompound) entry).getInteger("z"); + int y = ((NBTTagCompound) entry).getInteger("y"); + terraformingProtectedBlocks.add(new BlockPos(x, y, z)); + } + } + + readFromTechnicalNBT(nbt); } @@ -1595,16 +1626,6 @@ private void writeTechnicalNBT(NBTTagCompound nbt) { nbt.setTag("beaconLocations", list); } - - if (!terraformedBiomes.isEmpty()) { - int[] biomeId = new int[terraformedBiomes.size()]; - for (int i = 0; i < terraformedBiomes.size(); i++) { - - biomeId[i] = Biome.getIdForBiome(terraformedBiomes.get(i).biome); - } - nbt.setIntArray("biomesTerra", biomeId); - } - //Satellites if (!satellites.isEmpty()) { @@ -1617,6 +1638,8 @@ private void writeTechnicalNBT(NBTTagCompound nbt) { } nbt.setTag("satallites", allSatelliteNBT); } + + } public void writeToNBT(NBTTagCompound nbt) { @@ -1781,6 +1804,28 @@ public void writeToNBT(NBTTagCompound nbt) { } + // write terraforming data + + + list = new NBTTagList(); + for (ChunkPos pos: terraformingChunksDone) { + NBTTagCompound entry = new NBTTagCompound(); + entry.setInteger("x", pos.x); + entry.setInteger("z", pos.z); + list.appendTag(entry); + } + nbt.setTag("fullyGeneratedChunks", list); + + list = new NBTTagList(); + for (BlockPos pos: terraformingProtectedBlocks) { + NBTTagCompound entry = new NBTTagCompound(); + entry.setInteger("x", pos.getX()); + entry.setInteger("y", pos.getY()); + entry.setInteger("z", pos.getZ()); + list.appendTag(entry); + } + nbt.setTag("terraformingProtectedBlocks", list); + writeTechnicalNBT(nbt); } diff --git a/src/main/java/zmaster587/advancedRocketry/item/ItemBiomeChanger.java b/src/main/java/zmaster587/advancedRocketry/item/ItemBiomeChanger.java index e2eb16af5..eb460113d 100644 --- a/src/main/java/zmaster587/advancedRocketry/item/ItemBiomeChanger.java +++ b/src/main/java/zmaster587/advancedRocketry/item/ItemBiomeChanger.java @@ -47,12 +47,12 @@ public List getModules(int id, EntityPlayer player) { int j = 0; for (byte biomeByte : sat.discoveredBiomes()) { Biome biome = Biome.getBiome(biomeByte); - String biomeName = AdvancedRocketry.proxy.getNameFromBiome(biome); - - list2.add(new ModuleButton(32, 16 + 24 * (j++), Biome.getIdForBiome(biome), biomeName, this, TextureResources.buttonBuild)); + if (biome != null) { + String biomeName = AdvancedRocketry.proxy.getNameFromBiome(biome); + list2.add(new ModuleButton(32, 16 + 24 * (j++), Biome.getIdForBiome(biome), biomeName, this, TextureResources.buttonBuild)); + } } - //Relying on a bug, is this safe? ModuleContainerPan pan = new ModuleContainerPan(32, 16, list2, new LinkedList<>(), null, 128, 128, 0, -64, 0, 1000); @@ -78,7 +78,8 @@ else if (mapping == null) list.add(LibVulpes.proxy.getLocalizedString("msg.biomechanger.nosat")); else if (mapping.getDimensionId() == player.provider.getDimension()) { list.add(LibVulpes.proxy.getLocalizedString("msg.connected")); - list.add(LibVulpes.proxy.getLocalizedString("msg.biomechanger.selBiome") + mapping.getBiome().getBiomeName()); + if (mapping.getBiome()!=null) + list.add(LibVulpes.proxy.getLocalizedString("msg.biomechanger.selBiome") + mapping.getBiome().getBiomeName()); list.add(LibVulpes.proxy.getLocalizedString("msg.biomechanger.numBiome") + mapping.discoveredBiomes().size()); } else list.add(LibVulpes.proxy.getLocalizedString("msg.notconnected")); diff --git a/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteBiomeChanger.java b/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteBiomeChanger.java index 090b36f40..a7b2deb67 100644 --- a/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteBiomeChanger.java +++ b/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteBiomeChanger.java @@ -99,7 +99,7 @@ public void tickEntity() { HashedBlockPosition pos = toChangeList.remove(world.rand.nextInt(toChangeList.size())); //HashedBlockPosition pos = toChangeList.remove(toChangeList.size()-1); - BiomeHandler.changeBiome(world, biomeId, pos.getBlockPos(), true); + BiomeHandler.changeBiome(world, biomeId, pos.getBlockPos(), true, world.provider.getDimension()); } } else break; diff --git a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java index d72452d85..9529f6c82 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java @@ -29,6 +29,7 @@ import zmaster587.advancedRocketry.util.BiomeHandler; import zmaster587.advancedRocketry.util.IDataInventory; import zmaster587.advancedRocketry.util.PlanetaryTravelHelper; +import zmaster587.advancedRocketry.util.TerraformingHelper; import zmaster587.advancedRocketry.world.ChunkManagerPlanet; import zmaster587.advancedRocketry.world.provider.WorldProviderPlanet; import zmaster587.libVulpes.LibVulpes; @@ -140,7 +141,7 @@ public void setInventorySlotContents(int slot, @Nonnull ItemStack stack) { public void update() { super.update(); boolean has_redstone = world.isBlockIndirectlyGettingPowered(getPos()) != 0; - int powerrequired = 1; + int powerrequired = 120; if (!world.isRemote) { if (world.getTotalWorldTime() % 20 == 0) @@ -175,33 +176,33 @@ public void update() { SatelliteBiomeChanger sat = (SatelliteBiomeChanger) ItemSatelliteIdentificationChip.getSatellite(getStackInSlot(0)); IUniversalEnergy battery = sat.getBattery(); - for (int i = 0; i < 1000; i++) { + for (int i = 0; i < 16*16; i++) { //TODO: Better imp if (battery.getUniversalEnergyStored() > powerrequired) { - if (battery.extractEnergy(powerrequired, false) == powerrequired) { try { - HashedBlockPosition next_block = DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).get_next_terraforming_block(); - BiomeProvider chunkmgr = DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).chunkMgrTerraformed; + TerraformingHelper t = DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).terraformingHelper; - // this chunkmgr is not initialized by default because dimensionproperties - // inits during the forge mod init phase and some stuff is not loaded at this time. - // I will make sure it will be initialized here - // I have no idea where else to put it :( - if (chunkmgr == null) - DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).reset_chunkmgr(); + if (t == null) { + DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).load_terraforming_helper(false); + t = DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).terraformingHelper; + } + BiomeProvider chunkmgr = t.chunkMgrTerraformed; + BlockPos next_block_pos = t.get_next_position(false); - BiomeHandler.changeBiome(world, ((ChunkManagerPlanet) chunkmgr).getBiomeGenAt(next_block.x, next_block.z), new BlockPos(next_block.x, 0, next_block.z), false); + if (next_block_pos != null) { // it is null when there is everything terraformed + //battery.extractEnergy(powerrequired, false); + BiomeHandler.changeBiome(world, ((ChunkManagerPlanet) chunkmgr).getBiomeGenAt(next_block_pos.getX(), next_block_pos.getZ()), next_block_pos, false, world.provider.getDimension()); + } - - } catch (NullPointerException e) { - e.printStackTrace(); + //} catch (NullPointerException e) { + // e.printStackTrace(); } catch (NoClassDefFoundError e){ e.printStackTrace(); //WTF } - } + } else break; } diff --git a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java index 02e9db679..da4033861 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java @@ -9,20 +9,27 @@ import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeDecorator; +import net.minecraft.world.biome.BiomeProvider; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkPrimer; +import net.minecraft.world.gen.ChunkGeneratorOverworld; import net.minecraft.world.gen.feature.WorldGenAbstractTree; import net.minecraftforge.common.BiomeDictionary; import net.minecraftforge.fml.common.Loader; +import org.lwjgl.Sys; import zmaster587.advancedRocketry.api.IPlanetaryProvider; import zmaster587.advancedRocketry.api.dimension.IDimensionProperties; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.dimension.DimensionProperties; import zmaster587.advancedRocketry.network.PacketBiomeIDChange; +import zmaster587.advancedRocketry.world.ChunkProviderPlanet; +import zmaster587.advancedRocketry.world.provider.WorldProviderPlanet; import zmaster587.libVulpes.network.PacketHandler; import zmaster587.libVulpes.util.HashedBlockPosition; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Random; @@ -34,13 +41,16 @@ public class BiomeHandler { //try to not change this method definition again because it will mess up the REID mixin - public static void changeBiome(World world, Biome biomeId, BlockPos pos, boolean was_biome_remote) { + public static void changeBiome(World world, Biome biomeId, BlockPos pos, boolean was_biome_remote, int dimId) { Chunk chunk = world.getChunkFromBlockCoords(pos); Biome biome = world.getBiome(pos); + if (biomeId == null)return; + + BlockPos yy = world.getHeight(pos); + if (biome != biomeId) { - BlockPos yy = world.getHeight(pos); if (biome.topBlock != biomeId.topBlock) { while (!world.getBlockState(yy.down()).isOpaqueCube() && yy.getY() > 0) @@ -56,36 +66,69 @@ public static void changeBiome(World world, Biome biomeId, BlockPos pos, boolean } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } + } - if (!was_biome_remote) { - int treegen = biomeId.decorator.treesPerChunk; - if (world.rand.nextInt(16 * 16) < treegen) - biomeId.getRandomTreeFeature(world.rand).generate(world, world.rand, yy); - } - decorateBiome(world, yy, biomeId); - + //for biome remote use, only change and do simple decoration + if(was_biome_remote) { + yy = world.getHeight(pos); + while (!world.getBlockState(yy.down()).isOpaqueCube() && yy.getY() > 0) + yy = yy.down(); - PacketHandler.sendToNearby(new PacketBiomeIDChange(chunk, world, new HashedBlockPosition(pos)), world.provider.getDimension(), pos, 256); + decorateBiome(world, yy, biomeId); } - //for biome remote use - else if(was_biome_remote) { - BlockPos yy = world.getHeight(pos); + if (!was_biome_remote) { // heavy terraforming here... + //if (world.provider instanceof WorldProviderPlanet) { + DimensionProperties props = DimensionManager.getInstance().getDimensionProperties(dimId); + + IBlockState[] target_blocks = props.terraformingHelper.getBlocksAt(yy.getX(), yy.getZ()); // this causes a not generated chunk to generate + + if (!props.terraformingHelper.getChunkFromList(chunk.x, chunk.z).fully_generated[yy.getX() % 16][yy.getZ() % 16]) { + //fast replacing + for (int i = 5; i < 255; i++) { + world.setBlockState(new BlockPos(yy.getX(), i, yy.getZ()), target_blocks[i]); + } + + // check if the terrain is fully generated to target height + int current_height = world.getHeight(yy.getX(),yy.getZ()); // returns the y value above the highest block + int target_height = 0; + for (int i = 255; i > 5; i--) { + // go down until there is a non-air block, this is target height + if (target_blocks[i] != Blocks.AIR.getDefaultState()){ + target_height = i+1; + break; + } + } + // as long as terrain does not match the target height, re-add position to queue + if (current_height == target_height){ + props.terraformingHelper.getChunkFromList(chunk.x, chunk.z).set_position_fully_generated(yy.getX() % 16, yy.getZ() % 16); + }else{ + props.terraformingHelper.add_position_to_queue(yy); + } + } - while (!world.getBlockState(yy.down()).isOpaqueCube() && yy.getY() > 0) - yy = yy.down(); - if (world.getBlockState(yy.down()) == biome.topBlock) - world.setBlockState(yy.down(), biomeId.topBlock); + if (props.terraformingHelper.can_populate(chunk.x, chunk.z)) { + // we do some hacky tricks here to ensure that trees can fully generate + // we shift the actual tree generation by 8 blocks so that it overlaps with the chunks next to it + // can_populate() ensures that the chunks next to it are ready for decoration - decorateBiome(world, yy, biomeId); + if (!props.terraformingHelper.getChunkFromList(chunk.x,chunk.z).fully_decorated[yy.getX()%16][yy.getZ()%16]) { + + int treegen = biomeId.decorator.treesPerChunk; + if (world.rand.nextInt(16 * 16) < treegen) + biomeId.getRandomTreeFeature(world.rand).generate(world, world.rand, world.getHeight(yy.add(8, 0, 8))); - PacketHandler.sendToNearby(new PacketBiomeIDChange(chunk, world, new HashedBlockPosition(pos)), world.provider.getDimension(), pos, 256); + props.terraformingHelper.getChunkFromList(chunk.x, chunk.z).set_position_decorated(yy.getX() % 16, yy.getZ() % 16); + } + } } + PacketHandler.sendToNearby(new PacketBiomeIDChange(chunk, world, new HashedBlockPosition(pos)), world.provider.getDimension(), pos, 256); + } private static void spawn_decoration_block(World world, BlockPos pos, IBlockState state, int p){ diff --git a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java new file mode 100644 index 000000000..d3007b724 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java @@ -0,0 +1,193 @@ +package zmaster587.advancedRocketry.util; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeProvider; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkPrimer; +import net.minecraftforge.common.BiomeManager; +import zmaster587.advancedRocketry.dimension.DimensionManager; +import zmaster587.advancedRocketry.dimension.DimensionProperties; +import zmaster587.advancedRocketry.world.ChunkManagerPlanet; +import zmaster587.advancedRocketry.world.ChunkProviderPlanet; + +import java.util.LinkedList; +import java.util.List; + +import static org.apache.commons.lang3.RandomUtils.nextInt; + +enum TerraformingType{ + ALLOWED, BORDER, PROTECTED +} + +public class TerraformingHelper { + public BiomeProvider chunkMgrTerraformed; + public int dimId; + public List biomeList; + public World world; + public ChunkProviderPlanet generator; + private DimensionProperties props; + public List chunkdataList; + + // A block is placed in queue if (OR) + // - Initial block placements - both only set blocks if the terrain at the BlockPos is not fully generated in the "real" world + // - The TerraformingHelper is created ( causes all loaded chunks to place their blocks here, from DimProps ) + // - A new chunk is loaded ( called from PlanetEventHandler ) + // - After the BiomeHandler has made a change at a BlockPos + // - For type ALLOWED: if the terrain heigt does not match the target, re-add the block to the queue + // - For type BORDER: if BiomeHandler has made a change of the height at BlockPos re-add to queue + // - For type BORDER: if a type.ALLOWED has changed its height it will add blocks next to it (if type==BORDER) to the queue + // - For type PROTECTED: the block is never re-added to queue because it will change its biome only once + // - When a protecting Block has been removed and chunk status is re-calculated + // add every chunk that was PROTECTED and no longer is PROTECTED to the queue for terraforming. + // doesn't matter if it is type ALLOWED or type BORDER + public List terraformingqueue; + + int safe_zone_radius = 3; + int border_zone = 1; + + + public TerraformingHelper(int dimension, List biomes, List generated_chunks){ + this.dimId = dimension; + this.props = DimensionManager.getInstance().getDimensionProperties(dimension); + this.biomeList = biomes; + this.world = net.minecraftforge.common.DimensionManager.getWorld(dimId); + this.chunkMgrTerraformed = new ChunkManagerPlanet(world, world.getWorldInfo().getGeneratorOptions(), biomeList); + this.terraformingqueue = new LinkedList<>(); + chunkdataList = new LinkedList<>(); + generator = new ChunkProviderPlanet(world, world.getSeed(), world.getWorldInfo().isMapFeaturesEnabled(), world.getWorldInfo().getGeneratorOptions()); + + for (ChunkPos i:generated_chunks){ + chunkdata data = new chunkdata(i.x,i.z,null, world, this); + data.chunk_fully_generated = true; + chunkdataList.add(data); + } + recalculate_chunk_status(); + } + + public boolean can_populate(int x, int z){ + chunkdata currentchunk = getChunkFromList(x,z); + chunkdata currentchunkx1 = getChunkFromList(x+1,z); + chunkdata currentchunkz1 = getChunkFromList(x,z+1); + chunkdata currentchunkx1z1 = getChunkFromList(x+1,z+1); + + if (currentchunk != null && currentchunkz1 != null && currentchunkx1 != null && currentchunkx1z1 != null){ + if (currentchunkz1.terrain_fully_generated && currentchunkx1.terrain_fully_generated && currentchunkx1z1.terrain_fully_generated && currentchunk.terrain_fully_generated) + return true; + } + return false; + } + public void check_can_decorate(int px, int pz){ + // for every chunk next to this one, check if it can decorate (except for if it is already decorated) + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + if (getChunkFromList(px+x,pz+z) != null && !getChunkFromList(px+x,pz+z).chunk_fully_generated){ + if (can_populate(px+x,pz+z)){ + //re-add all position to queue for decoration + for (int bx = 0; bx < 16; bx++) { + for (int bz = 0; bz < 16; bz++) { + terraformingqueue.add(new BlockPos((px+x)*16+bx, 0, (pz+z)*16+bz)); + } + } + } + } + } + } + + } + + public void recalculate_chunk_status() { + + for (int j = 0; j < chunkdataList.size(); j++) { + chunkdataList.get(j).type = TerraformingType.ALLOWED; + } + + for (BlockPos i : props.terraformingProtectedBlocks) { + Chunk chunk = world.getChunkFromBlockCoords(i); + for (int x = -safe_zone_radius; x <= safe_zone_radius; x++) { + for (int z = -safe_zone_radius; z <= safe_zone_radius; z++) { + + if (getChunkFromList(chunk.x + x, chunk.z + z) != null) { + getChunkFromList(chunk.x + x, chunk.z + z).type = TerraformingType.PROTECTED; + + for (int x2 = -border_zone; x2 <= border_zone; x2++) { + for (int z2 = -border_zone; z2 <= border_zone; z2++) { + if (getChunkFromList(chunk.x + x+x2, chunk.z + z+z2) != null) { + if (getChunkFromList(chunk.x + x+x2, chunk.z + z+z2).type == TerraformingType.ALLOWED) { + getChunkFromList(chunk.x + x + x2, chunk.z + z + z2).type = TerraformingType.BORDER; + } + } + } + } + + } + } + } + } + } + + public chunkdata getChunkFromList(int x, int z){ + for (int i = 0; i < chunkdataList.size(); i++) { + if (chunkdataList.get(i).x == x && chunkdataList.get(i).z == z){ + return chunkdataList.get(i); + } + } + return null; + } + + public void setPositionReady(int x, int z){ + Chunk chunk = world.getChunkFromBlockCoords(new BlockPos(x,0,z)); + getChunkFromList(chunk.x, chunk.z).set_position_fully_generated(x%16, z%16); + } + + public void add_position_to_queue(BlockPos p){ + terraformingqueue.add(p); + } + + public BlockPos get_next_position(boolean random){ + if (terraformingqueue.isEmpty()) + return null; + int index = 0; + if (random) + index = nextInt(0,terraformingqueue.size()); + return terraformingqueue.remove(0); + } + + public IBlockState[] getBlocksAt(int x, int z){ + Chunk chunk = world.getChunkFromBlockCoords(new BlockPos(x,0,z)); + chunkdata data = getChunkFromList(chunk.x,chunk.z); + if (data == null){ + ChunkPrimer primer = generator.getChunkPrimer(chunk.x, chunk.z, chunkMgrTerraformed); + + IBlockState[][][] blockStates = new IBlockState[16][16][256]; + for (int px = 0; px < 16; px++) { + for (int pz = 0; pz < 16; pz++) { + for (int py = 0; py < 256; py++) { + blockStates[px][pz][py] = primer.getBlockState(px,py,pz); + } + } + } + + data = new chunkdata(chunk.x,chunk.z, blockStates, world, this); + chunkdataList.add(data); + recalculate_chunk_status(); + } + int chunkx = x%16; + int chunkz = z%16; + + if (data.blockStates == null) + return null; + + return data.blockStates[chunkx][chunkz]; + } + + + public void setChunkFullyGenerated(int x, int z) { + getChunkFromList(x,z).chunk_fully_generated = true; + props.terraformingChunksDone.add(new ChunkPos(x,z)); + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java b/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java new file mode 100644 index 000000000..ef097be41 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java @@ -0,0 +1,89 @@ +package zmaster587.advancedRocketry.util; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.world.World; + +public class chunkdata { + public int x; + public int z; + public TerraformingType type; + + + // chunk can be populated if itself and the 3 chunks with (x+1), (z+1) and (x+1,z+1) are fully generated in the world + + + // if a chunks terrain is fully generated and does not need any future updates - causes it to set the IBlockState[][][] to null to free memory + // if the terrain is fully generated it allows for calling populate() + public boolean terrain_fully_generated; + + // will be set by BiomeHandler after calling the populate method, makes the chunk fully generated and it does not need any future updates + // as long as the atmosphere does not change, chunks that are fully generated will not register their blocks in the terraforming queue + public boolean chunk_fully_generated; + + // if the y values of new chunk and chunk in world match, terrain at this position is considered fully generated + public boolean[][] fully_generated; + + // if all positions have been decorated + public boolean[][] fully_decorated; + + + public IBlockState[][][] blockStates; + + World world; // used to call populate after decoration is finished + TerraformingHelper helper; + + public chunkdata(int x, int z, IBlockState[][][] blockStates, World world, TerraformingHelper helper) { + this.x = x; + this.world = world; + this.helper = helper; + this.z = z; + this.blockStates = blockStates; + this.type = TerraformingType.ALLOWED; + chunk_fully_generated = false; + terrain_fully_generated = false; + fully_generated = new boolean[16][16]; + fully_decorated = new boolean[16][16]; + } + + /* + sets if a blockpos is fully generated and computed if the chunk is fully generated + called from BiomeHandler + */ + public void set_position_fully_generated(int x, int z){ + fully_generated[x][z] = true; + boolean all_generated = true; + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 16; j++) { + if (fully_generated[i][j] == false) { + all_generated = false; + } + } + } + if (all_generated){ + terrain_fully_generated = true; + this.blockStates = null; // no longer needed, gc should collect them now + helper.check_can_decorate(x,z); + } + } + + public void set_position_decorated(int x, int z){ + + fully_decorated[x][z] = true; + boolean all_decorated = true; + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 16; j++) { + if (fully_decorated[i][j] == false) { + all_decorated = false; + } + } + } + if (all_decorated){ + // populate uses the biome at blockpos 0,0, in the chunk x+1,z+1, that's why we need the chunks next to it generated + world.provider.createChunkGenerator().populate(this.x, this.z); + helper.setChunkFullyGenerated(this.x,this.z); + } + + + } + +} diff --git a/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java b/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java index 29529069d..b3d144492 100644 --- a/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java +++ b/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java @@ -13,6 +13,7 @@ import net.minecraft.world.WorldType; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.SpawnListEntry; +import net.minecraft.world.biome.BiomeProvider; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkPrimer; import net.minecraft.world.gen.*; @@ -193,11 +194,18 @@ public ChunkProviderPlanet(World worldIn, long seed, boolean mapFeaturesEnabledI } public void setBlocksInChunk(int x, int z, ChunkPrimer primer) { + setBlocksInChunk(x,z,primer,null); + } + public void setBlocksInChunk(int x, int z, ChunkPrimer primer, BiomeProvider bp) { byte b0 = 63; //TODO: may break for little planets - this.biomesForGeneration = this.worldObj.getBiomeProvider().getBiomesForGeneration(this.biomesForGeneration, x * 4 - 2, z * 4 - 2, 10, 10); - this.generateHeightmap(x * 4, 0, z * 4); - + if (bp == null) { + this.biomesForGeneration = this.worldObj.getBiomeProvider().getBiomesForGeneration(this.biomesForGeneration, x * 4 - 2, z * 4 - 2, 10, 10); + this.generateHeightmap(x * 4, 0, z * 4); + }else{ + this.biomesForGeneration = bp.getBiomesForGeneration(this.biomesForGeneration, x * 4 - 2, z * 4 - 2, 10, 10); + this.generateHeightmap(x * 4, 0, z * 4); + } for (int i = 0; i < 4; ++i) { int j = i * 5; int k = (i + 1) * 5; @@ -266,13 +274,26 @@ public void replaceBiomeBlocks(int x, int z, ChunkPrimer primer, Biome[] biomesI } } - protected ChunkPrimer getChunkPrimer(int x, int z) { + public ChunkPrimer getChunkPrimer(int x, int z) { + return getChunkPrimer(x,z,null); + } + public ChunkPrimer getChunkPrimer(int x, int z, BiomeProvider bp) { this.rand.setSeed((long) x * 341873128712L + (long) z * 132897987541L); ChunkPrimer chunkprimer = new ChunkPrimer(); - this.setBlocksInChunk(x, z, chunkprimer); - this.biomesForGeneration = this.worldObj.getBiomeProvider().getBiomes(this.biomesForGeneration, x * 16, z * 16, 16, 16); - this.replaceBiomeBlocks(x, z, chunkprimer, this.biomesForGeneration); + boolean is_terraforming = false; + if (bp == null) { + this.biomesForGeneration = this.worldObj.getBiomeProvider().getBiomes(this.biomesForGeneration, x * 16, z * 16, 16, 16); + this.setBlocksInChunk(x, z, chunkprimer); + this.replaceBiomeBlocks(x, z, chunkprimer, this.biomesForGeneration); + } + else { + this.biomesForGeneration = bp.getBiomes(this.biomesForGeneration, x * 16, z * 16, 16, 16); + this.setBlocksInChunk(x, z, chunkprimer, bp); + this.replaceBiomeBlocks(x, z, chunkprimer, this.biomesForGeneration); + is_terraforming = true; + } + if (this.settings.useCaves && caveGenerator != null) { this.caveGenerator.generate(this.worldObj, x, z, chunkprimer); @@ -282,13 +303,13 @@ protected ChunkPrimer getChunkPrimer(int x, int z) { this.ravineGenerator.generate(this.worldObj, x, z, chunkprimer); } - if (this.craterGeneratorSmall != null) + if (this.craterGeneratorSmall != null && !is_terraforming) this.craterGeneratorSmall.generate(this.worldObj, x, z, chunkprimer); - if (this.craterGenerator != null) + if (this.craterGenerator != null && !is_terraforming) this.craterGenerator.generate(this.worldObj, x, z, chunkprimer); - if (this.craterGeneratorHuge != null) + if (this.craterGeneratorHuge != null && !is_terraforming) this.craterGeneratorHuge.generate(this.worldObj, x, z, chunkprimer); if (this.volcanoGenerator != null) @@ -300,7 +321,7 @@ protected ChunkPrimer getChunkPrimer(int x, int z) { //Trees are always this.swampTreeGenerator.generate(this.worldObj, x, z, chunkprimer); - if (this.mapFeaturesEnabled && habitable) { + if (this.mapFeaturesEnabled && habitable && !is_terraforming) { // terraforming would destroy it all... if (this.settings.useMineShafts) { this.mineshaftGenerator.generate(this.worldObj, x, z, chunkprimer); } @@ -308,7 +329,6 @@ protected ChunkPrimer getChunkPrimer(int x, int z) { if (this.settings.useVillages) { this.villageGenerator.generate(this.worldObj, x, z, chunkprimer); } - if (this.settings.useStrongholds) { this.strongholdGenerator.generate(this.worldObj, x, z, chunkprimer); } @@ -316,7 +336,6 @@ protected ChunkPrimer getChunkPrimer(int x, int z) { if (this.settings.useTemples) { this.scatteredFeatureGenerator.generate(this.worldObj, x, z, chunkprimer); } - if (this.settings.useMonuments) { this.oceanMonumentGenerator.generate(this.worldObj, x, z, chunkprimer); } @@ -493,7 +512,6 @@ public void populate(int x, int z) { if (this.settings.useTemples) { this.scatteredFeatureGenerator.generateStructure(this.worldObj, this.rand, chunkpos); } - if (this.settings.useMonuments) { this.oceanMonumentGenerator.generateStructure(this.worldObj, this.rand, chunkpos); } @@ -550,18 +568,6 @@ public void populate(int x, int z) { } }//Forge: End ICE - - //If a planet is terraformed chenge upper blocks - // NO - because it causes mega-lag! - /* - if (zmaster587.advancedRocketry.api.ARConfiguration.getCurrentConfig().enableTerraforming && worldObj.provider.getClass() == WorldProviderPlanet.class) { - - if (DimensionManager.getInstance().getDimensionProperties(worldObj.provider.getDimension()).isTerraformed()) { - Chunk chunk = worldObj.getChunkFromChunkCoords(x, z); - PlanetEventHandler.modifyChunk(worldObj, (WorldProviderPlanet) worldObj.provider, chunk); - } - } - */ net.minecraftforge.event.ForgeEventFactory.onChunkPopulate(false, this, this.worldObj, this.rand, x, z, flag); OreGenProperties oreGenProperties = DimensionManager.getInstance().getDimensionProperties(this.worldObj.provider.getDimension()).getOreGenProperties(this.worldObj); @@ -593,6 +599,7 @@ public boolean generateStructures(Chunk chunkIn, int x, int z) { @Override public void recreateStructures(Chunk chunkIn, int x, int z) { + /* this causes tons of crashes and I dont know why if (this.mapFeaturesEnabled || !habitable) { if (this.settings.useMineShafts) { this.mineshaftGenerator.generate(this.worldObj, x, z, null); @@ -601,11 +608,11 @@ public void recreateStructures(Chunk chunkIn, int x, int z) { if (this.settings.useVillages) { this.villageGenerator.generate(this.worldObj, x, z, null); } - if (this.settings.useStrongholds) { this.strongholdGenerator.generate(this.worldObj, x, z, null); } + if (this.settings.useTemples) { this.scatteredFeatureGenerator.generate(this.worldObj, x, z, null); } @@ -613,7 +620,10 @@ public void recreateStructures(Chunk chunkIn, int x, int z) { if (this.settings.useMonuments) { this.oceanMonumentGenerator.generate(this.worldObj, x, z, null); } + } + + */ } @Override From 67f3d933e580e77d3d693684fd245b802d55182f Mon Sep 17 00:00:00 2001 From: MrToffel Date: Sat, 6 Jul 2024 03:04:25 +0200 Subject: [PATCH 06/42] fix planets not rotating when space station rotates a tester confirmed it fixed the bug --- .../client/render/planet/RenderPlanetarySky.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderPlanetarySky.java b/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderPlanetarySky.java index 67ae1aa86..a79dc5f79 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderPlanetarySky.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderPlanetarySky.java @@ -791,7 +791,12 @@ else if (DimensionManager.getInstance().isDimensionCreated(mc.world.provider.get GL11.glRotatef((float) myPhi, 0f, 0f, 1f); GL11.glRotatef(planetPositionTheta, 1f, 0f, 0f); - rotateAroundAntiAxis(); + + // THIS MESSES UP PLANET ROTATION ON SPACE STATIONS + // THIS SHOULD NOT BE CALLED WHEN ON SPACE STATION!!!!! + if (world.provider.getDimension() != ARConfiguration.getCurrentConfig().spaceDimId) { + rotateAroundAntiAxis(); + } float phiAngle = (float) ((myPhi) * Math.PI / 180f); From debc386ed9a37433aedbb474a196e2ffaa0658aa Mon Sep 17 00:00:00 2001 From: MrToffel Date: Sat, 6 Jul 2024 18:51:45 +0200 Subject: [PATCH 07/42] fully implemted heightmap terraforming + safe zone system --- .../block/BlockTileTerraformer.java | 17 ++ .../dimension/DimensionManager.java | 2 + .../dimension/DimensionProperties.java | 30 ++- .../satellite/SatelliteBiomeChanger.java | 2 +- .../satellite/TileTerraformingTerminal.java | 8 +- .../advancedRocketry/util/BiomeHandler.java | 169 +++++++++++----- .../util/TerraformingHelper.java | 186 +++++++++++++----- .../advancedRocketry/util/chunkdata.java | 10 +- 8 files changed, 320 insertions(+), 104 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockTileTerraformer.java b/src/main/java/zmaster587/advancedRocketry/block/BlockTileTerraformer.java index 7ac0de83a..2ebf763ca 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockTileTerraformer.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockTileTerraformer.java @@ -8,6 +8,7 @@ import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -20,12 +21,16 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import org.lwjgl.Sys; +import scala.tools.nsc.doc.base.comment.EntityLink; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.tile.satellite.TileTerraformingTerminal; import zmaster587.libVulpes.LibVulpes; import zmaster587.libVulpes.block.RotatableBlock; import zmaster587.libVulpes.util.IAdjBlockUpdate; +import javax.annotation.Nonnull; + public class BlockTileTerraformer extends RotatableBlock { protected Class tileClass; protected int guiId; @@ -100,7 +105,18 @@ public boolean isOpaqueCube(IBlockState state) { return false; } + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase player, @Nonnull ItemStack itemstack) { + super.onBlockPlacedBy(world, pos, state, player, itemstack); + if (!world.isRemote) { + DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).registerProtectingBlock(pos); + System.out.println("terminal placed"); + } + } public void breakBlock(World world, BlockPos pos, IBlockState state) { + if (!world.isRemote) + DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).unregisterProtectingBlock(pos); + TileEntity tile = world.getTileEntity(pos); @@ -133,6 +149,7 @@ public void breakBlock(World world, BlockPos pos, IBlockState state) { entityitem.getItem().setTagCompound(tag == null ? null : tag.copy()); } + // why double calling this?? world.spawnEntity(entityitem); world.spawnEntity(entityitem); } diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java index 05ec798b5..87493d7da 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java @@ -975,6 +975,8 @@ public void createAndLoadDimensions(boolean resetFromXml) { DimensionProperties loadedDim = (DimensionProperties) loadedPlanets.get(properties.getId()); if (loadedDim != null) { properties.copySatellites(loadedDim); + properties.terraformingProtectedBlocks = loadedDim.terraformingProtectedBlocks; + properties.terraformingChunksDone = loadedDim.terraformingChunksDone; } } if (properties.isNativeDimension) diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index 15f9847b4..6e6783044 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -26,6 +26,7 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import org.apache.commons.lang3.ArrayUtils; +import org.lwjgl.Sys; import zmaster587.advancedRocketry.AdvancedRocketry; import zmaster587.advancedRocketry.api.*; import zmaster587.advancedRocketry.api.atmosphere.AtmosphereRegister; @@ -153,6 +154,7 @@ public class DimensionProperties implements Cloneable, IDimensionProperties { public TerraformingHelper terraformingHelper; public List terraformingProtectedBlocks; public List terraformingChunksDone; + public List terraformingChunksAlreadyAdded; //class @@ -215,6 +217,7 @@ public DimensionProperties(int id) { terraformingProtectedBlocks = new LinkedList<>(); terraformingChunksDone = new LinkedList<>(); + terraformingChunksAlreadyAdded = new LinkedList<>(); ringAngle = 70; @@ -226,8 +229,13 @@ public DimensionProperties(int id) { public void load_terraforming_helper(boolean reset) { getAverageTemp(); getViableBiomes(false); - if (reset) + if (reset){ terraformingChunksDone.clear(); + terraformingChunksAlreadyAdded.clear(); + } + + System.out.println("load helper with protecting blocks: "+terraformingProtectedBlocks.size()); + terraformingHelper = new TerraformingHelper(getId(), getBiomesEntries(getViableBiomes(false)), terraformingChunksDone); Collection list = (net.minecraftforge.common.DimensionManager.getWorld(getId())).getChunkProvider().getLoadedChunks(); @@ -246,10 +254,13 @@ public void registerProtectingBlock(BlockPos p) { break; } } + System.out.println("register protecting block called"); if (!already_registered) { terraformingProtectedBlocks.add(p); - if (terraformingHelper != null) + System.out.println("block registered"); + if (terraformingHelper != null){ terraformingHelper.recalculate_chunk_status(); + } } } @@ -280,6 +291,16 @@ public void add_chunk_to_terraforming_list(Chunk chunk) { chunkdata current_chunk = terraformingHelper.getChunkFromList(chunk.x, chunk.z); if (current_chunk == null || !current_chunk.chunk_fully_generated) { + boolean chunk_was_already_added = false; // do not add a chunk twice, the helper will manage it once it is added + for (ChunkPos i :terraformingChunksAlreadyAdded){ + if (chunk.x == i.x && chunk.z == i.z){ + chunk_was_already_added = true; + break; + } + } + if (chunk_was_already_added) + return; + for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { if (current_chunk == null || !current_chunk.fully_generated[x][z]) @@ -1608,6 +1629,11 @@ public void readFromNBT(NBTTagCompound nbt) { int z = ((NBTTagCompound) entry).getInteger("z"); int y = ((NBTTagCompound) entry).getInteger("y"); terraformingProtectedBlocks.add(new BlockPos(x, y, z)); + System.out.println("read protecting block at "+x+":"+y+":"+z+" - - "+terraformingProtectedBlocks.size()); + } + if (terraformingHelper != null) { + terraformingHelper.recalculate_chunk_status(); + System.out.println("calling recalculate_chunk_status after readfrom nbt"); } } diff --git a/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteBiomeChanger.java b/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteBiomeChanger.java index a7b2deb67..67639e104 100644 --- a/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteBiomeChanger.java +++ b/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteBiomeChanger.java @@ -99,7 +99,7 @@ public void tickEntity() { HashedBlockPosition pos = toChangeList.remove(world.rand.nextInt(toChangeList.size())); //HashedBlockPosition pos = toChangeList.remove(toChangeList.size()-1); - BiomeHandler.changeBiome(world, biomeId, pos.getBlockPos(), true, world.provider.getDimension()); + BiomeHandler.terraform(world, biomeId, pos.getBlockPos(), true, world.provider.getDimension()); } } else break; diff --git a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java index 9529f6c82..91053690d 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java @@ -141,7 +141,7 @@ public void setInventorySlotContents(int slot, @Nonnull ItemStack stack) { public void update() { super.update(); boolean has_redstone = world.isBlockIndirectlyGettingPowered(getPos()) != 0; - int powerrequired = 120; + int powerrequired = 12; if (!world.isRemote) { if (world.getTotalWorldTime() % 20 == 0) @@ -176,7 +176,7 @@ public void update() { SatelliteBiomeChanger sat = (SatelliteBiomeChanger) ItemSatelliteIdentificationChip.getSatellite(getStackInSlot(0)); IUniversalEnergy battery = sat.getBattery(); - for (int i = 0; i < 16*16; i++) { + for (int i = 0; i < 10; i++) { //TODO: Better imp if (battery.getUniversalEnergyStored() > powerrequired) { @@ -193,8 +193,8 @@ public void update() { BlockPos next_block_pos = t.get_next_position(false); if (next_block_pos != null) { // it is null when there is everything terraformed - //battery.extractEnergy(powerrequired, false); - BiomeHandler.changeBiome(world, ((ChunkManagerPlanet) chunkmgr).getBiomeGenAt(next_block_pos.getX(), next_block_pos.getZ()), next_block_pos, false, world.provider.getDimension()); + battery.extractEnergy(powerrequired, false); + BiomeHandler.terraform(world, ((ChunkManagerPlanet) chunkmgr).getBiomeGenAt(next_block_pos.getX(), next_block_pos.getZ()), next_block_pos, false, world.provider.getDimension()); } //} catch (NullPointerException e) { diff --git a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java index da4033861..bc6a41633 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java @@ -6,6 +6,7 @@ import net.minecraft.init.Biomes; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeDecorator; @@ -36,30 +37,27 @@ import static zmaster587.advancedRocketry.util.AstronomicalBodyHelper.getAverageTemperature; import static zmaster587.advancedRocketry.util.AstronomicalBodyHelper.getOrbitalPeriod; -public class BiomeHandler { - - - //try to not change this method definition again because it will mess up the REID mixin - public static void changeBiome(World world, Biome biomeId, BlockPos pos, boolean was_biome_remote, int dimId) { - Chunk chunk = world.getChunkFromBlockCoords(pos); +public class BiomeHandler { - Biome biome = world.getBiome(pos); - - if (biomeId == null)return; + public static void decorate_simple(World world, Biome biomeId, Biome old_biome, BlockPos pos) { BlockPos yy = world.getHeight(pos); + while (!world.getBlockState(yy.down()).isOpaqueCube() && yy.getY() > 0) + yy = yy.down(); - if (biome != biomeId) { - if (biome.topBlock != biomeId.topBlock) { - - while (!world.getBlockState(yy.down()).isOpaqueCube() && yy.getY() > 0) - yy = yy.down(); + if (old_biome.topBlock != biomeId.topBlock) { + if (world.getBlockState(yy.down()) == old_biome.topBlock) + world.setBlockState(yy.down(), biomeId.topBlock); + } - if (world.getBlockState(yy.down()) == biome.topBlock) - world.setBlockState(yy.down(), biomeId.topBlock); - } + decorateBiome(world, yy, biomeId); + } + // Bro I am sorry for changing this again and I know it will mess up your mixin but terraforming had a big update so.... + public static void changeBiome(World world, Biome biomeId, Biome old_biome, BlockPos pos) { + Chunk chunk = world.getChunkFromBlockCoords(pos); + if (old_biome != biomeId) { byte[] biomeArr = chunk.getBiomeArray(); try { biomeArr[(pos.getX() & 15) + (pos.getZ() & 15) * 16] = (byte) Biome.getIdForBiome(biomeId); @@ -67,63 +65,140 @@ public static void changeBiome(World world, Biome biomeId, BlockPos pos, boolean e.printStackTrace(); } } + } - //for biome remote use, only change and do simple decoration - if(was_biome_remote) { - yy = world.getHeight(pos); - while (!world.getBlockState(yy.down()).isOpaqueCube() && yy.getY() > 0) - yy = yy.down(); + public static void do_heavy_terraforming(World world, Biome biomeId, Biome old_biome, BlockPos pos, int dimId){ - decorateBiome(world, yy, biomeId); - } + int inchunkx = ((pos.getX() % 16) + 16) % 16; + int inchunkz = ((pos.getZ() % 16) + 16) % 16; - if (!was_biome_remote) { // heavy terraforming here... - //if (world.provider instanceof WorldProviderPlanet) { - DimensionProperties props = DimensionManager.getInstance().getDimensionProperties(dimId); + long startTime; + startTime = System.currentTimeMillis(); + DimensionProperties props = DimensionManager.getInstance().getDimensionProperties(dimId); + + ChunkPos cpos = props.terraformingHelper.getChunkPosFromBlockPos(pos); - IBlockState[] target_blocks = props.terraformingHelper.getBlocksAt(yy.getX(), yy.getZ()); // this causes a not generated chunk to generate - if (!props.terraformingHelper.getChunkFromList(chunk.x, chunk.z).fully_generated[yy.getX() % 16][yy.getZ() % 16]) { + IBlockState[] target_blocks = props.terraformingHelper.getBlocksAt(pos.getX(), pos.getZ()); // 4-6ms + chunkdata data = props.terraformingHelper.getChunkFromList(cpos.x, cpos.z); // 4-6ms + + if (data.type == TerraformingType.PROTECTED){ + //System.out.println("working protected"); + decorate_simple(world, biomeId,old_biome, pos); + props.terraformingHelper.getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(inchunkx,inchunkz); + props.terraformingHelper.register_height_change(pos); // it does not really changetheheight but it will notify the border to update + } + else if (data.type == TerraformingType.ALLOWED) { + //System.out.println("working full"); + + if (!data.fully_generated[inchunkx][inchunkz]) { //fast replacing for (int i = 5; i < 255; i++) { - world.setBlockState(new BlockPos(yy.getX(), i, yy.getZ()), target_blocks[i]); + world.setBlockState(new BlockPos(pos.getX(), i, pos.getZ()), target_blocks[i], 2); } // check if the terrain is fully generated to target height - int current_height = world.getHeight(yy.getX(),yy.getZ()); // returns the y value above the highest block + int current_height = world.getHeight(pos.getX(), pos.getZ()); // returns the y value above the highest block int target_height = 0; for (int i = 255; i > 5; i--) { // go down until there is a non-air block, this is target height - if (target_blocks[i] != Blocks.AIR.getDefaultState()){ - target_height = i+1; + if (target_blocks[i] != Blocks.AIR.getDefaultState()) { + target_height = i + 1; break; } } // as long as terrain does not match the target height, re-add position to queue - if (current_height == target_height){ - props.terraformingHelper.getChunkFromList(chunk.x, chunk.z).set_position_fully_generated(yy.getX() % 16, yy.getZ() % 16); - }else{ - props.terraformingHelper.add_position_to_queue(yy); + if (current_height == target_height) { + props.terraformingHelper.getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(inchunkx, inchunkz); + } else { + props.terraformingHelper.add_position_to_queue(pos); + props.terraformingHelper.register_height_change(pos); } + + } + } + + else if (data.type == TerraformingType.BORDER){ + //System.out.println("working border"); + + world.getChunkFromBlockCoords(pos.add(-1,0,0)); // Ensure the chunk of the target positions are generated + world.getChunkFromBlockCoords(pos.add(1,0,0)); // Ensure the chunk of the target positions are generated + world.getChunkFromBlockCoords(pos.add(0,0,-1)); // Ensure the chunk of the target positions are generated + world.getChunkFromBlockCoords(pos.add(0,0,1)); // Ensure the chunk of the target positions are generated + + int next_heightsx0 = world.getHeight(pos.add(-1,0,0)).getY(); + int next_heightsx1 = world.getHeight(pos.add(1,0,0)).getY(); + int next_heightsz0 = world.getHeight(pos.add(0,0,-1)).getY(); + int next_heightsz1 = world.getHeight(pos.add(0,0,1)).getY(); + + int avg_height = Math.round ((float) (next_heightsz1 + next_heightsx1 + next_heightsx0 + next_heightsz0) / 4); + + int prev_height = world.getHeight(pos).getY(); + if (avg_height == prev_height){ // nothing to do + return; } + //fast replacing + for (int i = 5; i < 256; i++) { + IBlockState target= target_blocks[i]; + if (i < avg_height) + if (target == Blocks.AIR.getDefaultState()) + target = biomeId.topBlock; + if (i == avg_height) + target = biomeId.topBlock; + if (i > avg_height) + target = Blocks.AIR.getDefaultState(); + world.setBlockState(new BlockPos(pos.getX(), i, pos.getZ()), target, 2); + } - if (props.terraformingHelper.can_populate(chunk.x, chunk.z)) { + int new_height = world.getHeight(pos).getY(); - // we do some hacky tricks here to ensure that trees can fully generate - // we shift the actual tree generation by 8 blocks so that it overlaps with the chunks next to it - // can_populate() ensures that the chunks next to it are ready for decoration + if (prev_height != new_height){ + props.terraformingHelper.register_height_change(pos); + props.terraformingHelper.add_position_to_queue(pos); + }else{ + props.terraformingHelper.check_next_border_chunk_fully_generated(cpos.x,cpos.z); // maybe this was the last border block in queue? if yes, its terrain is done! + } + } + //System.out.println("d1: " +(System.currentTimeMillis() - startTime)); + startTime = System.currentTimeMillis(); - if (!props.terraformingHelper.getChunkFromList(chunk.x,chunk.z).fully_decorated[yy.getX()%16][yy.getZ()%16]) { + int can_populate = props.terraformingHelper.can_populate(cpos.x, cpos.z); + if (can_populate == -1){ + //because it can never be populated, it is considered "done with population" + props.terraformingHelper.getChunkFromList(cpos.x, cpos.z).set_position_decorated(inchunkx, inchunkz); + } + if (can_populate == 1) { - int treegen = biomeId.decorator.treesPerChunk; - if (world.rand.nextInt(16 * 16) < treegen) - biomeId.getRandomTreeFeature(world.rand).generate(world, world.rand, world.getHeight(yy.add(8, 0, 8))); + // we do some hacky tricks here to ensure that trees can fully generate + // we shift the actual tree generation by 8 blocks so that it overlaps with the chunks next to it + // can_populate() ensures that the chunks next to it are ready for decoration - props.terraformingHelper.getChunkFromList(chunk.x, chunk.z).set_position_decorated(yy.getX() % 16, yy.getZ() % 16); - } + if (!props.terraformingHelper.getChunkFromList(cpos.x,cpos.z).fully_decorated[inchunkx][inchunkz]) { + //System.out.println("decorate block"); + int treegen = biomeId.decorator.treesPerChunk; + if (world.rand.nextInt(16 * 16) < treegen) + biomeId.getRandomTreeFeature(world.rand).generate(world, world.rand, world.getHeight(pos.add(8, 0, 8))); + + props.terraformingHelper.getChunkFromList(cpos.x, cpos.z).set_position_decorated(inchunkx, inchunkz); } + } + } + + public static void terraform(World world, Biome biomeId, BlockPos pos, boolean was_biome_remote, int dimId) { + Chunk chunk = world.getChunkFromBlockCoords(pos); + if (biomeId == null)return; + Biome old_biome = world.getBiome(pos); + changeBiome(world,biomeId, old_biome, pos); + + //for biome remote use, only change top block and do simple decoration + if(was_biome_remote) { + decorate_simple(world, biomeId, old_biome, pos); + } + + if (!was_biome_remote) { // heavy terraforming here... + do_heavy_terraforming(world, biomeId,old_biome,pos,dimId); } diff --git a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java index d3007b724..8172a35a6 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java +++ b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java @@ -10,13 +10,13 @@ import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkPrimer; import net.minecraftforge.common.BiomeManager; +import org.lwjgl.Sys; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.dimension.DimensionProperties; import zmaster587.advancedRocketry.world.ChunkManagerPlanet; import zmaster587.advancedRocketry.world.ChunkProviderPlanet; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import static org.apache.commons.lang3.RandomUtils.nextInt; @@ -31,7 +31,9 @@ public class TerraformingHelper { public World world; public ChunkProviderPlanet generator; private DimensionProperties props; - public List chunkdataList; + + private Map chunkDataMap = new HashMap<>(); + // A block is placed in queue if (OR) // - Initial block placements - both only set blocks if the terrain at the BlockPos is not fully generated in the "real" world @@ -58,35 +60,106 @@ public TerraformingHelper(int dimension, List biomes, L this.world = net.minecraftforge.common.DimensionManager.getWorld(dimId); this.chunkMgrTerraformed = new ChunkManagerPlanet(world, world.getWorldInfo().getGeneratorOptions(), biomeList); this.terraformingqueue = new LinkedList<>(); - chunkdataList = new LinkedList<>(); + chunkDataMap = new HashMap<>(); generator = new ChunkProviderPlanet(world, world.getSeed(), world.getWorldInfo().isMapFeaturesEnabled(), world.getWorldInfo().getGeneratorOptions()); for (ChunkPos i:generated_chunks){ chunkdata data = new chunkdata(i.x,i.z,null, world, this); data.chunk_fully_generated = true; - chunkdataList.add(data); + chunkDataMap.put(new ChunkPos(data.x,data.z), data); } recalculate_chunk_status(); } - public boolean can_populate(int x, int z){ + //0 = no + //1 = yes + // -1 = never (if it includes a type.PROTECTED chunk + public int can_populate(int x, int z){ chunkdata currentchunk = getChunkFromList(x,z); chunkdata currentchunkx1 = getChunkFromList(x+1,z); chunkdata currentchunkz1 = getChunkFromList(x,z+1); chunkdata currentchunkx1z1 = getChunkFromList(x+1,z+1); if (currentchunk != null && currentchunkz1 != null && currentchunkx1 != null && currentchunkx1z1 != null){ + + if (currentchunk.type == TerraformingType.PROTECTED || currentchunkz1.type == TerraformingType.PROTECTED ||currentchunkx1.type == TerraformingType.PROTECTED ||currentchunkx1z1.type == TerraformingType.PROTECTED) + return -1; // chunks contain a protected chunk + if (currentchunkz1.terrain_fully_generated && currentchunkx1.terrain_fully_generated && currentchunkx1z1.terrain_fully_generated && currentchunk.terrain_fully_generated) - return true; + return 1; + } + return 0; + } + + /* + used to add BORDER type block positions to queue for updating again + */ + public void register_height_change_actual(BlockPos pos){ + ChunkPos cpos = getChunkPosFromBlockPos(pos); + chunkdata data= getChunkFromList(cpos.x,cpos.z); + if (data !=null && data.type == TerraformingType.BORDER) + add_position_to_queue(pos); + } + public void register_height_change(BlockPos pos){ + register_height_change_actual(pos.add(1,0,0)); + register_height_change_actual(pos.add(-1,0,0)); + register_height_change_actual(pos.add(0,0,1)); + register_height_change_actual(pos.add(0,0,-1)); + } + + + /* + When a chunk is fully terrain-generated it will call this method to update border chunks next to it. + A Border chunk is considered fully generated when every type.ALLOWED chunks next to it are fully generated. + This is because a fully terrain generated chunk will no longer change its heightmap so it will not modify the heightmap of the border chunk next to it + */ + public void check_next_border_chunk_fully_generated(int px, int pz) { + + //System.out.println("border check called"); + + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + chunkdata data = getChunkFromList(px + x, pz + z); + if (data != null && !data.terrain_fully_generated && data.type == TerraformingType.BORDER) { + + int chunkposxlow = data.x*16; + int chunkposzlow = data.z*16; + int chunkposxhigh = chunkposxlow+16; + int chunkposzhigh = chunkposzlow+16; + for (BlockPos p : this.terraformingqueue){ + if (p.getX() >= chunkposxlow && p.getX() < chunkposxhigh){ + if (p.getZ() >= chunkposzlow && p.getZ() < chunkposzhigh){ + return; + }} + } + + for (int x2 = -1; x2 <= 1; x2++) { + for (int z2 = -1; z2 <= 1; z2++) { + chunkdata data2 = getChunkFromList(px + x + x2, pz + z + z2); + if (data2 == null) return; + if (data2.type == TerraformingType.ALLOWED) { + if (!data2.terrain_fully_generated) { + return; + } + } + } + } + + data.terrain_fully_generated = true; + data.blockStates = null; // no longer needed, gc should collect them now - actually, these are never needed but who cares... + check_next_border_chunk_fully_generated(data.x,data.z); // update border chunks next to this one to check if they can decorate + check_can_decorate(data.x,data.z); + + } + } } - return false; } public void check_can_decorate(int px, int pz){ // for every chunk next to this one, check if it can decorate (except for if it is already decorated) for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) { if (getChunkFromList(px+x,pz+z) != null && !getChunkFromList(px+x,pz+z).chunk_fully_generated){ - if (can_populate(px+x,pz+z)){ + if (can_populate(px+x,pz+z) != 0){ //re-add all position to queue for decoration for (int bx = 0; bx < 16; bx++) { for (int bz = 0; bz < 16; bz++) { @@ -99,53 +172,66 @@ public void check_can_decorate(int px, int pz){ } } + public ChunkPos getChunkPosFromBlockPos(BlockPos pos) { + return new ChunkPos(pos.getX() >> 4, pos.getZ() >> 4); + } + + + + public TerraformingType get_chunk_type(int x, int z) { + + TerraformingType type = TerraformingType.ALLOWED; + for (BlockPos i : props.terraformingProtectedBlocks) { + //System.out.println("found protecting block at "+i.getX()+":"+i.getY()+":"+i.getZ()); + ChunkPos cpos = getChunkPosFromBlockPos(i); + int dx = cpos.x - x; + int dz = cpos.z - z; + if (Math.abs(dx) <= safe_zone_radius && Math.abs(dz) <= safe_zone_radius) + return TerraformingType.PROTECTED; + else if (Math.abs(dx) <= safe_zone_radius + border_zone && Math.abs(dz) <= safe_zone_radius + border_zone) { + type = TerraformingType.BORDER; + } + } + return type; + } public void recalculate_chunk_status() { + Iterator> iterator = chunkDataMap.entrySet().iterator(); - for (int j = 0; j < chunkdataList.size(); j++) { - chunkdataList.get(j).type = TerraformingType.ALLOWED; - } + while (iterator.hasNext()) { - for (BlockPos i : props.terraformingProtectedBlocks) { - Chunk chunk = world.getChunkFromBlockCoords(i); - for (int x = -safe_zone_radius; x <= safe_zone_radius; x++) { - for (int z = -safe_zone_radius; z <= safe_zone_radius; z++) { - - if (getChunkFromList(chunk.x + x, chunk.z + z) != null) { - getChunkFromList(chunk.x + x, chunk.z + z).type = TerraformingType.PROTECTED; - - for (int x2 = -border_zone; x2 <= border_zone; x2++) { - for (int z2 = -border_zone; z2 <= border_zone; z2++) { - if (getChunkFromList(chunk.x + x+x2, chunk.z + z+z2) != null) { - if (getChunkFromList(chunk.x + x+x2, chunk.z + z+z2).type == TerraformingType.ALLOWED) { - getChunkFromList(chunk.x + x + x2, chunk.z + z + z2).type = TerraformingType.BORDER; - } - } - } - } + Map.Entry entry = iterator.next(); + + chunkdata data = entry.getValue(); + + TerraformingType prevtype = data.type; + + data.type = get_chunk_type(data.x, data.z); + + if (prevtype != TerraformingType.ALLOWED) + if (data.type == TerraformingType.ALLOWED || data.type == TerraformingType.BORDER) + if (data.terrain_fully_generated) + iterator.remove(); - } - } - } } } + + + + public chunkdata getChunkFromList(int x, int z){ - for (int i = 0; i < chunkdataList.size(); i++) { - if (chunkdataList.get(i).x == x && chunkdataList.get(i).z == z){ - return chunkdataList.get(i); - } - } - return null; + ChunkPos key = new ChunkPos(x,z); + return chunkDataMap.get(key); } public void setPositionReady(int x, int z){ - Chunk chunk = world.getChunkFromBlockCoords(new BlockPos(x,0,z)); - getChunkFromList(chunk.x, chunk.z).set_position_fully_generated(x%16, z%16); + ChunkPos cpos = getChunkPosFromBlockPos(new BlockPos(x,0,z)); + getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(x%16, z%16); } public void add_position_to_queue(BlockPos p){ - terraformingqueue.add(p); + terraformingqueue.add(p); } public BlockPos get_next_position(boolean random){ @@ -158,10 +244,11 @@ public BlockPos get_next_position(boolean random){ } public IBlockState[] getBlocksAt(int x, int z){ - Chunk chunk = world.getChunkFromBlockCoords(new BlockPos(x,0,z)); - chunkdata data = getChunkFromList(chunk.x,chunk.z); + ChunkPos cpos = getChunkPosFromBlockPos(new BlockPos(x,0,z)); + chunkdata data = getChunkFromList(cpos.x,cpos.z); if (data == null){ - ChunkPrimer primer = generator.getChunkPrimer(chunk.x, chunk.z, chunkMgrTerraformed); + //System.out.println("generate new chunk: "+chunk.x+":"+chunk.z); + ChunkPrimer primer = generator.getChunkPrimer(cpos.x, cpos.z, chunkMgrTerraformed); IBlockState[][][] blockStates = new IBlockState[16][16][256]; for (int px = 0; px < 16; px++) { @@ -172,12 +259,13 @@ public IBlockState[] getBlocksAt(int x, int z){ } } - data = new chunkdata(chunk.x,chunk.z, blockStates, world, this); - chunkdataList.add(data); - recalculate_chunk_status(); + data = new chunkdata(cpos.x,cpos.z, blockStates, world, this); + chunkDataMap.put(new ChunkPos(data.x,data.z),data); + data.type = get_chunk_type(data.x,data.z); + } - int chunkx = x%16; - int chunkz = z%16; + int chunkx = ((x % 16) + 16) % 16; + int chunkz = ((z % 16) + 16) % 16; if (data.blockStates == null) return null; diff --git a/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java b/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java index ef097be41..b7405de47 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java +++ b/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java @@ -2,6 +2,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.world.World; +import org.lwjgl.Sys; public class chunkdata { public int x; @@ -60,9 +61,12 @@ public void set_position_fully_generated(int x, int z){ } } if (all_generated){ + //System.out.println("chunk fully generated: "+this.x+":"+this.z); terrain_fully_generated = true; this.blockStates = null; // no longer needed, gc should collect them now + helper.check_next_border_chunk_fully_generated(x,z); // update border chunks next to this one to check if they can decorate helper.check_can_decorate(x,z); + } } @@ -79,7 +83,11 @@ public void set_position_decorated(int x, int z){ } if (all_decorated){ // populate uses the biome at blockpos 0,0, in the chunk x+1,z+1, that's why we need the chunks next to it generated - world.provider.createChunkGenerator().populate(this.x, this.z); + if (!chunk_fully_generated) + if (helper.can_populate(this.x, this.z) == 1){ + world.provider.createChunkGenerator().populate(this.x, this.z); + System.out.println("populate chunk "+this.x+":"+this.z); + } helper.setChunkFullyGenerated(this.x,this.z); } From db8bff89ad00745d6900a9cc44b3f4b6324e2c6b Mon Sep 17 00:00:00 2001 From: MrToffel Date: Sun, 7 Jul 2024 04:49:39 +0200 Subject: [PATCH 08/42] fixed some real shitty bugs --- .../api/dimension/IDimensionProperties.java | 2 +- .../dimension/DimensionManager.java | 6 +- .../dimension/DimensionProperties.java | 199 ++++++++++-------- .../Afuckinginterface.java | 26 +++ .../clientlists.java | 50 +++++ .../dimensionTerraformingInfo.java | 14 ++ .../serverlists.java | 51 +++++ .../network/PacketBiomeIDChange.java | 5 +- .../network/PacketDimInfo.java | 2 +- .../network/PacketStationUpdate.java | 2 +- .../stations/SpaceObjectBase.java | 2 +- .../stations/SpaceStationObject.java | 2 +- .../satellite/TileTerraformingTerminal.java | 11 +- .../advancedRocketry/util/BiomeHandler.java | 107 +++++----- .../util/TerraformingHelper.java | 81 ++++--- .../advancedRocketry/util/chunkdata.java | 2 +- 16 files changed, 378 insertions(+), 184 deletions(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java create mode 100644 src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java create mode 100644 src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/dimensionTerraformingInfo.java create mode 100644 src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java diff --git a/src/main/java/zmaster587/advancedRocketry/api/dimension/IDimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/api/dimension/IDimensionProperties.java index 8118bbbd4..2259cda41 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/dimension/IDimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/api/dimension/IDimensionProperties.java @@ -150,7 +150,7 @@ public interface IDimensionProperties { */ SatelliteBase removeSatellite(long id); - void writeToNBT(NBTTagCompound nbt); + void writeToNBT(NBTTagCompound nbt, boolean write_terraforming_biomes); void readFromNBT(NBTTagCompound nbt); diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java index 87493d7da..3d9c7d610 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java @@ -600,7 +600,7 @@ public void saveDimensions(String filePath) throws Exception { for (Entry dimSet : dimensionList.entrySet()) { NBTTagCompound dimNbt = new NBTTagCompound(); - dimSet.getValue().writeToNBT(dimNbt); + dimSet.getValue().writeToNBT(dimNbt, true); dimListnbt.setTag(dimSet.getKey().toString(), dimNbt); } @@ -974,9 +974,7 @@ public void createAndLoadDimensions(boolean resetFromXml) { if (loadedPlanets.containsKey(properties.getId())) { DimensionProperties loadedDim = (DimensionProperties) loadedPlanets.get(properties.getId()); if (loadedDim != null) { - properties.copySatellites(loadedDim); - properties.terraformingProtectedBlocks = loadedDim.terraformingProtectedBlocks; - properties.terraformingChunksDone = loadedDim.terraformingChunksDone; + properties.copyData(loadedDim); } } if (properties.isNativeDimension) diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index 6e6783044..a9c084f75 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -25,6 +25,9 @@ import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fml.common.FMLCommonHandler; +import net.minecraftforge.fml.common.SidedProxy; +import net.minecraftforge.fml.relauncher.Side; import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.Sys; import zmaster587.advancedRocketry.AdvancedRocketry; @@ -34,6 +37,9 @@ import zmaster587.advancedRocketry.api.dimension.solar.StellarBody; import zmaster587.advancedRocketry.api.satellite.SatelliteBase; import zmaster587.advancedRocketry.atmosphere.AtmosphereType; +import zmaster587.advancedRocketry.common.CommonProxy; +import zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage.Afuckinginterface; +import zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage.serverlists; import zmaster587.advancedRocketry.inventory.TextureResources; import zmaster587.advancedRocketry.item.ItemBiomeChanger; import zmaster587.advancedRocketry.item.ItemSatelliteIdentificationChip; @@ -151,16 +157,21 @@ public class DimensionProperties implements Cloneable, IDimensionProperties { private int generatorType; //public int target_sea_level; - public TerraformingHelper terraformingHelper; - public List terraformingProtectedBlocks; - public List terraformingChunksDone; + + + + @SidedProxy(serverSide = "zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage.serverlists", clientSide = "zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage.clientlists") + public static Afuckinginterface proxylists; + + + public List terraformingChunksAlreadyAdded; //class - public List water_source_locked_positions; + //public boolean water_can_exist; public DimensionProperties(int id) { name = "Temp"; @@ -215,8 +226,10 @@ public DimensionProperties(int id) { water_source_locked_positions = new ArrayList<>(); - terraformingProtectedBlocks = new LinkedList<>(); - terraformingChunksDone = new LinkedList<>(); + +if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { + proxylists.setListforDIM(getId(),new LinkedList<>(), new LinkedList<>()); +} terraformingChunksAlreadyAdded = new LinkedList<>(); ringAngle = 70; @@ -227,28 +240,32 @@ public DimensionProperties(int id) { } public void load_terraforming_helper(boolean reset) { - getAverageTemp(); - getViableBiomes(false); - if (reset){ - terraformingChunksDone.clear(); - terraformingChunksAlreadyAdded.clear(); - } + if (!net.minecraftforge.common.DimensionManager.getWorld(getId()).isRemote) { - System.out.println("load helper with protecting blocks: "+terraformingProtectedBlocks.size()); + getAverageTemp(); + getViableBiomes(false); + if (reset) { + proxylists.getChunksFullyTerraformed(getId()).clear(); + terraformingChunksAlreadyAdded.clear(); + } - terraformingHelper = new TerraformingHelper(getId(), getBiomesEntries(getViableBiomes(false)), terraformingChunksDone); + System.out.println("load helper with protecting blocks: " + proxylists.getProtectingBlocksForDimension(getId()).size() + " (" + reset + ")"); - Collection list = (net.minecraftforge.common.DimensionManager.getWorld(getId())).getChunkProvider().getLoadedChunks(); - if (!list.isEmpty()) { - for (Chunk chunk:list){ - add_chunk_to_terraforming_list(chunk); + proxylists.sethelper(getId(), new TerraformingHelper(getId(), getBiomesEntries(getViableBiomes(false)), proxylists.getChunksFullyTerraformed(getId()))); + + Collection list = (net.minecraftforge.common.DimensionManager.getWorld(getId())).getChunkProvider().getLoadedChunks(); + if (!list.isEmpty()) { + for (Chunk chunk : list) { + add_chunk_to_terraforming_list(chunk); + } } } } + public void registerProtectingBlock(BlockPos p) { boolean already_registered = false; - for (BlockPos i : terraformingProtectedBlocks) { + for (BlockPos i : proxylists.getProtectingBlocksForDimension(getId())) { if (i.equals(p)) { already_registered = true; break; @@ -256,26 +273,26 @@ public void registerProtectingBlock(BlockPos p) { } System.out.println("register protecting block called"); if (!already_registered) { - terraformingProtectedBlocks.add(p); + proxylists.getProtectingBlocksForDimension(getId()).add(p); System.out.println("block registered"); - if (terraformingHelper != null){ - terraformingHelper.recalculate_chunk_status(); + if (proxylists.gethelper(getId()) != null) { + proxylists.gethelper(getId()).recalculate_chunk_status(); } } } public void unregisterProtectingBlock(BlockPos p) { - for (BlockPos i : terraformingProtectedBlocks) { + for (BlockPos i : proxylists.getProtectingBlocksForDimension(getId())) { if (i.equals(p)) { - terraformingProtectedBlocks.remove(i); - if (terraformingHelper != null) - terraformingHelper.recalculate_chunk_status(); + proxylists.getProtectingBlocksForDimension(getId()).remove(i); + if (proxylists.gethelper(getId()) != null) + proxylists.gethelper(getId()).recalculate_chunk_status(); break; } } } - public void add_block_to_terraforming_queue(BlockPos p){ + public void add_block_to_terraforming_queue(BlockPos p) { //boolean is_there = false; //for (BlockPos i : terraformingHelper.terraformingqueue) { // if (i.equals(p)) { @@ -283,17 +300,18 @@ public void add_block_to_terraforming_queue(BlockPos p){ // } //} //if (!is_there) - terraformingHelper.add_position_to_queue(p); + proxylists.gethelper(getId()).add_position_to_queue(p); } + public void add_chunk_to_terraforming_list(Chunk chunk) { - if (terraformingHelper != null) { - chunkdata current_chunk = terraformingHelper.getChunkFromList(chunk.x, chunk.z); + if (proxylists.gethelper(getId()) != null) { + chunkdata current_chunk = proxylists.gethelper(getId()).getChunkFromList(chunk.x, chunk.z); if (current_chunk == null || !current_chunk.chunk_fully_generated) { boolean chunk_was_already_added = false; // do not add a chunk twice, the helper will manage it once it is added - for (ChunkPos i :terraformingChunksAlreadyAdded){ - if (chunk.x == i.x && chunk.z == i.z){ + for (ChunkPos i : terraformingChunksAlreadyAdded) { + if (chunk.x == i.x && chunk.z == i.z) { chunk_was_already_added = true; break; } @@ -317,6 +335,7 @@ public DimensionProperties(int id, String name) { this(id); this.name = name; } + public DimensionProperties(int id, boolean shouldRegister) { this(id); isStation = !shouldRegister; @@ -345,11 +364,12 @@ public static DimensionProperties createFromNBT(int id, NBTTagCompound nbt) { return properties; } - public void copySatellites(DimensionProperties props) { + public void copyData(DimensionProperties props) { this.satellites = props.satellites; this.tickingSatellites = props.tickingSatellites; } + @Override public Object clone() { try { @@ -684,7 +704,7 @@ public void setParentOrbitalDistance(int distance) { * @return if a planet, the same as getParentOrbitalDistance(), if a moon, the moon's distance from the host star */ public int getSolarOrbitalDistance() { - if (this.isStar()){ + if (this.isStar()) { return 1; } if (parentPlanet != Constants.INVALID_PLANET) @@ -744,9 +764,6 @@ public boolean isMoon() { return parentPlanet != Constants.INVALID_PLANET && parentPlanet != SpaceObjectManager.WARPDIMID; } - /** - * @return true if currently terraformed - */ public int getAtmosphereDensity() { return atmosphereDensity; @@ -762,7 +779,6 @@ public void setAtmosphereDensity(int atmosphereDensity) { load_terraforming_helper(true); - PacketHandler.sendToAll(new PacketDimInfo(getId(), this)); } @@ -1034,14 +1050,15 @@ public void tick() { BlockPos p = i.pos.getBlockPos(); iterator_2.remove(); // Safe removal during iteration World world = (net.minecraftforge.common.DimensionManager.getWorld(getId())); - world.notifyNeighborsOfStateChange(p,world.getBlockState(p).getBlock(),false); + world.notifyNeighborsOfStateChange(p, world.getBlockState(p).getBlock(), false); } } } - public void add_water_locked_pos(HashedBlockPosition pos){ - for (watersourcelocked i : water_source_locked_positions){ - if (i.pos.equals(pos)){ + + public void add_water_locked_pos(HashedBlockPosition pos) { + for (watersourcelocked i : water_source_locked_positions) { + if (i.pos.equals(pos)) { i.reset_timer(); return; } @@ -1094,7 +1111,7 @@ public void setBiomes(List biomes) { */ public boolean isBiomeblackListed(Biome biome, boolean is_NOT_terraforming) { - if (!is_NOT_terraforming){ + if (!is_NOT_terraforming) { String modId = biome.getRegistryName().getResourceDomain(); if (!modId.equals("minecraft") && !modId.equals("advancedrocketry")) { @@ -1153,7 +1170,7 @@ public List getViableBiomes(boolean not_terraforming) { } } //if (not_terraforming) - //viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); + //viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); } else if (Temps.getTempFromValue(averageTemperature).hotterOrEquals(Temps.COLD)) { for (Biome biome : Biome.REGISTRY) { if (biome != null && !BiomeDictionary.getTypes(biome).contains(BiomeDictionary.Type.HOT) && !isBiomeblackListed(biome, not_terraforming)) { @@ -1161,7 +1178,7 @@ public List getViableBiomes(boolean not_terraforming) { } } //if (not_terraforming) - //viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); + //viableBiomes.addAll(BiomeDictionary.getBiomes(BiomeDictionary.Type.OCEAN)); } else if (Temps.getTempFromValue(averageTemperature).hotterOrEquals(Temps.FRIGID)) { for (Biome biome : Biome.REGISTRY) { @@ -1412,6 +1429,7 @@ private void readFromTechnicalNBT(NBTTagCompound nbt) { } public void readFromNBT(NBTTagCompound nbt) { + NBTTagList list; if (nbt.hasKey("skyColor")) { @@ -1609,34 +1627,35 @@ public void readFromNBT(NBTTagCompound nbt) { //terraforming data - if (nbt.hasKey("fullyGeneratedChunks")) { - terraformingChunksDone.clear(); - list = nbt.getTagList("fullyGeneratedChunks", NBT.TAG_COMPOUND); - for (NBTBase entry : list) { - assert entry instanceof NBTTagCompound; - int x = ((NBTTagCompound) entry).getInteger("x"); - int z = ((NBTTagCompound) entry).getInteger("z"); - terraformingChunksDone.add(new ChunkPos(x, z)); + // I have no idea how this can be called on client but it seems to just do it so idk + if (nbt.hasKey("fullyGeneratedChunks")) { + + list = nbt.getTagList("fullyGeneratedChunks", NBT.TAG_COMPOUND); + if (!list.hasNoTags()) + proxylists.setChunksFullyTerraformed(getId(), new LinkedList<>()); + for (NBTBase entry : list) { + assert entry instanceof NBTTagCompound; + int x = ((NBTTagCompound) entry).getInteger("x"); + int z = ((NBTTagCompound) entry).getInteger("z"); + System.out.println("Chunk fully terraformed: " + x + ":" + z); + proxylists.getChunksFullyTerraformed(getId()).add(new ChunkPos(x, z)); + } } - } - if (nbt.hasKey("terraformingProtectedBlocks")) { - terraformingProtectedBlocks.clear(); - list = nbt.getTagList("terraformingProtectedBlocks", NBT.TAG_COMPOUND); - for (NBTBase entry : list) { - assert entry instanceof NBTTagCompound; - int x = ((NBTTagCompound) entry).getInteger("x"); - int z = ((NBTTagCompound) entry).getInteger("z"); - int y = ((NBTTagCompound) entry).getInteger("y"); - terraformingProtectedBlocks.add(new BlockPos(x, y, z)); - System.out.println("read protecting block at "+x+":"+y+":"+z+" - - "+terraformingProtectedBlocks.size()); - } - if (terraformingHelper != null) { - terraformingHelper.recalculate_chunk_status(); - System.out.println("calling recalculate_chunk_status after readfrom nbt"); + if (nbt.hasKey("terraformingProtectedBlocks")) { + + list = nbt.getTagList("terraformingProtectedBlocks", NBT.TAG_COMPOUND); + if (!list.hasNoTags()) + proxylists.setProtectingBlocksForDimension(getId(), new LinkedList<>()); + for (NBTBase entry : list) { + assert entry instanceof NBTTagCompound; + int x = ((NBTTagCompound) entry).getInteger("x"); + int z = ((NBTTagCompound) entry).getInteger("z"); + int y = ((NBTTagCompound) entry).getInteger("y"); + proxylists.getProtectingBlocksForDimension(getId()).add(new BlockPos(x, y, z)); + System.out.println("read protecting block at " + x + ":" + y + ":" + z + " - - " + proxylists.getProtectingBlocksForDimension(getId()).size()); + } } - } - readFromTechnicalNBT(nbt); } @@ -1667,8 +1686,10 @@ private void writeTechnicalNBT(NBTTagCompound nbt) { } + //public void writeToNBT(NBTTagCompound nbt) { - public void writeToNBT(NBTTagCompound nbt) { + //} + public void writeToNBT(NBTTagCompound nbt, boolean write_terraforming_info) { // filter out info in client packet because it is too big NBTTagList list; if (skyColor != null) { @@ -1832,25 +1853,26 @@ public void writeToNBT(NBTTagCompound nbt) { // write terraforming data + if (write_terraforming_info) { + list = new NBTTagList(); + for (ChunkPos pos : proxylists.getChunksFullyTerraformed(getId())) { + NBTTagCompound entry = new NBTTagCompound(); + entry.setInteger("x", pos.x); + entry.setInteger("z", pos.z); + list.appendTag(entry); + } + nbt.setTag("fullyGeneratedChunks", list); - list = new NBTTagList(); - for (ChunkPos pos: terraformingChunksDone) { - NBTTagCompound entry = new NBTTagCompound(); - entry.setInteger("x", pos.x); - entry.setInteger("z", pos.z); - list.appendTag(entry); - } - nbt.setTag("fullyGeneratedChunks", list); - - list = new NBTTagList(); - for (BlockPos pos: terraformingProtectedBlocks) { - NBTTagCompound entry = new NBTTagCompound(); - entry.setInteger("x", pos.getX()); - entry.setInteger("y", pos.getY()); - entry.setInteger("z", pos.getZ()); - list.appendTag(entry); + list = new NBTTagList(); + for (BlockPos pos : proxylists.getProtectingBlocksForDimension(getId())) { + NBTTagCompound entry = new NBTTagCompound(); + entry.setInteger("x", pos.getX()); + entry.setInteger("y", pos.getY()); + entry.setInteger("z", pos.getZ()); + list.appendTag(entry); + } + nbt.setTag("terraformingProtectedBlocks", list); } - nbt.setTag("terraformingProtectedBlocks", list); writeTechnicalNBT(nbt); } @@ -2125,6 +2147,7 @@ public int getTemp() { public boolean hotterThan(Temps type) { return this.compareTo(type) < 0; } + public boolean hotterOrEquals(Temps type) { return this.compareTo(type) <= 0; } diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java new file mode 100644 index 000000000..5f91ffa05 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java @@ -0,0 +1,26 @@ +package zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage; + + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import zmaster587.advancedRocketry.util.TerraformingHelper; + +import java.util.List; + +public interface Afuckinginterface { + + public void setListforDIM(int dim, List protectingblocklist, List chunksDoneList); + + public List getProtectingBlocksForDimension(int dim); + + public void setProtectingBlocksForDimension(int dim, List blocks); + + public void setChunksFullyTerraformed(int dim, List lpos); + + public List getChunksFullyTerraformed(int dim); + + public void sethelper(int dim, TerraformingHelper helper); + + public TerraformingHelper gethelper(int dim); + +} diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java new file mode 100644 index 000000000..3577e213a --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java @@ -0,0 +1,50 @@ +package zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import zmaster587.advancedRocketry.util.TerraformingHelper; +import zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage.dimensionTerraformingInfo; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class clientlists implements Afuckinginterface { + Map terraforminginfolists; + + public clientlists(){ + this.terraforminginfolists = new HashMap<>(); + } + + public void setListforDIM(int dim, List protectingblocklist, List chunksDoneList){ + if (terraforminginfolists.get(dim) != null){ + terraforminginfolists.get(dim).terraformingChunksDone = chunksDoneList; + terraforminginfolists.get(dim).terraformingProtectedBlocks = protectingblocklist; + }else{ + dimensionTerraformingInfo info = new dimensionTerraformingInfo(); + info.terraformingChunksDone = chunksDoneList; + info.terraformingProtectedBlocks = protectingblocklist; + terraforminginfolists.put(dim,info); + } + } + public List getProtectingBlocksForDimension(int dim){ + return terraforminginfolists.get(dim).terraformingProtectedBlocks; + } + public void setProtectingBlocksForDimension(int dim, List blocks){ + terraforminginfolists.get(dim).terraformingProtectedBlocks = blocks; + } + + public void setChunksFullyTerraformed(int dim, List lpos){ + terraforminginfolists.get(dim).terraformingChunksDone = lpos; + } + public List getChunksFullyTerraformed(int dim){ + return terraforminginfolists.get(dim).terraformingChunksDone; + } + + public void sethelper(int dim, TerraformingHelper helper){ + terraforminginfolists.get(dim).terraformingHelper= helper; + } + public TerraformingHelper gethelper(int dim){ + if (terraforminginfolists.get(dim) == null)return null; + return terraforminginfolists.get(dim).terraformingHelper; + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/dimensionTerraformingInfo.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/dimensionTerraformingInfo.java new file mode 100644 index 000000000..c42d8f916 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/dimensionTerraformingInfo.java @@ -0,0 +1,14 @@ +package zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import zmaster587.advancedRocketry.util.TerraformingHelper; + +import java.util.List; + +public class dimensionTerraformingInfo{ + public dimensionTerraformingInfo(){} + public List terraformingProtectedBlocks; + public List terraformingChunksDone; + public TerraformingHelper terraformingHelper; +} diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java new file mode 100644 index 000000000..76f1fcc91 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java @@ -0,0 +1,51 @@ +package zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import zmaster587.advancedRocketry.util.TerraformingHelper; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class serverlists implements Afuckinginterface { + Map terraforminginfolists; + + public serverlists(){ + this.terraforminginfolists = new HashMap<>(); + } + + public void setListforDIM(int dim, List protectingblocklist, List chunksDoneList){ + if (terraforminginfolists.get(dim) != null){ + terraforminginfolists.get(dim).terraformingChunksDone = chunksDoneList; + terraforminginfolists.get(dim).terraformingProtectedBlocks = protectingblocklist; + }else{ + dimensionTerraformingInfo info = new dimensionTerraformingInfo(); + info.terraformingChunksDone = chunksDoneList; + info.terraformingProtectedBlocks = protectingblocklist; + terraforminginfolists.put(dim,info); + } + } + public List getProtectingBlocksForDimension(int dim){ + return terraforminginfolists.get(dim).terraformingProtectedBlocks; + } + public void setProtectingBlocksForDimension(int dim, List blocks){ + terraforminginfolists.get(dim).terraformingProtectedBlocks = blocks; + } + + public void setChunksFullyTerraformed(int dim, List lpos){ + terraforminginfolists.get(dim).terraformingChunksDone = lpos; + } + public List getChunksFullyTerraformed(int dim){ + return terraforminginfolists.get(dim).terraformingChunksDone; + } + + public void sethelper(int dim, TerraformingHelper helper){ + terraforminginfolists.get(dim).terraformingHelper= helper; + } + public TerraformingHelper gethelper(int dim){ + if (terraforminginfolists.get(dim) == null)return null; + return terraforminginfolists.get(dim).terraformingHelper; + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/network/PacketBiomeIDChange.java b/src/main/java/zmaster587/advancedRocketry/network/PacketBiomeIDChange.java index 2edd83d15..fad66204f 100644 --- a/src/main/java/zmaster587/advancedRocketry/network/PacketBiomeIDChange.java +++ b/src/main/java/zmaster587/advancedRocketry/network/PacketBiomeIDChange.java @@ -66,10 +66,9 @@ public void executeClient(EntityPlayer thePlayer) { chunk.setBiomeArray(array); BlockPos pos2 = pos.getBlockPos();// new BlockPos(chunk.xPosition << 4, 48, chunk.zPosition << 4); thePlayer.world.markBlockRangeForRenderUpdate(pos2, pos2.add(1, 64, 1)); - - if (Minecraft.getMinecraft().gameSettings.particleSetting < 2) - AdvancedRocketry.proxy.spawnParticle("smallLazer", thePlayer.world, pos.x, pos.y, pos.z, 0, 0, 0); } + if (Minecraft.getMinecraft().gameSettings.particleSetting < 2) + AdvancedRocketry.proxy.spawnParticle("smallLazer", thePlayer.world, pos.x, pos.y, pos.z, 0, 0, 0); } } diff --git a/src/main/java/zmaster587/advancedRocketry/network/PacketDimInfo.java b/src/main/java/zmaster587/advancedRocketry/network/PacketDimInfo.java index a52a8fdb1..1939ba62e 100644 --- a/src/main/java/zmaster587/advancedRocketry/network/PacketDimInfo.java +++ b/src/main/java/zmaster587/advancedRocketry/network/PacketDimInfo.java @@ -47,7 +47,7 @@ public void write(ByteBuf out) { //Try to send the nbt data of the dimension to the client, if it fails(probably due to non existent Biome ids) then remove the dimension PacketBuffer packetBuffer = new PacketBuffer(out); try { - dimProperties.writeToNBT(nbt); + dimProperties.writeToNBT(nbt, false); out.writeBoolean(false); packetBuffer.writeCompoundTag(nbt); diff --git a/src/main/java/zmaster587/advancedRocketry/network/PacketStationUpdate.java b/src/main/java/zmaster587/advancedRocketry/network/PacketStationUpdate.java index 21eb199fd..9d3440776 100644 --- a/src/main/java/zmaster587/advancedRocketry/network/PacketStationUpdate.java +++ b/src/main/java/zmaster587/advancedRocketry/network/PacketStationUpdate.java @@ -67,7 +67,7 @@ public void write(ByteBuf out) { case DIM_PROPERTY_UPDATE: NBTTagCompound nbt = new NBTTagCompound(); try { - spaceObject.getProperties().writeToNBT(nbt); + spaceObject.getProperties().writeToNBT(nbt, false); PacketBuffer packetBuffer = new PacketBuffer(out); packetBuffer.writeCompoundTag(nbt); } catch (NullPointerException e) { diff --git a/src/main/java/zmaster587/advancedRocketry/stations/SpaceObjectBase.java b/src/main/java/zmaster587/advancedRocketry/stations/SpaceObjectBase.java index b20962060..619908d13 100644 --- a/src/main/java/zmaster587/advancedRocketry/stations/SpaceObjectBase.java +++ b/src/main/java/zmaster587/advancedRocketry/stations/SpaceObjectBase.java @@ -250,7 +250,7 @@ public void onModuleUnpack(IStorageChunk chunk) { @Override public void writeToNbt(NBTTagCompound nbt) { - properties.writeToNBT(nbt); + properties.writeToNBT(nbt, false); nbt.setInteger("id", getId()); nbt.setInteger("posX", posX); nbt.setInteger("posY", posY); diff --git a/src/main/java/zmaster587/advancedRocketry/stations/SpaceStationObject.java b/src/main/java/zmaster587/advancedRocketry/stations/SpaceStationObject.java index a2a10bd3b..c36846f51 100644 --- a/src/main/java/zmaster587/advancedRocketry/stations/SpaceStationObject.java +++ b/src/main/java/zmaster587/advancedRocketry/stations/SpaceStationObject.java @@ -671,7 +671,7 @@ public void onModuleUnpack(IStorageChunk chunk) { @Override public void writeToNbt(NBTTagCompound nbt) { - properties.writeToNBT(nbt); + properties.writeToNBT(nbt, false); nbt.setInteger("id", getId()); nbt.setInteger("launchposX", launchPosX); nbt.setInteger("launchposY", launchPosZ); diff --git a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java index 91053690d..fc53d95df 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java @@ -141,7 +141,7 @@ public void setInventorySlotContents(int slot, @Nonnull ItemStack stack) { public void update() { super.update(); boolean has_redstone = world.isBlockIndirectlyGettingPowered(getPos()) != 0; - int powerrequired = 12; + int powerrequired = 1; if (!world.isRemote) { if (world.getTotalWorldTime() % 20 == 0) @@ -176,18 +176,18 @@ public void update() { SatelliteBiomeChanger sat = (SatelliteBiomeChanger) ItemSatelliteIdentificationChip.getSatellite(getStackInSlot(0)); IUniversalEnergy battery = sat.getBattery(); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 1000; i++) { //TODO: Better imp if (battery.getUniversalEnergyStored() > powerrequired) { try { - TerraformingHelper t = DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).terraformingHelper; + TerraformingHelper t = DimensionProperties.proxylists.gethelper(world.provider.getDimension()); if (t == null) { DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).load_terraforming_helper(false); - t = DimensionManager.getInstance().getDimensionProperties(world.provider.getDimension()).terraformingHelper; + t = DimensionProperties.proxylists.gethelper(world.provider.getDimension()); } BiomeProvider chunkmgr = t.chunkMgrTerraformed; BlockPos next_block_pos = t.get_next_position(false); @@ -195,6 +195,9 @@ public void update() { if (next_block_pos != null) { // it is null when there is everything terraformed battery.extractEnergy(powerrequired, false); BiomeHandler.terraform(world, ((ChunkManagerPlanet) chunkmgr).getBiomeGenAt(next_block_pos.getX(), next_block_pos.getZ()), next_block_pos, false, world.provider.getDimension()); + }else{ + System.out.println("nothing to terraform"); + break; // nothing to do, everything is terraformed } //} catch (NullPointerException e) { diff --git a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java index bc6a41633..6f399e38d 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java @@ -29,10 +29,7 @@ import zmaster587.libVulpes.util.HashedBlockPosition; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; +import java.util.*; import static zmaster587.advancedRocketry.util.AstronomicalBodyHelper.getAverageTemperature; import static zmaster587.advancedRocketry.util.AstronomicalBodyHelper.getOrbitalPeriod; @@ -76,17 +73,19 @@ public static void do_heavy_terraforming(World world, Biome biomeId, Biome old_b startTime = System.currentTimeMillis(); DimensionProperties props = DimensionManager.getInstance().getDimensionProperties(dimId); - ChunkPos cpos = props.terraformingHelper.getChunkPosFromBlockPos(pos); + ChunkPos cpos = DimensionProperties.proxylists.gethelper(props.getId()).getChunkPosFromBlockPos(pos); - IBlockState[] target_blocks = props.terraformingHelper.getBlocksAt(pos.getX(), pos.getZ()); // 4-6ms - chunkdata data = props.terraformingHelper.getChunkFromList(cpos.x, cpos.z); // 4-6ms + IBlockState[] target_blocks = DimensionProperties.proxylists.gethelper(props.getId()).getBlocksAt(pos.getX(), pos.getZ()); // 4-6ms + chunkdata data = DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x, cpos.z); // 4-6ms + //System.out.println("d1"+(System.currentTimeMillis()-startTime)); + //startTime = System.currentTimeMillis(); if (data.type == TerraformingType.PROTECTED){ //System.out.println("working protected"); decorate_simple(world, biomeId,old_biome, pos); - props.terraformingHelper.getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(inchunkx,inchunkz); - props.terraformingHelper.register_height_change(pos); // it does not really changetheheight but it will notify the border to update + DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(inchunkx,inchunkz); + DimensionProperties.proxylists.gethelper(props.getId()).register_height_change(pos); // it does not really changetheheight but it will notify the border to update } else if (data.type == TerraformingType.ALLOWED) { //System.out.println("working full"); @@ -109,64 +108,70 @@ else if (data.type == TerraformingType.ALLOWED) { } // as long as terrain does not match the target height, re-add position to queue if (current_height == target_height) { - props.terraformingHelper.getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(inchunkx, inchunkz); + DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(inchunkx, inchunkz); } else { - props.terraformingHelper.add_position_to_queue(pos); - props.terraformingHelper.register_height_change(pos); + DimensionProperties.proxylists.gethelper(props.getId()).add_position_to_queue(pos); + DimensionProperties.proxylists.gethelper(props.getId()).register_height_change(pos); } } } else if (data.type == TerraformingType.BORDER){ - //System.out.println("working border"); - world.getChunkFromBlockCoords(pos.add(-1,0,0)); // Ensure the chunk of the target positions are generated - world.getChunkFromBlockCoords(pos.add(1,0,0)); // Ensure the chunk of the target positions are generated - world.getChunkFromBlockCoords(pos.add(0,0,-1)); // Ensure the chunk of the target positions are generated - world.getChunkFromBlockCoords(pos.add(0,0,1)); // Ensure the chunk of the target positions are generated + if (target_blocks != null) { - int next_heightsx0 = world.getHeight(pos.add(-1,0,0)).getY(); - int next_heightsx1 = world.getHeight(pos.add(1,0,0)).getY(); - int next_heightsz0 = world.getHeight(pos.add(0,0,-1)).getY(); - int next_heightsz1 = world.getHeight(pos.add(0,0,1)).getY(); + int filter_size = 5; + //System.out.println("working border"); - int avg_height = Math.round ((float) (next_heightsz1 + next_heightsx1 + next_heightsx0 + next_heightsz0) / 4); + world.getChunkFromBlockCoords(pos.add(-filter_size, 0, 0)); // Ensure the chunk of the target positions are generated + world.getChunkFromBlockCoords(pos.add(filter_size, 0, 0)); // Ensure the chunk of the target positions are generated + world.getChunkFromBlockCoords(pos.add(0, 0, -filter_size)); // Ensure the chunk of the target positions are generated + world.getChunkFromBlockCoords(pos.add(0, 0, filter_size)); // Ensure the chunk of the target positions are generated - int prev_height = world.getHeight(pos).getY(); - if (avg_height == prev_height){ // nothing to do - return; - } + int heightsum = 0; + int num_samples = 0; + for (int x = -filter_size; x <= filter_size; x++) { + for (int z = -filter_size; z <= filter_size; z++) { + heightsum += world.getHeight(pos.add(x, 0, z)).getY(); + num_samples += 1; + } + } - //fast replacing - for (int i = 5; i < 256; i++) { - IBlockState target= target_blocks[i]; - if (i < avg_height) - if (target == Blocks.AIR.getDefaultState()) - target = biomeId.topBlock; - if (i == avg_height) - target = biomeId.topBlock; - if (i > avg_height) - target = Blocks.AIR.getDefaultState(); - world.setBlockState(new BlockPos(pos.getX(), i, pos.getZ()), target, 2); - } + int avg_height = heightsum / num_samples; - int new_height = world.getHeight(pos).getY(); + int prev_height = world.getHeight(pos).getY(); + if (avg_height == prev_height) { // nothing to do + return; + } - if (prev_height != new_height){ - props.terraformingHelper.register_height_change(pos); - props.terraformingHelper.add_position_to_queue(pos); - }else{ - props.terraformingHelper.check_next_border_chunk_fully_generated(cpos.x,cpos.z); // maybe this was the last border block in queue? if yes, its terrain is done! - } + //fast replacing + for (int i = 5; i < 256; i++) { + IBlockState target = target_blocks[i]; + if (i < avg_height) + if (target == Blocks.AIR.getDefaultState()) + target = biomeId.topBlock; + if (i == avg_height) + target = biomeId.topBlock; + if (i > avg_height) + target = Blocks.AIR.getDefaultState(); + world.setBlockState(new BlockPos(pos.getX(), i, pos.getZ()), target, 2); + } + + int new_height = world.getHeight(pos).getY(); + if (prev_height != new_height) { + DimensionProperties.proxylists.gethelper(props.getId()).register_height_change(pos); + DimensionProperties.proxylists.gethelper(props.getId()).add_position_to_queue(pos); + } else { + DimensionProperties.proxylists.gethelper(props.getId()).check_next_border_chunk_fully_generated(cpos.x, cpos.z); // maybe this was the last border block in queue? if yes, its terrain is done! + } + }else DimensionProperties.proxylists.gethelper(props.getId()).check_next_border_chunk_fully_generated(cpos.x, cpos.z); // maybe this was the last border block in queue? if yes, its terrain is done! } - //System.out.println("d1: " +(System.currentTimeMillis() - startTime)); - startTime = System.currentTimeMillis(); - int can_populate = props.terraformingHelper.can_populate(cpos.x, cpos.z); + int can_populate = DimensionProperties.proxylists.gethelper(props.getId()).can_populate(cpos.x, cpos.z); if (can_populate == -1){ //because it can never be populated, it is considered "done with population" - props.terraformingHelper.getChunkFromList(cpos.x, cpos.z).set_position_decorated(inchunkx, inchunkz); + DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x, cpos.z).set_position_decorated(inchunkx, inchunkz); } if (can_populate == 1) { @@ -174,13 +179,13 @@ else if (data.type == TerraformingType.BORDER){ // we shift the actual tree generation by 8 blocks so that it overlaps with the chunks next to it // can_populate() ensures that the chunks next to it are ready for decoration - if (!props.terraformingHelper.getChunkFromList(cpos.x,cpos.z).fully_decorated[inchunkx][inchunkz]) { + if (!DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x,cpos.z).fully_decorated[inchunkx][inchunkz]) { //System.out.println("decorate block"); int treegen = biomeId.decorator.treesPerChunk; if (world.rand.nextInt(16 * 16) < treegen) biomeId.getRandomTreeFeature(world.rand).generate(world, world.rand, world.getHeight(pos.add(8, 0, 8))); - props.terraformingHelper.getChunkFromList(cpos.x, cpos.z).set_position_decorated(inchunkx, inchunkz); + DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x, cpos.z).set_position_decorated(inchunkx, inchunkz); } } } diff --git a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java index 8172a35a6..faa4ffd1e 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java +++ b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java @@ -4,6 +4,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeProvider; @@ -47,11 +48,14 @@ public class TerraformingHelper { // - When a protecting Block has been removed and chunk status is re-calculated // add every chunk that was PROTECTED and no longer is PROTECTED to the queue for terraforming. // doesn't matter if it is type ALLOWED or type BORDER - public List terraformingqueue; + private List terraformingqueue; int safe_zone_radius = 3; int border_zone = 1; + boolean lockqueue = false; + List temp_queue; + public TerraformingHelper(int dimension, List biomes, List generated_chunks){ this.dimId = dimension; @@ -59,7 +63,8 @@ public TerraformingHelper(int dimension, List biomes, L this.biomeList = biomes; this.world = net.minecraftforge.common.DimensionManager.getWorld(dimId); this.chunkMgrTerraformed = new ChunkManagerPlanet(world, world.getWorldInfo().getGeneratorOptions(), biomeList); - this.terraformingqueue = new LinkedList<>(); + this.terraformingqueue = new ArrayList<>(); + temp_queue = new ArrayList<>(); chunkDataMap = new HashMap<>(); generator = new ChunkProviderPlanet(world, world.getSeed(), world.getWorldInfo().isMapFeaturesEnabled(), world.getWorldInfo().getGeneratorOptions()); @@ -115,23 +120,32 @@ public void register_height_change(BlockPos pos){ */ public void check_next_border_chunk_fully_generated(int px, int pz) { - //System.out.println("border check called"); - for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) { chunkdata data = getChunkFromList(px + x, pz + z); + if (data == null)continue; if (data != null && !data.terrain_fully_generated && data.type == TerraformingType.BORDER) { - - int chunkposxlow = data.x*16; - int chunkposzlow = data.z*16; - int chunkposxhigh = chunkposxlow+16; - int chunkposzhigh = chunkposzlow+16; - for (BlockPos p : this.terraformingqueue){ - if (p.getX() >= chunkposxlow && p.getX() < chunkposxhigh){ - if (p.getZ() >= chunkposzlow && p.getZ() < chunkposzhigh){ + int chunkposxlow = data.x * 16; + int chunkposzlow = data.z * 16; + int chunkposxhigh = chunkposxlow + 16; + int chunkposzhigh = chunkposzlow + 16; + + lockqueue = true; + for(Vec3i p: terraformingqueue) { + if (p == null) { + // AFAIK add_position_to_queue is the only method where the list is modified. I have no fucking idea how this can be null + //System.out.println("ERROR FOUND NULL BLOCKPOS IN LIST"); + continue; + } + if (p.getX() >= chunkposxlow && p.getX() < chunkposxhigh) { + if (p.getZ() >= chunkposzlow && p.getZ() < chunkposzhigh) { return; - }} + } + } } + lockqueue = false; + terraformingqueue.addAll(temp_queue); + temp_queue.clear(); for (int x2 = -1; x2 <= 1; x2++) { for (int z2 = -1; z2 <= 1; z2++) { @@ -144,11 +158,11 @@ public void check_next_border_chunk_fully_generated(int px, int pz) { } } } - - data.terrain_fully_generated = true; - data.blockStates = null; // no longer needed, gc should collect them now - actually, these are never needed but who cares... - check_next_border_chunk_fully_generated(data.x,data.z); // update border chunks next to this one to check if they can decorate - check_can_decorate(data.x,data.z); + System.out.println("terrain fully generated"); + data.terrain_fully_generated = true; + data.blockStates = null; // no longer needed, gc should collect them now - actually, these are never needed but who cares... + check_next_border_chunk_fully_generated(data.x, data.z); // update border chunks next to this one to check if they can decorate + check_can_decorate(data.x, data.z); } } @@ -163,7 +177,7 @@ public void check_can_decorate(int px, int pz){ //re-add all position to queue for decoration for (int bx = 0; bx < 16; bx++) { for (int bz = 0; bz < 16; bz++) { - terraformingqueue.add(new BlockPos((px+x)*16+bx, 0, (pz+z)*16+bz)); + add_position_to_queue(new BlockPos((px+x)*16+bx, 0, (pz+z)*16+bz)); } } } @@ -181,7 +195,7 @@ public ChunkPos getChunkPosFromBlockPos(BlockPos pos) { public TerraformingType get_chunk_type(int x, int z) { TerraformingType type = TerraformingType.ALLOWED; - for (BlockPos i : props.terraformingProtectedBlocks) { + for (BlockPos i : DimensionProperties.proxylists.getProtectingBlocksForDimension(props.getId())) { //System.out.println("found protecting block at "+i.getX()+":"+i.getY()+":"+i.getZ()); ChunkPos cpos = getChunkPosFromBlockPos(i); int dx = cpos.x - x; @@ -225,13 +239,21 @@ public chunkdata getChunkFromList(int x, int z){ return chunkDataMap.get(key); } - public void setPositionReady(int x, int z){ - ChunkPos cpos = getChunkPosFromBlockPos(new BlockPos(x,0,z)); - getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(x%16, z%16); - } + public void add_position_to_queue(BlockPos p){ - terraformingqueue.add(p); + //System.out.println("add position: "+p.getX()+":"+p.getZ()); + if (p == null){ + System.out.print("ERROR POSITION IS NULL"); + return; + } + if(!lockqueue) + terraformingqueue.add(new Vec3i(p.getX(),p.getY(),p.getZ())); // HOW TF CAN THIS EVER BE NULL?!?!? + else { + //well this was it... + //System.out.println("Queue is locked - adding position to temp queue"); + temp_queue.add(new Vec3i(p.getX(), p.getY(), p.getZ())); + } } public BlockPos get_next_position(boolean random){ @@ -240,14 +262,17 @@ public BlockPos get_next_position(boolean random){ int index = 0; if (random) index = nextInt(0,terraformingqueue.size()); - return terraformingqueue.remove(0); + + Vec3i pos = terraformingqueue.remove(index); + if(pos == null) return null; // Screw it - This is now beyond my pay grade now.... + return new BlockPos(pos); } public IBlockState[] getBlocksAt(int x, int z){ ChunkPos cpos = getChunkPosFromBlockPos(new BlockPos(x,0,z)); chunkdata data = getChunkFromList(cpos.x,cpos.z); if (data == null){ - //System.out.println("generate new chunk: "+chunk.x+":"+chunk.z); + System.out.println("generate new chunk: "+cpos.x+":"+cpos.z); ChunkPrimer primer = generator.getChunkPrimer(cpos.x, cpos.z, chunkMgrTerraformed); IBlockState[][][] blockStates = new IBlockState[16][16][256]; @@ -276,6 +301,6 @@ public IBlockState[] getBlocksAt(int x, int z){ public void setChunkFullyGenerated(int x, int z) { getChunkFromList(x,z).chunk_fully_generated = true; - props.terraformingChunksDone.add(new ChunkPos(x,z)); + DimensionProperties.proxylists.getChunksFullyTerraformed(props.getId()).add(new ChunkPos(x,z)); } } diff --git a/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java b/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java index b7405de47..ea33e69ee 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java +++ b/src/main/java/zmaster587/advancedRocketry/util/chunkdata.java @@ -61,7 +61,7 @@ public void set_position_fully_generated(int x, int z){ } } if (all_generated){ - //System.out.println("chunk fully generated: "+this.x+":"+this.z); + System.out.println("chunk fully generated: "+this.x+":"+this.z); terrain_fully_generated = true; this.blockStates = null; // no longer needed, gc should collect them now helper.check_next_border_chunk_fully_generated(x,z); // update border chunks next to this one to check if they can decorate From 827cc8dc085679cc58568dfcb974f2059f7e1fb5 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Sun, 7 Jul 2024 14:18:47 +0200 Subject: [PATCH 09/42] bug fixes --- .../dimension/DimensionProperties.java | 75 ++++++++++++------- .../advancedRocketry/util/BiomeHandler.java | 4 +- .../util/TerraformingHelper.java | 33 +++----- .../world/ChunkProviderPlanet.java | 6 +- 4 files changed, 63 insertions(+), 55 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index a9c084f75..1445d9086 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -228,9 +228,9 @@ public DimensionProperties(int id) { if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { - proxylists.setListforDIM(getId(),new LinkedList<>(), new LinkedList<>()); + proxylists.setListforDIM(getId(),new ArrayList<>(), new ArrayList<>()); } - terraformingChunksAlreadyAdded = new LinkedList<>(); + terraformingChunksAlreadyAdded = new ArrayList<>(); ringAngle = 70; @@ -306,6 +306,17 @@ public void add_block_to_terraforming_queue(BlockPos p) { public void add_chunk_to_terraforming_list(Chunk chunk) { if (proxylists.gethelper(getId()) != null) { + + boolean chunk_was_already_done = false; // do not add a chunk twice, the helper will manage it once it is added + for (ChunkPos i : proxylists.getChunksFullyTerraformed(getId())) { + if (chunk.x == i.x && chunk.z == i.z) { + chunk_was_already_done = true; + break; + } + } + if (chunk_was_already_done) + return; + chunkdata current_chunk = proxylists.gethelper(getId()).getChunkFromList(chunk.x, chunk.z); if (current_chunk == null || !current_chunk.chunk_fully_generated) { @@ -1627,35 +1638,45 @@ public void readFromNBT(NBTTagCompound nbt) { //terraforming data - // I have no idea how this can be called on client but it seems to just do it so idk - if (nbt.hasKey("fullyGeneratedChunks")) { - - list = nbt.getTagList("fullyGeneratedChunks", NBT.TAG_COMPOUND); - if (!list.hasNoTags()) - proxylists.setChunksFullyTerraformed(getId(), new LinkedList<>()); - for (NBTBase entry : list) { - assert entry instanceof NBTTagCompound; - int x = ((NBTTagCompound) entry).getInteger("x"); - int z = ((NBTTagCompound) entry).getInteger("z"); - System.out.println("Chunk fully terraformed: " + x + ":" + z); - proxylists.getChunksFullyTerraformed(getId()).add(new ChunkPos(x, z)); + // I have no idea how this can be called on client but it seems to just do it so idk + if (nbt.hasKey("fullyGeneratedChunks")) { + + list = nbt.getTagList("fullyGeneratedChunks", NBT.TAG_COMPOUND); + if (!list.hasNoTags()) + proxylists.setChunksFullyTerraformed(getId(), new ArrayList<>()); + for (NBTBase entry : list) { + assert entry instanceof NBTTagCompound; + int x = ((NBTTagCompound) entry).getInteger("x"); + int z = ((NBTTagCompound) entry).getInteger("z"); + System.out.println("Chunk fully terraformed: " + x + ":" + z); + + boolean chunk_was_already_done = false; + for (ChunkPos i : proxylists.getChunksFullyTerraformed(getId())) { + if (x == i.x && z == i.z) { + chunk_was_already_done = true; + break; + } } + if (!chunk_was_already_done) + proxylists.getChunksFullyTerraformed(getId()).add(new ChunkPos(x, z)); + else System.out.println("Chunk is already in list: " + x + ":" + z); } + } - if (nbt.hasKey("terraformingProtectedBlocks")) { - - list = nbt.getTagList("terraformingProtectedBlocks", NBT.TAG_COMPOUND); - if (!list.hasNoTags()) - proxylists.setProtectingBlocksForDimension(getId(), new LinkedList<>()); - for (NBTBase entry : list) { - assert entry instanceof NBTTagCompound; - int x = ((NBTTagCompound) entry).getInteger("x"); - int z = ((NBTTagCompound) entry).getInteger("z"); - int y = ((NBTTagCompound) entry).getInteger("y"); - proxylists.getProtectingBlocksForDimension(getId()).add(new BlockPos(x, y, z)); - System.out.println("read protecting block at " + x + ":" + y + ":" + z + " - - " + proxylists.getProtectingBlocksForDimension(getId()).size()); - } + if (nbt.hasKey("terraformingProtectedBlocks")) { + + list = nbt.getTagList("terraformingProtectedBlocks", NBT.TAG_COMPOUND); + if (!list.hasNoTags()) + proxylists.setProtectingBlocksForDimension(getId(), new ArrayList<>()); + for (NBTBase entry : list) { + assert entry instanceof NBTTagCompound; + int x = ((NBTTagCompound) entry).getInteger("x"); + int z = ((NBTTagCompound) entry).getInteger("z"); + int y = ((NBTTagCompound) entry).getInteger("y"); + proxylists.getProtectingBlocksForDimension(getId()).add(new BlockPos(x, y, z)); + System.out.println("read protecting block at " + x + ":" + y + ":" + z + " - - " + proxylists.getProtectingBlocksForDimension(getId()).size()); } + } readFromTechnicalNBT(nbt); } diff --git a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java index 6f399e38d..72fe2eb14 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java @@ -76,8 +76,8 @@ public static void do_heavy_terraforming(World world, Biome biomeId, Biome old_b ChunkPos cpos = DimensionProperties.proxylists.gethelper(props.getId()).getChunkPosFromBlockPos(pos); - IBlockState[] target_blocks = DimensionProperties.proxylists.gethelper(props.getId()).getBlocksAt(pos.getX(), pos.getZ()); // 4-6ms - chunkdata data = DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x, cpos.z); // 4-6ms + IBlockState[] target_blocks = DimensionProperties.proxylists.gethelper(props.getId()).getBlocksAt(pos.getX(), pos.getZ()); + chunkdata data = DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x, cpos.z); //System.out.println("d1"+(System.currentTimeMillis()-startTime)); //startTime = System.currentTimeMillis(); diff --git a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java index faa4ffd1e..68859675d 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java +++ b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java @@ -53,9 +53,6 @@ public class TerraformingHelper { int safe_zone_radius = 3; int border_zone = 1; - boolean lockqueue = false; - List temp_queue; - public TerraformingHelper(int dimension, List biomes, List generated_chunks){ this.dimId = dimension; @@ -64,7 +61,6 @@ public TerraformingHelper(int dimension, List biomes, L this.world = net.minecraftforge.common.DimensionManager.getWorld(dimId); this.chunkMgrTerraformed = new ChunkManagerPlanet(world, world.getWorldInfo().getGeneratorOptions(), biomeList); this.terraformingqueue = new ArrayList<>(); - temp_queue = new ArrayList<>(); chunkDataMap = new HashMap<>(); generator = new ChunkProviderPlanet(world, world.getSeed(), world.getWorldInfo().isMapFeaturesEnabled(), world.getWorldInfo().getGeneratorOptions()); @@ -118,7 +114,7 @@ public void register_height_change(BlockPos pos){ A Border chunk is considered fully generated when every type.ALLOWED chunks next to it are fully generated. This is because a fully terrain generated chunk will no longer change its heightmap so it will not modify the heightmap of the border chunk next to it */ - public void check_next_border_chunk_fully_generated(int px, int pz) { + public synchronized void check_next_border_chunk_fully_generated(int px, int pz) { for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) { @@ -130,22 +126,15 @@ public void check_next_border_chunk_fully_generated(int px, int pz) { int chunkposxhigh = chunkposxlow + 16; int chunkposzhigh = chunkposzlow + 16; - lockqueue = true; - for(Vec3i p: terraformingqueue) { - if (p == null) { - // AFAIK add_position_to_queue is the only method where the list is modified. I have no fucking idea how this can be null - //System.out.println("ERROR FOUND NULL BLOCKPOS IN LIST"); - continue; - } + + for(Vec3i p : terraformingqueue){ if (p.getX() >= chunkposxlow && p.getX() < chunkposxhigh) { if (p.getZ() >= chunkposzlow && p.getZ() < chunkposzhigh) { return; } } } - lockqueue = false; - terraformingqueue.addAll(temp_queue); - temp_queue.clear(); + for (int x2 = -1; x2 <= 1; x2++) { for (int z2 = -1; z2 <= 1; z2++) { @@ -241,22 +230,18 @@ public chunkdata getChunkFromList(int x, int z){ - public void add_position_to_queue(BlockPos p){ + public synchronized void add_position_to_queue(BlockPos p){ //System.out.println("add position: "+p.getX()+":"+p.getZ()); if (p == null){ System.out.print("ERROR POSITION IS NULL"); return; } - if(!lockqueue) terraformingqueue.add(new Vec3i(p.getX(),p.getY(),p.getZ())); // HOW TF CAN THIS EVER BE NULL?!?!? - else { - //well this was it... - //System.out.println("Queue is locked - adding position to temp queue"); - temp_queue.add(new Vec3i(p.getX(), p.getY(), p.getZ())); + } - } - public BlockPos get_next_position(boolean random){ + + public synchronized BlockPos get_next_position(boolean random){ if (terraformingqueue.isEmpty()) return null; int index = 0; @@ -264,7 +249,7 @@ public BlockPos get_next_position(boolean random){ index = nextInt(0,terraformingqueue.size()); Vec3i pos = terraformingqueue.remove(index); - if(pos == null) return null; // Screw it - This is now beyond my pay grade now.... + //if(pos == null) return null; // Screw it - This is now beyond my pay grade now.... return new BlockPos(pos); } diff --git a/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java b/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java index b3d144492..03fe8c054 100644 --- a/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java +++ b/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java @@ -284,12 +284,14 @@ public ChunkPrimer getChunkPrimer(int x, int z, BiomeProvider bp) { boolean is_terraforming = false; if (bp == null) { this.biomesForGeneration = this.worldObj.getBiomeProvider().getBiomes(this.biomesForGeneration, x * 16, z * 16, 16, 16); - this.setBlocksInChunk(x, z, chunkprimer); + this.setBlocksInChunk(x, z, chunkprimer); // this messes up biome generation, needs to reset biomes + this.biomesForGeneration = this.worldObj.getBiomeProvider().getBiomes(this.biomesForGeneration, x * 16, z * 16, 16, 16); this.replaceBiomeBlocks(x, z, chunkprimer, this.biomesForGeneration); } else { this.biomesForGeneration = bp.getBiomes(this.biomesForGeneration, x * 16, z * 16, 16, 16); - this.setBlocksInChunk(x, z, chunkprimer, bp); + this.setBlocksInChunk(x, z, chunkprimer, bp); // this messes up biome generation, needs to reset biomes + this.biomesForGeneration = bp.getBiomes(this.biomesForGeneration, x * 16, z * 16, 16, 16); this.replaceBiomeBlocks(x, z, chunkprimer, this.biomesForGeneration); is_terraforming = true; } From 9c52d1856827198798f5b0df1b0a192c3d6100b9 Mon Sep 17 00:00:00 2001 From: Quarter Date: Sun, 7 Jul 2024 15:51:29 +0300 Subject: [PATCH 10/42] The repair recipes --- build.gradle.kts | 2 +- .../block/BlockBipropellantRocketMotor.java | 50 ++++++++++++------- .../block/BlockRocketMotor.java | 43 +++++++++------- .../advbipropellantengine_repair_1.json | 21 ++++++++ .../advbipropellantengine_repair_2.json | 21 ++++++++ .../advbipropellantengine_repair_3.json | 21 ++++++++ .../advbipropellantengine_repair_4.json | 25 ++++++++++ .../advbipropellantengine_repair_5.json | 25 ++++++++++ .../advbipropellantengine_repair_6.json | 25 ++++++++++ .../advbipropellantengine_repair_7.json | 26 ++++++++++ .../advbipropellantengine_repair_8.json | 27 ++++++++++ .../advbipropellantengine_repair_9.json | 27 ++++++++++ .../recipes/advengine_repair_1.json | 21 ++++++++ .../recipes/advengine_repair_2.json | 21 ++++++++ .../recipes/advengine_repair_3.json | 21 ++++++++ .../recipes/advengine_repair_4.json | 25 ++++++++++ .../recipes/advengine_repair_5.json | 25 ++++++++++ .../recipes/advengine_repair_6.json | 25 ++++++++++ .../recipes/advengine_repair_7.json | 26 ++++++++++ .../recipes/advengine_repair_8.json | 26 ++++++++++ .../recipes/advengine_repair_9.json | 27 ++++++++++ .../recipes/engine_repair_1.json | 21 ++++++++ .../recipes/engine_repair_2.json | 21 ++++++++ .../recipes/engine_repair_3.json | 21 ++++++++ .../recipes/engine_repair_4.json | 25 ++++++++++ .../recipes/engine_repair_5.json | 25 ++++++++++ .../recipes/engine_repair_6.json | 25 ++++++++++ .../recipes/engine_repair_7.json | 26 ++++++++++ .../recipes/engine_repair_8.json | 26 ++++++++++ .../recipes/engine_repair_9.json | 27 ++++++++++ .../recipes/nuclearengine.json | 3 +- .../recipes/nuclearengine_repair_1.json | 21 ++++++++ .../recipes/nuclearengine_repair_2.json | 21 ++++++++ .../recipes/nuclearengine_repair_3.json | 22 ++++++++ .../recipes/nuclearengine_repair_4.json | 26 ++++++++++ .../recipes/nuclearengine_repair_5.json | 26 ++++++++++ .../recipes/nuclearengine_repair_6.json | 27 ++++++++++ .../recipes/nuclearengine_repair_7.json | 27 ++++++++++ .../recipes/nuclearengine_repair_8.json | 31 ++++++++++++ .../recipes/nuclearengine_repair_9.json | 31 ++++++++++++ 40 files changed, 944 insertions(+), 38 deletions(-) create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_1.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_2.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_3.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_4.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_5.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_6.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_7.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_8.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_9.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_1.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_2.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_3.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_4.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_5.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_6.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_7.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_8.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/advengine_repair_9.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_1.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_2.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_3.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_4.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_5.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_6.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_7.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_8.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/engine_repair_9.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_1.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_2.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_3.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_4.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_5.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_6.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_7.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_8.json create mode 100644 src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_9.json diff --git a/build.gradle.kts b/build.gradle.kts index e4daa9b23..4e6f3ca95 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -160,7 +160,7 @@ dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) implementation ("net.minecraftforge:mergetool:0.2.3.3") - // implementation ("zmaster587.libVulpes:libVulpes:1.12.2-0.4.2+:deobf") +// implementation ("zmaster587.libVulpes:libVulpes:1.12.2-0.4.2+:deobf") } tasks.processResources { diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java index fddb9c485..1fa1c8de7 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java @@ -5,10 +5,12 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -19,6 +21,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Random; public class BlockBipropellantRocketMotor extends BlockFullyRotatable implements IRocketEngine { @@ -42,27 +45,27 @@ public int getFuelConsumptionRate(World world, int x, int y, int z) { return 1; } + @Override + public EnumBlockRenderType getRenderType(final IBlockState state) { + return EnumBlockRenderType.INVISIBLE; + } + @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, @Nonnull ItemStack stack) { - NBTTagCompound compound = stack.getTagCompound(); - int stage = 0; - if (compound != null && compound.hasKey("destruction_stage")) { - stage = compound.getInteger("destruction_stage"); - } world.setBlockState(pos, state.withProperty(FACING, EnumFacing.DOWN)); TileEntity te = world.getTileEntity(pos); - ((TileBrokenPart) te).setStage(stage); + ((TileBrokenPart) te).setStage(stack.getItemDamage()); } -// @Override -// public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { -// if (!worldIn.isRemote) { -// TileEntity te = worldIn.getTileEntity(pos); -// ((TileBrokenPart) te).transition(); -// } -// return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); -// } + @Override + public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { + if (!worldIn.isRemote) { + TileEntity te = worldIn.getTileEntity(pos); + ((TileBrokenPart) te).transition(); + } + return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); + } @Override public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { @@ -70,9 +73,7 @@ public void harvestBlock(final World world, final EntityPlayer player, final Blo ItemStack drop = new ItemStack(this.getItemDropped(state, world.rand, 0)); TileBrokenPart tile = (TileBrokenPart) te; - NBTTagCompound compound = new NBTTagCompound(); - compound.setInteger("destruction_stage", tile.getStage()); - drop.setTagCompound(compound); + drop.setItemDamage(tile.getStage()); world.spawnEntity(new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), drop)); } @@ -80,6 +81,19 @@ public void harvestBlock(final World world, final EntityPlayer player, final Blo super.harvestBlock(world, player, pos, state, te, stack); } + + @Override + public Item getItemDropped(final IBlockState state, final Random rand, final int fortune) { + return super.getItemDropped(state, rand, fortune).setMaxDamage(10); + } + + public IBlockState getStateFromMeta(int meta) { + if (meta > 5) { + return this.getDefaultState(); + } + return super.getStateFromMeta(meta); + } + @Override public void getDrops(final NonNullList drops, final IBlockAccess world, final BlockPos pos, final IBlockState state, final int fortune) { // no drops here diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java index b25b683c3..40389593d 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java @@ -5,11 +5,12 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -20,6 +21,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Random; public class BlockRocketMotor extends BlockFullyRotatable implements IRocketEngine { @@ -77,25 +79,20 @@ public EnumBlockRenderType getRenderType(final IBlockState state) { @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, @Nonnull ItemStack stack) { - NBTTagCompound compound = stack.getTagCompound(); - int stage = 0; - if (compound != null && compound.hasKey("destruction_stage")) { - stage = compound.getInteger("destruction_stage"); - } world.setBlockState(pos, state.withProperty(FACING, EnumFacing.DOWN)); TileEntity te = world.getTileEntity(pos); - ((TileBrokenPart) te).setStage(stage); + ((TileBrokenPart) te).setStage(stack.getItemDamage()); } -// @Override -// public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { -// if (!worldIn.isRemote) { -// TileEntity te = worldIn.getTileEntity(pos); -// ((TileBrokenPart) te).transition(); -// } -// return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); -// } + @Override + public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { + if (!worldIn.isRemote) { + TileEntity te = worldIn.getTileEntity(pos); + ((TileBrokenPart) te).transition(); + } + return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); + } @Override public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { @@ -103,9 +100,7 @@ public void harvestBlock(final World world, final EntityPlayer player, final Blo ItemStack drop = new ItemStack(this.getItemDropped(state, world.rand, 0)); TileBrokenPart tile = (TileBrokenPart) te; - NBTTagCompound compound = new NBTTagCompound(); - compound.setInteger("destruction_stage", tile.getStage()); - drop.setTagCompound(compound); + drop.setItemDamage(tile.getStage()); world.spawnEntity(new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), drop)); } @@ -113,6 +108,18 @@ public void harvestBlock(final World world, final EntityPlayer player, final Blo super.harvestBlock(world, player, pos, state, te, stack); } + @Override + public Item getItemDropped(final IBlockState state, final Random rand, final int fortune) { + return super.getItemDropped(state, rand, fortune).setMaxDamage(10); + } + + public IBlockState getStateFromMeta(int meta) { + if (meta > 5) { + return this.getDefaultState(); + } + return super.getStateFromMeta(meta); + } + @Override public void getDrops(final NonNullList drops, final IBlockAccess world, final BlockPos pos, final IBlockState state, final int fortune) { // no drops here diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_1.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_1.json new file mode 100644 index 000000000..d83512cb3 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_1.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 1 + } + ], + "time": 900, + "energy": 100, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_2.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_2.json new file mode 100644 index 000000000..49dd453d8 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_2.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 2 + } + ], + "time": 900, + "energy": 200, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_3.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_3.json new file mode 100644 index 000000000..9d896d3c4 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_3.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 3 + } + ], + "time": 900, + "energy": 300, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_4.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_4.json new file mode 100644 index 000000000..126633b4d --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_4.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 4 + } + ], + "time": 1800, + "energy": 400, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_5.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_5.json new file mode 100644 index 000000000..65228913a --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_5.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 4 + } + ], + "time": 1800, + "energy": 500, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_6.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_6.json new file mode 100644 index 000000000..637ff5f24 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_6.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 4 + } + ], + "time": 1800, + "energy": 600, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_7.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_7.json new file mode 100644 index 000000000..6028086a3 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_7.json @@ -0,0 +1,26 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 7 + } + ], + "time": 2700, + "energy": 700, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_8.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_8.json new file mode 100644 index 000000000..f6b17f9c4 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_8.json @@ -0,0 +1,27 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide", + "count": 2 + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 8 + } + ], + "time": 2700, + "energy": 800, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_9.json b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_9.json new file mode 100644 index 000000000..1b3ad83f0 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advbipropellantengine_repair_9.json @@ -0,0 +1,27 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide", + "count": 2 + }, + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "data": 9 + } + ], + "time": 2700, + "energy": 900, + "itemresults": + { + "item": "advancedrocketry:advbipropellantrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_1.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_1.json new file mode 100644 index 000000000..d9d39a83d --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_1.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 1 + } + ], + "time": 900, + "energy": 100, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_2.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_2.json new file mode 100644 index 000000000..75c0f7321 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_2.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 2 + } + ], + "time": 900, + "energy": 200, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_3.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_3.json new file mode 100644 index 000000000..6ef69df73 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_3.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 3 + } + ], + "time": 900, + "energy": 300, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_4.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_4.json new file mode 100644 index 000000000..f04a5a2cd --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_4.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 4 + } + ], + "time": 1800, + "energy": 400, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_5.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_5.json new file mode 100644 index 000000000..68169d40c --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_5.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 5 + } + ], + "time": 1800, + "energy": 500, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_6.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_6.json new file mode 100644 index 000000000..196ffd1ab --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_6.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 6 + } + ], + "time": 1800, + "energy": 600, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_7.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_7.json new file mode 100644 index 000000000..f7db81603 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_7.json @@ -0,0 +1,26 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 7 + } + ], + "time": 2700, + "energy": 700, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_8.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_8.json new file mode 100644 index 000000000..55f3a66bf --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_8.json @@ -0,0 +1,26 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 8 + } + ], + "time": 2700, + "energy": 900, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_9.json b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_9.json new file mode 100644 index 000000000..97899a05e --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/advengine_repair_9.json @@ -0,0 +1,27 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide", + "count": 2 + }, + { + "item": "advancedrocketry:advrocketmotor", + "data": 9 + } + ], + "time": 2700, + "energy": 900, + "itemresults": + { + "item": "advancedrocketry:advrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_1.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_1.json new file mode 100644 index 000000000..9e1cd4453 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_1.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel" + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 1 + } + ], + "time": 900, + "energy": 100, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_2.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_2.json new file mode 100644 index 000000000..371c00ecd --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_2.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel" + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 2 + } + ], + "time": 900, + "energy": 200, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_3.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_3.json new file mode 100644 index 000000000..fd9dfa1f4 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_3.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel" + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 3 + } + ], + "time": 900, + "energy": 300, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_4.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_4.json new file mode 100644 index 000000000..94b45834a --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_4.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitanium" + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 4 + } + ], + "time": 1800, + "energy": 400, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_5.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_5.json new file mode 100644 index 000000000..31457d18a --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_5.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitanium" + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 5 + } + ], + "time": 1800, + "energy": 500, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_6.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_6.json new file mode 100644 index 000000000..0b4450bc3 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_6.json @@ -0,0 +1,25 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel" + }, + { + "type": "forge:ore_dict", + "ore": "plateTitanium" + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 6 + } + ], + "time": 1800, + "energy": 600, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_7.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_7.json new file mode 100644 index 000000000..08cea1ca8 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_7.json @@ -0,0 +1,26 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitanium" + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 7 + } + ], + "time": 2700, + "energy": 700, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_8.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_8.json new file mode 100644 index 000000000..3e0bd273d --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_8.json @@ -0,0 +1,26 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitanium" + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 7 + } + ], + "time": 2700, + "energy": 800, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/engine_repair_9.json b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_9.json new file mode 100644 index 000000000..f56951a72 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/engine_repair_9.json @@ -0,0 +1,27 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotSteel", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitanium", + "count": 2 + }, + { + "item": "advancedrocketry:rocketmotor", + "data": 7 + } + ], + "time": 2700, + "energy": 900, + "itemresults": + { + "item": "advancedrocketry:rocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine.json index b29197cbd..6f27d0805 100644 --- a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine.json +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine.json @@ -20,7 +20,8 @@ }, "d": { "type": "forge:ore_dict", - "ore": "gemDilithium"} + "ore": "gemDilithium" + } }, "result": { diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_1.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_1.json new file mode 100644 index 000000000..76b582ff6 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_1.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 1 + } + ], + "time": 2000, + "energy": 100, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_2.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_2.json new file mode 100644 index 000000000..394decbae --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_2.json @@ -0,0 +1,21 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium" + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 2 + } + ], + "time": 2000, + "energy": 200, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_3.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_3.json new file mode 100644 index 000000000..85506af06 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_3.json @@ -0,0 +1,22 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 3 + } + ], + "time": 2000, + "energy": 300, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_4.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_4.json new file mode 100644 index 000000000..d85324b67 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_4.json @@ -0,0 +1,26 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 4 + } + ], + "time": 3000, + "energy": 400, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_5.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_5.json new file mode 100644 index 000000000..d2514eee3 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_5.json @@ -0,0 +1,26 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide" + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 5 + } + ], + "time": 3000, + "energy": 500, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_6.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_6.json new file mode 100644 index 000000000..6a5a18478 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_6.json @@ -0,0 +1,27 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide", + "count": 2 + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 4 + } + ], + "time": 3000, + "energy": 600, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_7.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_7.json new file mode 100644 index 000000000..a4e6d86ea --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_7.json @@ -0,0 +1,27 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide", + "count": 2 + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 7 + } + ], + "time": 4000, + "energy": 700, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_8.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_8.json new file mode 100644 index 000000000..3269646ae --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_8.json @@ -0,0 +1,31 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "gemDilithium" + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 8 + } + ], + "time": 4000, + "energy": 800, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} diff --git a/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_9.json b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_9.json new file mode 100644 index 000000000..a0b790dfc --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/recipes/nuclearengine_repair_9.json @@ -0,0 +1,31 @@ +{ + "type": "advancedrocketry:precisionassembler", + "itemingredients": + [ + { + "type": "forge:ore_dict", + "ore": "ingotTitaniumIridium", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "plateTitaniumAluminide", + "count": 2 + }, + { + "type": "forge:ore_dict", + "ore": "gemDilithium" + }, + { + "item": "advancedrocketry:nuclearrocketmotor", + "data": 9 + } + ], + "time": 4000, + "energy": 900, + "itemresults": + { + "item": "advancedrocketry:nuclearrocketmotor", + "count": 1 + } +} From 8e71baa01f59f9202d1bfea7fc9e5627aa5b9735 Mon Sep 17 00:00:00 2001 From: Quarter Date: Sun, 7 Jul 2024 16:46:31 +0300 Subject: [PATCH 11/42] Fixed satellite hatches weighting override --- .../advancedRocketry/util/StorageChunk.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java index 92ad8cbce..c758f5686 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java +++ b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java @@ -40,6 +40,7 @@ import zmaster587.advancedRocketry.block.BlockBipropellantRocketMotor; import zmaster587.advancedRocketry.block.BlockNuclearRocketMotor; import zmaster587.advancedRocketry.block.BlockRocketMotor; +import zmaster587.advancedRocketry.item.ItemPackedStructure; import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.advancedRocketry.tile.TileGuidanceComputer; import zmaster587.advancedRocketry.tile.hatch.TileSatelliteHatch; @@ -136,6 +137,16 @@ public float recalculateWeight() { // TEs for (TileEntity te : this.tileEntities) { this.weight += WeightEngine.INSTANCE.getTEWeight(te); + + if (te instanceof TileSatelliteHatch) { + TileSatelliteHatch hatch = (TileSatelliteHatch) te; + if (hatch.getSatellite() != null) { + weight += hatch.getSatellite().getProperties().getWeight(); + } else if (hatch.getStackInSlot(0).getItem() instanceof ItemPackedStructure) { + ItemPackedStructure struct = (ItemPackedStructure) hatch.getStackInSlot(0).getItem(); + weight += struct.getStructure(hatch.getStackInSlot(0)).getWeight(); + } + } } return this.weight; From 2c9def220db3b892e43aca03e93932d18918f415 Mon Sep 17 00:00:00 2001 From: Quarter Date: Sun, 7 Jul 2024 20:02:20 +0300 Subject: [PATCH 12/42] Made rendering for the broken textures --- .../advancedRocketry/AdvancedRocketry.java | 6 ++++++ .../block/BlockBipropellantRocketMotor.java | 10 +-------- .../block/BlockRocketMotor.java | 11 ++-------- .../client/render/RendererBrokenPart.java | 21 +++++++++++++++++-- .../advancedRocketry/tile/TileBrokenPart.java | 5 +++++ 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java b/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java index cbe6b6827..b277f26e7 100644 --- a/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java +++ b/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java @@ -590,6 +590,12 @@ public void registerItems(RegistryEvent.Register evt) { OreDictionary.registerOre("slab", new ItemStack(Blocks.STONE_SLAB)); OreDictionary.registerOre("blockWarpCoreCore", new ItemStack(Blocks.GOLD_BLOCK)); OreDictionary.registerOre("blockWarpCoreRim", MaterialRegistry.getMaterialFromName("Titanium").getProduct(AllowedProducts.getProductByName("BLOCK"))); + + Item.getItemFromBlock(AdvancedRocketryBlocks.blockEngine).setMaxDamage(10); + Item.getItemFromBlock(AdvancedRocketryBlocks.blockAdvEngine).setMaxDamage(10); + Item.getItemFromBlock(AdvancedRocketryBlocks.blockBipropellantEngine).setMaxDamage(10); + Item.getItemFromBlock(AdvancedRocketryBlocks.blockAdvBipropellantEngine).setMaxDamage(10); + Item.getItemFromBlock(AdvancedRocketryBlocks.blockNuclearEngine).setMaxDamage(10); } @SubscribeEvent(priority = EventPriority.HIGH) diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java index 1fa1c8de7..fa327e60b 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java @@ -5,7 +5,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; @@ -21,7 +20,6 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.Random; public class BlockBipropellantRocketMotor extends BlockFullyRotatable implements IRocketEngine { @@ -81,12 +79,6 @@ public void harvestBlock(final World world, final EntityPlayer player, final Blo super.harvestBlock(world, player, pos, state, te, stack); } - - @Override - public Item getItemDropped(final IBlockState state, final Random rand, final int fortune) { - return super.getItemDropped(state, rand, fortune).setMaxDamage(10); - } - public IBlockState getStateFromMeta(int meta) { if (meta > 5) { return this.getDefaultState(); @@ -107,6 +99,6 @@ public boolean hasTileEntity(IBlockState state) { @Nullable @Override public TileEntity createTileEntity(final World worldIn, final IBlockState state) { - return new TileBrokenPart(10, 0.1F); + return new TileBrokenPart(10, 0.025F); } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java index 40389593d..98ab38b40 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java @@ -5,7 +5,6 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; @@ -21,7 +20,6 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.Random; public class BlockRocketMotor extends BlockFullyRotatable implements IRocketEngine { @@ -49,7 +47,7 @@ public IBlockState getActualState(@Nonnull IBlockState state, IBlockAccess world if (world.getBlockState(pos.add(0, 0, -1)).getBlock() instanceof BlockFuelTank) { return state.withProperty(FACING, EnumFacing.NORTH); } - return state; + return super.getActualState(state, world, pos); } @Override @@ -108,11 +106,6 @@ public void harvestBlock(final World world, final EntityPlayer player, final Blo super.harvestBlock(world, player, pos, state, te, stack); } - @Override - public Item getItemDropped(final IBlockState state, final Random rand, final int fortune) { - return super.getItemDropped(state, rand, fortune).setMaxDamage(10); - } - public IBlockState getStateFromMeta(int meta) { if (meta > 5) { return this.getDefaultState(); @@ -133,6 +126,6 @@ public boolean hasTileEntity(IBlockState state) { @Nullable @Override public TileEntity createTileEntity(final World worldIn, final IBlockState state) { - return new TileBrokenPart(10, 0.1F); + return new TileBrokenPart(10, 0.05F); } } diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java index 2ce1a70e5..d246269df 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java @@ -10,18 +10,35 @@ public class RendererBrokenPart extends TileEntitySpecialRenderer { @Override - public void render(TileBrokenPart tile, double x, double y, double z, float t, int damage, float a) { + public void render(TileBrokenPart tile, double x, double y, double z, float t, int destroyStage, float a) { GlStateManager.pushMatrix(); GlStateManager.translate((float) x, (float) y, (float) z); ResourceLocation res = tile.getBlockType().getRegistryName(); String name = tile.getBlockType().getUnlocalizedName().split("\\.")[1].toLowerCase(); String pathToTexture = "textures/models/" + name + "_" + tile.getStage() / 3 + ".png"; - this.bindTexture(new ResourceLocation(res.getResourceDomain(), pathToTexture)); + + if (destroyStage >= 0) { + this.bindTexture(DESTROY_STAGES[destroyStage]); + GlStateManager.matrixMode(5890); + GlStateManager.pushMatrix(); + GlStateManager.scale(4.0F, 4.0F, 1.0F); + GlStateManager.translate(0.0625F, 0.0625F, 0.0625F); + GlStateManager.matrixMode(5888); + } else { + this.bindTexture(new ResourceLocation(res.getResourceDomain(), pathToTexture)); + } WavefrontObject model = ClientProxy.getModel(new ResourceLocation(res.getResourceDomain(), "models/block/models/" + name + ".obj")); model.renderAll(); + if (destroyStage >= 0) + { + GlStateManager.matrixMode(5890); + GlStateManager.popMatrix(); + GlStateManager.matrixMode(5888); + } + GlStateManager.popMatrix(); } } diff --git a/src/main/java/zmaster587/advancedRocketry/tile/TileBrokenPart.java b/src/main/java/zmaster587/advancedRocketry/tile/TileBrokenPart.java index 3909eb0eb..9d22ec7fa 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/TileBrokenPart.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/TileBrokenPart.java @@ -67,6 +67,11 @@ public boolean transition() { return false; } + @Override + public boolean canRenderBreaking() { + return true; + } + @Nonnull @Override public NBTTagCompound writeToNBT(final NBTTagCompound compound) { From 6214dec23833f388e362e82716ef83c6116e0ce2 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Sun, 7 Jul 2024 19:36:48 +0200 Subject: [PATCH 13/42] more bug fixes and improvements --- build.gradle.kts | 12 +- gradle.properties | 2 - gradle/wrapper/gradle-wrapper.properties | 4 +- .../api/dimension/IDimensionProperties.java | 2 +- .../dimension/DimensionManager.java | 6 +- .../dimension/DimensionProperties.java | 131 +++++++++--------- .../Afuckinginterface.java | 4 +- .../clientlists.java | 20 ++- .../serverlists.java | 19 ++- .../network/PacketDimInfo.java | 2 +- .../network/PacketStationUpdate.java | 2 +- .../stations/SpaceObjectBase.java | 2 +- .../stations/SpaceStationObject.java | 2 +- .../world/ChunkProviderPlanet.java | 4 +- 14 files changed, 119 insertions(+), 93 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e3cf19d3f..b26851370 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -131,10 +131,10 @@ repositories { name = "ModMaven" url = uri("https://modmaven.k-4u.nl") } - maven { - name = "Galacticraft" - url = uri("https://maven.galacticraft.dev/repository/legacy-releases/") - } + //maven { + // name = "Galacticraft" + // url = uri("https://maven.galacticraft.dev/repository/legacy-releases/") + //} // maven { // name = "LibVulpes" // url = uri("http://maven.dmodoomsirius.me/") @@ -152,8 +152,8 @@ dependencies { //compileOnly("net.industrial-craft:industrialcraft-2:$icVersion:dev") //implementation("zmaster587.libVulpes:LibVulpes:$mcVersion-$libVulpesVersion-$libVulpesBuildNum-deobf") - compileOnly(fg.deobf("dev.galacticraft:galacticraft-legacy:$gcVersion")) - + //compileOnly(fg.deobf("dev.galacticraft:galacticraft-legacy:$gcVersion")) + compileOnly(fg.deobf("curse.maven:galacticraft-legacy-564236:4671122")) compileOnly(fg.deobf("mezz.jei:jei_${mcVersion}:${jeiVersion}:api")) //runtimeOnly(fg.deobf("mezz.jei:jei_${mcVersion}:${jeiVersion}")) // I think this crashes the game for me when running from IntelliJ diff --git a/gradle.properties b/gradle.properties index 9135f44e4..c55b077d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,5 +11,3 @@ startGitRev=8e676bd # Dependencies libVulpesVersion=0.4.3 jeiVersion=4.16.1.301 -icVersion=2.7.39-ex111 -gcVersion=4.0.6 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fc6f9a390..8c25905ce 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ +#Sun Jul 07 14:46:24 CEST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip -networkTimeout=10000 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/zmaster587/advancedRocketry/api/dimension/IDimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/api/dimension/IDimensionProperties.java index 2259cda41..8118bbbd4 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/dimension/IDimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/api/dimension/IDimensionProperties.java @@ -150,7 +150,7 @@ public interface IDimensionProperties { */ SatelliteBase removeSatellite(long id); - void writeToNBT(NBTTagCompound nbt, boolean write_terraforming_biomes); + void writeToNBT(NBTTagCompound nbt); void readFromNBT(NBTTagCompound nbt); diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java index 3d9c7d610..fbc2174e0 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java @@ -600,13 +600,14 @@ public void saveDimensions(String filePath) throws Exception { for (Entry dimSet : dimensionList.entrySet()) { NBTTagCompound dimNbt = new NBTTagCompound(); - dimSet.getValue().writeToNBT(dimNbt, true); - + dimSet.getValue().writeToNBT(dimNbt); + dimSet.getValue().write_terraforming_data(dimNbt); dimListnbt.setTag(dimSet.getKey().toString(), dimNbt); } nbt.setTag("dimList", dimListnbt); + //Stats NBTTagCompound stats = new NBTTagCompound(); stats.setBoolean("hasReachedMoon", hasReachedMoon); @@ -1081,6 +1082,7 @@ public Map loadDimensions(String filePath) { for (String key : dimListNbt.getKeySet()) { DimensionProperties properties = DimensionProperties.createFromNBT(Integer.parseInt(key), dimListNbt.getCompoundTag(key)); + properties.read_terraforming_data(dimListNbt.getCompoundTag(key)); int keyInt = Integer.parseInt(key); /*if(!net.minecraftforge.common.DimensionManager.isDimensionRegistered(keyInt) && properties.isNativeDimension && !properties.isGasGiant()) { diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index 1445d9086..77fa47bb0 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -225,11 +225,6 @@ public DimensionProperties(int id) { //water_can_exist = true; water_source_locked_positions = new ArrayList<>(); - - -if (FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) { - proxylists.setListforDIM(getId(),new ArrayList<>(), new ArrayList<>()); -} terraformingChunksAlreadyAdded = new ArrayList<>(); ringAngle = 70; @@ -242,6 +237,10 @@ public DimensionProperties(int id) { public void load_terraforming_helper(boolean reset) { if (!net.minecraftforge.common.DimensionManager.getWorld(getId()).isRemote) { + if (!proxylists.isinitialized(getId())){ + proxylists.initdim(getId()); + } + getAverageTemp(); getViableBiomes(false); if (reset) { @@ -1637,13 +1636,48 @@ public void readFromNBT(NBTTagCompound nbt) { fillerBlock = null; -//terraforming data - // I have no idea how this can be called on client but it seems to just do it so idk + readFromTechnicalNBT(nbt); + } + + + + private void writeTechnicalNBT(NBTTagCompound nbt) { + NBTTagList list; + if (!beaconLocations.isEmpty()) { + list = new NBTTagList(); + + for (HashedBlockPosition pos : beaconLocations) { + list.appendTag(new NBTTagIntArray(new int[]{pos.x, pos.y, pos.z})); + } + nbt.setTag("beaconLocations", list); + } + + //Satellites + + if (!satellites.isEmpty()) { + NBTTagCompound allSatelliteNBT = new NBTTagCompound(); + for (Entry entry : satellites.entrySet()) { + NBTTagCompound satelliteNBT = new NBTTagCompound(); + + entry.getValue().writeToNBT(satelliteNBT); + allSatelliteNBT.setTag(entry.getKey().toString(), satelliteNBT); + } + nbt.setTag("satallites", allSatelliteNBT); + } } + + //terraforming data + public void read_terraforming_data(NBTTagCompound nbt){ + + int dimid =getId(); + if (!proxylists.isinitialized(dimid)){ + proxylists.initdim(dimid); + } + if (nbt.hasKey("fullyGeneratedChunks")) { - list = nbt.getTagList("fullyGeneratedChunks", NBT.TAG_COMPOUND); + NBTTagList list = nbt.getTagList("fullyGeneratedChunks", NBT.TAG_COMPOUND); if (!list.hasNoTags()) - proxylists.setChunksFullyTerraformed(getId(), new ArrayList<>()); + proxylists.setChunksFullyTerraformed(dimid, new ArrayList<>()); for (NBTBase entry : list) { assert entry instanceof NBTTagCompound; int x = ((NBTTagCompound) entry).getInteger("x"); @@ -1651,66 +1685,59 @@ public void readFromNBT(NBTTagCompound nbt) { System.out.println("Chunk fully terraformed: " + x + ":" + z); boolean chunk_was_already_done = false; - for (ChunkPos i : proxylists.getChunksFullyTerraformed(getId())) { + for (ChunkPos i : proxylists.getChunksFullyTerraformed(dimid)) { if (x == i.x && z == i.z) { chunk_was_already_done = true; break; } } if (!chunk_was_already_done) - proxylists.getChunksFullyTerraformed(getId()).add(new ChunkPos(x, z)); + proxylists.getChunksFullyTerraformed(dimid).add(new ChunkPos(x, z)); else System.out.println("Chunk is already in list: " + x + ":" + z); } } if (nbt.hasKey("terraformingProtectedBlocks")) { - list = nbt.getTagList("terraformingProtectedBlocks", NBT.TAG_COMPOUND); + NBTTagList list = nbt.getTagList("terraformingProtectedBlocks", NBT.TAG_COMPOUND); if (!list.hasNoTags()) - proxylists.setProtectingBlocksForDimension(getId(), new ArrayList<>()); + proxylists.setProtectingBlocksForDimension(dimid, new ArrayList<>()); for (NBTBase entry : list) { assert entry instanceof NBTTagCompound; int x = ((NBTTagCompound) entry).getInteger("x"); int z = ((NBTTagCompound) entry).getInteger("z"); int y = ((NBTTagCompound) entry).getInteger("y"); - proxylists.getProtectingBlocksForDimension(getId()).add(new BlockPos(x, y, z)); - System.out.println("read protecting block at " + x + ":" + y + ":" + z + " - - " + proxylists.getProtectingBlocksForDimension(getId()).size()); + proxylists.getProtectingBlocksForDimension(dimid).add(new BlockPos(x, y, z)); + System.out.println("read protecting block at " + x + ":" + y + ":" + z + " - - " + proxylists.getProtectingBlocksForDimension(dimid).size()); } } - - readFromTechnicalNBT(nbt); } + public void write_terraforming_data(NBTTagCompound nbt) { + // write terraforming data - private void writeTechnicalNBT(NBTTagCompound nbt) { - NBTTagList list; - if (!beaconLocations.isEmpty()) { - list = new NBTTagList(); - - for (HashedBlockPosition pos : beaconLocations) { - list.appendTag(new NBTTagIntArray(new int[]{pos.x, pos.y, pos.z})); + int dimid = getId(); + NBTTagList list = new NBTTagList(); + for (ChunkPos pos : proxylists.getChunksFullyTerraformed(dimid)) { + NBTTagCompound entry = new NBTTagCompound(); + entry.setInteger("x", pos.x); + entry.setInteger("z", pos.z); + list.appendTag(entry); } - nbt.setTag("beaconLocations", list); - } - - //Satellites - - if (!satellites.isEmpty()) { - NBTTagCompound allSatelliteNBT = new NBTTagCompound(); - for (Entry entry : satellites.entrySet()) { - NBTTagCompound satelliteNBT = new NBTTagCompound(); + nbt.setTag("fullyGeneratedChunks", list); - entry.getValue().writeToNBT(satelliteNBT); - allSatelliteNBT.setTag(entry.getKey().toString(), satelliteNBT); + list = new NBTTagList(); + for (BlockPos pos : proxylists.getProtectingBlocksForDimension(dimid)) { + NBTTagCompound entry = new NBTTagCompound(); + entry.setInteger("x", pos.getX()); + entry.setInteger("y", pos.getY()); + entry.setInteger("z", pos.getZ()); + list.appendTag(entry); } - nbt.setTag("satallites", allSatelliteNBT); - } + nbt.setTag("terraformingProtectedBlocks", list); } - //public void writeToNBT(NBTTagCompound nbt) { - - //} - public void writeToNBT(NBTTagCompound nbt, boolean write_terraforming_info) { // filter out info in client packet because it is too big + public void writeToNBT(NBTTagCompound nbt) { NBTTagList list; if (skyColor != null) { @@ -1872,28 +1899,6 @@ public void writeToNBT(NBTTagCompound nbt, boolean write_terraforming_info) { // } - // write terraforming data - - if (write_terraforming_info) { - list = new NBTTagList(); - for (ChunkPos pos : proxylists.getChunksFullyTerraformed(getId())) { - NBTTagCompound entry = new NBTTagCompound(); - entry.setInteger("x", pos.x); - entry.setInteger("z", pos.z); - list.appendTag(entry); - } - nbt.setTag("fullyGeneratedChunks", list); - - list = new NBTTagList(); - for (BlockPos pos : proxylists.getProtectingBlocksForDimension(getId())) { - NBTTagCompound entry = new NBTTagCompound(); - entry.setInteger("x", pos.getX()); - entry.setInteger("y", pos.getY()); - entry.setInteger("z", pos.getZ()); - list.appendTag(entry); - } - nbt.setTag("terraformingProtectedBlocks", list); - } writeTechnicalNBT(nbt); } diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java index 5f91ffa05..7c5e6a1bb 100644 --- a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java @@ -9,7 +9,9 @@ public interface Afuckinginterface { - public void setListforDIM(int dim, List protectingblocklist, List chunksDoneList); + public void initdim(int dim); + + public boolean isinitialized(int dim); public List getProtectingBlocksForDimension(int dim); diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java index 3577e213a..2677d0b3b 100644 --- a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java @@ -4,6 +4,8 @@ import net.minecraft.util.math.ChunkPos; import zmaster587.advancedRocketry.util.TerraformingHelper; import zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage.dimensionTerraformingInfo; + +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -15,32 +17,40 @@ public clientlists(){ this.terraforminginfolists = new HashMap<>(); } - public void setListforDIM(int dim, List protectingblocklist, List chunksDoneList){ + public void initdim(int dim){ if (terraforminginfolists.get(dim) != null){ - terraforminginfolists.get(dim).terraformingChunksDone = chunksDoneList; - terraforminginfolists.get(dim).terraformingProtectedBlocks = protectingblocklist; + terraforminginfolists.get(dim).terraformingChunksDone = new ArrayList<>(); + terraforminginfolists.get(dim).terraformingProtectedBlocks = new ArrayList<>(); }else{ dimensionTerraformingInfo info = new dimensionTerraformingInfo(); - info.terraformingChunksDone = chunksDoneList; - info.terraformingProtectedBlocks = protectingblocklist; + info.terraformingChunksDone = new ArrayList<>(); + info.terraformingProtectedBlocks = new ArrayList<>(); terraforminginfolists.put(dim,info); } } + public boolean isinitialized(int dim){ + return (terraforminginfolists.get(dim) != null); + } public List getProtectingBlocksForDimension(int dim){ + if (terraforminginfolists.get(dim) == null)return null; return terraforminginfolists.get(dim).terraformingProtectedBlocks; } public void setProtectingBlocksForDimension(int dim, List blocks){ + if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingProtectedBlocks = blocks; } public void setChunksFullyTerraformed(int dim, List lpos){ + if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingChunksDone = lpos; } public List getChunksFullyTerraformed(int dim){ + if (terraforminginfolists.get(dim) == null)return null; return terraforminginfolists.get(dim).terraformingChunksDone; } public void sethelper(int dim, TerraformingHelper helper){ + if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingHelper= helper; } public TerraformingHelper gethelper(int dim){ diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java index 76f1fcc91..d8b1e5800 100644 --- a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java @@ -4,6 +4,7 @@ import net.minecraft.util.math.ChunkPos; import zmaster587.advancedRocketry.util.TerraformingHelper; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -16,32 +17,40 @@ public serverlists(){ this.terraforminginfolists = new HashMap<>(); } - public void setListforDIM(int dim, List protectingblocklist, List chunksDoneList){ + public void initdim(int dim){ if (terraforminginfolists.get(dim) != null){ - terraforminginfolists.get(dim).terraformingChunksDone = chunksDoneList; - terraforminginfolists.get(dim).terraformingProtectedBlocks = protectingblocklist; + terraforminginfolists.get(dim).terraformingChunksDone = new ArrayList<>(); + terraforminginfolists.get(dim).terraformingProtectedBlocks = new ArrayList<>(); }else{ dimensionTerraformingInfo info = new dimensionTerraformingInfo(); - info.terraformingChunksDone = chunksDoneList; - info.terraformingProtectedBlocks = protectingblocklist; + info.terraformingChunksDone = new ArrayList<>(); + info.terraformingProtectedBlocks = new ArrayList<>(); terraforminginfolists.put(dim,info); } } + public boolean isinitialized(int dim){ + return (terraforminginfolists.get(dim) != null); + } public List getProtectingBlocksForDimension(int dim){ + if (terraforminginfolists.get(dim) == null)return null; return terraforminginfolists.get(dim).terraformingProtectedBlocks; } public void setProtectingBlocksForDimension(int dim, List blocks){ + if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingProtectedBlocks = blocks; } public void setChunksFullyTerraformed(int dim, List lpos){ + if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingChunksDone = lpos; } public List getChunksFullyTerraformed(int dim){ + if (terraforminginfolists.get(dim) == null)return null; return terraforminginfolists.get(dim).terraformingChunksDone; } public void sethelper(int dim, TerraformingHelper helper){ + if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingHelper= helper; } public TerraformingHelper gethelper(int dim){ diff --git a/src/main/java/zmaster587/advancedRocketry/network/PacketDimInfo.java b/src/main/java/zmaster587/advancedRocketry/network/PacketDimInfo.java index 1939ba62e..a52a8fdb1 100644 --- a/src/main/java/zmaster587/advancedRocketry/network/PacketDimInfo.java +++ b/src/main/java/zmaster587/advancedRocketry/network/PacketDimInfo.java @@ -47,7 +47,7 @@ public void write(ByteBuf out) { //Try to send the nbt data of the dimension to the client, if it fails(probably due to non existent Biome ids) then remove the dimension PacketBuffer packetBuffer = new PacketBuffer(out); try { - dimProperties.writeToNBT(nbt, false); + dimProperties.writeToNBT(nbt); out.writeBoolean(false); packetBuffer.writeCompoundTag(nbt); diff --git a/src/main/java/zmaster587/advancedRocketry/network/PacketStationUpdate.java b/src/main/java/zmaster587/advancedRocketry/network/PacketStationUpdate.java index 9d3440776..21eb199fd 100644 --- a/src/main/java/zmaster587/advancedRocketry/network/PacketStationUpdate.java +++ b/src/main/java/zmaster587/advancedRocketry/network/PacketStationUpdate.java @@ -67,7 +67,7 @@ public void write(ByteBuf out) { case DIM_PROPERTY_UPDATE: NBTTagCompound nbt = new NBTTagCompound(); try { - spaceObject.getProperties().writeToNBT(nbt, false); + spaceObject.getProperties().writeToNBT(nbt); PacketBuffer packetBuffer = new PacketBuffer(out); packetBuffer.writeCompoundTag(nbt); } catch (NullPointerException e) { diff --git a/src/main/java/zmaster587/advancedRocketry/stations/SpaceObjectBase.java b/src/main/java/zmaster587/advancedRocketry/stations/SpaceObjectBase.java index 619908d13..b20962060 100644 --- a/src/main/java/zmaster587/advancedRocketry/stations/SpaceObjectBase.java +++ b/src/main/java/zmaster587/advancedRocketry/stations/SpaceObjectBase.java @@ -250,7 +250,7 @@ public void onModuleUnpack(IStorageChunk chunk) { @Override public void writeToNbt(NBTTagCompound nbt) { - properties.writeToNBT(nbt, false); + properties.writeToNBT(nbt); nbt.setInteger("id", getId()); nbt.setInteger("posX", posX); nbt.setInteger("posY", posY); diff --git a/src/main/java/zmaster587/advancedRocketry/stations/SpaceStationObject.java b/src/main/java/zmaster587/advancedRocketry/stations/SpaceStationObject.java index c36846f51..a2a10bd3b 100644 --- a/src/main/java/zmaster587/advancedRocketry/stations/SpaceStationObject.java +++ b/src/main/java/zmaster587/advancedRocketry/stations/SpaceStationObject.java @@ -671,7 +671,7 @@ public void onModuleUnpack(IStorageChunk chunk) { @Override public void writeToNbt(NBTTagCompound nbt) { - properties.writeToNBT(nbt, false); + properties.writeToNBT(nbt); nbt.setInteger("id", getId()); nbt.setInteger("launchposX", launchPosX); nbt.setInteger("launchposY", launchPosZ); diff --git a/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java b/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java index 03fe8c054..5e71bbd00 100644 --- a/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java +++ b/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java @@ -154,8 +154,8 @@ public ChunkProviderPlanet(World worldIn, long seed, boolean mapFeaturesEnabledI this.mapFeaturesEnabled = dimProps.canGenerateStructures() && ARConfiguration.getCurrentConfig().generateVanillaStructures; //TODO: may break on little planets - float atmDensity = ((WorldProviderPlanet) worldObj.provider).getAtmosphereDensity(new BlockPos(0, 0, 0)); - habitable = ((WorldProviderPlanet) worldObj.provider).getAtmosphere(new BlockPos(0, 0, 0)).isBreathable(); + float atmDensity = dimProps.getAtmosphereDensity() / 100f; // this fucking shit does not belong here -> ((WorldProviderPlanet) worldObj.provider).getAtmosphereDensity(new BlockPos(0, 0, 0)); + habitable = dimProps.getAtmosphere().isBreathable(); if (ARConfiguration.getCurrentConfig().generateCraters && dimProps.canGenerateCraters() && atmDensity <= 0.05) From d1f7c8ddc69db9e0719827510caae99d590743ae Mon Sep 17 00:00:00 2001 From: MrToffel Date: Mon, 8 Jul 2024 00:57:08 +0200 Subject: [PATCH 14/42] fully repaired mining drill --- .../advancedRocketry/api/ARConfiguration.java | 2 +- .../client/render/RenderLaser.java | 2 +- .../entity/EntityLaserNode.java | 13 +- .../inventory/ContainerOrbitalLaserDrill.java | 164 ----------- .../inventory/GuiOrbitalLaserDrill.java | 196 -------------- .../orbitallaserdrill/MiningDrill.java | 34 ++- .../TileOrbitalLaserDrill.java | 254 ++++++++++++------ 7 files changed, 199 insertions(+), 466 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java b/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java index 0c1601918..9c572b1d0 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java +++ b/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java @@ -355,7 +355,7 @@ public static void loadPreInit() { arConfig.crystalliserMaximumGravity = (float) config.get(Configuration.CATEGORY_GENERAL, "crystalliserMaximumGravity", 0f, "Maximum gravity the crystalliser will function at. Use 0.0 to disable!").getDouble(); arConfig.enableLaserDrill = config.get(Configuration.CATEGORY_GENERAL, "EnableLaserDrill", true, "Enables the laser drill machine").getBoolean(); arConfig.spaceLaserPowerMult = (float) config.get(Configuration.CATEGORY_GENERAL, "LaserDrillPowerMultiplier", 1d, "Power multiplier for the laser drill machine").getDouble(); - arConfig.laserDrillPlanet = config.get(Configuration.CATEGORY_GENERAL, "laserDrillPlanet", false, "If true the orbital laser will actually mine blocks on the planet below (currently not working)").getBoolean(); + arConfig.laserDrillPlanet = config.get(Configuration.CATEGORY_GENERAL, "laserDrillPlanet", false, "If true the orbital laser will actually mine blocks on the planet below").getBoolean(); String[] str = config.getStringList("spaceLaserDimIdBlackList", Configuration.CATEGORY_GENERAL, new String[]{}, "Laser drill will not mine these dimension"); arConfig.enableTerraforming = config.get(Configuration.CATEGORY_GENERAL, "EnableTerraforming", true, "Enables terraforming items and blocks").getBoolean(); arConfig.terraformSpeed = config.get(Configuration.CATEGORY_GENERAL, "terraformMult", 1f, "Multplier for atmosphere change speed").getDouble(); diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/RenderLaser.java b/src/main/java/zmaster587/advancedRocketry/client/render/RenderLaser.java index c2591aae0..42daa9a9b 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/RenderLaser.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/RenderLaser.java @@ -115,7 +115,7 @@ public void doRender(Particle entity, double x, double y, double z, GlStateManager.color(flareColor[0], flareColor[1], flareColor[2], flareColor[3]); for (int i = 0; i < 4; i++) { - RenderHelper.renderBottomFaceWithUV(buffer, -y + 200, -(i * 6) - x, -(i * 6) - z, (i * 6) - x, (i * 6) - z, 0, 1, 0, 1); + RenderHelper.renderBottomFaceWithUV(buffer, -y, -(i * 6) - x, -(i * 6) - z, (i * 6) - x, (i * 6) - z, 0, 1, 0, 1); } Tessellator.getInstance().draw(); diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityLaserNode.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityLaserNode.java index a88335917..03220988b 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityLaserNode.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityLaserNode.java @@ -59,18 +59,7 @@ public void setDead() { * Removes all the light blocks created by the laser */ private void cleanUp() { - if (!this.world.isRemote && this.isDead) - new Thread(() -> { - for (int h = 0; h < world.getHeight(); h++) { - for (int i = 0; i < 9; i++) { - int x = (int) posX + (i % 3) - 1; - int z = (int) posZ + (i / 3) - 1; - BlockPos pos = new BlockPos(x, h, z); - if (world.getBlockState(pos).getBlock() == AdvancedRocketryBlocks.blockLightSource) - world.setBlockToAir(pos); - } - } - }).start(); + } @Override diff --git a/src/main/java/zmaster587/advancedRocketry/inventory/ContainerOrbitalLaserDrill.java b/src/main/java/zmaster587/advancedRocketry/inventory/ContainerOrbitalLaserDrill.java index ca13db187..e69de29bb 100644 --- a/src/main/java/zmaster587/advancedRocketry/inventory/ContainerOrbitalLaserDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/inventory/ContainerOrbitalLaserDrill.java @@ -1,164 +0,0 @@ -package zmaster587.advancedRocketry.inventory; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.IContainerListener; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -import zmaster587.advancedRocketry.api.AdvancedRocketryItems; -import zmaster587.advancedRocketry.tile.multiblock.orbitallaserdrill.TileOrbitalLaserDrill; -import zmaster587.libVulpes.gui.SlotSingleItem; - -import javax.annotation.Nonnull; - -public class ContainerOrbitalLaserDrill extends Container { - - private TileOrbitalLaserDrill laserTile; - private boolean finished, jammed; - private int prevEnergy = 0, prevLaserX = 0, prevLaserZ = 0, buildingX, buildingZ; - private TileOrbitalLaserDrill.MODE currMode; - - ContainerOrbitalLaserDrill(InventoryPlayer inventoryPlayer, TileOrbitalLaserDrill tile) { - super(); - laserTile = tile; - - addSlotToContainer(new SlotSingleItem(tile, 0, 56, 54, AdvancedRocketryItems.itemLens)); - - // Player inventory - for (int i1 = 0; i1 < 3; i1++) { - for (int l1 = 0; l1 < 9; l1++) { - addSlotToContainer(new Slot(inventoryPlayer, l1 + i1 * 9 + 9, 8 + l1 * 18, 89 + i1 * 18)); - } - } - // Player hotbar - for (int j1 = 0; j1 < 9; j1++) { - addSlotToContainer(new Slot(inventoryPlayer, j1, 8 + j1 * 18, 147)); - } - - currMode = laserTile.getMode(); - jammed = false; - finished = false; - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - if (laserTile.getBatteries().getUniversalEnergyStored() != prevEnergy) { - prevEnergy = laserTile.getBatteries().getUniversalEnergyStored(); - for (IContainerListener listener : this.listeners) { - listener.sendWindowProperty(this, 0, prevEnergy / 100); - } - } - - if (laserTile.laserX != prevLaserX) { - prevLaserX = laserTile.laserX; - - - for (IContainerListener listener : this.listeners) { - listener.sendWindowProperty(this, 1, prevLaserX & 65535); - - int j = prevLaserX >>> 16; - //if(j != 0) - listener.sendWindowProperty(this, 2, j); - } - } - - if (laserTile.laserZ != prevLaserZ) { - prevLaserZ = laserTile.laserZ; - - for (IContainerListener listener : this.listeners) { - listener.sendWindowProperty(this, 3, prevLaserZ & 65535); - - int j = prevLaserZ >>> 16; - //if(j != 0) - listener.sendWindowProperty(this, 4, j); - } - } - if (currMode.compareTo(laserTile.getMode()) != 0) { - for (IContainerListener listener : this.listeners) { - listener.sendWindowProperty(this, 5, laserTile.getMode().ordinal()); - } - } - if (jammed != laserTile.isJammed()) { - jammed = laserTile.isJammed(); - for (IContainerListener listener : this.listeners) { - listener.sendWindowProperty(this, 6, laserTile.isJammed() ? 1 : 0); - } - } - if (finished != laserTile.isFinished()) { - finished = laserTile.isFinished(); - for (IContainerListener listener : this.listeners) { - listener.sendWindowProperty(this, 7, laserTile.isFinished() ? 1 : 0); - } - } - } - - @Override - public void updateProgressBar(int id, int value) { - if (id == 0) { - laserTile.setEnergy(value * 100); - } else if (id == 1) { - buildingX = value; - } else if (id == 2) { - buildingX |= value << 16; - laserTile.laserX = buildingX; - buildingX = 0; - } else if (id == 3) { - buildingZ = value; - } else if (id == 4) { - buildingZ |= value << 16; - laserTile.laserZ = buildingZ; - buildingZ = 0; - } else if (id == 5) { - laserTile.setMode(TileOrbitalLaserDrill.MODE.values()[value]); - } else if (id == 6) - laserTile.setJammed(value == 1); - else if (id == 7) - laserTile.setFinished(value == 1); - } - - @Override - @Nonnull - public ItemStack transferStackInSlot(EntityPlayer player, int slot) { - ItemStack stack = ItemStack.EMPTY; - Slot slotObject = inventorySlots.get(slot); - //null checks and checks if the item can be stacked (maxStackSize > 1) - if (slotObject != null && slotObject.getHasStack()) { - - ItemStack stackInSlot = slotObject.getStack(); - stack = stackInSlot.copy(); - - //merges the item into player inventory since its in the tileEntity - if (slot == 0) { - if (!this.mergeItemStack(stackInSlot, 1, 35, true)) { - return ItemStack.EMPTY; - } - } - //placing it into the tileEntity is possible since its in the player inventory - //check to make sure it's valid for the slot - else if (!laserTile.isItemValidForSlot(0, stack) || !this.mergeItemStack(stackInSlot, 0, 1, false)) { - return ItemStack.EMPTY; - } - - if (stackInSlot.getCount() == 0) { - slotObject.putStack(ItemStack.EMPTY); - } else { - slotObject.onSlotChanged(); - } - - if (stackInSlot.getCount() == stack.getCount()) { - return ItemStack.EMPTY; - } - slotObject.onTake(player, stackInSlot); - } - - return stack; - } - - - @Override - public boolean canInteractWith(@Nonnull EntityPlayer entityplayer) { - return laserTile.isUsableByPlayer(entityplayer); - } -} diff --git a/src/main/java/zmaster587/advancedRocketry/inventory/GuiOrbitalLaserDrill.java b/src/main/java/zmaster587/advancedRocketry/inventory/GuiOrbitalLaserDrill.java index 7dbd55da1..e69de29bb 100644 --- a/src/main/java/zmaster587/advancedRocketry/inventory/GuiOrbitalLaserDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/inventory/GuiOrbitalLaserDrill.java @@ -1,196 +0,0 @@ -package zmaster587.advancedRocketry.inventory; - -import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiTextField; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.ResourceLocation; -import org.lwjgl.input.Keyboard; -import zmaster587.advancedRocketry.tile.multiblock.orbitallaserdrill.TileOrbitalLaserDrill; -import zmaster587.libVulpes.gui.GuiImageButton; -import zmaster587.libVulpes.network.PacketHandler; -import zmaster587.libVulpes.network.PacketMachine; - -import java.io.IOException; -import java.util.LinkedList; - -/** - * @author zmaster587 - */ -public class GuiOrbitalLaserDrill extends GuiContainer { - - private ResourceLocation backdrop = new ResourceLocation("advancedrocketry", "textures/gui/LaserTile.png"); - private TileOrbitalLaserDrill laserTile; - private int prevX, prevZ; - - private GuiTextField xbox, ybox; - private GuiImageButton modeUp, modeDown; - - public GuiOrbitalLaserDrill(InventoryPlayer inventoryPlayer, TileOrbitalLaserDrill tile) { - super(new ContainerOrbitalLaserDrill(inventoryPlayer, tile)); - laserTile = tile; - } - - //TODO: enter button - @Override - public void initGui() { - super.initGui(); - - int x = (width - xSize) / 2; - int y = (height - ySize) / 2; - - //Create and setup the textboxes - xbox = new GuiTextField(0, this.fontRenderer, x + 113, y + 31, 50, 10); - ybox = new GuiTextField(1, this.fontRenderer, x + 113, y + 41, 50, 10); - xbox.setMaxStringLength(15); - xbox.setEnableBackgroundDrawing(true); - xbox.setFocused(true); - xbox.setCanLoseFocus(true); - xbox.setEnabled(true); - ybox.setMaxStringLength(15); - ybox.setEnableBackgroundDrawing(true); - ybox.setFocused(false); - ybox.setCanLoseFocus(true); - ybox.setEnabled(true); - - modeDown = new GuiImageButton(0, x + 103, y + 20, 5, 8, zmaster587.libVulpes.inventory.TextureResources.buttonLeft); - modeUp = new GuiImageButton(1, x + 157, y + 20, 5, 8, zmaster587.libVulpes.inventory.TextureResources.buttonRight); - this.buttonList.add(modeUp); - this.buttonList.add(modeDown); - this.buttonList.add(new GuiButton(2, x + 103, y + 62, 34, 20, "Reset")); - } - - @Override - protected void keyTyped(char par1, int par2) throws IOException { - //Don't let players change the coords while the machine is running - if (!laserTile.isRunning()) { - if (Character.isDigit(par1) || par1 == '-' || par2 == Keyboard.KEY_BACK || par2 == Keyboard.KEY_DELETE || par2 == Keyboard.KEY_LEFT || par2 == Keyboard.KEY_RIGHT) { - if (xbox.isFocused() && (par1 != '-' || (xbox.getCursorPosition() == 0 && !xbox.getText().startsWith("-")))) { - xbox.textboxKeyTyped(par1, par2); - - if (!xbox.getText().isEmpty() && !xbox.getText().contentEquals("-")) - laserTile.laserX = Integer.parseInt(xbox.getText()); - - PacketHandler.sendToServer(new PacketMachine(laserTile, (byte) 0)); - } else if (ybox.isFocused() && (par1 != '-' || (ybox.getCursorPosition() == 0 && !ybox.getText().startsWith("-")))) { - ybox.textboxKeyTyped(par1, par2); - if (!ybox.getText().isEmpty() && !ybox.getText().contentEquals("-")) - laserTile.laserZ = Integer.parseInt(ybox.getText()); - - PacketHandler.sendToServer(new PacketMachine(laserTile, (byte) 1)); - } - } - } - - if (par2 == Keyboard.KEY_TAB) { - if (xbox.isFocused()) { - xbox.setFocused(false); - ybox.setFocused(true); - } else if (ybox.isFocused()) { - xbox.setFocused(true); - ybox.setFocused(false); - } - } - - super.keyTyped(par1, par2); - } - - //Overridden so the mouse works properly - @Override - protected void actionPerformed(GuiButton guiButton) { - //TODO: debug - if (guiButton.id == 0) { - laserTile.decrementMode(); - } else if (guiButton.id == 1) { - laserTile.incrementMode(); - } else if (guiButton.id == 2) { - PacketHandler.sendToServer(new PacketMachine(laserTile, (byte) 4)); - return; - } else - return; - - if (!laserTile.isRunning()) - PacketHandler.sendToServer(new PacketMachine(laserTile, (byte) 3)); - } - - @Override - public void drawScreen(int a, int b, float c) { - super.drawScreen(a, b, c); - //Don't bother updating unless somthing has changed - if (laserTile.laserX != prevX) { - xbox.setText(String.valueOf(laserTile.laserX)); - prevX = laserTile.laserX; - } - if (laserTile.laserZ != prevZ) { - ybox.setText(String.valueOf(laserTile.laserZ)); - prevZ = laserTile.laserZ; - } - xbox.drawTextBox(); - ybox.drawTextBox(); - - int x = (width - xSize) / 2, y = (height - ySize) / 2; - - if (a > x + 11 && a < x + 27 && b < y + 85 && b > y + 43) { - LinkedList text = new LinkedList<>(); - text.add(laserTile.getBatteries().getUniversalEnergyStored() + " / " + laserTile.getBatteries().getMaxEnergyStored() + " RF"); - this.drawHoveringText(text, a, b, this.fontRenderer); - } - - //Buttons don't need to be drawn because that is taken care of by super - } - - /** - * Args: x, y, buttonClicked - * - * @throws IOException - */ - @Override - public void mouseClicked(int xPos, int yPos, int par3) throws IOException { - //Make sure we can focus the textboxes - int x = (width - xSize) / 2, y = (height - ySize) / 2; - if (!xbox.isFocused() && yPos < y + 40 && yPos > y + 31 && xPos < x + 163 && xPos > x + 113) { - xbox.setFocused(true); - ybox.setFocused(false); - } - - if (!ybox.isFocused() && yPos < y + 50 && yPos > y + 41 && xPos < x + 163 && xPos > x + 113) { - ybox.setFocused(true); - xbox.setFocused(false); - } - - super.mouseClicked(xPos, yPos, par3); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { - this.mc.renderEngine.bindTexture(backdrop); - //get starting X and Y for the interface - int x = (width - xSize) / 2, y = (height - ySize) / 2; - this.drawTexturedModalRect(x, y, 0, 0, 176, 171); - - //Render the energy bar only if energy exists - if (laserTile.hasEnergy()) { - int offset = laserTile.getEnergyPercentScaled(42); - this.drawTexturedModalRect(x + 11, y + 85 - offset, 176, 42 - offset, 16, offset); - } - - //Display status - if (laserTile.isFinished() || laserTile.getStackInSlot(0).isEmpty()) - this.drawTexturedModalRect(x + 145, y + 64, 32, 171, 16, 16); - else if (laserTile.isRunning() || laserTile.isJammed()) - this.drawTexturedModalRect(x + 145, y + 64, 16, 171, 16, 16); - else - this.drawTexturedModalRect(x + 145, y + 64, 0, 171, 16, 16); - - //Draw labels next to the input boxes - this.drawString(this.fontRenderer, "X:", x + 103, y + 31, 0xffffff); - this.drawString(this.fontRenderer, "Y:", x + 103, y + 41, 0xffffff); - - //Draw jamming indicator if jammed - if (laserTile.isJammed()) - this.drawString(this.fontRenderer, "Jam!", x + 143, y + 68, 0xffffff); - - //Draw mode indicator - this.drawCenteredString(this.fontRenderer, laserTile.getMode().toString(), x + 130, y + 20, 0xffffff); - } -} diff --git a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/MiningDrill.java b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/MiningDrill.java index cdab4cff9..ff55759a2 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/MiningDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/MiningDrill.java @@ -2,11 +2,13 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; import net.minecraftforge.common.ForgeChunkManager; import net.minecraftforge.common.MinecraftForge; import zmaster587.advancedRocketry.AdvancedRocketry; @@ -14,6 +16,9 @@ import zmaster587.advancedRocketry.entity.EntityLaserNode; import zmaster587.advancedRocketry.event.BlockBreakEvent; +import java.util.ArrayList; +import java.util.List; + class MiningDrill extends AbstractDrill { protected boolean finished; @@ -27,7 +32,7 @@ class MiningDrill extends AbstractDrill { ItemStack[] performOperation() { - ItemStack[] stacks = new ItemStack[0]; + ArrayList stacks = new ArrayList<>(); for (int i = 0; i < 9; i++) { int x = (int) laser.posX + (i % 3) - 1; @@ -41,10 +46,19 @@ ItemStack[] performOperation() { if (event.isCanceled()) continue; + /* What is this shit? if (state == Blocks.AIR.getDefaultState() || state.getMaterial().isReplaceable() || state.getMaterial().isLiquid()) { laser.world.setBlockState(laserPos, AdvancedRocketryBlocks.blockLightSource.getDefaultState()); continue; } + */ + if (state.getMaterial().isReplaceable() || state.getMaterial().isLiquid()) { + laser.world.setBlockState(laserPos, Blocks.AIR.getDefaultState()); + continue; + } + if (state == Blocks.AIR.getDefaultState()){ + continue; + } NonNullList items = NonNullList.create(); state.getBlock().getDrops(items, laser.world, laserPos, state, 0); @@ -55,14 +69,13 @@ ItemStack[] performOperation() { if (items.isEmpty()) { - laser.world.setBlockState(laserPos, AdvancedRocketryBlocks.blockLightSource.getDefaultState()); + laser.world.setBlockState(laserPos, Blocks.AIR.getDefaultState()); continue; } - stacks = new ItemStack[items.size()]; - stacks = items.toArray(stacks); + stacks.addAll(items); - laser.world.setBlockState(laserPos, AdvancedRocketryBlocks.blockLightSource.getDefaultState()); + laser.world.setBlockState(laserPos, Blocks.AIR.getDefaultState()); } boolean blockInWay = false; @@ -98,26 +111,27 @@ ItemStack[] performOperation() { } } while (!blockInWay); - return stacks; + return stacks.toArray(new ItemStack[0]); } boolean activate(World world, int x, int z) { ticketLaser = ForgeChunkManager.requestTicket(AdvancedRocketry.instance, world, ForgeChunkManager.Type.NORMAL); if (ticketLaser != null) { - ForgeChunkManager.forceChunk(ticketLaser, new ChunkPos(x >> 4, z >> 4)); + Chunk chunk = world.getChunkFromBlockCoords(new BlockPos (x,0,z)); // force the chunk to generate + System.out.println("pos"+x+":"+z); + System.out.println("chunkpos"+chunk.x+":"+chunk.z); + ForgeChunkManager.forceChunk(ticketLaser, new ChunkPos(chunk.x, chunk.z)); int y = 64; - if (world.getChunkFromChunkCoords(x >> 4, z >> 4).isLoaded()) { int current; for (int i = 0; i < 9; i++) { current = world.getTopSolidOrLiquidBlock(new BlockPos(x + (i % 3) - 1, 0xFF, z + (i / 3) - 1)).getY(); if (current > y) y = current; } - } else - y = 255; + laser = new EntityLaserNode(world, x, y, z); laser.markValid(); diff --git a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java index 483b9d39f..b85db52c6 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java @@ -3,11 +3,13 @@ import io.netty.buffer.ByteBuf; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -20,6 +22,7 @@ import net.minecraftforge.common.ForgeChunkManager.Type; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.items.CapabilityItemHandler; import zmaster587.advancedRocketry.AdvancedRocketry; import zmaster587.advancedRocketry.api.ARConfiguration; import zmaster587.advancedRocketry.api.AdvancedRocketryBlocks; @@ -39,9 +42,12 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.awt.*; import java.util.LinkedList; import java.util.List; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.items.IItemHandler; public class TileOrbitalLaserDrill extends TileMultiPowerConsumer implements ISidedInventory, IGuiCallback, IButtonInventory { @@ -49,6 +55,7 @@ public class TileOrbitalLaserDrill extends TileMultiPowerConsumer implements ISi private final AbstractDrill drill; public int laserX, laserZ, tickSinceLastOperation; protected boolean isRunning, finished, isJammed; + private ModuleButton resetBtn; Object[][][] structure = new Object[][][]{ { {null, null, null, null, null, null, null, null, null, null, null}, @@ -85,13 +92,13 @@ public class TileOrbitalLaserDrill extends TileMultiPowerConsumer implements ISi }, }; private ItemStack lens; - private int radius, xCenter, yCenter, numSteps; + public int radius, xCenter, yCenter, numSteps; private EnumFacing prevDir; private ModuleTextBox locationX, locationZ; - private ModuleText updateText; + private ModuleText updateText, positionText; private MultiInventory inv; private MODE mode; - private Ticket ticket; + //private Ticket ticket; // this is useless anyway because it would not load the energy supply system and the laser would run out of energy public TileOrbitalLaserDrill() { super(); @@ -102,7 +109,11 @@ public TileOrbitalLaserDrill() { yCenter = 0; numSteps = 0; prevDir = null; - + resetBtn = new ModuleButton(40, 20, 2, LibVulpes.proxy.getLocalizedString("msg.spacelaser.reset"), this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild, 34, 20); + positionText = new ModuleText(103, 63, "empty... shit!", 0x0b0b0b); + updateText = new ModuleText(103, 63, "also empty...", 0x0b0b0b); + locationX = new ModuleNumericTextbox(this, 113, 31, 50, 10, 16); + locationZ = new ModuleNumericTextbox(this, 113, 41, 50, 10, 16); tickSinceLastOperation = 0; laserX = 0; laserZ = 0; @@ -143,37 +154,57 @@ public String getMachineName() { } /* - * ID 0: client changed xcoord in interface - * ID 1: client changed zcoord in interface * ID 2: sync whether the machine is running - * ID 3: sync Mode - * ID 4: jam reset + * ID 4: reset + * ID 1: send changes back to client + * ID 5 send only laser position to client + * ID 3: client requests update */ @Override public void writeDataToNetwork(ByteBuf out, byte id) { super.writeDataToNetwork(out, id); - if (id == 10) + if (id == 15) { out.writeInt(this.laserX); - else if (id == 11) out.writeInt(this.laserZ); + }else if (id == 11){ + out.writeInt(mode.ordinal()); + out.writeInt(this.xCenter); + out.writeInt(this.yCenter); + out.writeInt(this.laserX); + out.writeInt(this.laserZ); + } else if (id == 12) out.writeBoolean(isRunning); - else if (id == 13) + else if (id == 14){ out.writeInt(mode.ordinal()); + out.writeInt(this.xCenter); + out.writeInt(this.yCenter); + } } @Override public void readDataFromNetwork(ByteBuf in, byte id, NBTTagCompound nbt) { super.readDataFromNetwork(in, id, nbt); - if (id == 10) - nbt.setInteger("laserX", in.readInt()); - else if (id == 11) - nbt.setInteger("laserZ", in.readInt()); + if (id == 15){ + nbt.setInteger("currentX", in.readInt()); + nbt.setInteger("currentZ", in.readInt()); + } + else if (id == 11){ + nbt.setInteger("mode", in.readInt()); + nbt.setInteger("newX", in.readInt()); + nbt.setInteger("newZ", in.readInt()); + nbt.setInteger("currentX", in.readInt()); + nbt.setInteger("currentZ", in.readInt()); + } else if (id == 12) nbt.setBoolean("isRunning", in.readBoolean()); - else if (id == 13) + + else if (id == 14){ nbt.setInteger("mode", in.readInt()); + nbt.setInteger("newX", in.readInt()); + nbt.setInteger("newZ", in.readInt()); + } } @@ -182,27 +213,98 @@ public void useNetworkData(EntityPlayer player, Side side, byte id, NBTTagCompound nbt) { super.useNetworkData(player, side, id, nbt); - if (id == 10) { - this.laserX = nbt.getInteger("laserX"); - finished = false; - - if (mode == MODE.SPIRAL) - resetSpiral(); - } else if (id == 11) { - this.laserZ = nbt.getInteger("laserZ"); + if (id == 15) { + laserZ = nbt.getInteger("currentZ"); + laserX = nbt.getInteger("currentX"); + //positionText.setText("position:\n"+this.laserX+":"+this.laserZ); + }else if (id == 11){ + resetSpiral(); + mode = MODE.values()[nbt.getInteger("mode")]; + xCenter = nbt.getInteger("newX"); + yCenter = nbt.getInteger("newZ"); + laserZ = nbt.getInteger("currentZ"); + laserX = nbt.getInteger("currentX"); + //positionText.setText("position:\n"+this.laserX+":"+this.laserZ); + updateText.setText(this.getMode().toString()); + locationX.setText(String.valueOf(this.xCenter)); + locationZ.setText(String.valueOf(this.yCenter)); + //System.out.println("reset client:"+xCenter+":"+yCenter+":"+mode); + resetBtn.setColor(0xa0a0a0); + } + else if (id == 12) { + this.isRunning = nbt.getBoolean("isRunning"); + //System.out.println("is running: "+ isRunning); + } + else if (id == 14){ + resetSpiral(); + mode = MODE.values()[nbt.getInteger("mode")]; + xCenter = nbt.getInteger("newX"); + yCenter = nbt.getInteger("newZ"); + laserZ = yCenter; + laserX = xCenter; + //System.out.println("reset:"+xCenter+":"+yCenter+":"+mode); + // do all the reset stuff + if (drill != null) { + drill.deactivate(); + } finished = false; - if (mode == MODE.SPIRAL) - resetSpiral(); - } else if (id == 12) - this.isRunning = nbt.getBoolean("isRunning"); - else if (id == 13 && !isRunning()) - this.mode = MODE.values()[nbt.getInteger("mode")]; - else if (id == 14) - this.checkjam(); + setRunning(false); + checkjam(); + checkCanRun(); + //update clients on new data + PacketHandler.sendToNearby(new PacketMachine(this, (byte) 11), 128, pos, this.world.provider.getDimension()); + } + else if (id == 13) + //update clients on new data + PacketHandler.sendToNearby(new PacketMachine(this, (byte) 11), this.world.provider.getDimension(), pos, 128); markDirty(); } + public void transferItems(IInventory inventorySource, IItemHandler inventoryTarget) { + for (int i = 0; i < inventorySource.getSizeInventory(); i++) { + ItemStack stack = inventorySource.getStackInSlot(i).copy(); + + if (!stack.isEmpty()) { + for (int j = 0; j < inventoryTarget.getSlots(); j++) { + // Try to insert the item + ItemStack remaining = inventoryTarget.insertItem(j, stack, false); + + // If the entire stack was inserted, remove it from the source inventory + if (remaining.isEmpty()) { + inventorySource.decrStackSize(i, stack.getCount()); + break; + } + + // Otherwise, update the stack to the remaining amount + stack.setCount(remaining.getCount()); + } + } + } + } + + + + + public void outputItems() { + // Loop over each output hatch in your inventory + for (int ic = 0; ic < this.getItemOutPorts().size(); ic++) { + + IInventory inventory = itemOutPorts.get(ic); + if (inventory instanceof TileEntity) { + + + for (EnumFacing direction : EnumFacing.values()) { + TileEntity tileEntity = world.getTileEntity(((TileEntity) inventory).getPos().offset(direction)); + if (tileEntity != null) { + if (tileEntity.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY,null)){ + transferItems(inventory, tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY,null)); + } + } + } + } + } + } private void resetSpiral() { radius = 0; prevDir = null; @@ -216,9 +318,14 @@ public boolean isRunning() { } public void setRunning(boolean value) { + if (world.isRemote){ + System.out.println("client should not call setRunning"); + return; + } isRunning = value; + PacketHandler.sendToNearby(new PacketMachine(this, (byte) 12), this.world.provider.getDimension(), pos, 128); + markDirty(); - //worldObj.notifyBlockUpdate(pos, worldObj.getBlockState(pos), worldObj.getBlockState(pos), 3); } public boolean isFinished() { @@ -238,9 +345,6 @@ public void setMode(MODE m) { } public void incrementMode() { - if (mode == MODE.SPIRAL) - resetSpiral(); - int num = mode.ordinal(); num++; @@ -251,9 +355,6 @@ public void incrementMode() { } public void decrementMode() { - if (mode == MODE.SPIRAL) - resetSpiral(); - int num = mode.ordinal(); num--; @@ -300,6 +401,10 @@ public void update() { this.tickSinceLastOperation = 0; } + if(!this.inv.isEmpty()){ + outputItems(); + } + } if (this.drill.isFinished()) { @@ -311,11 +416,7 @@ public void update() { this.finished = true; if (this.world.getStrongPower(getPos()) != 0) { - if (this.mode == MODE.LINE_X) { - this.laserX += 3; - } else if (this.mode == MODE.LINE_Z) { - this.laserZ += 3; - } else if (this.mode == MODE.SPIRAL) { + if (this.mode == MODE.SPIRAL) { this.numSteps++; if (this.radius < this.numSteps) { this.numSteps = 0; @@ -334,6 +435,8 @@ else if (prevDir == EnumFacing.EAST) { this.laserX += 3 * prevDir.getFrontOffsetX(); this.laserZ += 3 * prevDir.getFrontOffsetZ(); + PacketHandler.sendToNearby(new PacketMachine(this, (byte) 11), this.world.provider.getDimension(), pos,128); + } } } @@ -351,7 +454,7 @@ public void onDestroy() { if (this.drill != null) { this.drill.deactivate(); } - ForgeChunkManager.releaseTicket(ticket); + //ForgeChunkManager.releaseTicket(ticket); } @Override @@ -366,16 +469,12 @@ public void onChunkUnload() { public SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound nbt = new NBTTagCompound(); this.writeToNBT(nbt); - - nbt.setBoolean("IsRunning", isRunning); - return new SPacketUpdateTileEntity(getPos(), 0, nbt); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { this.readFromNBT(pkt.getNbtCompound()); - isRunning = pkt.getNbtCompound().getBoolean("IsRunning"); } @Override @@ -388,6 +487,7 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt.setTag("GlassPane", tag); } + nbt.setBoolean("isRunning", isRunning); nbt.setInteger("laserX", laserX); nbt.setInteger("laserZ", laserZ); nbt.setByte("mode", (byte) mode.ordinal()); @@ -407,6 +507,9 @@ public NBTTagCompound writeToNBT(NBTTagCompound nbt) { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); + + isRunning = nbt.getBoolean("isRunning"); + if (nbt.hasKey("GlassPane")) { NBTTagCompound tag = nbt.getCompoundTag("GlassPane"); lens = new ItemStack(tag); @@ -461,16 +564,13 @@ private boolean unableToRun() { * Checks to see if the situation for firing the laser exists... and changes the state accordingly */ public void checkCanRun() { + if (world.isRemote)return; // client has no business here + //Laser requires lense, redstone power, not be jammed, and be in orbit and energy to function if (this.finished || this.isJammed || world.isBlockIndirectlyGettingPowered(getPos()) == 0 || unableToRun()) { if (isRunning) { drill.deactivate(); setRunning(false); - if (!this.world.isRemote) { - PacketHandler.sendToNearby(new PacketMachine(this, (byte) 12), 128, pos, this.world.provider.getDimension()); - IBlockState state = world.getBlockState(getPos()); - world.notifyBlockUpdate(pos, state, state, 2); - } } } else if (world.isBlockIndirectlyGettingPowered(getPos()) > 0) { @@ -488,18 +588,13 @@ public void checkCanRun() { } - if (ticket == null) { - ticket = ForgeChunkManager.requestTicket(AdvancedRocketry.instance, this.world, Type.NORMAL); - if (ticket != null) - ForgeChunkManager.forceChunk(ticket, new ChunkPos(getPos().getX() / 16 - (getPos().getX() < 0 ? 1 : 0), getPos().getZ() / 16 - (getPos().getZ() < 0 ? 1 : 0))); - } + //if (ticket == null) { + // ticket = ForgeChunkManager.requestTicket(AdvancedRocketry.instance, this.world, Type.NORMAL); + // if (ticket != null) + // ForgeChunkManager.forceChunk(ticket, new ChunkPos(getPos().getX() / 16 - (getPos().getX() < 0 ? 1 : 0), getPos().getZ() / 16 - (getPos().getZ() < 0 ? 1 : 0))); + //} if (!isRunning) { setRunning(drill.activate(orbitWorld, laserX, laserZ)); - if (!this.world.isRemote) { - PacketHandler.sendToNearby(new PacketMachine(this, (byte) 12), 128, pos, this.world.provider.getDimension()); - IBlockState state = world.getBlockState(getPos()); - world.notifyBlockUpdate(pos, state, state, 2); - } } } @@ -651,18 +746,15 @@ public boolean hasCustomName() { @Override public void onModuleUpdated(ModuleBase module) { - + resetBtn.setColor(0x60a060); if (module == locationX) { if (!((ModuleTextBox) module).getText().isEmpty() && !((ModuleTextBox) module).getText().contentEquals("-")) - laserX = Integer.parseInt(((ModuleTextBox) module).getText()); - PacketHandler.sendToServer(new PacketMachine(this, (byte) 10)); + xCenter = Integer.parseInt(((ModuleTextBox) module).getText()); } else if (module == locationZ) { if (!((ModuleTextBox) module).getText().isEmpty() && !((ModuleTextBox) module).getText().contentEquals("-")) - laserZ = Integer.parseInt(((ModuleTextBox) module).getText()); - PacketHandler.sendToServer(new PacketMachine(this, (byte) 11)); + yCenter = Integer.parseInt(((ModuleTextBox) module).getText()); } - } @Override @@ -670,26 +762,29 @@ public List getModules(int id, EntityPlayer player) { List modules = new LinkedList<>(); if (world.isRemote) { - modules.add(locationX = new ModuleNumericTextbox(this, 113, 31, 50, 10, 16)); - modules.add(locationZ = new ModuleNumericTextbox(this, 113, 41, 50, 10, 16)); + //request update on information + PacketHandler.sendToServer(new PacketMachine(this, (byte) 13)); + modules.add(locationX); + modules.add(locationZ); - locationX.setText(String.valueOf(this.laserX)); - locationZ.setText(String.valueOf(this.laserZ)); + locationX.setText(String.valueOf(this.xCenter)); + locationZ.setText(String.valueOf(this.yCenter)); modules.add(updateText = new ModuleText(130, 20, this.getMode().toString(), 0x0b0b0b, true)); modules.add(new ModuleText(103, 33, "X:", 0x0b0b0b)); modules.add(new ModuleText(103, 43, "Z:", 0x0b0b0b)); + modules.add(positionText); + modules.add(new ModuleImage(8, 16, TextureResources.laserGuiBG)); } modules.add(new ModuleButton(103, 20, 0, "", this, zmaster587.libVulpes.inventory.TextureResources.buttonLeft, 5, 8)); modules.add(new ModuleButton(157, 20, 1, "", this, zmaster587.libVulpes.inventory.TextureResources.buttonRight, 5, 8)); - modules.add(new ModuleButton(103, 62, 2, LibVulpes.proxy.getLocalizedString("msg.spacelaser.reset"), this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild, 34, 20)); + modules.add(resetBtn); modules.add(new ModulePower(11, 25, batteries)); modules.add(new ModuleSlotArray(56, 54, this, 0, 1)); - return modules; } @@ -705,7 +800,7 @@ public boolean canInteractWithContainer(EntityPlayer entity) { @Override public void onInventoryButtonPressed(int buttonId) { - + resetBtn.setColor(0x60a060); if (buttonId == 0) { this.decrementMode(); updateText.setText(this.getMode().toString()); @@ -717,9 +812,6 @@ public void onInventoryButtonPressed(int buttonId) { return; } else return; - - if (!this.isRunning()) - PacketHandler.sendToServer(new PacketMachine(this, (byte) 13)); } @Override @@ -750,8 +842,6 @@ public void clear() { public enum MODE { SINGLE, - LINE_X, - LINE_Z, SPIRAL } } \ No newline at end of file From 755cfd2731c7790a7495e32d7bed7d70b20c00eb Mon Sep 17 00:00:00 2001 From: MrToffel Date: Mon, 8 Jul 2024 01:09:39 +0200 Subject: [PATCH 15/42] last bugfix --- .../orbitallaserdrill/TileOrbitalLaserDrill.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java index b85db52c6..042294b6a 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java @@ -216,7 +216,7 @@ public void useNetworkData(EntityPlayer player, Side side, byte id, if (id == 15) { laserZ = nbt.getInteger("currentZ"); laserX = nbt.getInteger("currentX"); - //positionText.setText("position:\n"+this.laserX+":"+this.laserZ); + positionText.setText("position:\n"+this.laserX+":"+this.laserZ); }else if (id == 11){ resetSpiral(); mode = MODE.values()[nbt.getInteger("mode")]; @@ -224,12 +224,12 @@ public void useNetworkData(EntityPlayer player, Side side, byte id, yCenter = nbt.getInteger("newZ"); laserZ = nbt.getInteger("currentZ"); laserX = nbt.getInteger("currentX"); - //positionText.setText("position:\n"+this.laserX+":"+this.laserZ); + positionText.setText("position:\n"+this.laserX+":"+this.laserZ); updateText.setText(this.getMode().toString()); locationX.setText(String.valueOf(this.xCenter)); locationZ.setText(String.valueOf(this.yCenter)); //System.out.println("reset client:"+xCenter+":"+yCenter+":"+mode); - resetBtn.setColor(0xa0a0a0); + resetBtn.setColor(0xf0f0f0); } else if (id == 12) { this.isRunning = nbt.getBoolean("isRunning"); @@ -435,7 +435,7 @@ else if (prevDir == EnumFacing.EAST) { this.laserX += 3 * prevDir.getFrontOffsetX(); this.laserZ += 3 * prevDir.getFrontOffsetZ(); - PacketHandler.sendToNearby(new PacketMachine(this, (byte) 11), this.world.provider.getDimension(), pos,128); + PacketHandler.sendToNearby(new PacketMachine(this, (byte) 15), this.world.provider.getDimension(), pos,128); } } @@ -746,7 +746,7 @@ public boolean hasCustomName() { @Override public void onModuleUpdated(ModuleBase module) { - resetBtn.setColor(0x60a060); + resetBtn.setColor(0x90ff90); if (module == locationX) { if (!((ModuleTextBox) module).getText().isEmpty() && !((ModuleTextBox) module).getText().contentEquals("-")) xCenter = Integer.parseInt(((ModuleTextBox) module).getText()); @@ -800,7 +800,8 @@ public boolean canInteractWithContainer(EntityPlayer entity) { @Override public void onInventoryButtonPressed(int buttonId) { - resetBtn.setColor(0x60a060); + if (buttonId!=2) + resetBtn.setColor(0x90ff90); if (buttonId == 0) { this.decrementMode(); updateText.setText(this.getMode().toString()); From 114829a07dce47d4791b712d99226725bd29d183 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Mon, 8 Jul 2024 01:13:38 +0200 Subject: [PATCH 16/42] and another bugfix --- .../multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java index 042294b6a..ba92208e1 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java @@ -252,7 +252,7 @@ else if (id == 14){ checkjam(); checkCanRun(); //update clients on new data - PacketHandler.sendToNearby(new PacketMachine(this, (byte) 11), 128, pos, this.world.provider.getDimension()); + PacketHandler.sendToNearby(new PacketMachine(this, (byte) 11), this.world.provider.getDimension(), pos, 128); } else if (id == 13) //update clients on new data From e8d71651f07b92685418743ae0cd901384dfa6e1 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Mon, 8 Jul 2024 01:17:12 +0200 Subject: [PATCH 17/42] little improvements --- .../TileOrbitalLaserDrill.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java index ba92208e1..42dcce51c 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java @@ -110,10 +110,10 @@ public TileOrbitalLaserDrill() { numSteps = 0; prevDir = null; resetBtn = new ModuleButton(40, 20, 2, LibVulpes.proxy.getLocalizedString("msg.spacelaser.reset"), this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild, 34, 20); - positionText = new ModuleText(103, 63, "empty... shit!", 0x0b0b0b); - updateText = new ModuleText(103, 63, "also empty...", 0x0b0b0b); - locationX = new ModuleNumericTextbox(this, 113, 31, 50, 10, 16); - locationZ = new ModuleNumericTextbox(this, 113, 41, 50, 10, 16); + positionText = new ModuleText(83, 63, "empty... shit!", 0x0b0b0b); + updateText = new ModuleText(83, 63, "also empty...", 0x0b0b0b); + locationX = new ModuleNumericTextbox(this, 93, 31, 50, 10, 16); + locationZ = new ModuleNumericTextbox(this, 93, 41, 50, 10, 16); tickSinceLastOperation = 0; laserX = 0; laserZ = 0; @@ -216,7 +216,7 @@ public void useNetworkData(EntityPlayer player, Side side, byte id, if (id == 15) { laserZ = nbt.getInteger("currentZ"); laserX = nbt.getInteger("currentX"); - positionText.setText("position:\n"+this.laserX+":"+this.laserZ); + positionText.setText("position:\n"+this.laserX+" : "+this.laserZ); }else if (id == 11){ resetSpiral(); mode = MODE.values()[nbt.getInteger("mode")]; @@ -224,7 +224,7 @@ public void useNetworkData(EntityPlayer player, Side side, byte id, yCenter = nbt.getInteger("newZ"); laserZ = nbt.getInteger("currentZ"); laserX = nbt.getInteger("currentX"); - positionText.setText("position:\n"+this.laserX+":"+this.laserZ); + positionText.setText("position:\n"+this.laserX+" : "+this.laserZ); updateText.setText(this.getMode().toString()); locationX.setText(String.valueOf(this.xCenter)); locationZ.setText(String.valueOf(this.yCenter)); @@ -770,17 +770,17 @@ public List getModules(int id, EntityPlayer player) { locationX.setText(String.valueOf(this.xCenter)); locationZ.setText(String.valueOf(this.yCenter)); - modules.add(updateText = new ModuleText(130, 20, this.getMode().toString(), 0x0b0b0b, true)); - modules.add(new ModuleText(103, 33, "X:", 0x0b0b0b)); - modules.add(new ModuleText(103, 43, "Z:", 0x0b0b0b)); + modules.add(updateText = new ModuleText(110, 20, this.getMode().toString(), 0x0b0b0b, true)); + modules.add(new ModuleText(83, 33, "X:", 0x0b0b0b)); + modules.add(new ModuleText(83, 43, "Z:", 0x0b0b0b)); modules.add(positionText); modules.add(new ModuleImage(8, 16, TextureResources.laserGuiBG)); } - modules.add(new ModuleButton(103, 20, 0, "", this, zmaster587.libVulpes.inventory.TextureResources.buttonLeft, 5, 8)); - modules.add(new ModuleButton(157, 20, 1, "", this, zmaster587.libVulpes.inventory.TextureResources.buttonRight, 5, 8)); + modules.add(new ModuleButton(83, 20, 0, "", this, zmaster587.libVulpes.inventory.TextureResources.buttonLeft, 5, 8)); + modules.add(new ModuleButton(137, 20, 1, "", this, zmaster587.libVulpes.inventory.TextureResources.buttonRight, 5, 8)); modules.add(resetBtn); modules.add(new ModulePower(11, 25, batteries)); modules.add(new ModuleSlotArray(56, 54, this, 0, 1)); From 47ded854c33e5bb0a9b6cf30a07e0517f8612a0f Mon Sep 17 00:00:00 2001 From: MrToffel Date: Wed, 10 Jul 2024 02:09:46 +0200 Subject: [PATCH 18/42] bug fixes and improvements for drill & terraforming --- .../dimension/DimensionProperties.java | 12 +- .../Afuckinginterface.java | 8 +- .../clientlists.java | 16 +- .../dimensionTerraformingInfo.java | 6 +- .../serverlists.java | 15 +- .../orbitallaserdrill/MiningDrill.java | 4 +- .../TileOrbitalLaserDrill.java | 164 +----------------- .../satellite/TileTerraformingTerminal.java | 4 +- .../advancedRocketry/util/BiomeHandler.java | 81 ++++++--- .../util/TerraformingHelper.java | 26 ++- 10 files changed, 112 insertions(+), 224 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index 77fa47bb0..f2176c111 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -306,16 +306,12 @@ public void add_chunk_to_terraforming_list(Chunk chunk) { if (proxylists.gethelper(getId()) != null) { - boolean chunk_was_already_done = false; // do not add a chunk twice, the helper will manage it once it is added - for (ChunkPos i : proxylists.getChunksFullyTerraformed(getId())) { - if (chunk.x == i.x && chunk.z == i.z) { - chunk_was_already_done = true; - break; - } - } + boolean chunk_was_already_done = proxylists.getChunksFullyTerraformed(getId()).contains(new ChunkPos(chunk.x,chunk.z));; // do not add a chunk if it is already fully terraformed if (chunk_was_already_done) return; + //System.out.println("add chunk to terraforming list: "+chunk.x+":"+chunk.z); + chunkdata current_chunk = proxylists.gethelper(getId()).getChunkFromList(chunk.x, chunk.z); if (current_chunk == null || !current_chunk.chunk_fully_generated) { @@ -1677,7 +1673,7 @@ public void read_terraforming_data(NBTTagCompound nbt){ NBTTagList list = nbt.getTagList("fullyGeneratedChunks", NBT.TAG_COMPOUND); if (!list.hasNoTags()) - proxylists.setChunksFullyTerraformed(dimid, new ArrayList<>()); + proxylists.setChunksFullyTerraformed(dimid, new HashSet()); for (NBTBase entry : list) { assert entry instanceof NBTTagCompound; int x = ((NBTTagCompound) entry).getInteger("x"); diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java index 7c5e6a1bb..922b42118 100644 --- a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/Afuckinginterface.java @@ -5,6 +5,8 @@ import net.minecraft.util.math.ChunkPos; import zmaster587.advancedRocketry.util.TerraformingHelper; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; public interface Afuckinginterface { @@ -15,11 +17,11 @@ public interface Afuckinginterface { public List getProtectingBlocksForDimension(int dim); - public void setProtectingBlocksForDimension(int dim, List blocks); + public void setProtectingBlocksForDimension(int dim, ArrayList blocks); - public void setChunksFullyTerraformed(int dim, List lpos); + public void setChunksFullyTerraformed(int dim, HashSet lpos); - public List getChunksFullyTerraformed(int dim); + public HashSet getChunksFullyTerraformed(int dim); public void sethelper(int dim, TerraformingHelper helper); diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java index 2677d0b3b..321218736 100644 --- a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/clientlists.java @@ -3,12 +3,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import zmaster587.advancedRocketry.util.TerraformingHelper; -import zmaster587.advancedRocketry.fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage.dimensionTerraformingInfo; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class clientlists implements Afuckinginterface { Map terraforminginfolists; @@ -19,11 +15,11 @@ public clientlists(){ public void initdim(int dim){ if (terraforminginfolists.get(dim) != null){ - terraforminginfolists.get(dim).terraformingChunksDone = new ArrayList<>(); + terraforminginfolists.get(dim).terraformingChunksDone = new HashSet<>(); terraforminginfolists.get(dim).terraformingProtectedBlocks = new ArrayList<>(); }else{ dimensionTerraformingInfo info = new dimensionTerraformingInfo(); - info.terraformingChunksDone = new ArrayList<>(); + info.terraformingChunksDone = new HashSet<>(); info.terraformingProtectedBlocks = new ArrayList<>(); terraforminginfolists.put(dim,info); } @@ -35,16 +31,16 @@ public List getProtectingBlocksForDimension(int dim){ if (terraforminginfolists.get(dim) == null)return null; return terraforminginfolists.get(dim).terraformingProtectedBlocks; } - public void setProtectingBlocksForDimension(int dim, List blocks){ + public void setProtectingBlocksForDimension(int dim, ArrayList blocks){ if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingProtectedBlocks = blocks; } - public void setChunksFullyTerraformed(int dim, List lpos){ + public void setChunksFullyTerraformed(int dim, HashSet lpos){ if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingChunksDone = lpos; } - public List getChunksFullyTerraformed(int dim){ + public HashSet getChunksFullyTerraformed(int dim){ if (terraforminginfolists.get(dim) == null)return null; return terraforminginfolists.get(dim).terraformingChunksDone; } diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/dimensionTerraformingInfo.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/dimensionTerraformingInfo.java index c42d8f916..4ae5daf53 100644 --- a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/dimensionTerraformingInfo.java +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/dimensionTerraformingInfo.java @@ -4,11 +4,13 @@ import net.minecraft.util.math.ChunkPos; import zmaster587.advancedRocketry.util.TerraformingHelper; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; public class dimensionTerraformingInfo{ public dimensionTerraformingInfo(){} - public List terraformingProtectedBlocks; - public List terraformingChunksDone; + public ArrayList terraformingProtectedBlocks; + public HashSet terraformingChunksDone; public TerraformingHelper terraformingHelper; } diff --git a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java index d8b1e5800..a5e7b4b24 100644 --- a/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java +++ b/src/main/java/zmaster587/advancedRocketry/fuckin_bs_integrated_server_and_client_variable_sharing_crap_fix_fuckit_Im_in_rage/serverlists.java @@ -4,10 +4,7 @@ import net.minecraft.util.math.ChunkPos; import zmaster587.advancedRocketry.util.TerraformingHelper; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class serverlists implements Afuckinginterface { @@ -19,11 +16,11 @@ public serverlists(){ public void initdim(int dim){ if (terraforminginfolists.get(dim) != null){ - terraforminginfolists.get(dim).terraformingChunksDone = new ArrayList<>(); + terraforminginfolists.get(dim).terraformingChunksDone = new HashSet<>(); terraforminginfolists.get(dim).terraformingProtectedBlocks = new ArrayList<>(); }else{ dimensionTerraformingInfo info = new dimensionTerraformingInfo(); - info.terraformingChunksDone = new ArrayList<>(); + info.terraformingChunksDone = new HashSet<>(); info.terraformingProtectedBlocks = new ArrayList<>(); terraforminginfolists.put(dim,info); } @@ -35,16 +32,16 @@ public List getProtectingBlocksForDimension(int dim){ if (terraforminginfolists.get(dim) == null)return null; return terraforminginfolists.get(dim).terraformingProtectedBlocks; } - public void setProtectingBlocksForDimension(int dim, List blocks){ + public void setProtectingBlocksForDimension(int dim, ArrayList blocks){ if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingProtectedBlocks = blocks; } - public void setChunksFullyTerraformed(int dim, List lpos){ + public void setChunksFullyTerraformed(int dim, HashSet lpos){ if (terraforminginfolists.get(dim) == null)return; terraforminginfolists.get(dim).terraformingChunksDone = lpos; } - public List getChunksFullyTerraformed(int dim){ + public HashSet getChunksFullyTerraformed(int dim){ if (terraforminginfolists.get(dim) == null)return null; return terraforminginfolists.get(dim).terraformingChunksDone; } diff --git a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/MiningDrill.java b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/MiningDrill.java index ff55759a2..0ab3ac544 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/MiningDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/MiningDrill.java @@ -119,8 +119,8 @@ boolean activate(World world, int x, int z) { if (ticketLaser != null) { Chunk chunk = world.getChunkFromBlockCoords(new BlockPos (x,0,z)); // force the chunk to generate - System.out.println("pos"+x+":"+z); - System.out.println("chunkpos"+chunk.x+":"+chunk.z); + //System.out.println("pos"+x+":"+z); + //System.out.println("chunkpos"+chunk.x+":"+chunk.z); ForgeChunkManager.forceChunk(ticketLaser, new ChunkPos(chunk.x, chunk.z)); int y = 64; diff --git a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java index 42dcce51c..ef9bda350 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/multiblock/orbitallaserdrill/TileOrbitalLaserDrill.java @@ -49,7 +49,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.IItemHandler; -public class TileOrbitalLaserDrill extends TileMultiPowerConsumer implements ISidedInventory, IGuiCallback, IButtonInventory { +public class TileOrbitalLaserDrill extends TileMultiPowerConsumer implements IGuiCallback, IButtonInventory { private static final int POWER_PER_OPERATION = (int) (10000 * ARConfiguration.getCurrentConfig().spaceLaserPowerMult); private final AbstractDrill drill; @@ -91,7 +91,6 @@ public class TileOrbitalLaserDrill extends TileMultiPowerConsumer implements ISi {null, null, null, null, null, null, LibVulpesBlocks.blockAdvStructureBlock, AdvancedRocketryBlocks.blockVacuumLaser, AdvancedRocketryBlocks.blockVacuumLaser, AdvancedRocketryBlocks.blockVacuumLaser, null} }, }; - private ItemStack lens; public int radius, xCenter, yCenter, numSteps; private EnumFacing prevDir; private ModuleTextBox locationX, locationZ; @@ -102,7 +101,6 @@ public class TileOrbitalLaserDrill extends TileMultiPowerConsumer implements ISi public TileOrbitalLaserDrill() { super(); - lens = ItemStack.EMPTY; radius = 0; xCenter = 0; @@ -481,21 +479,16 @@ public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) { public NBTTagCompound writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - if (lens != null) { - NBTTagCompound tag = new NBTTagCompound(); - lens.writeToNBT(tag); - nbt.setTag("GlassPane", tag); - } - nbt.setBoolean("isRunning", isRunning); nbt.setInteger("laserX", laserX); nbt.setInteger("laserZ", laserZ); nbt.setByte("mode", (byte) mode.ordinal()); nbt.setBoolean("jammed", this.isJammed); + nbt.setInteger("CenterX", xCenter); + nbt.setInteger("CenterY", yCenter); + if (mode == MODE.SPIRAL && prevDir != null) { - nbt.setInteger("CenterX", xCenter); - nbt.setInteger("CenterY", yCenter); nbt.setInteger("radius", radius); nbt.setInteger("numSteps", numSteps); nbt.setInteger("prevDir", prevDir.ordinal()); @@ -510,19 +503,15 @@ public void readFromNBT(NBTTagCompound nbt) { isRunning = nbt.getBoolean("isRunning"); - if (nbt.hasKey("GlassPane")) { - NBTTagCompound tag = nbt.getCompoundTag("GlassPane"); - lens = new ItemStack(tag); - } - laserX = nbt.getInteger("laserX"); laserZ = nbt.getInteger("laserZ"); mode = MODE.values()[nbt.getByte("mode")]; this.isJammed = nbt.getBoolean("jammed"); + xCenter = nbt.getInteger("CenterX"); + yCenter = nbt.getInteger("CenterY"); + if (mode == MODE.SPIRAL && nbt.hasKey("prevDir")) { - xCenter = nbt.getInteger("CenterX"); - yCenter = nbt.getInteger("CenterY"); radius = nbt.getInteger("radius"); numSteps = nbt.getInteger("numSteps"); prevDir = EnumFacing.values()[nbt.getInteger("prevDir")]; @@ -556,7 +545,7 @@ private boolean canMachineSeeEarth() { } private boolean unableToRun() { - return lens.isEmpty() || !canMachineSeeEarth() || batteries.getUniversalEnergyStored() == 0 || !(this.world.provider instanceof WorldProviderSpace) || !zmaster587.advancedRocketry.dimension.DimensionManager.getInstance().canTravelTo(((WorldProviderSpace) this.world.provider).getDimensionProperties(getPos()).getParentPlanet()) || + return !canMachineSeeEarth() || batteries.getUniversalEnergyStored() == 0 || !(this.world.provider instanceof WorldProviderSpace) || !zmaster587.advancedRocketry.dimension.DimensionManager.getInstance().canTravelTo(((WorldProviderSpace) this.world.provider).getDimensionProperties(getPos()).getParentPlanet()) || ARConfiguration.getCurrentConfig().laserBlackListDims.contains(((WorldProviderSpace) this.world.provider).getDimensionProperties(getPos()).getParentPlanet()); } @@ -566,7 +555,7 @@ private boolean unableToRun() { public void checkCanRun() { if (world.isRemote)return; // client has no business here - //Laser requires lense, redstone power, not be jammed, and be in orbit and energy to function + //Laser redstone power, not be jammed, and be in orbit and energy to function if (this.finished || this.isJammed || world.isBlockIndirectlyGettingPowered(getPos()) == 0 || unableToRun()) { if (isRunning) { drill.deactivate(); @@ -609,106 +598,6 @@ public boolean hasEnergy() { return batteries.getUniversalEnergyStored() != 0; } - //InventoryHandling start - @Override - public int getSizeInventory() { - return inv.getSizeInventory(); - } - - @Override - @Nonnull - public ItemStack getStackInSlot(int i) { - if (i == 0) - return lens; - else { - i--; - return inv.getStackInSlot(i); - } - } - - @Override - @Nonnull - public ItemStack decrStackSize(int i, int j) { - ItemStack ret; - - if (i == 0) { - ret = lens.copy(); - lens = ItemStack.EMPTY; - return ret; - } - return ItemStack.EMPTY; - } - - @Override - public void setInventorySlotContents(int i, @Nonnull ItemStack itemstack) { - - //TODO: add gregcipies - if (i == 0) - lens = itemstack; - else { - - if (InventoryCompat.canInjectItems(inv, itemstack)) - InventoryCompat.injectItem(inv, itemstack); - - this.checkCanRun(); - } - } - - @Override - @Nonnull - public String getName() { - return getMachineName(); - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUsableByPlayer(EntityPlayer entityplayer) { - return entityplayer.getDistanceSq(pos) <= 64; - } - - @Override - public boolean isEmpty() { - return lens.isEmpty(); - } - - @Override - public void openInventory(EntityPlayer entity) { - // TODO Perhaps make sure laser isn't running - } - - @Override - public void closeInventory(EntityPlayer entity) { - // TODO Auto-generated method stub - - } - - @Override - @Nonnull - public int[] getSlotsForFace(EnumFacing side) { - return new int[]{}; - } - - @Override - public boolean canInsertItem(int index, @Nonnull ItemStack itemStackIn, @Nullable EnumFacing direction) { - return false; - } - - @Override - public boolean canExtractItem(int index, @Nonnull ItemStack stack, @Nullable EnumFacing direction) { - return false; - } - - @Override - public boolean isItemValidForSlot(int i, @Nonnull ItemStack itemstack) { - if (i == 0) - return AdvancedRocketryItems.itemLens == itemstack.getItem(); - - return inv.isItemValidForSlot(i, itemstack); - } /** * @return returns whether enough power is stored for the next operation @@ -738,12 +627,6 @@ public boolean isJammed() { public void setJammed(boolean b) { this.isJammed = b; } - - @Override - public boolean hasCustomName() { - return false; - } - @Override public void onModuleUpdated(ModuleBase module) { resetBtn.setColor(0x90ff90); @@ -767,9 +650,6 @@ public List getModules(int id, EntityPlayer player) { modules.add(locationX); modules.add(locationZ); - locationX.setText(String.valueOf(this.xCenter)); - locationZ.setText(String.valueOf(this.yCenter)); - modules.add(updateText = new ModuleText(110, 20, this.getMode().toString(), 0x0b0b0b, true)); modules.add(new ModuleText(83, 33, "X:", 0x0b0b0b)); modules.add(new ModuleText(83, 43, "Z:", 0x0b0b0b)); @@ -783,7 +663,6 @@ public List getModules(int id, EntityPlayer player) { modules.add(new ModuleButton(137, 20, 1, "", this, zmaster587.libVulpes.inventory.TextureResources.buttonRight, 5, 8)); modules.add(resetBtn); modules.add(new ModulePower(11, 25, batteries)); - modules.add(new ModuleSlotArray(56, 54, this, 0, 1)); return modules; } @@ -815,31 +694,6 @@ public void onInventoryButtonPressed(int buttonId) { return; } - @Override - @Nonnull - public ItemStack removeStackFromSlot(int index) { - return ItemStack.EMPTY; - } - - @Override - public int getField(int id) { - return 0; - } - - @Override - public void setField(int id, int value) { - - } - - @Override - public int getFieldCount() { - return 0; - } - - @Override - public void clear() { - - } public enum MODE { SINGLE, diff --git a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java index fc53d95df..dff8943f4 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java @@ -141,7 +141,7 @@ public void setInventorySlotContents(int slot, @Nonnull ItemStack stack) { public void update() { super.update(); boolean has_redstone = world.isBlockIndirectlyGettingPowered(getPos()) != 0; - int powerrequired = 1; + int powerrequired = 120; if (!world.isRemote) { if (world.getTotalWorldTime() % 20 == 0) @@ -196,7 +196,7 @@ public void update() { battery.extractEnergy(powerrequired, false); BiomeHandler.terraform(world, ((ChunkManagerPlanet) chunkmgr).getBiomeGenAt(next_block_pos.getX(), next_block_pos.getZ()), next_block_pos, false, world.provider.getDimension()); }else{ - System.out.println("nothing to terraform"); + //System.out.println("nothing to terraform"); break; // nothing to do, everything is terraformed } diff --git a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java index 72fe2eb14..47879233d 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java @@ -51,7 +51,7 @@ public static void decorate_simple(World world, Biome biomeId, Biome old_biome, decorateBiome(world, yy, biomeId); } - // Bro I am sorry for changing this again and I know it will mess up your mixin but terraforming had a big update so.... + // Bro I am sorry for changing this again and I know it will mess up your mixin but terraforming had a BIG update so.... public static void changeBiome(World world, Biome biomeId, Biome old_biome, BlockPos pos) { Chunk chunk = world.getChunkFromBlockCoords(pos); if (old_biome != biomeId) { @@ -64,10 +64,25 @@ public static void changeBiome(World world, Biome biomeId, Biome old_biome, Bloc } } + public static int get_height_blocks_only(IBlockState[] blocks) { + int h = blocks.length-1; + while (h>0 && (!blocks[h].isOpaqueCube())){ + h--; + } + return h; + } + + public static int get_height_blocks_only(World world, BlockPos pos) { + BlockPos yy = world.getHeight(pos); + while ((!world.getBlockState(yy).isOpaqueCube()) && yy.getY() > 0) + yy = yy.down(); + return yy.getY(); + } + public static void do_heavy_terraforming(World world, Biome biomeId, Biome old_biome, BlockPos pos, int dimId){ int inchunkx = ((pos.getX() % 16) + 16) % 16; - int inchunkz = ((pos.getZ() % 16) + 16) % 16; + int inchunkz = ((pos.getZ() % 16) + 16) % 16; long startTime; startTime = System.currentTimeMillis(); @@ -92,22 +107,19 @@ else if (data.type == TerraformingType.ALLOWED) { if (!data.fully_generated[inchunkx][inchunkz]) { //fast replacing - for (int i = 5; i < 255; i++) { + for (int i = 0; i < 255; i++) { world.setBlockState(new BlockPos(pos.getX(), i, pos.getZ()), target_blocks[i], 2); } - // check if the terrain is fully generated to target height - int current_height = world.getHeight(pos.getX(), pos.getZ()); // returns the y value above the highest block - int target_height = 0; - for (int i = 255; i > 5; i--) { - // go down until there is a non-air block, this is target height - if (target_blocks[i] != Blocks.AIR.getDefaultState()) { - target_height = i + 1; - break; - } - } + // as long as terrain does not match the target height, re-add position to queue - if (current_height == target_height) { + //System.out.println("heights:"+get_height_blocks_only(world, pos) +":"+ get_height_blocks_only(target_blocks)); + + // you need to check this for the entire chunk + // or the laser will reset on every new world load to its starting position and ignore the radius and iterate every chunk and skip over the ones that are already generated + // or make it like this: every time a single position is fully generated, check every chunk 3x3 around it and see if you can populate them + // use the chunk list again - replace spiral mod with global mode that scatters the chunks to make it a little more random. every new load it will start from its starting position again + if (get_height_blocks_only(world, pos) == get_height_blocks_only(target_blocks)) { DimensionProperties.proxylists.gethelper(props.getId()).getChunkFromList(cpos.x, cpos.z).set_position_fully_generated(inchunkx, inchunkz); } else { DimensionProperties.proxylists.gethelper(props.getId()).add_position_to_queue(pos); @@ -119,6 +131,17 @@ else if (data.type == TerraformingType.ALLOWED) { else if (data.type == TerraformingType.BORDER){ + //this is to be sure the top block is changed even if the height matches already + BlockPos yy = world.getHeight(pos); + while (!world.getBlockState(yy.down()).isOpaqueCube() && yy.getY() > 0) + yy = yy.down(); + + if (old_biome.topBlock != biomeId.topBlock) { + if (world.getBlockState(yy.down()) == old_biome.topBlock) + world.setBlockState(yy.down(), biomeId.topBlock); + } + + if (target_blocks != null) { int filter_size = 5; @@ -129,24 +152,30 @@ else if (data.type == TerraformingType.BORDER){ world.getChunkFromBlockCoords(pos.add(0, 0, -filter_size)); // Ensure the chunk of the target positions are generated world.getChunkFromBlockCoords(pos.add(0, 0, filter_size)); // Ensure the chunk of the target positions are generated - int heightsum = 0; - int num_samples = 0; + + //this has to be weighted by distance + float heightsum = 0; + float num_samples = 0; for (int x = -filter_size; x <= filter_size; x++) { for (int z = -filter_size; z <= filter_size; z++) { - heightsum += world.getHeight(pos.add(x, 0, z)).getY(); - num_samples += 1; + float w = (1.0f / (0.2f + x*x + z*z)); + heightsum += get_height_blocks_only(world, pos.add(x, 0, z)) * w; + num_samples += 1 * w; } } - int avg_height = heightsum / num_samples; + int avg_height = Math.round(heightsum / num_samples); - int prev_height = world.getHeight(pos).getY(); + int prev_height = get_height_blocks_only(world, pos); if (avg_height == prev_height) { // nothing to do return; } + //now we want to set the target height to >= sea level to fill it with the oceanblock + avg_height = Math.max(props.getSeaLevel(),avg_height); + //fast replacing - for (int i = 5; i < 256; i++) { + for (int i = 0; i < 256; i++) { IBlockState target = target_blocks[i]; if (i < avg_height) if (target == Blocks.AIR.getDefaultState()) @@ -158,14 +187,17 @@ else if (data.type == TerraformingType.BORDER){ world.setBlockState(new BlockPos(pos.getX(), i, pos.getZ()), target, 2); } - int new_height = world.getHeight(pos).getY(); + int new_height = get_height_blocks_only(world, pos); if (prev_height != new_height) { DimensionProperties.proxylists.gethelper(props.getId()).register_height_change(pos); DimensionProperties.proxylists.gethelper(props.getId()).add_position_to_queue(pos); } else { DimensionProperties.proxylists.gethelper(props.getId()).check_next_border_chunk_fully_generated(cpos.x, cpos.z); // maybe this was the last border block in queue? if yes, its terrain is done! } - }else DimensionProperties.proxylists.gethelper(props.getId()).check_next_border_chunk_fully_generated(cpos.x, cpos.z); // maybe this was the last border block in queue? if yes, its terrain is done! + } + else DimensionProperties.proxylists.gethelper(props.getId()).check_next_border_chunk_fully_generated(cpos.x, cpos.z); // maybe this was the last border block in queue? if yes, its terrain is done! + + } int can_populate = DimensionProperties.proxylists.gethelper(props.getId()).can_populate(cpos.x, cpos.z); @@ -193,8 +225,8 @@ else if (data.type == TerraformingType.BORDER){ public static void terraform(World world, Biome biomeId, BlockPos pos, boolean was_biome_remote, int dimId) { Chunk chunk = world.getChunkFromBlockCoords(pos); if (biomeId == null)return; - Biome old_biome = world.getBiome(pos); + Biome old_biome = world.getBiome(pos); changeBiome(world,biomeId, old_biome, pos); //for biome remote use, only change top block and do simple decoration @@ -277,4 +309,3 @@ private static void decorateBiome(World world, BlockPos pos, Biome biome) { } - diff --git a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java index 68859675d..08c0bb9ac 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java +++ b/src/main/java/zmaster587/advancedRocketry/util/TerraformingHelper.java @@ -50,11 +50,11 @@ public class TerraformingHelper { // doesn't matter if it is type ALLOWED or type BORDER private List terraformingqueue; - int safe_zone_radius = 3; - int border_zone = 1; + int safe_zone_radius = 3; // radius for protected zone + int border_zone = 3; // border zone size - public TerraformingHelper(int dimension, List biomes, List generated_chunks){ + public TerraformingHelper(int dimension, List biomes, HashSet generated_chunks){ this.dimId = dimension; this.props = DimensionManager.getInstance().getDimensionProperties(dimension); this.biomeList = biomes; @@ -147,7 +147,7 @@ public synchronized void check_next_border_chunk_fully_generated(int px, int pz) } } } - System.out.println("terrain fully generated"); + System.out.println("border chunk terrain fully generated"); data.terrain_fully_generated = true; data.blockStates = null; // no longer needed, gc should collect them now - actually, these are never needed but who cares... check_next_border_chunk_fully_generated(data.x, data.z); // update border chunks next to this one to check if they can decorate @@ -164,9 +164,10 @@ public void check_can_decorate(int px, int pz){ if (getChunkFromList(px+x,pz+z) != null && !getChunkFromList(px+x,pz+z).chunk_fully_generated){ if (can_populate(px+x,pz+z) != 0){ //re-add all position to queue for decoration + System.out.println("chunk can populate now: "+(px+x)+":"+(pz+z)); for (int bx = 0; bx < 16; bx++) { for (int bz = 0; bz < 16; bz++) { - add_position_to_queue(new BlockPos((px+x)*16+bx, 0, (pz+z)*16+bz)); + add_position_to_queue_at_front(new BlockPos((px+x)*16+bx, 0, (pz+z)*16+bz)); } } } @@ -236,9 +237,19 @@ public synchronized void add_position_to_queue(BlockPos p){ System.out.print("ERROR POSITION IS NULL"); return; } - terraformingqueue.add(new Vec3i(p.getX(),p.getY(),p.getZ())); // HOW TF CAN THIS EVER BE NULL?!?!? - + terraformingqueue.add(new Vec3i(p.getX(),p.getY(),p.getZ())); + } + public synchronized void add_position_to_queue_at_front(BlockPos p){ + //System.out.println("add position: "+p.getX()+":"+p.getZ()); + if (p == null){ + System.out.print("ERROR POSITION IS NULL"); + return; } + int insertionIndex; + insertionIndex = new Random().nextInt(Math.min(terraformingqueue.size(), 1000)); + + terraformingqueue.add(insertionIndex, new Vec3i(p.getX(),p.getY(),p.getZ())); + } public synchronized BlockPos get_next_position(boolean random){ @@ -249,7 +260,6 @@ public synchronized BlockPos get_next_position(boolean random){ index = nextInt(0,terraformingqueue.size()); Vec3i pos = terraformingqueue.remove(index); - //if(pos == null) return null; // Screw it - This is now beyond my pay grade now.... return new BlockPos(pos); } From e7ac483ea2e85b22cc03613231bbed7ffcc91fc5 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Wed, 10 Jul 2024 03:54:25 +0200 Subject: [PATCH 19/42] fixed crash on world save --- .../dimension/DimensionProperties.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index f2176c111..f102b411f 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -252,6 +252,8 @@ public void load_terraforming_helper(boolean reset) { proxylists.sethelper(getId(), new TerraformingHelper(getId(), getBiomesEntries(getViableBiomes(false)), proxylists.getChunksFullyTerraformed(getId()))); + System.out.println("num biomes: "+ getViableBiomes(false).size()); + Collection list = (net.minecraftforge.common.DimensionManager.getWorld(getId())).getChunkProvider().getLoadedChunks(); if (!list.isEmpty()) { for (Chunk chunk : list) { @@ -270,10 +272,10 @@ public void registerProtectingBlock(BlockPos p) { break; } } - System.out.println("register protecting block called"); + //System.out.println("register protecting block called"); if (!already_registered) { proxylists.getProtectingBlocksForDimension(getId()).add(p); - System.out.println("block registered"); + //System.out.println("block registered"); if (proxylists.gethelper(getId()) != null) { proxylists.gethelper(getId()).recalculate_chunk_status(); } @@ -1118,11 +1120,11 @@ public void setBiomes(List biomes) { public boolean isBiomeblackListed(Biome biome, boolean is_NOT_terraforming) { if (!is_NOT_terraforming) { - String modId = biome.getRegistryName().getResourceDomain(); + //String modId = biome.getRegistryName().getResourceDomain(); - if (!modId.equals("minecraft") && !modId.equals("advancedrocketry")) { - return true; - } + //if (!modId.equals("minecraft") && !modId.equals("advancedrocketry")) { + // return true; + //} } if (biome.equals(AdvancedRocketryBiomes.spaceBiome)) return true; @@ -1712,6 +1714,9 @@ public void write_terraforming_data(NBTTagCompound nbt) { // write terraforming data int dimid = getId(); + if (!proxylists.isinitialized(dimid)){ + return; + } NBTTagList list = new NBTTagList(); for (ChunkPos pos : proxylists.getChunksFullyTerraformed(dimid)) { NBTTagCompound entry = new NBTTagCompound(); From e408f9265daf21084b717a2bd36a33c78e892c89 Mon Sep 17 00:00:00 2001 From: Quarter Date: Wed, 10 Jul 2024 19:25:56 +0300 Subject: [PATCH 20/42] Fixed rocket stick in atmosphere, made config entries for all of motors --- .../advancedRocketry/api/ARConfiguration.java | 15 ++++++++--- .../BlockAdvancedBipropellantRocketMotor.java | 12 +++++++++ .../block/BlockAdvancedRocketMotor.java | 12 +++++++++ .../block/BlockBipropellantRocketMotor.java | 17 ++++++------- .../block/BlockNuclearRocketMotor.java | 12 +++++++++ .../block/BlockRocketMotor.java | 20 +++++++-------- .../advancedRocketry/entity/EntityRocket.java | 25 ++++++++++++++++--- .../tile/TileRocketAssemblingMachine.java | 22 +++++++++------- 8 files changed, 100 insertions(+), 35 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java b/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java index 0c1601918..84d070987 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java +++ b/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java @@ -272,15 +272,21 @@ public class ARConfiguration { @ConfigProperty(needsSync = true) public boolean experimentalSpaceFlight; - public ARConfiguration() { + @ConfigProperty + public boolean advancedWeightSystem; - } + @ConfigProperty + public boolean partsWearSystem; + + @ConfigProperty + public double increaseWearIntensityProb; + + public ARConfiguration() {} public ARConfiguration(ARConfiguration config) { Field[] fields = ARConfiguration.class.getDeclaredFields(); List fieldList = new ArrayList<>(fields.length); - // getDeclaredFields returns an unordered list, so we need to sort them for (Field field : fields) { if (field.isAnnotationPresent(ConfigProperty.class)) @@ -446,6 +452,9 @@ public static void loadPreInit() { arConfig.gravityAffectsFuel = config.get(ROCKET, "gravityAffectsFuels", true, "If true planets with higher gravity require more fuel and lower gravity would require less").getBoolean(); arConfig.launchingDestroysBlocks = config.get(ROCKET, "launchBlockDestruction", false, "If true rocket launches will kill plants, glass soil, turn rock into lava, and more").getBoolean(); blackListRocketBlocksStr = config.getStringList("rocketBlockBlackList", ROCKET, new String[]{"minecraft:portal", "minecraft:bedrock", "minecraft:snow_layer", "minecraft:water", "minecraft:flowing_water", "minecraft:lava", "minecraft:flowing_lava", "minecraft:fire", "advancedrocketry:rocketfire"}, "Mod:Blockname for example \"minecraft:chest\""); + arConfig.advancedWeightSystem = config.get(ROCKET, "advancedWeightSystem", true, "Enables advanced weight system which computes rocket weight, including the handled inventories. Block weights are stores in weights.json").getBoolean(); + arConfig.partsWearSystem = config.get(ROCKET, "partsWearSystem", true, "Enables rocket parts wear subsystem. Every rocket start it has probability to explode based on parts' wear intensities").getBoolean(); + arConfig.increaseWearIntensityProb = config.get(ROCKET, "increaseWearIntensityProb", 0.025, "Every rocket usage every part has this probability to increase wear intensity").getDouble(); //Ore and worldgen configuration //Ore configuration diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockAdvancedBipropellantRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockAdvancedBipropellantRocketMotor.java index 6abd08a75..43dde33f6 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockAdvancedBipropellantRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockAdvancedBipropellantRocketMotor.java @@ -1,8 +1,14 @@ package zmaster587.advancedRocketry.block; import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import zmaster587.advancedRocketry.api.ARConfiguration; +import zmaster587.advancedRocketry.tile.TileBrokenPart; + +import javax.annotation.Nullable; public class BlockAdvancedBipropellantRocketMotor extends BlockBipropellantRocketMotor { @@ -19,4 +25,10 @@ public int getThrust(World world, BlockPos pos) { public int getFuelConsumptionRate(World world, int x, int y, int z) { return 3; } + + @Nullable + @Override + public TileEntity createTileEntity(final World worldIn, final IBlockState state) { + return new TileBrokenPart(10, (float) ARConfiguration.getCurrentConfig().increaseWearIntensityProb); + } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockAdvancedRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockAdvancedRocketMotor.java index 84b8e8ee6..546a9e845 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockAdvancedRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockAdvancedRocketMotor.java @@ -1,8 +1,14 @@ package zmaster587.advancedRocketry.block; import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import zmaster587.advancedRocketry.api.ARConfiguration; +import zmaster587.advancedRocketry.tile.TileBrokenPart; + +import javax.annotation.Nullable; public class BlockAdvancedRocketMotor extends BlockRocketMotor { @@ -19,4 +25,10 @@ public int getThrust(World world, BlockPos pos) { public int getFuelConsumptionRate(World world, int x, int y, int z) { return 3; } + + @Nullable + @Override + public TileEntity createTileEntity(final World worldIn, final IBlockState state) { + return new TileBrokenPart(10, (float) ARConfiguration.getCurrentConfig().increaseWearIntensityProb); + } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java index fa327e60b..e685b8bc4 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java @@ -9,7 +9,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -56,14 +55,14 @@ public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, Entity ((TileBrokenPart) te).setStage(stack.getItemDamage()); } - @Override - public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { - if (!worldIn.isRemote) { - TileEntity te = worldIn.getTileEntity(pos); - ((TileBrokenPart) te).transition(); - } - return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); - } +// @Override +// public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { +// if (!worldIn.isRemote) { +// TileEntity te = worldIn.getTileEntity(pos); +// ((TileBrokenPart) te).transition(); +// } +// return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); +// } @Override public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockNuclearRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockNuclearRocketMotor.java index 23327bf87..ed84d34d5 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockNuclearRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockNuclearRocketMotor.java @@ -1,8 +1,14 @@ package zmaster587.advancedRocketry.block; import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import zmaster587.advancedRocketry.api.ARConfiguration; +import zmaster587.advancedRocketry.tile.TileBrokenPart; + +import javax.annotation.Nullable; public class BlockNuclearRocketMotor extends BlockRocketMotor { @@ -19,4 +25,10 @@ public int getThrust(World world, BlockPos pos) { public int getFuelConsumptionRate(World world, int x, int y, int z) { return 1; } + + @Nullable + @Override + public TileEntity createTileEntity(final World worldIn, final IBlockState state) { + return new TileBrokenPart(10, 4 * (float) ARConfiguration.getCurrentConfig().increaseWearIntensityProb); + } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java index 98ab38b40..95c8e16a3 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java @@ -9,11 +9,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import zmaster587.advancedRocketry.api.ARConfiguration; import zmaster587.advancedRocketry.api.IRocketEngine; import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.libVulpes.block.BlockFullyRotatable; @@ -83,14 +83,14 @@ public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, Entity ((TileBrokenPart) te).setStage(stack.getItemDamage()); } - @Override - public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { - if (!worldIn.isRemote) { - TileEntity te = worldIn.getTileEntity(pos); - ((TileBrokenPart) te).transition(); - } - return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); - } +// @Override +// public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { +// if (!worldIn.isRemote) { +// TileEntity te = worldIn.getTileEntity(pos); +// ((TileBrokenPart) te).transition(); +// } +// return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); +// } @Override public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { @@ -126,6 +126,6 @@ public boolean hasTileEntity(IBlockState state) { @Nullable @Override public TileEntity createTileEntity(final World worldIn, final IBlockState state) { - return new TileBrokenPart(10, 0.05F); + return new TileBrokenPart(10, 2 * (float) ARConfiguration.getCurrentConfig().increaseWearIntensityProb); } } diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java index 4c50f763e..b9f46860e 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java @@ -69,6 +69,7 @@ import zmaster587.advancedRocketry.stations.SpaceObjectManager; import zmaster587.advancedRocketry.stations.SpaceStationObject; import zmaster587.advancedRocketry.tile.TileGuidanceComputer; +import zmaster587.advancedRocketry.tile.TileRocketAssemblingMachine; import zmaster587.advancedRocketry.tile.hatch.TileSatelliteHatch; import zmaster587.advancedRocketry.util.*; import zmaster587.advancedRocketry.world.util.TeleporterNoPortal; @@ -1606,9 +1607,17 @@ public void launch() { boolean allowLaunch = false; - this.stats.setWeight((int) storage.recalculateWeight()); + if (ARConfiguration.getCurrentConfig().advancedWeightSystem) { + this.stats.setWeight((int) storage.recalculateWeight()); + for (HashedBlockPosition pos : this.infrastructureCoords) { + TileEntity te = world.getTileEntity(pos.getBlockPos()); + if (te instanceof TileRocketAssemblingMachine) { + ((TileRocketAssemblingMachine) te).getRocketStats().setWeight(this.stats.getWeight()); + } + } + } - if (storage.shouldBreak()) { + if (ARConfiguration.getCurrentConfig().partsWearSystem && storage.shouldBreak()) { this.explode(); return; } @@ -1659,6 +1668,10 @@ public void launch() { } + if (this.stats.getWeight() >= this.stats.getThrust()) { + allowLaunch = false; + } + //Check to see what place we should be going to //This is bad but it works and is mostly intelligible so it's here for now stats.orbitHeight = (storage.getGuidanceComputer() == null) ? getEntryHeight(this.world.provider.getDimension()) : storage.getGuidanceComputer().getLaunchSequence(this.world.provider.getDimension(), this.getPosition()); @@ -1666,8 +1679,6 @@ public void launch() { //TODO: Clean this logic a bit? if (allowLaunch || !stats.hasSeat() || ((DimensionManager.getInstance().isDimensionCreated(destinationDimId)) || destinationDimId == ARConfiguration.getCurrentConfig().spaceDimId || destinationDimId == 0)) { //Abort if destination is invalid - - setInFlight(true); Iterator connectedTiles = connectedInfrastructure.iterator(); @@ -1825,6 +1836,9 @@ protected void readEntityFromNBT(NBTTagCompound nbt) { } setInFlight(isInFlight = nbt.getBoolean("flight")); + motionX = nbt.getDouble("motionX"); + motionY = nbt.getDouble("motionY"); + motionZ = nbt.getDouble("motionZ"); readMissionPersistentNBT(nbt); if (nbt.hasKey("data")) { @@ -1866,6 +1880,9 @@ protected void writeNetworkableNBT(NBTTagCompound nbt) { nbt.setBoolean("rcs_mode", rcs_mode); nbt.setInteger("rcs_mode_cnt", rcs_mode_counter); nbt.setBoolean("inSpaceFlight", getInSpaceFlight()); + nbt.setDouble("motionX", motionX); + nbt.setDouble("motionY", motionY); + nbt.setDouble("motionZ", motionZ); stats.writeToNBT(nbt); if (!infrastructureCoords.isEmpty()) { diff --git a/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java b/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java index a85c9bee6..05b7782c9 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java @@ -318,9 +318,11 @@ public void scanRocket(World world, BlockPos pos2, AxisAlignedBB bb) { continue; } - numBlocks++; - - weight += WeightEngine.INSTANCE.getWeight(world, currBlockPos); + if (ARConfiguration.getCurrentConfig().advancedWeightSystem) { + weight += WeightEngine.INSTANCE.getWeight(world, currBlockPos); + } else { + weight += 1; + } //If rocketEngine increaseThrust final float x = xCurr - actualMinX - ((actualMaxX - actualMinX) / 2f); @@ -366,12 +368,14 @@ public void scanRocket(World world, BlockPos pos2, AxisAlignedBB bb) { TileEntity tile = world.getTileEntity(currBlockPos); if (tile instanceof TileSatelliteHatch) { hasSatellite = true; - TileSatelliteHatch hatch = (TileSatelliteHatch) tile; - if (hatch.getSatellite() != null) { - weight += hatch.getSatellite().getProperties().getWeight(); - } else if (hatch.getStackInSlot(0).getItem() instanceof ItemPackedStructure) { - ItemPackedStructure struct = (ItemPackedStructure) hatch.getStackInSlot(0).getItem(); - weight += struct.getStructure(hatch.getStackInSlot(0)).getWeight(); + if (ARConfiguration.getCurrentConfig().advancedWeightSystem) { + TileSatelliteHatch hatch = (TileSatelliteHatch) tile; + if (hatch.getSatellite() != null) { + weight += hatch.getSatellite().getProperties().getWeight(); + } else if (hatch.getStackInSlot(0).getItem() instanceof ItemPackedStructure) { + ItemPackedStructure struct = (ItemPackedStructure) hatch.getStackInSlot(0).getItem(); + weight += struct.getStructure(hatch.getStackInSlot(0)).getWeight(); + } } } else if (tile instanceof TileGuidanceComputer) { hasGuidance = true; From 0b625d4aba60aec18a0980c8f6a9814aec243cda Mon Sep 17 00:00:00 2001 From: Quarter Date: Wed, 10 Jul 2024 22:14:09 +0300 Subject: [PATCH 21/42] Extended buildscripts --- settings.gradle.kts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/settings.gradle.kts b/settings.gradle.kts index fe5385aca..8c3d444bb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,7 @@ pluginManagement { repositories { gradlePluginPortal() + mavenCentral() maven { name = "MinecraftForge" url = uri("https://maven.minecraftforge.net/") @@ -9,6 +10,10 @@ pluginManagement { name = "FancyGradle" url = uri("https://maven.gofancy.wtf/releases") } + maven { url = uri("https://plugins.gradle.org/m2/") } + maven { + url = uri("https://oss.sonatype.org/content/repositories/snapshots/") + } } } From af4f14680475566e732541e2334e1c2476ba3d07 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Thu, 11 Jul 2024 15:50:15 +0200 Subject: [PATCH 22/42] version up to 2.1.1 --- gradle.properties | 2 +- .../client/render/planet/RenderPlanetarySky.java | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index c55b077d1..5d6a3b44f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.daemon=false # Project mcVersion=1.12.2 forgeVersion=14.23.5.2860 -modVersion=2.0.11 +modVersion=2.1.1 archiveBase=AdvancedRocketry startGitRev=8e676bd diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderPlanetarySky.java b/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderPlanetarySky.java index a79dc5f79..018fcebb3 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderPlanetarySky.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderPlanetarySky.java @@ -874,10 +874,6 @@ else if (afloat != null && (planetPositionTheta < 105 || planetPositionTheta > 2 GL11.glPopMatrix(); GlStateManager.disableTexture2D(); - //GlStateManager.color(f1, f2, f3, 0.05F); - //GL11.glCallList(this.glSkyList); - - GlStateManager.color(0.0F, 0.0F, 0.0F); double d0 = this.mc.player.getPositionEyes(partialTicks).y - mc.world.getHorizon(); From ecb1a4c1353325d543ac9e78ad41b9131a971db8 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Thu, 11 Jul 2024 21:46:59 +0200 Subject: [PATCH 23/42] the blockupdate code will no longer be executed from the onAdjacentBlockUpdated() because it causes conc. mod. exception. Now it will just set a boolean to true to make the performFunction() execute the blockupdate code --- .../tile/atmosphere/TileOxygenVent.java | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/tile/atmosphere/TileOxygenVent.java b/src/main/java/zmaster587/advancedRocketry/tile/atmosphere/TileOxygenVent.java index 6f865e6bb..f154fd7f2 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/atmosphere/TileOxygenVent.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/atmosphere/TileOxygenVent.java @@ -55,7 +55,7 @@ public class TileOxygenVent extends TileInventoriedRFConsumerTank implements IBl private boolean hasFluid; private boolean soundInit; private boolean allowTrace; - private boolean lock; + private boolean blockUpdated; private int numScrubbers; private List scrubbers; private int radius = 0; @@ -103,23 +103,7 @@ public World getWorldObj() { @Override public void onAdjacentBlockUpdated() { - - if (isSealed) - activateAdjBlocks(); - scrubbers.clear(); - TileEntity[] tiles = new TileEntity[6]; - tiles[0] = world.getTileEntity(pos.add(1, 0, 0)); - tiles[1] = world.getTileEntity(pos.add(-1, 0, 0)); - tiles[2] = world.getTileEntity(pos.add(0, 1, 0)); - tiles[3] = world.getTileEntity(pos.add(0, -1, 0)); - tiles[4] = world.getTileEntity(pos.add(0, 0, 1)); - tiles[5] = world.getTileEntity(pos.add(0, 0, -1)); - - lock = true; - for (TileEntity tile : tiles) { - if (tile instanceof TileCO2Scrubber && world.getBlockState(tile.getPos()).getBlock() == AdvancedRocketryBlocks.blockCO2Scrubber) - scrubbers.add((TileCO2Scrubber) tile); - } + blockUpdated = true; // the performFunction will take it from here } private void activateAdjBlocks() { @@ -186,6 +170,28 @@ public boolean isTurnedOn() { @Override public void performFunction() { + + if (blockUpdated) { // this was moved from onAdjacentBlockUpdated(); to prevent crash + if (isSealed) + activateAdjBlocks(); + scrubbers.clear(); + TileEntity[] tiles = new TileEntity[6]; + tiles[0] = world.getTileEntity(pos.add(1, 0, 0)); + tiles[1] = world.getTileEntity(pos.add(-1, 0, 0)); + tiles[2] = world.getTileEntity(pos.add(0, 1, 0)); + tiles[3] = world.getTileEntity(pos.add(0, -1, 0)); + tiles[4] = world.getTileEntity(pos.add(0, 0, 1)); + tiles[5] = world.getTileEntity(pos.add(0, 0, -1)); + + + for (TileEntity tile : tiles) { + if (tile instanceof TileCO2Scrubber && world.getBlockState(tile.getPos()).getBlock() == AdvancedRocketryBlocks.blockCO2Scrubber) + scrubbers.add((TileCO2Scrubber) tile); + } + blockUpdated = false; + } + + /* NB: canPerformFunction returns false and must return true for performFunction to execute * if there is no O2 handler, this is why we can safely call AtmosphereHandler.getOxygenHandler * and not have to worry about an NPE being thrown @@ -232,8 +238,7 @@ public void performFunction() { } } - //Lock the vent while the scrubbers do their block updates - if (isSealed && !lock) { + if (isSealed) { //If scrubbers exist and the config allows then use the cartridge if (ARConfiguration.getCurrentConfig().scrubberRequiresCartrige) { @@ -266,8 +271,7 @@ public void performFunction() { hasFluid = false; } - } else - lock = false; + } } } From 5805e12a41047037194339de7260766063a89d89 Mon Sep 17 00:00:00 2001 From: Quarter Date: Sun, 21 Jul 2024 16:18:43 +0300 Subject: [PATCH 24/42] The great... update - Changed mappings to be fully equal with libVulpes (fixing AbstractMethodError on Gradle runClient) - Added service station block & TE, still in beta - Updated StorageChunk with BlockPos to TileEntity mapping --- build.gradle.kts | 3 +- .../advancedRocketry/AdvancedRocketry.java | 3 + .../api/AdvancedRocketryBlocks.java | 1 + .../block/BlockBipropellantRocketMotor.java | 20 +- .../block/BlockPressurizedFluidTank.java | 2 +- .../block/BlockRocketMotor.java | 34 +- .../block/CrystalColorizer.java | 2 +- .../advancedRocketry/client/ClientProxy.java | 2 +- .../render/entity/RenderButtonUIEntity.java | 2 +- .../render/entity/RenderStarUIEntity.java | 2 +- .../multiblocks/RendererCrystallizer.java | 2 +- .../advancedRocketry/entity/EntityRocket.java | 2 +- .../advancedRocketry/item/ItemJackHammer.java | 7 +- .../item/tools/ItemBasicLaserGun.java | 2 +- .../TileRocketServiceStation.java | 512 ++++++++++++++++++ .../util/IBrokenPartBlock.java | 13 + .../advancedRocketry/util/StorageChunk.java | 52 +- .../blockstates/servicestation.json | 23 + .../assets/advancedrocketry/lang/ru_RU.lang | 11 + 19 files changed, 645 insertions(+), 50 deletions(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java create mode 100644 src/main/java/zmaster587/advancedRocketry/util/IBrokenPartBlock.java create mode 100644 src/main/resources/assets/advancedrocketry/blockstates/servicestation.json diff --git a/build.gradle.kts b/build.gradle.kts index a68366fe6..9e50df44f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -63,7 +63,7 @@ tasks.compileJava { minecraft { - mappings("snapshot", "20170624-1.12") + mappings("snapshot", "20171003-1.12") accessTransformer(file("src/main/resources/META-INF/accessTransformer.cfg")) @@ -155,6 +155,7 @@ dependencies { //compileOnly(fg.deobf("dev.galacticraft:galacticraft-legacy:$gcVersion")) compileOnly(fg.deobf("curse.maven:galacticraft-legacy-564236:4671122")) compileOnly(fg.deobf("mezz.jei:jei_${mcVersion}:${jeiVersion}:api")) + implementation(fg.deobf("mezz.jei:jei_${mcVersion}:${jeiVersion}")) // Sorry but it won't start wihout jei... //runtimeOnly(fg.deobf("mezz.jei:jei_${mcVersion}:${jeiVersion}")) // I think this crashes the game for me when running from IntelliJ implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) diff --git a/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java b/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java index b277f26e7..cb79c62a1 100644 --- a/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java +++ b/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java @@ -351,6 +351,7 @@ public void preInit(FMLPreInitializationEvent event) { //TileEntity Registration --------------------------------------------------------------------------------------------- GameRegistry.registerTileEntity(TileBrokenPart.class, "ARbrokenPart"); + GameRegistry.registerTileEntity(TileRocketServiceStation.class, "ARserviceStation"); GameRegistry.registerTileEntity(TileRocketAssemblingMachine.class, "ARrocketBuilder"); GameRegistry.registerTileEntity(TileWarpCore.class, "ARwarpCore"); //GameRegistry.registerTileEntity(TileModelRender.class, "ARmodelRenderer"); @@ -684,6 +685,7 @@ public void registerBlocks(RegistryEvent.Register evt) { AdvancedRocketryBlocks.blockMonitoringStation = new BlockTileNeighborUpdate(TileRocketMonitoringStation.class, GuiHandler.guiId.MODULARNOINV.ordinal()).setCreativeTab(tabAdvRocketry).setHardness(3f).setUnlocalizedName("monitoringstation"); AdvancedRocketryBlocks.blockSatelliteControlCenter = new BlockTile(TileSatelliteTerminal.class, GuiHandler.guiId.MODULAR.ordinal()).setCreativeTab(tabAdvRocketry).setHardness(3f).setUnlocalizedName("satelliteMonitor"); AdvancedRocketryBlocks.blockTerraformingTerminal = new BlockTileTerraformer(TileTerraformingTerminal.class, GuiHandler.guiId.MODULAR.ordinal()).setCreativeTab(tabAdvRocketry).setHardness(3f).setUnlocalizedName("terraformingTerminal"); + AdvancedRocketryBlocks.blockServiceStation = new BlockTile(TileRocketServiceStation.class, GuiHandler.guiId.MODULARNOINV.ordinal()).setCreativeTab(tabAdvRocketry).setHardness(3f).setUnlocalizedName("serviceStation"); //Station machines AdvancedRocketryBlocks.blockWarpShipMonitor = new BlockWarpController(TileWarpController.class, GuiHandler.guiId.MODULARNOINV.ordinal()).setCreativeTab(tabAdvRocketry).setHardness(3f).setUnlocalizedName("stationmonitor"); @@ -850,6 +852,7 @@ public void registerBlocks(RegistryEvent.Register evt) { LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockDeployableRocketBuilder.setRegistryName("deployableRocketBuilder")); //Infrastructure machines LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockLoader.setRegistryName("loader"), ItemBlockMeta.class, false); + LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockServiceStation.setRegistryName("serviceStation")); LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockFuelingStation.setRegistryName("fuelingStation")); LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockMonitoringStation.setRegistryName("monitoringStation")); LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockSatelliteControlCenter.setRegistryName("satelliteControlCenter")); diff --git a/src/main/java/zmaster587/advancedRocketry/api/AdvancedRocketryBlocks.java b/src/main/java/zmaster587/advancedRocketry/api/AdvancedRocketryBlocks.java index 72e54a4b6..23d487907 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/AdvancedRocketryBlocks.java +++ b/src/main/java/zmaster587/advancedRocketry/api/AdvancedRocketryBlocks.java @@ -28,6 +28,7 @@ public class AdvancedRocketryBlocks { public static Block blockBipropellantFuelTank; public static Block blockOxidizerFuelTank; public static Block blockFuelingStation; + public static Block blockServiceStation; public static Block blockMonitoringStation, blockSatelliteBuilder, blockSatelliteControlCenter; public static Block blockNuclearFuelTank; public static Block blockMoonTurf, blockHotTurf; diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java index e685b8bc4..74d3d4a6b 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantRocketMotor.java @@ -13,14 +13,16 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import zmaster587.advancedRocketry.api.ARConfiguration; import zmaster587.advancedRocketry.api.IRocketEngine; import zmaster587.advancedRocketry.tile.TileBrokenPart; +import zmaster587.advancedRocketry.util.IBrokenPartBlock; import zmaster587.libVulpes.block.BlockFullyRotatable; import javax.annotation.Nonnull; import javax.annotation.Nullable; -public class BlockBipropellantRocketMotor extends BlockFullyRotatable implements IRocketEngine { +public class BlockBipropellantRocketMotor extends BlockFullyRotatable implements IRocketEngine, IBrokenPartBlock { public BlockBipropellantRocketMotor(Material mat) { super(mat); @@ -67,10 +69,9 @@ public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, Entity @Override public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { if (!world.isRemote && !player.isCreative()) { - ItemStack drop = new ItemStack(this.getItemDropped(state, world.rand, 0)); - TileBrokenPart tile = (TileBrokenPart) te; - drop.setItemDamage(tile.getStage()); + + ItemStack drop = getDropItem(state, world, tile); world.spawnEntity(new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), drop)); } @@ -98,6 +99,15 @@ public boolean hasTileEntity(IBlockState state) { @Nullable @Override public TileEntity createTileEntity(final World worldIn, final IBlockState state) { - return new TileBrokenPart(10, 0.025F); + return new TileBrokenPart(10, (float) ARConfiguration.getCurrentConfig().increaseWearIntensityProb); + } + + @Override + public ItemStack getDropItem(final IBlockState state, final World world, final @Nullable TileBrokenPart te) { + ItemStack drop = new ItemStack(this.getItemDropped(state, world.rand, 0)); + if (te != null) { + drop.setItemDamage(te.getStage()); + } + return drop; } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockPressurizedFluidTank.java b/src/main/java/zmaster587/advancedRocketry/block/BlockPressurizedFluidTank.java index b6ef309cf..cd6dffcfa 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockPressurizedFluidTank.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockPressurizedFluidTank.java @@ -39,7 +39,7 @@ public class BlockPressurizedFluidTank extends Block { public BlockPressurizedFluidTank(Material material) { super(material); - isBlockContainer = true; + hasTileEntity = true; } @Override diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java index 95c8e16a3..90f6ba96a 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java @@ -9,6 +9,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -16,12 +17,13 @@ import zmaster587.advancedRocketry.api.ARConfiguration; import zmaster587.advancedRocketry.api.IRocketEngine; import zmaster587.advancedRocketry.tile.TileBrokenPart; +import zmaster587.advancedRocketry.util.IBrokenPartBlock; import zmaster587.libVulpes.block.BlockFullyRotatable; import javax.annotation.Nonnull; import javax.annotation.Nullable; -public class BlockRocketMotor extends BlockFullyRotatable implements IRocketEngine { +public class BlockRocketMotor extends BlockFullyRotatable implements IRocketEngine, IBrokenPartBlock { public BlockRocketMotor(Material mat) { super(mat); @@ -83,22 +85,21 @@ public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, Entity ((TileBrokenPart) te).setStage(stack.getItemDamage()); } -// @Override -// public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { -// if (!worldIn.isRemote) { -// TileEntity te = worldIn.getTileEntity(pos); -// ((TileBrokenPart) te).transition(); -// } -// return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); -// } + @Override + public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { + if (!worldIn.isRemote) { + TileEntity te = worldIn.getTileEntity(pos); + ((TileBrokenPart) te).transition(); + } + return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); + } @Override public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { if (!world.isRemote && !player.isCreative()) { - ItemStack drop = new ItemStack(this.getItemDropped(state, world.rand, 0)); - TileBrokenPart tile = (TileBrokenPart) te; - drop.setItemDamage(tile.getStage()); + + ItemStack drop = getDropItem(state, world, tile); world.spawnEntity(new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), drop)); } @@ -128,4 +129,13 @@ public boolean hasTileEntity(IBlockState state) { public TileEntity createTileEntity(final World worldIn, final IBlockState state) { return new TileBrokenPart(10, 2 * (float) ARConfiguration.getCurrentConfig().increaseWearIntensityProb); } + + @Override + public ItemStack getDropItem(final IBlockState state, final World world, final @Nullable TileBrokenPart te) { + ItemStack drop = new ItemStack(this.getItemDropped(state, world.rand, 0)); + if (te != null) { + drop.setItemDamage(te.getStage()); + } + return drop; + } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/CrystalColorizer.java b/src/main/java/zmaster587/advancedRocketry/block/CrystalColorizer.java index 25c6df5b7..7139bf40d 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/CrystalColorizer.java +++ b/src/main/java/zmaster587/advancedRocketry/block/CrystalColorizer.java @@ -12,7 +12,7 @@ public class CrystalColorizer implements IBlockColor, IItemColor { @Override - public int getColorFromItemstack(@Nonnull ItemStack stack, int tintIndex) { + public int colorMultiplier(@Nonnull ItemStack stack, int tintIndex) { return BlockCrystal.EnumCrystal.values()[stack.getItemDamage()].getColor(); } diff --git a/src/main/java/zmaster587/advancedRocketry/client/ClientProxy.java b/src/main/java/zmaster587/advancedRocketry/client/ClientProxy.java index e00154bea..d618b0402 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/ClientProxy.java +++ b/src/main/java/zmaster587/advancedRocketry/client/ClientProxy.java @@ -149,7 +149,7 @@ public void init() { Minecraft.getMinecraft().getItemColors().registerItemColorHandler(colorizer, Item.getItemFromBlock(AdvancedRocketryBlocks.blockCrystal)); Minecraft.getMinecraft().getItemColors().registerItemColorHandler(new IItemColor() { - public int getColorFromItemstack(@Nonnull ItemStack stack, int tintIndex) { + public int colorMultiplier(@Nonnull ItemStack stack, int tintIndex) { return tintIndex > 0 ? -1 : ((ItemArmor) stack.getItem()).getColor(stack); } }, AdvancedRocketryItems.itemSpaceSuit_Boots, AdvancedRocketryItems.itemSpaceSuit_Chest, AdvancedRocketryItems.itemSpaceSuit_Helmet, AdvancedRocketryItems.itemSpaceSuit_Leggings); diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/entity/RenderButtonUIEntity.java b/src/main/java/zmaster587/advancedRocketry/client/render/entity/RenderButtonUIEntity.java index e64f1f95e..f29e76128 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/entity/RenderButtonUIEntity.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/entity/RenderButtonUIEntity.java @@ -36,7 +36,7 @@ public void doRender(EntityUIButton entity, double x, double y, double z, GL11.glTranslated(0, -.25, 0); - RenderHelper.renderTag(Minecraft.getMinecraft().player.getDistanceSqToEntity(entity), "Up a level", x, y, z, 8); + RenderHelper.renderTag(Minecraft.getMinecraft().player.getDistanceSq(entity), "Up a level", x, y, z, 8); GL11.glPopMatrix(); //Clean up and make player not transparent diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/entity/RenderStarUIEntity.java b/src/main/java/zmaster587/advancedRocketry/client/render/entity/RenderStarUIEntity.java index 0bb88c62e..69fa6dac2 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/entity/RenderStarUIEntity.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/entity/RenderStarUIEntity.java @@ -47,7 +47,7 @@ public void doRender(EntityUIStar entity, double x, double y, double z, GL11.glTranslated(x, y, z); GL11.glScalef(sizeScale, sizeScale, sizeScale); - RenderHelper.setupPlayerFacingMatrix(Minecraft.getMinecraft().player.getDistanceSqToEntity(entity), 0, -.45, 0); + RenderHelper.setupPlayerFacingMatrix(Minecraft.getMinecraft().player.getDistanceSq(entity), 0, -.45, 0); Minecraft.getMinecraft().renderEngine.bindTexture(TextureResources.locationSunNew); BufferBuilder buffer = Tessellator.getInstance().getBuffer(); diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/multiblocks/RendererCrystallizer.java b/src/main/java/zmaster587/advancedRocketry/client/render/multiblocks/RendererCrystallizer.java index 13c1db361..e4324f0a8 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/multiblocks/RendererCrystallizer.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/multiblocks/RendererCrystallizer.java @@ -95,7 +95,7 @@ public void render(TileEntity tile, double x, GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - int color = Minecraft.getMinecraft().getItemColors().getColorFromItemstack(stack, 0); + int color = Minecraft.getMinecraft().getItemColors().colorMultiplier(stack, 0); float divisor = 1 / 255f; diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java index b9f46860e..878707a50 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java @@ -2330,7 +2330,7 @@ public void onInventoryButtonPressed(int buttonId) { @Override public boolean canInteractWithContainer(EntityPlayer entity) { - boolean ret = !this.isDead && this.getDistanceToEntity(entity) < 64; + boolean ret = !this.isDead && this.getDistance(entity) < 64; if (!ret) RocketInventoryHelper.removePlayerFromInventoryBypass(entity); diff --git a/src/main/java/zmaster587/advancedRocketry/item/ItemJackHammer.java b/src/main/java/zmaster587/advancedRocketry/item/ItemJackHammer.java index ebae06bd7..6aa3551b3 100644 --- a/src/main/java/zmaster587/advancedRocketry/item/ItemJackHammer.java +++ b/src/main/java/zmaster587/advancedRocketry/item/ItemJackHammer.java @@ -21,7 +21,7 @@ public class ItemJackHammer extends ItemTool { public ItemJackHammer(ToolMaterial toolMaterial) { super(toolMaterial, items); - efficiencyOnProperMaterial = 50f; + efficiency = 50f; } @Override @@ -30,9 +30,10 @@ public boolean getIsRepairable(@Nonnull ItemStack stackMe, ItemStack stackItem) return OreDictionary.itemMatches(OreDictionary.getOres("stickTitanium").get(0), stackItem, false);//super.getIsRepairable(p_82789_1_, p_82789_2_); } + @Override @ParametersAreNonnullByDefault - public float getStrVsBlock(@Nonnull ItemStack stack, IBlockState state) { - return state.getMaterial() == Material.IRON || state.getMaterial() == Material.ROCK || state.getMaterial() == MaterialGeode.geode ? this.efficiencyOnProperMaterial : super.getStrVsBlock(stack, state); + public float getDestroySpeed(@Nonnull ItemStack stack, IBlockState state) { + return state.getMaterial() == Material.IRON || state.getMaterial() == Material.ROCK || state.getMaterial() == MaterialGeode.geode ? this.efficiency : super.getDestroySpeed(stack, state); } diff --git a/src/main/java/zmaster587/advancedRocketry/item/tools/ItemBasicLaserGun.java b/src/main/java/zmaster587/advancedRocketry/item/tools/ItemBasicLaserGun.java index cf9f24fba..2e50ef406 100644 --- a/src/main/java/zmaster587/advancedRocketry/item/tools/ItemBasicLaserGun.java +++ b/src/main/java/zmaster587/advancedRocketry/item/tools/ItemBasicLaserGun.java @@ -41,7 +41,7 @@ public ItemBasicLaserGun() { } @Override - public float getStrVsBlock(@Nonnull ItemStack stack, IBlockState state) { + public float getDestroySpeed(@Nonnull ItemStack stack, IBlockState state) { return 0; } diff --git a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java new file mode 100644 index 000000000..5eb1f9487 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java @@ -0,0 +1,512 @@ +package zmaster587.advancedRocketry.tile.infrastructure; + +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ITickable; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import zmaster587.advancedRocketry.AdvancedRocketry; +import zmaster587.advancedRocketry.api.EntityRocketBase; +import zmaster587.advancedRocketry.api.IFuelTank; +import zmaster587.advancedRocketry.api.IInfrastructure; +import zmaster587.advancedRocketry.api.IMission; +import zmaster587.advancedRocketry.block.*; +import zmaster587.advancedRocketry.entity.EntityRocket; +import zmaster587.advancedRocketry.inventory.TextureResources; +import zmaster587.advancedRocketry.tile.TileBrokenPart; +import zmaster587.advancedRocketry.tile.multiblock.machine.TilePrecisionAssembler; +import zmaster587.advancedRocketry.util.IBrokenPartBlock; +import zmaster587.advancedRocketry.util.StorageChunk; +import zmaster587.libVulpes.LibVulpes; +import zmaster587.libVulpes.compat.InventoryCompat; +import zmaster587.libVulpes.interfaces.ILinkableTile; +import zmaster587.libVulpes.inventory.modules.*; +import zmaster587.libVulpes.items.ItemLinker; +import zmaster587.libVulpes.network.PacketEntity; +import zmaster587.libVulpes.network.PacketHandler; +import zmaster587.libVulpes.network.PacketMachine; +import zmaster587.libVulpes.tile.IComparatorOverride; +import zmaster587.libVulpes.util.IAdjBlockUpdate; +import zmaster587.libVulpes.util.INetworkMachine; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +public class TileRocketServiceStation extends TileEntity implements IModularInventory, ITickable, IAdjBlockUpdate, IInfrastructure, ILinkableTile, INetworkMachine, IButtonInventory, IProgressBar, IComparatorOverride { + + EntityRocketBase linkedRocket; + + ModuleText destroyProbText; + ModuleText destroyProgressText; + ModuleText wornMotorsText; + ModuleText wornSeatsText; + ModuleText wornTanksText; + ModuleText wornMotorsCount; + ModuleText wornSeatsCount; + ModuleText wornTanksCount; + boolean was_powered = false; + + List assemblers = new ArrayList<>(); + TileBrokenPart[] partsProcessing = new TileBrokenPart[0]; + IBlockState[] statesProcessing = new IBlockState[0]; + + List partsToRepair = new LinkedList<>(); + List statesToRepair = new LinkedList<>(); + List posesToRepair = new LinkedList<>(); + + public TileRocketServiceStation() { + destroyProbText = new ModuleText(90, 30, LibVulpes.proxy.getLocalizedString("msg.serviceStation.destroyProbNA"), 0x2b2b2b, true); + wornMotorsText = new ModuleText(40, 30 + 30, LibVulpes.proxy.getLocalizedString("msg.serviceStation.wornMotorsText"), 0x2b2b2b, true); + wornSeatsText = new ModuleText(90, 30 + 30, LibVulpes.proxy.getLocalizedString("msg.serviceStation.wornSeatsText"), 0x2b2b2b, true); + wornTanksText = new ModuleText(140, 30 + 30, LibVulpes.proxy.getLocalizedString("msg.serviceStation.wornTanksText"), 0x2b2b2b, true); + destroyProgressText = new ModuleText(90, 120, LibVulpes.proxy.getLocalizedString("msg.serviceStation.serviceProgressNA"), 0x2b2b2b, true); + + wornMotorsCount = new ModuleText(40, 30 + 30 + 10, "0", 0x2b2b2b, true); + wornSeatsCount = new ModuleText(90, 30 + 30 + 10, "0", 0x2b2b2b, true); + wornTanksCount = new ModuleText(140, 30 + 30 + 10, "0", 0x2b2b2b, true); + } + + @Override + public void invalidate() { + super.invalidate(); + + if (linkedRocket != null) { + linkedRocket.unlinkInfrastructure(this); + unlinkRocket(); + } + } + + public boolean getEquivalentPower() { + //if (state == RedstoneState.OFF) + // return false; + + boolean state2 = world.isBlockIndirectlyGettingPowered(pos) > 0; + + //if (state == RedstoneState.INVERTED) + // state2 = !state2; + return state2; + } + + @Override + public void onAdjacentBlockUpdated() { + + } + + @Override + public int getMaxLinkDistance() { + return 3000; + } + + public void updateRepairList() { + EntityRocket rocket = (EntityRocket) linkedRocket; + partsToRepair = new LinkedList<>(); + statesToRepair = new LinkedList<>(); + + for (TileEntity te : rocket.storage.getTileEntityList()) { + if (te instanceof TileBrokenPart) { + partsToRepair.add((TileBrokenPart) te); + statesToRepair.add(rocket.storage.getBlockState(te.getPos())); + } + } + } + + public void scanForAssemblers() { + this.assemblers = new ArrayList<>(); + + int size = 5; + + for (int x = getPos().getX() - size; x < getPos().getX() + size; x++) { + for (int y = getPos().getY() - size; y < getPos().getY() + size; y++) { + for (int z = getPos().getZ() - size; z < getPos().getZ() + size; z++) { + TileEntity te = world.getTileEntity(new BlockPos(x, y, z)); + if (te instanceof TilePrecisionAssembler) { + this.assemblers.add((TilePrecisionAssembler) te); + } + } + } + } + + this.statesProcessing = new IBlockState[assemblers.size()]; + this.partsProcessing = new TileBrokenPart[assemblers.size()]; + } + + private boolean hasItemInInventories(Iterable invs, String substr, boolean consume) { + for (IInventory inv : invs) { + if (hasItemInInventory(inv, substr, consume)) { + return true; + } + } + return false; + } + + private boolean hasItemInInventory(IInventory inv, String substr, boolean consume) { + for (int i = 0; i < inv.getSizeInventory(); i++) { + if (inv.getStackInSlot(i).getUnlocalizedName().toLowerCase().contains(substr)) { + if (consume) { + inv.setInventorySlotContents(i, ItemStack.EMPTY); + } + return true; + } + } + return false; + } + + private boolean addItemToOneOfTheInventories(Iterable invs, ItemStack stack) { + for (IInventory inv : invs) { + if (addItemToInventory(inv, stack)) { + return true; + } + } + return false; + } + + private boolean addItemToInventory(IInventory inv, ItemStack stack) { + for (int i = 0; i < inv.getSizeInventory(); i++) { + if (inv.getStackInSlot(i).isEmpty()) { + inv.setInventorySlotContents(i, stack); + return true; + } + } + return false; + } + + private boolean processAssemblerResult(int index) { + StorageChunk storage = ((EntityRocket) linkedRocket).storage; + TilePrecisionAssembler assembler = assemblers.get(index); + + if (hasItemInInventories(assembler.getItemOutPorts(), "rocket", true)) { + IBlockState state = statesProcessing[index]; + TileBrokenPart te = partsProcessing[index]; + + te.setStage(0); + storage.addTileEntity(te); + storage.setBlockState(te.getPos(), state); + + statesProcessing[index] = null; + partsProcessing[index] = null; + + assembler.markDirty(); + + return true; + } + return false; + } + + private void syncRocket() { + NBTTagCompound nbtdata = new NBTTagCompound(); + + linkedRocket.writeToNBT(nbtdata); + PacketHandler.sendToNearby(new PacketEntity((EntityRocket) linkedRocket, (byte) 0, nbtdata), linkedRocket.world.provider.getDimension(), this.pos, 64); + } + + private void consumePartToRepair(int assemblerIndex) { + StorageChunk storage = ((EntityRocket) linkedRocket).storage; + + TilePrecisionAssembler assembler = assemblers.get(assemblerIndex); + TileBrokenPart part = partsToRepair.get(0); + IBlockState state = statesToRepair.get(0); + IBrokenPartBlock partBlock = (IBrokenPartBlock) part.getBlockType(); + + // add to processing list + statesProcessing[assemblerIndex] = state; + partsProcessing[assemblerIndex] = part; + + // add to the assembler + // TODO Test! + ItemStack resultingStack = partBlock.getDropItem(statesToRepair.get(0), world, part); + if (!addItemToOneOfTheInventories(assembler.getItemInPorts(), resultingStack)) { + AdvancedRocketry.logger.error("Precision assembler at " + assembler.getPos() + " overflows. Repaired part lost"); + } + statesToRepair.remove(0); + partsToRepair.remove(0); + + // consume parts from the rocket + storage.getTileEntityList().remove(part); + storage.setBlockState(part.getPos(), Blocks.AIR.getDefaultState()); + assembler.onInventoryUpdated(); + } + + public void giveWorkToAssemblers() { + boolean dirty = false; + for (int i = 0; i < assemblers.size(); i++) { + dirty = dirty || processAssemblerResult(i); + + TilePrecisionAssembler assembler = assemblers.get(i); + + // TODO Implement a better way to match damageable blocks' stacks + if (assembler.getItemInPorts().isEmpty() + || assembler.getItemInPorts().get(0).getStackInSlot(0) + .getUnlocalizedName().contains("rocket")) { + // assembler already have a motor for work, skipping + continue; + } + + if (!this.partsToRepair.isEmpty() && statesProcessing[i] == null) { + consumePartToRepair(i); + dirty = true; + } + } + if (dirty) { + syncRocket(); + } + } + + @Override + public void update() { + if (!world.isRemote && world.getWorldTime() % 20 == 0) { + if (linkedRocket instanceof EntityRocket) { + if (getEquivalentPower() && linkedRocket != null) { + if (!was_powered) { + scanForAssemblers(); + was_powered = true; + } + + giveWorkToAssemblers(); + } + } + if (!getEquivalentPower()) { + was_powered = false; + } + } + } + + + @Override + public boolean onLinkStart(@Nonnull ItemStack item, TileEntity entity, EntityPlayer player, World world) { + ItemLinker.setMasterCoords(item, getPos()); + if (linkedRocket != null) { + linkedRocket.unlinkInfrastructure(this); + unlinkRocket(); + } + + if (player.world.isRemote) + Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(new TextComponentTranslation("%s %s", new TextComponentTranslation("msg.serviceStation.link"), ": " + getPos().getX() + " " + getPos().getY() + " " + getPos().getZ())); + return true; + } + + @Override + public boolean onLinkComplete(@Nonnull ItemStack item, TileEntity entity, EntityPlayer player, World world) { + if (player.world.isRemote) + Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(new TextComponentTranslation("msg.linker.error.firstMachine")); + return false; + } + + @Override + public void unlinkRocket() { + linkedRocket = null; + } + + @Override + public boolean disconnectOnLiftOff() { + return true; + } + + @Override + public boolean linkRocket(EntityRocketBase rocket) { + this.linkedRocket = rocket; + if (rocket instanceof EntityRocket) { + updateRepairList(); + } + return true; + } + + @Override + public NBTTagCompound getUpdateTag() { + return writeToNBT(new NBTTagCompound()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + was_powered = nbt.getBoolean("was_powered"); + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setBoolean("was_powered", was_powered); + return nbt; + } + + @Override + public void writeDataToNetwork(ByteBuf out, byte id) { + + } + + @Override + public void readDataFromNetwork(ByteBuf in, byte packetId, + NBTTagCompound nbt) { + + } + + @Override + public void useNetworkData(EntityPlayer player, Side side, byte id, + NBTTagCompound nbt) { + + } + + @Override + public List getModules(int ID, EntityPlayer player) { + LinkedList modules = new LinkedList<>(); + + modules.add(new ModuleButton(63, 100, 0, "Repair!", this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild)); + + updateText(); + + modules.add(destroyProbText); + modules.add(wornMotorsText); + modules.add(wornSeatsText); + modules.add(wornTanksText); + modules.add(destroyProgressText); + modules.add(wornMotorsCount); + modules.add(wornSeatsCount); + modules.add(wornTanksCount); + + modules.add(new ModuleProgress(32, 133, 3, TextureResources.progressToMission, this)); + + if (!world.isRemote) { + PacketHandler.sendToPlayer(new PacketMachine(this, (byte) 1), player); + } + + return modules; + } + + private void updateText() { + if (linkedRocket != null) { + if (!(linkedRocket instanceof EntityRocket)) { + System.out.println("Huh, error...."); + destroyProbText.setText(LibVulpes.proxy.getLocalizedString("msg.serviceStation.destroyProbNA")); + return; + } + EntityRocket rocket = (EntityRocket) linkedRocket; + destroyProbText.setText(LibVulpes.proxy.getLocalizedString("msg.serviceStation.destroyProb") + ": " + rocket.storage.getBreakingProbability()); + List brokenParts = rocket.storage.getBrokenBlocks(); + long motorsCount = brokenParts + .stream() + .filter(te -> te.getStage() > 0 && (te.getBlockType() instanceof BlockRocketMotor + || te.getBlockType() instanceof BlockBipropellantRocketMotor)) + .count(); + long seatsCount = brokenParts + .stream() + .filter(te -> te.getStage() > 0 && te.getBlockType() instanceof BlockSeat) + .count(); + long tanksCount = brokenParts + .stream() + .filter(te -> te.getStage() > 0 && te.getBlockType() instanceof IFuelTank) + .count(); + + this.wornMotorsCount.setText(String.valueOf(motorsCount)); + this.wornSeatsCount.setText(String.valueOf(seatsCount)); + this.wornTanksCount.setText(String.valueOf(tanksCount)); + } else { + destroyProbText.setText(LibVulpes.proxy.getLocalizedString("msg.serviceStation.destroyProbNA")); + } + } + + @Override + public void onInventoryButtonPressed(int buttonId) { + if (buttonId != -1) + PacketHandler.sendToServer(new PacketMachine(this, (byte) (buttonId + 100))); + else { + //state = redstoneControl.getState(); + PacketHandler.sendToServer(new PacketMachine(this, (byte) 2)); + } + } + + @Override + public String getModularInventoryName() { + return "container.servicestation"; + } + + @Override + public float getNormallizedProgress(int id) { + if (id == 1) { + return Math.max(Math.min(0.5f + (getProgress(id) / (float) getTotalProgress(id)), 1), 0f); + } + + //keep text updated + if (world.isRemote) + updateText(); + + return Math.min(getProgress(id) / (float) getTotalProgress(id), 1.0f); + } + + @Override + public void setProgress(int id, int progress) { + + } + + @Override + public int getProgress(int id) { + //Try to keep client synced with server, this also allows us to put the monitor on a different world altogether + if (world.isRemote) + if (id == 0) { + if (!(linkedRocket instanceof EntityRocket)) { + System.out.println("Huh, error...."); + return 0; + } + EntityRocket rocket = (EntityRocket) linkedRocket; + return 0; + } + + return 0; + } + + @Override + public int getTotalProgress(int id) { +// if (id == 0) +// return ARConfiguration.getCurrentConfig().orbit; +// else if (id == 1) +// return 200; + return 1; + } + + @Override + public void setTotalProgress(int id, int progress) { + //Should only become an issue if configs are desynced or fuel +// if (id == 2) +// maxFuelLevel = progress; + } + + @Override + public boolean canInteractWithContainer(EntityPlayer entity) { + return true; + } + + @Override + public boolean linkMission(IMission mission) { + return false; + } + + @Override + public void unlinkMission() { + updateText(); + } + + @Override + public boolean canRenderConnection() { + return false; + } + + @Override + public int getComparatorOverride() { +// if (linkedRocket instanceof EntityRocket) { +// return (int) (15 * ((EntityRocket) linkedRocket).getRelativeHeightFraction()); +// } + return 0; + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/IBrokenPartBlock.java b/src/main/java/zmaster587/advancedRocketry/util/IBrokenPartBlock.java new file mode 100644 index 000000000..73b57568f --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/IBrokenPartBlock.java @@ -0,0 +1,13 @@ +package zmaster587.advancedRocketry.util; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import zmaster587.advancedRocketry.tile.TileBrokenPart; + +import javax.annotation.Nullable; + +public interface IBrokenPartBlock { + + ItemStack getDropItem(final IBlockState state, final World world, final @Nullable TileBrokenPart te); +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java index c758f5686..25f4508ff 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java +++ b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java @@ -51,10 +51,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; +import java.util.*; public class StorageChunk implements IBlockAccess, IStorageChunk, IWeighted, IBreakable { @@ -64,6 +61,7 @@ public class StorageChunk implements IBlockAccess, IStorageChunk, IWeighted, IBr private Block[][][] blocks; public int sizeX, sizeY, sizeZ; private short[][][] metas; + private Map pos2te = new HashMap<>(); private ArrayList tileEntities; //To store inventories (All inventories) private ArrayList inventoryTiles; @@ -71,9 +69,9 @@ public class StorageChunk implements IBlockAccess, IStorageChunk, IWeighted, IBr private Entity entity; private float weight; - public Block[][][] getblocks(){ - return blocks; -} + public Block[][][] getblocks() { + return blocks; + } public StorageChunk() { sizeX = 0; @@ -152,6 +150,11 @@ public float recalculateWeight() { return this.weight; } + public void addTileEntity(TileEntity te) { + pos2te.put(te.getPos(), te); + tileEntities.add(te); + } + public static StorageChunk copyWorldBB(World world, AxisAlignedBB bb) { int actualMinX = (int) bb.maxX, actualMinY = (int) bb.maxY, @@ -228,7 +231,7 @@ public static StorageChunk copyWorldBB(World world, AxisAlignedBB bb) { ret.liquidTiles.add(newTile); } - ret.tileEntities.add(newTile); + ret.addTileEntity(newTile); } } } @@ -337,7 +340,7 @@ public IBlockState getBlockState(BlockPos pos) { public void setBlockState(BlockPos pos, IBlockState state) { - System.out.println("Block "+pos.getX()+":"+pos.getY()+":"+pos.getZ()+" set to "+state.getBlock().getUnlocalizedName()); +// System.out.println("Block "+pos.getX()+":"+pos.getY()+":"+pos.getZ()+" set to "+state.getBlock().getUnlocalizedName()); int x = pos.getX(); int y = pos.getY(); @@ -548,7 +551,6 @@ public void readFromNBT(NBTTagCompound nbt) { int[] metasId = nbt.getIntArray("metaList"); - for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { for (int z = 0; z < sizeZ; z++) { @@ -556,7 +558,7 @@ public void readFromNBT(NBTTagCompound nbt) { metas[x][y][z] = (short) metasId[z + (sizeZ * y) + (sizeZ * sizeY * x)]; chunk.setBlockState(new BlockPos(x, y, z), this.blocks[x][y][z].getStateFromMeta(this.metas[x][y][z])); - world.checkLightFor(EnumSkyBlock.BLOCK,new BlockPos(x, y, z)); + world.checkLightFor(EnumSkyBlock.BLOCK, new BlockPos(x, y, z)); } } } @@ -577,7 +579,7 @@ public void readFromNBT(NBTTagCompound nbt) { liquidTiles.add(tile); } - tileEntities.add(tile); + this.addTileEntity(tile); tile.setWorld(world); chunk.addTileEntity(tile); @@ -678,13 +680,9 @@ public void pasteInWorld(World world, int xCoord, int yCoord, int zCoord, boolea } } - @Override + @Nullable public TileEntity getTileEntity(@Nonnull BlockPos pos) { - for (TileEntity tileE : tileEntities) { - if (tileE.getPos().compareTo(pos) == 0) - return tileE; - } - return null; + return pos2te.getOrDefault(pos, null); } @Override @@ -778,6 +776,18 @@ public float getBreakingProbability() { return prob; } + public List getBrokenBlocks() { + List res = new ArrayList<>(); + + for (TileEntity te : tileEntities) { + if (te instanceof TileBrokenPart) { + res.add((TileBrokenPart) te); + } + } + + return res; + } + public boolean shouldBreak() { return world.rand.nextFloat() < this.getBreakingProbability(); } @@ -867,7 +877,8 @@ public void readtiles(ByteBuf in) { } } } - public void writetiles(ByteBuf out){ + + public void writetiles(ByteBuf out) { PacketBuffer buffer = new PacketBuffer(out); buffer.writeShort(tileEntities.size()); Iterator tileIterator = tileEntities.iterator(); @@ -895,7 +906,7 @@ public void writetiles(ByteBuf out){ public void writeToNetwork(ByteBuf out) { - if (DimensionManager.getWorld(0).isRemote)System.out.println("This should have never been called!"); + if (DimensionManager.getWorld(0).isRemote) System.out.println("This should have never been called!"); PacketBuffer buffer = new PacketBuffer(out); @@ -953,7 +964,6 @@ public void readFromNetwork(ByteBuf in) { chunk = new Chunk(world, 0, 0); - for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { for (int z = 0; z < sizeZ; z++) { diff --git a/src/main/resources/assets/advancedrocketry/blockstates/servicestation.json b/src/main/resources/assets/advancedrocketry/blockstates/servicestation.json new file mode 100644 index 000000000..7ad584e96 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/blockstates/servicestation.json @@ -0,0 +1,23 @@ +{ + "forge_marker": 1, + "defaults": { + "transform": "forge:default-block", + "model": "minecraft:orientable", + "textures": { + "top": "libvulpes:blocks/machinegeneric", + "front": "advancedrocketry:blocks/monitorrocket", + "side": "libvulpes:blocks/machinegeneric" + } + }, + "variants": { + "facing=north,state=false": [{}], + "facing=south,state=false": { "model": "minecraft:orientable", "y": 180 }, + "facing=west,state=false": { "model": "minecraft:orientable", "y": 270 }, + "facing=east,state=false": { "model": "minecraft:orientable", "y": 90 }, + "facing=north,state=true": [{}], + "facing=south,state=true": { "model": "minecraft:orientable", "y": 180 }, + "facing=west,state=true": { "model": "minecraft:orientable", "y": 270 }, + "facing=east,state=true": { "model": "minecraft:orientable", "y": 90 }, + "inventory" : [{}] + } +} diff --git a/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang b/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang index eacf1b5c5..ce0eff29b 100644 --- a/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang +++ b/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang @@ -7,6 +7,7 @@ entity.advancedRocketry.rocket.name=Ракета entity.rocket.name=Ракета tile.landingPad.name=Посадочная площадка +tile.serviceStation.name=Станция техобслуживания tile.seat.name=Сиденье tile.pad.name=Стартовая площадка tile.structuretower.name=Структурная башня @@ -180,6 +181,7 @@ container.observatory=Обсерватория container.satellite=Отсек для спутника container.monitoringstation=Станция мониторинга container.satelliteMonitor=Спутниковый терминал +container.servicestation=Станция техобслуживания enchantment.spaceBreathing=Герметичная изоляция @@ -265,6 +267,15 @@ msg.fuelingStation.link=Вы подключили частотный связы msg.monitoringStation.missionProgressNA=Прогресс миссии: Н/Д msg.monitoringStation.link=Вы подключили частотный связыватель к станции мониторинга на msg.monitoringStation.progress=Прогресс: + +msg.serviceStation.destroyProbNA=Вероятность разрушения: Н/Д +msg.serviceStation.destroyProb=Вероятность разрушения: +msg.serviceStation.serviceProgress=Прогресс обслуживания: +msg.serviceStation.serviceProgressNA=Прогресс обслуживания: Н/Д +msg.serviceStation.wornMotorsText=Двигатели +msg.serviceStation.wornSeatsText=Сиденья +msg.serviceStation.wornTanksText=Резервуары + msg.guidanceComputerHatch.loadingState=Состояние загрузки: msg.guidanceComputerHatch.ejectonlanding=Автоматический выброс при посадке msg.guidanceComputerHatch.ejectonsatlanding=Разрешить выброс спутниковых чипов From 5cba7fc1b84cfb60c65226383c0243e4369fb3b0 Mon Sep 17 00:00:00 2001 From: Quarter Date: Mon, 22 Jul 2024 13:35:09 +0300 Subject: [PATCH 25/42] Service station now working --- .../client/render/RendererBrokenPart.java | 43 +-- .../tile/TileEntitySyncable.java | 6 +- .../TileRocketServiceStation.java | 47 +++- .../advancedRocketry/util/nbt/Factory.java | 6 + .../advancedRocketry/util/nbt/NBTHelper.java | 257 ++++++++++++++++++ .../util/nbt/NBTTagCompoundBuilder.java | 161 +++++++++++ .../util/nbt/NBTTagListCollector.java | 48 ++++ .../util/nbt/ParametrizedFactory.java | 6 + .../resources/META-INF/accessTransformer.cfg | 5 +- 9 files changed, 549 insertions(+), 30 deletions(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/util/nbt/Factory.java create mode 100644 src/main/java/zmaster587/advancedRocketry/util/nbt/NBTHelper.java create mode 100644 src/main/java/zmaster587/advancedRocketry/util/nbt/NBTTagCompoundBuilder.java create mode 100644 src/main/java/zmaster587/advancedRocketry/util/nbt/NBTTagListCollector.java create mode 100644 src/main/java/zmaster587/advancedRocketry/util/nbt/ParametrizedFactory.java diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java index d246269df..054860a81 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java @@ -11,34 +11,35 @@ public class RendererBrokenPart extends TileEntitySpecialRenderer= 0) { - this.bindTexture(DESTROY_STAGES[destroyStage]); - GlStateManager.matrixMode(5890); + if (!name.equals("air")) { GlStateManager.pushMatrix(); - GlStateManager.scale(4.0F, 4.0F, 1.0F); - GlStateManager.translate(0.0625F, 0.0625F, 0.0625F); - GlStateManager.matrixMode(5888); - } else { - this.bindTexture(new ResourceLocation(res.getResourceDomain(), pathToTexture)); - } + GlStateManager.translate((float) x, (float) y, (float) z); + + if (destroyStage >= 0) { + this.bindTexture(DESTROY_STAGES[destroyStage]); + GlStateManager.matrixMode(5890); + GlStateManager.pushMatrix(); + GlStateManager.scale(4.0F, 4.0F, 1.0F); + GlStateManager.translate(0.0625F, 0.0625F, 0.0625F); + GlStateManager.matrixMode(5888); + } else { + this.bindTexture(new ResourceLocation(res.getResourceDomain(), pathToTexture)); + } + + WavefrontObject model = ClientProxy.getModel(new ResourceLocation(res.getResourceDomain(), "models/block/models/" + name + ".obj")); + model.renderAll(); + + if (destroyStage >= 0) { + GlStateManager.matrixMode(5890); + GlStateManager.popMatrix(); + GlStateManager.matrixMode(5888); + } - WavefrontObject model = ClientProxy.getModel(new ResourceLocation(res.getResourceDomain(), "models/block/models/" + name + ".obj")); - model.renderAll(); - - if (destroyStage >= 0) - { - GlStateManager.matrixMode(5890); GlStateManager.popMatrix(); - GlStateManager.matrixMode(5888); } - - GlStateManager.popMatrix(); } } diff --git a/src/main/java/zmaster587/advancedRocketry/tile/TileEntitySyncable.java b/src/main/java/zmaster587/advancedRocketry/tile/TileEntitySyncable.java index 909793a55..ca3ca3df8 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/TileEntitySyncable.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/TileEntitySyncable.java @@ -10,8 +10,10 @@ public class TileEntitySyncable extends TileEntity { public void markDirty() { super.markDirty(); - IBlockState state = world.getBlockState(pos); - world.notifyBlockUpdate(pos, state, state, 3); + if (hasWorld()) { + IBlockState state = world.getBlockState(pos); + world.notifyBlockUpdate(pos, state, state, 3); + } } @Override diff --git a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java index 5eb1f9487..a68809003 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java @@ -1,13 +1,11 @@ package zmaster587.advancedRocketry.tile.infrastructure; import io.netty.buffer.ByteBuf; -import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -21,15 +19,17 @@ import zmaster587.advancedRocketry.api.IFuelTank; import zmaster587.advancedRocketry.api.IInfrastructure; import zmaster587.advancedRocketry.api.IMission; -import zmaster587.advancedRocketry.block.*; +import zmaster587.advancedRocketry.block.BlockBipropellantRocketMotor; +import zmaster587.advancedRocketry.block.BlockRocketMotor; +import zmaster587.advancedRocketry.block.BlockSeat; import zmaster587.advancedRocketry.entity.EntityRocket; import zmaster587.advancedRocketry.inventory.TextureResources; import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.advancedRocketry.tile.multiblock.machine.TilePrecisionAssembler; import zmaster587.advancedRocketry.util.IBrokenPartBlock; import zmaster587.advancedRocketry.util.StorageChunk; +import zmaster587.advancedRocketry.util.nbt.NBTHelper; import zmaster587.libVulpes.LibVulpes; -import zmaster587.libVulpes.compat.InventoryCompat; import zmaster587.libVulpes.interfaces.ILinkableTile; import zmaster587.libVulpes.inventory.modules.*; import zmaster587.libVulpes.items.ItemLinker; @@ -42,9 +42,10 @@ import javax.annotation.Nonnull; import java.util.ArrayList; -import java.util.Iterator; +import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; public class TileRocketServiceStation extends TileEntity implements IModularInventory, ITickable, IAdjBlockUpdate, IInfrastructure, ILinkableTile, INetworkMachine, IButtonInventory, IProgressBar, IComparatorOverride { @@ -61,12 +62,12 @@ public class TileRocketServiceStation extends TileEntity implements IModularInve boolean was_powered = false; List assemblers = new ArrayList<>(); + List assemblerPoses = new ArrayList<>(); TileBrokenPart[] partsProcessing = new TileBrokenPart[0]; IBlockState[] statesProcessing = new IBlockState[0]; List partsToRepair = new LinkedList<>(); List statesToRepair = new LinkedList<>(); - List posesToRepair = new LinkedList<>(); public TileRocketServiceStation() { destroyProbText = new ModuleText(90, 30, LibVulpes.proxy.getLocalizedString("msg.serviceStation.destroyProbNA"), 0x2b2b2b, true); @@ -192,6 +193,12 @@ private boolean processAssemblerResult(int index) { IBlockState state = statesProcessing[index]; TileBrokenPart te = partsProcessing[index]; + if (te == null) { + AdvancedRocketry.logger.warn("Rocket service station at " + getPos() + + " is out of sync with connected assemblers! Repairing part lost"); + return false; + } + te.setStage(0); storage.addTileEntity(te); storage.setBlockState(te.getPos(), state); @@ -219,6 +226,12 @@ private void consumePartToRepair(int assemblerIndex) { TilePrecisionAssembler assembler = assemblers.get(assemblerIndex); TileBrokenPart part = partsToRepair.get(0); IBlockState state = statesToRepair.get(0); + if (!(part.getBlockType() instanceof IBrokenPartBlock)) { + AdvancedRocketry.logger.warn("Rocket part at " + part.getPos() + " is out of sync with its block! Removing"); + statesToRepair.remove(0); + partsToRepair.remove(0); + return; + } IBrokenPartBlock partBlock = (IBrokenPartBlock) part.getBlockType(); // add to processing list @@ -273,6 +286,12 @@ public void update() { if (!was_powered) { scanForAssemblers(); was_powered = true; + } else { + if (assemblerPoses != null) { + // lazy access to assembler list loaded from NBT + assemblers = assemblerPoses.stream().map(pos -> (TilePrecisionAssembler) world.getTileEntity(pos)).collect(Collectors.toList()); + assemblerPoses = null; + } } giveWorkToAssemblers(); @@ -333,12 +352,28 @@ public NBTTagCompound getUpdateTag() { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); was_powered = nbt.getBoolean("was_powered"); + + if (nbt.hasKey("partsProcessing")) { + // if tile has "new" format + assemblerPoses = NBTHelper.readCollection("assemblerPoses", nbt, ArrayList::new, NBTHelper::readBlockPos); + partsProcessing = NBTHelper.readCollection("partsProcessing", nbt, ArrayList::new, NBTHelper::readTileEntity).toArray(new TileBrokenPart[0]); + statesProcessing = NBTHelper.readCollection("statesProcessing", nbt, ArrayList::new, NBTHelper::readState).toArray(new IBlockState[0]); +// partsToRepair = NBTHelper.readCollection("partsToRepair", nbt, LinkedList::new, tag -> (TileBrokenPart) world.getTileEntity(NBTHelper.readBlockPos(tag))); +// statesToRepair = NBTHelper.readCollection("statesToRepair", nbt, LinkedList::new, NBTHelper::readState); + } } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("was_powered", was_powered); + + NBTHelper.writeCollection("assemblerPoses", nbt, this.assemblers, te -> NBTHelper.writeBlockPos(te.getPos())); + NBTHelper.writeCollection("partsProcessing", nbt, Arrays.asList(this.partsProcessing), NBTHelper::writeTileEntity); + NBTHelper.writeCollection("statesProcessing", nbt, Arrays.asList(this.statesProcessing), NBTHelper::writeState); +// NBTHelper.writeCollection("partsToRepair", nbt, this.partsToRepair, te -> NBTHelper.writeBlockPos(te.getPos())); +// NBTHelper.writeCollection("statesToRepair", nbt, this.statesToRepair, NBTHelper::writeState); + return nbt; } diff --git a/src/main/java/zmaster587/advancedRocketry/util/nbt/Factory.java b/src/main/java/zmaster587/advancedRocketry/util/nbt/Factory.java new file mode 100644 index 000000000..f31c09a3c --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/nbt/Factory.java @@ -0,0 +1,6 @@ +package zmaster587.advancedRocketry.util.nbt; + +public interface Factory { + + T create(); +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTHelper.java b/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTHelper.java new file mode 100644 index 000000000..573911ce8 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTHelper.java @@ -0,0 +1,257 @@ +package zmaster587.advancedRocketry.util.nbt; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.nbt.*; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fml.common.registry.ForgeRegistries; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * Tool for NBT serializing and deserializing collections and other stuff + */ +@SuppressWarnings("unchecked") +public class NBTHelper { + + public static NBTBase NBT_NULL = new NBTTagString("null"); + + public static void writeCollection(String name, NBTTagCompound compound, Collection> collection) { + compound.setTag(name, collectionToNBT(collection)); + } + + public static void writeCollection(String name, NBTTagCompound compound, Collection collection, ParametrizedFactory serializer) { + compound.setTag(name, collectionToNBT(collection, serializer)); + } + + public static > C readCollection(String name, NBTTagCompound compound, Factory collectionFactory, ParametrizedFactory deserializer) { + return collectionFromNBT(getTagList(name, compound), collectionFactory, deserializer); + } + + public static NBTTagList collectionToNBT(Collection> collection) { + NBTTagList tag = new NBTTagList(); + collection.stream().map(INBTSerializable::serializeNBT).forEach(tag::appendTag); + return tag; + } + + public static NBTTagList collectionToNBT(Collection collection, ParametrizedFactory serializer) { + NBTTagList tag = new NBTTagList(); + collection.stream().map(serializer::create).forEach(tag::appendTag); + return tag; + } + + public static > C collectionFromNBT(NBTTagList tag, Factory collectionFactory, ParametrizedFactory deserializer) { + C collection = collectionFactory.create(); + tag.iterator().forEachRemaining(item -> collection.add(deserializer.create((NBT_T) item))); + return collection; + } + + public static void writeMap(String name, NBTTagCompound compound, Map> map) { + compound.setTag(name, mapToNBT(map)); + } + + public static void writeMap(String name, NBTTagCompound compound, Map map, ParametrizedFactory serializer) { + compound.setTag(name, mapToNBT(map, serializer)); + } + + public static Map readMap(String name, NBTTagCompound compound, ParametrizedFactory valueDeserializer) { + return readMap(name, compound, Objects::toString, valueDeserializer); + } + + public static Map readMap(String name, NBTTagCompound compound, ParametrizedFactory keyDeserializer, ParametrizedFactory valueDeserializer) { + return mapFromNBT(compound.getCompoundTag(name), HashMap::new, keyDeserializer, valueDeserializer); + } + + public static NBTTagCompound mapToNBT(Map> map) { + NBTTagCompound compound = new NBTTagCompound(); + map.forEach((key, value) -> write(key.toString(), value, compound)); + return compound; + } + + public static NBTTagCompound mapToNBT(Map map, ParametrizedFactory serializer) { + NBTTagCompound compound = new NBTTagCompound(); + map.forEach((key, value) -> write(key.toString(), serializer.create(value), compound)); + return compound; + } + + public static Map mapFromNBT(NBTTagCompound compound, ParametrizedFactory valueDeserializer) { + return mapFromNBT(compound, Objects::toString, valueDeserializer); + } + + public static Map mapFromNBT(NBTTagCompound compound, ParametrizedFactory keyDeserializer, ParametrizedFactory valueDeserializer) { + return mapFromNBT(compound, HashMap::new, keyDeserializer, valueDeserializer); + } + + public static Map mapFromNBT(NBTTagCompound compound, Factory> mapFactory, ParametrizedFactory keyDeserializer, ParametrizedFactory valueDeserializer) { + Map map = mapFactory.create(); + compound.getKeySet().forEach(key -> map.put(keyDeserializer.create(key), read(key, compound, valueDeserializer))); + return map; + } + + public static void write(String key, INBTSerializable value, NBTTagCompound compound) { + compound.setTag(key, value.serializeNBT()); + } + + public static void write(String key, Object value, NBTTagCompound compound) { + if (value instanceof Integer) { + compound.setInteger(key, (Integer) value); + } else if (value instanceof Long) { + compound.setLong(key, (Long) value); + } else if (value instanceof String) { + compound.setString(key, (String) value); + } else if (value instanceof Boolean) { + compound.setBoolean(key, (Boolean) value); + } else if (value instanceof Float) { + compound.setFloat(key, (Float) value); + } else if (value instanceof Double) { + compound.setDouble(key, (Double) value); + } else if (value instanceof Byte) { + compound.setByte(key, (Byte) value); + } else if (value instanceof NBTBase) { + compound.setTag(key, (NBTBase) value); + } else if (value instanceof byte[]) { + compound.setByteArray(key, (byte[]) value); + } else if (value instanceof int[]) { + compound.setIntArray(key, (int[]) value); + } + } + + public static T read(String key, NBTTagCompound compound, ParametrizedFactory factory) { + return factory.create((NBT_T) compound.getTag(key)); + } + + public static Object read(String key, NBTTagCompound compound) { + NBTBase tag = compound.getTag(key); + if (tag instanceof NBTTagInt) { + return ((NBTTagInt) tag).getInt(); + } else if (tag instanceof NBTTagLong) { + return ((NBTTagLong) tag).getLong(); + } else if (tag instanceof NBTTagString) { + return ((NBTTagString) tag).getString(); + } else if (tag instanceof NBTTagByte) { + return ((NBTTagByte) tag).getByte(); + } else if (tag instanceof NBTTagFloat) { + return ((NBTTagFloat) tag).getFloat(); + } else if (tag instanceof NBTTagDouble) { + return ((NBTTagDouble) tag).getDouble(); + } else if (tag instanceof NBTTagByteArray) { + return ((NBTTagByteArray) tag).getByteArray(); + } else if (tag instanceof NBTTagIntArray) { + return ((NBTTagIntArray) tag).getIntArray(); + } + return null; + } + + public static NBTTagList getTagList(String name, NBTTagCompound compound) { + NBTBase nbt = compound.tagMap.get(name); + if (!(nbt instanceof NBTTagList)) { + throw new IllegalArgumentException("Tag got by name " + name + "isn't NBTTagList!"); + } + return (NBTTagList) nbt; + } + + public static NBTBase writeBlockPos(BlockPos pos) { + return new NBTTagLong(pos.toLong()); + } + + public static BlockPos readBlockPos(NBTBase nbt) { + return BlockPos.fromLong(((NBTTagLong) nbt).getLong()); + } + + public static void writeBlockPos(String key, BlockPos pos, NBTTagCompound compound) { + compound.setLong(key, pos.toLong()); + } + + public static BlockPos readBlockPos(String key, NBTTagCompound compound) { + return BlockPos.fromLong(compound.getLong(key)); + } + + public static NBTBase writeState(IBlockState state) { + if (state == null) { + return NBT_NULL; + } + NBTTagCompound compound = new NBTTagCompound(); + compound.setString("name", state.getBlock().getRegistryName().toString()); + compound.setShort("meta", (short) state.getBlock().getMetaFromState(state)); + return compound; + } + + public static IBlockState readState(NBTBase nbt) { + if (nbt.equals(NBT_NULL)) { + return null; + } + NBTTagCompound compound = (NBTTagCompound) nbt; + String blockName = compound.getString("name"); + Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(blockName)); + return block.getStateFromMeta(compound.getShort("meta")); + } + + public static void writeAABB(String key, NBTTagCompound compound, AxisAlignedBB aabb) { + compound.setTag(key, NBTTagCompoundBuilder + .create() + .setDouble("minX", aabb.minX) + .setDouble("minY", aabb.minY) + .setDouble("minZ", aabb.minZ) + .setDouble("maxX", aabb.maxX) + .setDouble("maxY", aabb.maxY) + .setDouble("maxZ", aabb.maxZ) + .build()); + } + + public static AxisAlignedBB readAABB(String key, NBTTagCompound compound) { + NBTTagCompound tag = compound.getCompoundTag(key); + return new AxisAlignedBB( + tag.getDouble("minX"), + tag.getDouble("minY"), + tag.getDouble("minZ"), + tag.getDouble("maxX"), + tag.getDouble("maxY"), + tag.getDouble("maxZ") + ); + } + + public static NBTBase writeTileEntity(final TileEntity tileEntity) { + if (tileEntity == null) { + return NBT_NULL; + } + + final NBTTagCompound compound = new NBTTagCompound(); + tileEntity.writeToNBT(compound); + return compound; + } + + public static TileEntity readTileEntity(final NBTBase compound) { + return readTileEntity(compound, null); + } + + public static TileEntity readTileEntity(final NBTBase nbt, final World world) { + if (nbt.equals(NBT_NULL)) { + return null; + } + NBTTagCompound compound = (NBTTagCompound) nbt; + return TileEntity.create(world, compound); + } + + public static NBTTagCompound writeEntityToCompound(final Entity entity) { + final NBTTagCompound entityCompound = new NBTTagCompound(); + if (entity.writeToNBTOptional(entityCompound)) { + return entityCompound; + } + + return null; + } + + public static Entity readEntityFromCompound(final NBTTagCompound nbtTagCompound, final World world) { + return EntityList.createEntityFromNBT(nbtTagCompound, world); + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTTagCompoundBuilder.java b/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTTagCompoundBuilder.java new file mode 100644 index 000000000..78dc6d011 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTTagCompoundBuilder.java @@ -0,0 +1,161 @@ +package zmaster587.advancedRocketry.util.nbt; + +import net.minecraft.nbt.*; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.common.util.INBTSerializable; + +import java.util.Collection; +import java.util.Map; +import java.util.UUID; +import java.util.function.Consumer; + +/** + * An utility class to functionally construct NBTTagCompound. + * Potentially can provide the advanced serializing to it. + */ +public class NBTTagCompoundBuilder { + + private final NBTTagCompound instance; + + private NBTTagCompoundBuilder(NBTTagCompound instance) { + this.instance = instance; + } + + public static NBTTagCompoundBuilder create() { + return new NBTTagCompoundBuilder(new NBTTagCompound()); + } + + public static NBTTagCompoundBuilder create(NBTTagCompound instance) { + return new NBTTagCompoundBuilder(instance); + } + + public NBTTagCompoundBuilder setString(String key, String value) { + instance.setString(key, value); + return this; + } + + public NBTTagCompoundBuilder setInt(String key, int value) { + instance.setInteger(key, value); + return this; + } + + public NBTTagCompoundBuilder setShort(String key, short value) { + instance.setShort(key, value); + return this; + } + + public NBTTagCompoundBuilder setLong(String key, long value) { + instance.setLong(key, value); + return this; + } + + public NBTTagCompoundBuilder setFloat(String key, float value) { + instance.setFloat(key, value); + return this; + } + + public NBTTagCompoundBuilder setDouble(String key, double value) { + instance.setDouble(key, value); + return this; + } + + public NBTTagCompoundBuilder setBoolean(String key, boolean value) { + instance.setBoolean(key, value); + return this; + } + + public NBTTagCompoundBuilder setIntArray(String key, int[] value) { + instance.setIntArray(key, value); + return this; + } + + public NBTTagCompoundBuilder setByteArray(String key, byte[] value) { + instance.setByteArray(key, value); + return this; + } + + public NBTTagCompoundBuilder setUniqueID(String key, UUID value) { + instance.setUniqueId(key, value); + return this; + } + + public NBTTagCompoundBuilder setSerializable(String key, INBTSerializable serializable) { + return setTag(key, serializable.serializeNBT()); + } + + public NBTTagCompoundBuilder setBlockPos(String key, BlockPos value) { + NBTHelper.writeBlockPos(key, value, instance); + return this; + } + + public NBTTagCompoundBuilder setAABB(String key, AxisAlignedBB value) { + NBTHelper.writeAABB(key, instance, value); + return this; + } + + public NBTTagCompoundBuilder setTag(String key, NBTBase value) { + instance.setTag(key, value); + return this; + } + + public NBTTagCompoundBuilder setCollection(String key, Collection> collection) { + NBTHelper.writeCollection(key, instance, collection); + return this; + } + + public NBTTagCompoundBuilder setStringCollection(String key, Collection collection) { + NBTHelper.writeCollection(key, instance, collection, NBTTagString::new); + return this; + } + + public NBTTagCompoundBuilder setIntegerCollection(String key, Collection collection) { + NBTHelper.writeCollection(key, instance, collection, NBTTagInt::new); + return this; + } + + public NBTTagCompoundBuilder setFloatCollection(String key, Collection collection) { + NBTHelper.writeCollection(key, instance, collection, NBTTagFloat::new); + return this; + } + + public NBTTagCompoundBuilder setDoubleCollection(String key, Collection collection) { + NBTHelper.writeCollection(key, instance, collection, NBTTagDouble::new); + return this; + } + + public NBTTagCompoundBuilder setByteCollection(String key, Collection collection) { + NBTHelper.writeCollection(key, instance, collection, NBTTagByte::new); + return this; + } + + public NBTTagCompoundBuilder setCollection(String key, Collection collection, ParametrizedFactory serializer) { + NBTHelper.writeCollection(key, instance, collection, serializer); + return this; + } + + public NBTTagCompoundBuilder setResourceLocation(String key, ResourceLocation value) { + instance.setString(key, value.toString()); + return this; + } + + public NBTTagCompoundBuilder setMap(String key, Map> map) { + NBTHelper.writeMap(key, instance, map); + return this; + } + + public NBTTagCompoundBuilder setMap(String key, Map map, ParametrizedFactory serializer) { + NBTHelper.writeMap(key, instance, map, serializer); + return this; + } + + public NBTTagCompoundBuilder execute(Consumer action) { + action.accept(instance); + return this; + } + + public NBTTagCompound build() { + return instance; + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTTagListCollector.java b/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTTagListCollector.java new file mode 100644 index 000000000..acc620c3f --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/nbt/NBTTagListCollector.java @@ -0,0 +1,48 @@ +package zmaster587.advancedRocketry.util.nbt; + +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagList; + +import java.util.Collections; +import java.util.EnumSet; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collector; + +public class NBTTagListCollector implements Collector { + + static final Set CH_UNORDERED_ID + = Collections.unmodifiableSet(EnumSet.of(Characteristics.UNORDERED, + Characteristics.IDENTITY_FINISH)); + + @Override + public Supplier supplier() { + return NBTTagList::new; + } + + @Override + public BiConsumer accumulator() { + return NBTTagList::appendTag; + } + + @Override + public BinaryOperator combiner() { + return (o1, o2) -> { + o2.forEach(o1::appendTag); + return o1; + }; + } + + @Override + public Function finisher() { + return Function.identity(); + } + + @Override + public Set characteristics() { + return CH_UNORDERED_ID; + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/nbt/ParametrizedFactory.java b/src/main/java/zmaster587/advancedRocketry/util/nbt/ParametrizedFactory.java new file mode 100644 index 000000000..87f6e5dc4 --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/nbt/ParametrizedFactory.java @@ -0,0 +1,6 @@ +package zmaster587.advancedRocketry.util.nbt; + +public interface ParametrizedFactory { + + O create(I param); +} diff --git a/src/main/resources/META-INF/accessTransformer.cfg b/src/main/resources/META-INF/accessTransformer.cfg index f74b95b40..9e21de8d0 100644 --- a/src/main/resources/META-INF/accessTransformer.cfg +++ b/src/main/resources/META-INF/accessTransformer.cfg @@ -1 +1,4 @@ -public net.minecraft.entity.Entity * \ No newline at end of file +public net.minecraft.entity.Entity * +public net.minecraft.nbt.NBTTagCompound * +public-f net.minecraft.inventory.InventoryBasic * +public net.minecraft.world.storage.MapStorage * From 361c3f63c6ee0cc6fcd604ec8e7258d3f8a4e7ea Mon Sep 17 00:00:00 2001 From: Quarter Date: Mon, 22 Jul 2024 19:56:15 +0300 Subject: [PATCH 26/42] Pre-finished service station - Made custom textures for the service station - Fully implemented GUI - Fixed RU and EN localization --- .../TileRocketServiceStation.java | 154 +++++++++++------- .../blockstates/servicestation.json | 28 +++- .../assets/advancedrocketry/lang/en_US.lang | 10 ++ .../assets/advancedrocketry/lang/ru_RU.lang | 2 + .../textures/blocks/servicemachine.png | Bin 0 -> 5916 bytes .../blocks/servicemachine_active_1.png | Bin 0 -> 6261 bytes .../blocks/servicemachine_active_2.png | Bin 0 -> 6277 bytes .../blocks/servicemachine_active_3.png | Bin 0 -> 6289 bytes .../blocks/servicemachine_active_4.png | Bin 0 -> 6489 bytes 9 files changed, 133 insertions(+), 61 deletions(-) create mode 100644 src/main/resources/assets/advancedrocketry/textures/blocks/servicemachine.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/blocks/servicemachine_active_1.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/blocks/servicemachine_active_2.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/blocks/servicemachine_active_3.png create mode 100644 src/main/resources/assets/advancedrocketry/textures/blocks/servicemachine_active_4.png diff --git a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java index a68809003..6a12e8024 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java @@ -30,6 +30,7 @@ import zmaster587.advancedRocketry.util.StorageChunk; import zmaster587.advancedRocketry.util.nbt.NBTHelper; import zmaster587.libVulpes.LibVulpes; +import zmaster587.libVulpes.block.BlockTile; import zmaster587.libVulpes.interfaces.ILinkableTile; import zmaster587.libVulpes.inventory.modules.*; import zmaster587.libVulpes.items.ItemLinker; @@ -37,17 +38,15 @@ import zmaster587.libVulpes.network.PacketHandler; import zmaster587.libVulpes.network.PacketMachine; import zmaster587.libVulpes.tile.IComparatorOverride; +import zmaster587.libVulpes.tile.TileEntityRFConsumer; import zmaster587.libVulpes.util.IAdjBlockUpdate; import zmaster587.libVulpes.util.INetworkMachine; import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; -public class TileRocketServiceStation extends TileEntity implements IModularInventory, ITickable, IAdjBlockUpdate, IInfrastructure, ILinkableTile, INetworkMachine, IButtonInventory, IProgressBar, IComparatorOverride { +public class TileRocketServiceStation extends TileEntityRFConsumer implements IModularInventory, ITickable, IAdjBlockUpdate, IInfrastructure, ILinkableTile, INetworkMachine, IButtonInventory, IProgressBar, IComparatorOverride { EntityRocketBase linkedRocket; @@ -66,10 +65,13 @@ public class TileRocketServiceStation extends TileEntity implements IModularInve TileBrokenPart[] partsProcessing = new TileBrokenPart[0]; IBlockState[] statesProcessing = new IBlockState[0]; + int initialPartToRepairCount; List partsToRepair = new LinkedList<>(); List statesToRepair = new LinkedList<>(); public TileRocketServiceStation() { + super(10000); + destroyProbText = new ModuleText(90, 30, LibVulpes.proxy.getLocalizedString("msg.serviceStation.destroyProbNA"), 0x2b2b2b, true); wornMotorsText = new ModuleText(40, 30 + 30, LibVulpes.proxy.getLocalizedString("msg.serviceStation.wornMotorsText"), 0x2b2b2b, true); wornSeatsText = new ModuleText(90, 30 + 30, LibVulpes.proxy.getLocalizedString("msg.serviceStation.wornSeatsText"), 0x2b2b2b, true); @@ -113,6 +115,10 @@ public int getMaxLinkDistance() { } public void updateRepairList() { + updateRepairList(true); + } + + public void updateRepairList(boolean initial) { EntityRocket rocket = (EntityRocket) linkedRocket; partsToRepair = new LinkedList<>(); statesToRepair = new LinkedList<>(); @@ -123,6 +129,10 @@ public void updateRepairList() { statesToRepair.add(rocket.storage.getBlockState(te.getPos())); } } + + if (initial) { + initialPartToRepairCount = partsToRepair.size(); + } } public void scanForAssemblers() { @@ -239,7 +249,6 @@ private void consumePartToRepair(int assemblerIndex) { partsProcessing[assemblerIndex] = part; // add to the assembler - // TODO Test! ItemStack resultingStack = partBlock.getDropItem(statesToRepair.get(0), world, part); if (!addItemToOneOfTheInventories(assembler.getItemInPorts(), resultingStack)) { AdvancedRocketry.logger.error("Precision assembler at " + assembler.getPos() + " overflows. Repaired part lost"); @@ -260,10 +269,7 @@ public void giveWorkToAssemblers() { TilePrecisionAssembler assembler = assemblers.get(i); - // TODO Implement a better way to match damageable blocks' stacks - if (assembler.getItemInPorts().isEmpty() - || assembler.getItemInPorts().get(0).getStackInSlot(0) - .getUnlocalizedName().contains("rocket")) { + if (hasItemInInventories(assembler.getItemInPorts(), "motor", false)) { // assembler already have a motor for work, skipping continue; } @@ -279,30 +285,62 @@ public void giveWorkToAssemblers() { } @Override - public void update() { - if (!world.isRemote && world.getWorldTime() % 20 == 0) { - if (linkedRocket instanceof EntityRocket) { - if (getEquivalentPower() && linkedRocket != null) { - if (!was_powered) { - scanForAssemblers(); - was_powered = true; - } else { - if (assemblerPoses != null) { - // lazy access to assembler list loaded from NBT - assemblers = assemblerPoses.stream().map(pos -> (TilePrecisionAssembler) world.getTileEntity(pos)).collect(Collectors.toList()); - assemblerPoses = null; - } - } + public void performFunction() { + if (linkedRocket instanceof EntityRocket) { + // stay with the right blockstate + IBlockState state = world.getBlockState(pos); + if (!state.getValue(BlockTile.STATE)) { + world.setBlockState(pos, state.withProperty(BlockTile.STATE, true)); + } + + if (getEquivalentPower() && linkedRocket != null) { + if (!was_powered) { + scanForAssemblers(); + was_powered = true; + } else { + if (assemblerPoses != null) { + // lazy access to assembler list loaded from NBT + assemblers = assemblerPoses.stream().map(pos -> (TilePrecisionAssembler) world.getTileEntity(pos)).collect(Collectors.toList()); + assemblerPoses = null; + + this.statesProcessing = new IBlockState[assemblers.size()]; + this.partsProcessing = new TileBrokenPart[assemblers.size()]; - giveWorkToAssemblers(); + updateRepairList(false); + } } - } - if (!getEquivalentPower()) { - was_powered = false; + + giveWorkToAssemblers(); } } + if (!getEquivalentPower()) { + was_powered = false; + } + } + + @Override + public boolean canPerformFunction() { + if (world.isRemote || world.getWorldTime() % 20 != 0) { + return false; + } + + boolean hasWork = partsToRepair.size() > 0 || Arrays.stream(partsProcessing).anyMatch(Objects::nonNull); + + if (hasWork) { + return true; + } + + IBlockState state = world.getBlockState(pos); + if (state.getValue(BlockTile.STATE)) { + world.setBlockState(pos, state.withProperty(BlockTile.STATE, false)); + } + return false; } + @Override + public int getPowerPerOperation() { + return 10; + } @Override public boolean onLinkStart(@Nonnull ItemStack item, TileEntity entity, EntityPlayer player, World world) { @@ -327,11 +365,19 @@ public boolean onLinkComplete(@Nonnull ItemStack item, TileEntity entity, Entity @Override public void unlinkRocket() { linkedRocket = null; + + dropRepairStats(); + } + + public void dropRepairStats() { + partsToRepair = new LinkedList<>(); + statesToRepair = new LinkedList<>(); + initialPartToRepairCount = 0; } @Override public boolean disconnectOnLiftOff() { - return true; + return false; } @Override @@ -352,27 +398,22 @@ public NBTTagCompound getUpdateTag() { public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); was_powered = nbt.getBoolean("was_powered"); + initialPartToRepairCount = nbt.getInteger("initialPartToRepairCount"); - if (nbt.hasKey("partsProcessing")) { - // if tile has "new" format - assemblerPoses = NBTHelper.readCollection("assemblerPoses", nbt, ArrayList::new, NBTHelper::readBlockPos); - partsProcessing = NBTHelper.readCollection("partsProcessing", nbt, ArrayList::new, NBTHelper::readTileEntity).toArray(new TileBrokenPart[0]); - statesProcessing = NBTHelper.readCollection("statesProcessing", nbt, ArrayList::new, NBTHelper::readState).toArray(new IBlockState[0]); -// partsToRepair = NBTHelper.readCollection("partsToRepair", nbt, LinkedList::new, tag -> (TileBrokenPart) world.getTileEntity(NBTHelper.readBlockPos(tag))); -// statesToRepair = NBTHelper.readCollection("statesToRepair", nbt, LinkedList::new, NBTHelper::readState); - } + assemblerPoses = NBTHelper.readCollection("assemblerPoses", nbt, ArrayList::new, NBTHelper::readBlockPos); + partsProcessing = NBTHelper.readCollection("partsProcessing", nbt, ArrayList::new, NBTHelper::readTileEntity).toArray(new TileBrokenPart[0]); + statesProcessing = NBTHelper.readCollection("statesProcessing", nbt, ArrayList::new, NBTHelper::readState).toArray(new IBlockState[0]); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("was_powered", was_powered); + nbt.setInteger("initialPartToRepairCount", initialPartToRepairCount); NBTHelper.writeCollection("assemblerPoses", nbt, this.assemblers, te -> NBTHelper.writeBlockPos(te.getPos())); NBTHelper.writeCollection("partsProcessing", nbt, Arrays.asList(this.partsProcessing), NBTHelper::writeTileEntity); NBTHelper.writeCollection("statesProcessing", nbt, Arrays.asList(this.statesProcessing), NBTHelper::writeState); -// NBTHelper.writeCollection("partsToRepair", nbt, this.partsToRepair, te -> NBTHelper.writeBlockPos(te.getPos())); -// NBTHelper.writeCollection("statesToRepair", nbt, this.statesToRepair, NBTHelper::writeState); return nbt; } @@ -388,17 +429,13 @@ public void readDataFromNetwork(ByteBuf in, byte packetId, } - @Override - public void useNetworkData(EntityPlayer player, Side side, byte id, - NBTTagCompound nbt) { - - } - @Override public List getModules(int ID, EntityPlayer player) { LinkedList modules = new LinkedList<>(); - modules.add(new ModuleButton(63, 100, 0, "Repair!", this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild)); + modules.add(new ModulePower(10, 20, this.energy)); + modules.add(new ModuleButton(63 - 52 / 2, 100, 0, LibVulpes.proxy.getLocalizedString("msg.serviceStation.assemblerScan"), + this, zmaster587.libVulpes.inventory.TextureResources.buttonBuild, 104, 16)); updateText(); @@ -411,7 +448,7 @@ public List getModules(int ID, EntityPlayer player) { modules.add(wornSeatsCount); modules.add(wornTanksCount); - modules.add(new ModuleProgress(32, 133, 3, TextureResources.progressToMission, this)); + modules.add(new ModuleProgress(32, 133, 0, TextureResources.progressToMission, this)); if (!world.isRemote) { PacketHandler.sendToPlayer(new PacketMachine(this, (byte) 1), player); @@ -452,13 +489,18 @@ private void updateText() { } } + @Override + public void useNetworkData(EntityPlayer player, Side side, byte id, + NBTTagCompound nbt) { + if (id == 0) { + scanForAssemblers(); + } + } + @Override public void onInventoryButtonPressed(int buttonId) { - if (buttonId != -1) - PacketHandler.sendToServer(new PacketMachine(this, (byte) (buttonId + 100))); - else { - //state = redstoneControl.getState(); - PacketHandler.sendToServer(new PacketMachine(this, (byte) 2)); + if (buttonId == 0) { + PacketHandler.sendToServer(new PacketMachine(this, (byte) 0)); } } @@ -494,8 +536,7 @@ public int getProgress(int id) { System.out.println("Huh, error...."); return 0; } - EntityRocket rocket = (EntityRocket) linkedRocket; - return 0; + return initialPartToRepairCount - partsToRepair.size() - (int) Arrays.stream(partsProcessing).filter(Objects::nonNull).count(); } return 0; @@ -507,7 +548,10 @@ public int getTotalProgress(int id) { // return ARConfiguration.getCurrentConfig().orbit; // else if (id == 1) // return 200; - return 1; + if (id == 0) { + return initialPartToRepairCount; + } + return 0; } @Override diff --git a/src/main/resources/assets/advancedrocketry/blockstates/servicestation.json b/src/main/resources/assets/advancedrocketry/blockstates/servicestation.json index 7ad584e96..42b0e7fbe 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/servicestation.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/servicestation.json @@ -5,19 +5,35 @@ "model": "minecraft:orientable", "textures": { "top": "libvulpes:blocks/machinegeneric", - "front": "advancedrocketry:blocks/monitorrocket", + "front": "advancedrocketry:blocks/servicemachine", "side": "libvulpes:blocks/machinegeneric" } }, "variants": { "facing=north,state=false": [{}], - "facing=south,state=false": { "model": "minecraft:orientable", "y": 180 }, + "facing=south,state=false": { "model": "minecraft:orientable", "y": 180}, "facing=west,state=false": { "model": "minecraft:orientable", "y": 270 }, "facing=east,state=false": { "model": "minecraft:orientable", "y": 90 }, - "facing=north,state=true": [{}], - "facing=south,state=true": { "model": "minecraft:orientable", "y": 180 }, - "facing=west,state=true": { "model": "minecraft:orientable", "y": 270 }, - "facing=east,state=true": { "model": "minecraft:orientable", "y": 90 }, + "facing=north,state=true": { "model": "minecraft:orientable", "y": 0, + "textures": { + "front": "advancedrocketry:blocks/servicemachine_active_1" + } + }, + "facing=south,state=true": { "model": "minecraft:orientable", "y": 180, + "textures": { + "front": "advancedrocketry:blocks/servicemachine_active_2" + } + }, + "facing=west,state=true": { "model": "minecraft:orientable", "y": 270, + "textures": { + "front": "advancedrocketry:blocks/servicemachine_active_3" + } + }, + "facing=east,state=true": { "model": "minecraft:orientable", "y": 90, + "textures": { + "front": "advancedrocketry:blocks/servicemachine_active_4" + } + }, "inventory" : [{}] } } diff --git a/src/main/resources/assets/advancedrocketry/lang/en_US.lang b/src/main/resources/assets/advancedrocketry/lang/en_US.lang index 07d489330..4d9bbcacc 100644 --- a/src/main/resources/assets/advancedrocketry/lang/en_US.lang +++ b/src/main/resources/assets/advancedrocketry/lang/en_US.lang @@ -425,6 +425,16 @@ msg.itemplanetidchip.stationid=Station Id: msg.itemplanetidchip.artifacts=Artifacts: msg.vent.trace=Oxygen Trace +msg.serviceStation.destroyProbNA=Destroy probability: N/A +msg.serviceStation.destroyProb=Destroy probability: +msg.serviceStation.serviceProgress=Service progress: +msg.serviceStation.serviceProgressNA=Service progress: N/A +msg.serviceStation.wornMotorsText=Engines +msg.serviceStation.wornSeatsText=Seats +msg.serviceStation.wornTanksText=Tanks +msg.serviceStation.assemblerScan=Scan for assemblers +msg.serviceStation.link=You program the linker with the service station at + msg.itemsatellite.pwr=Power Storage: msg.itemsatellite.nopwr=No Power Storage msg.itemsatellite.pwrgen=Power Generation: diff --git a/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang b/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang index ce0eff29b..4cf9a9d43 100644 --- a/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang +++ b/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang @@ -275,6 +275,8 @@ msg.serviceStation.serviceProgressNA=Прогресс обслуживания: msg.serviceStation.wornMotorsText=Двигатели msg.serviceStation.wornSeatsText=Сиденья msg.serviceStation.wornTanksText=Резервуары +msg.serviceStation.assemblerScan=Сканировать сборщики +msg.serviceStation.link=Вы подключили частотный связыватель к станции техобслуживания на msg.guidanceComputerHatch.loadingState=Состояние загрузки: msg.guidanceComputerHatch.ejectonlanding=Автоматический выброс при посадке diff --git a/src/main/resources/assets/advancedrocketry/textures/blocks/servicemachine.png b/src/main/resources/assets/advancedrocketry/textures/blocks/servicemachine.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8dcf8022b739d5237b3bd94eb9a2c75c889a70 GIT binary patch literal 5916 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 VesoaMO}GjXET*enk Date: Mon, 22 Jul 2024 23:30:26 +0300 Subject: [PATCH 27/42] Just a fix --- src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java index 25f4508ff..6b450cd19 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java +++ b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java @@ -984,6 +984,7 @@ public void readFromNetwork(ByteBuf in) { TileEntity tile = ZUtils.createTile(nbt); tile.setWorld(world); tileEntities.add(tile); + pos2te.put(tile.getPos(), tile); if (isInventoryBlock(tile)) { inventoryTiles.add(tile); From 7fefbfecfdc5e29eba97de0a5d0e270e8d6b5e44 Mon Sep 17 00:00:00 2001 From: Quarter Date: Tue, 23 Jul 2024 11:53:41 +0300 Subject: [PATCH 28/42] Fixed stats not changing within repairing process --- .../advancedRocketry/entity/EntityRocket.java | 2 + .../tile/TileRocketAssemblingMachine.java | 3 +- .../advancedRocketry/util/StorageChunk.java | 130 ++++++++++++++++-- 3 files changed, 125 insertions(+), 10 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java index 878707a50..c53f773a9 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java @@ -1607,6 +1607,8 @@ public void launch() { boolean allowLaunch = false; + this.storage.recalculateStats(this.stats); + if (ARConfiguration.getCurrentConfig().advancedWeightSystem) { this.stats.setWeight((int) storage.recalculateWeight()); for (HashedBlockPosition pos : this.infrastructureCoords) { diff --git a/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java b/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java index 05b7782c9..edba120e4 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java @@ -240,7 +240,6 @@ public boolean isScanning() { } public void scanRocket(World world, BlockPos pos2, AxisAlignedBB bb) { - int thrustMonopropellant = 0; int thrustBipropellant = 0; int thrustNuclearNozzleLimit = 0; @@ -253,7 +252,7 @@ public void scanRocket(World world, BlockPos pos2, AxisAlignedBB bb) { int fuelCapacityBipropellant = 0; int fuelCapacityOxidizer = 0; int fuelCapacityNuclearWorkingFluid = 0; - int numBlocks = 0; + float drillPower = 0f; stats.reset(); diff --git a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java index 6b450cd19..7016b42a7 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java +++ b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java @@ -33,13 +33,11 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import zmaster587.advancedRocketry.AdvancedRocketry; -import zmaster587.advancedRocketry.api.Constants; -import zmaster587.advancedRocketry.api.EntityRocketBase; +import zmaster587.advancedRocketry.api.*; +import zmaster587.advancedRocketry.api.fuel.FuelRegistry; import zmaster587.advancedRocketry.api.satellite.SatelliteBase; import zmaster587.advancedRocketry.api.stations.IStorageChunk; -import zmaster587.advancedRocketry.block.BlockBipropellantRocketMotor; -import zmaster587.advancedRocketry.block.BlockNuclearRocketMotor; -import zmaster587.advancedRocketry.block.BlockRocketMotor; +import zmaster587.advancedRocketry.block.*; import zmaster587.advancedRocketry.item.ItemPackedStructure; import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.advancedRocketry.tile.TileGuidanceComputer; @@ -146,10 +144,127 @@ public float recalculateWeight() { } } } - return this.weight; } + public void recalculateStats(StatsRocket stats) { + int thrustMonopropellant = 0; + int thrustBipropellant = 0; + int thrustNuclearNozzleLimit = 0; + int thrustNuclearReactorLimit = 0; + int thrustNuclearTotalLimit = 0; + int monopropellantfuelUse = 0; + int bipropellantfuelUse = 0; + int nuclearWorkingFluidUseMax = 0; + int fuelCapacityMonopropellant = 0; + int fuelCapacityBipropellant = 0; + int fuelCapacityOxidizer = 0; + int fuelCapacityNuclearWorkingFluid = 0; + + float drillPower = 0f; + stats.reset(); + + float weight = 0; + + for (int yCurr = 0; yCurr <= this.sizeY; yCurr++) { + for (int xCurr = 0; xCurr <= this.sizeX; xCurr++) { + for (int zCurr = 0; zCurr <= this.sizeZ; zCurr++) { + BlockPos currBlockPos = new BlockPos(xCurr, yCurr, zCurr); + BlockPos abovePos = new BlockPos(xCurr, yCurr + 1, zCurr); + BlockPos belowPos = new BlockPos(xCurr, yCurr - 1, zCurr); + + if (this.getBlockState(currBlockPos).getBlock() != Blocks.AIR) { + IBlockState state = world.getBlockState(currBlockPos); + Block block = state.getBlock(); + + if (ARConfiguration.getCurrentConfig().advancedWeightSystem) { + weight += WeightEngine.INSTANCE.getWeight(world, currBlockPos); + } else { + weight += 1; + } + + //If rocketEngine increaseThrust + if (block instanceof IRocketEngine && (world.getBlockState(belowPos).getBlock().isAir(world.getBlockState(belowPos), world, belowPos) || world.getBlockState(belowPos).getBlock() instanceof BlockLandingPad || world.getBlockState(belowPos).getBlock() == AdvancedRocketryBlocks.blockLaunchpad)) { + if (block instanceof BlockNuclearRocketMotor) { + nuclearWorkingFluidUseMax += ((IRocketEngine) block).getFuelConsumptionRate(world, xCurr, yCurr, zCurr); + thrustNuclearNozzleLimit += ((IRocketEngine) block).getThrust(world, currBlockPos); + } else if (block instanceof BlockBipropellantRocketMotor) { + bipropellantfuelUse += ((IRocketEngine) block).getFuelConsumptionRate(world, xCurr, yCurr, zCurr); + thrustBipropellant += ((IRocketEngine) block).getThrust(world, currBlockPos); + } else if (block instanceof BlockRocketMotor) { + monopropellantfuelUse += ((IRocketEngine) block).getFuelConsumptionRate(world, xCurr, yCurr, zCurr); + thrustMonopropellant += ((IRocketEngine) block).getThrust(world, currBlockPos); + } + stats.addEngineLocation(xCurr, yCurr, zCurr); + } + + if (block instanceof IFuelTank) { + if (block instanceof BlockFuelTank) { + fuelCapacityMonopropellant += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); + } else if (block instanceof BlockBipropellantFuelTank) { + fuelCapacityBipropellant += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); + } else if (block instanceof BlockOxidizerFuelTank) { + fuelCapacityOxidizer += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); + } else if (block instanceof BlockNuclearFuelTank) { + fuelCapacityNuclearWorkingFluid += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); + } + } + + if (block instanceof IRocketNuclearCore && ((world.getBlockState(belowPos).getBlock() instanceof IRocketNuclearCore) || (world.getBlockState(belowPos).getBlock() instanceof IRocketEngine))) { + thrustNuclearReactorLimit += ((IRocketNuclearCore) block).getMaxThrust(world, currBlockPos); + } + + if (block instanceof BlockSeat && world.getBlockState(abovePos).getBlock().isPassable(world, abovePos)) { + stats.addPassengerSeat(xCurr, yCurr, zCurr); + } + + if (block instanceof IMiningDrill) { + drillPower += ((IMiningDrill) block).getMiningSpeed(world, currBlockPos); + } + + TileEntity tile = world.getTileEntity(currBlockPos); + if (tile instanceof TileSatelliteHatch) { + if (ARConfiguration.getCurrentConfig().advancedWeightSystem) { + TileSatelliteHatch hatch = (TileSatelliteHatch) tile; + if (hatch.getSatellite() != null) { + weight += hatch.getSatellite().getProperties().getWeight(); + } else if (hatch.getStackInSlot(0).getItem() instanceof ItemPackedStructure) { + ItemPackedStructure struct = (ItemPackedStructure) hatch.getStackInSlot(0).getItem(); + weight += struct.getStructure(hatch.getStackInSlot(0)).getWeight(); + } + } + } + } + } + } + } + + int nuclearWorkingFluidUse = 0; + if (thrustNuclearNozzleLimit > 0) { + //Only run the number of engines our cores can support - we can't throttle these effectively because they're small, so they shut off if they don't get full power + thrustNuclearTotalLimit = Math.min(thrustNuclearNozzleLimit, thrustNuclearReactorLimit); + nuclearWorkingFluidUse = (int) (nuclearWorkingFluidUseMax * (thrustNuclearTotalLimit / (float) thrustNuclearNozzleLimit)); + thrustNuclearTotalLimit = (nuclearWorkingFluidUse * thrustNuclearNozzleLimit) / nuclearWorkingFluidUseMax; + } + + //Set fuel stats + //Thrust depending on rocket type + stats.setBaseFuelRate(FuelRegistry.FuelType.LIQUID_MONOPROPELLANT, monopropellantfuelUse); + stats.setBaseFuelRate(FuelRegistry.FuelType.LIQUID_BIPROPELLANT, bipropellantfuelUse); + stats.setBaseFuelRate(FuelRegistry.FuelType.LIQUID_OXIDIZER, bipropellantfuelUse); + stats.setBaseFuelRate(FuelRegistry.FuelType.NUCLEAR_WORKING_FLUID, nuclearWorkingFluidUse); + //Fuel storage depending on rocket type + stats.setFuelCapacity(FuelRegistry.FuelType.LIQUID_MONOPROPELLANT, fuelCapacityMonopropellant); + stats.setFuelCapacity(FuelRegistry.FuelType.LIQUID_BIPROPELLANT, fuelCapacityBipropellant); + stats.setFuelCapacity(FuelRegistry.FuelType.LIQUID_OXIDIZER, fuelCapacityOxidizer); + stats.setFuelCapacity(FuelRegistry.FuelType.NUCLEAR_WORKING_FLUID, fuelCapacityNuclearWorkingFluid); + + //Non-fuel stats + stats.setWeight((int) weight); + stats.setThrust(Math.max(Math.max(thrustMonopropellant, thrustBipropellant), thrustNuclearTotalLimit)); + stats.setDrillingPower(drillPower); + } + public void addTileEntity(TileEntity te) { pos2te.put(te.getPos(), te); tileEntities.add(te); @@ -983,8 +1098,7 @@ public void readFromNetwork(ByteBuf in) { TileEntity tile = ZUtils.createTile(nbt); tile.setWorld(world); - tileEntities.add(tile); - pos2te.put(tile.getPos(), tile); + this.addTileEntity(tile); if (isInventoryBlock(tile)) { inventoryTiles.add(tile); From e5923bc1da4793269dc9083ed02bc62ddf6d7333 Mon Sep 17 00:00:00 2001 From: Quarter Date: Tue, 23 Jul 2024 11:58:06 +0300 Subject: [PATCH 29/42] Fixed service station repairs parts that are not broken --- .../tile/infrastructure/TileRocketServiceStation.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java index 6a12e8024..cb6f6c0f3 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java @@ -125,8 +125,11 @@ public void updateRepairList(boolean initial) { for (TileEntity te : rocket.storage.getTileEntityList()) { if (te instanceof TileBrokenPart) { - partsToRepair.add((TileBrokenPart) te); - statesToRepair.add(rocket.storage.getBlockState(te.getPos())); + TileBrokenPart part = (TileBrokenPart) te; + if (part.getStage() > 0) { + partsToRepair.add(part); + statesToRepair.add(rocket.storage.getBlockState(te.getPos())); + } } } From 1ddc33f29621cffa4d144a3d737bd81492f09a91 Mon Sep 17 00:00:00 2001 From: Quarter Date: Fri, 26 Jul 2024 17:18:00 +0300 Subject: [PATCH 30/42] Fixed ore generation --- .../world/decoration/MapGenGeode.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/world/decoration/MapGenGeode.java b/src/main/java/zmaster587/advancedRocketry/world/decoration/MapGenGeode.java index 1c03eff71..2636843a0 100644 --- a/src/main/java/zmaster587/advancedRocketry/world/decoration/MapGenGeode.java +++ b/src/main/java/zmaster587/advancedRocketry/world/decoration/MapGenGeode.java @@ -1,6 +1,7 @@ package zmaster587.advancedRocketry.world.decoration; import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -99,8 +100,10 @@ protected void recursiveGenerate(World world, int chunkX, int chunkZ, int p_1807 //Generates ore hanging from the ceiling if (x % 4 > 0 && z % 4 > 0) { - for (int i = 1; i < size; i++) - chunkPrimerIn.setBlockState(x, avgY + count - i, z, ores.get((x / 4 + z / 4) % ores.size()).getBlockState()); + IBlockState ore = ores.get(world.rand.nextInt(ores.size())).getBlockState(); + for (int i = 1; i < size; i++) { + chunkPrimerIn.setBlockState(x, avgY + count - i, z, ore); + } } else { size -= 2; for (int i = 1; i < size; i++) { @@ -110,10 +113,11 @@ protected void recursiveGenerate(World world, int chunkX, int chunkZ, int p_1807 //Generates ore in the floor if ((x + 2) % 4 > 0 && (z + 2) % 4 > 0) { - for (int i = 1; i < size; i++) - chunkPrimerIn.setBlockState(x, avgY - count + i, z, ores.get((x / 4 + z / 4) % ores.size()).getBlockState()); + IBlockState ore = ores.get(world.rand.nextInt(ores.size())).getBlockState(); + for (int i = 1; i < size; i++) { + chunkPrimerIn.setBlockState(x, avgY - count + i, z, ore); + } } - } chunkPrimerIn.setBlockState(x, avgY - count, z, AdvancedRocketryBlocks.blocksGeode.getDefaultState()); From b30affa170b01666925468cd267686476cb8d212 Mon Sep 17 00:00:00 2001 From: Quarter Date: Fri, 26 Jul 2024 18:07:57 +0300 Subject: [PATCH 31/42] Handled situation assembler invalidates during the repair process --- .../TileRocketServiceStation.java | 62 +++++-------------- .../advancedRocketry/util/InventoryUtil.java | 47 ++++++++++++++ 2 files changed, 62 insertions(+), 47 deletions(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/util/InventoryUtil.java diff --git a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java index cb6f6c0f3..e821172f3 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java @@ -5,7 +5,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; -import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -27,6 +26,7 @@ import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.advancedRocketry.tile.multiblock.machine.TilePrecisionAssembler; import zmaster587.advancedRocketry.util.IBrokenPartBlock; +import zmaster587.advancedRocketry.util.InventoryUtil; import zmaster587.advancedRocketry.util.StorageChunk; import zmaster587.advancedRocketry.util.nbt.NBTHelper; import zmaster587.libVulpes.LibVulpes; @@ -118,7 +118,7 @@ public void updateRepairList() { updateRepairList(true); } - public void updateRepairList(boolean initial) { + private void updateRepairList(boolean initial) { EntityRocket rocket = (EntityRocket) linkedRocket; partsToRepair = new LinkedList<>(); statesToRepair = new LinkedList<>(); @@ -138,7 +138,7 @@ public void updateRepairList(boolean initial) { } } - public void scanForAssemblers() { + private void scanForAssemblers() { this.assemblers = new ArrayList<>(); int size = 5; @@ -158,51 +158,11 @@ public void scanForAssemblers() { this.partsProcessing = new TileBrokenPart[assemblers.size()]; } - private boolean hasItemInInventories(Iterable invs, String substr, boolean consume) { - for (IInventory inv : invs) { - if (hasItemInInventory(inv, substr, consume)) { - return true; - } - } - return false; - } - - private boolean hasItemInInventory(IInventory inv, String substr, boolean consume) { - for (int i = 0; i < inv.getSizeInventory(); i++) { - if (inv.getStackInSlot(i).getUnlocalizedName().toLowerCase().contains(substr)) { - if (consume) { - inv.setInventorySlotContents(i, ItemStack.EMPTY); - } - return true; - } - } - return false; - } - - private boolean addItemToOneOfTheInventories(Iterable invs, ItemStack stack) { - for (IInventory inv : invs) { - if (addItemToInventory(inv, stack)) { - return true; - } - } - return false; - } - - private boolean addItemToInventory(IInventory inv, ItemStack stack) { - for (int i = 0; i < inv.getSizeInventory(); i++) { - if (inv.getStackInSlot(i).isEmpty()) { - inv.setInventorySlotContents(i, stack); - return true; - } - } - return false; - } - private boolean processAssemblerResult(int index) { StorageChunk storage = ((EntityRocket) linkedRocket).storage; TilePrecisionAssembler assembler = assemblers.get(index); - if (hasItemInInventories(assembler.getItemOutPorts(), "rocket", true)) { + if (InventoryUtil.hasItemInInventories(assembler.getItemOutPorts(), "rocket", true)) { IBlockState state = statesProcessing[index]; TileBrokenPart te = partsProcessing[index]; @@ -253,7 +213,7 @@ private void consumePartToRepair(int assemblerIndex) { // add to the assembler ItemStack resultingStack = partBlock.getDropItem(statesToRepair.get(0), world, part); - if (!addItemToOneOfTheInventories(assembler.getItemInPorts(), resultingStack)) { + if (!InventoryUtil.addItemToOneOfTheInventories(assembler.getItemInPorts(), resultingStack)) { AdvancedRocketry.logger.error("Precision assembler at " + assembler.getPos() + " overflows. Repaired part lost"); } statesToRepair.remove(0); @@ -265,14 +225,22 @@ private void consumePartToRepair(int assemblerIndex) { assembler.onInventoryUpdated(); } - public void giveWorkToAssemblers() { + private void giveWorkToAssemblers() { boolean dirty = false; for (int i = 0; i < assemblers.size(); i++) { + if (assemblers.get(i).isInvalid()) { + // it is invalid, so we should not operate with it + assemblers.set(i, null); + partsProcessing[i] = null; + statesProcessing[i] = null; + continue; + } + dirty = dirty || processAssemblerResult(i); TilePrecisionAssembler assembler = assemblers.get(i); - if (hasItemInInventories(assembler.getItemInPorts(), "motor", false)) { + if (InventoryUtil.hasItemInInventories(assembler.getItemInPorts(), "motor", false)) { // assembler already have a motor for work, skipping continue; } diff --git a/src/main/java/zmaster587/advancedRocketry/util/InventoryUtil.java b/src/main/java/zmaster587/advancedRocketry/util/InventoryUtil.java new file mode 100644 index 000000000..5e4e6062e --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/InventoryUtil.java @@ -0,0 +1,47 @@ +package zmaster587.advancedRocketry.util; + +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +public class InventoryUtil { + + public static boolean hasItemInInventories(Iterable invs, String substr, boolean consume) { + for (IInventory inv : invs) { + if (hasItemInInventory(inv, substr, consume)) { + return true; + } + } + return false; + } + + public static boolean hasItemInInventory(IInventory inv, String substr, boolean consume) { + for (int i = 0; i < inv.getSizeInventory(); i++) { + if (inv.getStackInSlot(i).getUnlocalizedName().toLowerCase().contains(substr.toLowerCase())) { + if (consume) { + inv.setInventorySlotContents(i, ItemStack.EMPTY); + } + return true; + } + } + return false; + } + + public static boolean addItemToOneOfTheInventories(Iterable invs, ItemStack stack) { + for (IInventory inv : invs) { + if (addItemToInventory(inv, stack)) { + return true; + } + } + return false; + } + + public static boolean addItemToInventory(IInventory inv, ItemStack stack) { + for (int i = 0; i < inv.getSizeInventory(); i++) { + if (inv.getStackInSlot(i).isEmpty()) { + inv.setInventorySlotContents(i, stack); + return true; + } + } + return false; + } +} From b441209ae6e3991854934171528b30c1721f7aef Mon Sep 17 00:00:00 2001 From: Quarter Date: Fri, 26 Jul 2024 18:12:52 +0300 Subject: [PATCH 32/42] - --- .../tile/infrastructure/TileRocketServiceStation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java index e821172f3..81727fff1 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java @@ -348,7 +348,7 @@ public void dropRepairStats() { @Override public boolean disconnectOnLiftOff() { - return false; + return true; } @Override From e1a78cdace8aaf5592cc89e2d4c0deaf2560ea41 Mon Sep 17 00:00:00 2001 From: Quarter Date: Fri, 26 Jul 2024 20:25:31 +0300 Subject: [PATCH 33/42] Fixed not damaging on land --- .../advancedRocketry/entity/EntityRocket.java | 12 +++++++++++- .../infrastructure/TileRocketServiceStation.java | 2 +- .../advancedRocketry/util/StorageChunk.java | 14 +++++++------- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java index c53f773a9..78d949c9c 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java @@ -849,6 +849,13 @@ private Vec3d calculatePullFromPlanets() { public void setFire(int seconds) { } + private void syncRocket() { + NBTTagCompound nbtdata = new NBTTagCompound(); + + this.writeToNBT(nbtdata); + PacketHandler.sendToNearby(new PacketEntity(this, (byte) 0, nbtdata), world.provider.getDimension(), new BlockPos(this), 64); + } + @Override public void onUpdate() { super.onUpdate(); @@ -989,6 +996,9 @@ else if (!getRCS() && rcs_mode_counter > 0) { double distanceSq = this.spacePosition.distanceToSpacePosition2(new SpacePosition()); //Land, only handle on server if (!world.isRemote) { + this.storage.damageParts(); + syncRocket(); + if (distanceSq < 0.5f * spacePosition.world.getRenderSizePlanetView() * spacePosition.world.getRenderSizePlanetView()) { this.destinationDimId = spacePosition.world.getId(); this.setRCS(false); @@ -1737,7 +1747,7 @@ public void deconstructRocket() { } //paste the rocket into the world as blocks - storage.pasteInWorld(this.world, (int) (this.posX - storage.getSizeX() / 2f), (int) this.posY, (int) (this.posZ - storage.getSizeZ() / 2f), true); + storage.pasteInWorld(this.world, (int) (this.posX - storage.getSizeX() / 2f), (int) this.posY, (int) (this.posZ - storage.getSizeZ() / 2f)); this.setDead(); } diff --git a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java index 81727fff1..1a382c58c 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java @@ -516,7 +516,7 @@ public int getProgress(int id) { @Override public int getTotalProgress(int id) { // if (id == 0) -// return ARConfiguration.getCurrentConfig().orbit; +// return ARConfiguration.getCurrentConfig().orbit;ё // else if (id == 1) // return 200; if (id == 0) { diff --git a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java index 7016b42a7..82b9a2d8e 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java +++ b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java @@ -744,13 +744,9 @@ else if(tag.hasKey("tile")) { this.chunk.generateSkylightMap(); } + //pass the coords of the xmin, ymin, zmin as well as the world to move the rocket @Override public void pasteInWorld(World world, int xCoord, int yCoord, int zCoord) { - this.pasteInWorld(world, xCoord, yCoord, zCoord, false); - } - - //pass the coords of the xmin, ymin, zmin as well as the world to move the rocket - public void pasteInWorld(World world, int xCoord, int yCoord, int zCoord, boolean damage) { //Set all the blocks for (int x = 0; x < sizeX; x++) { @@ -788,9 +784,13 @@ public void pasteInWorld(World world, int xCoord, int yCoord, int zCoord, boolea if (entity != null) entity.readFromNBT(nbt); + } + } - if (damage && entity instanceof TileBrokenPart) { - ((TileBrokenPart) entity).transition(); + public void damageParts() { + for (TileEntity tile : tileEntities) { + if (tile instanceof TileBrokenPart) { + ((TileBrokenPart) tile).transition(); } } } From aea509673d8c0e30ffd6570a6a139d2db360680b Mon Sep 17 00:00:00 2001 From: MrToffel Date: Sun, 28 Jul 2024 22:51:52 +0200 Subject: [PATCH 34/42] fix structure generation crash --- .../advancedRocketry/world/ChunkManagerPlanet.java | 5 +++++ .../advancedRocketry/world/ChunkProviderPlanet.java | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/world/ChunkManagerPlanet.java b/src/main/java/zmaster587/advancedRocketry/world/ChunkManagerPlanet.java index eab63c020..6791c258c 100644 --- a/src/main/java/zmaster587/advancedRocketry/world/ChunkManagerPlanet.java +++ b/src/main/java/zmaster587/advancedRocketry/world/ChunkManagerPlanet.java @@ -12,6 +12,7 @@ import net.minecraft.world.gen.ChunkGeneratorSettings; import net.minecraft.world.gen.layer.*; import net.minecraftforge.common.BiomeManager.BiomeEntry; +import net.minecraftforge.fml.relauncher.ReflectionHelper; import zmaster587.advancedRocketry.AdvancedRocketry; import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.dimension.DimensionProperties; @@ -37,6 +38,10 @@ private void setup(long seed, WorldType default1, String str, DimensionPropertie agenlayer = getModdedBiomeGenerators(default1, seed, agenlayer); this.genBiomes = agenlayer[0]; this.biomeIndexLayer = agenlayer[1]; + + ReflectionHelper.setPrivateValue(BiomeProvider.class, this, this.genBiomes, "genBiomes", "field_76944_d"); + ReflectionHelper.setPrivateValue(BiomeProvider.class, this, this.biomeIndexLayer, "biomeIndexLayer", "field_76945_e"); + } long seed; diff --git a/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java b/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java index 5e71bbd00..a5bb0f935 100644 --- a/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java +++ b/src/main/java/zmaster587/advancedRocketry/world/ChunkProviderPlanet.java @@ -601,7 +601,7 @@ public boolean generateStructures(Chunk chunkIn, int x, int z) { @Override public void recreateStructures(Chunk chunkIn, int x, int z) { - /* this causes tons of crashes and I dont know why + if (this.mapFeaturesEnabled || !habitable) { if (this.settings.useMineShafts) { this.mineshaftGenerator.generate(this.worldObj, x, z, null); @@ -624,8 +624,6 @@ public void recreateStructures(Chunk chunkIn, int x, int z) { } } - - */ } @Override From c66519a4c9d7ff35397482930fac74f31361ef8d Mon Sep 17 00:00:00 2001 From: MrToffel Date: Mon, 29 Jul 2024 00:53:35 +0200 Subject: [PATCH 35/42] increased distance to send biome change information to client --- .../java/zmaster587/advancedRocketry/util/BiomeHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java index 47879233d..e9c747427 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/util/BiomeHandler.java @@ -239,7 +239,7 @@ public static void terraform(World world, Biome biomeId, BlockPos pos, boolean w } - PacketHandler.sendToNearby(new PacketBiomeIDChange(chunk, world, new HashedBlockPosition(pos)), world.provider.getDimension(), pos, 256); + PacketHandler.sendToNearby(new PacketBiomeIDChange(chunk, world, new HashedBlockPosition(pos)), world.provider.getDimension(), pos, 1024); } From 6b6f5c4e889f0ce797c439cfc94ace20314e79a8 Mon Sep 17 00:00:00 2001 From: Stanislav <39829332+StannisMod@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:22:21 +0300 Subject: [PATCH 36/42] Service station improvements, fixes (#25) - Added service monitor as a part of rocket - If it is installed the rocket GUI displays part's durability info for the every part - Fixed tooltips cropping - Reworked satellite weight calculation system, now it is based on parts from which it was built in satellite builder --- .gitignore | 1 + libs/LibVulpes-deobf.jar | Bin 528528 -> 525071 bytes .../advancedRocketry/AdvancedRocketry.java | 2 + .../api/AdvancedRocketryBlocks.java | 1 + .../api/SatelliteRegistry.java | 2 +- .../api/satellite/SatelliteProperties.java | 9 +- .../advancedRocketry/entity/EntityRocket.java | 23 ++- .../inventory/modules/ModuleBrokenPart.java | 74 +++++++ .../advancedRocketry/item/ItemSatellite.java | 7 + .../item/ItemSatelliteIdentificationChip.java | 1 + .../advancedRocketry/tile/TileBrokenPart.java | 6 + .../TileRocketServiceStation.java | 4 +- .../tile/satellite/TileSatelliteBuilder.java | 6 +- .../advancedRocketry/util/GraphicsHelper.java | 102 ++++++++++ .../advancedRocketry/util/StorageChunk.java | 185 ++++++++++-------- .../blockstates/servicemonitor.json | 16 ++ .../assets/advancedrocketry/lang/en_US.lang | 10 +- .../assets/advancedrocketry/lang/ru_RU.lang | 10 +- 18 files changed, 361 insertions(+), 98 deletions(-) create mode 100644 src/main/java/zmaster587/advancedRocketry/inventory/modules/ModuleBrokenPart.java create mode 100644 src/main/java/zmaster587/advancedRocketry/util/GraphicsHelper.java create mode 100644 src/main/resources/assets/advancedrocketry/blockstates/servicemonitor.json diff --git a/.gitignore b/.gitignore index fe12f1e41..5836788f8 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ output # other eclipse run +run-server refresh.bat AdvancedRocketry.txt changelog.html diff --git a/libs/LibVulpes-deobf.jar b/libs/LibVulpes-deobf.jar index e47687576b167a8c2f1365bf3329c58e091e6bc5..01b31d88390fadc1410cf6f00515fc1e3974df2e 100644 GIT binary patch delta 347565 zcmZ6yV{j%>*EJm5b|!WvHYRp5v2EM9Cbn(cw(aDKZD(Tho%?yedcV4#sy@|ys`|(2 zKC9Q-z4zL2`9ESqejxsq0f)c<0fB)5u}b}nN2CM?@%@bFNCN-x`HY{Y2IorojDKPI z&n%GvlmqtPSp(keSY0>K29yV&tgV19gdq^vgn3B03)#hY0}<}1$CmL+mR7By1QeK% z@xrmiuM2Hvetv0F{{{L<^@i_r1N~AMW!}oEK^Kg}xi;DEd&2uZ{rY{!SWTMrbB3pv)81 zCK20#{xwdlxJ5#3+_`xVm5Ywjf``Ci1=}1|M`FCD;z3;%HkZ#}ZJXr)JWcEOdem?k zl3)yx@3C)^Pg*ytGkK^9Ul&)NbwV-dGdO{}KjH2+uJeJa4~akfprf2_H*i@KAL&7h zhf(hO>DkqT!Vg)|K;{Z~Q5y0P!(@!2l&9S`{>>Tw=(r)%&M?tdmBc;Vx8Q0@5ctX0 zK54aMtp6G}<|bN$!SG(}jOF^Ld+j6$a??5R4TDFRg6-p&VzR8LP5Y7dU82d0q+_qdqld(FNA@LDdr2Wa z%(6dM05Fnl!-2Lm;=yE$cyOsxqOoYv;x4T(BL<<~ZQ~#ENmOcua$WCHz~IT4dusMZ zlP}^o$0xpniOU2?3wWTFV{L<4Fu@+vqA`)jbA2cYLesgXnv%_Sob9{hdPYp+g3 z|5XBeU&mB&0X^0YBO`i5iK|?PK=+VSdP=+1iefjIU1j9w1(B?}70f>IE#nrBxKV4~ z_Us4#|6}t%xbxDO$tVN?0U7x>e*PO?iDhuOiGmPVfT((;{@*ykv--t2Lq?qE`;0+D z5pj|T30JL;2OO=fa^7@%^9V$JBCxhbjv>xHN4&Mq2e1YKG0?LjnRA_z&Wl|tVhJfD zXd#8!hIDAAToXs*a2#rDnHo!tH{in0aVefd*2U>et6!UPpGmRCp2-m3Ib#D(0@<@c zYKFhhIilc6SSh|Bg?p8PQjY1L45#94QDKlO;$$rPs$r(>c`bZF{`*n#nLXvD65%0P z;o{^Jz?e}&N_`j-B_Rm_VS>|vf_=oMS-Sm!BqR?^>Cfru^6!4W03WbEZUV?TxZOA* z&0+qtB{ba493%uUBAP&8IMrxRWB`G?MKAVCXM`qPgz9P`MG`1jxrmG}~=2fgjs=i56R?zZD$;J1`m9%v@`?EiT5a z;=M#aPR}I%5-KOoqzP?h|NB*@ zW6ukNCuTx%0hBlF7Ji{*%ZUi1NoPV(GjR5cEWv~yfkG&umi>yS4_0DVqD?N1=8taC zy%xW4wRmMCdI1rDV|G)blP|=(8I)voKE6zk1blwoqJ!x571HvR4TwO=p+fL-ussFB zN{AP_A@ta}vhxs0NB3Zk#sFB=AU~MuH=JqCm=1~30XgVjmO{%H54e2XVaV*Bs@*LTKH61Y&=GF^ZcmBjw51Nhu-2B8s)Z7bXX#+Be=s7-?gh3I@#uRIoMeX z?R=uCXFtAQyW+T8Vj3N=9zUx1xmu^}`cQRB@&vIDUYTY5P zF_2BC0oZT+S2^?hO~21S8etFXhyFZikNFPe2~|ApGbxHFd+RK=jOJBG!JH;*v zM%JGo2w)-EF#0M^bVmhuSV|a0rH;A7k9~*mw!frAB^31hW_dBWG=Ut~Lty0buNf4l zCHmH*efc8(Z*+*dH7!T}-%Byp&#hsA`rsZEs~U>2G9D!x3p-A~?3NyAcJ z$g1AYNT@_0!b%(pG|uZYYpBb`_q(WS@eqwe97-ID5(>q@1XOFR56pi^T*|8Ux`cOk6APFQJ(|Ewxe8jciiHtyr$A!~7{C`)B$=rC%kOQpMNs6kX5>Te=5 zEUthoLlgqo54kt)aL=>1FDcFPaSEF#geU}AgdcrlU`-kRkV8fWkO{H~HvfxqC~Fpo zE)%ohcmXl}@&msx#I6nU!+vNO?^8A5n-|U#|0#kuCXI*e9DM;MMHQ#x!n|2Bet-x} za4|%~25C->dtYy7cD{dpfjY!qps16O`sbT+GOn8BDz~zHFro}uvY_MKEaNIoE9McF z-jidtO|N!izJ^3o_@44b(g__x&NlJ$Jxb9qegg(cy@eN)Rk|9Ca&^t8pDS;BLWxT% zn-%%Sn|pVPBq**@nn?T)F9NHK?{6NcU3=21UB}gw(kG1r`^p+5<-{oUv1HV0$bQTT zKX&+E{{gwNDO6?^Z9VoJ)NAauaPdX3(o=ho68Uardi!4r0^6KXISBC&4*02l>YxOv zb2iYBiJ$N!fGPe6Fd-DkUG=Z%4pMK3c~Nv;MKvZh6t}g$+`cM;iTvWy6fRwlw2$j$;c^Ew zq3hxY+fj25F}7$I*yJt(<*qa5_rB-C=~iSx%Qlve+KM^@$L$RswqA~(gv9AgT%%bg z*A5SbQQK8Y&T*o*LY15;H`&&vtK#Q?#>6>wm>{q_x+EB}q(AhNWhRIuW8NzN3->la zS-wq35Re_jL`P8KR6ToWOhC4}wmP~x#ut=u2m&a?ZGcj93oSOgYLk|vC5clwl(5tg zSPM@&LBjmFEKhpg>U%dJzqe1_dPR7n#_e@6^sA(%YWDUo9;mgWZv*)LUGye~&T&ZosHB zZN+w$hI;kDo?*+t84#0fS`)z7ua%JwqAuqT2MoEN-CNagJZm|d(j-Q{{x zr~agJjz{hd1qSF9Xm@zLDh;u)PMTJZNuzdKh@&NE>ysTSmrgoSLQh7v@vV{v<(KR= zn;z;ezqe>s0bWW=O3}tw*#lz4hpnnKxsjzG=2}$R_UUFj1K^`;)UJ!>=hrvj(u6yD z*Mdt9&dxlwvZC+A3NuxyxoP4=F#Rj1fhW%m#T)ICQ$U&G+ofYzL|ga90J7Qpd@wcY z{y=uDl+})5gl)NT(pvU~`qFFssxfSc9d+>PqgLD$z}K#SKn~%I()`k~;L#aTp_Q^4 zW|lpKghWQ?q`4}UWuDnmWC4$gO<7y1!6yan!BKUMT4XuDl}5u#Q0j&9 z_{L319Q%E=M|ajo!>;JIh<8Jq05p$XZjJL}sMd0>;V%`AlxuSn$wOELp0 z01zF&G>=p8PRiz*holQ?(Hr2#mE6k}-I^T@t{LCH?{;)uI4_~QpK$Bq0zmqrYtwZxKp1Tn?+3($!oXweDL%%OUDQ11B{)+|+3$M} zN|@o`+C0^)X5{A%B=ya&*g|w|@J}RG>_l#r&F`)Pd!itaap#psjgr9^%akILdZGQH0e)6&*K+9@& zu7T->jEA_;_ys#i+u>m928*Y4P7KL$FZ2{2{sFpW?j9whcl{d&n%v_B^%bw6t%N34 zV2jKGtvlf=xk&-&3loMjIw!W{dB-Y6MMIl(p@J~!l1&%XDVCu|)5A_~kv$~WCGqW? zVz|rEK>8Eitz1A$B|YzFSF-CAQ5Hq*1_kD|UtGf_!a{z0REH9|38uk@gF&W1xUG=+B!2D z+ZZ}KNB{1W9{PpB->AUZd8G{bx5|YfOI-0cJ%%VrTR_5yRRW>wGI^scWx!W*vcVqo zi{gGZ4m^JRUXJ%{d+nZ|Pfs`aYJWs1t+*ULd;Qd$ni}QkfR<$rj@qY+R!*6UxcH{l zRl-Ns?jOV5vGkb7;(1nFO@J*9U+F8YZ=7gHjBHfV2U{%t;QBQ20bVGr>Qh*L2R9Oq z6_pn)t{0oE-k}urbTf>xQbBv8=P zOKp1A@b3v|* z_4^M{$cF-L1hA&53Z%l!XoBSFBe$i&b9R+cpV`95)iC)0@Iqob5LLl*2R8cHpt+EB zr~?EX;4eD;*rcR2yOSs#!}oNs4CM)?XKVWb<)+JQjYTqX325g?OYg3~8q2SfO7pv=ULzx#=_2|+) zyHOVI#4mpV4w~}Q>v0#Rd`nAnHQHThROw}9<0Uzwh2zoq31DX&OnZ#1?jjKSvm=|1 zs@(b{w3~fkBNWrvoy&bQ8fo&^fUF?~&h_LjA(ifk)u_&lsg!2U17qit#eue4T1zc* znG~tODfZ|IE;p)VAKdG0%)9tGRgvM6xcP+nNV`qI9E^|7pG$W6) z4u?q9M0Ez;&!Twt2xYzs!;Q238X+Za8>%X$#1m0ga(QoOwe>NplAu3|8f%*TQ;`*+ z2O{+4^hjWplXW8|iZXxif239l(~maBGIfYdJ7;y;h}xl z!TNy)5dU`HryaTZHN0`E>L|ko?x8-+{!qReP*On5iD6SINx~pJig`-wHaD8-WB3+j zY8g7HaFpfzhvMOa2>oYUK3~N8#W(IiD6z~mBZ6N_I==(u}D~f$}6G}d@ z#27l1jP~Ob#!fjP4$Zmv11#O>4=zdZGe&-KSs{g1eldv`RI(91q1a=586ATb&0os$ zU%de?1;KusN=LAs7VEuH^uCBo%X={$DKfD(LJN3^I?*{VWfo? zqmyl+uYouVr4)N0<&>8w+X2b_A4Kje;Tng-PJ}gW@H;YWr<^$W9IF%(vDtbV0NOPy zw$I{HnapUc$#KQsu{khqm+K10zD4Mx$kRdyfyuU*mGQumcs=gX5F6lxNq*E$r6g(aWnzIe;#A90x5)R*g5G>aL5G%5c!3 zy?Y`pBYV#2HH{-bJ_dv0XN93j&U}J-L%In`Je8_Dsj*4J;>B4J2TgzGlK7*JfVbvA z&uVf~#-#PyCp5Asg0D%LL6miS7*CCa60O`t1uC~K>?a@vtNoDxxZw2__Am2TT$VB; zS~!27PZDwIK`EuEKKjtKtS%XCu_oj?gyOl|g;0JNGO}DmCs>01wygS#+`?{9HrQNt zdbrU23<_WIqBuzSe^#^#~wM3V`c z%e8aPB31w`P6X9}MsCryyW=LG#iEEx&6k^KE6+#;G^k8<6kz=@`DIjyktGAM)ciPA z!+Efe=&W_QWD=eu8%7hKz_r0O-sOUSWw|Vg-1+0@;u(#tav zW~mZu9p{(BJd|?>x#w9D?{qZwLShimdfv#>w&Y;l>;{m-Yo-ps>?v$5{PFJql=DDqB+itNLRM>xfgpN$~)`$9(BIYKnd_ zuV#|++IvN^w0KyA~Szu07x zBU(UvrfutAo*9zLt;L-vcW&8(9SxWyXsFZT%#Fq=F6AQIvi4SlMZ&)8Ks5{uDz>^s zxXs~X*(%I04l32^gWP7>Nt`Z9ds~&x?e08{+>#NbP1!Y%T~cnw;7^vHch~p?trVp8 z3a`X|Y$kWzM`;eVeE9kDL%ElA6Nq=y`H@3YRhxX(&kSF>lfR?;~1nxOtAQdS`>RHA<1Kz(XU8=F7FPPmJo+iCL*Z|F-$`ab%KUA=n8+vCEpil zmp~kF0KX{mH0Cg$D~i1Nvr5X$(o`O)&UL!~&rA2&JeEuM>0g?C4|%(W=xbXMaCoYQ_#6hj z#dgpwC=_mUhK%G)7RHF{8i5?kdC~0uxr9Z4b8`keGqukrBIj?J2jKL;x4Ui8SJ>rg zjV+NY2)S(qO?r-&R7hOfp@(58F9Y%y>o05G z=HK>$hMB)o9?&Is*)2llgv@No`Bo&tMV2kv%N90TZ1}cGzbn=6PkCJ9;+q3b?u+|5 z#gYIOhKSVPV5{-X9pe;UQBi@QqV|QKoLlHT-xePB@7rKjtU178p%KMircojb)z)cT z<+i<_H)&BD0*I|07uf7+*gQC9HFFW6@RcaZc{g$HY-}0 zid504`ZdaiVYdBIlu3`~3cB~UNRN?PFe;6FYSB`!mQH%rX1hmP>#|)~7U^X^#j1+j zZyceYM*GBGlfF-dz&hyt?*PPSWaXp+3k2krBh|3>|NDjgp8#Zo6dRxg>!Y%?^qrf| zc~6;`YCDie)@d{bMFxs43*wJMjs}(h1F2;y8N$Ss-k%N&##kJoZLNC&*33AM*IYJ+ z7Em76TwtraZgsJ|#JH~3Y4Pr>Ht%!N^=!t%njZA){geE9%X_E$B+GmGyZZoH5ODY7 z&)Gvhdg?A2=C{j0KrEnPE(B2iLQG{NegZhUt>^p7MidlqEP%_MSR?~}%68O?D&Pe&fa`~weI8RyU0g;7dZf#J@?5iT_ ziiv$>)8G1?`Vvvd|d8S2@T(eyjp7`|h;LQhh|Y9B6{Vjijt%bvuU5=i-q zQs=|^IVr@ZF@RKblLnDY!ohS6axdFrZg5W73)sU5m{csc;K? zU|gAC6%a~T$lD;X*ERmy6WUH^2~>&^4I8%NFTQ2%fN-avsBB zq^syh&`*Rc<^>$MH(}fDVe930Z6kI>?R8&8N}snVT6?BCGffGHK*94zTNsZGIlpbO z@l9(p)=YE`(Sd40hI-F_hsj`46$OG6>W5m1~`8$M((JO4tuR9b?U+ZoV zJ&1n@=}VNEW()4y!Zp2NhX!P(C)pPMT#!N`fc zi=opoFLKcLO1i;T^AGcze?z}5pP4>iq%XMwE7*`>hCcpod-;vYn?nivui6AOx0&Dy zl_Rz`RNUctI2lX4;{l4+M$fUyg0+46O$CnoeVu=YSHm*}o{b(LUs{H2ypnyMKVlJ2 z0@TC|B)p9rU+b$(_e>8i3BCAG#1T;`A>eNG`QJs9r&gRuv~^ehNMqOE?r&%i#J|wU zIJ4Tz49&)L&J*8P-!5m^>Jcstw>FsQ1WYCUN^>K)ok^FW=b2p%HHR^-yu^;~aRXRQ zrOQta)ERnYW`*1M|E>g}#|Ba00=<^i0FwHt8#C`P=T!*8F)0o|EZCCkYW^s*+LK7- zR#7_w{gk>UXk7LQ=`O5(bs^PA>Y+S@axI0r#OijX;0{T(`}7-R45Z=8SRvhAsWl+F zo}r1Xk;)cuvMfDv+J|)lwj75nJ8sQZ$}kkegYnjmuWMoN2jeLmbIb7Me-|w<0C3Yr zRz5gS5p?A=c5ZdauXh^`_I&8)b@W+G9&*Nnhfii=gElA#9)3}>6?tot>OH`AeH%;D zF8`v-1U5t{2M<`ok8 zBR4+5T#05&jTq^)gs9pm-DDPBmXCHt_>!Qk&!HMS45}*lFssHnf8z_Jjnp#+w#0_U z1jWQG?K>{~dw^=*Y3;I8N5u4VfCQ7GW1W7g&nr!WX61m5TNFR6NnpKLXA zOIxb{^Qo*SDj&_+fH)eEkf5AJ@=7b@d*BS^!)xYnlD3A%#+=zmvx#bXJBuvI?o|3u zCI%!28QPL%4nS5b_PlgPprlhMUGjTXO@I#IHH&qasg`X4+KWQ?>>X(wmQCp`7A~;5 z74xPp?IG$8r6H9L?1oMw0Nc|bY;)ny7Ei=TYiz3r)Afoyrks^iI+tK^bs$G{4JqX* zE?c3s3!-i%&=t=&xu<0Q@xfI*#!`a>=O)xB>JoQU6lbLs#@N2QM+aND7@w^p-VS(b z))CBPsxdj-`ncp1fj{)9+M!x#KW7V8jJ?8X;le90cZ$@Jh(5{;pyG{gY2!8uwIqRR9VlT=R9MK?h$iuM4#iw+md;%-#yC_tR+J^)U{fadbWP}gY&v^ z=MmST;w4!adWI@|c9WeHxw~KdZ<~u~@A=Y#z*8|Vsp3?2uVBBbd4n6G4-0|I6 zcCYO1-)C~s+oa-4Dso)T7NM+7^E08$YE^uxZ-rh}@L0(J7wSC0ruda0vP`kKR@Jv) z@!lf++feq9ROose`>C4EaGl{#Pk9#6E)r|;G$YE5r2_NG7_fcg3r;?DlY z`xzK%`!)>#Ge7Y&Wx5FaNja~>)|Ds@*H769f>AT!k#g63H{Y+zcVky*QtY2F3lDju z)4x`?R3=Tf-%JvXMg~0)g^-$*jP zHmXSsog+)=9~2`|lGM|7b)?cUgKhg@A8|%nlT-*O*_Kk3Fyefr%uBYiBl4tM@RwwH zBgSB4sjkNjbWrs9GaJm~BjuvNC|{b=6BK?tqVUVB*dRBZW3{5`E}^N+EDe$&IF>5L z`CS70MYvk1yhR3zpd?o9hc(bXS}AG5FVPr}bf(8BZR1j3nRT-xbLeR3g%Uk5oSzZz zmPe$V;_x+4TGPUOrc!K?oHs29cd^?>j$mx?Z_dznvR8Ms7}QFG|s?*&=0fH za6GP7q$g0w^`tlH>On~MW!c<%(%1IBIGF@UX36W0wHeYAv6-?DdEa`IGOX1;H16fq zFb7%bgiIE_MUtWDb}e&R%S;?0xLcKsO@I_76(hvMCbEbdl_*PD9?Pb^o-blf{|@Ss zQ1@FulHPLURi(|g!7}&%3ByDQrq2N@#(TIIb*2T*N-U z>2ZwJeN_F5%)u>4n384ztGE@>EYbr=unglmiE{1Ro9^o+!jhTiZjPB!>8{HJ&p5EN zKWvROJghH$J1fbwb@LP4&FC-wu53kvoIr)ChZAA=LKwa)o0RK~BQ6^{3}hsJF;<(u zF*^^hQ2Uu46fOe4g7VZn5fc&HfoNP(B(5Jx4kj?Q7$U+<{B!qFIi^Fvvxgkewl{nH z3F8Idy6jw@ku*Ml8)>Eqg+v)A$rCe-$)qN2Bf&OOpZ1#M_O%;K&Oa9OicmJGopcr! zkD8X|5zS-;q9jve=&0kKQoFS>q8D!(Wbvt~2-+tB3*Y|Yh6f+zwLg>OZvC(m?ZPW2 zmUS5P5B!#Q`ipxfO!KkQ#-V`Uc|?yb9bz&W>Nv|a$Y-GxBL=R2@r^P=9VObQG%U8y zS08gD3IiOqwA`SSN{nH*-e$Q2y+p7HK5A!@O!Q|V;7H+A)c)W^s_woK15RFyD56b2B%FE_ zLw4lvhZyVF0n+BU{easglV)gobMTI7v3GuwD_Q1u(-BY^`A6tn^kxIlcP!Dr!KH=F z@ZiL*^jx+z1|Z_@rrzc6 zc>2-1sJa@6y5&IJCn*fhDj*c3Hx-Qz8@j8h;@5Wlc}JA>z;~(Zd;MUb!YR(0EP_+W z2RRF8?WxQ;az1$Quy@PH=O5|`3*c_AyslSTq4~b%t74USGyoLTjLEAwIxm7|SsCt& zZKXAVA0%L5<3wuC4j0mzymA!O^q7mSsp+moQy-onv^?OBNg!5wQ<~iZoSE<^9Vr?2 z)exGiJ{lc}&u>7E3$e`)%r*XSIv{<81;5}RvVonx4A8|lZYT%30vNb(Mzh5{8a0}znndK zXHM5w&WN(a?7nHp%|6apkB(S;U5I+++m1fl;`&6Pd;sJ*y>dWj8qvuZR!=pk@gT;p zSynXiua#`DNy|KER#;8{T?I|GhU!d}xER6RDmz9r8P_np(@5E%F)k&K3d0*yiE(Sk=!vB4f_sExEW~ZN`-CWz! z$g6D3If?>|OMM%~0>Z?|%8JI|;YV<%mb@GQ?_lvH$2X%;`-3rc@4hlAUU!tNK}?QKSgP&=MX zrWWh^&T7!<+NHW=Ah`jFy7$~vRj~2=QZ#yKuD00sw}M0H)MIa=PQ~uwVh0lbj(YNI zECT|MwqAre)odiPH=4nnr(F3p)}mFRZ^XtwF>8LpCZodA!kx5OwT}Lsxfp(><0I3- zz8pO#dO;W^q8`eS6<+-kA+ZUBb(D@kSs4yaOO}H17KTxmS?{}*G9?zRuw^`d^XYHl zJAbQUS6t!aC`_S@h#Ms$PBTQJ9_eebIS0HwkkNogB!Oy0Vr~i`%hMZU)JG(qrnW8W z_a(24N&yf9EcV#EL5cc#_#!~u4EdjKPOYO@wnbsC9ml^x@EstqQAvbf!<0yPEZ7)J zZdXOo>(e6~VdX}PRYE5%xEZO4TaIDSE@|X8>@Y z>4JT)Nr+7Ynt^DnpLPwhqthvxZNn_cty)<795Qrvtw9cbOZ^|Bd_{@AUVzr-* zQXiR~GypN(%g^<*Z@6AbIt0IIZvaJ3P+rNwTxC@Q3lm~oMLPcGN!qtncOX5rU4KrJ z)EzWl89I{O9W(Dh^;85#Wm@>UZ17`|v{C)&kK$dKp%QU=rD$C0pv?D$Mwsv>HAs84 z^W!KS_6(PsGfg`|cKYR`3}$ZYpV5tLhekD05J%En8Mh{}*2h&Q%CTdakpZa`CTsM) z!#{SM+Qn?#vEk^WQ@n2=VvpuMAXlg9*fK2m2h_I4A?sJ)n4g^JQrD}Y>tgwp^Us!% z>vOd^yyiME`8OLDBq{WFBw8@GxM&ZSLHWih)-3S{4fX^WKOtMeCDMjj#B@;XH9+Uy?!bx{%$F|g zsr3r#W2Mw@PF_&gM%Rn~4!X{{cD^n*h z<27>i^Tkgf3o{lO8snd(3JLzQK^FIvjrnkHgp&r^ifkgWJiuDN^t4v`!HlDIHqQ09 z+lg%Xl`^o*21zlfvmq%3!OLqZl87R zbnr{T!t@QgTlK0D!55Dg66+VTmk^aC#v3Y{R)mvZw#Q3UtqqvKB>?gOMVx} zCupl0TAc0p4zRxPK)-7uE$20~k$yGo5nfI`)vWzRg~&~@hn*dY*qc) zGz$@+VBq{{$ftriEw1oWAhN9; zA7b{UpH!4wGa%*yt-_CNTb`wOI+T6k;cQq9-C;AX1&r{eR1}*ca0ggAN=PehmR}C= zy0)sxwf2l;VN<=ONIg)*hwR8X_S$CIcr9m*JN9Cx9wj=I6J@CG`-C#rTr!E{-h^j& z$i}T%fQI~iN8R`EvEm%~6euJfra?AtYeI6EX?Qg1j1 zRC^z)e2Dj=oh_Q~RcY7kqd_BoU|pxJ=h{ac0V3f0HeDIqi?mzG!-MJKn{+zfl`Cdp z0(a8iW&D|Gx{?w)#x?rI#%*CuiL@lV4a-ViEk!Q*PUIQb(gLLi^GGi zB#u}a*JWa4h--jyeY~B4A#ZQ;}~-jtX!1z&9jwWajF)mAv8XxOsU1 zbRgy&yQN8|7DO8d%>A)jxq}Yrk6f#cEi$xjSU5&dYQ808FnUGq*c02KQ(ji$Loy#x zDD}u#bV*UW0r{xu%QKqo84J7>=0^U%_!iZ9>~uOlcnbMa1K6%|^GAF6Or{m_6vg3?{A_>pqh5kH^b zv%HU4di}m%V0U3#@XPk?2r)NVk9(N4+4;)yr+;S_9Vil6g;YOxi&_y?iiVWG4$9X%e?5skg=jp13L(_CS}j?1;5R32hRon4oaHfx>o*FDR=-K zoSaF%Qf;wLa)CzJ-t!>GP4Q-X;E4@o@udohXWJji4}&6ArOd_T_pOjz)4O)2XJJ?< zoz1;r6Ao_&pj*?oRoas4_~y81mL5JbS`v1$-)P5(K0TbyG+_G z<%RdaD1-;*ds-e}_v4Ko@F5=2neMnqEgG}_J%A#5D>LjLCG{b8Wy5&^^u!vP>JbHQ zoFUDXC@2+Q9}F%h4CcUAf{_16-Qp`^~L@N8Q$JX73c>!&$ zE5;ZL$?!1jPUmH$L8U`210$JcIN$4;X#O$6Nh*y8%IMKPYX0b0uIhW52o6{BI!sMl zJg7M%#?Fzr)@yeE6TtLd18QU}y**G3WAR7t5J%J<1B z4Ei_TzzdACF5CEXfs@7-Zxz~cCmvj*``{HS97fl>F)Z4{`^yF;cl)e1q?@CkA>5B6bsEGhQHD|EQ3-3{ zXWkmUJBlL+!&e^))Io{|c;1lzUD|q<*r$K|XVY&(PE`y6|G(R4CO`;a8UKaD7_B~p zzitIKP{yzwpn@J%L=l$vV|@b!3MYN4C=oWId*>bcZCzd8r>q6OS@-X`^UAq?#n#Cb z3NQ}BAvu&a)A#B1X?thQJU6lT>-7;C#D4c3=E@GU_@qV8iN^d)kK9FjphOULfV^kHGNES)T1Zt+ zudhV#Eljzp@Eim>$8cO%G?rv*E5XO;&JnK6MV_}&)#%hqze0%I7u6eB+KtcSj7c8tOh2;n<2mvkBauD(hQEL>1(95z~szhI|?dxVgvJYX$7 zwK+zgD2{DXxK9K4&GxnRejW|uiO=vl#mG-QT81dsi%VXl&}=xdH#ovLnsbwG;Bq!+ z<*YEI?p<3EU9H7%m&)HWD^?nX?TF0|x9L_{Dk>_Ux$r2P3hN=d2S>e_FKSRW7O5>> zkVac9>lj@O1&e+l=pq7*V6bdx`^hp-BqWUViUu4k5_JHU3s{KHShia0=;mFswgc1- z1KH7#DzOMX33p~(b8%Q9Y7@MzNlS414&zKFo5}U$gGuqJhV$i33_tOS26UW)_vXJl zjvia~k6N}I9=kH~g$^k?;01l!DMA9HWDD|uRyx;+Ls9&&lm>=wGk62xnBg8c9(kiKq zLIyKcnFp=4D-^8A5s`MGl6Wu&<~pMzGYkQR($7{d(yTH;nN_-l%`K4=Nh?WKR?7hy z4fihTZ_l)&lN!!%zKYo{M@@-F8o4XdB^RT__8tcxt&pLqo;F>*Bm3?g{CE@mgStAA z@%?~RapC6sHLtw%^`0QP0-ihZA)vpV>xUkTT^qO8PIL9BI5MgdM6+grXhiXW3qOQi zOd_9;tyh#GbUeQi?+Cab#B>v2!^QrG51A`N)18)o4NIWCqP3zsoeZOP_SWR{ootrA z(Kc_8A*q_sN72QN0d4ERV#F{{=kIIHNIQU+!F4_r7oqj`)oEw!7knPP9Jw-f(d`e* z5J~Jj`?k_&npI;%=dh8mxhvr?2c*QNjYiTF$Z=#j<(%XP6!^Y0M;CooVq zR7I*mM9GSSCa`xsF{_H=mwk>y5Jm+20!A4*@0+yijS)=#0)d;ZZ`>IHFXeEJonQb~ zt&yk#Y$^*qVd6L6smQqD2*Tcc&k~6@!ua$bLJ9(6GVG_!pcNj+0@Q&Ki9{F|l)Erz zO4)L~zdS>hEjEw^_sfW@ez(LGyuz*%JE?|ZdwKd{)>e^f%}`P6w9aE=*yD?BD$IDm z+~;IE>Ct2jSfZ-I)h^6d{fUEe5U&Er?a|LDTIld7C`n3UOTxj2JCnlG_zP7)GwK#e zTa09q$CADTaIljaw?@gZFiysS`GX|JCyg`xFxD7J#y)J!k(y&AF%2`4J)m84>cF_0 zB^z^-#&j9>R(NpaC|b7(R;xFDBk5SKqUAzYj-4D56Po}R-NY?8DM!y-yVb;MJIt#Z8=5fv)dVlPzj8%E0tH<&g$4966Cn{xFDW%&zd zcoJ}B#(a!@t~s!;*z%-8P-*y(p_MxB%wiZ zU@=q6yV#$bPKtM(p867jek{Vw9ivzGvt)*+r`k{zoJt(Wq;SSz1Lo_Y=)1neSg%xEH`HvYn#_^% zFfm1|)Ph^%O1{X+A{TJtxaI^bILA*Y7h6MzrS{?!tzeT@X(@ zH`s>4YDUW;W`tB@I}amlQOTYG2cm6{<7KMYlOt(4biCVDMns1TC-96%9{oF~YA434 zgNQGf3_~j`E8OC1OG)`tQc6hZ!YNJ}X4{oO{EtSS4}82V zI8%r>FTTjfBOHq?nkq*PhNT*Ca*{63j8Mj#Yg@#k$x+RkeWX=69g3!amb|-q`I4x~%&~>Ij;nhmz}IP`=HZz7r2l&Zr0oF7_kHqn%{RARP! zQu9-Kg?KZUTkuA?>~A=*JZ8!isZ`1(!}*t0xdr-XUo7oe;mIZaOhcRgBPJUzoO#1e z#B7_6@pc*Eh;h;tx=kjaQ!3i3Qq_v7+6wz7v@rqa09SBo2xq?s+IRbqH_Ck%`hrSZ zB=~@ue2%RXci1}>?!cGZhbUCrX*B?8p!H8o;UhCr?vmaNn6GMbu}84RkY4aJGiQQ~ z$MMjUYGRh0xhclrZ{rTApUS3vUg9*(__)CmBFv(dcU9`EOcl1kelH`z`P`1Gk1>HJ zw$o}mDxfy+b?NdQf93pHcv-{Wv@>(uxG2kbJ1gbqlx(&O><^pw^fU+6gO)0{$oqI1 zEK5>5a{86{oH+0DY{cw^UvWQ9T?NxZd$njgTv#&|a}ug(RU@-|2hJjm#waA~vp4)c&wDXYSELRp_X2zqbts_GD2ur;*5M7=l2w_OPd?bD zxVe>=t9eG3gAAV(qmF^F;3A$w6hGf6=as4w$C z@Q&0otoCXHTzf;~aPyMYk~9H*Jhpos;{1B27=lL+UlXfqmnw}cyHa$?&wP#(Mnb!- zcqTVeeAo{o!4xC>*LFsA>0o$-W!^dH3+$)#D|s4Gy@YBtL8iQG>Mk6O9WCgG!Wb67 z=$Uz|Lsl)-5Z1)!D*KBrE!tCGxC(08B^iVx;EC}UDDpA>1xdcH(kQa*i?S!VOR&5- zu+GT5IY<4LOQBSdp4)Q(x-2)|7P9e2en_xruGOScJ%rM{(5y_ILt#~njXw8vb4$3u zM(Gw&IZ%(rI|yN2!u8EDO^L2u_TXfwS6`Jm5Kc=`tm2cwmzmfpza>RM&%4W z1D0BwhK1IfSpk|)R%85;_3!c_cUC-$#Xi1Cr$xY?ltd zpT9>%fm}@4q;T~O-x)U!Q@$t~M=KA{4)cRAHb>l>O9)jEn3(cKKY)M-Q-NXl^~>GNCu147mEG|l*-u`p0rUL!h%s0FGn z$|N+|Mq36`q*0hM%ZYH&^N`?=Jdg{%qaU6c{RBk`alOII)KS#PY8ndoGa>x`kb_YY z&Og>dAV9s;clivgZ4MOGDo|%66|Vj;fK2x%NxN~B6U2`Hw?=$|!-F8`;+1pJ3us?e zKh#^67;+?Wmn3KSHIgA$hU6N z1qza)SPFsjAK@gW#rX#^@Q*?rV1NnPHzfo@IIl?fA`FxYnvsYG!xbc)Iv6x@3q~9( z6M`EN95@s-*!$x~F-&H3P}uhL{c7vJtD&b`PyiIq7(FjkD9kVnLD-=f?$RviR!@hD z(n+^;a@?CzN!d)EBn6;J|0mVmpgjlqJ@O8K0>xZWbH=Coq*fdPOjFb`nh^)mBD;{iyeiuEo2|X7lc=!pX^GUjBV@s z3adVwullf|XMLH4^Z36A0t$A!3Af*@ghjZNzOet6CV+DGF7{6UJu+IQ_MwI*f&L|j zssUZ0QAFjZT15r3t5u;I)uhUn%mIxWA@;_;X4Btm=Dsy)bc*&M_D^3v=F(DVV?p2- zVQ$RA0&fDODRFAH^0eX8^k&UYm-BVjH%!1D2-X@^q6u$M|1;D@6I%KY)B2IwqVYBNDuFsUJ#FlB< zLu1tsgRK#l_ZD&!)H%k)qjZO7$sTmPN?apVvH$NWVrh3C2GYIiG?fb784f;8s^^U9 zAw}}tZ?TkXkFTcH#i{o1#-{Erne^KW6KM)iG-1!@bOXvhK8<#zTC2L0PSkFf%~+yk ziRV&AkPdnFcW4R+Kh4l|F7w3-ig-1;e}(Zy1+SBUfU#uEUn(5}`8rt?)@4?xkm<^%zGLcx1CZ5Bk_t+cQ9phLjpfC@Dbp)nTojNScm9ikv zrD9p62~&E)CrLXFy;>DjE)Bhj+DyLrMftwFW?sR?vn#h+mbgV73vhLrB~9Y+nm)c& z#~;gtRe$(14UaQo< zE>p$l)+k}6*DK(}UG?;*%+buGSavyZ0&)%=eVPu*b09Ci>(H}%QA}vcQN{apcwako z*>~rjL_MiVN|lfH0z+2=9_X%B2g8gIGwv{!eqeo1+>*szBK4=voMk<2*3Rt1Oex@w z=x_QG4as@+_SBgi@$>q80$-tmJEolWUzHUc`bW22Wt^E#0!CM#<5=vF=ACU|v&=;D z2UTNMzJl2Lms60gg1hBDbT=Dw*Z_ritT9(+Wx+9znlVMVW3y6v6eZEv4CvW+IwiF0*d~Dp?kq4p)PDFW<12b&r(kW>7S& z7&Jbz)@mPz0xN_!eFVOZ|L+k{g+nD}xXIH_U6TO%EYh|{KBKO~xx4~1zfaD3`w3TV zKwnKU6ww`bs`dITu9hODmF|q1mb&TTWHY0qX_QIrOh-zU2nlSY01k_gnp|1-apMRI z4(8QE_JVwe^kW%ipm!7?6n_HrRCDnK=o(f!aXOhmTuQxqQzYW60nDGx=*0+#}DAkQI3N?dg*XbipLM^C9$aJt|m)`ld!sH;*@wI z<4!l#H9HIMvwZ~MfD8$LDNIRQ|D2Ox5Kbca@^xNnc*7Z8e$zg z?41B6q2mIaeTZSEYEZx~*dcLMS)@m(-=^L=toH3T`L-#-7i=*6#RT#>4aZk1j`^U< z90WR$)Az?+0i(ljLwx(v(vWrzhZ{{2iJ$Df8T7C8zrh`&(OvN&5gb4`p{=x(uM@<@ zm5pD12fQ&gyQ`97w-xzre*XNQ60SzCUMfn$jS2^F?VGNG^`(oN%7loj;3zg1AshxT zT-8jJ^t(}6Bsag#qD6{jFm8-2OSX1>ed(&{&8#J~`=N+mq64C8BwOGyuja$vi_f-) zHw`2NOH!WD>3BNp`px(JV=F`O^Yc(0#Qne;h1Ws2m-KNpnpz+ey$+}3StEZZbXda->i9`d{0og~3L{=;kB!g;g`JDk2rA@vVwfwFSYaH>O=1{At}m!)a1-#Qbkm(zHc#722Svp%;MJ zmcC50P{;mAiI_n=L^G^ck|!>51KyYR#%Ppj-n?m0RESc>!xg-}Y$FifKe~RJ4k4FS zIu5A>4M)T{wUD$;MYbWjj5$y(ec-g!N>nwz(A|B`I%j!o>*)>=^MZ@{k2X%*U)pt` z$!eEy4%WNWRCeR3@1k_cFq`%v3U!w0V}lMr4KE=Y@zh&68c`YcyId#b&bdy_Ec%sI zsGmVkmE_)?=?L7Mw`i^%u5BrZzlMt+uv}1+3V9BZjFv~=FeC(hPYH?jAaSlUiovJ; zv+1asQ}jOg*U%l{I{lO~dT6s1OKJ&Zjc1Lj&2Gx-HslEmWy4m3mnmYF%*wOn28X9_ zao=f^tpi7*FW^82ba%TPM}GP%S5H7PSbQ$pSA4 zVGvzZo>}TWT^-b$?4ajc(1B#2H2L3hLf99{{*jj;Lto2aVeT!-8|Z-C`@HVdY&)2o zeO4G0o#Y#C2IcG|Nf)ZhsK(&_g8_*XywsxV6hSJWziqKOlHt~0eM;&v zMA5g+U;qi#wOHDNdQMB5Lza|-jP+feNDd*vzVs4=eWl>g+=_mT0=zlb)2WRuI^EXc=M2awB2 zqNnftk+bbEZ!LBfxJwcxT=C8YRfC5t{0F3`NqE331bSLi)^07Q-(Bn!I5P{K3*s{( z`m5}#Cdbih(FGf8)H;uK~RWu<6Q}PlDMZus4So>w6}?Xcc85q&PYo2CY^WBz=ke-e$2_ zx%*hT)fjNZzg?{}!Fa^j42Rbwo#z^=fjdNpb2qv$`_p1!pPr(E|CoR6ba90V{k$cD zkT9M?sLY1-u+Mh{j*F}&INzkSV>|pR3TTBJcMwEuQ>Z_nQ;?CerBS`oE7akw;R`~R zay-12iY{rNVO^E}H?@-+IWRl3u%0oJ&bO>5?tBBa9G6n%Y%ym15gtkKboo7UW#x&l zOb;>jRUEDotX3`(d(@RUOfcfT4a$#IT+HG4EfM~Ynxysy5)2v#G= zZ-btpU#y+(868KV>|`2?Qq|4$j~Fs^sg3Rk`zaanwm!X3+vZO9!ppJM8&bw?W3!z& za%4cDeG(^eo^({jcaSY6$19qIV2AosvPqD$g=aTyS8-6IU#pG+yQY(_n zNl4*1>1tZSS|DR-xqWoYsVA}#Q`&L1=s?UQ_-7=`px_Jae;yeSH6}h|-(A0UV@&hUQAWHuo$?un7qM|w8$NqPFAK2To$JKp&!GVxLhX8NP(%}81lYQ)2 z(*gW^yRQKeuS*ujai+c)^g)HA7ImZz2C`r#lorPJ&I9NUnm6xn5jXp`$ONSJl|u$G z3}M{^h5u-i0&Oak?j$Qg}R-|H&eZKerF)lR*! zT!__MI=LEq0_U>O9LRFC96Z3J^shdTJILwwt|*hZe1g7U3_quYs0Pk;%B5-;$R(2K zfem=14mYf==Eg9*v0T8o@+xJImXUB06Kkd#IUse%-nZh3s(ynXux>YFfHl5sHxt}P zr2e27eGWFoZQ8W;#7ClQ(lL}IJ?oxJM%zRY$6Fmvs%tCGt8(T&PV3Gk;A=>P3JIKv z6VJBOLeDVXurAcOO&#s{fHTAbY8+lA+Omfqp68~ZPi2};H^CQ>;c;5zQ7$

8-Ra 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%0DQwaOtkCJtFgi~xUa^4iDZCr2 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

-E?|t z0Y5*>`~;pX=}qvVvp#MQyWh6EpElp7yX`;jb^!nIdtu)NBIt7z45$RLMn?FqBdEQ+ zy@BB%AgPZqpyhY8C`Cf=ITnUe1E);zx8+UxrA) zy)#E2vRHdO=E`lvjoi9_G^HL>{t0aHlQD9-IbQkk0ODNMI@eWa>j0-9OSPH}rD4Pz znDda`M2(76TZoZ6F1iY=Rlm;@74^0B?3&a{w<)L1vle`hj{>zhXlr#*!^jE856ZtF}kYZdMt7EA^_YInwL zRKUPXAk_r)}7kboFsnJl<~3C&bDe z-n;ySSs@3ao1-Vkptb?_-x zaMdg`u4jK)87|2aDEn`5YvKO1)#6Ukp5AYk*d*!JPN@vXmmWLKG9apVb;LGz>ob)5 z13cVnXO&;3nxawB{+aY=r6%*4V}kEE9+3x#|2<4&{f!xfOZ7F`(hMsQJ(_Yl=FXst z8SnHm2I4%@suf3>zIR-_#bTH>>@NK)5IFsH*s-j(q!eHd;_fj8!Mq~yH=pG6o(CV| z=sf|qfQ9Nmu>RPBXb9MD*l}*hjE2Ur94v@hbmPOTloMHppg$lvOa;!K)Xg7}XBbX()Nr>*N+%-C)Ys(scWXqDZ>x^QPU+dYZd2llGBovjut&Ez(^2Iwjec{(Kw zZff$l3vD->I`Pmv3cT0Uf^{#^=~!F+@l0+vqd{axu+`b>(yXpfCB0%}SROI2T_5_1 z9s2OC0>*hwgz6%r26@@poZ~ zW_Oj8tIrQE!(S=!#%=s^khz1pvey^I-5b!OT`TsMI(o1Hao2|ZlYBbK(wV*JrULT4 z=S}D6bu-z(y=9{`%$-Y|^;AaQMhPPq@QVf98#&(ikA!adRCZwi-9r8Wk_Y!Y1{=LP zcQ>0Jq8<#gA|h{V^&EUGn{2uG|Hy(aeis%EEk{Q$u6FK~1R#}4{LJAe3~h2yt6sO0 zdirn;Y54dDv+>>c+(6{EtDsN1&grGe>E~@vy|UykhuC{ef}|YRwcgVmfAw$d6K|;4 zE@*egPNd47l5tVmUD$kiz~i1mqbPH9iHjH?eY^^qjJCdd^DM0xG9aw+J^3Q!ec^Tr z)P^kiVmjwc)CVMZxpk0L9GR7f7_`ysx6GOoTJ||8BhlXmfVAdb9Naz=OkJWM zw!}py%^Q?nWk1k$NYnCXyAm^gnHpUgSi9kFh&Vp#4Gx?ztcP16=vnMP1~HWmaz4-_DES==A3R(wi-LqAp~8v4J~N>^si$ z=)ABhvvPZla`y1~t$rfg6IoY<|NdQpde6AYv)ZC0Yv}jq?u})R5A9~qkV=S;d|-(+ z`}4hF@KkXrW8o1TgTp0GKt}M9A4}AOpX6{Pkv+_wbNA5p)njjL44egW>k4~LWnPKD z+oyloT*SmkT2Ivs+X3-VW!XeQb|s!SN7R@xga|JY6eh|WNBE5cf14#rwRg`g`aR`y zJ8p&k&xzW9*4E$BU>6Ku36ix)srFisKT`j@tnybu;{cj9v{W|KF+NPzV4`7YV5PEt ziu{OTiE3bqFM?fEY(-MUQW>4s-RP&*O#I?jrJgvqo_d<&E<}I7&YGaH+M2Waj*9~1 zb9ooin~ugsaEz@e*$B;QYNiE__$K~MC%o*B)y91z7~m3aGLY?;5q@S?57WarN{rAZ zKrlj6(FG*J7~!D{uXj(T;`U75{#9mRbPl0&ZHv@6bwG@c0ty$!BPGgK4-l{l^QIw- z47m2t{~BE;gVYNo=}U?SURU^Muw~@09YKcgO$UGb%u84Q&OXc`N=S1owUl8pMlY2C zGK(}tpPYa0q`Tj^)7I}jdA7~|YrDkjcUqLVln96r;VeDG)S0M=v?^0SOktIJ6P7V; zaT6tEv#(H}9K}5M3xpXV_|sCM1sQs=cVvtH%yjX9AdCR$pvkCjHy4#k=P%}PqF9E3T!DNI(b_Mp9HsYY~ucz zwqvH4h>m78)EUa6V5O!F9)=ICKCu#+um%h!z=s;HyPTB>^RN9)W2Bu#rzH!qNpX%~ z2H!Kv4#H?kMW}abp^n62iowwtEzUkK;vX7fZHlUzww!KaCAu@BD<;#M=AM=zRo5bH zOJZF*C)FyPPFb`*%<52_qq0fSZX0z%dZ9qU4MaEVlP(uU+N~KUxcbX8u^Pk)mJPss z8*C3S9RM=}_A}rPj7}Vji3Ktg`s1@Ak<#y#L=z#5YC@i59Zc9Fz^qOUT*)PSxhHrb zc3|Vy?zzI+k9wd>Qgl)5+iJ3I_jRIe10A8SCZ4~F_~&24BhO;PrO&ecN31=)sjNNy zE8zY34E50}`~^S-9(2fin^7lv9l$6;9Y1DIcfp5~4N`-D3S3p3oK<-Uh}^nUwYj#F zPJu_#aXgQpihrU*oa&*)3K)JYs)x>I!!ZD1gH&rvzm1d-2+k!(mwA}o&Z{k1C3}~w3|sB}Ye8ZnuCin7t^PrX?pJnF8%l1ZJYY7ofPn4J z=hjV~wsZRY%c{`21nZZzEzQa)N)ZoNszwBVklN9P1V5)@FrCWJpH-x%R+Ub>4^Yx3 z|0M8Ccv2P{idubyIpz|MpRc3+3zH>u#}{4k3d&8{V$$jZg?mnE;^uUxC#~NDAJrM3 zXj9y6e!y1D@K4loqcLOpMFOrluSq~pil^q6pVun$?uBD#_tobk`ma1oB7Y{e>ofgo zYy*3bxT?KRY`>9S_)jH-p^*OR#o4WO@05*9fDgyVOlR& zGe>Mw*peVBT`h7-a`f_^l>+!cVxGoT~l88z#7;l!gfOI zI>9j>LlQvFIHv^gnJvN@zDp_;;ldk$AKX!o-V-l?DJ{G(!*iz$dxq2@ z*To3_!*Yjh35VlY!Seb)VjBOmz!-b9jiG$S6w^Yc0yO@w%^PwxG+ZjG5d;pv62dYs zpky{B6MfE0g%K_MJ9RQ?NChcH)FtKgBF+n1%t*kkEWLpWITrsn6#+A_*tZuZL{aeq@3M0OR$S(XQnqGU)v0h_&xECa%H?GWB z2+ckFQ3Ip+u%45WjHajmdO??fcp0i~^RWW2t6&6$*IWT2S`uO*Z>x@J3!HXz)QoY* z5E>tn3%0v7P|(kH5cM;)$xN=;DbGL$!(yfZL3@_6%3kHq973l!Uan}jPl#Nng}*(v zNJ%a}ncuSgn+(L^WVlu4OIz(Ufrjq7XAbQ0JOV%2-z0QmYk55Hh5MvN7l+~j`TsXClsQt$FtYLeSQ%pPv^hRP1{=~Yn zN91LWR9F4|%8dz3xmwP`EpgzPgwl5Y$SzC@$g=dG5j%>@jxqti*$H@N- zoI5dHl?=#l-w5Hped9~LsemB--^Iz-u)zW}tIMe1OQL*8)QTIiAg$J$_6`qIitux? ztQzRUqU=$l#$BU;p-~N3QD8mhe}%pC9lb{!q!Bock+`-0qJY+r7d$vRNUBifInjaz z6M-C8-~km;PE4LjvCQeDcYDcQmTu|hIsIc zWIw@KGb?yTDaT=$9KJ>&jv!&!+m~S9N8igxV5TzE?*|t((QS3HPb5h@9%BtQJI@-P z&6;Dd?J=>loQB(B9i30CSFrU>G*v{q>3-|*y}kt^s)IvzW} z7O275q@|w7Db)E6{tJ?tZ!lFlr8HAp-Q5+=Y`noH&bz}_>8GvWeMEnyglUfn4ygsm z!iimN;i)N!7*CWtVf$DL2)=obgENJvyH%9NzaDDKJg90{oa2F{A@I92(y|;ND{7^r zXxd;Z{d3|)UJRWE(^)X$ATb-;B4tuDqcp9k=JdKN6+4l@B1!Pz#|{fgEu(6WGr|6u zwDO6*)^d^%#nZ2x$|AIZ7`&emDAMD!>5V->@dj)Arjub>A+DJd^4r6|T_?}*Ytc-k%_#C@F!(P5VkvAj%_zHl{> zuRT7sdvS5G%h3u`BxR7#o>Wt#^MXe7On$XoDp+>XwIi^vx;EZmaVi)9#HqZQnaV|r z;S0GYcLh;4$<^34$Gh zbZnN%V8#NgR}Ihj9+L5gY#H~|K?8P8eoT(b=A4q@acQY0d<&!>pr)U!r~CniT{A?V z%Az;yQ7sQlJt~@57>afjKY2+$H)Pu(`J3_}VNq$4jrES?btzuOnV_2aTCoU)nO@sP ztxQ{x-R}_h_%cOx2>7K2*Cp8K{3G&PF@lJWQF1T3U&Vn4R8NjZ8y{r54w#!74Ewn- zN~Hd&J^|P8Vm(1O00QNbr@vwj4Tb-_`A;v}`0&u82Ded=FUUILRxP-R{6cO#o_X*> zmV=> z|HuN;F#pIhf61jlb_PgPMKC4)>!1AByV##lfb0Fct~)c<^m9(jf2%X4jaM(eIY)20 z_WGYQ&P?Atkhf!u5Q$=TE0wB-jR8u**UeCPzS*TayL0zs_^qvvm729GtOimlFgZJ5)pd&Lz6ERBI8JDBHHT z(StGYhB~EQenzq$Tqr9D`+kfGb`P-GF~z4x3uiZ zh&?bJuCE+lL7yFLO*6H44tS4H4IPG%;Q1rNU|IE3GNV{rIs=GWF?gG?P)c-#Rl4P? z%&31`jg(lg9gD$GHiF3>TUN~2T!wTOdN~{8OW0jTil?YZ;)Po zJ}8{Mn9cbrvflzdw(fV9F{yem0Pvc>xi0Lx-IrMIvq2fS`MKY#A!Y?GaqWw5HU z<*u{&h)wXCT$R8x(*W1{Ro8UbG~~iI-AKq`2h$fzMKPW!VzO+HTdn?evcj$N@aivo&V!R;OU5A6je$&13>Hb7!3PXa(J4yczW53j%kmDU1^?7V2oD zN5iH&(sfgQ2UFlL^XW<2EXjdjOX~1=nD;cg;fXpWIV#7cdVNBsuYp~^t%uK+;CWy2 z=V+};X7nn90AQl{Np$4}`8l&T;|Mv3;StQG(_4!1Y5xS^!m13D-<8l-WNc3S#*=m9 zOgmXv*>X*^+Q_GuQ#{1`#9P$sBsl74_D)HcPR-;C{Ztj$?~gNt!SLr#RDRzcHWOf( zC|;CVC2_QJMpiS9e+wPO%aC@H;MuFvU7HO*uPn9n05EoJHc-&Y*6M?Jaip(GKD5*P zt<(Jq`0ARPov>G^%4DVLk}3<24+?BPm@@RsW<#`+jiN5gwT}ERqa7*~vq26#wcKP} zEA4Lw*cWXB9_Vo>w;RGW%nuaZikxEKRgd3AoPbXy8QK+~7r3kBw2Ub$apY!krVBbp zrfrI3fa0un{-|Qeo~VhH7?Ue@WYw;ZU4<$)4IivGvZcY#D* zoBsI5&t%(&a{)NpGr2;0Gc51lGmYCKlHaTmu6mW3XNW5fl^90ADh;+g#j6z4G5_g6 z0^;_FpUn}T0;vBH2oewc@`{~vW+yCCyh=kr6&IEH zfNad#3UPsCB$IxgC8?)m#IV<>p}#KTc^_V0MgIi$2@H~1^DS>*mP>ib77HVnS*8!R zI{C_pC~3P6$V-7r9EQL2+yPJ9)}a+zgTm=^(xG0}R)+|b-17gFs-B5^9;vs z!#Sl)*bj!)mDu4Fu^XW%`ccT_fJ)9Ar|Ekds5@Ppy?b3kLss zmI}6(hjUl3@=W&EJJi26I0D|)CJV~$^Md=-&Qz}CrAqjM7nZb}g^AcS0{Xozl3%k` z_lf#V7CF`TVF!oj*u~`S1t}iN6|%(P<HP#&MOC}hg7?UE~g5>+jT0_+k7JiOjL7rCG+JA*cGm_{8rCAx8TXGt@v|RjW0TYUd{tpB)x*%WlDIB49_7tcfi$yA-^D$)L z8vSqJ5fc0$zXUnyh@>3mAoA;cUtAfy7!hH<61Bf?Qkp}3>%wP-wBZ{nah;G2Jep>J zR4g(op{m#Bs#`t4K7jCmnc(1hI+7s8tnXtB)1H@lCMonuU1~sy0KGqU2H|EG0fow; z(!@3Fe${1y_+}38mRaQ4zlcMOsQTAgm>H%)oEmH$vIb1uMpu8MFsXd$8!U0o@2w5f z{!L-Wf-Jsxd3D&LjqabXW#Nk7i8Dh!71ZuON4is`l_%){Wh{rCWggg9gL;We8^;8x zy%hVJ5)S~+&r`=L9IJ@d$wGP8wMGm0z1~xm{?W0HTY~05$0m>`SdIf2KYr>i`us2j zsf37&m!M#T!rWHG<3Y`)9G#uYD|@wXD4tm_%L3@Qm^SvMDq8$?L(VA4^iHq+*|14D z!N%T_Q=1S#v?*ICSuU%9F+F6g>B(xaN4E&8KV;N(cn6YJ*p}Af@pNJ8`FZ;`=xfTt zuzl3-ob6&R5QRJNSJ-&FY*pu~*6k0O$LCb!6Y({*1Nrw0vAzOWxC-W3T$5b}U0Fa( zE6A1@;)3YEP{Fk*9)ccA$j2pkk;jzm5D%HK`WYPaS-^aff70x#9onVCB1-f)x=BsU z8^ef7b`N9@{PB4kFePjy68-mat~+;S~Se6yeOPYh;* zbr=j04BO_^DKvG?PRB;!Ilr#^Tnplj^v4irS9`Gq?ngE+1~J>U*Rza>$IG;zWle6bS^eS+gc$SL+hQDP-g`h(+T0g?Mu zhO&md(d=fVE|X#o=&hvWnTY$Gmtx1D1sFk5X?h^qC0w<4=Um{-P^?TEFppJ?Ku>S6 z0llPxrEUWuA8czeTNnyZ#WsL~Q{UjSkTx%8+m)2NaL%5~_N#%(w0v{aK?mDh0mlLB zo>bKS)G-H}aH?n4TZ-krU3QEbU?Dy>QPf_P9&5@JcgJtoI>@W?^n#{=V0V~gIkG%OfcwitQ9WEfSypn!8n?R) zJ(FaiiQw`$MJgJpvm_2fAC-2WVgRKIw$LyDThb$7<|Oozo^5hax#W-<;2Eja{L;l{ zzs4h{RPB>40#d^K8sr z_Ysl;Z(Zwhvn7B$2rZsdLRiDNz55-Rn!ox;_A<$4eP>;G8uFBLe)*?@?i>Hz=g8gS z;_~38ubk_vIN=}fUneeq0Kbw2;x9K4c-nyE?cq9eR1{F@l@;m^Xm(L7kj7&h|BI`0 z@D3#EwtRPN+v?bM$F^!yXlXnkD3>kzLa7__+CQ|H#B@8B+d;pAgiKV1k(0hlwA@P24l7sMVCwzSGJ`(qH_iG5bfhlPs}>% z_ZPx}hW$7&O&=YvQ;5G72#qO(gZu$4%}fB37gtBS%Oq^m5s`QUra$_O(#6~@#PD!5 zO-?ZoVv8LML!GoNJe5lcaGA`^I+{-i&gYOaAb2Wz2-c>aHZUKJiCa;pnO%&|9?Uv0 zr^w7~Nk>zZ4x3%Y$V8WgB{osiz4XA>tY9Zq%+Wg;r}GpOALXEUWBT4iq5D{@iK#`u zJvg=*9hPc9bG$4|pP_VdmK@S4zS(|e;GQK;Dp-*-$>L@zCSiyIK(=4$8P;K2V?G>i zYP*EiL60#FeqhtlaTE^UoP^E9ZZmwGQKXu7EU_l0YuA$4&da8B((c8Bo^4HYJsLG8 z_<)@et0JX_sBZC##rt4&<)HDO`~in>2bvN^TMoLv2;4Y9@NS;h)l62iUT`CP#S8azmv66c@-#@q>WfOoXSM0MM9O*A>lYa>t6~$&IMR9Mp7R}ihlR5i z_X-3^EkqlO4|oBD$Z%DI9qsxgtwId~vH}T=P|V9}gb>D)7}P~#0|yq?jDa+<>PDTEM3#4Hu7GNr0e zHTr)&Sx^xju&P2+1O-uK?ZJ9ihBfoQ{qO&&vzt7*#0cvT6(AB8&P;gxOo^t9|E}{m zOKsl_4P4md{5Hbc_`>g6c>bz6Op!|XkUUL1`BT6vrf2Zv&X_AK=i1eNPH4k(%XjJ4 zoO1yiKJiSAQy8Fnt|@A)&xqp_6JT-8l^JYvMg8a-b-C_*cV%%3D=J)D|C0bd;l}Ti zfm7h>cVrMp&rM_A$JdA>Yu)WBqrXY7bdQkCOiR5SCDZ|aVAKH2-6D;`6M1D*V{ec% zC@A@rI8w17%WxhhakKa}{5x_C<|+2?hBy0J+FcxD!1$42-bA8x4eK5Ae~veb2Ikc{ zz`uR7hW+1!#{WCsXz}`@sjAtkql%;Xu|v~pV$wpPr@W{&5tC?_l+&$KBiXEj(d~*_ zRwHB)N1soZX6Xih1o-`Zdcox_s~(xpea!yw|0vJhTGIs?epZ_{bT_-~nsL@Qznkd+ zKHzsqZE&#$r)UxO@95E%j$oVrF-M_{YfkQ_#{Pk5zfKA8R7vg+1Y$)&OS!QJ69v~N z&K%3`UO+_vh)W~U0-u~Aj#l#>?TwWi0my~=ih*SVu>P%`CGGhmoF;Vm9Q6>izA~Ko zwuB$>8J4wDi9tVz|LL66H~|6G+%EI#w>C$#O#0=%PU+CgqQV0nr`~C7AeZtwZ8ls+ zu2e2(ord83yBKL3K&`DdY*Y6|aC2c*n4sg!-k0HqjUc(p>V&a}lA{fd7x0d41N)PQ zOT}lBHR+UIrJ2%;*&qgyW7stglIX4uVrHML$>%tL-U`)wKSofDMy7wx8k%&@=nf`NgACWNhp{wo0E$ z3HF^ca;?WTMzd#HrfMb050*(KL!?bhw0yOps}q{9hhcUx&!`T>DS$cQU0z~*BM(o0 z2vuO?zQM6^$`Z=krB71TixDhjp0VH*NQ{ifg%!G)*HjFmIuN#l?1&s_TiKbJq%6Ly zxE_l{!6+*MlG+GLGBTrrUrLX`s>G%<9U^SXO-%# z1!vgs!nQa?tpb?Rys`LkyxYGjGQ9K{xLZ<}k}~f`r9&3s3Ylhf<=KQUxtiGyt4+OY zq(QZSExs6|*?2ly^dpQ*c{(-9XC>SYww1N!80tp3q+N&YNEl{xcJiW{uM`bx!=$rJ zyidXt)>hYALFnAku4d;s(YZ2unU)llz#3_}UpU1BqLM{>9O-wR<>pribd3f%W)YN2 z=R--A91;vT({qnc?kX$fk7&v(Gwg>aF4`A>rF>0<)`@r;#U^OTkkg4m(?5=pVX7Aw zc#;rOPMDZ(bJm{w^HR1L7C!meOX{(d$)y1WngU;375{gPgfM6xsdCbMz02*?B{ z&e)dwtXpLqs#xYI#dr5=4KDgGY2+g2E-oHh_RB=t4p3vRJjrYsaX9e^(BQ;^&F_2IL~n*hSi~cb8h6ltA@B19tu$^9 zGvAhiKj9ql6yAOsmWOPsylqATaayJjBFV(h-?K^A=X{gR9~Dar;1_l!w1;zlo4&>8 zVus(4Fva#{GRcSi3U_3sl9#fso=))vkbZ&f>5$;ZP`eTsM{KX0R%eo=c+Lkp(Ft*3 zOQWJSH;is#{R82u%Cyb)s~NILlEm=3zN#`}rpMtV^xH_pH} zzoe5y>AnUVNr_fgO1j+lSx)J;FO7{$J3VQd6sd7oxTs#1GH&AB!dkemhw|PP9>TJ9 zt}HhoU6_6Tf9UGFKC_&QG+h6$@T?RyZFO8#v=2G*vEWk$>XNjkLA_%3-FeGO3Ghga zVpg_U7&Np_eDW|xQ|2VLjDqT!4`|=}AxuJ->d3S(dfx|*XJMU*=8D%zI7^A3zOc#c z#+j|{t?lmYF~S+Z7h*@Y6(@E-hyH$VlYXPWDHOYt;&&sCov|G08a}!x70^aAv$dko z|AuT*N2LD5+{&;`I66`&rX@|Cs>-WS-yfgbgg23Aq;LzqPHw)@U~odE8LI(Rf!nWr zgv&1JC0#Rifqtp!LIVukR+&`DvgMk@Natl7NbI_GBD{7GD zZB*)*a;^xb6hz_imZ!8a2sxQ#BJA0EMe&$Q8sz&PIL;0+?m>?&B(A4v`AGe8@R^8v zo(h##QXfwpne94ocJ|I)={NbMValnB{L!h6U~`F{gU{^RMFHC>1&PS$%qrf`fM%S8%LWFqy4*yRk7D>y?QArLB5P-Nqs%f;faMNUsQ0=###P zDpd=Y7yqQ`=G~9B9J>muxU1@vIWC@1Zi2!zNe_{nSD{gVhHVq=a*&eKOikpfhN{2lnopn^w`Gf9-?uFWw+8t5p4c##&MF zDco1~DcyH=K*!~lNp^*@Q9|M72#SSianbN7H_{G^sfbmKKEWEs8h~CyR=1KB{K{SjBMdQKh*Se2UU4TiZvMI&pY?r5W_w znH}_SwUc+w16Yf9kzvmCV&=`ptaL_yn>H|v1ci;5bIM-BpMGcu(i^nHyVzwGV(9a= z3gi{;OU$}g#C1Dw=Kt%H^vZ?l@q*U+e%f~+Z}4-LI$+^`@r2G*nKP2M`d$Lo+#z*q z@o97j%6?A!j689ht!kmb&ECS3nLCE=@Juzk$k_@b5}@tJLU_7hl;iM}XYJIt8T_OW zEuZ%`zNSKvFYt+J&P$+$=j-?-bNJFDXi4er%S(lLnl?`Ep0E|dojYFYCw@euGhON@ zY{n}arn}a}yL{k;DW0sKPf>7Q==~ra;`=%i$IKyxwI(`F79JwT>onNcYmGJVt<(Yf zFWEk2FrbJ?BH4hKgMfq^q@maU7tKDlI8Bm)YCo3i@YEe{+!;?@(cs*E@?A7jX3Lmq zA%Rm|>T2#vJCSuhnXDwCcz0GLlRi;}8@BD?I9%B}vz7xSwPc$n1tWBhy1CCSg-5c%)1?0BYDwi7*j()SKeZ>!xBs9( z1ox}0W72FxK&5%z+#nFdAm;8DQI6j>0tX8R6W>Ta8x{)-CzDmgAk5%p<;5UscHZU- z4^)0n;^oH&Q{|g9)tPJEPpqKfEV3C?!d+Vqs%p zr(+5DCxBb*4V6FZ?l7;`gNZ}9i!Mrq?P*4FNh7YD+04@0VU((X*>N-rz zn%EpF6xE-CXuwon6R-cbDiX9fRj0eM>yEz|hI zKsj+@`@T|8kwQPKZH={YUr~k*_Vmy~w$MTXhtlH0zLYwMuQSsh+moLU?>Eppa7j>( z!Nwtd!_Of%GR^&hiTqT9)_dF2DV66@{gR1WDTD2!(hbd?W>amX)Lh3L@05qKl;$v` z@;l1woJZ?F|IF0!?9l zvru7zkXR7-&Gy8x2bTtK|MM74a|{O+`j71-ttA{(;=hb08ogNScu3#A4N#{s`Te(6 z$)OGsIgKv@6dllj_Q5lE1-37x8ar?#t-1J3c_K|m=4%dJ4@Mnn2@_1986+Bv#@tN8 zg6A$JGCdGY5l7@;OOjJ*h=16E2BKIHNfwl@{_2u4l0sddO>DW(w>=R=9A6?mgqp=r zI{EZv$;6LwD`~a_QhVN~pFXahx4gGIpNq_Y%8GDA@c=z;A`9P9erJL*Ay5scS54de9) zSq6_u!icWeE9|#{W!|+pFWGDtF6EV84X~^Zc_O2YdTqiqf7xESQf) z5BLkX$z(|wm0B{Qt|X2$SM?cN&!^?FI|a5+1bu_x%cLf|8x~#nO)dhUu)1=BU*?s2%Z_+2>5q76IPmySnmKU{`$sPe;Zdj*x zjbL$oy`7q>+xF_#5E-IQR3h2X;f`?<5nI{7s^q?(Z>zh^Y-)?!O8vbEe`E=hEl|Ob zlsSer51nl#aRNJIYpeZ%wN1is1a4as8diHjmZuQ2fh;Z~fMsxZbl>URvJ8jI$!bZK z6xeT?aulsPPuC&evQPcm=tZwQI=q{}q2>+;hnn$yOfsYhKH2Di{r3m8*jT2B8q0iO ztO|UymQA0eH<^T_2?7(TsEu*+AW%WEFK=m%n1S{8$Fc?vF>7`GY}Mhs!mgn_%$fdo z+d3c8waMsQ(^@o_{Ob2b6kh2YI-JG_W$u|<{}TmrMG5BScUz{kJ0kb%-Hc*4xtabx zPgWAhI}R1EkNkxF*V736z=z2x1&N2I9c{^YBs49Vrfs(7TA%*=xoV} z`?8W`9SO`2v*VNtBwg-L!-KL{=2KqY zVAb{ASTO0`V=(&~;o5IZksc^Cs)()Ut$FaBy>i&napWv@z3`)>^yFfC@}kBTM_nsv zN!ly;bpAe4KkW|U4hXyY5Gl3M!kvLr1$ z`2u)<9tMvdK*S{XP1_#C9&#!_X|ba$>WInCBHM$6l9P_a$C9FxK>*B}3jz~SV<}U< znv=1nCLdVk^%>uUoRs5QZm1YOJlc!DMeu^ev3RjV| zh0h{d;jje7edB73Lb4m@p(+>W|FINsp1&#lCmX+SbneQrBh=5Yjogu<-OUKJ8qXEI$t5C zd~8LoT-6OR!6R_1P!e_Tm9iy_IDl0Gx0EzxbqryOu<5Jn8Huk=VCH)NYcKvpedt>b z%A%*LixHJ=WK`$4Sj-U1X^|RRdH72CUR^lT!iv)!x8Q3{ z1v-trxKd39LZ%p+(katRxD;VgT%}7cf5E&mZ|9_0MiEe^%0w30=B|b=UPmN0ctOoK zFi>Qqf^NKr6}s0-B3HhLz*I92d8#OytujRQQY8T zEuhc1Uf7-R5}TiO6}Z3b&P~YOS~ak-(V2~94(1x>(a*)3vDLCRGJY2}mE3GtEHa;q z>Lszj5Pvdl$i~Xj{U;zNF7GfAvMNLV`#FOuCJ~swT~Nd>6=QyD-+|1=yIqNO${6m1 zcY%COwY_6HE|Xv-$i9SVzn~QNjkgrNZp}>zsv*dNFr!I7qc1A zZbDP{KfGam7S=0$oW^f;q%%^)zKJfx-y1cOaJ-^uWti7SL#Y`KI`&mXe)|y^IIOFc zTmx92D(7oHdNhNP=`OWAH$oZT;kFf(Z`^v7M02Y$7W&>wkNGIfjB!vCP>Xe9lE|5I zInuv0S!$VmzyYZH{op6RLElN<4mnuf5HMQWZAhQC+a^*fXGtBlUXBzX6&j0OXgzg+(GISwqM{HC&@gc%a@DSwwFl zg(&olHr#Wvps575xn%hteH)=OrY>Y0cQm<8 zF9>Q3suzMx5w)mB9#R+yKWg8=_VN-{Ge|Xl>Rizh1gA&5QpeSnLlOin=Hf* z)5{^K^*p!0FOr2zakNW0)&T!UEq^OrgUJPVE`h~$BCAt#S|pDsO&2HsscUVlLE0sc znIdQWk6IW^OE$Z{Oa~L;gk@&_+Jo6()Zjm*y}v=PFI}%M5;wJN?C9<>UbrGkL$+YL z2`o(+BEFFWxqb!F7(R9rx%8FbycE>~dEYR^oEiJeqMB+X{+jzz7vXkrLkG4P z?H-0nY%@#NDS)>~?e19Ey+FDRFGli>7zoNzY&)y~RJVbY#{mi~DXjBMWQ48na~c~# zEv=BYj))|z(@~X)PpVdGC%Q3TWE_+iP>lP5SFiaX=3&tb*QF? zL<0Ly`RYcMujr`qW(jTfcKjpT-d6;jXLl0+pB8@;FMcADT3It%amgS>>|hdCtDm8e zbV}h1jlcGicxr}dZ{G6jDC%wgxbm)Z=U-1pIOWhi6XTeAN&#ZndqjF{z!$F!W58*2 z3T(sGYzOew%YAtlk*#37eVx(#LP-d?nSQqMoLAOUtg$i7J!-Cp9>(6xJ}Uf0UuWtL zr!v9MgncpVSu_?s+*B_;>0PF<%*APXuZx28}<_AaOjj`zyviXR?v3X3r z@kVi;^@)4pse?C7ikFGEWefg5KW6Bi@JI_2m|}k^`ns2?`2h}fuPO5Hr+I5cZQWf+=p>8$2!`6tsaI2@@glKzn@=T!9!<~ve zu&3Y_GzI+b+oO5zQ1k4#a{coTYkKjaea$z+-2F5J)BO~F&xfIGxSU4TH=#mn?YLU> zNA_8ILTf|ij6`;NZXtEi+%a9a&g{MLZZ#(S#Sp z0u3Sv6F~$rQLh-)lq>;+yw;Qc8)i!1B%D+2a{8Vaj$U^K_ny7pIm`W%CWq%|>&B8> z;xE57JG1do{pMfqOe4E4V7uT+EbEI&{WL7))nf$Nru1F8c%|L`7I6ZDF|Wb8_hR{r zatMUL0VPQUuLt&j`YhuPi@VECTmSke@uY z@m8jAU0~6vz3=!Nd4rcG1fF$Y_}uq2isv5C>91hbzWt+p?-t!BO1KXfWz@pE+zY-5 zJfsIvR7!goJU+KjSsT)2srDOY;Hu3>%6*QtPou3f z?t>Skiec<3+Gr^sSfaoGi1WwoSS#f=MfRmkU6m=M3$M-6>P^Te&S+CV%RuPHq8OJ< z8I&9bZ@emdHn%>R8=N&Whnf%Bno(BYtv|&8pBoU4n0^^nx{X%@=;`h}=__lKf8}hB zT$j6!wm^;om?wq#Jihz%F^|)CP=@o07m&brZ0lv=4cAA4AW_chCr4n~Rnl_mL}CI| z?(a*VApdvX@*iu<8#Q|ROWI7vmk=gL>5tul01}@z4~Ox(&U&a4JzbM3$|9B{a{f1l z5-4d)J*C5d-?9x-7wbqlxc8|6!n zjXX|YbSXgSN0lE^80n3cl_JpG!_&mJEe4&+Zi=hDO1~2u)3I7#AB7(pskSb6(0uj# zy?CMVlOSSusKj}Jc;PK^66DM9#Q!I~f-B7B=YBmF!|f^MrEcJ~LToViPWNAN5*1$t z1-Q1*SG8?%({9&i!4RM1bHgk>MdTNj-usBeE}_b>1MGh~e?iV+1AYLjCUm#?U`gfb z&}+^psr5p7n3QGU{EC887tQPpb&D@B1B^3R&o$d*rV3h+LBRC zCm&q%^)f&XnvLQUIkksBHFx=BEz1f%U+y!iRgZ{(e~usee5{H<$MDi z=aClTp7bcf#fhBUDZ`!AZ9lxBqdbul zqhLRrf;`caW8{|*k(5kF2{yb1ZtA)5!TM+;o{DC(%@`(KT)fd!&865wJlQx`Q-~!O zE!hzUdwmAQA&9BjY+00$EOj^um1WCP)d;g6til&lhCL}N5Uy2=(r#*R1;{tBMr) zO5?98_^~WSdKo5gu+Rjfp>3C!W-S!Tc8XQFr5HMOLTuM{C!237riY z+E_uG16;eP>O1!%IPr;c(9D>s{1)8MQ_5H~90}4D81%S7G=OQ@8b?fSg-dH*0K>p8 z(84M<4FgAwIi71q4PPJHY{L=&*PG&o>ykNS7&5NVu}=+^;hLJsg!rrfZbQ9wju%v>olRA~!xu@2vDlD*;4y82Yt50IyZD4_ z38*&QQ>AD}AWANCQT^Vf<@|=yJ_Z(6^lmmS^=mWG^8Mh^8XZ@>Gz$t$ySC8tfV6hB zDRzr$LG5ghn0|phQv5_U!%vcr*|sdpbX^pb`J$lfYY+b(yXOzALzbGjr&(uMs69n# zPosK>lj#a0Pxfa0H`Co|0NAs^HW+b4-KKp8OV zLilHA!KFtguV7~Uo+!yL{OL34Ce_f`-&_vR*auBe_mx`g0u?{16+>&0@zn8 zxA-y3rjel$kPIp}MH)hPW9A^pe}0|3isvZx)>27P1z#tf?)(RjY`$h2nXtS@ z@^E9KKGSV`(WQ;5%k$*g^3?1;hc}} z3P@MXPDuZD&SGn0n`<@hve2g{0@N85FMb4pcdNiaX#_~kMmC{TS?&umex#g`=hY>O zv1csswjraJT+~@QR#-uOi#%MlBPdvWD`ZHxV)dq&C*=@8`Sw>NmIZAyX2nJ6pq3ly zK+RuwicmLn{9i3sxr5|@3HH87fQxyBP3 z-%0EZc2>E8mfUiWe*IK~mH*?prYGP_8L&Jb6O7V}of3}2BrZ4H`dwc87amLDda5&7 zvrhhOE~D9Qqlz0$CGmQ=Be_C2j(?qhO+iQ#w0whiB>Mu!8;em#*edMcEZATuNqAJi zD%9W)5XTztap40^NLLW$J%D7#kfJWkeW|G_x9E10&b++JHJVyW9CUP|Jg{cK$CJP* zCQe6q^PWB+x^R!!{wdy^*=Z0o7ujS3VpC0#ZRpm){H2w}S7(u;(|99@bA-ZLOJ4af zNkz}Cp``f&PgLHhnikQMO?0PP>e(vkT9LDtQ;@HJkFD+s!Qkm1Kd|F|HEct1WSB_( zOFv%D2pWC9XxD@FOb3TWqffD~*ow8+1T@_S?D2?~+?79xJ5O?xjQq{+i4%3r*a96)(zjY{~Uioz{IWC{L>g~T!rV0Z1Z#FY`vL!PeiCd(F zr(Ij!z91NUL699&EP#SaFFjUKhTujwueXTrMtRsoqu`{_cW4VzUT7|PA!TXdKUh;% z*hQJBDses5dd2IgDpQS^(M!Z#4uhUzXka9*>7+@btI2OyW<6*l)Er zG0c+bN)3hM3pC?*1sgi=tOxz7a$xW#59rA0xC}s z;(XA%^y81$a*!}EtW-jL*`7aZXe4y-l05*)2rJ77!hA$8l%K(?hULSsi>=3abf>zW z0hy1BljXl`p-Fvd`NZvUi%dJzV_%3bO79^ZFFEN7Q2|dE9AEC3Ue{CBNFqeTC*Bvv zH>Ag;j*eT!s#dOdV~tnN&5N5z&pCYrlojyJe;RrxY2HE<+{oMPdT_rz1&FD_Z$${C zMtcOFp4ENmKGtFj8uAfyr(w(DYh6YWKfT}eMsG-*sa{eJ9jxxKwQj;C=IA2S5{fIe z5(;iMxPjcl+7PTlbAttQ!wW^UK4lG_7!jXkOdavYlcakpLGxeYebTeC8lANkj@Gc5 zyFLjWj^Y7(p>cxp^+f06`7yZ+Ag}%_0lP`_SG^#vPO5cgox#own3AZ7&z5`6g=$i7 zIa-_{!-04V7%~Nj|F*PwZr=U`b?OP~-&qMp?~D6gW!}Mv{z0!`frLmyuIdDJszFry zD}7?2FZ}zByLleh)6MqoV)m#+ngI-l(N`m$?*{mvUC(igZ98F_P8p~SprS30s)+P~ zpzWnegArV~SF+{Mv0C#4E81zaq0v_iQDk3sfsE0j-N0vE759Oa$Ho+Iv4?mqj(vPy z;@>CIgy?)Unep!^>vZzt`QHPNzjbS^F<2o&|kPyt`X-0fH%l2ISpG0vBS2{q5RUri0Oni%w;_6|gYJ^vd0X*m zH9fKN3yN9u(LLa;^t@uf*`!m}hS!Q)Xf8Q|u14Wdvf$ED?P{Gev0U*GSS1~>0d;`t zT8kWM81~D1+PmL`ec&K6ey07R_ptk-3qAMz=`i{bwNQH(rw*pw-`AY+Kf53C!6wVHyMs%NZPqGQ?}QV+Qg2wl!vr*DBoN~3$1@?~2O`0@Z;TRY4$l8AP1rdHMFWIv?2WDIjcp8_ zou{;6eN={)ewtriZcQB>2^s`^+kKaCLnTEf0Rsd14oyysbZ~0j*ddAW<*acB9js_h z#i*WHuK;VN=C8A&DWoS-6a4B8D||JzwY9A;CbW85!f$g}o-Q}1E+If3{$A~yA5Bl@ za2-!(upGY~Z#?{)Aq2j<)zSzz$mE@VyjCpCUmoqCXkGQ`QC{?^4vr9*@H(tVM)d5C zw!c7^jT=Gj`b@c6@w8QRcKwBPEJj%VwIxQWy6H^Ku(f@q0N$)NwsL9@Ij1kR>13A` zhMhJykm*5k&z2SDZ8xpe=WM$;m=i&+>_b38)F+8TIqI)|j{@qWqVC$lIT<6F{&bqf zf2y3j^^TDtZA{O^Adoam4oxAX$MS8o`gimUHp8}Ek<{o;26s;mGVC6yx3(rn)gB2j z*eTvvBc#XayXS{$w;eOr=uS7=mwSNAcPkB5IvGOiP5o^PEz_GA;%IA)g$AUD?0F2Z z^=kLvskcu2F#v);fqz<04mB|y>Nf*8cBgp%Vxafz`!_le(;TXiJ7$5}kKiLf?csBI zP;3n`T&g)z+;xRTT{$^2$Uip7JpJ zM>}8GZO!w!ZT#)^eJ+oD#jnFAG%ozPqZ!xu7I$+(p#t#s@v*pP)b3PLcMm6aPSd_!N-;!h6J37`z z{#3jvqyCuu&apS6`UY-4^ao-7o#DcvGV-d%>WBNtGnG+?71kP6DYVG9Lc`SHf3VgsUL{BX- zQp{ALC0)Q{yf_6H&)@ttcw(Tcfd%Q-n>4pY!<49LjxaKWlrQDsA>yoxOGL^zR=UF& zLb{r675_Q|W${V)El^IL^(amz&(X@1akjmI2UtCfJ1aWFWC|F{jb}KCTMV;M7)4Fa zz9l;)tJJX%qnJNAJ%b5eM}{bK&^nKBn}y9>$Xv6o;y8hBR;MR|Az-*kUlO18`(Xng z+J#Gf?7Vgo=P5ypG0Dz@1T%OwC&p&Vdy?SMPadYh~uIjo8;#XNY@%aOo zI^ad}-3~V=RYTk#gN2VrIB`UOZ4Eyf++~@jd~;Nm3Y6x@I`SpLOX}+%k`D{W{-qL2 z+}~7q&@a^Lj$AYsDLS@g6w3v*p5380G0ZSu{fHwMKc$eU>@BrbuSr!~Z|w~Xa5 zq;#3YP~efUR|~fGZK~_PhxWOAv2l@CH)=G`F3*@_nu@pSP4WbfbpvQU)ub?!O{Mr~ z8lN~1CMX~teodE^v%(^#JO(q}I7J2~UY)F9#n<0cY;*d?!+)Nf zB6#w=C5)%~&-AdOnIu%>^7Yw~=y3O1o(o~HE;86?6;#&G?Ozyd@1EW_il&xu(!zi@ z1+f|`EaHg=h8?tMNv+(fRVIjt1BOIiUxlT;pS<(z!oae2!X+VGj{DeCO8fdl-|h2y zdvruiz{~=hpIKVmv^Gl)8vwV9!O;-53+651jFFCs8A_NDyb)Umw#g*EO{CMxr0)^*bC7i z?58tg@}mpW$j5_AeL5*fELpsadglflv)7-&RBiCwhPej*uO%QtCZHyVr+=sX5=~8_ z$BOjP5HcWD%!Tb1Pw%`>>m%+RgZ|O* zR@1cTK*?UMs*k!TZX2EPFD3Zq!R@?mTTpP^b`nS%r8bjxJpd9g1aVVZ0u@)B8uL7t z8#AZfi}|wsTC5#BB4d;>6zKoqI$ExmmJ+-fkeYb;%0#!l~mlscJI; z8-p@`%3MMwleA^T+8Q)8R3$pm-idfVFlkVL9l#0Bq%Cmksybcov)!Us^M=|r(ib3HevjGd+U)fZo2OLN z1#6&6vv4rLuJ5u;!xHAis#wI)U?)gWj*qAzkoB)hHG&k>Tw>{CHeij8jerRHO5Tz9 zMa?pP^Ncf&gT0p?G3uuuUT*nRufexj6LujjND{o^HtYbPj`PZUxQ-4>fo)?_Mw%Ed zhF&`+qd{rrSA!iN&xjaL9?lblQ7YGKi?ROJ@5)I*c073pNL(vKy5VU!m%eJ2YLH6o zjJ4Z7dyS2dpxhli_kLZRje#New$`{P?Ok?w zyE2gNfo)5NpFZ*f+xxFLAK!l}+{EGdg##oMd9mxq?vVGCY>rgBv}&T!UL)+8?@xWLV=Muwl@IMuWm%}O=Ra8q{s`6QsS#XT88xIAMkoP_rG|7qMoK+F0&wYxjl&0{FKTEqRj!w%^+?j+Y7e(M_ z@UwrsmPKe9u?so&c&MP4SsEeS<1iZ*sIqJUE5!jzPF>WP zLP=C<&6p{pjL@?FkxY$gYOL=J2@CS>jujSjgD{Td{pCe{D6&;(m8|tzRda({k1&5( z9aA~8%&K|DbNpRBW67rvZ8_sE#z_G!w%w4pF+n`@;A-<=)8OOG{p^k=p44og&gi59 zT~vOLq_>NDVfqf0pA6k}y9r7QYuIL4ft@GCa8S2I$#@SC!Wyh&X>JMea-8$#udZN% zsj?PB0wzDOJ=3~5OjXUsQs)apvm!>Cig}NppJJkK_hd%lG;PDG@KOa=Wjm|6f{lTD}Fu&b`Q|a^@4j< zH06d=%y5s2vHl>KmT5DcIyeUAo=wWd$_c-P%2RCUuWKYQdP-Tof5S{qW7OFf$aVy2 zxc?$drPmAfaA;_&E!JpAgr=o9sFQ6R#tnk7Hfq*BP9lZ{HNNbiUEX+)I)#44o9LF$ z&9sHf255)}eiI_{)*=qk^fhv*uys5rFqUFE=3I=&yr?`FX1JVJoACpBg|b?;fT}sd zMNRJ6PBzakhp#y0AnI+ROUrzFdwTOazy4b*mhMU7K^EEt+HFtZyjyXU>d8IUz-*XqR{A2hOg%NJi)Td^4{ zHG5xQzS`94LjGhKMJ^!G(o9RGEX*$MyJba?(5^eQACF6jeJ_m^VTj3;C|`SjPNyA(vsN4E8v;>McOhmG0MxQj@gguJ76 zm&u&VWT>N5Q4vp50K)}DEWEf68Yf1s|H{(Rxv5u5A~iJU5f&i4s!;@Q7#G*WTgQ!E z*~l8o4Vi0QVyu#>ikn*_fD%A<8=6_Xu(4YZ?Z(zZz3E zme1#s%MgXfT?Bff^K#$sPugo9yx!-cN$2CR)L?Y8#%o6fW;leom=87`Hrq8Z~ zvbd6SRMX6r%h!Yp<|drf&2Of~Z$Mpd^WG!{#hJaWQqIJn;1|!kDRtLC$lAV z@}g>>?tlT!D~cpMlonBizS}={cpGA01AydJI&J5>u5iP*n-oR_`cRZ_bwMEu6)KGm zW~%(|z4*7D6dT}B?#jBoa#q_(%O7@9uXxko-db_6vXf53P0>Uum}n$gzz4*oJ1osQ*woA9tG(=ZK8ZOz$-%3sy5{9 z(Z;68sU}kvOHWzgtaSdsz8<_5WdHgRspAdjC*a)n$hky&4YpKG6go+o1_rr91aJJk zrVJ3|EimJ-Abk|l!@Ko1?6;#_MGR?r5fl}5#Ns7E5RS}Ni5QsmWsF8Ag6!C5^jQjW zy3-gX@dBas=Pf5Kp(O*SO$0$);_6MhPDX2m@PqnE5|GEPI>0xhZ~@(BP{rtWqlxms zxDx3qWl1ii^KR;TM&01 zd6c_$nR_-GR4N-u9ZfJ2mcmqMrZp@h#WcbhutLf?mc~vc+j$vYA-M!e|0=vDWp6h2 z_X)Wgf8{U;{1oONqCM1C^E!?Caeu3^nX9p7tj5;gYHXRSv8AtOHLYe1t!6Dry^dCM z7OiGAt>)Y>U^Q>Ro5rcAq$kg^k_b8Xr)_XY$_87_BXv7X78#Qr>66dTGWjj~%cGv3 z(BDt}@H6;1Rek|)8^Tl=^pv6r>9)2xg_>fDfAULs$C!FHpE!C>GE_e?@r=Wy-7tCN zUYN2EN)-1e)^{3l- zmT!$i#Sl1Y+s*y>mP=Atm6@!{;5YDF<6zQSrp#lm@4@d3uKvUV_ruBLEv7cOi>g@d ze{nd)Mb2T`ewe<7`77={P@UAC?kK)S(ctS;-wMOvvMdX=Q^fc^ye}8}2l&8Xxz=!4 zBeJtRb(K4v&s9X}YN}rY!{OQ#J|j#%MJAs=!iNT*27^zbix|XV204GGKQp;a`SQfw zK-+aA6u`C=%7v!>3Qfv?f4~_g%kb)f0bM4gulT@GN9;eIpqBvJ~r6Skw=oY+oi-|R=Ty_L9^~mS%S@^Z-al( zapom_Vun+0H#|tIjpfkJIks*Qe{R&#Tsq z^OQ-7W@VD9BT{+p{jhkAGuNp(fAjW0J$c=ld~(P$oVm1a*KJVg)TrXV4JJGDs8W6# zloaP5geAR@SDb$Umh6Kw2pZ(apNh)nlhVu)^=L6Low5M!tRfIBX2w%)2Y_XUiL<@n4fAc89hADXO zpn(1;1@u3|bF}p@pb9TyA-sge@G_2pS8xivic{frtcD-sOn4KQ!B4Oap2Q#=#0VU~ z&G1XS5Z=K{;8)m7ZjG&I2U*GvqWv$5A-P2Te)u=lG~&?%hp3iEoZ6&u<`X?9dQQ=}09V)$6F;_)R#XJ>yiQ8dt z;9=142u1LMen!cED#K>=2$Vx^zr%pkVb%Ww3x7q{4;wa6+r~bGe`5TyUKmE|;*H-f3 z?5xtB$c^%k4-7Kp2DA{EP9s0XkBWpJ#i2ONn0W>*hUpJ>f4Mj+txNjS6ucxoJIS1n zLsCQG746lu5#S&~s=B#}&u5;V?AM>=bipni!-_=~ZD#8w!z9Q)xcvYN9S+(|g8 z(;EeLEJ>l~FhjDyk$vt6de1Y73m(lx{;7l^^(sS=B|4HnM~A@tQ1yqM9?8WFwEaC_p9J zHl+OnPJM2 z2ve%BA|*=YCZbe29S&0IbT~$7GJH5VfKd3T$>Wn-e@s`bbK`K{cCaeYXPxYYU!rjn%H_s@}e;RU&Z5)Wat2m(fdZE(@XnurVSZXxd5Z2Tb zx$c5F#YNA+Alb|E?}K&$$uV?cA+2}BA| zy0|bgJlYE|sc^rxB?F8lvxM#r|Ae}k~O7p4~%9)QjINPg3kGT(qiGv!9J z>Mr1YckxULZsT3aSzqdf!Axjbvg^X6_Me6dW}BdV(RKrEZ3ibmFWwG$E}q18`(+88 z?v>DK8*Bgb%NTcFQll2D``{~V#KXCEDH0wksj<6?$f6C9JiRp ze=&0!`n6R%kNle9Se6T7N|kY$<^BXP!y0I!ayG^KIgo?%pa5%OI4*!OxClydF;rna z%)uqlfQ_&Qo8T;LhN}o7-HFQydbPlNcqV*|E8!DdO>T1y^8f8T1lM5+o{f|69GpUs zryM;v4ShHp+vsfo&&BoFi9y^#<#iasf9vslyaOY6H+JJwxDh|X9wG1oF&r-vi|`WB zf|rU7_*Kz~OGFgwMGr0(U&brM<#?sI9*HUqqVuwS<@s z($8}eV&;;Twn>Pok*+Q$0K1>TCUzQNGZ$NNEJe-&(%Kq{9STWz%{Y!`41!uwB>`v- zOc!+$fZD+=R!9J<(wc|q+-T*Xe{)kt5mm`eaT64l+>~kxKa!hL3-{{WlqGPx&P{27 zZ8|rxjU5RIN}K1q4TqkGNABcpmj}!qN5KY$jomc$iH1Z3^S;G2&NQH zbbku#jzBRu`kS7Dqd7s95bOx4@HkjbJ_6MPZXdvt1U{k)oFEFcEFelf2Xyo##XLNvInlw zXKt|~xlB2KL@(IgyjX+CF7xIZq6-Az69jM%kYjuj%J3;nkBnY!Fk)T$AI|*@)lzq>V zW6^7$krOGGbKirhMjvgyd0Q>R3OvaG#M2UVvC^dbj7j$ylP=eEYFv9l&deP?@^cu? zCdpPwRyX(GfD=X@0rC~nXit{!u4YsH7mPmym}@}psbrp2e|U-kxtGwBFH}NF%dz6` zQqokyydVhkD}^w>QV2R({FTDOKSDL=ZlgAT->8yz$K7yk9KI>jKgLzkxSp0%j~`QD{0C{`lawzgRi#&Gs8;MVW7ZWFQ+DxtpXd!dN$B5s*c_Y%abrQRF#UR$!) zO}#hv!bIx1v60ratyf}Bd%6CalTE6uC-2Es6qSG+lZv0g5OPimF5AQsuPhz}uZ@C1Ce$>=Js{I4yf& z`zZP=p}#$F)2=NRI@*tIQK-Cci=grrOx_pe=Qfc?(Jdc}L;;Kyg%oKA!Ah#1MSZRG zu0uG@f9-X`=`t=_=vc0nago!xZ89$M>erjAUoRt{zWNcM>YiUk&d_`c^OBhr{SYwf zI?YTHPnRZ_nFkdkQZBVV1oHpuU}oXlmCYa>Yb&ib*g=Oip1rf6in%&SY6@O6@gRj$xK-WMbS!EM+1) zCz&x%yK)ORSVcKup9&ZvPJ+>*GKJw7li?VHp`DOg;)Xv#jseKs54VuB|IS08Jt)#AqnS@w2vf&Id z#@y8_6uQoIEhhddfkcc(!)Je#@!YbIEfPPNwaGns?sSf3ia6$pRn$z#)X>b21QAX;YNxWa6NZs642rhQ;;6W+Xlo7~=WJdy2= zU0~3+%CCx*Vx>~9FlgD@GwWrs%3!_jX_nX_cSA|Ol*{)vvbxrMCm4n;(w4$TUHIF) z?$V7Gr7XW^c$>3-_W2<K=l zjx1;5Qnz`@z(87#`G|oBSkUm0VWVe642-)kEsFJ7u&xc{D^BYBLSh#GUx+xV_7ihH&`X4B(daU4pFx%OeO>kwbQTLNB1r%ub#ncJvQ-jSx}CbYzo3oakoSL`qbMeCEGH-AQZ8DdHzc zL_k*~Fwp;lkaA4pyrUjtpn3v!bWz+;L}Hqnl%b4MgwC_vMmCanFdP*?OMyIwR>%JU zP)h>@6aWAS2mm;i{a8+Spd2tY-++L5F{E%8c+n6I%FncU@{YDCJ3n2TC`fLb*%-&g{tX- z){Ow--ik{Xv8_s5Tid6twy%A!^|>OD_doahX2~SMVBgE{H}|{WUCuf8+;h(T-}B|= zqmMsDMAOwgFMXRUJaijRmLh*3#S|${l47chr+LZ66<)kdck>KsoGC3QyZID(In~9L z@~rYwG0zfWv!#2Eyv~(b^Q8AQDdu~40WXxcYAR1g{&klw6@8lJEYhy#hp^zCG76@@;$smUcW1^ z_sZ*iGWUL&+b$j7lj8fL)9Eh$ftRij7b@Aga-sj>cn2MH$Qy0e*>*|Az>%yrdlTj0k zg%b;+!DKRw*WyU5wJlYX3b!mvVF+4EYS#wW2Lo-XNHkCzNv5ipJj)`@v0$n#5oVf_ z*FCE?7ET3PBC&sPVE)x_3^W2tyz<5{iEiC_rA@+vGi5?jAuO}KI0qG+(0$vG<$i=^f- z*-9s#&17E?mx0B#V6(KXWpy~QJh(cFmj1Qz#$fd9U?P7a?^dHdwI%{dXVq?M2_{qF z#Eer;4n!lX&u)vhhLZsZ9uBm$MN^U0(Rky!z;e7V$-FKJHm(5^QD<`)vSRrl)xUIN zcYROo*4PIvdqK5MYZYX@$()w~rTHvm<&LCGWg66Vp&MJ%i=CD~?Q?|?vc(zBdXK=q z>T~GyzOjFr9+q`hYbclsnY>Nd?Bw*aG*wy zS|)#W)44QhreVk6i0uxAA!U4HI0X9LO|l0WmG;5vy%W<;)wGKQG-CsL70yc$JE$f>EKD zbn%mBR5Y!jhmcV`Yi>j%SiB8P-;vAFBFFK|*j-_ej_G z>Bl2%k(?mVTqeXrVSSz5!+CS=7oXjSgGnN|4(l0d8~@Mv9Sal~5(L^>!rH``CLIS; zcyNI}9&2LDqH)-TV@)vCxCTZWi8Uv}p$M!PFHISS-NI*Yf{D{7f*2LjjcFnp4lsY6 z)U$|s^)-6JVtuqEYDDN*Fe(8dE0O@KEV%_ZRxpZ5oeL+O-%XLnxsh|KT=XHpTw^d+ zZ-$Vxw;qpX0muro0t0cuUA3mCVkKFeh&P5(?MbbDui3FIvPm%AT9AmfwN!6NC4x)h z>*et9W@kdd!DzHbvse_7ty>?Awqbu>i5w9)mO{%~;})qLh9KgRC2OPz##j#?ybK7f zDQmkKl@4sq97^WOM1`0Z)sNXd;J4$6BmLvC94srxA`E3HST2vWn25498VM&B#S>p- z3l`y607j0u2 z^?9o@xIYg-m{{EwiKYyG3N-j>eg*+!O)#XLq!x~~Jkq$%;8SP^)2V-782B3eEFFNr z{G35g(31xLn15pM^R&<4!ScGFM;Y{U`h|;MF!)6gx{Y5N7g zVsH^w&IjnA!LRZ!4gQt9{+jN?-t-s@(vq6OSxPkcHGbXTH~63k_8WtL%fEB+n+E@$ z54!jd2ET=iOqLOoT!bdKwTod5YI?F7KHLtfietLsEU}zcGZ^TDlCu9u}@X3 zN(|LcIQ7TQsR7DvsDa97s6lG5OAP@+>2Xme;0{=qIm@!frOy+mwNB+1BYTJbY^b61 zx=Rf+)NnPzP$z$=kuEjLP@~ltLycAAaJ=R&KDI6#(kh^r#QY0HPrs)>81z^Ao5B4U z5|4*vstJZVQI#58EG-jdr^{41j9N`HRE3&sr~s^0O;IOxGo7x7kfElkX@;7vW@x;Z z1qen?(kf}FnQ&fpvO2|3rwX%5RVA_LNkh$2vkf&z%{6~`h&b&q9&Yex9%Jx$p1@T3 z#dAl%`Nua|hpz=D3`WSV`Qog{<>wLmXSWFINd)1nfKUL34dGZwm`Mt1emoux2XUAU zvTjDvV5~WS6B-b(N?+k^t#b2SoPVD6aP_U}+xaAEunb#Y4{QZ2$o*;Q>Qs6n1Wy53 zofeI(hmL>!ywP~Ff_*MKGe8%fbT>%xDMUGYRHqC+m^#q}l73&1rEFq5M) zQ>+@txmy$Q^$~4~V|&lS)LVnVa`fj8G82Lep~hGe5w;t+=)TF&CT5&tK31BKRed|3 zt+NL_lkg}3u))M?DE*{fG?AV?KbW*qrByZfTPV8d7mKGNO&hgTXIXi+R3A*Vk7n1$ zVKsjuif6ST`9wsnZO7VEGjXTKO15Z1-$nw*HNy3wwIb_2fPFIUzM!!!k-(8>z7=OP zDE0A#1T=Rf6UGL0xxb~un^+~>WNCPV-1K7lF)%$+N0_?RYr~Bx6Yk3WvII=zrkRr* zlgP6yH?uGr-u8KkHdiEBjk^z~+nOay<&%FoJ+K{;3}+K@LLQ+%W#$FOl;+3JJT5xt z5lKoz^+j#sc%$@DrGN@9p7^M%C9pyeh`(kZo?m?c7?)vz$w5^R5l z&@Ss8x94u30Wz9_goPnA<}4PP|NI?x>I-?Yr%wz$W`PH!b821I;0(5yS~aXJkhK(h zW4sl{Q<_h^_as%JPEuv{T-Rqk_mxA>A+Sdv$uwB!hA(Q1V6EB{GO0vI^^*GK2&|)e zj}NQPLYXv)EQ%zOD5BADNc^J)P-TAuka{;u?wG9yz54boY645x~z3Z#1=P;r;BF&Rjy>e70Mr%AFGEsr{`)hd~oe zV!&xB`Q&#D3b|=9XfqF}TJc=e=!?dKp{(Cz(qU&De^#zHSG13&+vwXwgP!G-AnhOydQ5%(av}dEZa?7X5U4s%(jbcWxR{* z59?X&C#}JoUfq9Mg}Jjdr9tK> zi;~nH*1CKo!$n%QXSDk$YLE5I#hK4#F1XA)4lZ|Rxa>l$gLYdxmeMvrG-V&TR_-Qu zZCQB-c~+G7_d-Jj9b}aEFGQ^fwS82)64er0`EKf$)t$MU3&~B3u#>0L5L!%Qs3u3Y zDVA(*?DrnptGD2B+Gl@Buo~-_Vp$RCkQ`Zx^b586s6;W79z z8nPAJ)It6&G^`ANXcL3zprIW!Y}GCrF3W@055kxcTXpB)4mx2Vjl9Tn>sE51d9-wG z;gSr!A|W%TgT{YuMbt1Gx6oH*%eT-b3?7#m`KB~(rPqW*5qie&qX{d^9-$LEsPv}Y zG|?Q0j&f6|N#>)%d`uolfj#Crq#;N4oT{^frnXZu!!lyZv09?o|0Bz+bFYFG5Vb)0 zG3rNgI8!U!XA{k!uTU*r4s-u1%<)RPjIKiM>vSDmOE-VhH|TcMw$V4~6}p~2pc~mi zH?fy)<|4X<=hLkm!ida!Dx6Jk14Fr$NJ=2N`~#=e6JaKdD5 z)X3QAPw9VW7Oe!hJM?KI=Zh4Gm6JyJ?YrsZd>`J4kqGKL5&}$h;uR;==uKkjJ1xj}Mb!IIOfP#!~5c4=iic>R|Beq^CA~|w|GtGbe@fgHp z=z$Q+9XK7lI2{Heeh)$P9sy?`19v|WakLz^CiTdti~F0HW@)-2tOTRRq`CYo;m?9suvq!QWRGSfbvz^cwR!k(?&1{`&&om!u*Aq_onARSvzZ2(K4;|IL%(0nWe2B(>N{)X+ zqz)6~LR!q#ql!=(p6^lvBe^}}@$aa`qSj2G1YoW8Z!S5aV zvn6m9MoJuVL10_~@&W5VbHc7G!_tJHb!;K=3`({z`u{1BvZI z=mimqUjo6iO_f5kODinRzF%Q!c15Kff#w|DD`CRwe?@9$tf_R`X1aVXzf*hS4tm({ z^tsHi;`ZCki5|blns~j`^u+2)uOFCk!B$!?&l*2)R?R&W@w=tAcqs*g>l+?Xq6I%#_shGV3ZG zwwX?!vkSQfiOQGpXcDYkVkMMpTO&RBwxp)_*Ndv5At|^lqc}hXn%j6C-RG2rcLk$ zK!Ho?5*@v~bUpyaf1)N=jK_7%a?t`DdVfb8bHW|}ME`)B*?BNkm{E?e!}0!Kh<+}9 z5IE|esJXcbxLSIh+z3?tFM3~GnqNwrIclbvyZAZ!ABhz#hwTUSA)NXV%PmY^+o2(I z)JJF&S6)f|j!=<{R_K3Nc|y7}L_*RL8mWWRn}?|ul|!`PQ&I?0DB<@oRHH$C8SO7`v?PP~Znx3l7$@DmfWlhie9pZ7?QdU&Dv;KdYb-V9m+-`2A*EX}j zSK#+r{<_KU^%a=@YWUse#6o|eHSuhzS^iq&Hy)ui_t9LxA^uvV{dKC}kec?_qO`w` zkm|WI4E|c;bJ~5b4OiSU)2SWr{>=rj*(=&RL)rsRMYpw-4ffDoP>!S?Y&(bFq0Y!) z9B~d)A~jWN)>41mA~05Asw#8`IomsbVUS)#NDyr}mW~LU4S`hGN z_>26-8Y2a?7Uc!F$87VtdTsM3!#6x%YDWcTyI2O_L=r}Zt;8d z{(Rr>-a`>nynASyS(#aAn_1*5@)ho&u~=%67Ecd1DcFQU`Q{?febZWoCWDpCEY7Y= zXxvG&tcIB-AXVZk3ZciUX}TI9S`FZ#UpE(Zws$_Ck(Qorrwc5B>;2veQGO11T%ZGd zm)0B&jqiW4*Ho29Qx9(T0OIv;Kk{-roz;UG(W$v+q)o$G(+(JN+7vV>c5YUkLap5xg{$9}iOsi$U| zVaey+f%DqqE0`?Cey3i5gp2ol_MPbyj(5-+lmRN@DOAE!$;Z=ZFi)owfUqa<$ux;i z#cqGkqJ=yg$Y37A=6niqHC+Y7eJd}fyZ8)xiqE7Ext2P42`jF{`FA=O@NzEVc{u&f z;c>hY=h`YR=LvZ8j%=+vefhZ3b_#74ufxB;IBV@g25i-fmmV&9+v)$F`pD zv)#`3+wSLf+b;f|Z4c^C@egdz@=n|H{DAF6e#rI)KWh7kAG3RSmwhbnwwLlA`wV}) zSMlTaIsAlu0Y7O!o1d~@#82CksBh%w?Kkj#`;Gjf{Vx8g{Sp3|{bf84@B#bV{Hmjn z4>$(!uN@Wqnqw-z?wF2xB_9+tz-s}wpQ42t4HVH`)TGgXfqT){^od?TSJBlP4R|Sp z(_GMio6f-P>5yOrexJ^!&txuc6*Yf!7`0-4nKsiA^cJdDsSGIRAeE>~=|<|*ZI{#a zKs^VkNbQErF>1xwp~b8)w*dQ8%{JJmf!+IwiBb4+{+E`;!}V&EzG1m-TOqe@v)zu% zf^M^qrT!Y36xcqc`MTF@`v?~p!6P2~BATY#-1Z%~`s=y&U(r0X=BU70?5KYk0s+#v z1vL}540cQaLX-R4Bu78sv~9pGvmA`;(GJ-ALi?v0)i~&M`$y~sesf|En>4<0+3%t| zf#yDh)*i7gG^QT6qs64Q9c?C!k3a*MhnLd4B0dbKIZXWlc;-R5#R6e&a{(rzLI0q| zBQ);Vc*w}XLykd*1xKN8BF29Xp2u>JYXE5ndGknT?w^eAlVny;-I`UkDM!qFvCZR8 z$pc=+M`#rDD92$M&a*pVJO#bdz|H3~T7F2R6jX-mr8m2x5oV+F2n`07%YwM7^i|Zw zlVoW}sGo`TDh@;HLp1lOaQv8g;3twwlK*qF?r9fWskdQ!XdO2wX;eKdan{vXnO z{)o=uk158V&<2>+l|b*;!f@|}ssE6V(mrg*3ySGw<)mLI7yW-zdFVq`K%b~WI-*K4 z3I2O&ta*{4Ybk18L1-%W$aHVHikUl_zKodTw`azuFC!z#HTtL+dxPnBhp7yeLsW1` z{H(%``%y8MSV_!Nt&D&JD*4KTUGo8IK#n~*GWh_9C6QhJ6VoCy(;}mcd>VsuXs8Sg zWzk^yS8OXOIU9c=Mv{^)`7(3)3Nf?&)Uc1PfVqEliJ67W-S#OJnJWcu%o-67wZ0)$ zVzVXxcjbyn^7vYN=g-UgZ=TdaSBW8XrRw#8bv-enx?5SRHeoO3XOlGS~Z>;)QNPKDy8$(Bx+O@ zv`$T?YgK@5Qd4NFI*E3usq{THoqnih&?D*;+N(~bXH_M=rK;#1HH-cM^?#`5&}V8M z9aX2XLoLu7*NSkl5GUtA05bd^PPG~4hE-=sXe_1%y*d5;Pgj6mNc4#tT)7z zuEo}O&^NZwX=PUIL`*?j34s1}OKfvSK;7TOb!O6t4!T}P5c@u=*3sjJz4R?ajLkMc z$KPSE^T{~S);k$TFJ!LKWM*f{IMJ3zW@MI((~p0Mcw-KUx3a0@3urJ*V=+0@nE)%b zr zY7NXHLI+TPT}3k{FpUQ2ZL|Z@lxjF)qcK!wZR4g)@48HHB-8sWz?0eghy{pj^bi2H zWdeU_Nk@e@a!g>9Y%!3-6^N)O>YPf~+E{G(5cXT~rz!JQHz$VgrkiFB+hTrq9JVu~ zGyO$K#R2$QX`s4@hNxr@Uv*0W>W1p?SNqLac9@1pyc)*CEuJ-?C;48)tKqxp=IkdY zeITn1@Yju*1aX&yDv#h3bVzscNFF6g9{GQ7af|G7{h5hy?353$*iErSKN-xKq{wgg0if(bZ&^pk)>Ca`i=JVK09(7gDXR@4+dVC_6Y93zP zYs$<|etH!)J#LTQXvO6kNK8WL6NM|foo=J=%=1&2Z{Qor^S@9_0|XQR00;;GIF<|j zSjOCbKLZv306Ukz>;p-ETM2wzRk{DZn@R3ua+_tEZgimwg>;fI(3V0;p>5iv3{BJ6 zgvPX@++=RjX(uybmZmAV0D`hq#l2+_1g-i2OQn;R0^$Y=>QfX&L2*Gv#2we7y#IIZ z&CO&oX{Y#Xe?9lC-@ctQ@Wj6#e1wRWYIA+Gho|T~)khjnDW#i#c$zfRrI{hkDbmc8 zW|q#gy*#IsPi36CiRbyq$Ma=nK`Ecc3w1udjL+a2A1~s7kE*y<=ejbQ!u4K0)5k$R z%gbkbR`&MxdU>&zmv~mTeEl0*4r#8E=4xrK5$x~O`C9qz z^iiCz^YOd*-6DzWy>y2RZjiMbMaegntZK6v*LjbRc8kHhM^@kKqbvD+GIO)e@AvWt zbpD{sf5^vwALftv_@lhHi0bR>ee@3A=jB^u?N)(!n@I3>oj<1Y9Xj8s^T&0*OXs_F z{)En-WGd}8QzE4`<4p_-xIu(fqH>9JfNTb?2)WB4p ziu7A*ZXg=55=`8T$)0%sK-5Y_;;{}aV=}~4){{Tkv6N&8vxOieH*dGt4qnO#Cz8zVIL1E=KGu$S~ zS^&ewR+fyXW8sc?Thtt4^0#a^cbdVd8S4vf?A~tmq;RTaMI;tUUC2~avuHDuXH7f| zsw-N5A~CBq-QNwmg8~G4S0ce%48`K?@L%oK=ssw7C}2&1hTKh zN=H0pMn{*+lG&S!YeFFrhj+l8s!WbMGZkQeTH}d+Ga8NTw!&j^fq+TvDYIwC26Mm> zmlylnMI%h}z+=ox1^XfAo`l((vYAt>O``4wn@TmYHk~lV#uQ`VVTO=D#vGgDiAIqz z)5e+{xVG$*DKljSLuymI^c!-viL!t;k{VKaYEs<>;i6cbWjdokz+x5=VRvCcC?NWO za3Vf1V1+{|tDk93&Z!7ygR-QAiS6?@rDNiZn5H))&poxXeMA(t%<+<`ydg?b*+k$FGTRfR7%KuE_ zu)30%H3+z1^~AWbJ3SCq3Mxvbz{jb7C$uYYdU-mMu%Gg|8~OkaMhQBn*0Lwy34P@k=mv#7G}p%1W)l8d#hX zwtAr7R3hDzvIBvwrER(B2jhuoIM^v|uH5qoaZ7<36iSN~XtA(~F(RaeEl?SM9}C-(7KusvK*+LEA(%@! zv^s{TUAcmD)Fi$Ibhf72)F8)#d*g{dE7;o~4JNFpnU29T62bOJ*eaBNwh|i$GHu}` zz~qt5G}EbOMkQ{|Rfamw;&_!Zj12k-e>^l$_Ny zi?S-c_EZ941qY_bWA4U(#&jwbkF`m)B9YeHt;S-fhKhQZsFZ@?vI$D$Wrkep;}Ct5HF0j{v;enVq}TE4s%30O7vLGDpJnOUyYtAf-~qY zx*L(Pup-o;57LJWx|MD-=%cjPpncNZA;S;TN0^qs?xLRMR`e-D#tB9!;5jmb0NFg32l) z8_HxDN<_jK8T3_u`kFxx(<25Sp;rugmY&o3L4%J%fcy}c=7;G?gCF6~8~iAL0gWtt zQN(+M9yI7F`i{Y0;x8Ng6R|fx@SbOH-ohhUVo11<)tHYiOmKPuI!}0GVWH<e@6zo370eq^IDlBEvarXfwIg&}M;KZMHUtso_7ke8L1vSMcE2(l73Y{uDH`@q8{VJZGzBS*SX5^3* zKyu?n8Xc?&g+k+tfkIRA81Xa|hBOpX7rOa*QNZYWBYp03M(M!F%MC6P1zo}HM-;~d zXODYC$%+x+e#V50_T!3#IVt-c$bmwiPUH=LW^Vq?HfsCvs4VN10S6}bmo1l|g{mte zNlD$I*v5plHqwJbOLDQ~yoQWdtyDav5^YyU5t_%zAnTS2QR3EV^~Z&GUnJ``S~MVc z)=49RcEq#3fR~W``pEZ2ROLLKTJ7pGuj=T+6(CHaLfmA0L&bVL5st*nD5Bo+ z9@=xVg?)LKhu57ErQ8J*KeV(tn}BS8-U&C^@62mq9I>Q|K66i`Ufg+c;*IvF%l>RB ztcbkGjD@2LXVQ`v_*TnIbi>fjov6 z-e>c%p-RU!u&F+kL`xc5Hm+IUKEZ?Hn9UGnjQ@Q^J(Tqzu|t!SkecN>I`RZpT!T!9 zOfVf*ky8h^Ba6!ISv`Q50|V+^Z*t9=JkJ{CV`n5NyT!uPn(PB3MTB_PHZ$3(YD!N` zea2q--5+-r6rcuJhx!QxvOX<;|Bn*656(U_9Cq%$OlMAD(D|+hN}M_7I{t|Y2$EJx zF8_U&62kZ-r_!tJYK+IBoLK%{st)mDS93IOrtjdQY%5Ql%ygZM_w&uZ{_m!t)!yJ7 zmfisn5tXt(HCgSUh>=hM`_9tnhLwB_fI=a)Ax~4@1KFrUMlgQ zg2|a9le3)3*_fQ;^iM^9uG61)pD`-9#h{WX4tGkxxsq_KG+b#Xg=mnr(k^;44N)KM zrtNeER)xD6=C*&>mz|ry9`jU#s@+1Y5S-VpM?+5 z>HBCQqS+aHsV;y&n8UxC3@yq~V9Oy~ol|tC!P2NFnPeumZGW+C+s?$c`Ng(v+qP}n znb?@{&pzj3pYyL(mworXy{fvq>Uqj}gq`2?=P}E#E!<%c5zG0M3=Yh%Zdp&iyCP*w zb#!0*yc;EZFAI(g{Qy^k5Aktjl|_{{62Zv^D;%C}^Fg|Jy_5AYSsgLuSz}#Js2#J;H4AP`m;a+n-c2$p%ckCsdzMXES4HEEGsd{6X6Fe(W8#v zp({2skWH2s#PT1R!z5Gf&I#g!9)G7#931e5raebZDVS}J-gRDoTT<+$>w#b=hMpd& zC^;de+i!uU`9M93U5eB_Mfwh>V2X)4W^UThPA=wsaWD1dAChehw%NSh5$vh@9LUjYsly?n!B~PhwCDtrQ8~{QJTjugH!)h4|0lV|lyV z1Lh5uy)g>vW!ELVLbOFfY`D3h-(@OKMrH>T;66uZd;#UaXspwe-uH^iLxq!IUrsTB zkR^%ikSo_y^N>JGlAPTR8v6TKC^cX+2^#8gOu?Wu>A!1PJ;68ZMK-zxqwmYE3_c^o z#z|7MG^#Oe|7n3|&xa50yasl)BH*;vKKDWSgWyRm;iJN@KGW3gSZunlUtcd=NppPl ze=un)zsoONbvBTI8)p3cRT5rpq9_|R|MG{5stle1Ch5xpjN>1yb)tB*`HH|Nc@Fdi zBig*viz0XJa(ddPy!QE2Iz9?2s^bBtY~}iNIlkb)aAmpt=HI{^*S1X%i2AP!nsO-B z6xMQD*3wk+xEN}FGt#Uf6%8Ve4b(9??X5tZTh)yw>9#B^CwQo|d`~lJ!hwZ`KPsl~ zAd^!)lD+RJ#g+j&0RjEaX=Xrc6NO+-PRDY(KqCB^X~tqkH80~@pAKFxKcBrHR*n|c zR2wj~Y3?Ur!qZcr8b|(>4*ZMLZv=s*M=+YbEKa<1 z`DAdjBHHK4+0cKG>E>&aoCCGfg{Vq4n6Z@~s8r4#=I4R_Ofm24r?Ea2#HUMwuf|P2 zN+@Z0SDL^WFwQ0D4F&`rDQ$Y8F2z9%{B@}Wix2Plnb~HA_!D9fgx>;p8p?g93oyDc z^C|K??;eFd_ox{Ex3gQiLBPW_8$_mddaK_cviYlJ+A)h2xl`rL}B7BHFwX zdw$Twwt~D@{Q#o-_CWXTNZzzyy|eiDG|BrQUmjjq&gM>>{6Pcegg)&m?Qh}#je#pr z<7$cSrRiX74WP0pvKy7pcjS{9vQnJFYHDUh%Hj}6(b~nvmRGecY}*u#V1K(pwmXHG z%|YPRc!Zm!?mas!Ec2QC4Ej8qy~i7AKiBr4I{%t1@&)@DcHOnHpYNFvMHab3ng5dkIj3|ezw!4q;9jA>_B~WWO*Mn}QG7c~a)$X!>NhEn4!qztoCyTl6*CVI{ttGm67yEXm1ZI;&v zf04Ckw#6Jv?){$I{NXrO7dhZ$C_6T!M%bel^~Vl&@@<`_WM=$S``84bA#I7A?yENKiB-wAv{xn%i;(3uX zZ_E8Y#@Sf>VT~34&Pgy+-G2h3a*Zq^A$m0 z0DE0M{DiO_@XUDn=5~_BB5ar9-yxJ5^L#(?TkwV83UW`^D>MZD-cD~R*=Mu|;cDb3 zp%)nZotz8x5r^M~m zj+WDBYH5$mJ2G&B>O~m%=*Ap4axLrzH zBJ8R&zz`M5-+FSEn4QdZMPm+xxnSCQY2{Zl=PhQ@SFgU57FBW~$|y|I<$#ynkglv?O-nwtL4yd~aD@cx zxC|tuZy9Nf?6$HPwELw|&u5D#Ct4<#~^?B zrqQ<>h|p9avaO?I<1CJ}Un;LpYlhJ-7mX(nB2emqGm;qA*9;s{5zFg4Kn;#^6^8cK zA6Np(=}mi=4m>>{op@v4a28lrjRTsm`TU0V@D`$x*c4qzxHu(=3=^smC!$@3R(pN3 zNZp}LNRiAOV0ikpTew`xd!IWEZvZn*sKuo6S!BpCYQ*O!8_CHt7wXH-))hMpjF@x` z%-ae)L@8?Ygq^h`^1B8ZMTDvua=+Q&w)=Y8H>w*tDtz1COEGzr8BxOm`$0 zFhOnn?cY?*wW>bxP0!k8a(}a}c}#|naORtlatrS+G)?8zJ);8URyZ4W$rt|R?qvcxziSBRf1Zq|0IHxOg!}nXY|(HK4@1OZRX_>;baZ*?vns+ zVMV~TMw>?=ru?(dx{EJ7w|5-bUv&p<9ZXd_@-C@WGQhTB>%$+*GDLc2 z2tkU|Pn0i6r7ozNNu%U$W_+U}eTS-~x+H|pG~|B5s-EsWltiSSh|k^K0DVMKHtD?` zHvl)KylI2MVR8xnby11T)+|N3E|~+wvSj~7McWToU(xBIT8Fx!Y&8N7iY@y(isI{k zUHU@XU9#`q8tDAe9S)sW_5$Kk`ar=B2?B9ZVg3zfytSSpL4 z@^Fq;Ra9ph8`_Q&V{YvjY-I&HER?y@aI(3|a5OSA)O#@1#Dv1~R5~;YgFLGBK_U?v zG&8z38MzDv>k?yG3|Ub*n*yK*PR6%obzd2k?Enq6rXR4#&l7SLMDQ`_GSaE3tyb*G zLigO6AiJCC(1IGUVg(m(zw&-}?-=0`Se7}9u@D--|G-}VJE{U>n2v$5-s{xL{6^Mb z1`JRXgLtlzg4*Yw7{4=U8g03b<~Q42TWl^SWZg!=H(;-G1i8e#rU6_obn+)!(1)oe z=^;7&YfEiFkWwJT9bfI&n8neKn;@vz&UJNU-IGN)5B@Eeh&)jZlK9V0>U{Bs_Gq?0zXK+Ww=ixP#ZGR0627!6yyZBXdjF9ZP#_S{ao{GNaGbvhJm$6UZ!(dh~<+^Cbz;q zY;10LzsoIUHpaVC*(QtwQzw2EBczKsjc^Yemn3^8gW6Lt0ZOY#{izg+(xsmcPPG{S zup?Wop4|cTMN5$Blegv18WXfYJ%|(%ZP8=2%?EYTY|HUtu+3Kr$VZ`(VH7!6WVXh; zmf4I<*b@?dZ2;vl$vttuZ1PJMjL3CB2ewFUaGaUc*mIymBrV-ugWvTBhFGdiU;hf{ zY1bVxH{3ogJ#U`nltl~_^~w8?%^w*zHh`fG%9~t-7px|MJtP_L;c zz83(2!%r_LMB1eW%k~H8oU0JV?R)mR{u&gAV*y9x^rPuns_=RpI7s7?ZDv1*4015T+b=dR5 zqSm2IMAvDeNu~#cl*XE`vdcI6?yoR}<*cBtmLRY@Dpo8frlD~DoZA^n^12U!HYs`| zK>s3{?6S|eHS^_m0kx4yoQX@7TZ9gj&i6_So!o)UQa72yP?HLUNOAJd_f*B!nUgT^4vc>SrHINQCCdb}X)BC}xM{C)iqZ53wF{ zj(wg%*#iln5UvQ}i~&LHfUi{*cGQczrzI|;B~NYjzpFspnL{xeTJt~2*31BBKLMF0!k z{Ll~93j~t~()VL80hsmYH%P$yU+L8EQ*#ETQgRF5eib27U8)N88=ZC2hP4&HI@;8M zQtUsD55)n=~18eVBglX*_5;yThu}N<$3l&t;M{JJ{p|YPNXnmN;TM zl9OTh1AurGL+*}+LiwCobVHf8MAK}@CtA^CZRDUe$#1#= zJL84Ot1)_eY+7jV@c%VNynB79-%9@IzXeZ0fCrNXCiDAGV9|s=>I(P85=dzcLR+B5 zrl*5Zp@UaBCsY!~8=aaI3~gUOzm~xX z`*@20MWJ;KPb#=Qvvzb2j=Y$dbqCj2`h3Pr{xVkIXB>3O)~&H*18QZ`@!8zkMq?r) zX&iVlcxfb7tboe04LNQo>n zr%u5*9n?60^(9BubxqZ^-OAMXjAvoalxA6=#0{8-DJgR_mc*S+RIFiTY}EO2BbsSv zb7+gfXOcmRP_Q1$TZq#O(PB$PfLVkb!!#S;ki|9LTxJp_R}=x( zs#<7GAmq0fh2ey-&C`g%DbG9oMjJ5-6FP=ql9Jfxk_ejxK$2Ii&YdOe)0U&yYD}FU z%WNr^SUGMu|1_1Om8H;0!myW$ijtPIEK?xvFhX&VplwyOTTije<*d(8JNHkPGI?Me zxsqI?^{HGltZOnj9A=i%TF9t$a5)4HUoey(HKHu7E0Kr{PTSXJzZ%5-n@p@X;>H zoHe|nqqdPSE1eBDnvM108ubI%Vr65ZE%epV75vWv#7w=dZBOWg8r?jdD*KFL8UHniGKCm3PAIVPqWUEq} z9J4`J=PEFfvyx(oklu3NmF%78H9A$B4Yz#iu^?fOTey<1-&uZVPN zCmY5qEbRHDQC&yC%LR)3h86Yia8tT??PHeE0TrU_Jo6&KLp-%OA@+Utk+Jlh$J)ve zv!gv%H&SlFgcDiwp#&l?S1PA#;v}6y51>Y3Hse;5nVG4BnEfPB#!ac{CSZ_3Ug*VM z(4 zOPe4=90l+eX&eUnhlH;>v$-&!Zikc~Q_RAv1U;9vYJ#n4>mo?ILziBDQ4Z92a&J?K9DmOeL1T5|SP*D&2ZRAB1_=C=e z5eyUlZa`>>Jut-Biz?7!6FuKLMtN_69jD*)MgubknlO_1-7fJK?`ZFyo4da@=Jvuq zn`b&69B5Tp1j0GvvABo3PWj$WC9&7u0m|)7^0TQ1(L(aIvIfyU&=o-oj!jLW%Gd+pkKh2DcNgg;vYB> zAz29kPKRZ0%LHQ_n=LM5G;QkDm^3}XDJm_Mz?Up(Z<83^0|^hMVN1uNG5#6lt6?)X zU4#aH0PwJ%FiaQ`x26p{PLkxa6&;D^9wmsoEhFL{uP_cD%~(s08_lGx&JNt$HZ)zu zAs~K|OuFNCki0Pd5^=4I!$3cO7n(li+IzgfESBnJ2C-b%O_04$73+e&8~V30bUrjgTtO zV^Vcv96ny1Zp{ol?CtI73D4N;B8qjo3~AlaYC)P7v!kOZ(^95QA^03a#D>&Apoaj| z5ZT!ecSM4^08nkA_W8BM>;}CF4bDG{`qtxwR-~oQDq+Jk0k4%^mtGmOZ9v+moBoQY zHa7P(vy@xLqKLhwi;Kp%hRr6NA}KLfUfh=VGyxk~swJc&5=cb(krb5t2b3|Yz6z0- z$Vzm!S}mF5u@wFY)S-qK>C{$lU{-q*trpmp7-1o(@_{|zV9;4NY!F3^Z6vR3QGwV+ z-rxb#ovGRxI{hTMH7#qzTC`7ORcw#?i*^hN7izsOdA@8lNWA}Up*=R#m+=f9rPCjO z{3XsG|9~6`OTVTqPy*!>Tw(mK{oN`g1t}F#Uc!pm^ls{%;2qBb{F3aexy1&D zG=oxXP4+Wi9T*VUEZP;tyXpl%T^;XjjZ(Ow&)D=&L3zxPAGAREgkYmwjPQcD+}lw< zjlFdF^X(dg0|#@A-ZlF4Zp!_8_HCg)qk$ByP_}WiiZ+)Nt$RxK8e8OQA%-z<-iGJfA!TY;V{kTY z$uT8dT|z03fF z11Z9%iYDC>LJ*Zl$f-=?B%0>9$4q48H!q)ms5jI81ux`_ z0-(BUfMvN?P#4BJErfAj7oCkoLs%(BPGEA`8c0Cul$Wv1@E`*b4?}+q2Kw^=!bZ~r z^p3xkmYeGivvAaAWn;ps+07stqP3 z!3w^L>S0=QO`JL-5I)1)8oIg`cY0pZmq*eHn22R8$T7hr&Z6xJ+^j0U(1sCv<=qN|d+6~1?O|;Ij?3!SL9J(6 zl=j4^ZLQzTU2_ddU8W!`1811l`R+1jt0#lSfejgl4X=ZdjS@(d?n*=TCkYonV>Np9 z{e|^n8P(v$Wvc+nM-*xA%#(kNEc9nIC2-d%t+~(BTGT`YDpjbbEsWzi<*zMU>)+HP ziu54Ya9T^(+O+(DxhU^->2`MuvVWxAHxZE@@K0+H_|2Yw$Te1&gN+eibJTj@8E6WB z(7M4u!z&icQ@C%b_2yqPbDSW|sqi;61mvLMJ9BFaKSFoLQ2hIGW{0g=#s?S(DFu4& zNRYbuPPR=L>y}(rEgig93FyJjc~=q;(9BfM~B9PxX_wHEGJe42fo zayI_baxThpnATqG_5s~sbz3Oy2lO}sZ;L9I3tb{fQz|i zpDqxUbg%tD%W?Y4XQ-PqOhNSfR2le=fqVEYPq`&U>WN=;k72y`Q?~r!58<}d=Wp|q zU!6JX5V4zZb8H-O4zw`?H(kM0m@N|XJ&0fEpeSUoPe}UhTYI@O+~}v?@ExIvnbEfb zL>oxjmadVK(fS|?w%Ir?MLI*%eQF7WSaYN^kQJ$p==4z zWi2_-TIvd*pg5v~7NnD?M7R_#$hoWCy}TBrITY&%#lGXo$}N%1eNzZxPw)gY?s-D=cUKmVrR4%OdUgU^RkynB) zb~S=j9IHWsQ$4*@by>Z=Z_y}zy34cLMQ@8m{QaH zt;Y>(`i&0EQqr+qP)FclbIDkASw~8y%`nMBfhrSX03?DQHRw=@NV@0dp)Pf|j*+Iy zT#UEv8ScDbbKi_Z!$&lNg@t^8ycMWUvL{=LpjJH@Uro9lXEHg~e0^MR@cpPhi1UM_ ziPXnYTV?;1R&fESZy7wsO3|LtpYLU~Ih5aZ3km>cXl#z}H}hY)%Qc_tia~{z`>xsV zSdpa7ab;hZd4g)X`)Kj&!KWu?mAZF(ZJu9@)m~jSQ7V;!!?tu?2IGy`E2`0TR`*I? z&O~phFlu+V?KgIHUFv%3x!@i(6)BP5kE&&RXsOf>bk?_>vg#syQq?^_WmFRtz9&0i z1FeAVZw&Qo@n`%b=EQpki5t?EY#paWUD{D(@(Rq`xKz`gTTQxuJ$)h^5s#~VZ#f?l zD}TqVoPlB=rPC!X5L!pgdROBB{;!A)Y6EQ05)Z2|?z z73p1Zz?lo{P#^k(H*eh3nD|z2lTxmzSNeex??(Da+Z|-q5BDhWc>m z4Q_w-2$yLl2byc6cfgXrR+gZYqZd+?b0FT!za(F&Aa;18at24w39Q(_i$heAin4H< z8~FmR{z=T7c%rgvZGQ+b(AgZ9KEfeXbbo{Oprn&5I|WKEUje34LBb7KJWK^i<(xog z@g*-6KC!P8u#Zv9znxxpPTPE0h6rBdMsf;=vy^{v>UspdqOpocqv7IT(kfBkN^YUE zK!*zd;Wqx=i2qqbG645k5}h9#;;hOfy7PT;Kz&6CXoLf}atz$_X~%@cv6<3TM3>oDmViy08(I zVXNdETybfR<>MArRO)FVkLcPkLdMMs{BOsU`|W+&ybKwmIJtgVcvs0FZ5s@e8@&kYSvTh#chl5r0OmLNUqe!~6tDEpsX_o;C>%MSVD$2>|xA0&2)uMHUF|J`=zq+oDB z^#~w}8tNz6n`AO!V4yH4NPmHKHcil-bYARDxQw6?I=y^Rf>Arn#k7?xxu3GNR8f^? zm10wKk;M=dZ~6Q>Z4-qie%11GP61z)&&jk=y%m~2+GrNnbGGA^YxjLC^0wz!mF17C z{+$EyT`Sn-eFjWk+!H(6;E{vS-O5fNH{w7-{e2pH`K<;fFZqOA7~V54zF1YsR}j1A ztrJT(MY&#l3c1m>7fW_r5}lf119y*NR8{_4VyBl1Np{kn<=v|`%uK{S^qqr%3ElY3 zBYU@>?f69z7Tiw!nh0h$KwLNafa}G^>4bhU2ZMI#rVFDRe*oU#B`>(tJmVkmAu+hx zFQi_ykL4b_#Y)zwa&7=QEmK2Wy7gN|JK9V(<<&R(fJIAM?7AY!g4Y=r2~69{h@L~-Tyl(b0!AJ?m@w3(|Sz5 zBBM6&)cnNQ;8k#>6sA3#Dv2`5ZI~(Uv7dbg6M$sznW(Cow1MG_EYww&7TJ=n@i*t-htw$H|I>G9ETDA zz_y0X^s$L51l1h61MD!6MKLziLY-GF%p7fj*${Pet)A)lcPrfy#rjW47u{{<;pgM; zr*+^)m2Zj%g%J*wWfzt~wW+EQZUVrZ$LMJzq4<*1y*WWs1IhQpMbW&{h-d0Zf+<1s z?6Ov+Hg%}ODx>L0GkQu=kI`;Em3f*Z@(%;U;p&qx88M{kn&CJwG?&2H`lH-UNHm#z z2LHsJw4=hvm6jr}lO(}KaX@ec?)^@Yf4~6Et(M~Rk)wH{#lPOiaRancbou?Ix_$ff z`_mc8xHO)3+DfM2QH1|gT}C>q>d*5}^txW8S6ZHIAWsgNS3WIQOkcYots&net`d5F za_sgPsj_VN5kCzS_LtPsp6CLe(>xm2OwZXmKYmMgf z&j~Ivx?q1%XKN0Y|2VEL$=d!Rl(|N7(?YbLRHwn5r=&q-dwKs(ElFW9Yq!X&B+-NirW@`hKQtweAemza`eNi3bZr3 zr`u-N%McPC@X4^G9!R1X{w~CRk>fyTEZk6BP!Z}b@|VeLFzJ<*>M7Aq5!p^LfEWx| zR<;HaO$Fz+=Na5YD>>5YS{%TCg6smwQm6mR7b2L^AEp1Q;Ce~qakz$|+XI-#p)}Zo zRzK+I1gzs!)!4%1(BAXHDxe7h?%Tq~8q@!+4mkl^BOvRt>bAs);OOf^T3sU>6n+s6$VHx*yi(dqJy=^G6(g&Hr2nwdP3nYgY1BqSg7%g&bbs)Cnhohi6%E^~!@(su=Syycl974PT`5`TgSgms0{>Ca-4*ButT1{M{Cvf8l7*fznJ zVWP%wF$L9Yqh1UQK10~Xi-lcQzT09da8J*>GeU4Kpo5c%LS*$t%7fy+e#b5qelvX+ zcboo_x*)97XV5E#97P^y<(O-Iz86x7w-~&lSmimComxC@vthA_dnB*S=81bh6KUib z2o?{2LBjpPVrIN{vPu!$9nrgdtkagye9)Oovgu|6DJD7;;}x8YSqDpajJsT<(1Cn*7>3lg*K%O93qG&q_L;vu0ByebkTWRzU>EG zo`I_AR8-7-$m?vKOd2r;%f~joI+z@1b^%X-PrRPLKR-`m_&~G=T_JJ$<1wyA7<`Yw z@OJOn@%AIYzTX8Eyt4RFq`iQZ5Y#;32A~ovLC}^QmEn0L!7L0I25yN2yM_#j1*O9J zqWU5VDzjrUHYuzqnc42T`Ya(E1u1mq#)igqy482-s;-gsE;G!_Z90ZW634MaqRH>W zunTr%D1l1E5l}=*s&UkR(-@?A)oLp3I(k*dnHSg$Pb)h|t%STh6A*!>Q>B#bJ3dnD zahBj%4#kG-*sfJ2o7u+Sv`+JbL8T2lx4!fY8j4iesnpFms>Z?%tEIU~RI!32P-+>C zq;eIuh_$#anZGE^6}yMJ(jCj{*5N8^;RP;6&D^3-Pb<#4n7+6lV#cIvQ z#F$5!8a2{PTl7+Eale61@;tR;LEaYv5}HZu;3F<;a(%rS?(3zj4lGYkTrnl&!kK6| z#eCVuD)1Al>be zIH;gXh$J4})^=Qux*P(DeVe;6aX-z2#Ebgd%n3y-*~>Ed_6Xp+%r^^;Qs4|hBBNoy z(ORWYEoI7CR)+M%IcHB*vf}tXAdZ_QS_M?zTzR#@9X*#n@1Ocq>EgsBV$MF?jcN3h zQ;7ij6NhWK2Z|1YtA1adm2P4EjAbdA24sPyBeqy=!HI zL)HYla-}nE2NsZ{4oV^%v4bHFDdX{MGP7QK{vb!+HLlS!aIMG@D*7rmK|=L_5mShZ zR7+F77p=0r>fT%k|TqS!{HD&G*HY#BE5H9M1!RSGAxCDc%MrHI~ zyuYLETR{Oq13LQ7tC5!Fv#aWar#qgx}1@p4oOX zfzB&>xP~xgMI7sV;Mjs#aPxKhecGjW_e&c;h8(ypyZ4jwK&a46CN^hQ$?eJ1M`%P& zyqKwG_TSI^I6VZ&p4=dD{^Q(1JXc&VD?ZWKlt(^Hvm!@b-KXHqT7 z2jY~Xf$+XX#J^R(4^d#8J20{ss?a+}=VEO>6TRj4DE90+qk=$=0g!@y57}+ns3t^9vq=!@5!i?6V zI0xOlXODCr7!)OT{!D1?6w#<~=v6=YXJ^0BiCWww0fz-V^wB<<2NtI6Sm^sgBSK&< z{S|d&!kwk!Tx3iJ5pF*frG4RTuOhWwSoZVJ-a>e3gXN#od(nEBS8=YA0|U)T_UJk8 zpN6_OLUF2cXtM~Nc=tpXU2LW8Xxzi#e4=SR-*U3Pud_N`F9`bJ{^nm@VV}$EHaof3 z5*0)LI}M1X5`eB{q+Bq6=K)WYB~%|%KE|~v5)EQu0s)W!l8j!0(GU`U5);C7{>k4A zDAwd12~)inlZ;#$@D_Dd%ZgQIOU(uqRn7cb*4Pv_@;N1Pz$^Tvl9TPMtSo7l4APke zy{pX_$8FDP&l!&A>7K9qDLxSHAlv-afC?hr2qIs6(Hk%ylKl~dK%hN~WWWmc%`YFM zzKj=hl$9GML|c(L-5&sR8V?` z#VTC`te@?{direBu+TpPS#s+4zE|K{`pjTOKVw?*qTl{T1ftk04FV8bz!%GcEs9dW z9$@swC^)p5;Ba|}famLzZJpUFjt<+)PVV!w$12n%e?P)ykfgc_S4uF`y|wvE9ZSz~ zynjt5QsugiYJ|y<5aBCP$HL}HAoP@-fLzscms?j%A}_^cwwlt# zl7dMUrOigG?;7)A=((&OphNIQ#mcm+BiT~xV$x?i;GGQDVLvK zli8&(hq4pioSEFs7bpLbnyhwaHjGiYheAg+_*5B8j?lC5^KX3BM!bxs4_;J1!lKCA zo>9Wl{gI1u0YV_aI_qbiGtVpE&45{Q79{f zFq15+Aa{9l%oTjpM`aejw?u9+C<~`m$3kUGI3Ty^s{wE7Q%q9sXJo=@o})@$P^5CL zOc@tC0d|zKhL}M5(o9lB*zi=(n5T74TL$+MNdcCxkQfu3C)}BiUUK!17aWU>UHW2G z<;Q04$il}J90i(0RnDzcn^3fvV0|EGw*kt&X4%th38UC!`-(c*J7C(u>NeA_;LVuD zms>ox2=HW|t3QmVT`B5KHJ&Du+vU~!4L~11E zNy)zhOhi{wFIY@SjI*Q|m2H#Cj+1SUFpfxa(5ugXu5mzOYKj9T%C$#{1@TIM-!CL@tTs`1hB#5?LMC!*=_Jt~F}MGh*Hr&BDfNG2Xc?>Lk62?fw~fdBGw z^Fl}~w8Mna0ajJ7+(o0a4u%%PjZ3q#uefUg1e|k0?4^?pn*3iXT%}?~ekMj(QL_~M zJ0bhj2>Uxk^jppTyK3K(#<3qyN*lri{M3-V{us@>61@A8?7jg%uALX)vDc!$Pn`VE zHw<}TJx+CJFVb8ivEdbP!M?)`cXQ+6=z6w8_L;j@P5T;| zPOTRux)47X;fZTcHIA2U?}|fXz$CR~@07 z!a|*Iy!mY0yn)=cV(b^u`To!ym@^09-QAc2jRL;@MT6K{TtZzS(TLwe2+*c&lm*OE zDmx4ZocfH5a3;e5@tu7AbRro|my5EP9Wi2957pVm3(ckRHLqVp_UOb<%?OSgVGZ?3 zxYhqBEGvyH52BM$j)4qgb@u+pWLv2m{7lmA+mM*R&dj?(sV;0fr)T!pkXG)gty@Ys zPgyBD*y0>0>HCFzt`$EFGE6em2-liicPbzFyem+HEn}r{33ka*Iz`}Q0FGmvA?+Rb zO6v*kAzAQy?9a`8xhqPdcT(nf7tEHiA!`TwZ-*(|mBu{u98fK?#g=YYADG+S@3$|4 zh%P?p>YiJ_{Y+sB+F9}^*wnfn>V=HY%|hp95zEd)z7@4*P#h#H8>A;tNCz}%wg~*zSzt&WHs~P1K zx^F-UJELJUnWo}Y;2BqH0@704wuVutvrZSQSj@$BBK zUC?rrXuFiXA#Zg(4w^MN}kB=r^r9xpWp}r$@i}b*f=mT;grQ zso~B9R=6LpfP~uoA$&1-Pj)A*GCvYtx_=UIZH7>exxQUfewT=(pDMJE0bij1J<0w@ z85hbe?NpfZ&htG(n5C-aimZb2NtRMv_>DvSV_xA<7hh~93=&5)`v-JR5h|)mRla15 z88>ZmajX!vbLYmVXWtp1=VjkE2(I8|cUtjDnlfQ4S8NWUkLZ=^_{3p)ZL2rKd%x1t z^8xpVt2^9)slK8X5`LVXbigTbKuCc*G7auxfEW=+FUTbm7&}ye$c-lQ8!ts5AxlGl zGE7|emrgJTCRBwRJ)N&8irjADMOr-#l=0Y~iCO|O?zQMX3Y^6CI+5jSnsG!L(OQ%~ zB`8jvf>Qj2h;)5SRROsZ+RsSXwQPJrx8U2N<=P^@FiWf2T@;GM4`#>m8Ug zYojI5*tTukwr$(C-`KWo+vX&hm=oJhCZ6Qxt8=UFId!XcJ+*(pv-j#=tGm}Fg;(+l z4CK`T2p}b$5WAZPmjAduSiY{&gR47Tk=J9P#i$V-7OUAE?ymD1jeW^%`~fvy-|0z3 zS|l4=h87Ad))SJn&t9W9S_MqX|{2id<6P1=Ud zf_V&fbkWEftkF6e6PDcZC7S%97G%C3Z(48R0YJRBbT7T!TyLf)!)c-Xz`VEkKt0!Z z6`bGLMuRx1)n0Xt4!vQY0lnc69^LVP9^LT}AN|FsBbxVkPyb5go?u7w9{9Pk6Z8iZ zCq*aRM@8eWSDD1DcNkWd!WB$80lkRdWkt_9Ym5owsoaD2t2KUn@A822HYl$*Js#(7 z0UCO;VQ>V#tHhFGDLh%Gsby_aaqP|+?kO1l#7|D0J64J~@-owxxWQ2q=8QSX*4}fZ zo{JP$c0I1dCdGVSHb9NXi`4qS5?J*D$s^&W8C0=1o@6YbZ+T_axu=P*-kEu@<)}F6 zsxs{0KVz;LnNe0BQB!jpj{O8LTKhIH0G_AKSf_`djLW=^Eo|f6)DEgzR#cvuNn=cXxVmhptr03dV<@Y zwyCrgRrFTWY^>JA#j0FOL?txRKik=VvH585TVcm^t1kX7JxM-9+m7m(ooTe~0_67Z zm4B|KD89zFE-0)m)T%5v{eyHKS$XI7r76j5((5Doyfkr_&T_;5l8*KIhFB26U)!M2 z6U~~J_^PpkV5A6!lAbt5RFlfi=A7vDhNtE*bAfkFBeqO*CEF3agH3fM16`kDp29v8 z!__$CP{FOX>%@m1EV&`dJy7110)R`kOuRQr&$_H)3nmP5MuzrFQoVw51`~MYc&;A; z*QiSndhrf0f#83L=hOe0NKstBfU7lmS~aE;2oLUQn#PoS4G*=Bv=r)d0^~WZV&IDdiAb8b&$h3SuMuyCKwC<8{LHD9tOc~H5mPSp=*J8fBoAaW=iRb zsDiw)Cff6E^@jsv4I#cqTg8;Fy5z|*nwJs_I!<{3I|JSEgrO>LuYI4WBZWTPLQq^H zCp`SNKfx)t9OhQY?-dhH4)JA+Dqq8C$!Tt;)FxIwG(6%mICoyqqSxNz@{4k~v_AdXe@MIuJ!6 zOzOl8`CxwKf+%3JLKEnlhvhggtiox^6c3>~tRwKATmiNUFF1z7yft){O`FYFq?a!(JP zF)D4=bel@^M!O^cpHs}y2%6Kj=ubVw03U>RKxcAEw?G<^Yd&BAnYh&&-hVu~8s!T) zHyhuJFE*9pmhIc88ZR!{%kgewvc3>+F*}k}ZBxe*b4nB5)lkcU-I}y1H#HqxvOy5t zAdDX-U7~MAep@ILuUvXRKl2nKyp;O*)0n zVusQ?*>5q)NxFwx6Ycu4aIToUiz|nSo3FCPCYKXi?MjSruc)}kxBUs6*9HcjndB8| zh2gz+@)uqKLyz?m+A`xwMbePclv;=jU~>oGl*01v2LvnTq+>nVISdyr9M}YGu()?D zLbj_|UoB!(BXG#PYoAIcQ%l2+s>>fK59vSpG$yo*(Qigp zmz*=?@Cwr%c`dTx<^Itvf`62zt9mw@^hkuDOV5Ez#vU>2_4Z{s#*kZ3D=9R?pS~=> z4|C}V1*9W)4|?f@`VWXbfwsN8k8f$!2>`Ignq*^c#P#URyzK zs`@Mp`H=l4;heg76!}U@F3+{tI0jcZQX6gQI!5w@8@EN)we2xUjx*8cwciuY#>ALg zupoM=W^OysvYGW>+TeD`c*$A=}46yaSBDrF_5|ZBY%E6~wqp#6{md(^! z%N=EqnC{LUSD&V5x4@mtCa0aK0MD!L%gM`%s6;edhb&;h@(LO;2q##l6%~X_#L6%R zp)kiPS+LGb-k0Yh9ntoZ4Trqbh7-uxhkaEEhh-ui0ntm{M~Rwt5)Zc}t4~?zxyy%( z0nF2i=Ff9&88Ll+_k+VBI69oUOZ_@AssvqaQD4+n&hOJCAmdSCyFL{JW-#x*prc03 z&gx;e+*qHUtb4A}+*$&e<0GAD>7dOuMaL^uko3K$mFeV-<2ekHENZS1{lKWZ=PwRp*41 z94TFb7Egv}O8aWS!j*CNXHoDD?1JI>8*U+py^_!i@1Y6y!Wc20SD%oVFK18^7H$}c zgoO(X<^uJ>-%sNHk7%YX(g(i)D)$Qi>l36DoQG$DFOqS>*FV?9PqC@br-LvnK>&;E z;NPVLD3;=ZVCSXH{6SMhyl~Pp#(3?4=nNL<`2A|Q#a*Haqs)KcGfsG#7s{4k1r7Ux z62SfOpb#ZaAo5hdnRAg_(f%<@b?ubZ48$r>JJAhE7brk04B=8icMH21OX@}OPFudz z&N-kq^~_Lq5bFtoUwUGpWX`cVhKs(`&{pWlRI5O3yK+-a`!m7M%fEWJJ z;sl}#3sh>*9s`ZD_`qs}UnFp@FKYNw_NHjR!vb@aKI{=CGi%lZUa9Y|C#E+MJ;iK0 zBW0~9s#^;&u}czE&^z0iasly967XD~y>H;ZNdRt6>^}S)tq|AyVAp$YB5gpm%v?A) z`_-F9Y(9|Z(VcaxSkO9g`D+~a>&VZYI!lLD8w3rS{6HR|zJCqSyA?FJfbMAaG)drk zSaZiiXd0_wr_V%wD36HcWWAF*Vez)6x<@z8)l=^GqCEWnRMy3DJzscYIIeufV>Zw4gC*A9-un!_Ts)?Q69#!kS( zw8gpjNP-%*j9mD*!cEn44hrVwX%;FvR*PC*$zFuBElSQuqora+8d*3q(y|;aE;_4^ z+!KW#vROczETWePj!hc*n>3eulOomqW5p08% zVR?9xYTOmP;d{{M?bKaUX6lU9g~TN?f!L4RU@fpAV#Wi_Uq{Nj>3&*0qRUt-hjS5a0gH1r35Xe){w)3!OqUPvxMwn@ z{qv34ckQpc8)xKh$<}vP{90WnJ_CnlDovLd`H=gaU24od)Lg%WuP_{Ib5_MXJ*#ni zGAVA>rZ=s1W3-u>9h#l@R?EVLLzE(Y2vAVGl}~jZU3f$5aA?L5rc@ujvTC1>2hZD$ zU9s2^?q(_51n4AB2e&EBESRrpq~wSA=*sHKW`p6j)VXQIvTVy)PY2T=-DcKfQ-=ns z#z=|qjHAa3>W`no*ksUGNk9;5oO;A+QQ7~dgqIgbsV=XL&08LKb5NZb%b6EuFb&JL zZV;JnEuN?0k6aWDBUmscqf(5}6EJlaY=d!Esu1B{2H=({qP?evqwz>FhwT)Pz~Gl0 z!t}{gqT`&XSDdwqoWB0$(^onp$x+5Zbu$u`RQ+W_vv-Z}qgf=Is$>;BV}60|R=KsI`m-a2s$Wlf=Du&XN}Xa7){*B+NeMR}@Lq zmtf@;ZuQM~-qdQP-h9j*EFHA$I#2ZA4Uic=pmQ12tir8{7WS}9>25CIA~?mNS3U7H z=UMz5Xh-=$YqDPR9`5iDvJ<}mk^UOop!*|^xaiXZWVKh;X%mR9yA-(@!;em7e6S1?-`s^Hdbn`4P@5R4tq5mCix1q<%e)J z05-Inyh^}PK(cy?bgV=aE3DD9qZHGiVogU1k$wm3qbTYh0uFB#e6!=L>wfI~aUE&!kZ zI=y3Uv$@Ciw?SFHGV)edND&Bt=ZYHCvV5{8fqTS7JGVGnY#BvMLi6dvr71#UQzSuF zuz|kAy^M!-c~ui zHhk#RgoeNi!~GkC7aD=u$m%-@lmXH}o$oJ>#D~N`IQS9FAL*tt_2+W{K6b2Cc+a>hdJA#oE zP}s>768SwALbQr3H6nP6BI9XTU|2vV1}6Vda36BuV+_$N zKHT*Q?;GfwDuLCrW7ADus_E42d8dbUAnR>r>(A%EIYI#N;KZFjj>Nt(j24c`T_dD~ zQJw-#Yu#e>l1#KDnGG3-6cj)uAUB+{&~v6P__M?{Bvg8sM49qFHB^3>ct810%C3A* z8>U^Qu}&y~iL>imhojyydJg`ib4$Q?zqdT*FS}xctK_3zk?r(2PlJYcTVshpjnJC8 zG0aOe$fR8nQ(L)^$wIXYI09POq$Xc$aEvWhrt!x zrE+lLz_fj`oehJ)hBn>Wr#t@HUtKKSNT3Q;ZBIer@V8Jw1pZC9w9=>+3#Mnhm^Ui~ za*~@>)nJpt4aGA>$CRCglU)hF_Om^c<$|kTEku7>?#_sVuma%UKP3;Dhr;vUwbtZo z7#8qNk~)bYzm;|mHbvV`(5Q2ZnZQnV7;|+IsOjw*F6?qPy()_TO49B-*t)+N=%(`; zdZ&wARzrq&{o6FoW{JM6CD5xAsF|H9*YK&KYJ|#)cHo}rTh}y>JayVEL!n~Y{SiNR ze8DmElg`nIF_!_d(Jay&_rs8RHNa6JRn*seMN(;x z4AsKy4t7w#DuiL)sf5|yb-{?EtQm`kp+vEq|MZg4Zw5PIUZ4(TUuD8Rm?{RdzM1{d zx&B(v4isd=Q;^Oyr&MTAMV<8idna1D?>_$Y+>>dBJ8`gr?N;}0w&7j}{qwKA-Ef;c z2z9*nZgB~KvD6h7QdKs}72qZ*9OQW~D4aIbaKltTZiJ^u;p7SF>FkGaBw-Me{DErX zDQPJB=_&OYUBT>yXg8TxD_MSn{!G6&kZNfC5w$pvvePIuRD#bWakhN;r&(#OUN+z>%S;6F)bz#@__Mf!d}|s-o>6(o&em?K z>6SGB=+3V}QRjq+6nG`iNx5k&Mw8SG9-l5c>P`{vu~OLG1@%l=ECFmLyco%@zKv0P zx+4z)j9?^DS@P^p7ue}MF--C)6|Ma&Ao3kSO!&Q@o#}jVM%WKQ*4T{jxqQ}$#g@Ko3qY$T5Sh>ML5pO5YL-7Jw^ditb z^;_j(er91O*0`NPR9pC=J)6J?l&(sFC?^GjmJPe4tngT|Dz8Gp$9`={wU~eIa7!^Y z%tPicU^}B?m1~~HM>L8o&*2FoiV14)`3-Kanzo)nerBN8&bZwUt(}9f=&&@%Vf<)D z@*_5&zPiISPxNpRHf9*TsCCsb9tJr%KD@nEo*~Zu4cm9TcyZ1>$9E%+u0{ZdhJQ&` zdW=NijJhUUh!dh@;Ux=L0an)ELN@;Y82|5Iey{-R4l2V&8%!DSD`XTL8Ck3}Fc3b< zy>8huacV@$Ml1}fxXvSm&YAts*bD@r|G=i;5TNki7-6gFh+N+J)9IITUcRsApU^ug zv+|L~u9q9`-Is0GId0GIx0ksAAiqFEk+ZRDpqtRWp$TEUaZ0~q2cQ>`yF=A}zYc7F zzv4SiYk{dd$@Bq$s;HI(gIK`Jn;Pr^Fo8>tA5a()PvK(}GFc6}!(F7HoP*&JB5j}w zPz^Aj#hp&{SE4ajRZY6yyc@eI&Gc%s@rjx@x8Y*5IQJ|-#SFvrF2TCnB5sK&SBgvm z1IlRXS2dh($`P+FO{qF-S?OczVm=#-On@*myMQM~->N^L?w1q8TWuj4{R*G^b8PO~ zB5c`bv`#8LeZv&B580EtdIy}UYK!YVwJ2jc4BlFL;YD?p@6;d)9I(7$-daAg3+rwq zKO8>?yR1BROA2+km)GH{8NdDH6GhokdF*hs@?uL<(mMs5eCw1`DY7czn#kssX|)W8 z0}gnRStl}p9Bm=pTXvGKx4O1=!cKeo6q{t<$CB*Rq(hR5VWwP%O~xX8D}m!gB4`H3 zd1%x@)rd9PVJ`gQVO-+Z5Tynd#Kq6<%v;(qYIAXETko0Tl-@3K@o_3NIQ`jLT$@y4 z^ad??CfQWJ2l76(NLp<9IcWJJIrPah1}-Y9X^?n8Q3C>@=;?SUpu0K$sbV+Zn~p^x za>$#$f>vXaEK#>75?RukNRFO+rCK2V`1_D688KB|e3sTnp+7yK(1LDb_m93Ebz1cO ze5PsDV-E3zCn{NxmZAVQvy^xm0;i(91lp5QXVLgVwmRqgTXT8wIoujf{h5R;S0a14 z{go7eYoSxuRoMIB^}0lFFYdY9y0(%65q-qV>u451DUBor^+sR$p7PVP{oF4_Mj4&H z!LvsS2A1Z?d*OE_u`)T{pZjpG*%XmspnN7c4yP*Tr3#eydB%OL9n-T0&(f{KtkAi; zuFw}}m0`?Rm0``-Y{dcSJzePCeP8HPYNv8+;2P27v7Vn!QSl(S2VCCIeutcaqx-{{BIYmjG@X?odOvU3$5T8fZ`u%iSNi*BLb%NU26*-# zVygxy#e4VS^B)&7)vfLA1 zF1Y6}K1~1zok8IsV%UpsH31B_L}vo%*{9k8AEk;#201Q)isLguD^o_TQ(@)}<(c8u z0g!b=>>l90W~?H0;&{W~HnC)5mRt+J!;2esU*+8`wB)QKCM6TNEu`-h3Dy_yj=QKo z9denO*pTN@S{)TJw}D6KlG@Jkybzesi2B4M%+gcP14axbE=hL1Q}!G%d+-2c;G&`2 za>RTzUcC0X^1UU)DSsCdv*Sc_JlePLqtcr?V%tyGX}J(Hnr=D0atu2C0+5HKR(87e z;~jFxvG4nFEuG`hoHz*i^fAv_lRUX1ZrT31coW>haz=98-P7C?V6KNS>j6y^=1Z~0 z-~U?J!uW@OJurOgj~qpyI}!khKdY08RtB@G5Zqz@`*J{J-8t!Y)VzK$*s- z3a%s)KPfPZNf(TqU8JcWFfkg3$JOib7y@Swmf2V`G1poWTl#9Phk6Y-=2yz6C_yrf zWamLO-w82cn#|l4Nhnz`o}g9c`ME&F>2Ehi!1v=s0g%IRv=JKYHdn+L(v2k2s0fxS zGT&f^OB32~^Oj!Hhz;lJ9aFF*Kr4YLw!!Sol-o{fZ3ZgYi-c2U@wp8ze=5!mDhnx} z*^2xIW@69cq>v5^1-C)AS0r86)8Vo_X?ufpy14kUxrmVaBInC2zQ}f`5zaG-7%OMT zsm5o~e5Sc{}fa|(uXq=iB|oZ||Qvx6&aVT047Q@mst$yWXxr+l6jz_z^Le%krB zHkUHQ#BX+973n4kbi~f?{oliF)pEpTMd>1s4gr^5HTa7vg@FTg{w6xZ2#C2Uv?gN` z4tK5aI-$m zrmsf6UK)9U?V!bIBlc=#|`pfd4uQ6q6uWafs=J| zaa8F|Uj>C)Y!}sKz7f!E-d`+0WbXS zVFXgZ@*S!dlr}u~k-30~C`f@#W?20`I1DiwJC;|Kv1Yd8VSKo+%bZx0Lt|fah2-0A zJoRRyRR-}+z)uEbGP-G2Gd*^LxWJ?=*(1|R9GWI)m-_rty{Q)XACF2|FWB%Ztrp1^ z@xG;IeQSnY{wduPfa-Eaq#vibW@KT?6XzqGDg5kIt>bi3?`%Q0bX?`t`iF$Ul+&?W zV(P7!5vnDRx4!up6?Bcsdiq7@C0qhd0U!pou47HS8+M{wp?$vX*nG?CJG~$}SlKxb zG~8<2Qbawo`v#Jpd-oD_QF3sy*4K^hodm=CxQS>gNn>vgz%0CbrTjj{`mTJxh*iYB z!V-7b`kwnW)i?V}yza;by=QuiR@j7ye>NeWZJm!QFhmZ{5i~6zGzy_tbW!@EKHpam z(B*JO8h>^$XAYvW+OIBGL><1x*X3yL_h5RUFdP^hzLK8u4Yc-Cbo$ z-T=T@{};+$`6>!B{aCQ?(KCi3|EFaSmf_v?Gj#6L{P@p*{XJ_zIC(=hj|Q^O-8)PX z1V=ruQrOxHV#^6k92T6w^C#~LLC#|J&mXY)YBl?sx=Meo5`Qb*QuXE5bn$4C*TR6$ zoOk89E>`THXtd@plZVN?53bX#+pbgJ*}k{60l|K7BiyenF~M=&`S2*T*?qrcAI#1- z9RP@-B5{00*Biu~UrJej+Ne0+$V><7s{+XGahfHnS3UULp)a(bV3bEJ=OOr4|F0Oq zy`3_P&%^;inf(bb>Y$7it$1gHfUq3Rt~cmSK-~RjDsB_gpV$KOg@}Td&&wIF5J*Rk zL;A0;;IYsPM(?+4u$}$eo?Z{`AVYE|ae&BXriO>RWr6kSEJ52e%BltZw)zB|>>T$- zWsQd3h}r~ON2S8_RdOPXwe-4Di3m=&Lsz)30e<<7@B(?=tHTJ(7C%b%;x;9j*vqE3 z{%|lIHG=xMgqx)nF0*wxzwIg8W9SJM-!o;2!vc{PZVP5_U&pPN6nk6}Dtb$424F1R zq@|?Yc!B1+otS@s60W3b)S)9i#$)U^;gTeNpI)j{m4@%I$M0UBaL-r z;0{dp-fglcHiU4NL#;51@h4P?KZPUQ)!ZAI3P8^~>GBnp>lpV|+Rw2Z^?9moMk@Ht z^fe~gW<@i+Gyk5oCYRqjdD)j*DdW%Inr(I8lcII2J0)umAx_6OxLy zrib|?^CG!Mp6$R%)L|~ApDH2`)#PVrDn;EQ1AGYiGL~fhI(xXTUc|&o6JjrCsqim_ zCz`k&t}al^`0jnRXqR1AZ~)FLMgAkLQ%Oy<7?z8{#TLi%{H0tah06=5;A7_J8$3Fm zDe1);1W(#q8kO8L>A4o(o4$~M1dckkDXlJ}++3%~s}YVr8BFs~za<9S7VNAfhKGGO z@m8y@P|i|IY~O$<2vBu*F>&N&$r3ivDJu{o6B*#r&IAy0Vj~(w#{n94vU~j4w})#i zaD3E0{tx+$_Gfq5FvcXqVT(PmSrdyfoq^5+=ly|t;n)kZc10%Olw5}~t zCR_8@B!{waj$?YGvPLrFkgrO^$&Hz!lbsDFncf090Y&BO{rMtxN>_UI2WQ^q!%i_U zj+t`VFpZV zQ*wK)Xx(M|Q@@Vb%U4qnPBXvQoK&kvWRY-i-S7})Y)WpC&HKVwLFe0=Msl*=kdplZ zXW4N>C*Dk6@f0q#3NL5L%-148Z`~BOyx{7z)?LN*4`j~K1Dmsz+Qh>dwHh?%dh{F>Ep4Ne zQY}Xyw8=3CI)Jy>gQO%@pV>Usrax_c)X*`Dtl-infB72Ep_z-gQ@>&^jmwjFOj21_ zJ1uaIG*g`fsOuNt)H#)-^!2gMD@*c_8TD1TkNsa~%h~+(1O=xZ$P(#7V^`6O^A6AD z!edS0`))swhd`eIQlVd#MJg~~MNg&epeUMJHiYF14uIsuvz)6ggeuAI@L!N@(MFVQ z_Esnl%5=i8=_Z(QW{TNQ1VxOx8;80$M0HX|RUPqV$7a^x+B(#9?p}-iT<7r< zrt6oRbSZMN=A64isAbA(ehj3@eZf{s>N?ga&xar@I>w$k70Bz?d&P{ayrT%n3%r3L z{hpx9F@OW4zowCNKC!^_Wx^(Kd+^z@OPt%P;%+Fm=ct?5m$BQzekd_KrX9$)*Rl2% zMp0Px;Y99GSo%^%q&i9CCT>esDS@34cJ0Ne1to!vYCJ$WlfU`O0c8ExU!G4hf9GpL0|2nZ*OX6)NblF*kWUlLSCHSr@6BOS zPc}kijPr;QP-xH|3474FNMOa&zdD)}W36-Y6Og)iVI4gpGPf^s9^VpC{J6rF`uSHn zFim|`*&7Mq|3rafKZFs9KEGn4G)%^qW^OC;K#IhV{fM)LE&Q7D>u7Xr?C~jdv%KvV zd;w!E+4w17z?f% zLUi7hZ!PGK|JcM-Z_2D(RUS)zE?aIWeuPL@&da*ULvcc@EeY9?3G_5BB8<*cBNLL- z7HZWJ$J3z7zKn#wj6&2$TOf!&r-&Za-~r6*yCL;V237n5j|-^K?#i{}C-*7=>-*b! zs3{fh-5lgY3L-o!n8;wm-z8ccNT%TrLml+>?W8S-L}sHSC>~mFA_`5nC6vs41RBl} zWi-vt*_5kis5~~MqY@h~MGRRwZ{4pzq`3m|KnK2S`jJ$A8CN)1>s zKh3hnP^$Zzd;S%qiY29LZA|2keC*n6cfTViBawJjJH<3>s zGM99JD%z+5Oy`68QI7E1c$B|$sRi&&2JLmIhS-V$J5Yhj#S2WKHo@DY5-j(RQC#|> zYa64r z^&oW53+#ySJ5{;TWBh2Zdd@Yd=-VL^+=bCr1YcDR0vr#Xi4Tvd&~R&vov2IKmi)fp zC6{39P;T8`HkiPOo<(PaRK%F;Ge79}%^|?Poi91o_p#9{_kH1ax&Ma*#ST;yt`|$P zI1}p@hMV@k)$0F^hNOpcqDC`}9Kg5%ny{L<6X;(M(sYsVM#Ce^@k3Gap=7?eMDd{Y z`c5Ln5T-U}ks(VyUh6-}Gv)*H+IN^8>gz|M!|4NtA7Pv5OG z+|sxB^deBmt_ay#eXgfFj{P6&$A-6k-nfH6U;C0+KKvd;vtKaFycQc+3R#$NLF2V)(^*Za%*o9Mr>-C~ zrjPI7`qR7?GPta+vq)90c z`Am5JXH;2L{3aH1r&L3*PYTdp3A)fM>ueSlvG;yF7VFA+PEf6}+Rpp{_OeY1!5)zY zR!fxbor@c&xFT`u%-A_>>uu&kINo|o1xwU!Q>hHag>9E`*QsCSPn}7L>tHtsYC9QC zZzf~g&v8l^&9+YAGzs=OkQ}?YY`Mv?Ko=-P5w?p9($$vwoVA@0neDF>eL*`-vHMom z#q*=f~)-(EX?{olp*JQB+|gi$cD5HxURCh-!y%KYA2GM06I6wGSp zCDAZN+ljm&{F{eDLUG5ImhiqTvM)YDh3@527BX{WZBpaR$>I7%E0S=?5JA2jptTC! zv1C-npH1uoPmKW8d5#Z$p3*&V@Ld$EMtFW^8(r(kjj!uQi6(SFxzG&U*kXo710wL4LC#{K4CTAF}R!kSlT5*mYXMf4x-yQP=<-j}^bMs&d;CXK-eqdH#@ zGq|SuC(MAxJ?J`7f>XpB~#tYxE@)gvfvNOsQgqOp)zBtevoR&u8zC2p@ zwIrI=OJ+>Bv+h9AOLwf`9upm4p8OR)z^Z=>1!o7(k*COQkpw-?KLpNZS%wl$-{@d`M6=HN89ulw)~C#?YU@F!}gc=(QF zu0fq}P<+sDy;3uId*UE*pxSuFF8an)(|OS97s=auuc|1Vfy81Penfq-L9Y5?aO5@ zxgL(Qrqb@j=IVf|vz8}S#{J4a9QRQ?wx1Fma)dhu8CX}GZGME;?%a{&_aPaQ?*2pk zSeV%*xuk6wq!CY^6DLH(q$=JOEw?8ytzg5`cE$}5jnO@4^LLPn`!YG?krz`U!^N{5 z=2$8x9pLtWsAm5(aL9%ipVG&}SLZ57D*Z??FS4#F9^YC#!WunsTS7? zei%~?R|r^cd&k#~B;(@HMcdXXa`RWZJHuI*-HkGa!V83?-}8@d!`gtQxyWxMxI6~ zDXr>_uZ@0Mjd=E>5=%(j)~u%udLzYP(d94wJU}pp`K6duM>sdx5sq zD1p@vo@yUZzI$ius+PrF(OlTvaa_ROF{bUYEy7)qYJOO6t9nq+ggs?0qsNi?;UTZx zvfTfYi6MVvH2p#_z}*=#^;GFXy#rakblj^4!D-OcBNhuB`K2sSXK37X1tSpYX{`&` zGc5y~>O2bjrM?8uW++VgQ7-2LE>BltC=2YV2sxLy?i;US%O5}HcTwSmP?%=2BySO7 z=CSQ-MH;kCR(cy&?08RytR;)P7F=ZBst}>GvF;9h?QoOtbb3z$j}H>Eqi{>(0i!1& z*uVqs%5nzl`5xJc?q>zwqtVm@u>=XwI$-2C@c%B@SKk_`V#Z64?GNJ*+4)<>xV(sN zk+LoKxP!i>JLq4O?r&BhGG6L?{1-CHWB#vAl~y+OwWrE~r)n{R>Vbkv@;H?=e78?{ zvPID13CjH!$~FM{Fu8c5DDlQ1x6qQ%`st7?EjHr`xW`t<*R0eT8SSfD#_xbA=TFObOI&KC^Tq!r$oE-KNBBPF^0+tP2K#L3LiY?w zjRF3o)EJcxax)Ms-366PBxB`5x+u$-A-coi`1)LP2HW9{SWhIC^@h{!^^I{c*EtNz zMo+31J4W8n`TjMq)^bMlmt@{>#Sg46is-f!VAFF(ctj9fVI01fN8YH2n#Y++J0+FmlsFcLI4$veptgcKdn<%Ufj)g=E6;XpS#%9#PT54*Bnt9OyNmc2T zL|P@yWQxi$VPXW|5xx2wtn)tAZr8S}rLk0Hkgwyez)S9qlsh_8#`4^LnFq8%JM)1?D}Coz84N0 zJKCg}45Y*SwH;3`-c4b<(Lr~ltT=^0 zz!p8dqHaqXRK8_aWt=Acp*`rdT{d=RCa-oguPvq-z&l$IG@qH`9DNA!`42P$9*m+n zMs1nr*z786aVj{kpao-b>pXL+y!OeQ_V!mx2R0Q0FF0t3s;5S+$igfkud^T5HJu(q znXAVTyH|JY!EtYzZu!uSj<{`CbMwBwt#e<+^y)!z&{qJa;l>mlyrEvFaYZydQURJ9 z1$Uk@0EoA}fEZJ|jRooX2xe0nQ@vFV5$@?qtTrh9PjOne^cOl8sw3{%^*3P=((Q1S zUAYxEw$8Opp!FUM^c>Z#Xt7K_setRSrZp>$8nBi+#g7_HZl)8QD8?B|%gRPLf>}Ufm|`rfuJi83v>F zn7O^Fn`SBJlqB@&Uq6qrz=lkAr_q?eVXK=c{*`M z-yZlX`w{kZs*coFGg>0gh(w$;#bvmkIZpX znKS4;a#o6Aa&06oj2!`@abM);^!~i3hWfXC)(taLQ9|`p4}+rJTafZ)NOhNUFo z1b=Q26Nr@vEs0mSqVfyeJM*A-qXlJsEdsHyt;zl^AK}qw+R!USFrt&+ohjIXXb#kj zE0ZM(Kxlo?AMc3y89+%8MJW8L zqnK9WlbmDfw)A(8bQYwn;tDt_SDH^kH8`}xPK|r9=;$Ev-QIMx8@fx5WX`t2hv`On zEu_Ka_%Mn}AxUh2Vj(TT_N_Es(dG?#ics~BnO)H)Syugb1@yJJoYz;uzBD&3#y4lv zsV5Jn{z1Ivv5}W9LO4HwQE#R=27i3%lj5%wM+d(MD{7y+50k(XlD#N8tV4T2ar%;; zB9&~!Hfweq2cwwrm%(b3T2i!aRcU(ilQTch^tbEr1rvi4M^}MQsE5xobBfU*&uN6( z0VPM%3-GM#MKwL_>Wmc=#uH72qJ|1jQIS?8azNm7C|#ul1$7}{pic0uR7F%$8l6dW zf&t}-{Az5?38=;GPCeN@%kiYk2i|Z3z5Sp@YtUVMlnaz;QioUZl~^X>Fj&)^T3%s_ zR8oV1+t?;^xHW?Y9bdYRw90+7ExvS>x!C=;*ZET19>#OF)i)lb{8KX)%c^QYa0Tmt_s-l=LxpRG9> z!cdh&YOUmL?WL<2Ya7Wrx+=D~3mX=d^25$hCm0)QT<=>>cEsc2N35;tW9I2oCvGX- z6C**@D!Ing6a*%_;S6JuEZzwVAC1-2>KVq^4mpsTGS@5J@`6;*IC{6DM{orwpQLuJw>Zj{%DKTx zgzeL3X60y#vdvF#`saB2*=D(WYQ=G!(6JLEL6 zKexE^zpIS%q;LLo-1CN;+EYH@F}u1$2T5bd?a=%$oGYNGW^*jjQBBcy+yAc`dD!;H z#i716T}ITH2d(SH!2cbt@ZF-ey?_7#^?(BbaR31U`Pdt~x|zGMb7e3Fg2Md|96$ts z;RBNO6;XxJ!slAc3SgI21X`_Rfvsbje?=JC$kCNT7afS>qKv^-Tq0>{$&!>lmS`f(4&=I2@oNcP%1fn)Yky<#Btq_15Df2rzN03#O~3*B zCNw-pYfRl4NUhQ4UpTXNGgHv(8}84YMf*CF8#J0&3s!Q`mKBWbI_=NAIvjP~G5Ih~ zj^C?Ef0!@4ldi%Fl;2N`B#>nf{}!9KmkM?Mq~m96EQ|k%y0mO^8cgUC5q**>ViHGF zu|oQX$q}OMi}0 zN6ET_>g)X)iqcn!-cMRg1>F&9{gv>0!Y|lg0aSBgNz3w`Ca&`gs=FXPZMJhz6M+d~ zkNZtiE|8tcLRcI&ruA>0%$8h_o@=9>A&{XR)gYD+ zFkACB8L2d#jO4_+N}+tQne1iD;uF@ChSrPW2AH}7fWJuj?=%=_+q8&ssJLZa-p%|5 zo0VS!Nky30$G+tBVagp3LRc7EwLMrn+t7CD(C!kU!D7MWWPp5#WeWlpj9L8;_o$9Y02Dfk0mH(IQz3RU_6#H{B% z_Vs7i`>#8Ve%I5K=Pzs(br@ZMM%BOW`wFYChAw{kB>i~XS=B?&jCW)Z`k{IldCa%M zv-d@e9~b}~Ge9wB73)n2rt0q4YKyL~M=7dzNPoPcZsM@c_zl}}5(fN7H zNs^qDv~5~AXN)Y2)*#GrMp_r5x~0%jujbr;;DW zrnc!dJ*#(JiY%+S67gY3lP;^a`D->&j+(O>$LVREEmdXL(DVn;l(Bj)<8r-ktxYGn z4=bG9X-&nPIuWO3>@-_iu+^5bV|;A;{z67PL)e)=r@jM@HSabdL8dIZ``f4^(3f4l zDtO>zW@y$<0O()dqda=di5qMzRrNUyqmjZq%Xyl1~OC?wY^$6 z+R!x=wKN+v{fPyjKW3s-Cvxw3f#vTPvhxA2y_o4PSBTlF^2R?&XO}BaTaR8r$=cH> zx%u?2;*CMVZX7q|^%GZ&(^}?}9NmOz>#@atwep(Sk9=|B0V-0^*H~HgQLGPL5p5+n zst^P?EDqaU9#jl6rFrnoBkusWyW4!+b0Yy4(mEoo8R|PgW!$8uE^mU%jjUyqZY`KK ze)Zr-Wf|Qd)2lE=0mDC!{g!OzQILjSyRVCQNHRH zJ4*iS<9Qix^Vj!4NLBJ;xuW1Ij{79vJj==UJy(FTXh;TR-XWAeahS&UCYbWjYw(#oK;Q<6= z`Ye*V?iAeFj+W%>Ph^3rZauTIWvN-A1Q==yGXph#T_e-fpQj8#{(NX=bPB&yR*w7DkT8=@lDw&txUyEV3GM3pGD`EHTuG9hVNsQko07xFqM{@wlDc@! z6AJ3ebne=TP(*B#(aH9ZTb3>YUB_4lxAbjM&i>ub{SZZ7hlk0yEae?>d&QTBRhS*B z*2(gK`Z%gA%zhEs4>p9%7rdXv0ia=VDDDmbAk(8R+B{|qHbmZR7##ZDNcMw|j*_Zh z(UbnhsF%@Nw)RA}6XCt)p+XhJQkcFxB&x&I0Ffq3Mj)zxTADphd3_OBAw(tPo?Ia@ zrShnSs4VIbS5VkhUdfbFP^rm;Hb7`9BVB~65)%=G!KN~$(!vtSq?%K4p&C?xCEEg! zV5M}?b;TxssAX(`ZOyP^yspetjjBj3FEP67F11pflvyrK&9Vxqu2qpO?LbQ^?U1Ws zTDJN}pmuZZu2?C@mRTl@eP`e^IzZ&9{Kb|GeP0|-M%O-Wn}-Hml{5;7tc{!&h$u5x zKZro=^f;ZMW{;gJbCxR}en5+3B=`e>zs1`g#psxHgKIZ+CuSbaHowK-o(f*nXXA?8 z)M!O&;=$s2yWtpHJKNe-Ej3I*)3ho{%8ZX(THxfTJfnbPmRgsPoMnVZSXKyiDDUzY zM65rw;u@_wN4Kt)RBJsdXGy0i7CiS&lw=g<9F=6dhG|aT&}Q;}oZTo$l4`dZ$66jGduq{btf9YLl zVIp!-=3?iz;SBTmjCP%p{*DN-@`dbbk)s20bdO9m46bJPK{_D54%*Xd0L zo228`L4a~khOb~MX5)rK#;)r^fNv|E?ZYD%i!7OJxMjK4Zut4PPNi-Y_T8@b z#zS|eH)w!2eyHkX`--&KVgLD#QC8FP`=w&nTYQW4Cl-wBy>VqdNEKs`-Xla%1R>D} z_HNp%e3vFkNBZo3_I~$Tba&Nh>S6qpZl)OVgl2Bt7p=1MTKRX5@EZ((XxlcyIsC#= z)xgF_NxD5~7ER>chB)xpq7N!otuSc8{gRayxo+?hh!?A$f;IAln|HeIFqdJsW!u(V zaeLbvoYi^Y@_E6k(n1_&)w*D{ebcv~C07A+d|4RhwqH-(=S(lR=3t{Fw^ZY`3^7CO znq>-e>6$z0WB=|1b>|2mX_Go1Y02UP7n4O)ldaai za>knD-k z-yiP7@daEcHC==+s`X_8plzGa z4KfgRd&?iJ=z&Y*iHI*ASawO3zcZ*=i**Pt5fz=B!CA!F_1XL-6Qg??sp*j;QKPKwz|2oF!rd?1k! z>Am(nfMK^saDeISBh6zt*`p0BW)xXjUbVX(=HFNy}M82^k-)Xtdh!Uw_w3qkmtwaG@EyP6!Fk$QU>(dI!^$~Zw&n{K6 zx3CPYorcbVn#-_R=oydQ^@`T!5q$~RY^+yp+x4CZameF_xxN7lBOFe`hmtHhWcCAm zrUe{bGM)jHOx^K=HZgeBvyhivxa-M5!I(X{f_v2?vXh z|HdC^db&#mT$A2^<@^Ci4Jyq^{;j1@Y8JhjQ`SAs97mK`-btO|*X9NfP+UL3wfv-d zR@RsN=Z^d2tmDYtcD1cN6sSQKzQ64-(3(HHm&SvZGf-^VyCt1;=_P#m#&TJejQFk- z+)B>iho#LLN^M1kkx7G7G%` ztI`_jQRV_%YJ~6H8>T5H&IzR`r$c^G-y_Z|gx=6EK>Sy4&+0zqW`OZlYH;gz#V%lj zTHw^mT?YGt*QeJ#po4dR)m9O=upl5aer4aPBg=Hu)w}NWMWJnJAOAN8&k^^REFZw| zqbq5Dq^3k19|{NdQ+zkN)kECfd$lTUYyQucGTMj*e&BPVm~XniT1AwrA{%r47eA`Ff)uxp{IG@OAtS6eS+kd6QOlBG zcl-f+PqCfJRs*{^!87*ml4`(DVqBQEFAA(*G)sI1-5{2R)UJGUVFMvfeNxr?eq&}# z2rHna@Z?*)?0ry%v^H-?$dJe`X0zFbE8uvz6(He9_gu>n^|RPra(p4`b#~eOmmQ>S zIPTch2LM48?kc&bnWm-0bi~N3~=EL*iq8y)hXX4 zTT1)=%nekI%eMrFZw0ZqS01|INLn75@!-y5;Y*rQK&jUM%`>$5b8#QV`H zllmqo5dL62dKkbrI1M`qT)>A@eb((%(_B+MJQ z^^E_X;;&QbX%sm5YnJ|6^!1uiq>HKDYTB5 z89aY4m}h}C;s9@R!NKs78ln>WCWvzT&Dn6DbKwByM6d2Zc9bFnc=W>2F=dGn8+E@Xrzy zZ-s!sQ7|j;LQ3KVKO)oYrNRzNS1V!RP)-U3G_KN|C1A?QaPYP@DupF$n9R%+sWV`1 z@>@H%QpIT;m?terD2r*s-x3=BJ_1)R=&B$6|g|+=Zmr2e|WHJtavh zYRFMpY38ZoZmRkPd?r_FgrY_VA?$kK(2`MLLAdTzG`<}zcY(gFt~ut+%00+{O2O@mF$%k)GX}6(B3VH-nG=hRUjd)yT&|yXrYWvN$a2wKKMh}v;fw}n3Dxt!vdo;lv^3Pc;_{`1XvTYN#aXh>4@!Xn zW{pFuyRp4A9)mbin%(nlqG=lPJsuNM^b{DT6D<-$e2JoCW`CnaeVNZBqn!bm(Mg4( zHFUs%B7d^lKvlG7?0nbuH7|Qn2Tq{Xjhp4;o~-AS<$Ne-2Mr@@Gop(Jg)v!lnX#wL zLR*6EI@7L7Y#+J=K52{?sp})P#h*p6a-v`tOS2J@CGb_M2X&!(st*9vZ^qum${@&Sy8F~ zNWmQ5u{eu^R~4*H{rmx;oCL!pymA3hG#PO1Yi?qVIrUsNz3dteHBA$)+Ns$-!!*~w zuVHUEx~#QVV->t-_YDC0-lzM2Y_~W6KnVBud;`17sy^*|(2Q8~QSTUllB3l3r^>nY z1Mx7UUhcV4=(=2AqiNt}rb_pS$6Ad;wgY>YUCm=wX9z~Y7(&ty>hOa6h375!icAy` z8TK9ex)Je_ke7%6*8XyZICTP&;gc_L-+eIzPK^ew!qaWEK@?XeTz%Z{ED{@$r{(>gNw1_^d-!XK~9d z^kQZw{T^7-iZJYych*Cc-}$kAOMUfYkSAd#&j>BtsLwS3n$T?Jwd7?m)_c%nJbnsT zRb&|rAtGMSf(ipXlNfI^gssB%XO6dQ!(`52o0jlEl1gt1X})@^~Gx(pCrZdTa>Ql1Ofn5Q;v&tKhc>|U&&WKtW5A9 z5y@n?!voO?8sqxcvcKN`MS-*R)*VlUa4X7W)}h8;wiCI7_U?R0BcR))!s0+*4SQOg zlykwXg`@dJ9SMi(Jlx^6U3ZHM(GM`g-TwaPvCMPxxaE2(Q9Yi}_Pb_n z>X!G9%W5E?MnpX^lI3itxwOVo);RfK-(C9K6eT*Jv`Vr)bYN!WvfQ>SkZ8ns8}$ve zBeS-s&=O}DHm$(ScD%t1@j9U>aJYO#iDrnYde~{BY2#0Q?#7CfIrg7N5!Q3It9;sK z0^642jd?-slJ8@O-auI>DAcPhsvq0i1rYTO)N>eszLBN5oKi80>M2K)S0Zyk=wI!y+^)&+a;7_JXHp-&*#|zoWvh_{{O!4X8 zBNtWYPd;vAzyGK;F;^}`<1r-~Cqp$ttLj()=*smcKzN${#Y>Vy4mDUJ`=j$0p0v)9 z&!($sXAq=k3@5i*IF^)V-!B5UoGt}Za!f)5pBgZw*AR|vBD^tQcxnC$+xQPwUkR?b zC4#XIByx>XVHo3fjgfpqc#9Brh=Sc9tDYf0&fAwYghAd#AZ>|HOk%wjq^ST+gaq;d zu1fey!@53AF5^4!KTX#Y5=~DVD?m6Ts7YPJlSkpNe|AkA-*sYHbHJawcfW{s(=}nR|%vX#DvAiK1?aEGiXmK?S zaE66pz^o;Q5+`4fE`>_Ak4@*vTk_5V60{#$b%r88s5Q<9G-bRxxi&z^d z$A$oj^{wN|yrvEUl9QXrE4;5H+SR&YR0U}zf6ipMol`cMD6XGZ3+hX{ZywzMZ&(~I ztpAb}iSN8-78Araml0_kEk-L!smqh1-ra|pG=GIRNrYl_B1gLfrfO;gqP)tPb{8Gk zENz~*iySiDh+UVfBQ_WnZ&?Pvphc=HRP-JFW$m(osvvZRt^Gp`ilQ&d%RGOFqNY~QdZ8@kZ{yFC>jGEdo>=92>|0Fai)R!8{($KK>XmcYRd_Y4l^u|Ymy zfs9`X00(BVnl~}(cH1UsQS=lMt=zCJkbSQHm_#eBE-M&A#Q1YybJq%L4#8KwRp%5bl7|^O@WuMg^ne$uy*!F&>W4)WvOi z{F@Mm;(Aktxx=G0XgaTk-(4PoqG*y~|6twS#J5X(B*51YhWz&1P!!vcrq4ycd6(bJ z0W^Cmi3Il3(7C7FEVI`MN!!gow};qxq{z|3eK5!w2r;pgxx_ga*N$xYieXRE6yhj) z!{U^!K&2%Qd+Z!DHEPLlvfR^@#0oSBzzv+JvzApsHg$Q4#rl%de3%qvmDz}sn3wGe z#Xs=&j1f{@2vV1|$WurXJ;ikKVVc^E&1(Q5wu$xI#{+DQp%r%#5})uue?PQIPhSB&D^eZbUBbKpVwQs>4CntXk<< zV?yPXIkKmA7Ob)F2#Gg1RVk`yC7OUjj`rMhTF z^Od|6y+k!@vRx3o=vWjUED9NUnG<&QSk93SL1PmZ#5 zRXQ}d7B_JY(odX+M%r#8I3%JQKQp8aLBzB~!<Z0FH8tyzXwAg0wI>S+ zE;A!>3EzLvZB!^Re+oa-`gQWVCfcj@0Y&`t#T$x2rFP9&AzLUnC#jpGiv#DdgcW%q z5an{4Lpb+o2N5r}hL}+YxXk%ik!a6LG-l{%Q}kgbn(v3fua03g022h)w>^RYYanfi zE?@X1ZIJKS4DANn!%Fd~|B-EC3s=UrI!rG>YIX68LsMes~k_`DhR zUlyJ*O)zraqy2nS7F$KEY)Ce>R@okxaN*OaLU{@j(Et-;LXgCyX`c> z?_cZaQ~l^;J!_Q#nB`Wsov_6B&&K4>Exbj8zP4P|7)SPf?#>orucLMP)FmtjV>9=ir z;_SK8_PJ^&cE@x_5V+l`iDxooCh8Um~htMB;F-5C<_~|5KYnz`gsG z_>Z7c|0}5g>i_Um+Y3R70B&yJaAM#MUp%A9)k8;1T}WlwUq@GSfyqOOODJOCX0X!? zV&JuVUkimtDy>u5Dq`S>^7%?6s$QBArV-IFnX2s(!=x3WrD!J~oEegaC7fUt!yhH2 z8Jr&$SQwa~0$NYbNRJE8-${*1Nz!W=m>8Jp7y|wYU>4LM(BZ>u;o--!G> z3VGlwyQfaf`Ks$6uS=WabR#h6Pe_!S1Czh_=eBEnBXWA60thmW37>m1WJd%acCf=# zESacI3J&u}I|e_??A0@uml=3^J==zBoRrM0&W;1+~!7IR1P( z_o(N*z4utT<*}{oIrjiadnR5-hmBlooLToZ58)=wm z3^ex5`_Pls4=irYMbT}w9!~bjr}QJfoJq5v?HbI*sr1bXA=VJlp(UU|%FeM=BmFsl z0>e`E&vl01w=tc|zJ_5nCl9)*KF5SH9~?9AE5d`t9iXFZOqByDXBD@IaN#bj<=dp8 z;LTlY@*!Jms88@7%a%uPTT&SVSW_B=bxp74^Jl_5R5)BHnHC*-2D?7Z2UUjuBsM*S z3dzN%OhYxkw20`{k=UyyJ~MeXC3fjb)~1YaOFhVuu2UqvQjhB{w|qkUCs3pJAVIpH z)=&Z}321JqYC)al3wYl1r-0gtf)2rh!tsN+Cvh@gky$bj{ZG3QE|d2bypqSv{;d5u`&|{t21ncoN7d6tD~7UE_ae} zJ$P-DjVxwra0(cBH`U3n-W$B+70#qQ#J;>k2`c@$IFz432B|x5dPP=C6 zZ0lgV4*M2qSI8pgWb!i(+{3X<_*t3_OWBaCk|S_cbezL);}wMQ z5?JD|r`?c;ImCNG1i}C38#}~gkf8qi2|E7W^#32VEU69(_J0%0`nn-d0Wq<&QiB2r zVdk3~7T-bT>bKX!?G#YFzZIc{YJ`MuvrHE3wy#2`Ygzd+A@KXckk|`;zYxqAhOKAZ z9=^Um{{a0ut;g@P`{fN2t0tz=ahxjdCFE8z%^bA&qhX<9VjI#h$;5=AmMWA6JJ=uH z-$0nVGBtMg71r?+g!O4Z1qdk|x|=GDq?H?>IC#X)LEorw(eQ@Xk+jyeHNV@~{Uxcn z{~U6ZvbxK&I__#Vp{u1+jPy7$5hUfJCb9bk17{6Ns_yI)otC^t2Leu8PF1ySI2Q`%f2%!b z>-B5XZ_r@0m-fsT=M3-ZmYiSL%kk>3n;~z+t;ih)D@T3MDn}6^qQGCVp^gCd z8~7slZ$ut{2vQgkgb_wYoU}UyOcNfOP-G-LN@1`irYm737|I6OC}uhqSg00Z!>iGH z4NJoz2AciiwI?ZzgnZ`U>*~w{+Y@7OVb`x>u1YFS@x>ImWxN}urs<)Cxlowpan0=g zF`L-bwtigFB1|6BilEp5SaIi(Oa4Hi%c%{m=j+Uf~7*t z%%-@0{F+e9H?%eDW|HgPGIytbSBQ8*r^R z8%^5tEhhSMvre1NEM_Loaz;}Uu9ae1ltnrsiI^<3gmo~d&ZH)$ zOk{*Hm6)@k6^9p3E7w(|+?&GF^5PN`grmxm3r-|rZ%79}S+t9+c?~egLIjv$oq9d- zgliKF>5WrF=q$@c^G%+{6KY)%JVbj`TRs#bugjkTC&4m>gG z_e3%2_f0YD_Ea(J_FVy(_It9J_WQP&F>6$ZIhYn9(`j0B1D|+*#U$TM&oiI63s)8`QQQ3Mb$HLho)AJsV|CG$;N#!$%dT`GbUa_6@D9?ZISX{ig zPi!U^12X);u^s7fqqNL9t_*BRBq zY9vsJ<-iwI^B>r(?)R1gNTD9}3n~P|@GA4v1i2M+YA`W^tvrIu@9QHe`XIagm_Q` z!i%?xZ=Cq!r$hk?UdX$=CVE(?s&mX^^-Np}`VZVA^0Z-w@(~YO2K^y4xs2kFJ2QV3 zKGp>E7h4xrSxZVikSz4%x$)vpT31C1`@(V2FF zk4;DD0;%MHBTYxV)oqKD@OVX>Infi~1E)Q7!E{tAAZvjAEn`ptfBI-ApT89cO>^p~ zo^4Ew=MDyFpnWW$JljRpLac<8%TL@FF18A!7D6t65X2C4?_XhFQIZ(P&LKmkG3Rz< z8={lx;WyRQs3x0rC_&-!ac4fe`$6IA;v?_4xtzbw39*~ZJ`03J*1)^-_hEvTNRi0h zpszQ=q5h=r12}RS&a`oAOQZL~aa(SScy5ZVZixbt4W$U9lpa`04z-ix(J5nkN<=<_ zUI0o^vPKY(hUis8c7LF}*Tq;G#8{f(wx+!r;&S@@%=UhHBSWl1SeWL``vK!#LAW&L zA(;2(M}5Z<+ZE;xD>b%*yT_vgH6l&d%?Oq4>fII^amwb2b=GGkI+Od2;7RfGYfehX z|6BmRs3QF21Fx)eK|S9}$O#v?^kIyaMSQ0I)v+N`qRGQ`h2AyImAS|uZ=MROpxPq$^vl2aZ@yymsHN zw7g|0uSX?5@3F1o&@J_a))|-OFLnH^%=HbQgYt~0&F^$waMRB#C&NoNS=WMsSk&jO z_+@bX-#UXMgn$2q{?8rHR1K&K{2wtr739}1hX3#Mkfv7-ikwzc2Z{v{MBz=cd2F|> zlr<`9$^2+p4~H&PDgRA`7Q7aj!1E-SUTvJy#*OW6F8W3O6UIkj0nHcQ^HDU!ot2&n zRRYiLe4FzR%y4%1`}_U_(ud1|n(WXJO{7L$?@$pwX=b1GpoOR&**3wDW^vPNs&P$O z(5*nVKl;`3QjAvc8k`E~;oLQ#*h-VSfPk?*HL)=7GvJNXgACP*6VSHgK)HwJgDH3V zgZ|Egai@{#qt*O`ox!kmYk4!;@;223o@_pORXD zF(!gE&5ZY`pztbOLNwhHjpCSl8}sJ<(|_1h*osP-0uIEO?6L${Wo%$v%8?6w0f*(L)VFtW!+4l?FwyyTA7l6{f4gK_f?v`=&sHLdH43}U1jAO@ zW>yp(8N-DILrpHbG2*&aKR?6?{`yp8tie;8>cer;s%mO97Z-D`{B?%geD0WX*1&ia zZ58=|qHd_nC%+CLyXM@Wz5z<#{0`khpK#L1cMYh|r;GZSSW+&k<`gtWH20@rs%9~W zjEW8{xnjzMtvLzYWKhjN@)Nbgf1hRk5K^l%ZGHh|E-^JTS^P;;4yd`I*T_>~X4%fG ze_?Drb%R$}o8-a0s7X2mAGg4p-^@I>HO%1ia!Zn=QS`tiRBnFwALiCLg)dtU|7OiN zXj(uHC_!rDziFcU-^vAEkdn<*Q3SAFg#OvUK7apwRz3v=7EK$N;(78$-B70b&PACr zlDlet38Z0*1Nb{}%v&2&1~#fkhufW|*IZ8blbP1ryk6k+!9^S|N8TW8xX{M7h7wI@Ye zG*JPzlYV%c*!FK)N=606Vk0|wN;aa>#DL;w0IT7bgC?ldXDT4GVDFn;U1@hudL>0I z^(!?0lOnH|y8DINqT} z0;(i2=jzKIa#Ly*R9(wv9`?Qw&D_57bJYcDh9T=!&facYV;Jn#URb?;v*kmd`(3LB zV1R;tR^EvtmnX@GI!3sm)30D}d?BYjyV? zEXO`JUJAG1l6Ya%fsfD`ZTgR>bD4#^Hh3$ousk<7buQ^a*glC6M8Y6wM}r7$ml(Ve zS5T`9)YC|kSl#!3paC%78j%($1u*{vHr-JF4-Vk!g+Kz7sOl;!tE1?Wvy+gt2bLlX zlSKZp`YjQEK+d9yz{&w&*8-@1;FQ4nKS5ZUNm~3uhxkF7FeY z%h%}(F?OZa*{R(qoOz|^%A4;+&-~g|P44IGbafXf+JG(^V+NcNGZfxj_-urelZ$>3 z4AY58CwdR?n=gqFUxYC5cO;X{xPv5_PHGV~lT26yBWVy8YET>25Np6(*FHz7Z3b(A z#!qd7k;z4@>iAL31#eS!tJMreQfW;{<^GbbvO%Hgg2vB&p(63zJn|?rsS8Ts%6O$EJrBk-5+j3|DlIv6e#r;G4D<_G+SJG$X^v(E{Z#g|l2LzO ziltYDiHbSYcD%jw%>72AILpen)JUyd9miUy<;8zAB*tky2NI^Iq@GlBoQ|VcapNyO z71*EklY@oG_gsissOA)^QbXjiuG=-SaZ4LV-juBCNktyxc|-)9meuNEuVIJsSc8I@ zm~k;cjHcOlvvKkbYP2b-0m7B#YT!8wF6TAPI#ZUqkjS==G2_HnpyS`^DT|unLjIJb zLd&QTU&&$>rZnCIT-Z5kvvDSM6DM-S9UA-A?rDeh4&Tk@X{!j^mZlQs<3=rdOjV(D zle)DTw$!aq&J4ZEP146~(&YWqu`w=pgY>BD)|{hqC<+pnnWOaR zDM!sAv=8On>r88T5xgbt;G4#%B4$tGK1S>%M?`a9zq@mNpPT3(BNcQeiYDcq)Er$>Dx6jo%w{FZ55JDHKWDVj)(S)Kn2Y-$(FdV0Q zKF50@I=ww|c)ENE5q7~4p7MBzl!pxfPw9z3XRwxVeTGIf?9JAaUgs(v?V%A*At;bv zSc?rv$#-(^Xm4zMU+WsNxM2W40_Sq-m1Pw9N`ZCyWNps}H>IcbMKcAXz`L)=)@TZ0 zZj<`=XtQH2^@;5ROkI}Yld*s!)`%etm1JoAe&$Hs(WQ4p`0s-;XEo?^yR=)t>Qr*s zv$ZkZ?tuT~A9I5s8%945+)dDv5jB0@7^A<{fH@h}}Qdh_eMrQdF>bCWRpZcTL0JD{A1T-JM`X*;g=T1;!b zwsqZYoGGTY$gr#T55_GEHt*ozDCO1=*`ce)2=@J0%zr(j*{iiSt-6Ayu(#utLDLBv zBJZED3XkQRZ4Mxw$dKdWWyzaaeH^BCum8dYsKStSekYzc4ZW`A$pARw;w8v&N?klD z5!sK=ts7tRJ-*oRxMk-R&m(9fZ8xn;rX5?@&#^7gfza&&k5Nd8LD zJa@M6d-&6)-mJ^+JYWF zPEXBOauB19$I_10y6I>oKBW2ebkYli$kfnW4zZ#0>IiA{O%|IeU+ zwgVImp#5Jn~d?0hA$WdXL}YYaUK=C;yNzpL5qz zdA{e8Yw0rPoCfA&L2g$X-?OK7Kt8kY)sy^EL(A^Y=~4WUMg29$dTZ0G)^6)cE85S) zYaBn~Jmdm)d5D=%bB-DIInp%i0$~SDD77Gx7Eulz-6w=$v7i6t7M{rxTFuiO^C(3;6Plr)H+X6(R6E#mwkjG+cC#5E zy1HnC6#)54(*qRh~ez2$%Q+s?TTjc>sGyYetCI>>9 zrLP#XfH8n&TiJ41%{hVv+!OJIiyjT&l6AVoY3GQ6HSap8W@C5ud)rR(MNQ})4p}+0 z7M%qaJ`2rINei(U12??X+S`~qnu})n1p_jlQn(#fb`3 zVWh^l0wu&FW1llNKg220(>XfpPZE9thn;StNV529DXXb0E9P(!DuF@Rrga3M>nj%{ zjr-IIFv}_i`~I#xemH*g)!8VOzk%SJ#&ZL&-{ejdg55#R0LO+TJxB>9wZ? zT~z5si~@-%L#Po^Usvwf$qDCRC-;;RNf9qEJGWcv^M17|Bwpc5A{faTTa9lc0sw<( zH|m8hS8MQMXm{o-QOyo`@%MRccvOZMF`EMA2GaQ5FGlWmJ!88ei%8VIL0sc*h?}}I zG%h!*&#oo`A+~=FCkLE<_!F>mJKiejCzd46M$vcXd@)oQJ3p(!j~ZdG5I_GM&?)~D zUhVC_Q85!z4=u(`0VTmGfY|r4Kcm;TB@aPz)doEuhE2aH_{#$zD)jU%YKT@W97nt*mooL1XfKazy+fq*~bBg@V$l# zjqBb%~sy8pE9EOOSaD$2_<%3GJ0@{-13RYYCE66BK$4JlVwB) z%LsLJLS2%A3^Ii3cY&0y5Pw^+*bgfqN$tG+D?90S%p0Q8TnyTra9zMC!5R$l5iy3c zDrSsFv>1;Vu|cvATahsb+&c+w*iw}qWL)@!_X>oWJf6G(*}^A4Dh*vKa^v*=X`YfR<~C4Fp^ujsw$Qahf^UE( zYHCu3?8J-=iP}tTNj`lZUFB52_w(pgz!Y~@@F#8fZ60(1>y=6! z_Ia)N+lUAN+Z~h7p@iu}zj)!O%=Issl=%B<0T`H;rT|f6crjECjr#IEi=4N@ zkWk95i>wF6pE5d|tJr@^qKQJ*5oByE0p0)=P2WA1GRScni7`yF$zJrRhwc5RzNhw| znr}n*YO_-JDzMA-9{)d4hyXL%FM_m&K2Uyus;xS*IEr6rJdGw=OgNgtyio$l?@cX| z6%Fknr3Es9;RW!#_tJ6?3;vuoL-alc^^PlhnY&R#&5zJC zyPMr^dFGz(aDP7K@&5obMA0G(d+d^276!D_C{a`llOp5qHAXPiV!X|X;MZop{l>2X z*gsBmm>p1{eK_Lgl^+)d$Ty7{Qig1A>w=(yZH}3 z)q@!J zu3U>k1#>R34r5&RYC0yhnugj-c*DrR#gWgy^cmm*tjh)wRUPZwJuvGh#W7oh}-uuukoBzH3uyjZL*F~j73cn@o1E8h6xqZxR)&c z8zxt-CFnBO0s>KqmYB|*ZY{{|GE`WF#JE+!XO?`0wlh#4kQriH&49wysOA~xa_~B! zp)rh(W@j+nCky?L_1UM6)-%EmfEm7NX}YV4beJ4)f7=;=*J!#U_G@Gal>`B;gBukB z8QQlQEpHgeu9P1!Lo2VIJ)eJqB2pIXffePpzo?grrb57hS4HQuFZ$ytjwYWly(di(O!r; zotG)FRz`xWrwGa;EWao4&Yj5PZ&-ed8s80?+1i#&N) zV)M!+c>ZNPu_1VY=ru0IFJ^{40{8JJ!B<0N7jLk*0)UNXTwx0X;8_Y^N(pl*Crl4^ z4n(M|njP9ts!DMUU1P9~Ii%_LAU9(X6!*7*_vJ3*MV%TCKFm8ZpVP_wzzxGV`x$gT zU-Jvx0?CfO#y!H@A8U9DnaoI-+8v8ELAmJf=M66^h7Ru*WeA0o2oRV;h}P`T?bj`| zhB_0^6+71Sg6j(AA}VFMLz*$p{6%RUdL(Ztop4^#rtFbc-CQcl=@F`#lKbkSNB8wV zP)t>%m6_Kxn&E$4-_G{B?&A54wUwPE6EFxtMFmjAV1e@CRNp)jV{TV^Q+KuD-J_sD z!MlF^y*Q-VsedJf0?r!qX?DhKW7zxq+~wAQ%9S0+;fz&GZPh-hNLgUYZJzwz4b zPfo?|Ef~yAl!;9FF_13zR8fJ9{18L2oOOJ(2u8R{hS!G6bH)V54LqM1(IS)Y+Z!VM zGQ-#)bjH0-RlK%-NXC8MA6-*GosZ(1TZ?PwD_5K>TDeTZK!SuQNyM8c4!M>^$`Hva zW_FbO0SI~%fQ(<}fCFCm;90ID_nhI%#rrST-iYb6w34b3^~srwH_Har@}eYrY!VOd zc-jO^VbdM^EoL4b&(@2A=(I2{EW9iW#v4E`+Hg4jUSX*0Yxzzmw)q*wAT3ue1TRGx zKcbIjp}~9chR%YfEf6WS9Lmz&(*AR|@2e9z`D+>yfCI1weuaLP)+qIe(Gavqh8;OkvAek{C3x9Z0ruOJNH07z+^&yQDxHbhVMGaj1l;z5ZtWB=z)0=91+kUW;= zH~LSg@qZA>&26{M#uA?(V5%{3e*fnnC`BO_5oC}vVM%1)tQARJjns~9(t{}eesjM7 zdL9d+_&0;6Wqi{v=1v;gB~W}W=hLSh=UHCn&(GOc{9kAd*nzhc{d+oi> z9Al0#=8woG|3(0^g)zfV@bo7Ey@dB&NO)_IW6iv1BBSjESl2dTy-5a9TBq)sa@3wN z+q4K1cEz@qTnw9uN|$8pUJh&Klsv{n_7V1%2{6-4 zu?};Bw%XJwm%hg%a``#8XJ_d?(oktN(2Un%`I=>#ZaP-F_FlTz3RPfHl6jEhFleF| zX%tjc@U24(yly4NEJOQqSqYa8>G+}`G2rBGsTg-l>n93|N=T88!amni80B0x#$Prb zcIh|so;hXXXjFqXU=5**a9FqTLn(&Fv!bbf1b64!fjb>^uXXRY>x9_^B~_g!-5CPZZR~NEvrqJM3rrCI#M*?Ae zFu~8^FY1l>Po5<7d)F9=qQic9v(?W&aBmptX;U(ZY=o2C4Ex zQ;PSVsDTr@UAi8k;Yt(^LAafUPwi-OrTqYy-_I;jAKmO`F1CrYgE5dhr{3iGAM@GT z`Uuim_aI zB9-Eg;Eid4()(buq|*2!jE35y0?no9;hC{bWp~jShN8r5(f;cZ!y`}>dS|3&Xr=!j z`}9A_r{475y_?^B4_2^b6m-!4Mbkp)fg%7Vs>s{V2_bu@Gx0Xb%H}jA%u*&y7eLXA zp@eGuqHQq%$x|;NT$)_murSsPa&vd) z`eSYRcH6KuY)#9-VQ7fNs-adMWsxb`6w~wQd{Q;hKgoaB$K9T0S~cP!;pUdl9E4&0%oQIT^3H}cP^EnG z3@vB}JP0(_j`SjD2?@dXkJNuhk<(6IzirvZOk5J!=pXaSwI3sk{$+mtAkZcUMq@@9 z4!B5bB--Gzj<~l472uq_F5)cH;9$_l*d$CsR>i}cfmrN7o>1E9`E$~&5`Ll4R-R(b z({eGi+Q3$OHRxRS4eU~s$YLzBJs~{wY3#vInzv}y;M5;Bio*?#5F&^O6j2dZp)XN zGNRVFa9v)lw&B5=_xP^AIq*colUeY`Hzw)I8uG=XV`i!k0W7iHz6fTV1xs;LOaAU6GWH8KK+F`giu{JgKm%x640EINT9N|82w%n zK2X9_nw2#khm5m3lUnIFst(M37Rbr0Hz(@tFZoxHr!}swS4svOWuCOZ+ve*|#;!nz zticiW5l!DDs@JX%Iv1NXdUJFQ9-PhnGOA6ix32yG`@qdqJ!%E$cic?E;W&^yM7v8L zbs3Z_+c1&|M53DlJW5EU?z)-;ki!+=BbO=CxOiAb4h)+V{rF%r`~{faOkF|1cR^4upyo~>osplZfkI%WC{YdfofZp#Vd@VB=Gw2?3&{y zn@qloudsK{nrNKA7bsryR{YQYw+N@ib-J=F>d1)?U&^s0>E)25J+eC=+pUV5liq*B ztUk16?_n_fzaQj>-(V_ra?b)dLGpCZw>4O#@|Z&JH-#08Hd+N-`R3zai|^~PNF-D5 z;J@%=&{^*Y1U(f(no5+ef$ZPHa=)HId=eZOG4c#ZPdeGmDcQ^?FTA|EI>ETaB_yEF zl*bK4Q{)YsdY2K6L;Uzz3Put3W~OcO)t4^EgVmj?aq=+q>~X4&wBUQJVp%IBo2P)t zqj#9DaPY}1Cxbs(xif{^EVs~{^2T)*E0@?Aimg(bDEb?$gDde6v2I*d9EseL4ZGLv zadnp*CmAOJ>FI6et`${>t?P@h3og51VQdr#7DIF~?8i^dftZX8G3${-XA_Hbl2s>U zx$C${6?9)YY7P`SG?tM*z8!GWtP$D$G0C^5Nj zQMfSk*h6|Hjfc0`Jow<@C9)VLRBX~*5~)w~kJ}bK!lki2kJMA|3ClJC?H=sY>1yx) zBIWxZdSvi7|C}$9y=T7tyFS?zn4}TwMp?O-f~dP zqH*MFmyfnF1g9ATIcVuUJ32_GJ9p9!lC2N*B$bEl7=K<`kC6%!tJ7o7O&up_udQL$ zf&o@gNw8j++-ZVDdSq|dmWd=u1MUMPb`P%Y7_OAkT=7aGO=e=`dYrn`#m})-Fr}mAL?aokDf-DRdqz_LYK$ zCL7b0qco;p+4M;ij-QctaAVS8Jz7pL!0+>-7XwbN(5FO91)k!Huf2m+zMLV5f5Q+5 zmh27>g3{^D@SV0oW&W8v`sYGeHWH5DEQa7bd(I+ zkSvBFs8muCnBkkxhhxqsUr6W>yzOv^U=X9u0}nrQhhFTENoDXr?FvOh)k6(`faOeL zB)DP+-A8VD<~2sDSZqixKx#5hb=&78@s8}l=Mb9X0j}Pv#PQFlMqIFyxK`8zA^sve zkN8WuG}IS6AL=AhmLQ9hM4fUUf_CQ;f@DC>rJv6n=LF(+iQ_w^z64vGyx)IwyMngNo@RRUm0d z-}$vX`7)>bAB2EZyj9K!fW*S(`$?XdnJUW4#Vs07U zHVTl1&!Tykg>Vh;F(o~w4-nN`ov2610-L+W4p3ZtK@T{>D`tAQ5)HFc31PXV94GnRv%SWh0anT_hOM7@-xFptMZ-CFDG?tHuZlwg zC0g`selKrJAoW|^I?7bLN?>zqwFI<>XWvMo1VD@7!%6vLb_sml~z#g$Fg%3 zIu%dirOpEn-O%P*R^9Rd4JQdjN=_a84P2Y^D|Q1aiEww%{p?Qs|Y)hJ4)>M z)(8v5sIgjfi%#XFwNhocUg6=IY?cwb6G8;)cws-sc-QbM#Y9_Jtk8ziduJAQ#KaC6 zm1G;mmX7VL5eGur6yV zbMAnY&>NCz^X_ct$u-(!Mktc5%hc7>eXkLDJ0^81=NHyZ+P#@G^NwrhpFYLZ%r?aX z=YXhf%>buxPP=1Z5*;q5mb~L)5RTB%bZ}#V_M$M7-Jtd(kuZyezF6n?6QmhbQ7Jq zhqk8V>RJ(EOrBK@LRpVn&%cSX;A_R}S`h>{`mjRM(yF%Ks(2lQe9o7%I7XhQWR!Tu#kAV6(=+%Jp(V&0W{^h=*DTv?9anXSmwOH7(hvjglxxUf>wKKX;AE>gTR5f zs6LM?+UX9s5_M#_(j>j9gIU=Ohm9$jNDVG@7=v^;t?>031#SS<9woeGJ*JRV>`1uX zXOK`1t_GznRKc6TMy^?KhlY|1GOONRHcqoQ3do&DH*@%yj3f*5f}a`9MD3U<1F$RB zBhxDG(shm*h<-H!1UIRdzvX%kw3vWPCqFZ*r(a~mHjBWSGoDR&I;r0bC5(PF2BtGt zIQ*uIs4r43vDR5PPM?8^IO!`*;IOpo#mIkdDfHbTtu=#drR21PBdKChs&NjVf1%B+ zmKa|c;zg5BieI{gEI9lrVmq6BED_%{^B`w3i**8-*_`tJvukjF>PDmJXEq~nBJJJ% z6Lc<2)KojZx)ASA*W|wKUxq)N`ls*W@%GzHC-8<@hv{;ktXnp>4DT4!GpP-jygyZs zs?)safD`-GaDNnJxzZZsx+0s;yxK>$w(Zm28QRwNd7l;HyC+;zy*RgwZ#(@n&&~_) zT;;l=+fx;=d%a4~WjS1lVJi=T+a@6vj!L8e>@W!VPsXk26gq^af7$5)a%P6iT0rT7 zd@y{o)b}6y)pr4ug8f@;FK_Q)Z`(Fhh>PNJ(!>x{ymsCRrF)1RR|L?+AT08yqRl5z zhI?XcV5BZ#3-optv+?)nbyo5=#$33Th%#FDwbUZihUp;#gk}!il|(zh3ub9xSwjXf zTVYg&x$Y{CwAKWr;3((Wd&)?(6B0Q=5&T0Yo5>^8TJMMfJt4Y}u+1V(YYADG^tk{> zr^VDB|6cvYUKEpSRNe&cXLI8F7ptVhsQ3ywmI!vZ?9vzoBd%OhIGO9!aU=80ar9Qzr0@uMGQ)Oc_*P_;ziAZ-i|-l zD?_*Kt-xpINOy9_HR2Zt)O0s~$~SNWCHUaGTq(Xl+08`nt)9!?569DU%nP;c^$$4j z-Yq?K6N2hTl==>&%2lB~5=twZR#vMX0UkEbT)>3n7i%(@y)5r{U+X)>U{HQ!#OO+B z1hFdBTyY@>{c04GSknwT+7fH+hBL;a==9As=4L+|7~1%q?~b=DN9-SbQ8uR+Rn=@J z9-JIaxLhgp2I8&UO>j2XXgRD0a$v^BZm(Jo#dKS8Bt@eXp`-e-wtzG z#;WI7=vV49mM5lXpe6hS-JQ)NeG}#zj+%=K2}yABgpu$2$2+6M*{)2$T!|Kq5LOdv zZH5Y(yCB10Avc(xNn>rwwLqC1Q!yc{*F^9G@*}Q z+HGBrgCRAr3`dSslg{K3g67&La9sLLC0xNikU9<|Q;FRd+YtZ?Vn;?~G#SIC%vA3wW1(Fwz^@+=lu1RiWH=3T&IC26OJ`3kQ+Lh(rBnG$jc|dzN25Nm4rqb(rDA14dJ}u1;Sy{&QgNR#uog6=6 zh_uCqml&*P>Co$oWm>MVHx^sL&a1m~wKvRzs~bYIk$``w%X;-`xu@5>+snvzdhDl4 zbDd!(S%@xF66Nki6n<_+u}{U=A&e-yhypv1{v5T74izBkF+Z(&>Yqn~Wo^};*W(AB z8plm7{__;?HQMZ+h@`n(#1=vJ1!n`lInFoipDagvDQiUkS!O;srGmw!!?8(w&#jvc z_v$&hcJsWxr1tqFe{=Khr9=cq{}d^oF5ybG9#z2YW1 zd@Rl({7pdyX`VBT`Qi7>{Ub=UOiXn&j<-oxx2jXt5BroqU(%q4NGu)X%%CeN2J5qS>=7rZ zUx0T#PLhPg;ItntZ)iknp@PB<;Ce^ue0tGkXoc`%{WAO)lR82)iM7 z8#GvyuX9Z2#^#-92NCpLI4hG!t9!Y~%OD)BJS$p1I2ENRWb+*U(U9ITHs&!5hfFMR zUcwK4i(f+^&ci{V2(hftD9(kWl!v3mFj#_)O|k4oStIg~7b2zJ5_Q7QfNG9CP14l4 zjKK(S0IFYDJ+su~$?nrU<1$VK1o6S!h(ZZ;#)z5WJWf~YS47hdw+G<~ZouF1rYn-b+;eeNm_phFcbI%NsSm6JWuH1=Ekhbl3|q1mC1Tqq8nea!b=!O zuypQgmWaSvc+wzGdsx!@y7MP=XLht(;LACJGAoKX^We)oSs4#a!yTjnwX*_(eysAH z*GaU;OBi^ds_H()dSgdIrNbCF@u~}opt-8{v}Ll75S{0WY+Jj%Q0?sykJ`Wz^0PN4 z7tzcQ9cxq#AHeD|aNZ(FhU=wGDmnYHjd9xK(thjq)$hSeUi%i4Hm463=8AKuL8)z7 z{eFra0(-qvJGhJ^(Pc3KrYwt6e5T?UnZY)xLjWKg>s68oksfyV+e_h(>uKQ|*W<5X z_RY%v)bma}ae26dZTe6KtJqS2RIiHW!s`Ef;;S5A268l^dM)KRt)Glc-Y4u7oE4#f zkZqq8w!&7fociTWSSs^dwQ_FZO}|B)%H4HFl?ad!ke7WIBqn@;EBf>9r0Lb&C0&YC zWmE=jc^=~P4LX9`ZGT$#7MZv8w295I={giUGY{M1b)B_a7v<+@y>J}W3tX$tuOfSE zPu;i<;YV)neQp&;f>kmlxJ5}EHrT{-d*R0+7|n1?(kU|c=s-$KBDbS+XxJNA&f|7)P#V4KMhm5h3R9sw*olt*F=@U`vPH4g{l(OsF zs>h#7q$yfk=4(ipt77q+c0c_N=x|5aGU~Qpkg;i@bWa>BMJ%mA#i!mCi6*!WZw*18ztI zFMzg$CuRSw!UEQG4qA-)stjpe83f&`Us9UX7tV=wK~2oV8Va3WeMwJRVt z#0PY3JtQ8GGhl{y7(|FQ?Rw&Kd!tKDSa<68K3N7t!sRM2QaP*gAhAWpI0d;C?z)!} z_iKEa2|A^_C%$HH)A9}@?4=ILQe}{GVG5syvm)~*BFnr|vdbZwMr2LE^$8&y90t>s z>A6Conbs!PePi}WAdFuvuFM@0E?3HGg7sUB#BH5p{3;u>)g)@xonFj6hbWvM^|YA% zE*1lesh0V~R8zl1&50<%oInT)THOeUzd%O0Kkh~M=Nv|%PSAfK&3a^3y#?}V;X3X> zXHv>8oi^w!v+#QP*?f8W|47jfop}dSE0Ifc0G});7@*QFnOiZX{FuJ9@d1y`4g_1% zjd`@kMsCze<(Zp|8cTFUn2_EGFiO{cpVtL;MZ50sf4lR@ZG}9gYF_=~K)M<+{XB3< zOfQqsrlY>At|@*=laow*(OjKd&v0bW_xyLs>c+$kEMQCb-D2}?oM@Q)Ev`U31hhlS zY$hmOBwXmjVHPQ?svbtzFQa-=3eZh$bVRSEYV@RGiYbRtyUl@$@>NTHGl@c&lI{Z{ z;C(_@_U3g(Xz;36C=FT{$emMs*=e^k8XS7wMrJlt^{!orcp;i}l5Z1aD@g75e7d}v z3RPoEXkRdDa~SffLk~bGJcy%qWfradNZ5eOE^5ROkjx=$gMPrPo(j#Gwz;=!bJG=? zdO9!o9fZOxkeJe5;-DMUl`Jz<@-_yH>|tF^x;rnTTmcET*zDm&=85igdL-WX4BX7w zn)X6;;&q+&qL9SN-v_ZP)_kRy7;u6D{XkjuzkbCOITHw+`+&|2*{+H1#me@_y7c1| zkW~y=BfR#+#0ScC7apAukS~7RlX}ZB%?Q@M!gP*9cJ>Oq(qxMX9);c0&VCchI$}1r zP46j}=5(YgyAK}jIYLgJ))j!hYFEGgH;))!eX9!uZ#7n@IA=rNq&$-=$kO7`FE`&^(}eHnq8T9pPfP_} z`rB&GVfW6beNu6>Yx(*!<)LGllNW=D`+#AZkqh;--=St_HBZB_UBECXOTJ*)KOTF~ z@>JEC=2-?m2auF-YBS^968R8kHp+i|ygX-8sah+Gx=?-hT6XK}g zLiF4BC5I);+7T=HuA7?I>9GU0!fmTm$_vP(T`7|813IY}$SbAG*{q$+P>Q)%r14IF zbcnsqQ{S5ZWTO3cqX$N_gtFjMFlrKTR_Mc7v|#W%Z$RV$uz#L=tXIo}_-D zDo`IygtCj07W=jw-0Pt#7^#Ta*9?gdWOgPdU{s3P0(Bz}imBU4SzSpA5qyai*{YgR92( zKWmQwh|T6QAKCFJDRutqtQW=AN%H!Y*1_>!p{z@T2N z827E+Snc;py?}y>s<7^Dtcei`1HUTzTg9Y*m(C8_?OjleAbX=+8<#2X-WcQ=;RI{Ga^?kGR*d z;>)soh;yJ~Mt%xc1i8>BJazSKjc?fdp-U7ha8bS-XL;&IV0ursgYA!8$m!8wM_VTN z#0NR-T2}-)5Ktrb5t?+ChtxCLIyLuMU`deYN!|}=w-2_U1xV)t$I)L9|DDM4bxz+t z{Eh5VK_@E*gZ(dvKl=jlf_DdHC@NfcKZyF7g^Z(q7r1@oGY<0+M1+zX z0o!GAtv(8m=Gn2})P`Bj)7FR6kZ0=PIW+IdziF&R_pv_XiP+3(za^6 z3eWa3AuzIe%k9e^phkm^{XXEx->o@z#Y#Q)a53xCHCpp|ar}EvvTX$`cm40c)^)?q6OdWS45yDZgCTeY4wQQE%z3rdUg^-UY^KS%*d8qo9SyQ@B9rxN#!zZt zlUU7c8W@|Vh&OR{bsSP{B~s&R>(ig}X@G}V{b#Hdx9>q~1h}hECrV+n`pQpb3CJM- zY31QryvBY0SgD~cM#1foZg}EoZe+KbVMMdM5hbhqCWxL-bvnf^Up?HKi+fb*L&ZkB zin&v|V7Fy=>rYaKf!|UI`wQW2S6c$$6%^;s3tyh!W346jv+qwwb*_IqF6K2y;t1iR z@^xb{zZzh^23TzfsR!b8;l>78hT@@+UiT zkcNZBWZgN79iO<*P~KjDgHG_lt`?1A+V7=922|IbK;Qcq4fv}#d{^7M{q9iftS?Bf z%PQPBG)0z2(7NlV%sYM3QiP6c!X#Z@KyrbQR)`ppkaPt-U(a*?7gyDGFf;+n5|x4{ zOof|YgXNGUPa2mWDKI%qAn5DG9y%sY1xZ>$m6UZP2vPZu&`;`wA#{{L8d_mCUf*jA z^s;p*;BySL2Gq`b5HmlfR94(36`zAq4~4C1Ubj(P33%iBE7l_R&LB#`v^mVj-#|+u-4!3%3HGy(3VHqb-pxLAu zksaXweb-}wLvYSvCRbj4vpBx76xE^BFM%_+I&#Kco}k>T!0=Sn}F)}fZ>iE z2-34v{kYfI$2;6TOEeO^`ay0Nj@lIk#3rs|!X}yAk#c#fR+VLd%kr}2ktN@TLcM$N zAR8ddbdL{js_71Ya;fE?LLr~#o(ONEQ|#bC>#yEI4#v5bUulOcD+6~I?8$UC9YT7T z+Di|chW~cOJGhdq+<{^9>ni05X_8jzDr(jpYFT3iCAIllc2t7Z!w1@3BH@WDzbvh| z-sR7$ClwH!C&k#(7E_nnP1X>+5+kdVj%aC43+*c-@od&DibeEnsfcuh394)FwDpd* zAJ)kSAWtlkjPg60q%Lr2swTvD5?3itEEZZO6uS3ZXm|>a8-S`v`cwmEyqzPuh?j?i zy!um}D(l1zb`I0oEsEilxc2dfcmSX1!7J0W#X=~f8!4@;sJC67_&Gepvl#>uefpxI zl#0ln-^^XXBl}h7rqtZ1zSDo3479GW2`-oN`MW-mwQpBRee_F~un^3Qnv`hxKkgkf(YCHYK9duaj68$?JFy$k|CW_XhNcJV>(yqNe$fh{|! z=53_>BE#a(%!{sAa%Z54iG4B?eki;>{7Ih&7vebFI?$HatKAE7xXFNibGuT`zQ9t|S`k>D(dGeC2LN zGfLc`3cxNFooN~XriJyFGv+UgXiv#Fj#gUTmfF+0n#x!P8qe9KYI`fA)r=~rAg5(4 zqOzaeRM3 zCy>Fm(cl+R)lHrfOJOeReUiR5_*$rRkmV+Nys!%AqWFAKe9fJZSafBygtsTBSg(UV zGyK_auvzfW$xj04K!j8V&~fyWt=Mpuc;10TwMa{sq!r|_$V=@=1-6Ml_IGCb#OCRm z`N;;gCy!`>nL&H8$D6p-oIe4?xgnN22f)z1z?h5t9qlc~PC8T^v(=Q^=^%JLM)>-_ z0UqrVhJZc~duGhf;)|1tc#s%N`Dm{ixBALw6%_4 zP;os3gS`?KiQI=OLiFXw&S;_Sj!$y%^I;PittNMEY{XhnD>(%u`~=&UP)-{aWh5k8 zfL#(dLfB-F^*Lc~OC->mx00hs2LA9ved6M`--Q5%0(B7!rfVo~M~BruBPfU@+V zI>qYaud4i_v&7#UE@jTFYc)Qn-doOr&!hF)*O{soQ_{>lwy@-=Uy z!;Wq>iUYL1pQboHoH0KC5NRgVIy{|~B%NuIy>zK^16SMt;KQ_d<=>FBHciM)A!K+V z5zRk;D180^PLB}ndZHAzxk5@xm?$4O!=$ta+>mH8Z?C$h$6xKe0X}Qu1$&XWPU4-1 zM~D(vjaA-K<^_Uq34pnxEzG|(Ku`9eOwUDGZDNRAX8Z0#2cx-O_GZ1L!uwd))}1#v zA|XXV_)qsGU(l{s2}`|ZN3wSV+^mQ6%j1dii!;3fU9I1_^qxxw6}eudYsZY=6XK)q ziZkDF+`YBKr(_)b1&{X4k8!AgS&BR_KYgM`0P5FHw|A_M5I~wP;sHj&_=^n3TdwTI zXK||R9VV;yxcI5tpPBqVq^)8J*Rv%4g0u=8Hh7X2NQCn?aN-^rslt)v; z*PvK%^9OMxn1Y97J_^=B1=#ISD>OJmeP#V$<8`}6^G*3J8c=S~+%A&dWGzDCe_kF* z^ii~b-y;N)vH}BEHt36GXZD%E@JNTr=SRvN(?%Q&?d2#En`)TwPlP4%1afWSEIGnT zF#l56VOS*LvtxD)#Pr~5Yi$Lri=i?#zk(V?p58VR@AbyX%*b~M33=3;A6mL3y6a0K z`k_YQFRz!uE%qf^D^=rQBQ89X^#S{&Qh48>B#b5CFK3}p!72X` z6Zuy~K)Uvrd3fh4pS#EN?)hi8PS_>~XOPM~uB5hH&`(NeHVH@7bgkh@NWs7PnMd)K zD{(jd+!Ng=oV6B-?GYA=IT|GZ*uF9nxGIhfR#iKgT6yk%QL=>jzyIBV7 ztgfw+P6G>Q$PYZ%RVz~-<`fUxe%ghc-Xbq}`z2YJU`qu3_TnZg=?8Op%QG~!zoa*F zjx8)wYzW^QT`HBriek{`GIO(F;~;?Bwc&iBm`GG4@*XTk;&a@XIF&S`ZS8jjgBObH z7;wACL28Lz;AG8mFwtwyQ?QbzMbCXay&|1Ta$&PKB&;7@suMMR;5G~YRfrd4;9Bs$ra-H!4lO)cgi zB@-}&Vbpu-nO0{po+ zkD^9gWC#MFbSP-j^HQ=pyQeO0WC_9@3)>@Z z+I+>K+2Rx-E;$WlgCeV8vzE|Gp}{xfh0Nlp0dFM5J3oJA*>`#_Qw+$hZSum6mjOAx zg^R8PV>$L{0r?^0tl<*JW)P(*c_jxW+VFsUPKA8zMA>!=SEEkRW0caiaEH+mwu@o5 zkgIf2%r7p>#g9mekP$OWJ_T`#Lo$>4T#o#H|1=Ch#G)3dmK^Mu(YQ=Q+N~u6#taW_ z@dI&j*m{Fsk_y{`3S4D@HO3;SF;IL})bnN>Dz^Ct)||jV&qX`S7A^xZ~OZjL!vu`S1*|mwF-# z2GC$Ts=e&^Oy}ZNKZIM?Tm~qoirlAMvtGGIXWz>~$VVE2{fr@U4f)RinWqwcsQG6O zb>lv$laImR7vk$-TqLJ8oV1Ojk#shRm*SF~Oy1kWx&sQ@bG8GFKToN5;q61E`=+#& zg!y&Jr5(m6bo*L75_ftbpBtw};P+1wDalL-7ubK#y35(uEf}lcEk;cij$x>`0$ zI04csmEGeds&+Nd?=qBN?b2Zi11)$ae4lH%)mlw{XOwAtTTUqb$u-VMx)ifbowss% zb*-MgZsJ?$B3;NzPXMZ1EQ~zLOOq^g@KM;&%)>eny`WD}&uhrjjq4U-DCi{Wl%^G_ z=MB`sASAJ=t!aiiXbP?RAC2~|t2!S9+Ae`{_!02BmHuFR*fwEvAp*za3VdAa=c#0P}z0-M|hYzr*atW^ZT4-RIPJ-*L((R;e@-3zMR z3V$A~#uk{S)x|MujwLUwN_9yZ)m3y3lO0<_OIBr2lp8TfcNMRV`<2_nC8_+b+#9zN zNAI*xM*26kYk}>O>J_$y#m6micIwCS*mH8(64emD1w|F9wxe<-_X7sp9~4zyaIA!; zt>`Cp2->LZ<=y@+9#-PzKN!zD*Kyg4y7(Oy{G*@4izhdOR6)gyN8Ou`BOF%nt8@Tg zoNEZw3+&4vVe&>%aB-QvK`WRNsVqP@Aer-8@;cuE_XaZ7hL9~6D|L;pAG;^gAEISF zp4MB-{WQEw*C9F0uN1Ndd9C?BtColF#$W7d2K958 z$ftdX{eUhb5Y!Rz--MRqRna;ah`Z(@m=p-B8KPPISGvGcq8YwBE0wL;s4U z7(j}P6Q!Zci&3YG;!kwzES-Z}iDAwnV6>hn4cr-h)giUU21nAv&c8ji1&dqn;fUQ4 z0zdJGPMB1O4;4fXLF$sxSrsu&%u^%aO{k7#OMwA`P)^9|6bshcx~JUo>DYRj$29!% zmD~xlwum_&l-~;DJ?OxYiw{hDd;gNHo^79K)i3$70-#(^Lx2i5%Yb#+vFU5wtnC5$ zh61OvXH*K@mIiZo-noQ5` z2<%1q#9%quLN5J;rh1t|Kg7>al^&m{*)m6OoPh20TOmntdZxwvr=Q$U0mWZU-TF(* zHSX|j!6vk)XfTev6Oa`L^Ilk*JgHXs5h^kv^pOcaf8_hBtF3SptC^8s&P|o5dO%#f zT78Qg_5wNgrsl;4vxpn8X8-St(o3R67ieRZQShDzb3jB&Cq(_Imz{8i5g}cVp}HDl zwo)2MAhlxC5K~-?&7LpE+QL=%5OiOuR&+!>$7>R7id*wZ3UMYSa!}6X+vrs%pH!%~ zs@gb7hGx;7>BoU&arDC$Wa0K#8|nijV^-i}8T#r1O#{NuX-3XzpY*QyVVEoh6JSv_ z%woOdNinxIUtuHcLHX!byvEy2nb#e7?cA7S)bz#6Az;YTzD_hU00jxBh?iuGu%y0Z z^3iKdxlGPQ4wc!%9ykAtuW)MS@NzG{VBVyxn1fsTM>Xx{bG(-9s3T#%e;Mn;=AX1S zd6V&iXJ^6mym~AcUI*^?KZGl-{y?)k(6p(Dl3=Vk89kAQU(%Jo#Mj(uF1B%bhR03> z^n{6a67RY6rKv~+2OsVM-w5JwvJY^l5C5gYxb_PvlCE-88(ywYLMuw_r{t5jk`eU- za~knZ2|*>Opm`&jA$rPm>^I&YgK(2G55K3~lLTYwN}IdcLE$7>s$1qFxPj&T;eJQo z1~YMOZS7??BI}Zr7 zx*Qk8ue!56IC6@&gcy18UjTO*TKw;4z+!-bTe6DRE*@$2c}z9Y3Qoj{(2Zp0-kJ_q zLfG$Jvrt-KPZCOAEIrY$p5fP}{S&RykU`YAnBh0vR0mnmrJ zC;_(uB_YJBZcX||L)z0UWQXUAM$oJFu$DvVRivk3kG3)S3 zj@Pxofd&$%7mO5U610!T+bcD#M%Jay$TFMz2QjS;zsOMpW8haoqy&>^{zF>nq=re= z6vHULjydN7_btJT%f7C7>r2$Chk2~VzE`;8#Gj_U1kZmUxIUToycr4;AMvHiuGE9x zSy$iy*BSM9foUgSk7ql2H>6H1P8Xt0s25T6UC$k}r#WhqryH>FCXkW_DBf^Ca4Lm# zz;KpNp`94QFfcc(&#sb~Li+R*z4T4B;8HQRO;G&QXJ5~rTIETe^bgKYjM5`Z25x|d zYW|kxkFuF7oPjMo3^AGIuE(U^52BcA9K%{vMXJN&$G>xt7wXhJWdl%Cl=H+;(+lE< zUT1YYww9fh!!AvXOKRp*%|}PQh7mR|kERAXW3JdVe}TGnwgZRdMGev4)uEryh8ZM8 z#SmVhxG&7-=gO<09(1c5cgCe`xhS_^ffw8{zuGXQcfmI9L&V@ui+~c5wI7J&j!cGd zE?O(yIcC4EJck_#hcJI_7W+)$c8m17(~?U{@KSleO&U+y^li$Rc+bVn(Bm+FVyqOz zwsysE82~kW`=1&#vxCEwhGyruuwy-wa~;w8cDzNZhS(K8PEmiqzcXPd9!i&vp>3Z? zJKnI|UaN*44gFpuRP?@g64nJufwyANuE&;r@P33C72sN45S-?RI$W`7Z_4za;Oqhw z9xzT7?=~fjwL>R!o7G?RnGM2Z{_+-N-~SQ+LO}RGm2s=&k7Q6N2y(Fhn9x8$F#gX; zP80-batsUvd~zrh1U$m`cUpbjF>IILZIBhoxlj;Xz$t}3X86IY_(w$bmf*@gP`O={ zZ3twjY6lYP`r`K!4tY=4S(W}(GboY$_z!PE-dLx!sc^TzUR?hhg^Gwd*KZmU-?M>3 z!leu+lN|P4@3B1EIO2v!t7*_6gD^k{qs;u#W}y0to@qMMj*eQsj^EH$7xoFI#JLQP)s8xqNM6Ju8Abm=h8GRsky5XG`eob_0jEn2yKHT@G zV3+?u)P6`!9zg}20F5{80nris26K49rg;uhG!mq`wR6>4d6aQ;AEUGUUqiNeBXx23 z-9YpSCr}{b=D)y)|B;C&RH#Q7h3`}td=Ef!E*k{;f9C298UmN#K;;K$VO@XTcz;Kn z5d~e4RVcC+7gIMiCkqsLNiquz1T~S!Js1r!=znQf``=OjGidURBLvoeL?rtE9SkUN zf*b$6I(g7!2ipG(2A}+U;9IY;{P6#|Kn50WHl_^@rtT7Q(c%{JTJi-B29{zji~>1f z8csn90MxLW3?0L$tek?nO36ac{I3jsnFKQeh(a0St?Aw$r2khU20L*1 z%f8osnS2ck!3-RO?PW$5fAarAu5&T;*7;2WySqsgO1b@yoyKxj{$@*_ro~ajAoyP( zTnKLj+qgMt+b=#`D6GY&3@Uqm+&v!pM z#17J(WUvnIdGMCQ2D`dStfi(wwBw|?_Pu{^=QBvqqqD--esf;q9N8=!2A2F5trD-7 z!shEnBkD6QiPQ80w5zqKZCdp(3Ur-J|7}lcp;Cy+hJF8vKj6v2N&ou_fWkxI;r~DK z|BDMy-M{#QyegRs9)ez*r9TEY7+bjy+1Lu(NCZJtuGBCT2LR7f987{a&)gqJ8y3kU zokVN77(*NOJxagF$YRXCGaL)J6bQ=ymClWft*E2#g~WaX-t_7M zBK9(WBaq~mN=I$BLZR*PNuMztZp5u?rGZ+lR^}k$&h&S+jnv!-ly{r=Z+Z$;G!wZ(o5s2Ff3Wu6@mRfo{J3@Q+unQcC?aXSl~GZYqG42&LL@WFNFpPllyQud z3L&dfL>Ucb&tz4kLR2(ph~Mj+bBCkP_xt_lcRwB{r|WuNuj{q0*EP<$Uw6HQc$#*e zrs#im0qKHLvA-AU3R*dFb9KBNR{UDPp@nfER)moG+3Mz{;4JK*zd-O(QGZ= zu$^gb$_{EJD@OMJ9`gy&HETJik(y_i42wTM$3Y)mjCANVDulV-DlCm@%u5&0Mabv#-eC(%>r*!;S4EFAk20K& zXeyCY>QK@_g1slwtrj?lX`a_FyVdw}Wc`@W%8ipYtN0%(J9Vh6noj#r7;?=^^uM8! zZ-vrKmk%1{ZMr_b&%R&cU22`Mo1FTo<6Gi2OMfk%q*yt1PeuE$A9g}VvHfG)SI2R(nqxta0aC&{$AlxZGfzbf*t&(7haQV@|t*F2@NqBV&K$Nzos{Qt~F$>-%--k^;* zMzlE}v@!aWD)j$S1Sbz7xxLwby@XS|EGhs61}x`oS61O#!aSAP6)bq88^vF<`-UCSQvBxB{~!v^8@ zM~pOgM@zkk=YM=h=98wu9$T?DTO8L{-Ie+D&0u}8$eS(Bj|Vf9vP5`O+NF~M`MK%m zF`3u7@VO5#nGPdLwtyl?OonH95zhZR!$rJ^)Q;wZ8#A=!G`@?(WHknF_Rp~WuvBjQ z|kuB{;Mk%v9IC3 z3m?J}PzqBBKc&}dRAQ|?wf|+%slhinYSCRMsYm3DOZi{Fbg0zxz3R4Bx-ab9x`(f$ zHmIn+s-bJCN)pN$zP2^zaF6lcRsB^vjjk_xVRAQWJbUpTlMPMWu1&%Xk}>ouO5O&Q zM_8>>i`zc=>a6^{Q+GteRc#+nam}M6JCvm|hW9QtxK{YXX+>;)*ZU2hy$)2o`BTyT z{rz>iof%eXzAW3ynX>jVxOV7>e(pd&x&PO4g5mF=B*x?+(XB7vfLONJbSNL-?CR<2 zvG~vtSC^CvGgG6a5GZ_mYgyM-rt5r_Tv-CiR?ZThd5T+n!uIKmD&kmS(oQS0p*^oLg*J(6_hO7kyu2VIYYiK>sRyEqEnows%! zZ{Er{&gJ}^>$bVhj&TWrKI31Hs+>hp<&6hx{9Njs_I9y~JxM!js$k{TDwoh_k#mb} z?XLDqC&q^5_?|R3D%!jl%d|S~Rrx6J#sab?_+R}zi==@n-lKW~$kG7riZPl=ix6t_ zlbw(!kZX0ZqKt6~*mR?wc-^W!%x_oz&i*sGR8-hczkJVO z(bUz49{OE=w$A(>-9hp%p}@r%c~~A4udbn%m@-Y8FU9^QR!rOwZ?d4mL7G~&xU z^rk8zObn4f)l_b&{~1~5tr#W$=Zdl5U5myhP=^&-A&6-GKh}yuLWqLwTFw8l@J#4U zKD`}sB*Zb%(a934*_;|GPr!p6m1mRHxz`*_{}a}Ean~J|uvaCTyhy&$F%}-~tPghY zmaTJROz2WHohoCLKfLfxnDv>J`x=vgxxWIvx*7?N1Sls2*Z85=@6<)L++H&>3Xe8&>4RQUVUWjiTS} zp{3y1V|c*y04KFtIkf4Bpiyi2q*`B6x?Ai{Br3>gnO2+I4&T>H7xq#Wjzm{^dS~SR z4ENl4%EV!3>m|+4S8}6UIgR$eh;E%OJU*nt5Eh(1w)~3d?+>THZ4_?V(HFQvuqdCyT3NOAL>jU zTor${m6FvWu{b0<#q5TZQjYtNM0a~g5 zeYN;5uk~wGe~&lr=`2i<&_3v5>ZP$&Rp|HgN3F}*_kGkK(dH;$`r_W1sC|w%C0_*C zR9zil@s+w+cO>P-D6_dJqw>hYEf(CrI=>2hSMc;>90+S!V43$}{a z4c@&s#(wy}(yiuVHZ`|2yvA(P|Cq7MWaZ9fA;n6L3)z_&Ze;uyxPa;IxW+9me*wxf zKAEAVa${1zS1o$(K5D4bJy6#AHk##bRH3b{Ks1N#wh?33n%Bu({w^=Wd6)m0>V5Kd z^&}%pVPW?IwfxQtVegcbvJttX?y$;-hxs(eO|hIAuj20!#5gOYNdkrOGS988x~e4 z-HP8NEtZ{|*jW6+T<6{-ot0r%rEKTd&g1s?PG+aa-+6BQ#@g<)iVsWE=`!PQ$+yv; zrH^&ko;rQmc|j^Yz~LgR7d2h1BeOj9z}d8O+KMlkUu-T^-l<&mHYCY0H9jEYB=wN$ z;DIw1vg^t$Hb@zKIhGlDG)4F>(xyX2_Q!$n z^ti@t?xrG(S8mrp4#)H}7Axs*{_elH)UI#=Z|#z&XSeo8A>765)f$pGTAmn`N`DR+F7}kTr05%RQhDKRmJ2P=xyZQQ} zMV`{#M_%%+J&-b*Ykel@vOvH}>Mn&ggBv;(l+K8-GOmu}?THz@j(bkFTYL3(S*V0R z$$J;-*WHDLaFE5oL`C|!nsr&sOV2J* zSFFF0bl7T?bIa)i7locmW>ZRf9&b31rCU5cjgD?`l_@q~y!ZP$b)NUPOqU06>A1?O zShdo(kbs+?)LhrPU?|9nkw*ByU~Y-gNGS-(3l&Q(BsJk_UCl&i&xOc)m!k zMdyB>^`nK38N1Raha*3GshoWB+_&JX_jvxJ0P=h#GteLP5)#lxWsIyn z^=#sm|C$SCe1gj?b_!i)W8^sTV5wPZ@XxwSnQDx8=vxlfeV2DIeG_yx;8n`vd&z?? zU)ZN(s$E#xuZnM5yR%e+^6qTUrAKQEMpVT11nkKz_djF9bz@k_g-PpG!(UtNU4K(5S($4~zf$`S&!oZ^ zkJVrKYCHH@9Ld|!b606#?UUV=d+fjKYmBIfPj9*4C3wEUE7b(P{Um#<=7Ub3-FK-h zH`(iUF9PzWjrn;C$;IG2Hw=>4s*>D zCzKw&6#g%3iPsPBNrx>m0zqjLpVUGF*G$d%$vbR2CCMoxeFq%C31(Jln5b=z96^<& z5UGGoE|?RDjY<@5D#?sa8&)}V&4oig)28U<(l(1rv9izm3O1gNPHr1$dSVowwz-pe zUq##R`Y_&WL0_aTBx{nlMNmGKu5c8;w#{URd1_*bT;0LrEibJ|Nb?-~8Py%}Q30X*(|c;aAN?*P+Fn~4nGpD|f4Im-jbymXU#^Z=-T?QiyrXm)$ESQw}!KH6Hvb zqM`Y&GC=9J%vbgc#wtJR*GYAs47_ID#T+1{wBzUV%!Qd{+bQ|Vxkr&zWwk|RV#n5e z`FXK+WzWX5j7ME8O`T_xdtV6Fh+cIxbg;~1HgE8# zSW#se@v^*+;`^bxIQ9>3 zAvtm85u;LOnaA%$s@+GpFM9t7`J{6-J7XZeBVl#a!C!4zo6J)*%yV8w%MKNPl;1IF zrZkx=_Ul1s`&0WD-@cuH_2TJ&%L0b8hK6rm+xo3yq+%fJ4_&|l##a5eUwEk+6O!ld zCV0x_*SidE^>rBkwnCSazPusxTU23jH!h@?Z#ihre1d(+Ihn3Y*8&m-em%QiDKGBNY#I5D>B8_f+t*I)FAgqcR~GoT zCb`n%Fsn#`*BCYChUtO;)1^y;Ehr{QLL0fR=@Rtz{N(M@P2(c1OB(w`pJuS#6SvU|8+eN*FKgjwkBmE=aAd{isXd90LSOXm=_&TB z_Q-ivc2`nSuZm7>kymfZhE)Y)1&^1>v+;l3y{zEL6C=ekBl+E5Ck4-01iZSCK^<}# zW?5a-oYT^p;p+V0eJk~Lz0S5$M$yerS0bZj1N#_N?ENEKpYP*|>B+xcRw>iU2j5{8 z;}G8Vg9%;*suf!8c|g)*@A~++5+R;JD;OJP5K1s3t0NV@9OB0I~S zu?C6!#)pqZR&?`p?6h6xYNhtY@<{G}pA5(9ET5mdgH;Zt$V@Wq3RDO>85kgVheyCI zA?{-j=UNMKr|Z1>=YLuWmip|H?D?KLfZy4`z2JM;E$3#wE^ zZ{9kIePH!?e6bqzWA3PX=tcB#(k!jru(UwT7H=8+kfA)R8 z>;7wD|4K`S8v&OLW%fBJR2-x`5S>T4-?943tK(jITORwX`f%27U=_Tia3HZWOXYnC z-Ir;@jG9P~7(bUJspD8+`eD_VA` z&4t_k%FDYSN%@{PwPrq;`+T3+B1ADcH>u1{*)uqfg zza87UU~=fRhFJ3R51abawdHmQ{TST3Z^yBohOF*iYwlj&?;?}DJ9}?HYteD(i=3l_ zHFRTyblZGWlaj8_p@D*rYL|8# zxnH+qS~W|RCoiw*Pw`@XTOsD{0YWEK^^=8I)pK6Q9ZHlrV%hND_Wdl38N3}Mo6ego zyPlqA>hjLe;GX!IYaL9fHB}}Jj3V?0Z!A3IysV7*k!x3W=ymD`y^=qA69c2WRHh@8 z7&;Q)Nz&1Jf6cN0S&{eW z*Inr;cK)N7@@vjdJ;UUN{#t-6!yg1b{{koEO^Xl?F2;E~H#a3D3x{k~K{QblWyF;e zn-+6y-nv-8TE~SBdyFNI_BK!vRHcE+hW<`Lq|pKuWG%7Z`-?;S?!b8nbis=zEks;! zl5C5RRQx7y5pwBoC)eqw*&eaGwnD~c~#^jj=HXjFk;_#cF z8VHKFt7phxMzn(?9|iQ`Qp5%42}sdFD1Z;zoD1j5(uVK=(NPm&XT}s5q^|J@Jz<3` zK~FA2IMMr>NCXR3?sbhPe;;aUji?tvg&!Z@*VIO&2D>S$HAHR@MLt$YBVM%08o5mr z(R&~d@uDgZD>4L2uI>@9$woHeKkYfLy?83 zV<(jhZAw76QBDnHDVlx;k-&w1Yrd^_2Z-h{$3EZA&{S$4fn38GVUI*O>G4h^qL5Pj zraOvY5`|~a|KTMs&k|_#)H&odUcwoT_~18Zq7g5gqw8$mMvKw%I7A6mKaUvVmB-H` zf!Iy_1>^`0Qe5S5d?DHx3m~^wR1WmRB18&px_}7a@WBg+56(J$#2!=@SeGSO-xmk! zU+|jBjbiL={D1k&QSVlUU>^ep4Nbc;GkMafmm5b1x3@ z#k&aJH28WIbg>GhXQc?E&;S>nm`)~Q3*&8?riUPJzp<@HcRM;M>=>T-9%(7 zPI0D|aBaM@A`vmco4T0kH7%}K~IynX3u-ave`&*5nKTj1z% z60#rXNI4mC!*4DoBS&$vxssk2wgK6LbIGo|h#bUWxfhXG+-U52KOd{3(a~VE&+otp zTcW{eS5go$99Eu!c;bdQyEtqmW(Z}}_7bugFJfF@Er(u7hN9{B;H0CMkX3jamCJ}H z&cUl6A;$j*)_fV!C0vS=x0u#3^B{B#PA-jlq#~j?k#niYNxT6pb?a+xMs(T51=VT@=oQ`E8K{)bg z7P1^i$}C12p8}ErbFzc3X&7_G~`xs_fPM6 zD-yeq-J7z$^+0B1@Frffjs?w5_si_!&hSO&{<`Pqn>re7?#zE(@x&Wuc9nNgd)Ij1 zunB$5wlJ7OBPcF%fkELCh25R4lyMHRo%Q2#%IS1At-GdHXg{*x@^x~ta$;P*_QRI{ zLVgW)wrVUso8{G<*0c4KzT^aXBD3(lusFU11T96I@)79(8{4D%Z9F~gJbds+C{bH$ zSx>2RuQnf*l0V4xaoLL#2Fe!(53O6a*j@GXkI(gwb~tWwWbUl58#(Y^vwFlvQ%3#L z%`J{fQJLYt&4)6CT^O$H|CzmBkI7)EcIX8b+@6XTisL8TfFi)Uy3Uu_A&+BIhQy5O0&X`Q9s@2*Pt`Y^@nEM z7yZ_&A6}uDwyDr@pYZNq@4u-nZGPr>F78ieb>MK0=FJHf^78Vln7#8u5VL|FALU?B zHnjH!A{by=%lS~6dv$l(bkj&@gb>&9uoVZ`TbvbCV=G$P5~fN`9-I5da$6j=KW6{v zfl7A4Nf%1s&eSvm8=rNDSEai&eyZVUFYwpkSg`g+VEV*OmF4P*%5TKf;|%rcp6qe*|pa_)QY~eX3)!As`A`r)5$Y(!v*1bLB3FX!{D&%dN{NuKGJX4Fjke=f$R+mz2cVz?{$gs~QcRYaR|k;MUoDT@rJ14lYfQMXP8n)lZy zP;7R#url3Mj2e5Lu7B8HTp`%X-afJ3D?M1rE49^mi`Po{2_M0& z>3r)4IYvES@3f=ed@E3`!e@noVL@XE$N0U$_=n83>?gQgoh5R0WQru6(iPrWTi@Eq zo~^rUxzm1Ej?I&6?tInZd%^lJcWQie`m2dmDo3_%dvDKz^oiA`=dL&ny)aqUXXl;y zJk06Ef9#X$CwA)`V{+8utL;3*xlm7bf9-YiomF#xTozl|2-Xzz-vKdC)1zF&FwgYn zAk1j_XLu{af2$tnDR5t>H&S(%{D$HVsQIsN6+UxAL0`I9b4gXXkp3>`B;JP)8`QOy z3i^l$HtplFU`c6H5_dhVdcDp0`RjX6L^&6=ddPZ;S{&bdW;LVsHIW|a@x1Wg6*6O0 z7V*os)~oFsNL!MpZ!d0khd;Ke+>t)P@RHMU^^7gg8!j*T`qaO-N~<1mv3uiX z4|!gU>@K0&+~<^i=e|?zOTk|9&=jyWUGWU0qv9UB zI3PE=5#lU+RioI5gh7M#{c(=f-d`1E@6>8`+)=1y;(7hj#mXya!=|CjYJ0!1`RuTh z5PG&oI#cvN4+o2)s~IspKRfn%R#41tFLmItr7rw4vC~r5`Ju4dNuLvuMjGNCZv;NC z8akh6xZLt0;}dh8+<~PF8@&%d+vxHpMV#?k?LO~YTD%_}273?qEFR&Ws$el=b4f^g ztXxJnN!3-e&D*4V%Z^ih{8ZfD1M-zFIs1k@#ST|kUy15!j~Gx;Z8+q1bM1pmo6PNc z=Dk)kp)$c=2V%10GYZN*N@YP^N8vGIZnQBQ_LdRIs}p(gf%nIHsowhJ(`}0n6*z5* zXI(e>`KZ)Rs-$YVl+Ww8EFf=+;6^F#9UQ8wG;kzZ>#*{gk@wKA&o^$J>b?f`2Zq*=yocbzq%=2jAzn^6ZQ4`m0?IZ?1nTs2x9m zN<5TWS$U{ZBK)Xk&>19fT6ZwG&RH+vxCm3ERpA$>X!#CK1(lRf&6E-Tk{d@U$+<#} zuODj`3~oE`yT&}frf{BVpX)u&s|T5*8PKgMe;xPfD3w3p0mNOxadm_n9uz(pTV&iS z?ZU>B6_}p2WXg}_P+WW3B_n2Asij(-L$@?1!uEC3U0IctPI2iFaP&?uv&z}W5o^2R z=yGtFQz<9;TmEAl^s4~xh;=x3hWIwiL0CA;Xg1!I*y_GV4> zIoc1K6-!vrg^J@$8AU64$qsw!J*juXsrP{R4LNxrvd9gPGtP`Ix;1 zF-=V}2_K$*nbHiI^Rw)j)E;-k_LqUw3G{PpePRr39cNMtvk&*`bq{qk{l-(xrz(<< z9oVc~E7#Hzo4b~I+U3fQaNnDbB_HcXMqHlC+q=+nh|1VWJB2(P4QhFpv(x9}!n`G6 zFSFY&GDiiql{XrS(+_vnZD^`}wb%YJ+hUoq&~+O{{VjU6Pf9&r+aB!UawF?@sk7!$ z$GfpoYqiwO>>9$g-c50A6=Qieo$YCxBkg43VR}!^{r38pM%KIg3T|`!5gqEzcQ6jW zJ|6f!voPIxLVDMYiyT@xQ-&kseB@{~S#J}67R3C4E$9~pIJ$Vcx_WuyizWZ4N-S`N zHVXdYR2Z74s0gi9NnPCrLmz_j0m z1q>E0uw`0N_;i!o_`dwfGfOB#3)i1v54%%Bd9t`|th(!>eS{IcfL=GJhJ%1iv6BomcZr1vJ0De*%}t@;hU;oAndVZ zH$#B8M1}q;V>5QkXA+@?rK@|6UgKfC_}iQ3mf%7b(U)hW0yTasXeP5RT(H~9d*Zt4 z{dr3mF`bLgD?wZ(w4w-64bUT2qmOkoVJ3LTSarkvK+>+eaj^`6Pb|cy7pE(zRvloW zSJcwFUCRDjWg=oDgn2niQg=#c-7?Fd&t~V3G%p@!(UcOlth2mNcRN$wB0A)YVMI?|L!(ij zAqD7Y}(-YP?@0T!Bs!F%ky?{r7rfp zAS_OO&+#Gfd7YbQq+&>(5>IxB8a-zkwKKc>#K zs2sg`3peY&q%qeu5dJ&4f4m&lZJ21at&Va@Z|We|vHJH|`j%-deNHWL8U8b+xqA!FT#! zD<0mG*FR#hzGl@0JrTifXRnDC=B4j#HG1eW)Kc^N(H&9M+qM^_4;J)a z9WS5GV!L{*W}513!o5~RGqTnaU7Xs+> z6cH!LBvd1+oH)T}FAxz1ym2_iE$|*RE}Gj|unTD>8h_|U`iQ%Rm&jd$Ojs}CN8BO( zNF{Ms{SGN7?ji<}qr@H4Fmjf-i~ETDp~sI1UXR(n=>j#pMBO5=Q%_(O75xoIJDs1A zx40rIMu~&EqCca^bG&O5j*GSMI=-*SI-GyYuRxHv`;O2PomfpE{KTE-&%cU`|BWmp z${zjsdpA0b2oh~s=qchv4@wM_9=r!CBc%_gJIqLFV8rk4Qz=3O^Y67=MjC}-W(3s|qD13jH3(6* zvEi-cw+^N)2%89#A^^_!{ zZNzhm0bwusK=I~7;M;bnbOB{S5%PlKPgI0-8Ghn}3QoKNmE>e*DJt)vND!o6cTy<$ z9SVbT5$YyOrJ|zU6nvZ(DR)z@%Hi@gOi?`La5Wz42w|&`gX17M6kaTcSGuPtJZKje zGk4KxS!xY|;ZBX2JPa6LIW+JBf#EI+GoS{@1z-z7xn?Q9cCds!aK#FLoewy>+Ael< zv3GTjUIRZr%C0+M^oPsLen&AQ)BXcCB?9puLN%AH8NN__YrDMe-Mp(lu@TFy?BA1G{v4|Y=c$(#irv38vRc&5Rsb>~{bxkULf3&jM`Eg$7$K*fz z4OsYg->&SA%nwMA_!|DsBwny1Dc@n)wH_Vqg#Ppj7T=l@N0y$iY)DV4$A9}<_!>h# zy8pRAAM^Arvs!W9i4WP2Vb4R)z|Y7}N5_odZzQ8kPE<`sI{!bYmJ?Nn5q`f3^>?B! zXM~@xLGL zWMGQvV-t_jVG=;k`cc{O##fg3Y%xTq4^ssgz7W;waB8mOOl8N3B?>jKWrW8mS_pi< z^0HWe;1x}F(FbF%QF;b&-Q-QRkG=K+}s7j}sL z_mdWQl?6kiS}s&MoD0RgR>={l_5!aUixk8P$VD+ttQ0igg+`afEEMve}9R> z-?YF|HbAeQ<=}A3=G8qQ*=r6uy2T`9J3Ao7P-|DJ49>w}HW?*lpw|wUDhWBo`xnWA zK60fB;Rbr?N)==9;E$mfl}9DrXnbvFHrjI^-f6iGj=h3JqmV$lxY2rhx!<*QBQs1! z;1}4BBmVuQ1wIi0ni{C;JsQp9RWAmz1?lLX@R?C0jYwna;J*o5d44dF=MM%;52dO)slgEKdqRXTP0ADdRj;B0@or^p}9UZ*B~{&iy>uW zJXiCgna618i4AX5zJp?mx#;LLN$89HF~LG#&8z04}on;*D`+@e!&Rjx=%UjTr-z zw6S3iVrD;Sfp50}QWcfq;Q`(Cvh>y~ZJn!~>Lv_4hl*Ty!tztrt zdr{?aIWEZWpSlEGmBU4rxX%sX66i}Wsw@M95c;EF+j@7r?A%c}$5tu;X0YGJ^5a@^ z=q@J+r$9#s&NTB$3*__o3txaU^WeDp!@FqtQD8$K!)CDsko}s-6wef>c@9j&I_e_qDv^b1`3Gi9+NZ~3bpyj@_7?Pc_akUOW zzX5b9Nrq!31XRqAs)%!C#c|3+0qi6Lnk0_`>H`eA3P-I=V9Q<)1oQqO=v9HCq|q)v zstnG2Uj}#?>m#gGI7YjTg04DF6X4dCW$*kU{`~}lk>jYrEIcOi2@jfCPHPf$Z(X-F za90YWkL=r=4S#!JMthG_C2=-iMDc_u1DibmsHmj*FI*Vi;!kDAS)KX{tg5yBt)ZX^ z{!|{EkoWRl{nJ2164)h&R<~Jr%%65~^jUy>0ko*|RkW<1AoAm#5Xuoi696XynQ3rcOAk?0W>*x%PcBza z4G0Q?{azz@rDnYi`4VF~E`r(y(yX`e$ze|>Xqx*^b3Fo?7f6+uZ65IznoFWAK{O3u9RjcT zM~e0ro{Q0a)O(5})$G0Di2m==jZk!*L9TB@|uJkAFqt_KmxL4}TE21-S*2GbU9EfL#V z--G(p!3t!X+w#renc_pJO8Cs8YFDW>gf0nz*qp*YTaT89P$_7S5IxuI+$oSO*w_q0 z9tW+FBVmgmxh1iHi#}?{Uk+TX1Ggqek}SYGYDt4qi)& zo(DY>N}F5m**Ps$!>H1@ zmttd#{v65^2A+TUG)&y*!l>-{Kxv>$=t=|~KY>eo##OPYvvCH_j=l<`?G|*9@^k@| z`!w+QSP|<<1l2uF)BlHXS&2;49jjZYG*icl1}viIL(5Ln#)kRC+cqswBW`8RZJK-GKjNNMm$vfB(1El{n+^nz%0IBw*;WCG`AZ4@rUiZ>TA&jVR9V7{*pAp;fvN{^kr!?2jd9{A zVoJ|N>H!n4c46?kbZF8K7n$8vTZm>8ru4k%Z*VbO9a}r!s|W!%OdulJ#g=U)@TyU? zar1zA%&h^)Vw)v0=}Z#>>a+t$yPc;EnY?qiEgzs2QDBOCQydU~mL}ZkTJKlcKx!B+ z@@)EU8$l|^42g{#{&~%n6g-c+=aL5VUj3mp?r!}?%gQ}qw z7BD>V4GgBCgMQD9G+^S_6PmvQoU$eG*Uo{&7<8?w_~03Uz7v@*@dZ}`DiBQ@2|ru{ zOWFnK=oBD!>VQ;#KWTwSdDe&`oB2%n--V>j|MS@0m_d0 z$I`RKgD&wl=C6}QxxfQ;U=~?RYI8W9XtVn~RR)J9uZcf;8b*r>EJn$To9-I~wDvqz z2#3Bts={<13||cJbtJ0yZW7QlcVKXtB+q%P|5325zna@RgA%V{*rWZg<&e8BY zJbyn3gsA)iIM*Z5uX{}3d1GMtj435Hnf|~jV1*7?Aq$xEjDQBl&;$%K%PTC06_gV9 zd;!nZ641m(dNy=2hQ@`Vm;U4l2svI5aS_2@Niny+FfaZa-lHrxTj|TT(d4Qp{G2p4V|-t z?~^0iLj*ma2+mxNQpNGUvo}-D{sOg~0Qty+em55ZU6?=>#GzsT?T%OpCjJO&BL}~1 zUJMGa875Hqap(h{mREcLwS;vGnd)*;47wDZNT4bAxWCQz1JL;mP%ioO=#mTpEmLG* z`6r})`!gc69dwogVs0Yo%o1kOM5?6}rdhKkTsq0%5I2Dr@~9R-qZ6qs(Ty4mbM&@- znK*+4c-nu0^Wz2Y5<)`VEZjyhe7+;zK6W364b$l~?;16Vcir$!REK@Wqj z!51gb-cmk#!bBj71-2%pzwKJxb6^DO5p* zH>WTa38D2VR0-T^&N>zLs(~_sKuSdt@4rK4pseVkOH@7_kMu6;sgZ>oUgmUkz`@KX zEzsrk44wr&af!-{FX{Gn!y>>J!Y$V8z7Yl%wCNI+4HtO0@`}!Dm_f&(d$PbqG`w38 z10SkznaYPNFV5tktQV?x8I;$bOArLWLNxI*&03u=um0Btju!w!T7QN!Y&v;dFoRb| z#Zqb0a*x0dUnx{Q6|)9JZHzd)r=C%uM!xW%e47MRt4K12!q>k=Qr%|0^ zx9PlzN?ie}pG#)C(8SZJToeBm3IE}-F#7_73ekcAH9}V&A}hPN;^ytFy?zS0$AgJqLCd;I5fL) zqObqbf4B9Pt`jI@&p(cu0kh5wKDmW~9W}W|8+4EJau>Fxeyu@fpd~of3AH_Bjz-iW3bSWXnse{8n99@7|Fp>ymJoTFAbI|82-Nq z`vbi|zW^jB&oK=z=ip5SfvJJNjf$q*Ii7$&6o3lIjad80jreh=zVeZ%qb8B{eKDgMSyfCD0}53B*md%mqx zGn6^eT7+@Vkzz@8gX40r#$&kTNG_O-pr*Mn5FTexMe!JlAHB#>iPF8-;qjRGb(*Kg z-B>F05?yi~Jl$#*po+(dj*@4;Kf$`|yX1URoMo9q%S4fpf;L^JEq$u0A|5ycODDl5 zdL*`*1j&uK&^4K`g2sYdg;K&X?9jdp8tIZ6T@;?*C?}IjTN*MN|M3AMdV>+kvwxE4 z{6;5a8F|n}a2kuR18xkax#^?2Ss=8tBpE7(Mq_8T7*lOwk>4yq{2-VT$X1~)Bsbzj z2eW9g5?6KJa-#l(DI*nKnN1r$q1xIHM|j{nOF)b~XMLE97tvvy^Xy4JY2c$fXl5~J z2K;X3lNKmzIMay$Is%>GrXIZqvAWv`s}kp$d+-Aiq4*i1z$UCx4s{Hq$!T@9=A{gH z-yp;?vY(pa&;@Aw4chKxuMz!6RTyabFbv4+qxx+a)dlG4960I6w0FR}xSAVd8pbkt zd9u@zfO6$RIowei__`Ao6=Z*S;)J0Vp)Yf3a$I}VV!i^PP7q|s%d8G}0(#Gvk@KIm)7MJ- zl#d{f_CK-7_81zNM_o@W5c+eSqR^%`kR<&$Mok>O5W*;eissYC+*Jj|$CpvHd;pyC zCjk5Nsfx^4I9pxJ<%mY-!!+-Cf~b0&59fcF_3~T6w7CH&eF1eTE->Z{pke$oyJo@8 z{=VR-1?Y4lBl(;avy4TBaF;klnn&PI8d)W*#%5dpL%mCou#Y6FPPmoTPVzkqceN#l(X@1Hvt=7QWR% z5u8mIG(z^%9jsU*X*B;XoH*tQF!7-&MYK4>x_^2Qd;0kS1}b@n*eEckQTQF&T4u`f zZPQAar&?eaPhOiii_F0bDKK%M(|2f{q^;!D8M((?Ea$h%~w+yNYOF&@H%reA=YfL;=bOxF8RCu~isq z2^w8Q6~X7&pNCD}Gyrrz?|gI|gCo1XxyuBwOls3@VLE-J?AWAMx9& zqYkzigAM8I5Xaox#)5$Q+@lF-_%J#AF@$k$V1T?N?Xn@D;Vw*E|I7*agfZlZ-YfwZ zR4$>JcROqB%^D!)0rM4ku97=MK!=Yq@sk219=$&E-I;*VSPF_Gd&Mdbtl4_p6r0Z( zruaZW!4f@@Hx0pF1o8br@ao6rzYo@y3hi8b2b*zZ=R2s;F#>m7toN&m{1VRmHE4_qai`YET(jU6;~ub;aLe5}ADtdd4B{3OhK!1JEwnz4u-x zwEJH<%mkRf2z~bx+>F|kgSPJE5Ou00AQwj@%?|_ZRVSsP+d7CERQx@9gQ>Iy4hGmWw2uj2pk6_C*YGUSje z@&FyHpz7m{x9w(m5|8Rs0)@@xG)C%}1ZRD=pq?arUta z&yN7R338Ih_>ac~RPiBgr_VO6z{&@qAQbdUc8kT&2x!1VD)Ag?_SbFa$J(~;@62FTHJ4kR0MH0iAeKU9py8aO?bm0X!)bbHkOtkz56PC`%&hrTAAtP3Q7U~(_ z|6oFM9#JLn7T7TYqtH(#w2~cxCzy|^>@wJ!bTb*nLE&VXcKpRYp~9P!Cr4=wW^yP3 zmt;eq`$Z!TDY%8v#!vsF0Xdkd|E4v#$b#^owJ&K6X7gsxXQ}3I1IVH+iL*bGryAH_ zK+;?GB#n6e6RIGNoy`V4KRhP>pDhF-^Bq5g zfxu5f0$m(Blh*bh)vaSBpxd6o5h_M?PIB3KZ#6AuBA}3HmYo#2ux7K#VCOUQiPmiD z8I75l1grlr^A@(#m`Zk3)0n|Bkfwo2-UF08RM=n(jX|@j;Xn{$V6Lx{C*`j+C}jT> zm%^Ykc|3tKS<#W``Nyy*u&ANR;7C%cPLgXZKuw-d`B6yRDS;2Ux*FIrl(1n;@x_ZG z$Uh32$+rk|y)=o`DA5Ylt%Z|0jKA4DcJrYFoOlNql!C_A(nO!1_Utcpc)gQnh9Oi- z3SmWuYiWKtn@wweAK!Ur+dz&j!YgLe>CA^O7n+4bk{tq$aR6}^|G@K7+6UV&{T4y# zTi~s*`a0M~gRp2%9Vl+8C{`*>yjzH=pyMg0f(0~lgNwYpai>8qE71ZEP9?G)s7Qzr zRPYoikRXKv?S^+1@%j%~{iC_{kRnA0Pd|VsP(cg2VS+g*K8FA#M`1@@AyDBqnN71Y zf6d1(G1G`hl`z!+edW)VBB*X7m4B8^6Umtd2%6Xki%Lx5*~BUHBO$zmf-48IuJGUz z{evg_d!`hD-`WJT0H$JRxM8r6CQ7rL{zr%8SWS^3ppd(T8%^z{Y2g3NU=a-u>0F4x z5YP-AI?57M?l;4-0h4ehtqa(cJnRJJFsLq$a!*IJ%>Z!-F7i4A-XXVXq3Yo%X}eHg zQ$X0kr3}~KPg>x9d7|5B4TKH-*g~`aWD9WgOCEJ^g$EY@wbCNdOu`swPS#`6WD`*D-Pw@g(^jABL1@;$Ede|Es>wp8U zlu#IJ)9>K<38s>*f9@Ye13Ew@96m(7b{N>g;yulgw$%@Q!z}Cs7kL?SgNE-3gG?~o z9W+HqbwF2JdVp95Bj6@T{MTK-2Jq$3J{qP7Rj#0 zae^TDvI{o3kzG_CoUPO@U`rAXm$0x1Rm8$>3M=iIEoDXZyW#zEU<1V;9bGwzn!bWr zF}a(jyKL-%(kogi+d10e4(EGV&Ta@hgv2iL;x0Ilpt7!qDvw+A7P?3PJ^u-&>4?PS!8SQ$xgu!L2hnqlkLM2p>=L-hKF4^9AbsE^&B7;M0`LB`((=Eh zU05l7Fo6{Vo^WCCj6*aQ$h*;FICLehqsUj#b_g#}L>phxG&h8m+J&I*z2E_me@Gms zh$S4tnEaQ~HXJI4jzj3iXAnUa6(KdW_a)3ArlA-aIdppyjriniAYMZ&UENC+z!e%5 zvT7InY#u07Ck$&q3pBleEx`-q(9gY85u9nZJ}6yr8iPq=xr>Nj4syjxAD<=+1xbs< zaJpE+A~e4n=-P!7RgkVo5|<}VLM0b_*Au%inf`v#0@==>HvK?*RRY3?rnb^XvD%W* zDs=HjAa#~je?I}zW_82D7GE08WHJImWO{t44Y(y=?C}^&cbX8rTHufo+SvZe@8R8^*bPtM=R~V2x~5E^MG3i%dkXPUH=@> z3KA`e<3{Fu53MR_r5{ru{LO?*EaB4scElCY1Qkfc#Dj-RToG6{CYm=E(g2W_iC76p z3_v%k=ZR*!E+gcFcTCx{shZ|Xnnr7OYk($c9T0=Jc1&J@??B=vV%W@$D&%+&eF3ff z0MN2jgbU@Up-l#JeSsVg_+kirIgrM6^lA{8kH$+CQJEpCAYS_45R@*C#juK~{}63S zOgEU_VhYx_rCA;R;GeX>8X9!!DkMGW9iqj_&lnZEID(4C2Y8DGQ^qO=#)9qW$qpFU z^zlSp)CYKf1go=V5d3c&(6on(%=jf7icg;L!$5X5N;Gv#hd{VxnAW2eR@F_bN*$(2 za}P@Cz0oUgKvBIP;PK()FqI!4Z&)5GOrn4L<45VS;fuq~MredwM}W{xq6YF(A!xw} zJfZ}~(R!$1fCoVML;+Pis8$t?C*_Y&^@Ua?m4yi4JA1qp{*LjnWYqLCRqUUcb|$+O zOm5_Jl>(v#+L<+X>X}Ir1;;kzBb$ngcn_$}C)&uHO|&#W%v7Wh(3dx88v)!bv-yhV zlWx9*;U&-yIj~s4#w3oPN%;e;E8s3d{F4^gdl|zo#Zj{vbLI>9DV5*?(&rGdW;XrI zd_V(IW>cWdpKrO+2=b5*g*Z=`$r}Qc z$sW2Ooq%FlMDU1?3ptx{V?JrU3<3}7Hwe-*St~$Uel zh`N3UqN2Cw)aQSvO@lR9RZ8KUD%NpYSF_)#pKtr}qB(fGaX56vZ29r(+RM$rRvldA zqwx3l=HPEUMaYj#uvpbQ4s0Oz=fI>VXaR231XL}nnN#)a#sAm@%zlY~KDVZIbK1h! z`r)mQUo^#xVzkX0=G3eIpsm17e?XO1(@YgB8vBE$vwW=TTg#lP`@JyzPyV1$W%~*B z9?xg$h0xtUX;p`?s^uLsRjlaLJMh%kwdZj%Q@uje^H6Nq{n|j&kVgpRmDd{a8?Ulc-0$P)n`Ox)*bQ9hH5`vHUE1r zn9c8-1zkx1d&j{gOB#=dh(>7nZ`zRve*Uxe9Y#u;^vDdeKmOgslX#`lKeJBbj*~&x zpo6P$k)M`V;VqVzn`?gb?`+dpfQsz0!APMGvV+yk6tU+ z0D}LZcQeC4z|_gYkzJ6@?;R1VKv=MtUej zi&DIZmK-c9R4DXOTFj-ThngxXB5G?|kYa08@DhvQsUV^T#ez~BeX}!}%r=2{+3(Gp zH-DMo4f|Fp6gNl^EG%TVFXBQcGHa6i;GByF?f!lrZ&`ecwu&fDCq~Os--2!*(QPMe zdrQpT^gqcPV7Df!I-nt1s)JS!-2quY@x!eO8ewQv+T*K;yy#`^uTl*%;1O4QTDV)mrw098fJCq zRvAwkj5opB7E&9{NiCQK>5%4a-GGIVG_DfNYl!CbBXI`RweQA;S! zd)dQyrz~sHC(w%%x~QsCM|&B(9hUr#F1r8X;M2H;%b%h+|I{~*Df%lq<*}fEfu_2~ z6?EJXeUtkhP4?pzL90!Mb@m4aV%+DAWDHl(6RKy=!^ z0HWj%S&G7y0OfI|VMN-4uoq@Sq>-g^X@FQ|!2d8dmk{jQ5zNZWddVKw_4!z;3$gbM Oq=Pg-92Zw{CnB%vmYPNpU@xzAyJk%=8b=7 zQLDw@pZ>Df9}fgo=w-PrqzY8653e%b#wjKg0c;fU(gu<*^k{^y=+ca4)%H2rLvCkZA5ty)xq#CVUN<6k6lP2XE*zYNE{i$mStJ!M! z9w<^T$`xpmIIMtmg5oc-N^b8J~5+AH@JlG}JR6<5-_QDGz=Xpkwt> zCfNvTk4rJ9yV^ZdSjB`xG`{Gpqf!NC`82Flh!dSSP=h(O$L_Z0s)m?tLrx~W^e=gS zdlh->%siPLR3Y=w%h2`3s>N@(zeouQDN%B2P>H^FyLW)QEe?Ku$5xL16$8WL4fq)L zi4OLQceahRCM>3w@%>AiS}x{4LHESE%!PY7?o$soI-5fhu5oe}d;!Y#yJ@I5HY>%? z**5U$s`vKV2&Ku3T8vezFE-C+9-oS^V&eIM?i0B6YmvKdeR%j;Z(Y+(Gz%Kua>nwK z5Seft`$vFYd`c*UdeJZXrE(rn%G4$Da(EYOc(odqGw+@>KijHxV8@-A_^>=u2B-~2G%rW?}J@yJC1%W&J|-#>jab%j3z zliv5a{~tmBB_GnM5JnjY2*~I^E0dHP6gL$X637RE1xOHt8x+9^KN~5midbLQ&lz>Z zfYir?91xTF8Kb<@xDjqae!jpU5FCXD3{Fs=MwtHf@+DvlQgPnx0<%k=(RJd`o&{eA z_H&;0OsqogN{cQDIJjQNK|PZlM`emKk&B_16UPIA8kI5sbM^gJ5hvj#vMxIPfCXqx zzpi6>D{N*sw)hC!XRc;J>YQdZcvr|#P2vbv93rO?s&Au>=yZX^XZ)W>*&p8smInm^ z0f2#kPy_D~2r?Uup^*UTDKko7tSDoZBn*Y2M12#oOn*ui!qK4>v{Yj#2s+c*?3%Vx zoic-yP6wdxisM`8eOM^MiKrgG6)V~E|Gs^_LIlI}Ad!siKMA5WNqhSSj z#dRGXFusK(JA)Fi*vt-#xiC({1M;R-{Gcc?z00-XEnK`;xz7Qr}#I_79~{0NhDH@Ko*>TmmryNj_2IG=nWMU}*DUKR;kzVO#r@z~r@=5}q01(D z-Q;Mg4I(G;ps%peYsDP5cK8VDT{(Xa=oU3`iWmVMkP?GH{uA+9mT5eQf6(TK1OZ|A z7ja+*6b3*;-~L|}1FjBJta8QZ={ui?alj-Z$BIc->zR_SE{cS|acl@8F3rw{Z)~i; zEd|^`zm^WO=X%I4&TGCL{OSsP&)@oZ`#hos5r~4uq+#{>5X6cRe?MH2uebP_`Gb_o z0D%%&D4Rxe@Me8|9gcxrhaZc4AblSEs|yfc3^1QZQB8yF<-VV{S+;oZURgNzVc?9^ zBH;a+(ZRfDHgcNlDjUjzrs!4*r-s}u+A+U7Cs|P%T?fWo(QjjG4a-1Y**NC8ES`rC zSdFO*o{(`r2$p*OSmp}TjBCO@z&INEwkBw0eqmqFq7)c%w+v=F6Mbv(C3CmAu4O9V z162D+Qzh=#81l{!mSf>weVe~sP7Up$1i0sz7WGW3{M^O*sO+S@ES|r0c}at+j8L;~ zwSSN?lXzqt7P3&G*7CQ#+E7^|!b&G(v7sd|aVTY-C;u_B&JINkhtG8;qy%}No4OBJ4>T0dv)hs+4hp=5>F5*p5;26x50|db)AIb8jjgXh2^(U4dFt7xOhGo9u9YbM4Q?gp#Ym}56GK@uc4&h_@!4qp6M zU;N#t@PAT;+k1c~2DlF+0YN1N)s`t72#yID4pj)8OP=1=*!xJEZk=8x^Mb;Xf(oe} zZkG7W8}9W8{4T3qK1P#*x_MegYwTVmAW6~{UrI;`q38M8O2fOt$WEP}A__BtBbW^9 z5RV{IjzIDYh9f;a1aa8R1Ugj#f#ARRx{n?Qp7M{-RsFMAL4Xek_`nTV%6~1o{vV4N z{;x$JPfvNv!)19Id&9@^)4dx1f3tvKaAcecz$cN&MpibE74~2d@_7?2C@z$^5JDL? zRu_=}+Pt51i}v=PjXgm#iMc`X|JB)UI4nTYfYLuYD|t(zB7suNdXK)D(6VrjEV3BE znlc``V;*2DH@c_*9U7DaFC3i2Hru)aama9LwJUgQb@TQ92>*+b3A`2JFo~OvF}Ekm zzq;ilpcI~o5;I%D=)qyCfXNOaZqbeR9eR4NtWTqU^+6+q_cgiGAH= z@ZKFLU;l;4>npes*BEdXUJ8)ZWCtet4-V`xxi&CCV)InCd80)pbtE*j28>s`OmmhQ z8!^+faBsG>A0WbXonh6_>6!jaXZhbj${`jNw;#cb#5q~^+2g!?pj|J(bxz)E6nak)#?DuOAWJajn#K!LQMwpv&zkMz> zPuf(`^)c0z+Ga)z*#~pK_xeJ^cLnXx8&@AH-KrJZPzT=;*MjC9&|r{Z)~Z$t=Ouhd z2i@~gjKmUGA^(&072LBONB@Z99wN{clo*JJhz+>ZMwiC;MufmJ0}%}`d38_)v-@Gw zmb@tDBRM3VYBtc`y@4?C+Y0E!Mf3D|^K<^^uZGovuy(=gdv)O_=ij#e)?Q*nB1+Fw zyZqia_BWq1`Ns`_pil5$mLL1l;CP&`U^ZgxLj(SAkwncN{DgW6yGM~z^8{RuON7=o z1PFk78ynN}jxPMk94>Bxz#YVFrn$(Hr|ed@(Lmu3o+45d5&TVDsE%g8fs@&Edu{QI zYy(<7Un7_cUv>=ox-#96;+X?m^>aDUq2~b|&!V#AsN)-*+B}=#MfixOHWNZeVWbju zacz*O`5BiAId{RcGT(9do2;~*+JY1H?izr0na9}lDPyF9qFj$cDZ5zn6)ab!<6AtW z@t~AAviPl#=jt7txU?cD2Z8DNRtH4TQ;Be}InV4o@bm_Qn_=gmT4uJQN^)q17lAyi z!+V8Oht&18TQUnq6Gzon`7kYV3A8tM4JUDB#frz|5n5I6vV8z|Rtxe8MH^E!Mh^h1 zVGYI;CkpjbHx$pbVrYr6y8<)T-TMk8lBM>*0OZUyoLAg?CQtEX-i0@q-Y2XV!>+G(Ma<8cnmH=V z9)Wu5>>>6lXYuGsJnRgz)U;J^su|#;*Fl94h7HHB7ZiS<5qS@?izR-bpbOZztnM1X ze%!A9qX<3AUvWKZxYJqa;t^(_Wx~_Pp95sF>blmlz%<3#O~|Y2E0#;0zxb67wS+)D z2?gKfvoJpG&JC2;q?utOV5A@EQuR>qZaK_Sb)CLMh?>;n?*Vgf0y%{|%>kS!mhiWa z&+CpZ=NXNo)PLxRkc-=ID{OV^dsHo){cy#tXU`oSgIQ8zsqB%8RI4wYMoFG3M|kGS zEDyP6Wc=~RU{=nx+w5AcRe-&^hog&2o@!ydoU$gXLcaJ9cAQhcOy*&-!Pp6A`SHrr zb;@GQ^5`x;YSbkdlxl8(PY^&*7%c~L@uqnh{ye4+eeUd7<(zH=O`TMeGOwLIeGp06 zW&uGZ)r%Dgi?ILrSWWWYh_H)r%i2lpIj3bX7D^gWr{$U6x1W;dG~=cZVmQl0o2TeQ zeJANg%S46Jr9)!{+?G9;jiWF;B+{qvHjiyXd)tneHH|X+ei1CAs0Xb0gIo%FBPhzQ z)c!W$dMpoU9ky^_bqmvw9!$lrgI*9VC){p=OEZ#E)rp*HtImis%C)iN52$Fpsab21 z;9wP0o{nfVv0GxOQA<^0*I~2S@uk5@ytUS%!zssS+q{D@;97mimw?LB`^~?*KPmJXf&-h4*%*5 z=&({q5%ES0W{xJ|fxL%D=TT^&Pf%moF4F|hunlat+ll2t8}2wXl+?!PD?j&-t*7g* zICqrX(|!V%6xMi3Eb+!%!BnKPBcY@n>n^jUoRis<;9Yb!e*@&S!l7D<@jYQ&QD?si zzH!N$LfcL=GD&dTb=*lOE#@*>fpoJp8Eaq7D;P2{Pp$^`k&&1u8 z(fa;Zu0*uG#!Uc^#8u4MJk}dPVhbGs;WN|(+$o=UQ_2RPJS~|eDEvm%xX>BjJZb-> zvx~a3I4z1uy}mAMn4_NVt)eW>M|we4vJxXdM7h8ElCdL9x3LK)CWWYMSh)wpo zkg94LO~GuK8BM_njYF&I+PnI`gy{&wH#lg_$t>;%mpmXyXq5W+z2aDiGI6%yjkI&_ zuB%ob&3Iq_2e8T_Dco1>d3@+SUeD2Tf(fo|^}B(!Ua3Gc;)mv7MjbOt#MfO2{uDmouP zQGQ4SC2*^vPSIXib3T{44*I2phK2}3f>cLzVq}TR(9=GZaVw$ddlI-mK)j!XW^FFu zgNmEQeLFKfdleAS-v_=v5Ss+|1JTEES;hKXainxVX8h)rCueeYNFBLC0?eqS12&;{Wb{yY zr$ZwIO3!+fFeiAqx0&AMV^v*=qFwN?aiu;0x3Am09>?5wV+v#hm#7xtU%Fj3aCASho0YULluiAXvO#+(rfLH#$>%?eJj`Q~5D5`8_Rdk*@v@J@e z67liz^S9%kVV{AJ%~kq!cu35r@wK0lPZJ$eKEb97{TdpKfd7OL2*40V`ZsEg2T|r2 zfdB!igv(^@gTT++H-jbvn*Pc9V5TCg1O(aLkb{jk-PxPG?w9ER_NXC8J#K z91HVd>{TSGyQ6d0{#@YcZLjpNpjBkdQEE+Qq|8x9tWjd_oSQZW){PskRI71K4~y5e z0vBUth2QQnLZ|2eyHY>H>!FaLu<0#fj}E#qru2LKD)Jm!CGZqO$BJUsFa!;bnrX(}23{kkQf%nXgVMKY_V-g#XQ-bg{-hA};1 zx`4Q)v%y4ZM1Ux7O63|O=gFBaM^|tB1U^HkCfy@*RY_WM(TD-1U@=-w)<;#$`?F{A z_G04)UJ?nQ#Zo)oz=&R(0jvT)*SUmsn+nsZH7}7N~V+XYRL}#yP2#?>f zJ=s!IbhVaQ^G}C|z2+9%wJd`Lhr6OV(hXs$n!r#`AgC3ZUv8reJYIglW8&WQKx!bS zfX(Qun65vJQq5&BWhD6xD3VhQHo6P*5F9cAo(!}=GOFGzN7%v3@=1d)f z4%a%s>||g6acEZV8Do!}(RBu?y(N6wGV~{`v*H?{)adwppe|5+2InnY60!U1oVF|h zy_Eqlid5Vy=Fjj32g-CZQWkj+lLWgT%IGIRZ<_itHSB3SZ%9MFY3Ha_4~jM z+&1bQ=LPM1OY+7%{tNO#lF>3Z&|@c3v&IRj7P;^U-VZh!^c^C3LT^~kv&r-fGibuN z#t|LWU1`ze3Br5rrIACW>APl4Che7Hq4$pomlCfmsSLB~tfG2FL%9x^SFh#%)4pYfVEx*7DM*w;b zdcOw!H4gfxupoKDS+YKaf;{2$5_eil1j1a4LC4?{D<$1h)3r$@fn8r27K|dH`6+I1 zanzh+eF%0v2EM0)e?Eq8Zd;|j)3B{stDXwgDI{9n&na`ZdP1p z3VqK1Ttc?xbNA}YupAi)`Z2cJH9O7Eew*$7l=K~N#~Qrzs*gehdi%@7n={~!9;QkK z1p~0|%Ug=cAo#s6?tfIl%BRLL_AF+A&wYrSP=PoTPs}#6z2x`iBb3QhQ5!1qndQV= zS}*^pCxw0PC|j_^Wap|rl{gYr+nYjo8Bdj2*8^P8tf>m2D@x5KQpd+%m?q1m)v!Nsm@Pr(+8tU+zM>PwOrtZ0 zf`=_afFoF0$p8x|iw$)HSHRuFa7*t%9Z9$@eC$x1odtOcQCt1aLR-t7uN<)AF z6K|tcXh8Q;qY3#P@<;q&bOxt_IxvK9gu_Q;M3ewcB^t^rc(q*u+ke0YsfK4T9=2cw z&Kmh_(GNw?f@)!ppM^kz*s~`UJPMFR_geC+qSk4IT}n&&q>Wu`yYWduK-5?~BZJR4 zf+CUjT$?rc2<&p|51RV1(L)CxE6@CQS}VzX)(1g(I8%ry)kv~P=ZSjn$ zozgx0?ivhpD>_A$?DghnP#Au>Le!HuGD zZ7e=C{U=4^I}zOI_5`6v+4vOvI6X~OqYB2kPCp!Ep?{1Qt+?z49w*QOCJ$a zV>aJsAH5NXr5xp7tUHT5#hC!!Vq;7jBer6;QfwE=5q2M~qR7~RfWNygez4tdcX_c5 z@-Nm+VRb(mu323zRZza2662I#>q zPua4{(lV@?{3$c?+0G=9iej{;>1h5M?Bu*cV}s_YDF^;kwiJ;Zw*~$*j}vdH>w# zf%?*V=uv4;r}`X`a7sxLv%*1*T&r;9ws0s3XoJGqkkxkq@4pPV^f@*{iqrFRD3fXo zt*`~DE^V5f2gD<%c3Ap69YV$?3uPHt8uwk%?P9cic2z8F&rAV9J?n{8 z&n#H+$C}yyT!b~rXWWuaw)37+wWpUS<~8((sEmK4daKcP-EMa%*AUR z@f4fxINFEtz?ass;Qv;lCPV}*+2oFS6ds$hU+jd^;jN&(tS0}Fau~8I8Rn8Z4FDl$ zT8)n5JTwC&bn5*3jQ=azf*U$H2$`oUN;c7xW8}s}Ts#1ZzoAs=4{_NS1;!rYYj20) z52)iCuNav&NhMy@bvsu5T0Cki9y{DF|5IRKIIJ3{v^>EBYcmh;!}O~T!u-|XVo zrTyn$&{aE&yYr0Y?S3!GVT#v?Vo2gbM5}GwPm`v~B~X>+kT}@AN7{IiRBpL~rWi_hZ=(^3CYs-y z-qZ<>(KPk-(d(=Ka@z?>o`t%y2i+!n$^kMivG3~@Nj*|wkrL4CpJ(><)tQJLtuFtG z`wf`rkP;*0_JGvE>7$g&pu!QK>m%%cH+@ujbsShG+o|2h1bG0_ejAES>!Q z7MfuGTRzdCEf=h!RJRUK1_|Ge5u(?+nNeDckOgdoMaiV%ltsP6;p^q%w#V>aZ|*U0Z<#pY zW7rhL{oL6r%S5Z#rty~?4WM(mXW|mpPaI!BevA3pdl+W*Z-@#>d$0);qrJK*ImV>q zPLs&IdkA-T)5ex%6r4K}!Mw(?-MF|=v7LP-H{PT4YytNgIznrQCv?w;YElRN{>9US z%P;&V4*UenFT@ZVhUSRmDPsDe7*{dXrJ_DNO$@YAgm`X9vBLZJ96(kWA!Ij>IY%c; zMiFH@T1%~=I-Mqm7X51C+CJ7p;$>`j;0|Ha$bie3^)SQj3MPyrihV4n0>;M`s^Ma= z@b6z13aYG{LmYWh>3JdE>v=`C#4-216>2e?-J3L zPf+0cpZ!?Qm4$VxdVq{(WqNp=O%?h)wfbVPbOuFj?kNuDI1b%od;yBI{OWMkFkrR&FusQHLEPxk3LMP9(Q>aKxFuf3OvNNtT|NF z#MjJ=f*;7xL#S9(gIc%@EpUk&xVqjzCq2HbBtlP?t;T2*UBGs0>lYdSZ`XoYC`5S| zA=B0I5@tB4q0IL{s3V#vf}W{!#@!PB%a6r@emeXJT{fQ<0HMvY3n>#>{E1^~NDl=8 zD;6rAoN|b}?kO+om-Fg;X!+GNh`O)2Y5Uvy;&OVzC{Ke?A|{<4XYDZcI(Jwm%5uW4 zO&q{o0csIX6wo9$MBS8AN=*^9B+hrS)CS=_PWxdNoz1Q(X=1hkS12@e~wpC?3^3vZyIG|N8n zh`>w?=&VeyyWC6bqQYu6gqSrR&Xu-W4i`)jCsj zrn6MDS3Xji6&gh@ks++3X-;W|fhKuX=A^wmEJ@-#G=C0!rPkqTy)QM>z>F%-eNzs8OmvlOw6;rN^yz(AP~mQ*$a# z-&`!h_Sl2>1QO(jWkQw3Wk3-53x-WGm2G)KD`CsUGiEC!l%-gsYBKx`a8E7#$WMk5 zdCiB|141+EZBROY>mo`+ZoB=4W_`whD+LHP9K64VRE;i_UurvDJX|)~Cm=GjAPdQI z^$xRC0C$L652OXQP>~=sKeAl>wCdE*Xo&L(dSeT#d=!T+eZpL%+AVS+^XTYtI8kS( zbMm0;tlf!+^vRC*tWfg$zL2QU&h~MFDh|$GA##)u~rR zKNUu2866!M?59o51BwoqU+GDymv^#ZWb_!UzUmKDKah{Y)dw??4*(%WA%9N_^iv^Vr^VB2Z>qVd|GyY z$|{inbvI#SBq7!lsx^gUFfXlARS5IEn#mJe%rIl!iGb4D)#LX>wQ9<|2mnz!AS5}H za!-_L)@K-dyG0IPc~mCU6gFXPToK&^*cdej?=dbwgy~u9aBbqMnKO>cDS>4ni#x8) zs(3mqq7I`T1rH|#>gbgtRax!PEk)@8MSaa+TL}JZOwAYJ0_-4J+dzsi=Jm)mq#Qbq zPoq9V4et3ufljkpq15fiI6%VpZTFHt3}Kv)e~5H0^|ZooLr#oWpJdnx&hxcpe-U-U ze&mLoBS)4~M}Mc`(ps}%chfm z@c^4eCA>HR$NUsREH{gRV8g5us#|5akEUc}kQJY<%*syHwpwb+hPRk3PAO7{){R1d zRrlBUjZOTL2G>1IA%F;P+`=j!sAXgzRFw{&ZD32D_$$xrGZuTlwrr8EUvr)s8s!P5 zL4(Y`cEN@*P)-<$4}+e_V^6-TkA0+)vsp%$NeRLF#&WKSfwE3U3ZajhSoia2*BH}73dY?UpzOKBH@y0Wo*zM ziL7I9B0i3PiKY1p3^V>Xv-WKhl2u+~s-pC;HV=G&CO!Hz|6;kb2-)_YAc|RqWF-jlbvxh>jemJus!4)qa`-n?Cni`A1y-L!a=!xgoWWr zMi(gcWm69M6`;fi98RYepHhpyUFF$8Mis~$!%mJg|~l^QvBu5I!}OI zAFv(l^zDk8o_;7W!C*NvVPPiR&)#dt&a`AT_hmHiZ8ksbp< z)|z3$q2N2s^0~xoYgRycVvnUonDEi*F5s4Fbn|NwaNg9_Hcx&&ST2*jNEJsSRcPks z5^U_;#M`yyiO`u+^u?Lt6L>Qs;9V*@@-d09tN>LJR>;GqLY+!xE&xeA%X-i#C0^-uDhWkrr9wW(^e zX}JbDcuc@ZzPiH~xT5<<1VS6{d@zeWjK*mc+Bh3MG)2 zI^yewdfOVsB>x^YY7e{eebehx0{kSSvT$6df6xdAw~UBLp0=CoLhmzh4KnOD!>P06 zMr4t95Y)7Awqw*upQ~bp*&xH)qvbB?A2R#Aw)haw`XY4&R+$sd?IgKR=EM6p@g%|{ z702A-_ujJ&DlwcuQ74k?EE)K=ek-TfkJyFp-lZD=vzD9X8%R*N7ePxq?8(Qv z^*3%rGcf6rN>FReRoi7Q(hI7Ge9z( ziGoxX_X?6axzg+}tb%6Ksd1KImAuESYrl&XKS68KpG#Nkp15ZmcpZTWnVMW36%>tC zMics#suL$oB%v5W=sQXGwi!!yDKGOHeb0@>t97Q@)8=Q>vENT!4S=hmYuA8J5-)e1 zy}cjIHNS_%39R?rgwVzco}S;Io&|`;LU{a=_79B$tXI77d(80VP3vb_wYNM|cx~(m zoT5;<7)vORD$1nXH@pTeKA561_2Z8GT?NMAj-#6*s?B+sdT_Qf_^hy1)vsN6sjjsQ zW{FpAX0h$v@|o9;p8*H!zXN?vNOo(RIvH=ad4eYSJ{SL9@&vU^I+`AJ5#R?xLiYJ& zD*mzVki78(0mzeTY{#zCq^sacRLKl1!PYs|@H6Mn^F`0oahi&CnCa*^w2z%c9}zF+ zeOvINvv*~)uMR61jmA&4qvOdxGrKbj8JtX_3d)yQV++964|bNR@tLeO6;p_;WgqHd&cBMIZ^#7G>_cGcItEh-%VhgF z+A=G~s@asRuZRCKoiQx}@vIP(K$5-O(w6uQSSh3?3{KRIo_KXVyjPjF`75C2 z1CsIlt7Va|%W$-Du3~K@xp*1As|hklPu4T2#%5sMdjWZh2=;36WO~`GZn2@dQD_c5 zKtCa)PQgMyp*M}@{w_v8MMW&~4o=oPLvxV@=yv|9vmxPFirQ#5k;|r>t-@eJ$9Sq$ zH@3bk`7cU?kiNW+EmR5U%wYLD7Oq28h(_#8GvTEENt+|Z@H?i=ua|`g^v-w~R63Eg z*m*^CR{*c#h!x!c7TpLY2eh^tczuaxXHM_BRDNe<{b-v9y^wT|3nBI6B2W)=*j(xD=^%DMrqr+An|?15^&BsHxhO#=`-F-fSk*{uYWq@vmAi_ zC+lT@>lA$5K8Waj#(CfM5t^sypUyc_B-#}pv1;+cW`wA8PanCBaPmn+AH9tj>$IqQ z!4pe?n%>CLN&jdl9tu!4?jdlUmNodzy2O213vM{vQh7LjL8Ayvr` z0k!+|*afYV?m6gVf=9T%7G6z!rXP>QJwUOD-APb!@5IfyBX59B0v8NJk80_q({fZN zF1O(1RqejYjgheYY#qu!eQxn_dvYM?MD9(f0?+Aa|}&5H1ys30w9dQ z?>6!~$(0&8gQW%%>Jv5~;Y@fKam@8h*fgbQ&fF`z2R@qNYfw|V8lg@BZHn)YsexqP zW}?Z%E(JupoW-Xc+_5JGX@fYFG}y<_;kwKVX{ei^_%*m`Bko@s4H&UJcg<>fOnQ76 zn3UfziLQ0o8k&DWYMrKb3%Zo1p{ujMJo=6(PaU;($23r=y`IX6 zKb59O9w%nt8q9>NMb$8#+SN?`ZoV4LHXy0f4+Jsykwk6j;!#b1aRPL(ZTpq> zX0EQ#u&3%wk-3#0-(WL>+q3?Y9Mmc8UKv6w=yEe?-_aRwWUBlzdZPs)!EaEPUE^-p z#pK9c(M?#toxS2)-)r>Hb?v&@37oOr=@HC)`55^_@b#&o{7oqM>8@Ve6VA?XXWzbi z`*-t|Y3o`LY7_8F&Z%LbunB+!7~y=yzZundXF3L-uYZ2QZOn|At-MJ%I|KMPQ5!Bz+7qmWDa$))VVrs*^nJEbAh=@hs0=9 zshtfkYy2$wE+cXuw_*611*chV)<=ExPEA%T&+}VYEJUthLXxtvk{RHq$R(%YXIOi4 zX792)4?k>Mx;8v0`^hi`Q~TP??*qEdMTNxZr=BP1${i4g&x=vgk{D>PliFj>h$+tPD^%oYWIl>c_;Mm|9bFqg1wp ztXNRqSi-7jCb}?|j2_ut!?aZ_nA3X89-mxX@;%gW6EgfF#ezR7ulei#7Lj7+Wac!; zvQj&Ysfekp&U%&>ORhms>DaTsD_wY5dZ`^366Rsv)%oW|Ybn;GLT+XgC3-;5u}^@Q!S~>|}m9^LUD=h&?O9 zT3}3K+0rML#RH7fZcD8=6m==^C&k@Qa!jC)acTp=QbtX4^F){mlc(3e1$Uer1SS0n zsCAQg0xcUf+(n|=qzrvCV|Gi0aVGZ${9{RS@}sYhhemBW_{-Bz^?vS<;DpXz46ZkXTvixl^Cdbs zYDMEgNS(~7QM_K}0{m1Q$;A23$TD9OnlVo&Hh6ymb;O~sY+gWeKxr=JGq^!aCQqV~ z;oE1{9fi&!w^x?~8$jtK<)@4k;Pby`aGE8gah8BiyfOfwL$hMHZ7Nl}-3nfyZ2NDL zRvL`}TDXV=xb)s9+h*J?TW@YtVTlh-IH+RePtY%#`&kE-93~9i&X?JfJomZn4db88 zOrTeXu7s3njygzmRcx)Z!`1`fsQGsO5WJ*j6Do8jtJtW}O*x2ws{Zi_7gw`J>wAw>+nsB3=2Ti_O^Q#Q0J$zX z%W-5{g7QJ(y|vO+0*-}A-F^kM$o7}H15uLH;r&%Yk9o_gDw~XyKiwSxNr92vpZ43A zjraqM z5k!6aCr;V6h^=K$ccGhoCKEcrsBAf9rffNXT6J&u7c3yJWx|h6VH3bR{|~zyLh|e5 z;0TVPKmi((j?9VNh+{_q1`_U!3H^xU0#U&?@c%84{97LZM)ULh&$yqD3}ajgaDrbL zu%)ymf)e@dszkw49nkzK>yOgaW88KJPK?BVl#Eh^GZV#@Ocl zhtvDCZ((ithyIGHUsPlF;a3dJVk>-;vq4O+%F>hDWP0n%CkqQr1}u5&w~v2We_?Zo-l-@U(m=nH9?d`Og} zTjxagTnB9L>I6P)4sdhU<%eEdgU+x*!e`Z4E7Wvk%iG_q)#z*jXoC;YOJwVGfX&O8 zM;$IRWu$!fvaX@OCI~OUP9s5z<9LB-$Hpj?FS0h&#U|zk4e1>2;?}){q4sUf2^TA9 zCnJ7LY%qA5$1S;j1R7t%UL}|IA-j?@?X{p_C!XfJw6#>#v985Y3h9;}8eawT zNZhOFuC%rhe>F?X{vB5|Vwa~(e$yRR27#eoQ-QI#G*x!qfWO`P^A}oc91Iz4u+g*@zlfS?AJEpJ>iY;2 z)~io$xs3(Hh@LEs$L=l+DQ2(n^%%qY`?Riq2CrbG%&S>gJM^W5|FC#0Rl+)|GU6wm z*)rhOT_9c~ZTu>CO=Zt5Bgqh}?E9(Ah3_oJc_AUPsIVjZvPZs{dr3hRe-vID3u z)jpyns{FpZ?AK7#sVGfNWF(zLaa{e$f@Ge&_Jtz;!%JsSsyC-z>O@3SI35)?HvWjG zsrZ9qX(9i8m=jR`jA`a?z^JOm?`ZVeZF%ZJ{d4+Ps%dYeI-1fHPgo0rA@f8T5qUxp zpYjHRB(TZCrWdAFy_tDD+B}Wag&Z)}=nQ0dL^NkJI>Q%3*S2mkb^A<>ccsAbtG=RQ z)Cc_P;@l=g0LPbWz)Q>Aw#1c9ToA?4j+3k@ng(*!eiFRqLI|ksEPpBbA?NJa02WTBA^y$Qt#GEM|b z{ic7i9XsWCmETj5FXz)Vc8+9iRlbz3_?_m+mb^2$yP$~1A+=u|-X_wyW4kz+0solu zPua06r8QkU0XLnB=kuB|GS4!f?%K!C9z5@AeEE@jO&KDxRFQ}fK~RGicSaT1u6g&P zXm+55b*u?PTz+ClW9x8KupS^u>JHrI=*Y73(n6JmY>G;`C+cANpbRKE7_VoYfN|9y zA)lJXwKJlhzcYEQ$$>V$)#w;FO;9r=oUmX^ce1lsk<8JUiKvJYD7Ra=e*1zlU1%(& z6_Z{&y;r5m@I0${&v7^IsM3wg6ZJQjT#ie;EfYCMamJxmq=%yba05!QBs*kuEZ2W# zXQG``TssHL_t|FGbG`VR<~>0b3|ZBQMJYKo@(nCMYS^O#OiiSYiFrCp;sYGPJ6T4P}Su7t-vKH z&1H)zMmU4N+m_|zhyif-*`(X@WvqT|>Z%!4AUF^*3$FJD?G9aH9d8(Y>K6q-vWQ>C z?~PpW%F~;-jy~%_M-_w$V)1cb;9}Km$+|C`OmMOh+*rLs5oo zqAuuC4H4z!ZJD|R(_f@-uOpTlE(=SK<_8`E0%T!0AOb_{rZ_fAp7Em-)sDc@A0LB$ zP4?h5WZO6+vUn2{>NXP}i{!;G-gIcIJ(#=_e`>J*%L70!B+`zKi%wQXceOqjo_oX? zhZNn-vTqeLs`#Hv3d2}MCNC{HS!i%ff{6MAPmI|GrmjD_N20Zm~so*tF; zK`B70afeao+w_&-BlHup{|WAy!PJ$RA3E?_!>|N9kaCkY6vXn0KHxfp0OJ6ZFh!y4 z1-G933*w@w@edlA*qk%ORmb;#4Y}Ez5t%5YO7H^||7lOh33B?!NvOxQnt+!tX0)RS zRjg*LMvB2>;N#PPi4|*Qhtn!#PY+K($bGKrc^=$%E+?FIx*nAXRz|oVub1Lue}Qnn z$$tdh=F0}7i2ZP~+U@GP9edn9>w7t^{MjD}u}>j{Gzk4OJUE^$js0m`>4&X!i*i11 z9gZI$fXuwCwH1xKb~rS38Yl54C-8$e?VZT|N?~wf9Z%f1!|AsYvUn$@m0e=$vLd5t z4R@XcN_xrVk75L0sWMM7F~}L_EM3J5eM34_iF63vQ6_Jpj7PfI>J(H7iw4-|iZDt)oisQUUC%4WR(M00|!WvVc)*Z<+_ z9iuA=*RI`8Cmp+Ec5K_WZQC|hCt0y=I~{YywrzK8vy+p3-gCb3?YBnNpZZr-qeeY7 z?>VnIX*C71x5Si_@JPWfc%e1J+uUKBXfKY{Jdw27Ld(dv>NC(nLXTIRc5M7bd-lSk?_>03;nVR z#ZoEovu}vY7MRqTPRggZY2Kqh346}_C>v{i0Y%!dXVxoNc{~ z#hg6lesH+{bs`YjfJ)5V*80jrIGw!RQ&GrZEwWTe9>5-Q7$^i}-`Hyv4&;o5 zLwz;9cd=u;5anrNAHA~9OLb?vz%O(r7=knWSQ>JZjYdG8#R+vo)QJ4Uh3b0_`bDZEi&DialsRiN}G z#VMBi@Q4LxVwBAz2#3S6h}@h^)kL^hy~x3VacAO8R08CPi@AbMk`xLu#jAg2(~nIm?h_|q4m zoQg;YriKZRo(MWSsSvw9VGWp55(#wgWu@CwYLOMzW@x_DiO9hH%hMsn(?QWw2awe@ zENM->Tb1|Bj42#SK8F+?v_p~j=tbH6H{@!Z$=gD|*K8DyD3Zk^$3tdVw!YCcUT%Ao zv)$X$4$}3ZbU#Srx2U+3v)%n9HXH89V(p4XTv3lu-=7a$+m;j-%5RT$C5oS!3zm7+ zII>N`Oxy^j;GN_1YxBBk+K4s zzXYs>FvFscN*wm|K0K-eR2(g+Y3NN&BK-&vgH>D;aCjFpPAaO4Q9rN-#L&$o`$+9+ zUprCH6v!x&<=pRZgVO>rS{ zmnEc$!mBG0!n(&HLG|U z4trlM!4C)!?HezFNa0hb6t&c8Qo~o&;A?gUN8h;e7b1Nv!h`IMAMs!sLsu@yh#n7S z*bD_}Ia3#85s#wcpsjvlNF4p=z{J3m5xkbc0+jxSzuJ$1a*g}UFYy?}5mx!*d7@9y z6h!Qm$U~7@Pn=pWOnMvt5A4#Lsr`5|^7=>DXr#NB$nuNxtZ&XGHb0sH;lKa>%hVhi zQwu&$1W2<3RAm%?Dq-=pu$XCQ@lztvC52M1$j5^vNqlG0hL$o(7L^UJ&RPPCn8#Qz zhx-hqNv(D*&ZK8Vk<`W7d@WqK+G=Gl=Ivv3IhtC&;yLm?+T!W{^!)_ep~q<74Jr^? z+?Bu-ah>)yNsm!mW#WMKai29i)}~UEzT|@>OCN&*pa?38w8YTNVB2@m>9{RdPcqPD z$d|`CaK5>3(sC~D(XjLnOElXsJ&OU2C^hQz8gwgG1~Zy2nkndA{?^7o7rJGAn^i->D>s56%23rba55$E4V~nC02d2@5 z{#~sAE=z1$AHA!z9|v$pZBJ!4-Eu6<#frp2&C z)!AE`Uw1}vL@b-M^OGVnTe3o`-isrRSiJ(0S5ekvQR0WE}YgTJF zW_761+<0KCZf>G#@uas;1SWLFM?Q0PD$|_ z{T6o-Ah+rei??_WyVl*unvf(EWw_Cp_)!ZA_&Q6!xw1Vk<|h#)r6$A&K=!!9)g z7!QT}1)59G+0L|Ikw#y^XAt0+h|bH9ex2;0;SuY9ZjIl$BK0Ky2N!^(Dg7zBgUdAY z4_nF`=t~%XUEsS$Qu>~&Ftfm*m|POiFRq}%Ir0D$^Ko*vL8g&xv>I(}GS%7`daEyX??#D zN@oqIvTxDDf4)!nHt-m16Xt%4VT7F(5%|r~^WC@a(Pk=H&~SDOnOIWa0bY8+TH$>ImLRoT8CbB;~fvS*lg;*X=7GKu`fLc$)To#7i#i~5;* zDMmn=3o}o{)7G}%_G_ma*kl6^%I;=lYVp%4&+>8l3y|!C%)&mF9f<UZM)0nJN5Q>#m`+HQp` z^YT#81b>zpC-e9wdc=@r7q#fk)NwG)vNX<{U9=xR+Cc4TOW=6X*L1w#v=4jT-^SLfNYlp&9tT{S7z><_F3pgn9iB@*alaNr6>55*^ z8Ca3IYxzf)55I>`RtMy;4_3b*SJhT4E=QAvJum0gS*od0R6xKlS7%RVHiGsWiOFP_ z1ecIxm~k#8F;FJ$Ni1CDnuKnYeMSz_%#}r;o+;Gp)U_`?^->!E@#b+hI~Rpw!U9$_ zQOODCYr^!mS`(SA-fnu!0m^7$0;-7JR3Mva_@88wkadrs*Nt0ce3e!Yv1E1=Q zFSiFzRyNjevyKC3GPEdBGW%1;Wwyv-zgo|(aWH*m+@_Cg=MaCWN|DQazknmQr0v%r zD(Lc&(9c&(I9R24Sy@Ea60BP9OAcyR3!mO3qQ=It9 z_J0}KnWb+1ytE!$D?&+cFFxI&npKxxI!7Gs^Doaf7)AjZq#lP}BQ$|y#$!(pm_PJZ zRew`NrPSbe-OYKSJ^OFY7tjCklyu4GO0!$fy0!bdLM;U7j|~6^hnnHhKe>L#7LE3- zlWC}j8Fa1kM2_b+ziLZDrxf}sdPd$7fqM_+D!#@mp`0Z#ZoVZ#vy2p+?e8+#pXf^p zuIGIejRXM3A|qpg5P!U3)NFCwbI(8pum+u>dFT&ps+rT{gs2^SZ)nOIK-eWTq2(HbMj%`xInxU(Q2 zKdBQgl}X9rOj9+f!V)!( zQnCp_8%C0c4T2gga;Z7dG>jxsiaXt~sY%19d)vkV$?rs_J>?O#k-q(PA++mp+qHG= z(uKMA8_KA*pW&gS`IW=fzYD*|)t9?m0|0m}=C-F2R4PPEly{}EB?}u*(ySbvRr$O- zrI9HhktH7*z+8zlBe%&vf_yLWC)`X`r@?g*I+{Du@fUrs$n6n}bx!l^(-j=HH?cmW zvo?Rx;e9bR!nJV|gqAqTrSXcoT0`F-CK(e)3p%>#+A~wvgOI+B1O;&xZLE&(PJJZ~ z@c9+J2QR}3azq?SY<9_}m9>~Qb@IZ0q8>ni%#JdtOd)w2chO0kn1|m2wNZWt7(i&l zps47TfnS4AvD86zQX!jaO)l!}rCQDMwo$1mM`-g)bAA6NSBUdPhWJ*-W_-o7)kH$9 zOGIKI@~11rg>W;?EgxtCj#0y}t!*Vrf%wesebY0o1>Y#|8`}KZ&XI!jJ1ePuHOBe? zyRZ}?_32sG}HA&nIN|;Hr!S*2~9p*?j^VYq!_$~G-TQWx9oe&pDNCtjxC+R~E zNUf3-V*0@oykZ=YGK*S=F)Q-P=G6ORKN%Aeota~=9w1SoUYcCjEPP|wWE6M-hnIHi z76t7lvOVJ+1$!wDfpdx$i!hf9&zTGz z8p1G9#Z7rfs4R(`F|EAwcZ^^pOhuW#6i4&v5Ea4`od(1KWN+FYQ#c<8`Kw~Wyb;hW&9Ew+ft~K>w z?UaEMib*(&_8g+ivOHsD_k&SivnvZe)v>sALq}Sl$;Ka*0^vOZULn(z{mb24HEbBt z^4>qKS>_4pddcR}mT=Zi0RfED!Q>`5C(86O>1f5)$45=7vXjUFn}0IN{TsFP`|!)R zE30$WP>>>psF6tG$-6O`1b4 zsLa(&rzTbK7)*j{l4izq%%btF?_%z=k^~a@TV@?^f{3 zypsxxOl90=AxWePye}w+>u1L>SSfoLP|+3-A$Jz;%R?R;8)*71JZ8c2xXJ1^j=d1Tzn_oH2+{oxIBiUsADQNUua~PE#)i?cdt-AkyS<1_0b$b zJxg*9xzsk7;SL9v>Q7JU{J9#KyddsM;A8UA_~_Wc>U{H(ng5N0&+2b+en)hy>%IB= z)=!5vsgq4XnvB^Kuau8W@@Q`FD`@x0fFFKcxN-hMB8<;084;Ry0FpIbjah$$bzMqg z$6(U4YgRrTNhD1PNjcLh^la9qoWkrSRGg`OY{AN$!5{U5*LXP|wge$El59|sD`FVz zDRjCyp+}csI@G^1kBBmFzU!mKG3=T_Ij5O|l4>HatBpMH{f7^UAN{+boqT>2I1tQ+ zMtTN!wck+dyC5UY0PF_XmUM^L%JbeJ9~D}meT)&G7~EMX1rHKH;A7X^TaJ0ceOh@r zl6yll z$_mfgKPYzH;e`b}`DR}Ify7O*qGPpzlW{thEGG@ISwv-X5>2^bW17|>IrpTVLpk?7 z7bPQ9gpt&1;ozSoQ0L^$(v4@mshkI(dc9**Iy&ssniJ}Jf&7bzk=?2u-}`rIh_?s8 zf3Lg0(O~(`e1XB*Qg4hP@cuJN1Snb>*}FQ}{m;s~Q$r{5rx+T4HV+XECW zBQ|oJj3L=-Bt$)?dp|K{pXppXwmb9BqwkfUz4ev1gP%L#ueC|qW+#zIAKyNI1N!UV z+bl+=$bYiunGu+Kzq$gBvaWR7?%uWqK4e9YEXib;B1);^3rUNy5HbK8Y8h>#Y&v?* z$r(mgG}2PM*u~YyC6_TwW3j3QDQs$~>uuJQ^SybDZE3~uc2X+r5;|1F$16v2ivic~ zgK!b~%NTrxgW0tyts&NJ>WQ<>W|#8UWQ!~tKQKL`#3jT@7P*BhlfI0Djd3L$-sR42 zK{RT-7>$sjy=^JQU~2&Sj_qDbeqvhxMEBy8D!hvlK0P3Boo!+D28x0>c&(D5Tt@X} zH8Zux?VeC}UNH)%1y`^k4}%7#Xb4EcYB~M3rrx`UU85BwScRRos#V9jsHv(H@Qg_Q(_X|wQ6!lk4jFbY z58iCSqP!3Xr{ZUI2!UP!&tBmZ78$<4V!@)@mC=1jNd{b7owHsOp$k-s|6=)-L9uA= z$xHnNiap;A&)|%VEciSfTpd?OYxHq%7kTY^H<3S>!U{kgPP;2gwhntd>ju8CfQJuu zyfm-OYU8Bf^kI}XmY$dmK@WH}WA5(8f@XwMc%NX_o)fNXY}WllT2G~UG3&6J`nG=K zO6dE3hV!)hyETG7tnUn3cbU!>+95t%&Xa0(Gs}fEVh^UX7Ou1QA#bj> zg6^|cO=Rn;8F7dbuPdXL1})1Y=s&x@Kir!qJ=63@!H*O=cM5EuwtGEn*LiRujI*4= zd1t4B7ob(^5;BJ#;&l_m06py$xxELmMz^8^7Gi?2?bBbw2Y1%#dly! zZ=R8AbptJSc=@4ue)uFyLt#e4Kf;~j>3?9US>c=B$VVB4J58mAFw(0CjhVOxS3}}J z*z3j&9fL~?`bS3uguJ1~_f5URiWdbk8GJqeo-)yW<*7VtVQNEVHQg9s1rSee4lPPV zdj3IhvG{kKsekm`H1|R_v{QoZ9~otA#=t~e*PqN_EMy;PyV)<{keB?WcG;2^WOGCS zIb5oFb8?dCC?&ELCc4SNMc$szpAFa@4!L-;m9tah<-H3vjZe63%xSN|kJYnX+sA;3 z$Xz7YZ@fhuzFp6p0sn$V*|=|M0ULw@!&p5|R_FHEZQoV(iixhXBqYan)UgC&S9$S^ zurrDq8H+E5E`CW3SjN~(wb{!o?>Una$H$SNoRT`01T=q3t(bFr#7v%#Qx7ca3VM=A z_}%Wx@N35yxpd&kwK8$TnNl{qSuGsUQ-PVZ6(2@8PXT6p#hP;wKlB97U~+F2XIAH) zGI$Ke2b_uqQ*DQ=wgeGE_Xh@ox5i#1Yi7*C63!>9Q704`RR&ur$tJQF z>;t*;a3{4zTZ%L^)D(Vg^Nk5ts8ttyZ_uoosxGNcrsX}@Qsl&%>ko;QYgxjxcR+*; zb~wsY7D|o)STEEbh$B#>xX}qJHd}re`N;_wX{$N7`JjrKAf7U6^m zwoX|fC3=v3%SlKPK|Vkb(^hwHejEk{(Q;b#VwP>w3pM=?d|y(SedFnuopQU@F#2ct zsBJ|%IxVScailhB6h5o~EW}t%|OKLrc zcu!lkF>rsgH>_O@h?+rxBD`2`A_>N0CJvj|_hFZ@jEUt~fMAb))k9X|=#i(eEk06K z;T{RF)vhW4x8dyIGxye9@oZfVchjuNQxU_YCj%*K*#Gl0mm2a~^j9r0HEXN^&n$Hx_J>A=Cq?z%fDGj< zFza{MBEDe<7(*oAAL=a;8{SOUn%=EhXmk@maCln{6nt)7r+yX$&4FS-Dx;h0=a`*7 zpXqZT7zOW)+P%qdB4A(FZ%H41k-m&&S5!iQvmKQ>7++s5-}r}DMa8rL?*=B|@4&nW zSugsg*rH+?Ttx!ku6+6>vnTGR zeT$Z=y`mF|JL+vv0OBSG<1tK#4y0IIaoMB8AN``A9$X;o7D|xXpdE;Bv~kp!>uJTY zFh8kau0*L-S)6S6>TUQemsG(+Wt$u@Iw#wOcix9jeTmk~O^3B37Blx7MPinMIlZYp zQ;{FzH$!c(RM76lgZXr03C2^|N~F((ir`@|&&&xD4zQlu zqacJ|gs{TnE|&B!^j7E_ny>2Mu;>F#dRSV}IHndC8mh$}H*enFzGvJ%TjdV`=oUSr zm;9m^y_|tErZcqGptqlzKU{(7UiACr$M;wE!b!pf`1Aq0NAwE{{YC~Jr#-QNGbQxc zXw|cn9mgJIctQ;)Xaz>Jx<&k*Xm|BFx?`k2VSCUF;ipr1F!PDp^=abDcZJkBLrmto z2qB!t(!&&lO-n4)IfEA1Y6HRmGvb}`#^BQ)hR*= z&2B2JJnU6hmMTv|3+!sQ`VH=TikSqe>9jnnJ?v~B{@Jw;I-rN}MKlW7SQQY@teOGZ zhK2pp9Hz1vAn@lI?t>ao&0?gtZoAnBN$!01Sy@wd>ArL2ixf{I{|@dz>8Ua(aKj*c zL3&BLf$xLe!Rea0r;sBb6nhrnE-`!^CxPSVdGnM;9)ao5B~~y4ogpLBa#Fy)-PC@ zq}w7zGis+mP}u2_o)=RsNWDc&iP@ND%sd(VN(T=3vQX}2?s@&xPg2oa7=AmB$D7o( zF--xr+9v0=YV59IpxS8>TSd4sPj4-@Mr9Oq$^N* zY)tt?*v6O*N6~-nPFh_E6^y{(FP3zQ?o7)pal)MBu{Y7t$#fJ{A8A8aC}K#7+{ios zYc31@JN-#U3+OWaP2BMwyFkX0C6w>5P(wV!s}8wX%^w<&m0jWj=Zj*s7-Q%udDjB( zGeALQU@9ls?ybpTzyfdgi>p`#ZyjR2#A|PC;6eB?vf4?9K4d~w9hcW-FC=31(V)ko z6=s`)Yg+0e3^=7|pFItEh6x^$LI+J;qME57AI18yflk&Z>EvOldQ2>Q!|AE@r&z!H zp=x;*8xIlS^T2)*)3IXZo+C+`L=?M@_6ywo#t#$N@;n&=xbs0Nxmh9Wvbbf5U3PYi zSeCzAr|Zb+oj%PF$@>a~StF6Ol>B8ZSz6!?-=i!c6xJG2N%KQ%!ro|~^wEVT`YAP!u<=TQHSoM^zxu${UdEsf!0>4_C0M^f1!(BvI`srTn;(522u> zu{rF*cWij}U>`Utq$>NnO$}2$WQq;0@wHn8CjNn~Pg|y(7-M3@uT^2^deQ5#H6nq= zS!PPQUohnlg7aZUG*YsN%?5KP5ZV`Nm4Y5m0J@=ujjou15#5x}7=xDP)|FIrhBFux zHUI(w@+cCrD6^D@BW_UTNi^tAiUe{-4#)>80fT;U-H}bF+K^solkArh>jj`RgYn8` zE~Un+0Fv!G!pEpH#DR0`2m|85%#;X^dNhS#-kh-)A>kA`p`1W&@oB3d`V5@@I4V6= zWuBIpL5x+2jWq1RHH0RYBk|dPp0a1W*Z_s`6~1vMe43)?ABP`lsy5u_ccFazXA zvKNDvIP49bVG$>`aQ(vmu+*9V1Oxpt_t6>$Nmpp!P+O1jB8L(EVHwbzMGwVieeiIR z+!>$wxhc80xK?>nZeYm{sB>D={I10Lw;3hg%bW$}N>Rg`7|H7xOH}g96Itm^Isl?Z z)uJqxCBZ@SL1thFO$x@24AQ!I-u^?ZP0jQXjGqn%pZH20>-?v(^A%@a78Dk?sRMHk z&f!Fqu|$-q&1e`@shZ4xH(FJxo2W~fsZ$B4N?|hwu?8*KCyg$RRYyre@zic8bxwPg zw8knO2IOVJHz%ZP%NYAV{F>Y(oB&^ha`)7KT<2>+x~cy--SG#Zpu@|z`km=5BJ~3r zoXAKzsOiP2jn`Cb*;|z}BhuK>Rq0Gf302BNtXGkOnNyGHl4w>&)T?D;(xL{!ZgPl> z4@-JY9E}O~V6AUQj!n1G9Y<$?9#_`2GNme^jPsX#3*-}x?L;glM(Ro_G=Muweo4>Y zQyyj*X83~=D>)G|;d@)1suORQv3oy*bGKAIdm2`l9@%`(ZDLmLNBlg+WREb#oEW!T zo$|Gd#$KRylcs}jA4WrTZ#*lArpe6sl#3q4ZqiLSw@CJ#Eb96jWFQWv_H4OU>KZtQ z8_uvEA3)A>F}XZ}3Q zAs;3BbT0ef_AI52y)gg*>_upQGT|UY!LwRb+Q%m3S>31WD1uhw=K`EL#D^8@M4ztu z?{A^2i{}N~+-JI!9RJn&`59lh~}x;ZbcP zA`yh(u;Z>=7isQDIz9BoHE1ux_DIBCR;GYI?d5Akc^Y%%{QX@&SNuqcFZB4qGiS=; zWiN8igf;e%B(+sQ7IWr1VtC^9Ofac@y9P=@aAR2FYHVU-+L7~&PMp;{YTi+cAapLoQb(X4d#2$n#v$XZ2qjjmWbfCUrctvC-0HZnH<=?fFGv zMZV!jGTQoY4lNxhHlrTtIp*{@LHFJ5oW3)KJXwhEg9p^h0Aly_k@=MW?Vlu)dF#3R zY8i2Z`u2@Cah8W9^~nMX4^XV8qwv);@=>CHs;>4x@mlk`HcCF)bUI_3sqS2L2km!LTBd<#<51uVqre@(&du5n%mv&4}OiD zsRTq;&mWli8cVM}nO(kwwAXi)Xqg*zTdTn<&}hovX!;Nj@y#=10lZse*Y62gqDt-@ zUSO7K?Nb}=B7OAbr_bSL!UWGvR!$4zTM!IrGMklLU-At?8C>?*T8l3hg0sGzO2`fh z!Utg)OE#``y6Bz>`jCl-1SIUj9p$Wbo#ZkfpRlJ?IA{m{EyEa*86G!VQjkwE2G0xoE0ZMgu>7VeQ2E%vT4g+RmjdUY-xy7l({%V#&ig0GnsztF>LXLWI zK$xwg%q!-6_tdAug!hQW6!qHkDjlivlh-P8^HaHrm5nvx`*d*S3gJhorX}i^lu*O= zmR3_KRc6dKs$2}79}C9Cy$I2X45+x)+@Qe1!x2Wl!;&yWBwarB&;RG zM*Ik3b)07*jRh@N{{u&^1zCL=eoAwfPHezbySVo1Jk0^jK8TfkgQ-%aXZ-`BK-e^ zWR$OlvHxJ#dN2G7v%hLZy1)JZUKhwzT}vqRL|1_Ia{ZH3QQP%rkTR(;FfsF;U z?S%wU3gq1EfZ%wcUo>CwUjYgx2EA&6W`_&IXxTS(bT+U5w=uek%54pciUB$&otlB`_cQ;#vg~y zyT#>iwk2V>07OnUkn5K~F>}8HM2XCt^}%iS4qCbvB*tPg+1fSabR6J`haRd@Z4k@Z zJbBvkWJL+1C?L;wY)7x(lLM}uR>xsK$!ij^AhU_@s|drV*kcPhv}|54!dp@jC*iZl z;B1L*zZ)M0wH^jH+5$TTbRRVA;inUdE|5v1CJGujTVW zU*dn}_~VMb6`D+JRcv?>xRrn;K@n!d;F#oV0n;;AHK_+LJVt7M_3FB|7_PAM9vPi`zxh=ld9Nuu_?P@K`|F$y(BL$+6HW~r=V zVH2sUTKt-0@m+x*@M9A}#k}C=uFX^&aN_^vBxxXYdIxu>J~kyRb&EQ3M18e)z>jBV zx;=}z17U0iQf5Q{6)Xf5EX3up0>NHiW8{YLjwEE#koHH~qFmmX%qkCk_WZ$$wNn0#N~ z2WB^H=71&CR8`sev)DlD^0amR!(SE2UARHpnmos5CXBvfN3BaU1162y4R&n#xOE^Y zG_a8OInm(l{my6C_&J>%JAM2-8WkHf_auZ*IChMiFypO0tgu@OLsl2&M9YfKrL|$y zK93lhK}5x$vwVZ%tNOT5W`ze(q9=)(w0Q5^P2(Vx$??@4rnnwm7^+|{n})7~^_bk! zl<1#jn&+V=G2XftL@blaTDYdd&&9xVm^P88c3iZ%6XisSh>XH?^A(3kx-L~GF@{(X z!_g-`*JNc|O*dxgrGg*tPZ|*@+`o(XZWg~VR(kyd-ymt~U?V-Jvabv9BUd}ZO5 zl}J>~TeR+}>X%gMx_@+yj&S7G5d~+v#QNmyHH@B`$R|Wub{O4vWz7!(x}i?Mp+5xy z$F)ou5sGE6SXY(lDPYBeb{$p2Dhr3MhS1*wLuyVu5ez6QM~U+IlG2V1KZA#qx6Z>w z`)jVKnG|r081pja(p)I z_@Q7=)FA6S?6Rm!A^oo_ggbI`@l8+g?YSG9XLst7wnaRi@OolTdF>CkK0Yt8^a*9N zZf#-aPdWVVfNj|eob;x(e*%5gOdc-}82&o_SI1xUPkr@&rnmq!7@XnBvPn9hMHyIs z#6lDz@u?y%r}Muef+^fuJi}M}86g5QH=)lYTU5^6vQnz)o6~gWA7lZlCj=_lsDW_E z9E7YN5P*u^Y1enIk3dHcMB#WYrkdJ;TJ%N^GA1HQ_L}RbCJ(}M+pYPf#jYzuo4c(; z3_xnPLmbnTm?a?KdO(!(FM=#gqO-Mj{p~-4lV_WEIoSOZ1>o!{q0mlXd6F8Y_4E3w z1yGjbnWYkw|I-Km^H+Pj{h+d%ngXTg#>+x9F2}~R#d~B3VDZM``6;+u8`;!jsBoC4 z(vZ;)!Ui$=eyD#K+JWxd0q?rR8kg?lidyEJz)_Yhiyz=)1J@=7?;3#)6wL-@O1Nz? z#94=Z^*I2rdJc#ojQDwm!IY|KJLvs0qF;0Za0ZI`+|@_SEJsP!%1TN$bJz`;5`&gv zi%;*AyR*0wen1XVkk8f)e3u?lRr7BUq8ma+KP?)i6O2b+w{VU&!BAmpWuu;zDkbyn z8%=-KQvuMqbr~YU{Yd*k(|$;JPE(>xJ%3D|J$7Oq$Z>Rig5%}US1+;?QwKb-;Gb>t zS$l2Icp0f778G zWS|h)s?+HwIS-zrCupQ#VzL!~`^!p>$+-I)1rNYjkkYZ9UHuFiyj)LOkMXj1_dUNW z_aWPQyzTJVYY_V_GX+X-wX@55;wD>mL!93Op^Wn~9smd#2L|P6n;h+{8jgxi7q$j! zPa_XjER&U%lvwQHeRM9^eK`M6=lHQc!5GWu4D#4^5o0&zaW87nlV**Nr>7Cd%IX5suYnY4!&LsWoDW;l%Gh5u; zq`>5NkAsA`!c#Ni%#87N+m8?yny3coz6>wD9*Pg8x3wNN`$0n4f7o9;DgjHdP~^}> zg6dCp9ky6e@`)`+VjM;uG>T+-fCjCH4BMbitH1!6sLf2+;6$3Zt(x2x8(wKk#a=C< z%+9wSwd8jTc;`{!+il+Je2ts+_8sNzGn+H|KWq4jr`>{eK9Y)3mVOw0Xj^@ zlMWycec@6#DSOAnPrSyA+;J^5#mQ-E41*xp1!KNb%jnkky^Y7N`rfnEB1qYX$z5nWBnmA#5;K8F|PA8Z?BQ{;+^{+3>8(LUJ8u^Rr5ib97t1bjvO zVE0fN?qlDzB<&d7yksH!e%Qu_SA6(4ds|V8=H6J04T?_zA%?bOfL9Y$@!a9Vym^}j z_I%CzrJ>YCV{mi*JLDx@$Qd_vd1Yl3lph44oR-AZzM0uBi`!WumaVIoZq5DfDFenW0B3rJ-ddf=gZ$!&#i~0u zAH!OW%Tb(Y$26Ql8Mnzr81_5Ot~V4xG&d_=(V1qc(fT^)wMdG@Lb^msFvbY8z@|me zEAw#3@7KB4SJpDWL`@xa>e@%Ln>tc|bKkaq!q-{wTx{WCt~tt}R94F=Ix%#yoIq0f z+#&U$9F!MZfJt3xTD(B`7D06gS|OTC-nI%?JWJ+xv519?vw`c$|A+{b&3brKhd$@cuN=b4c2&p|Nc z;|PCsz@Tuw{&qu@)njoTz?%23tl$lM#yDk7R1aPsfHICs*EyCbg>di<3=2{ z`<1&3;4v zE>!YQE~Mrh^Hlb~4nB0s~y-wsAgc ztjykF3yxd66U=tzKw=Im`j7-)HQcj_^d3VEVDBwjhL?;w>eC(-m$&WTEz@+uE#Mxc zn|iGfEyE|1_#7*h6hUj%ojt%~p_I#)hUbFts18bR8w^)-t5NKgsx-qdJN`~5H^(gI z*XJwjE2X`g;qDYl4b4Aj|H7)ya--_x%Elb;zSkhDFDuO1|D*4SD`wi66abdngLy*? z=o%0(ILxitVapnRaun)y&R`knW5y`}*Bm1$)y~E$2|YHV7g;H{nyD^dAzRESD7Imz zlR87;F5BrA4;@iVa*qzd9uZ!IUD0xi76+*nX_plA!}=yFkmzuYtM8vtV@j`7kVZRo zoxr|EQ-XRS>C|Sch4qX-=%R<%be%X^@QQ>1nITs$tR2xf68J|wMuVmjlxY>YWl7|e z9piW1|7{|B$Dm{GNMsDq0I2J^tc!ky0D0o~%Sf$6ER~NjnW8UBsAuMsQ)f6y2X~s& z$@k^G5)Z06f5}ugT0`bMgTKR>d!B$_&nTyzTu;OrgJ?!$YLm(FNBUo_pDwwM{H0#b zuC@)ng963Duua+iy2=_R7+tjIoXA}2b^1@%iv7V}@w>#OTW{)O0(b||iJ2}fcw0Po zkaYGW1Po)7JHSeeu!Y=8_wUXf!-VSOyhtJn$_ita*lmPITbFYM^Omrpxyp)ItoZ67 zFPI|Zvgn4M5duoR^sEfkX zBQI2_BjnljqFD8JU6L9cXRHSs?HT1BU&tU}d(DNf-Hun02GGxxJ8oK!TSyE}WxHsw zS;p3^*X=EeUR<+)Re4OAFFT6-(b@IFxq~YdNw_j%MTtYN+)&iaV6{I)Pq$9L_yt@H zl(9aJs&$nM*$7!DZ%c9QbyUPV8AdPm2T+n1d%U%L&|VC)hefn zLzYI;bI}7CR@I56#7j2S>0v2>;mK9<30|SWP!vJ`@Yv7Kk^nsG{2_ z3B%%-;4@!Q{=}Yj_&`!6;2%DnCgDAZJF@-D@^=*JE)Ge}V&sFkFg%9#Y zj$k1&918GTU`%t9M{p*N7RImaqoVEfkH+W6-5uudQqS`~q4J3OP$E_6b&L3sMp+Jh z-Y1d8uND^tbAJliHo||DNKL2xbR-^8_DUq-0BYi^vAod4sx#Jl-uEfg@PE*FwCN%!-sOq?88Gu2-&JA8Y&- zplJp)cRWj8fayQ#C!OI!qhD%JVr$v{QGYR1eGq}XmoqlH5mp>W*5jzU*-}%>(o)d4v zc*>c#r$5kS@>KAJr^4XVD7~3h|FhGOXhNq(;(upGzR7XBi6#1l$^$e{G;o*EKlzBP z;;??@BZi-Q${D+t*q!hEl8!PniKVlprerUYW0nNR@xgFo?HkgYW0OiPlJnT`bHnst zaudsLw3<8kf4F+b;LL(>3wL506Wg{iv29Q6Ozh+fzu2~I+qP|MVorE-aL>KxRP7(T zYX9r%{dV`;YduRw@KNR~ExWknxoZwo`1jBy3=hth$Ali>x%=(q4WRFV&`bPIAO0hq z4BRvb+06Z=yy%F3i{INs62KhwFD)Q#;eNdHtdNm<DW0LQGQt!6Gub%s<3p!+&W7m+iRbFcs;T{mmZw=@N6#XXpiN znap*iEw)maA9YZ4DW~GMB9~zBM_*-J1$~UmZ>PxO~m; zkFAnlc#ip}7BJK*)AyY--?;stOa^Nc*s|PQE|sMMhrZ+jTMByvSzL{gL^6`cN}mD_ zP#Fj6usgNM;T2lY0Z9an{61ysa>8LCI`F+x?uv?A6U73fO$vmtztGT%^Zo7W5#pK znBU#O*tcd>@Vk-QL)cv%W<5Rb86TThA}okb1q0^~n#yvbOhKfm1S!msTm#wd9tm_R z@Oj_X!94FvsbxK>&ssbksn8s$?!-i2qyc#u8FT9Bz-+>%J}XS|TkvRUtON&m7+^Kz zKNe?27%3i0z!Y2cIrfesFc5)T6#O74(jn8t;wkg)3V+LGx%ta*~>~pr`9mO7+70o28T} zF`u55Z*pKtU0-mQ@n>S&t8xmma&BZ@qpTiUsD@$dOio<5iCR;fDyY39y9X6(h?!>{*7%3Hd>#FQ`O1iPKHo{?N_ zdNJ8W4120RP3wlClJ7;; zdKkJb&b%VhhAYd3y}poLxMU8u+<7H$ec#D`fm~!S?u78Ej|1#Pw7y@&EM>Xj6sY1|n-G}%UYB58jJ z;!e2B{0%dDJw%sVLYk6ifWK)ASM4W#!(aqlkq7-~%ip6@7Ucm8ll!#E+nfHcs+mgK z+}rI0JDxI7kHvZONWMG~!Uo$Bv@QE=0B0C3mQq1yDJ@*G6hc86#$V^;aYRAj^cqEs zq=ghK+$#mZwk>LeBu-T!GmApjR@GS9i9Nz9szWFztACX?Tpe3=nx|QhX^N{yuJQt| zKb>og!?0p(dA-hgg7>4T0UB@%Xq@bi1kX-UW zJyl&Z!vi)lGU733_w?^>es-hvx1*){K}yipM)@xXZRGhE&p^Tmn@vjd4?<-ko+I?l zMgaz^f$CRN-`D}rx3fqjzpvolmoLcE%ln5Xvh-6h$u1wHYX2>=dKkul9r2gDkH(uH z`Xp94J@5v-KOt~o7!PCy!&MeJ0JGIZ?G!bRSdZ9=;b{{I#tm(*h9_InjXvCP`8JtN2JQV&vGNLQ2x^Z$~>scQ!&a{ zi%LR0tiqV@D<*Q3Ea!tSo^GLiNlh_Z2-;SPMAaKPZyBtz-HjJShm_C@fZHuU_^l6) zE#w<#JK6a*b`SCbmBv@dV2l&qzUNSY^(y-f&C_(X;TH`7Lw<{KZKzxIz7mPXt>%a% zN&%bV;Ozz%M(@9JY}@{v5ac}T4dVw7sZN+>4AYPsFw{}-M^a^8qEf;GN~3G!>VuL( z^`&d?D|5D!w~z01l8@$jz$C)!r}9Y6jrBVa3F7R7VjK|ZHeGc3p1`(y#m~=#cTU(E z)c^t?Vr+<#-=~=>j1Kqnc3ZPl5VJk%9t8dN5O#e~7Dd4z5WO?{_X5J5Jl)_HE1Xj@!rhq4w-;w%k0Ip?lOolY=H4HgD%@sERyrY}xU!8Z;cP#(%&-w8u0hAcAp zM>U9nPIx7HH^W`G-!xo*L1|d-o!{<_qCSgEx>$^w&~HvtRnv_R^XP|7SQGRQ#HX$P zes<^EwFp`+EV%0azg@w2J58cHNDI$vBmxfjbDD4FkF+uVSLYkJ91mPhvvPt!h`_gyF6 zGsfOuf`7UYa>2gfdqZd-d@+_v4J}w&@ue;x0SabK39e*uEC~&9jb`_i)kP!@ZoRuP zQFypUtL&O{pBBhX&{WXnrGewMU5jP8CKPU}B)^2yoGD zRBusijG(LdIL*yeRN@Zy$7=1;H;g^Q2{~-Gvdu#=tj5+nrK!>!Vi7Xb*>r1zUF{iW z020Y!Vi=o!vkn|pT0s@}dm$v${LI-hrmf^iqVsKuRlIJTHC3f(*6I z;0|mK)NYh)ln9jq4!tHu*Di6OOSK*g$m7Ci1#Yi8}*67wrw5uW;WG;GLM) zrknHvIfUrISjugW=ga0-XA zhvtX%RC~zlq2d#3<%KLxP~)#d0RrpcF9uOCVt)H!B`?CSv@q~$NZ||-z$!pGpvTZ) zsiKT1qLlL`A%46ym;rwX=%fn*qEE9;;&sHx+FWpk`U6WE7t%=$6kZG7i^59{_;fR7tL8#EQN}@*rtk)tQ;-LtB zjufj+hO!zN3Cm_GGk35F3HZQT#_7TX1CL0$dU|@iaU8;>#fMml0vENgZKpNMvBfMW zx{7q5!JEzvD@OO&+CuGzOy%sy8Y`&$tJM{znfNpv_`@PJ%1A;RUV;J?%3sj4O;?rt zS!g=IRkS_LQ94oIF`7L9`a>nR*d_VLE8!A<^75-Oe+W(PInfBjFfwg&4vz))OomLHCL~crIw)y%m+s5B`xB?;zH?lVq;}J@i~T4a(E#r-Nc88f-Zce^kYn#Z zNl&211?+Ek{1t#Sc^1lBkdR8RKO-{48ZScQ<1HpvW^1sVm9;7ZI7F?}dAd=4JVna$ zo#DUNh8HACRARHHq~k1=xHA&&K~9B}d>9pJy?@0<97PX^Gx&(goDZ{!HQcxo^vH1b z46RaGlO_8rK6h|vI$96Y)ir@z-31oG)!6EQ392>6;X!z$$6R3k^LxeuO8syNCkJ-1 zMCF88Y@3*9PFPt2qSFUrCYn)x^r?CM`EGfILqlr zP?ntJWfa__O&iS}H~Si*!!>-(RK&~{5@h;bYjlD-;LSuc2q#b@BwESg?|LFX9HWf> zd5U3gF4sG&S)tR4>2F#b1yY7#x8&HA;T4Y}wM(MCNuPuO*ad=5-+4UpT9X~_r}&4^ z@mUZ8L!~lWY7U!6wlK*4P!abXv4^?06?RDmuaag|Z>--&B|xaur&#O4{baYIoT|)X z9Xt_^oJW7=p##3jyjA9+MeyvAfszsdvN#-#4R@sMm|r%-75a~ zHj^j}m0moS9HqG0FHV{!yobUM*;cIV^7n_gA~7ocA^kk>6$J>*)XZ-PyjXxQHtT}u z1l>VK`M3vX3%x=#i{vSM)XYh`Jndb)Kz^`zqwVAa@P)rsQECxRYBe4u)`wTMd~17^ z?UX~O8(fSlKCONc$}vbgeQrwR5<3IWdm~7?)PjlYzCnZ?p)vC{J%!C%$~qAZ=_Qwx z+08ka7RK%vVAy(H=jS z>)dWY1%;{;7_TrpTTuVUnZH_SQbf3WF{3vD!IE(wkOLU#|un^6Rf z1sWt+_9kA?JbV| zwo%{Pgul)!&W>8_KQk?FaZ4_^i+PBVW;a;?2Y50Fl9^DMVn~z&8Je*dllLU|Tmy&n z?~aY3J3>@DfuRNAdL#@Ljjr8AO;M5Uq0P$`7CoUqg+D7!Tf?g(+^d_Wnp|8;(`9L8 z8KyRhf)Z)DUTEZl3X6~odMzX^ZQ+(w>4}!raLc=Z#*OsIu(|^yShsB=k=ei9q4KH$ zyDog}#G=+Grw+<|4^DZzB+7a&Re9|YsUwVA-U^z%jPy5tgWN$sfOCE$vq4IYO5QH> z&;Lld?WwSS_p~ zkuoZ{cqN}c(al|I|v38Q>t|3#B;_Wi0omLmcMCobM004_C7qVIn?S3U3_(IQ^% zjzE`nP=yK_Mnn`Zh)a_^eIT@MAwSjg-dQU~0W%3-ZsE8&kz0N<5qiMqqFliH|4B=K z(dr4c`Q|i3grWTSA^I&DB}lQig2G9$v;Jm475z7?84*Snxn9lvQ@02lsw!K zMGnCN1{hG~Dv8LHo{<2fx}mM(_2=?(YNh+32&w5(*jA(Cq3J94tEi&lEfYS$5|!!H zh}p^PIP(wSZR72)&)rH-&j-vdQ}=y7ECYnye{O~39av)*Rrt&-?#+HP#6<)2;NT-@ zMW!71i!uV?^|JOH7vj^$5cFighpU8U39EvknqWI=&U0Ddw`HxgURMEsEr{}F#GJz5 zXQ~-y$Yr+-?Kgd+Q^gs~j^U?woAhHLfWNeGv~HP^h)<#lRf@%(B6ELcDAn|q7{N8O zJlI*V2e$W48PZSCUwq1c@jL-UAVPDI^OS}-*qEv2^2TOo2hj)o>nm8rc?J+vD76?4 zLpX)06Bs35d1otkAu#Ay$7+wtn+qXOwXKMMPZ2$k)5jg0oM5N(hy#RQ|NxXSmj^cmK6CoD-(kYpoh2PjZiu^;W3 z>oUtI2RRHTy#T~n2vuK7GW~ws-S>c-^v|V+pm`hDEMDN&BEDVohU z8JZ<+-C=CRs;MERydjz~+4P%zJ_agxwIMPR_%|9R@yj5KczJkR@`v$K>U;+!G4zFh z7F_oao2;V7mjP(Qk>OgpMyr@7b@W_^hf9BH3S(WWtcZm^WHa;vGA7NFXQ=jq`Xksq4mnXudw5(# zZ607(-rZ@MF<2Up1cOEEDCx z7`4cyDr%1Mi3gvPUv=`=*VI0dEGZ{u-hy5c%E!}>0X5I`JWA%8riwQZO^uZrMfKV< zbGB9jqc_sV_SyiSXYyJ0b~|81H9dH3!l!mzZV8~6??=2Oh-0ESaCfT}ae&1M6gJ8a zxKrm*Jn;ebG}AgNc?j|@xVFpgI8Fdleq5rH3$K-mxkxpI3F)&1egn;~<{pVp%XMRn zA|Dc%IYV(Gf++KlWr+PpE7W|9nz^EG*Jq;qdFXFDerXhk6{+2Bv8WHO2HoOCW53+< z(-k0FU-<8bpia(-tI+Pi0z_~ZYCEAV7m1w9k&unbr90HMG|gpe@blqc*R#Zk?d@h$ z9^VXGYC=_-Bu8uh zGN4p>oOx`x{BZI=-o)u8665w!--b63$SXizktWB?v*M;;?~F9QrFW#lR)9v0sJ3C)Ln8L4(ErdmdRK>m#Ps2GF9&4Ok6D!qL z%}EB8tK*#~3jUql!@T{Af#GDD6C3+X|w%w)~DjbX{*wKds_iEK^ zo75J{NhsThWn7W+z+>T|`4sHbZ6Jd)EmwIyR2Tg1U%y1L6Z+bnB2rN)7a+goUvBP8GmL8x-yXL+1 z&}hk>o&W%Y9HLK~z6>8?O5a4?>G(HNyl4KfncX*W+McZ)xd+NX(^|L>7RiFQ9Y+jw z9noE|cHl{uy>!jrg&mOG`VsyY&3l2i(i)CzW-Y0oj4^{*cbFYx#UT(YQ4Y}87%Iai z6^b6o?EHr(&DScGe8({hiv>%=0Szsv;ZQ4D@EYKBFcvTZ!4l3Ich+ARPVGH7D`bd4 z5NN@C%4_}GZJMPFUk3b@=_#W))XvqQ{WVdC&LQTl+Rbh0fzNu)W`ymkbXKg}3wrem zLzVhoy>CzGNPkC*+E@fZ2zQ1ll3n|6M|oU;0(Yt-MEU^tx}XmAvD_d36We*`Bi+D_ zh)lrKJeR8Y2Sx}r&Le_Vc$(iTzK70b41y*r+noZF-Ec38ZvlT;TKzqZdDtVg(7 z18|(PtQ&ilT(~b)!`)g{2xC$w9S0m?(`*17wEOvzuKb99v zyTq!W`P>m6$>*r({Dr+H+KJ2>D=0Ni+bCuG9Wepq z&4IodsKw1=8~scFUcV7OEvTeQa5bftPqxC%Q?;-U{kzuxdZ386_cqRpp*@HWkt4wq zPRvoV6=z_L(HB~aM?15!X(!S8Pe06B*FN0PQl0s0oW2A*qfE|s$V@-aX6p~yM^@sE z=*<@f`lJq&_$6K$X4}9?x!c9Z-(Um!K*y|XuUOOJ6zSuy1PEqzezyr5gz>-XPEP|Z z{C&^rI8D?aSA#+{^F4qww_+9t?5DmmJA<<_c>l0JZcl5tl6}LX^Y#$nXPwfs8*nA1 z2tfu!9w78~(KCmLrlkyGKxx?xV7$M>#FD|ghdEKDgkNJM!$=tq;{5zg!;=89vi0*M zMWEmA*;u-G?V^X&LJqz-s#T)2W+iy3cPt8W`Q9W1i$C@ru4L{06{L)25*#a1p90d^qQ)^s|z(ER&JP)j?lg5`S8oNZnXLyg~WEX3w9SqaL_@ zf&A|)_P~UoAA#TX*9!5+55{l*jHj)kle4KKI~ONo3KJ&?>^GAMGNGmj1EBu@LjK^x z3JO7&f6e79C-})1JKR0is#bW>4NPwfng?)1Mn-msSYVl(VLEsAE{+{ zA*aj^Fxf9k&wYowsK}OTZEeEldvMl~?F&u`9VGktsPOkx9;DGLa%nVi2Zc(y9^ zIME|)IAP028V9PGBAE#e1lP)JZmmubK)ATm0aX<d? z^DL9R{YHBz0S7E3@Rw(8!A01>`w`?6gOSQ zkzOWE6@n$DeNzXOVftv70Gr99dvzhVMj`>oV0+nNfNkVTWPsiT2S=jmrwNzVZ07h? zT2*v#Z=rwf<*@NK&7jVt7fbu_#dUQgjBI<=9zu{mWbn0k=E_84q*tf@I>98AJs~S< zy!VZFzkS`_@BlPRWHXOtv5U?GPrK4TK*F0r15DwPwY67B5nAUc(S=wu4+ zfg?-_0j1)|DXZx8+Nw+q0tCd!^+Sn-#lH}4Dn5hj{0#ZA++-ogp=0V$2t$;VPfVbK zQr2rD4OZK5dQ{fdg{oQ?E9uiaJfuKm&vAHqfY-KSgLZU#`rh?okBG6ae6 zi%q`qvtcr+{kxX_WD^WD5aQ__<9PSK@_7(o)Hy26?O4wnQd~2Frq#s2T)CNTus{)5 z34eS846dyT^qc%MhkpnuBos$tIvs%fbBh7oben&IsZ@DD(j|ctIW3@FCN`@CL}Cw| zyad#CqjzW$LY)0a^vDj7?9}xu{M2gl3m2&26V&*EqoJ?r!A4R!QQdByB{ali>7X(* z>KXg##oxR)?bF#4gKIjTG;9ZLoN)zYS<*MDBkq0{E~v2;UKbW^U5l_i9n6-Ak+k|b zZye7PG`N)*WI`lC-bSXX*&+XP)5LStm5H3`VT4aMI@9LPEK z1}awOpXzt^tGbYH=Dlx{M}~##B0ytO9SO?DtqrIk9d#;#)Km>B#Ojm7(u7!^=bf~W zK<<3N{qGt+i3+10@eNN3#rrQG;eVBEn3QZADAfP*5`M#!{;-T?$m$D624MwYG5zAe za*Z>b5dQ5f89Vr^R&7UCKOTzpTF!j?SMJg`e2qcVnzO~KsoA-%Dqr?jc~i!BCUkRC z#nxs1mi5mK?KAG@E}H}?=$(}sZ-e74w`;9Wuj#gv%r~xo>!dLtnhYHOVgq#{2rxWG z0Y6K(2p8g;vo-6^NdSw`ZbkVH{AWlKRik!a923hn^mt1dFKR@9C_|hl9{=|A*s_h! zRKxSQpk?ch2j(bnZ0*IKA$)MF4s>@2X;(`xHo!PX{x`a3&3MRLan~3;7_^PONe_Zb zxGunwM%q5QcfZVUJzwkr;ZYQP@aNH z!-0SX{EmkQmzNWkZnAyIy+8Z{W`l@JCu^^pVj>(8Rw+yic3OiO_b2q^#Bc`LZo44W zlG}}D??%ano;I7#EpeK=Z%q)7W0H4zS zV48Afgpf^Z5pmCoj-KNp*H_I=o{WqyI4Mogrdz!)HCcu;y7PHzY%_&-?#668rc z&N9;2vzRf^u80LS$sx=}7<6lXexZgHX~leII+fmORpV99Ny0+Hb!f|RfaaDpc|QN= zdaN|gfc1fnhfsbBr$`Wa=0{K6vRxVs4H2}|EOv+xpg6kQVJ!#` zNmE{BBDjEAnm6icU6K@-z9_iaaAsrIsB2_9mAJ%KEb(q&v_6Cn&8s0aU249r^uI(l zVRg|6oVP~;a}CgY>tS2=iL0U`*M_5fY{-mQ)6w6PmgTj`C6Q)201?lU6_YvTQ1EzI z8w~2ddA|s7y%Qm+>mkPLxot|2z*b9s_k?rq%YkB`4LANm!OmX@J;#;X*nMEX!jeux zXZx5|+O#4cA*afpbs4)RL=js%&>k2%2~s!85yZm7!Q98uE!n5fJeGl$gK9IG z+}}{ujlmrS?;H(b16a6<(zEnsrvIi$j9mCTAhcP!dr7n1S7ftnGMFeDbvUel>S0S+tc(`y%{olZ}yP+{(Kx~P)fR3gtmRR2fmc02EG(WXc?Lu;pIAMAxF%y>Ch zDv|&c$K-WGbu*ebRN!o$*E*3%fJ~7eGs{{DW}cZ^leR>@B%~TR#t4rAPQ64I>7bHHhk{Ji58A+NqERZ_z6(2I!5{;Xf%O7eK z$kHGi00r4ET1LOnXsXS)neL>MUE4k<-!@jaVj7+|wg+CCPB z*Eq^zJX?>+f2+4Rxf?@LDrqj(mqVr*E#j?#LyaP9R>;8p+ zzH51_^tGsZXRxbhN%3&=8Vx-&k6)L*Fmy{$C16vX08HD7;Urx*fB5F^hq&wKGGVVg zrHfD((j@FenQ$`NdyeUpRje_py~Fk#OC`KaLbE5Rtwk)^YZcJEkmxJl=wS2=TtmETjY**H6erfDU12Hl zE6J&G10rnZDWnw-raQf;u8W@0qoe>w~ zYSw)v+nj8BpL(_KT5u~c$&lVVI+t&Ot5bk?a+iB>cqdyc(pP^EMrZlHpu1e|Cmn9W-IRpH1LCzUzF z)K#cdb%HlaE~M|-EPrx(9JRiCR(Xq9OVe@?hEoj_nr=!1xRX7J+<~Q~SJz^!ayw}; zN!qVw3kSCoa(R~~7x6v|tije-p0Lx@LuvpZYI3E-w`>b0dUVm307JScM)X%!?-~A>{+AGt zm-;u!Gi|%pjVs3PM2M-=`jm@%hsy_Fod#u22VokNwIMl746jy|CV=9o?YJ~q_FPKL zCiAqws(D!4c1{LJAl(;2cirY8e;zZKlhhGVAZCKz`jJtR=}TR_MFK!l;roe#uV zRx#+)DgRYQg)B-BYsrDceT0h@OcSn)9%31L2P_{7>u94^9Xg4j zHVE;yjq5gL{AR0(2WpbqlX>re&nraJC`HPEKrRj0lq+jwQzPIZz!v#vpKsl0h)G&M zL+Xz9NZu^${!B^$t>Nq%R8KXG+lWEI14$+(vspen-PMa%<-AHS`x&L2KKglO3w!p7w5m%f4f@!VAj^=bFyvxq3chpdzuZ zX1lINz|3<-&mC9-kQtwMHwe2vPYN~-cKj6Jx}ZH%LmY=41GZ%MW^F~DSA!i%zaS$B zIOcBBLJ{&RUcnLa_y=yue!@shmO$P15)o+YDW>ZesiSlKfc(Rt;fBu>j%G|DEl610 zHo_X#J!q8OilFxXzJ8t`9>A7ePUVRj&ISKRObKVE@K%=}pa1~8?JY!9&!B}Ecx49~ zA`9X;IH$%#%u1L1VJ+T6ofL;|LKl^(#lW@4UY`romnPtF-PQg(h~O;P4xzC}Rz18h zJIZa?85w%>>nF|YVB6`>rc?9@`>}ma}}p97GA?u~uO^ zWOj5CO2bfXfRY5U8+kU`BijinIAa7P4t3B0L|v@7{vvFSrl^04g2!+Fn}kF@#IU^D z!Z{;YabgLXL1jdlIVvX!2Jd~6I$64s+QR~OsLn5;vH%u z*M->3`D@5+!-f!uFE}G!-=F!Hz({UH&ge$A&%fAGrPJ8kGM!+FBhNCN4?K>*8GCkY zQJe_z>N>?soQMIraR9Z(9bJ}M(1XT&udvl&R7?StL0n-gBB)PL& z!+2$(%*wyd1f%zIkPIP1^01N?%vAI(64&yi*e2qMZt^Wqs&HvO|MzhwfgXe+MbQol zJOQB<9^pUOE=sFGH$>m$qvwRVIs6n}TPQ3*Qo@EE8Z$BwaMCE%&R>{lZvnTb>i9!l zSV)ZKTuw<;Q8Z5bC|{SmL*Bk)Eh-ZMG&>9~_E)Ly%@00wqra6Taq;on?)(@3da%9B zd_O*K(SG40-AfW#5}T4n!4Hfx14i(3p!m&uoai<~iSK10S=LP@lW8yU>PNLkH#GeK zQ;MIfCj*kDlnO2Q2CnO*03u-Y1eE*$q12xkBzK8dme=0c@Ipqc^QvE>@&=IoYMr<) zB1>rU8oaoAf3Mi0J|U3!3`(;g=nU8T!=pgeu?Y#YPGg}cYt*=qY2uAWYjvtS z+av`57joLx91I1LD;Lr`=B3Fqd)UJOp~0<$tO9A3ikkIS;03&;f&(_w-x>Ox8HJJ6 zS!NCwt0@mt_>B{CmInDG4*o&?Q>CmF9Wo#GbGIO#Lwvn|OX{bNJyS`GuJ5cET}i5; zR@U3%`J469@B?v~2z%U`XLd$(mQ6+pvFrw%&%cTPhZ3G_ z_7RXoAmZ2K7Je4c7IF&$QMirUWEDauFt5iIJALI%e`>p9lYWIQlaoc!h_&NkhC!l_ zY_~@7`mI^gkQZj~n=MCGr5PAz8O8102cU92*(d+hjfAXtv+s+{{jQ#e9~&leN3}I!dP8oB}wkgmw5P>!kNpl^-n@R;4S^^Q>ETUatIA!S-yiZr9n& zn9Yf291tOZ>uI#ut@e1>;v)T~b?AM?YN&{wxhJ`__%BPcJ(GZDPn4T=JAuae2 z(pNa7@P(6gr9}XUcmcE!K)CZO?1-8wmSgk{=RQZVs|00@105lyfs}+YDI6`lnt{0M z&SO!*pnhYCUZe5C-=}NHd`j%}r7xzsWy8@*s18-m7O|I;0bh;smHdl2DMMQOpcRzy zrQ1^`v@RDYcvr`Sh3#7$kMjK!ZdV@`bm@l;0e*h#1zrI2UINig;mw&v2n7k)S2I@& zK70}>ryjo)b(xaNjw;=pkF5V5&qwYxSrz7GL#xn*TsQ}HPX3qf2d!q;EyOZqxN_+{ zPekK1kw}t?s!oB0fOX{UWmSkhya@`a?%Pi%FMTWD5GZ@xVFRINLpdYB6( zTeKRRT(EAT>&Ofu~$&?yGL9o<*SuFY+h`kshKV$g15$`~2NX`lE z<`>OV#DTg(wj!s5K2APm=shlguuu@Gg;>zu{yl6BcYk)buN@x#J{9q=V(I~V_1m_NtII$1E*!W4m!52a#cE&w)=dxLQ-n= z^EVSG^&`88Ts`vWMX+g8R=0WXCX^VWJPw?+WXCmL+A?Q`PqDVfpF@Mk(29ZT3li=*veJz%eI&RW)!f!t0|>tu#a zqORiPF0`1g;aEM0-^(dEkM|@!x-vANax9?b`lh477#=wCziaa7Y*+h0Xw1vi3lKYeaKvz6Y(1)=xzJ(y9c+}0c))#oP`raI7Q5NBea!^H#GtKPMX{H5cqgN^zzOJ zw;T8oMdE_YU=$0mffm7{2!g!{sO-1WfwnVthMTj6w;^thax!jwKy_f5OMy-Z>k^** z!tvd~-NALd^(tF0wL$IzpEk;*Q9f%wCuR;%>cx%nKxbetD@}61k(>SIdK2%^YgesQ zqV!C(&QskG1ZyDji<&_>?AHgX=hp}R@Op#6uTXsnYsr>>>9BbXl@sI%o3Oj(A3Ua6 zgF%|$Ih&-&V2SoZR*vkFh|R|0S0bm}Kx3E3plwNLkRoNZQB-W;1F3a&|JEo+e{*cDlhdN5l!J3+YX4Oqlzb97bc>4(@Xg zI<4?wHJBs$Zb23JO(j!kr|`t%8e&_RApseNk9sK*(xXu$F?c)H>~FpbqR|sx)7hck z-Duq?^}}ABNB^=tW#~|#*NBaanAzf=`AR-{ZlZ%DTfZhlIY$%+TZ3V6QxuI#b-Cj6 z7E#V22nVmKVT&v>c+S&3hKAJ;GAZT=nmlM}sy6D|uQ)0O_MS z7T)^k%i>SbSZrCaZ6DM24d`wCjx9{vh>pNzB2M1K2SrNuQ^Hgv&kYHr`3t%E$A=t{ z`Mh!4eu`-puxds%ufJ(mU_MIi3m`+~)!E)&$!EKsCu6A>C#~6dZp&v|6$s;1l_idJs?^nTTaDi4asSzjBSv}g?Ilu*Qh-o|EZZX zDzk@KB^C}jWTN;hx^v@DZrEy52%9OnSUI^gH=T)7()g;v7w8fII`9@#qB)D=q{_m? zD@6;ObK-_`@PIb5qS|LrM-vUKpE;#rGx{9ZgrQgfsF)#`_Ni*~Reif%xQ;tRy;>DY z;E|?@4RD3^JDL9Fh3S4l{C`ue|Hn)U0~8oV3bH*E6b9J;Q2U^Ne1FjlsNctENYEPK z255TxMqk4I;&+s-_dwPp0*`%@ULB-{b_`-Aj_aimMGeT!PuP-TF?2Og%R+!z)_-a) zsj|%r;kRjODQ3%6jre|9UubTAsxNu!Mv`gT@nZEd!>k3c0si{FZ9n^5d-Ys-ksl32rZGz~6J6LvG!E;&=iu@yKD!Z) z=cbY^zh%*1=&bo}E1%4VCmmN=CoGP|;0D+Z{Ebi~Ha&a>zJfAe5)JZVqx1j((TMZp z@6>Cr68m(Lfiu1>4mPJ6f!}2K8Fnoce`yQJ;n}AuUC|}kAru3(V6C{#;OI020T}Q_ zpi9z|L*%f>4wECGz+t{!=o}FKDE-Os^J1$?8Te= zc-!(`5}3+HYi3R6M`5E}n`R8xd|Z?k!FLqtOIDONMskiwvpS7@Cl(~j zlBv`L5Vgg%Ogc$ZKeYd`F-t3;*Nn_{y7gb5=YMvh1pu8x|5KA`}m3-3+L8B+9DaMX+8mb$&4 zp>^E&slL)Bn!xRRlZf}#qm|iexJ9(#5LheD3RP?J0dlo*su~%<6T2Md)w$|y(J0Y_ zmLfOD5nhF!&mT5W+>LXeB$VEZ&94F(1qIb~RWmf82eKy|<(D8NI=mwm76~7tYUSbO zf~lRavYWQD)JXWhfPVYZ*;*TdmN(w3ed1?6E62egiHe|ev#C6A+$z5z#e}jv+yv$+ zwl04E4HW+j`rI4ZVGN|V9KAvX#JwE6NScZN8SJpP{#$tKRUAx0$-3H(c6Ot{p|El?VK_+r$Xo zEg=24SKRbr`M7B@(+8eF%`P0C!C+wG#!qUAk4ee#U4QMzpUrG95uPH#74PTqom+Z`Gc^aeu-#*~^nAm$ zvn2qi(E)9XVf@-b8=Y;u?S=Xb@y;P%1kxC-=J#uR@1HRd{{Gq+5Pl*rWD(kF4_J$| zj;&*iJ0obYzP-01@1cfALlMd^MWiIMfth2qlPz;c8+tqH?Jf^5VbXkIIW#ZWBQv)V zFiIJ$!b;Pt={Gt|lyFb;;pEagH8+U?CENhtsGUNn9z00L&e0Z*h51cg8`>>A-@~~d zSsz{~*nr=yMYAR|Db*wQy6cB-+@59d?Pp7-(ln|v@{3hpQPV1!NfnM!PF(%D?Ml`u2$1kEM*#p$dvxBs3*{eS2>$KcG~ zt<87Roup&qiEZ1qZQC6?d1BkPI(E{rZQHh;^yGg|&CGjF%~b8$wePC^Y1dvi*1Fd3 zDwtLQobm^Ail>~pFk32U_Bu`|TW)T|3Gk#dK9~bzk_+Q<^Cq{98U1C8TdPPOXchA# z#NtYo;%QHH@fav^v(ej+HjS^$T3=eCl&z~sF<#ddNZQ1)Sq!>%$|S7!!M4o_aRSS| zNLW#E?3-fiZVSax>Ij@RZ?l#<#4D&zR6n-+ea7tOUb1cfmROh2CzQl1BvM0CX%xO5 z;mH8e6MmTmgQ3^>CyIWVc;GdSC%R47up-G~$QsAKFVmPkvI-6A$*$^APWKYNBPQT~ zmUZ|4?K-}jx|b^YCAwuoCFi#x(@*>!#5;Ddi~XL&`)ACzYv<~I;u`*a4tZ00UC_d$ zbf1^JM8RFn&);29AZl!%0%5-EI+EMfWiT4pn2j@vQ8vWDWF^55MMpYF!m&sWu=>nW zsEuYH&^^F7{DB^AWSADwD5II%LF$2`B3yg*qp-Cq03tSM*sWZim-o7W|L3ZI|Is}=`5 zx18T)Y`xZWm*vY+kn-`2jxI;jWD=(}ktU=lm8cM2ZB9(8W1J-~b;utjE^dC{t#V9bEAuaCDr5F)6c0 z1>)Ef8zNvSM{vvH_(y&7YHYKIdKEZu&yZxNDseQ)*n`AMF{=Gg^>tGeZZ(?5Tohf? zVcp4ORmNI#mEHwH0ra+H3g3AfB|2Eh2!kUEJ!;S7EzCY(okOaVK&tcW&LY*h zK{RByDYBuszJYw&aTd;$>-g7+BkQy4plsT}F6@?Twi0yRgb_on)SoenK zorpzLPexcG%h7R%L% z=|BN)u>0eBs9cpaAA@)#;q*&r3o+d^xX9(Ul7?_!m~|v zO`OqV8vosryQGDx-n>W>EdyBR$exey4Cjcl{sN<#DHKGkigYEExM|D0f&Upn=XeH^ z$q@~fSI<5t@WLGZM(%^l?l+Q#r#E_-jD_!=_#Kf`t7LRe?uCWeMo*j@yI!3p_oFyj$oTX)0EWB1%{?NRTn3Yj&DFxLV?NtzK&ArbEL-s7DhoM0S^K@7d(K zS;%|uS;v4TY;FT-HaM%QYSJ3T}rH^Gfp;E3O}YwAO=f>Dd`$1P=l<>cPWD@NL;!b`S(jvtg@mmpY3S_mkjr8R2_iMw$L)WJ0R~+h z@C{J@5(p7yP+6=FameaN<~>1POd_6f;5hj26-JlzbXhH1L`!_vTB3&?aoF$V$F&$n z8EWw3UO<30!zgZ5)n-moD*N&9)qWUGb`;bm8tEL0$1%B!y@1cy2J>qs`&ahzl=YxYdBIS=AThwCm$p9&6`8 zX7LD*BtGjon4SKKH9q;Pw=N+AqvlR)xj86cip{>lC?>(X%;+zFQx-7d9h}kS6LxsY zUBDixMP!fo)dE`(sxQ%-?@>{XGaS*_J{I$l9Ev@XkR^^V?|kazgwINSQXj54EUW1< z*BE6S0~T_fY5b($oeM2wIl!x$I{2zV2N8#-y|yHiapTp(CJggPw^S#EmpwqqDK0ptRE-{0(x z)|p%4fMb_#IM!CA!9tbcO>v% z#5g3}>==0TfTQHnT1#QEnLQq~h6H-_ExLC)&%7}C^teB0(n8(js~a8XzYIb5^kL6n zHYdoXN#wG#d7uerEadX7vNs>Nj!xX-o!kq!q5*X?Em)Fy+xBOu`l=@4#VA;;TsOyl#7@S3>c%_3aAikEkm(tz{@Ms5f9kc&Baxil1)V(tXC!Y zakV{M36%8v-3jCQoe`1cuuzJ!-BKJpw=Lr*FOlut{6hu3T?el@5!+?Iw z+ehNq7zZJ3f-Lld#GmGMe#^vJ-!UK^2Cipg5z4TZ6jOCjx|5@QxKbkl`}7&aG;UdC zt~o*zuvW-ErB1FUw&-q{uI`HdJwa>VYpGSF$Mr%h@x8-)$%$!@EwM{}1?rLfa+*j# zDPPDwYEd5t6~!(T_Iz&QMH%Ty0gPF(GEEd-o)|RZpw)a;Ia|hLg&B4a7%YX-JX|Bi#X5#UWo)N~MJso37+lWOcQ4nS!2;_9 zXZ&70?42#8mA<~fIN6|2+9yA!@`?8!zfl7BJTKxu)4I=GKz#O(Z{KjCzI|g)FzCZe zD4WOm5_2nQsi1ta{)wxxfMy}yQI!$^T`U&KU7ok3lb;Us%yavlxt|%R)CcM4kl(-* z4e$Iqdr|=On|$84nYI@lG6VWgKF6UaQXcOGDt6Qv%rg#zTd2zxU#2FFSLo2JiB`IZ z)R!za))63dnrjw2O6b$_9CSG(?-(!2jFGQujzHrypPnIW&NPg!1QZ`dX*SxTM`<^f za+ofR!ch-QhnoLj2qP8uyX;WFt$dFb;7^7<3LDD4=fAv;rLMLU-X)KQY>>atuRWOu z+7MN16i%RFyfvdV8Jq;$ECYt3hR>tMMQ6hI5Zmz)#WK35mDpTHXJwFd8(m#lja#?8 zry6t^h~vU@b@IPwf%g3kY2sJvX>gh%kCo*!DpI#??uTq2rfAp=VJcFbu(O2r$y11O4jG=D@jI2xu*3fk{bOV$Sxryw;FoI@5lu<2Bj6bwe zAS~Hj7|8`?SD$K{Y?3RA33s45L*^u4^p+bh$Yc~tgms6NIN72QVMJ}W_hW>(;GEJR zXyfXs?>Ewl8*3;oH@N97-?#RY6xAs=!m5#&0hM+cOW>mQT!gA6wUs>keKv7{QTl?r zoNX-YsU{^9Va+ag)iq+Wgw;qo85-H9Ie;(?l^?SEsG%2kNYHQRR46WuWlGT46LGC4 zuO2-$=#7Fw)Ro##qw%I0@8^Jk$#ji^s=4eEianO5%=9!v?W?&Nh-q6#6Ny*@N!hs?c38U!&X?EpF?OU zN0144tDm()X0}#%7VHuOw%@w^5xn;1jtF@^B27KMUj*P}>D=gZqreXl-3+=h<4Um< z?YkoA%~*f8oi>v;VfRPTNtX)bbtI~d%%F7S(gRIQLBw%C*q98#1_?R_>d&1{9%FBeC~?JPvS`A>2h%Y+kvw^O0?Grz{`H=m~ShTXOrl zV09peKLR~%Q{}jJ=4786ka;fx|Mz3Kp)f)5vbg(Z5h{wv4b{YSruj2&oDDO)Peif} zv0_iOtiKMk?Cf#TOjne^E9V7FPs?=q&`ub>vXr`P9y3B+awX=~9`?}Q&p$p|#NIv-0-l3? zdVKmV-eqxP>{X|`Xu3`g$(P>B&|JOmN%FMHD7#)lU3^ML19|PrrOg*A83|y)II0-) z2%XAqdAv>!Jf+{)slkKrgr4E4i~kCX8-u?jFeWL7B>nxbA^<07PLfxG!HO{O#1;7; za$vhzP3HPFeqZ-cVyikfAJ=A`?nrCjU`@^nQc1;F!f9@g9ERvN+>s3GRcz zIjHCYt?lj!;373@X& zf|R6hgM%DNvh_n|rMRQN=NWd6Jy5TAv9q1`)}XTc68VQlXRu2Qmu4**V-FCJ%4?-N zb4`mW0^9IL&A#kGBT}NMQbqmq1zcJqMu_K-+)Gi7OkEYeV&;@8ED?(d$|)0_y`9lT zcT9m-*rTyfQyQIgpFDkHqAZBJ=y~{B-I|-#>-NtLFK62$UqAeuY7ye93TC~nF^Vw* zS&btqSKb~$Rgn{?B3zKA)w@FS;k-0a2|m1JP3s@(3v-}eX>+ry^Nlgl9Te?0A%Ng) z9!yYgaL@#d&Ti~x8l_Lp^qmBZu70t{S)e-G+Mm&E10TSvkr`$6$DSpdbV9VMsgWKo-5V1AGf_hGioNj|)xDmYEg&O3uMi3y#hE2?klmrNfdIZ8W1VZttxx(VxW zHc4pMs0AG`6whL+XJpqLN4eLq5u7?JWX~Qkh6a8$<(*bp8aW+^Tg2^Kr$dodqA|@e zDRUZm2x3hZ(#2UEwWrfMFnI`L2x#*J)OIH9%^RcyN$PVA9q$l0Oj&Ti{glX@RRA=N z1+2D<+E=l?9i5QGwK(b0w|wyd3nPdd^Y?X6A%jNYY8_E={22S$mv&95mOILXLO9n_ zsexgolMT<7Q@%W2PepBdJUU?@U~ruYar@hCRbJIhTOfBE#+_{Gzj9tSO*@;@uPzQf zL%ag6Lhsjq^tiHlbb^KsnJ@SZy+)=-=~CfAUhJ0>B( zyq!v!!@aGOGz5ERBdzxGex)UL^o1bv?11tV221G1Hn63Bdp{Rv9l6}6;oxygX5ch= z0`c8vB|968(0N>q=q{cRvbz~>%R*?)7_j@T0^1GUg0FU+PyYHwhQ=Zd8Am0uLpdwn zjvUwa$2mxb86CtUi4D<^M9Xy~vJ2u;*hjW2?vk^Jhq=oeH&kKF^bYMK0-*ylzIvIw z;Bw}UZvS{cI6Di-O?$%2QD1COb({s_g&gP}!eln4`2PQ{`!ynx$2F=CpT7Gy@Ry0L zcPXE_h;OtE0Dna;cpg%ilT58d}*3sURY22h} zTGr6sziZjmpsgE0ciKYh>Oo&Nf_2$IZz@Ay)`R_>MqAf}j$ZW#8bjMwfjzDH1FfNL z%fWJL!2b55t?NQZulR5Ew6Si>+jzh&1O0z(lTLU9l_*vzZAKVHEO+_#W$r+;qdBp% zICeU$GK5GEfO@QcL=Q^W?Hoe<#561^-?++moxi$n+s%Ue9Yw{)E1WQ!U6F~Dq7@z7aP@kG-250|{3i*zcE+31c6^kTxGQ~)0lUT|joOQy}E@zzG zNK9DnbsTrE6rdgNV~XuT{E>OM0F*fS9*?c~3dURbz+E7u$h=$@A;iXCegCo$lGV?u`rtAL-0&Ukb?j$0qe^ya zX|LL`O=X9riQwP5hYS)IcS2=Lt+DSGHaSV)1aBMj_{nwpG3TZ3P*!nu+d$ALI;6iT z^g&}N8|c>n-Ttl{q|b=xBBBBJsPV1X={hres#{J(r~gRwVt-^7u`TojgM(8@ZH0o=U;l zhf|_DwA6YA9AYIH1Ek{t#__zY)&3FB{q0b+yGnPIEunm)SQX!0f6H!>;ho-ad!${xml--Pz~Qg)tqLvs;zJL(rp%En+0hBpge5E&|^uFI@KQy*3TgU z^4tg7%(|ZHt<38E5zt@0vM|1f1f4@ifQ%)=)?%-z+7INPyeT~RbLDv~1n=FiSypVo zmu7K^X=CeRV|!VfE2RG$MNjWO3XaPu0IYp75-tT5)ogLeO<&8<{D-Jl2F{g-4to8o zW-ERrla`Lf%Dh3H44d`T@q7pVW1#9HFbdG#F+%*yeYZuivW!`=Gh`z}<}u`ATQaR% z+TRL=B^4Y0^%so#;Pkw#30GoQJI-*1p8;w#&O_neSEd@jdwGU;*3`Bz5FTD{`23l|lXEAi-@o1B0DBN3 zclpZE#jfeQ-Q2#};L`X>$%hVGnI|1j?=~}yGfZT{xDpi$inLVV$limh&!^jMy4Ox| zoN#o3suAs?V+XPC7LxkRhKNtGE$Y3gnj=-64gXyC&4`^fhf)wNun^{mvL%30u_eNs z`_e~oucqz86dN+NM0ETND}VKZF|{wQ_V@sd_j>DeKwQ(uo9_${NQ_&AU698qK_+=% zOkt0U!AZ(Thu8Ry6tZagiz#p%yF?WfNyr}IdWR`nyP#fQ-u zh8aX#0sphH{@+59Df|BtlKhjBkrscNB}^zg?ukkJJ~x4A;Ai4DvyU~^$ zC^cje2GB&yWAsfl57yg!@wO-qB;Rw0(|~PVDDH)@ZADaTzjnUCF{-cI3rjgW(BCIo z!jH1x*ewexK-`C!QSQqk<;g{>W6a^eD#l5@Yq+}e9KT1I+WY722luMy9>6D*e9Gtj-Gn-!wC7B;6`UI(0@ zuk}vmg98R5$){+M)^yX)(yV)7Fkk(AVE(y;5uJqQop(-(dKmZ~cgoCgBsSrGDZZ7Z zp+5bC6n+CTcvsJ#%g@Z*7V?l9c0!|Qjg~doG}*AX(_|p4kz`ZSV>3&&3d>=)jhnwS zeJgxE%2djU*7#N2m> z{X>XPOw)C`6N1cwCXPk!2;BQFsaiitDJSlOKiQA5vMn}m!9R?5f4D4`Wj$<=B65h0 z4zE65lRe6^*PV6}a-T9M_QSsu{Yq(c^I4z1xQb(B+q2v1ntR?BSa^xHpD z3az@pn0qwBJxq zLS8WKl|cIpGos(EPQRmPy7`c9xJ&T0R-oe*k5o380Zynb%TMIuCkIB+1H&o>zE~?% zYVMXXdP+dpS*f`O~{0*#4BEn`4tT~ZxLfpJnBB3+P7fdRFUr#nz{Pix63@DZxbfjf!& z4)MVFqJw{mDw7r3L88pk8pTye+*zKM%_!cjgL=m9_~f+wYkN+3$~NDus{DvfIIP4q|2Q1S2nf_(s zq%gQ*mFLgjo3fFWWp#w-+zsC;2uOV)u|?m| zrK*|622=TGB#W9e)+N?HE@+G%d$fQE*hz+p4iS#NRB&5dQCb$(#ptA3sF7f)0uI4g z#Ta==+HrSX+#EYV(FWUx5V)d*m&M)m&Jw~aTa<_bSyYf| zujV!32!T1HPEwCGwNwpZg29Ma+%mfdkS(zSbfT4?u7E*@rEit*PxP1iy#wCd`l%fX zUBu<&DH+ih$9QVM$+qYFezP~={%);JXWJ%X(C`8|`Pi~Rw4WYj7+w%WFL6>9MLps? zr6gCXA;$aF+I$ww@1#;{Kr1&8XhEVSZ7oqB+t# zV?Ly;OgykzQ%n>C)dI=znEPn8&9FdEdK(g!vyWJ&W5Z(EB8xO)Zqgk1D}xjKExE6E^0l&k^a$Pw=r=e(3I5&c)L4w?Z@f_U3_7W?&QnjD8};6wub_R6n zq^<>@Aw7Qn4EXJa_8V=1xPzj&&iZFhTA8w=?6u3&Ey7sf#Zp=+mPL$gv{Gew`+}oJ z36T;{nS_-{f%HJr*ju@3eGcuNO35i!5?x1FF99M8Tup zvS>QtE_X#11G2Zjn@WOSR+?I)wGKxgzj2-B44?_%VWUIU#x(*_iQDh?T7T(ln z-9K&#{FHc;$$?K$p_5V7xvEL&9tJ@B3RcY%x$hU8mUmpTHg~|y6 z85kAYBl-QS+m5XA!t$(XRg9d+iS96;+$|9e4JBw6*CS)lUSh;lidCyT=CB9iIdqI9M~8Va-{@lv|R@3A}y(A)go zBS=f+u&ctGbjgKY-()~$s+p@AB1=@OM}Py`_BAlW{HV!xwV1W%ca9w#ldh*;ch9Db(l*YSEVljVL2GwI~xz^u_g~Y<2x!%Z_ zgWGT_B~;l(jBLdDJ$)Y5UtWR)JUCH zcCY_KC;l~k{rjNXd58S{pFuMv2x&s+9R$GCjqZQS#{Ze;ET#g$ze6No-tz&GhfsYW z#*#^5OoqbZ{DQ$tku|{492w9B$Oq9BsEmxb23?>hB{4^=s$CZrMll?ICEUly#*=m& z%#vC-cA?e;L32y+J&vTj2ffD^nu#JMQz+2S)-#z+j<+8%9*w8bb^Uqe@ZD&+9KxJ; z+u11bOpn=5WwrTyX&WsamBt?u>ml zR!&O12Z8^ee} zi_nE{TRvxEY>ytbF+d|eIC|^$1A)gB08A!6Rd9w7&dsS7A#c20>>k4L{GS4p<9bHs ziD~b%jscP08EuBEL!7)QlsBI*`g3oXIK+GE-cOHVBq9qfmSvlby%CPZ@DKwODvu=7IAS z&^PLKLoZZ*Va$9t?ld@mUQtuZg?4p%yF)zKj&YRQJ%#b8mcmGe?U1oZHS4kIB(@N` zYpd$&2=fGs3j|<>;Y2;jz`?-`i5h+%A`^QZB#nXVhX^L!`w#;MxOmG6Ctg$e5zWGv zu*(|7=dluyH()#l8@l=`-~XPB<|lO{OQ zKEOzm)Ln>UBt%&9RwjA{bp$w$*c;EpDyBMleJdT421HlH2_b?QU0N-)S#^4E6I6Ju z+^pb;{_-0*m2od0Kh?0%qHglYb;OPtEq$1Y-vvD1uxDTIN<^1jGYg41_anAW2U?s~ zH5B{N7NsURI#Wpi{#>+O7HZiAS>d zZa%C8nTWsHg(6UlqEDj4WoiC!5xH4=sv=)mct>Vfbg%2{40eMKGe_r%bgpGU zIELA!Cfv#5($HxcfdOKUxoR`15G`PABn@x>dmrU&e(?U5ihKH+35o&oz81W`IvEwM zLZk3pdCY3p^f6v(37;MLI>7R-VL=B3Iz;HHJA=FN=N4gl?+&Y+#d2M!D&}HRuua4= zf~_o#;hqSndO(+ATehzNJR_gxOmHLco*ruU%>V~(cD(%b>w^aEu(Vg$FDh#>!cx>i`K=r#eA*f6a-;@bgJv<2Z^FYVRIWewTher%jGKGvNrPjz;Kpql+cH!8$76aGNH8fGUt)oCZ&i!6PDtQ1wiLpV^F z4-sCVJSECMMR{OQ&=v6(ROVS-etS+N$8)KHevTyP;}Ji)q07g#^Irjed4UXJWb~3q z_J|TMTWFI~ehbLz2UUEQ!+Hc&QB$(Bj z1nb*_cJt}I8z#&q`}@ladeaVsPLl1bEyR~O347Hag~YTKlvUkdN6~6Uv+jC}?Rss2 zHTMQn7xS0<3)H6@AcPK+k|a6Fy7;k7@p|?DaDe}f0Zs_zB2DRbh5*O>@8whd4)lET zi%)q6n_&NSO89yQ0L)TbQA1Y4_^X429r}G&QmHXq1m*|!02p&AwO}524MM=QGm>q* z--vXkbi=ZD{afeiQz!a4pvy3f8LTap z#l*I~l*}^ZoTNk0)_!p1v|K%UVq_JqofKf!se=za=jbt)-K12;fh!-0qjC+ja>v;r zF|+bSQnOKMG_Vz+cAhoyq`8$-^6+%E(pe~^b$S>UfbZfR6e6m zl=4ZxI?$UD6Bsm_JnA+gl+iMT+?P&6e>dia_6D#V-lLeCH3PueI=m&b%V+Mz1_r={ zj8U8|O+3G=Fr5+Y!Huv-k_KN8x3)}8w}X|6l*PhBT(^gMG4;jqYrK-jb{n-V8KR*eJ7#%0VF4~>J?o3!q-C%nUJ&h*fkK+ zqI(>*q1@A^I7%a4^;1BWm}GuI*t;(p(i{Ic7q>~xG^#U~n7K8@9@xslmk(A<(uBK@ zzu>Ac!Ep7;QgHapf@^F2~!r(iWk$)drU`#~OF^)`0VhvKb$T*xB-5VQ;PA^U4zcu`u(_~{)@o_4& z-Cbc2HE`t0ng9y1UXExuS~VVn326`mF3~>qJZ$QXKD?YTNsq8Micw8M$QB|a5wVBm zHYXCXGHj~V&)A%D?9`m%T5hBz+5)}n;XQjF-*s$3d-Bum5@OZsU6VSTF$4G+!l=>w9^$m1OMC|>jn9}>3x;07Pyv^_-6hQtC=I&W^u_m z(l(A5cVC-ZOlfEuORv;hcS#R-ArQh`T`)`iBWMHI-6lR}rfR3JX?<|B&KSLK@6_knfj#lB*Xr=#+Wjy~!6u?f+#z8N=E^oCKVP!}S)(y<(aFB6l+F1|NNAUzF}-ix?DEgjvk4TJ-Y&M47Q zgR%`@czgC;hnut!n0Z{~tMFX>ojohD-%(q? zc=!wdpP8b6I55*FAU^>Ay(W+ML!8!t*`I_UyJS z*WX`J7c36-fJ7wJ@Ls9_GL_VaaqU7Lys6EYQw#5JZ;s(Je|{KWH=ap5leEB3mh%t} z$IDHQr|b=`uD|ckVET|+8cw-PQHc?>PE7ZB&oW!kAEk#K<=EH!U&!)M@lu)K$zE#? z*boE4-O=)hP>5OJmXdD1@bSg9Xy&kQ%5JwBVKlZe;5M(6IpI2#Z4vcv1=0wXE)AmY z20G$SuY&RzA*>qul>r82;^f#BrG&)5iUYX!v7Ax22pk&#O7F}^$o@}z(`lU7$}rZ# zMT>4sfhrMfupeej3rdd^AA7|JdsrEaQjrz2-j{RiR&OGQybIi#6X&unfnw;#}lNbT%ts6x8?2{2e%hg=4_-g!hVUe4iX&z!D)aE1rMu};DP zg`i$`h^iy?Y!89j>sTS6e znP-pMmc~B-D6u4Zw7Pi^T*pNfM}z%`djIi*s(ZPJ%GiHZA-s{l>f7JGrFi}Tp#!R0 zIAN)werD5HSidZ|oVP?}uusksYi5#5WG&aOQg5p4gRQYd%`M_c7`eyS4n~T)WF|LJ z+n5vZOF{=WQsjY*qA86P`_-V6zje|DIlhL>^~p`{*pWX?i0dM`kL8?VPpm&VZ9R3m zZgo6ul%#w<^`d@jd=>+_#n=x1E(?UDg@Xix(LxFbU??C<&c}v~^D8SQ1p-1#=J~ZG zZKTtRv-RyZib<94@cSmRW1jfT*k2C%X4A~gSr&?ValgNOV%5rs3I|y>E|Wqlsf%AO=dm4U+8<{U!{sT|ZEuk4p7 zJXHoFQScf0XENBX8r{IY*HlAt2DS%SJM6v-Q}RW3E+k z3XnF(4MLAAG}2`pYZF2peW$JE^+@g@J1*mVU$uy6W908Ukd<|~LNsPk^CCX;)j<&UyD0`5w2)NvX) zx^rt5`mleY29E;CtOf2bu&)rPalX^==oo6@9OA$RSxYL+nUU4WQ z93{yUo<$MMVc$p|BfJBL7-*1l;0}V11^g^wU|}ZirLO@}hgYWYkU-xMWF}l2M8|9w zj0IDY$c+m6nVN{pT9|e%SS~~%u1GUpUsi3(>y?%})>I$R25Y74#Py`Z3zomK^AhY> zMBlju_jH9PP4^%u>{6=OIcHBhOWWW{qqFk{nVpDppsEg{L``O^_MFUN=k%CS@QXQX z9_z|EI^F?K$Eo>whi=@x{P@ikgL$&gdY+MnNa8Y~B?gM=uy@9=ry_L4#$$&D5MvKh z2P3Z|rL*ynEIN~TUA}d6+iSpVGq7-EG!AIIutZZmbAHh0m&8lf6AbM^;asetK~}8< zFknErzX4oUz+OfrO&Pjp3WtWDql++$m@1rWqX-WwKCe>vDUaJX9x}eS^(Lv)&6OWYtKo_m9I`2t1gQ+WU+&`T&g? zlZ8BnBfZuF0dQ6Nx3E_}l)836Hs=$W2=L?rp5EMyp&R@tWFj42zPNOw-6oIb zxfYzobJk8P7nc;1Z=;TGkZ+C#N!n2dWEJTmH9q2^DC&H@G1WbqUEPALs=hTYbpF5x z5p%!1vc%BAh$hFdYr1*QLF~sfYJMmx8t_F*P zEHt3bw{yt!>IZDDy*2(`oTHt}d{^L*yLHp*{YB>$prVoUWK9Zo#2zvFo#Otjw16+F z;4O<7Mb}=tI~l6v<7}D7u3#e?4cA$Au{BSY%$y1g3Kqgn$KD^zZbSjiEz`vL_Gq?-H`EhOdeHl=3? zsD6IODw};iU6&QBiOz1Glf@DJuH$l&9?>=<*<8p<*|>H?e3=_xkRVu_B3K6BRiN*g zRux~pO|Coe?K8^A8b^l^eiw+#8tS?7fnf|UWLkn~5<@gNX*hhFiF+Gpy6C5;k@xx~ zFR#AAayV482k9bFmUxy}tQLRe`NS8@Ddbz#6`RdDpC&t*a!Y=faobRB86PEA*#X4-fwaG5|HxQ@P08LxbUsV&grw$1Q+pMkFZCbR54P?_Xp&Cy# zrKF_!E#opfJA3i!?|M6!K3%6)Fev!*j-Q%ej8G3_@I-OVg24s~P(li;VWBV&dQMeI zL&s+9R7PV>HUp+Jp!N4!2!QoR!7VyhWt3%EUK$09tyXIql-dItqC+j{WGyxohD$cq zB4bm{BhGR)rbj-TRb=QmjIA7J5@TQlF3zH&e@{j&ONQtonV+gdg&;-WZ6MJc(cnde zh+cC}C`|*K)miW=kcRQ3A_=9|NwNN+0g#Mf#l9#hl&HW{Kn6qLe#U_-;EM(*A*1BL z;uyuA49w&iy-CeAR0IVQFqSQJ`h8 z*cImVBLKXwEU~5p$8t&9VbhQup(1=kWeVx=8;#-brt&;m;5^J*Eiwy~a zZJQ{rXpx3OU>50hzMJd+qU#-iBkj7j(TQ!_wkNjDiOq>MaXPluv2EKnC$_DLlSy*& zyx;$wI?r4Gsp{&g?y9cpeXo11d+oI^I0H;7&%dVl?%{e`;9&{17$^|7_>#zGD>+yy zk)tbYkX2U~mY4RizwjfUX4tA21s9IK4X|oRavQTM1qU%8T<)ACX?VVBckmt_@eR#I ze;>eIPj}eEA4?x=#h#--PW^cJ#2=$#MY4Gr&|H{WG{Nt3Pfs9YK?A^r)PnsNIKy2sQw}=;1E%Bqmbm(oXaQRe)66=w(sNE#Z)2m+H*I zLJQv>K{{Uy9~wrI!W5qe3LFqhYLwkI%)`YR~VvlaiKWF@<3 zT`zMF@R>*MiRzUr_!>KGL`zi}dwtYZPVZx@gl(G2$mR58dDzm}9#m2f6cJ4q652V>O$s>k#C zPgVUvJxg;6TO@x4v110bLw5>ab6NfJw+tQ@vNX|p(Vo$^r|IzTSK4(&4+iZ%r*1p) z>lD9MfpQ20`w*h1H^c`<{>i*j9T$Kc^eAI|N(#Db7@~^MuaFy_ zFA~dr{Ipl=ciR=C`NZ_@S&4eHY1p2DD&nrG>9cd)veiYO7#}r=8vy}_I#`8vh5GQ> z8BL$?)jU?xB|Twv?r6N~-2Su$Ro^qOO2^cDoBZ&-HdrJG6S%1s-F{A789NU^kQ(*v z(nrAJA~(PWh^A}B(`jmqx6OyDE*r3w+(X)qw-6?h=T3h7R~vCz0L zz&1TlZmiI~zYztmL?dG`(oeY$69Rky-k`nQ7s*Q4y>60$P5?*OaE&#}H48!q42X)a zjWZLSSxc?3eP={>a;>c)K%OZm*(-m@`B*k6}EN-8kE%nq8z6E#u*^69{*xwSI? zG19^A{WMKZhkL-^h6^Gb=30n0xmR;22^b(ubfjG0RdK8;li?q*e?MNuGLo0BzrYf) zz(#ZsF2J1K0y8?l!a_)69)TGFb9>*oUv=^*9CRTmIlEOtk);Uwp+8p(hoKaH()Wd( z40mBr689ajXX?RdF3v`nl|Xxii+!)@hpzu1d3P8?Q}Sko*9Be zqwS(<8vEn6%RUA#x}P^c&S#8`P|(A|{fR&Y$h@ms8R32=Ob5}1#tykwRmM)+_Hq!E z`%TZ7*isK|kTNbKMyoEt*cwk0Xst$y!#P8$Ue*ZaQadkg-SO%C`>E<>^uQg-_QZPnE*)3Ld-ka{EKK zbax=$W}x_7t1WpTXv7I@Blk|epRfsr%htc;;&A=Hk*Oar_w-`ZUxP_+i2oc`eI*Ah z5D5ze1+b}rCXCH5ssn6>L#Kys5*M0nMqd&HrzatiNR*f1SYnUw$RjXv=!o3Z0w?OF zGw`Fj3Bf}H1YiwY8w|8COT7QG3KtUF8=8E&T)p;oKAODpet$V-^V87`%L5}pFd{(7 zG?7{t!9lQ!)J_ys4{2-(s>(cyQLe)uanU`G`+(`QcW)3Z+IJlw?KWLL~rU-P)`=0Lna$MRpyYjyXLVcW8T`QflS8OD>0=O=h;Ri|%#AH+cg*q{a*R)H5Y6I5pU32RZ0Rx4v7vKq*OFVigRJUGsyTa|SPugFI= zHFg!BG{C;N%|6Zz)#|Q{c!cN`Qd{B}KL^Np{QLvPcu9)7<#l(iV|lIg^v(6*7=9B9 z4V&C1>~}HfJDFOda8&hVnvl`10~N#uWt0)8685WqYKZA8FHIVmSOF8toqv@ZXy4HG zzpG#}*=KhDR}~Zm8s&rkXCe;`%y$0=IHsa(jn0DnQQWe1s&8%ERI;Q|`fRAk0*x7r zCL9qQ+=N-P;bn)neq#4HN?CN=^GEvTAN>+ksyV`+WiCKDbILm(w#3ONB7+_f_lO5{ z=PxYh~ukG2=s7Tj?-5x>Sy9nN;{+IDP(E(rp zyI@mIPKH}uqcdhnpB?hW1E&5$jlfi^nfq*qHSe=5AzJm<`3sx!+3hG0Z81!=#)RMA z)NxR*{5u7hcW!Yk#jJ?>CSo8V%5dXV5Wxk_+YBa_A=*Ejc9mH!Hf(%idh3XsuAM6NW_m=r@h%wT zaGiBLQubSlD;;k$Q9~o*&C5*gvT&hkxBAB&(jU!iXm00-%{6R;l*u?mYkRn+f&q?) z>5cyVZ$pqgeCE3uV7Iw?MrrjFbLMa-kEgq9uQGoi?ztgdwTe+#XWl?HCzvZ)lBz1= z%Ok~gP4aUYjJPG-9J876g20-M|Hj8U2Rmw+@OBmNnR}H5NoGi>D zy1I0%+q6&%yop9Jb>A2V#6R~U-2k7_yqQn37}#_u^`p zK$F-AMT$xWk?ccn+sI0?^L1Zl%&(%vTzhtyPyO-<8Etnd?CDb)RsRTStOTI7*l1~V z6AmHgLmE56lTACkxMsNd>~7L;vf8$(U#}9(ap>^lG`jDE%dh4tz-(ED#W1C-Z(-_% z)QvlL56EZmGBg}{&08g#U<=O+(f(6+4t&WPFFhHI+OsWHxbIpkT?no&S>c<4&P;7t z3!O{gjv3TF`C`~9vGb`60mkwC9L-E?#p1pE}s9BU;XSWCqhe0++xEX#&n!X^$1M2Y)W``yr>ieJdN#`w7<057a}4sA z{g!_x-Kv-A=i59&<|mLK+O()A`Qs{=z^}+_&_$-L8ay;9r~L-5kvcEf|BOsrG8#iH z#~DtoVk*fZ-x2ML2w)@z1K)x-4-b*KonHY2m{!8kpdI2{`Az2DxTy#W@AaF#zOZ%P&CHd^lEa{(b zGTTiy7Q<{~7+-g5&)$bRgwPJJrW{NMFTwRD&~F@*?(7a;4ru7>_mZBS28 z0z;y3jtn)AS)0YVH^*a3pduqHJmmU~&75-TXt>SQKE5c592mqg05DuON|fhn#nrnRUtgx`B-M+YYNirT%U3TFuwa!_Ew_3kC{wZo$>HA|V(VS_vc~wo=7JP)+ z+>kHyn3;r`$AKgzk zK6QE*ViKA>Q;NThXgx(?L|3b)Voi9ex3c#+=gfS^sw8npHkHkRHB|MxJSya9$E7EM zS$p=H;i-8J=q1nmx;X;@M!m5f+9>cWbbo1F1N$`@Ute6BxWWDcE))N!a&Ehk$EG>) zdd}i_3q23JD_|sEct#cUt7*{3RcO{lYjyuUP4rW%O?<1m9gp^cG7GQks{M~Z{5dBF znrjQgWy-zF^X3oA0N!+0wKK^q?EFZy=-$%;AyZI6+@HdPgP2711WyAmX}CcRU2RCG zN1t>b_GR!eICH)$aVd=)CEiy(Jk2t3+QehZb(Vs(>j2v(oYLr!3tB-_M{0!V_t_tY zkJ~0}+T}+nY7EPc+YH}rU8N^?fisFqd?HBKFn5@C3_12^~^2p9R zs&I(E#Rt?(&Y<6g6OqscA0RPz7cs^(coXf9d6~BI4Kw>g_%d9-^bT4Jk$1&#VRI#I z9b`v|&wI#tb*sySOKFR>@-Qh)KU`vk)2vFm#kb3rUK*h}X5*YK({2yA2Pq@|PLp)k z-?84vRYHEo85&*|7AT55+7SF!i8(~WbJ(8}UBZfkUnH-1 zD{W*aZ)*kRNy5$bfO)>#*itW@=^7Q`*zOQyXLW}s1cBQ^wUtLVv zTi5|UUvA-gaqY~R{rb>Rwa8fpm7IcEb>=aeXAJ06+r9eLvp@SPd9#hNJ&EH*`?=#2Q$6=D;OqrWj)+}NZ@3P3`}Zl!jzt(!Ka_DLmFM$L>2lZ;MH zBHfa1uD5zDcP#CCbr>H9Y+n+h6zTRzg(iG+(6v0k6!i3WmJ5JY5|T*wAo5%A%h_;4A@Q_Yum8e z^1D4d@}U~TKeMN@AfJk|-LTNkqA!?}tS#vElZ^_e-gQ_ZjWzk;IE(U~TX0e_#(3vy zB?95sl`gy(LZ&|Hr*G|Zu8p?+w69}FFt=-IY`>Ek@NDfixyu&bTed2ZFb%cbZITlF-z7M z`{}ch$zBJj1-PJ!*Q>I>73Oe82an5GnUmHbX}pC0o-lSII<+75&8q^DOC;zcUR5q+ z3E>-7&R_L(L1#;a5OKx%L0zlioQi~oRV(z9Sq%_bh?>_PVV$HINS}qs`U_qvTL{*a zY6hWx1A--|9uNHOk&lLI!-w8fv3ysQoxF; zC7dq}ETl7t*L#TxpJAC%O0^(47?o6Dk;LVq7J%C?(ZqM-;IsMoU-UoZ|G_KnUQz=6 zyrAHKQxqWZ(Es541&&<-z+DOunM5oY1aL|T$Vi}|4;Thuk}p?D+n6=(^fc{9O8Sok z12r7&xCG6Fv&_`Q#H7^Bsp;PSQR28{&6Lud#8hDQbxu-py6)FkNjag#WWn+N;sdH| zQSttC-+LOVxfdDOsFLG_F@a;A#Gccj!n|C)XxoWh&*nfo(l%$bilDDNjia@rbmb8Z~JK9VvNZAQ~U3O=oqo|a zjY~E$mL-fkSw%q%_!eKFJIlMtsDj#ptfP5Ll+6i@Wq6B-BhNZ>j)#Eo0~(&*CspDk zv}pNa0@eJZE}V^pS>*9Hdn3mnG0a)J9l1m0=Tww_X2t{IrVJI*$FYtd3OZxC`Q4Fg z-EC-)vpLLR!r`NR4)q0ouH-p)Vj-)|0^D2CV zfBepg*~QLu>kD(=!OH(7L2jO>(ZoFB#%&Xn&Rrwc?fJJ^j~=rziXuLJ^Rk z8bt1&uy*}-Sb^Fq*#=3MU!m1f8T-EnbGmnUG&g*)a6VxYzZIuDd<-Yeqbv%3@?SWbTV1vdx;0bc@ zy5I2r-OxOoJ00+Ug_!Sa_`m?{ivz(05_>_x0;9fS4M>ik`G>tTOr_poTUDj;2H%VY zmQSt0m)tLsw-@o`!rLLYIhA6Qzf<6G1L95X_)Dkm1B4}%eEVR6DKTxiI{r0*P>~&v0mFloB`?KqsxO_rWIY3cNgPTwk*3OK1{dVVK(O3-2dDRM9jH8mKo{e{nwTLhw8%z`%k`K z<-W`z!T{fCL4*LB>p#?%aXxL2oUp&s=8EErli^}OIt1Lp%9LB~m2HrQf!OvN9YITm zvL&Xmsaeh!!q|RMdNPW+u0~kHNDQ32yg)W=n>v8`9p=7 z^>vn=W?G(J9^GDifOiBRkGG54U@HNU6x0EVfd-P_g#7_ON1RN^noWk-jvTqnc?(kZ zi&;(TmXh|<`DUQO-Bx2Ro1ve7{`3;1mXHz+k5M@Rt-D2GJJ(LD;%y#Dcr>(UOlz*s zAur}n9;J|%p~D+f9j1>JQeD?8ET!XPS;N|}O*x`psslFzO&^gUu%((*W=nCtG_9PP zZjY!E8Bqbyqf!5IBHJ8Gk`*vY%11@A(yS&6zyOUr-X?31Z;&fTEv+o;lCIp%;sWNw zRXXR&AHX&&#u&|Ps_uMp3= z$IeolR(6>$(e`=%J}DJXIzrN_K0aScZ|)dwZ~Fxxalk!;D7SM{j$kBd%y1dJq0Zt$ zgYj5OY^U+jwyV+nqjF3@6k3ZDYqgSZLe~uQd(wikXiIe3(eOh_WQ~PX!3xZi9qUlUXgzcw)V9 zy;L?EMJVb>Hu-V~;^a-W`km5hy)uKmuUKS-pstqJP0CsuJHS^siK z*!Iv*C=lq?dx}cWL{x@|2EA`hrKEeh;7b6QP-dpJh-dGejUu>QY^>r)cGk7Jk>%<31A3%RPvPqNVEMD! zxTenDil;3_s>Fyf5w(la=nq-rc2@%S>D=`UM*_R+!Ba-$M;s0&NUjL$Hg_{T%?3ok z?6R^V#jaRfA))JMqV+({EM5~`Hd5zu(i3zNsNMQaON zNUPZWLfwTXRYYg|VA%e$RITq(u7&tiKsl9>1c=LE?GDv8xed?$lsZJF$q9KC%<|Q+ z$mj5#eSpFOvU{K!%GSYn9nK#jD&K0{9Eclrfj3;7aug95MZpODkT3wJZUAOgPms9s zHbv61fpF@A4>M|KKr(2FkyN?%PORp3p?Kp7I_HsA1lbVb1dlXLN_(*qJ8HVfK)mI) zc+wjbwWHI~z*rhm|Hp#mlPz3GU|++^@p^G^Q~j)#P51|t>crdw56`%{iLd+a4kjYG{H&T#^11=Uhb@F>DZav?C5w2LawP$uf`)m3SX-cIP zE~j@5CkIG!2t;k9S|on=oL?8aIT6Tqja-Dv zrY9&37>WP77PB3dZ$QpGHEB=|3$n+F3;L!|+u+aiJ^-eZ?lc}FZJFfRM7>@1{UzpL1-nf1g)0@Ts zBe>{m6Tqr0FwkYPmt61h&Nm}K!u-clAmyl|3MeT$F%p@3AQ&x3n?JK^=&4H4tdeHDK&pii_|!rgW+Mh7q=c5G9jM!qKbCk@hXnQam6`6L9ZYx?|7KR%Fk*&I4z3ZK}Yi%Do<* zQ&Ef6Kv~oyaA*(V%~h-R>P5iv>J?oI^B1&dvPH2@;R7ecd;fYr4Y3_q+8&Tcy7+#w zmxBUK^ZdgeGj1Rm;t87;L+g~1GjwK2PE6x*4eNw2U+i!OPnchM=Y3G|r>u+e>CfJs z1)%o(-mx7llR~~`gm=-dH%K()FD7Pf-|rVjR==v@JJeFdna4@L53R)9sa`_tJ&@LU zrt#YbC>rc1a-qvG+?$fI9rGVWi&=I0&42eje8_YBtDSdHGU{2F6dr4Z?snKl>%?peln$+Nv*GWrooI z3F8y$|Ld^zPvcazAaqdv)u-A){Bwj%0W@F-!3F%I_mI-9t5egMgvAg*n%|iFn-rrl zS!g^@ewuSPS9-t1n)^Kdd{Nhn{I#NxT!bB0;H@C4VS>hfSkpc+YjT=xhL4N)?S16f z{#!~dt&tzeU0#t}dq|>=*0iR1*O~Tpl)`Z16GF%OuPqDx)+5=?ttNPj;?wk^O=j%B ztN>7GR;e0VJl?ZcOi_)?M9LWt5!U`p$w&9`WR z#qDLb6gw`qR-s1c5ev=2Xn)hVxi!wKq9>R{A%Q1027t)>@d&47Wzd-WeTBMF{rt9rBag zr_+Cu@(&6c9e@`QjhSfX@>3ft1Ns$7_jiHJ#0q3EoNiGEFxVqVy1jz=dII7kk>V&N zX@yyArn?0YQqFg1lC3^BKo^+UHW%7)mNxew#S$uVs2*ei8Xt&?7tb3j4ggYu2Hbt= zU6Ub_^5t1i&`pqvA`LE~_y-&d`PFL-vomy#!_`YL8O*V-(07#GNyuO{0e*=yJM_2>$R#WXo#4@64bOf;Z^0v`E-&xPEb;@tAHn-Yn|r`2^|Z zo`h5i{s}^eqW_Hj$fshCF8!lE5iq~ALdIdj_RMIlHFafN8q*jJU20@GR^DuCsl{PJ zgVvnX!lB2C{+9Q z8iY@wmQ2st?W{91%j%@Qaw~d2W<+R9R7d0~`1t5%JKTkK6(xqU)Umj`UgScRH+3J~ zX7#{bnIRF`^`zy}_{2f}h315`e0szJaiNMZvhU*#4s<4v!V?rxR)|bZu1Rmc#CxLn zR0xM^lO;6urztETw(waEA%KJi^>goIap~n@i9fH6>4}XO@QXIu5M#_EcRW?2V7f~5 z9_j=>%z#Dbb z)N;Ms=e!mhIliA*bRR&Ad2U>cE^4+yzcS>m}p6+y;4 z>F{d=`u@%#x+?NI4aiA4{DwoUsS5kPTRQ@xn1#k$jh{Sc>{N z=Opq2fz`OR2QPt&i$B)*@3Tw_Q6x)txdwefz;p(k!m6lFtW5~5z%6!{RJYZWl;yU^ zeB;diUi@mK_y_tY%)8ZmgI2oQ0_Cok=^I)yWJBVCAM544#5al`E%Ec>C;ROZ($%2? zmgqEG7sTlAPlJGxwq(vb4T(!<(#4vlcl4Pc$g0dD53J>6-54a!8n(i@2$a`KqvzCa z$MRE!98MR4BC7DKsH?3<@mhQ7(tawJ2kuB=ZI1q3>|t@9|y#`d(0p zWe-do=`mC}0C&dXEI=-m^G-1o7N=1_o;g_WpGA10wxd&c(5g6@Cily`D zlj%q2>)vMv?s&i`x{lTLxq9!?VmkU{Pw}4I{9&4PgvS@+_vsCqjl#swxAz|iT0*(s zq4qqrf*t`_*)+z#!|)X(zF}oL?W9xmrqjd(u)LlnLchTe?^3-ja)3@kB+AlK;`?oX zp{HSd8LiyKmUPoet488o5;|i{;|>aZT)Fi5yG1c6IZV>;dq|(LDCmWr(W*cZ8w8bF zL}GnG$mEDMl_s!Z)Ik*wpJ9_#l@F`>*j~9O44?sFl}Z;8A>FK^%>ly%I(De4)Gel& z&28#O>Mb3UIv-4_%bLbpxZ8V(UHKnet-_6WHBQr?jJrz<^cR3=@&VG2BR$&bU2hr{ z&k8B)Znq`2CL{zzgD-1oxh}Eje-vy7I~a}6)Qx{4u`nsf$;Z9BqR+;b#NFa@-LfTU z_5;58j^qw()F`zeIOohGa{g&-7OP~E`5lCs0hG1TXRPyR8$3Gv-w!Y6s2Knq6Si}S zO~#dt&Hxi=H6@hb?|C`%_F#Ej4G+nysH)a(CY>Ipc^j#;u$8kHE2Nhcub1qX2+ioc zQu3*eN3SM)yVbu5!(#&bn{EV^uw=o&(f=b$_fMBI+Fd#z4EOC@0XC3`3xpcz%@2YM z(9~VT_+Xm6LH#2I4T+A%o<3ysZG>LJ3>8;|*pRp{F2N5kHVw*y6)wvoQAoRDajDU6 z6YIiG$Eu>~CmORv)#l<7pqnSm2}@0DB8sR!d4S4VxOAhW+qeAyGbaJdH`Y#-V|- zuz2bqKgm!m2vCUgs#LRO82C4BlVXA}Cw*$8`&AIe=8N54!$E9LG=GVQ#cF|osvkIB z(L&?Rr2ZOoR!}+y68@zdKz@d5P=?cZLpL`w3z8$l>JX8#Illa~N(pLXN4s1>fY~AR zMnXMnF1Ut*x)0<@-}rPJb-yA<4TYj-nI2*t5;42uxul|UK3W$=k?+AyW&X3q*F;W}FhI0&;wVETSY7U~O z7(a>QuASKhRYz1ZDRwq3f-m_q0o$Zrz*Eg?&rqJ$vJ0)Uef(9`+L6ZBr~JVzfUKAwh6O@- zD2VnltH1bCk}?__)f665*?TF!lr7z+WH=?DE{&{;B?#mbu!FmPwq??laGqQC4Y5;0 zEK8Dt9(Lo0Biu>_rR&^k)~a~as!QTE$HRr3*>a)z+=~5%hs$J3F6RDSTtQG2$VwPs zx$GF8q{1#8fqyz%hgMUV0f3y`%^C<)sa;;4-LvVIMZEgurDo`Q-ii){$;45>esdZq zrpac0L%UU@-=H8HFt#CB;2ffkU=N~R5(^Vyw`eJ0kk@rkU%2OAupnc z>KYDJ`o+P_TgKq~FPJOk1yfqb>w6@}1Rbav^;o%SOIL8^2h1(S_v`PiZ2!FC7$cY? zw?I0@9`?nh$!i{O7s(CPx3se2sVlQk2VsJs#EZ;(I2sy4ItnYcH5plE~4ozp<|GuT< zK5ZQHS{mukK$8IU;4lu#w`vVA@YoGyK$I&AkwE=4lr0?Kv}u?M!+DR`&T|(tqclJR zATDf|@7ua}276W7IntbARXO5N<8m3D@HhN&JJ~Da(w4IdSs**?TnP zl)uJ?_vsp#Ov&T0w?-S)yJS295wS3p{5V4pM-SR{wd>MDCB;2yEh)Ox{iQLn`)Hs= zte|>d%z^PRz=dHZ+@!iug86wC&sBd3>uplx(>PG7oeG+Q#%*c0aCd>8tqp@xVtRZ{ zIjqC6hHpX5@>#B32KVj4PplW8luZmd)Fo;N8al2VwTfT9pMG$*{==kCD+_~`rXXiI3SD)YmkRAcvVlbLg6j=GN9n9ES{T*@P zV?-huf6kZ^Aj7C@;7q>#%R!*HbAAerBa>=ADNQ6F^VVIquTy_U?}R@;saf**Yj{6C zYl*mP+2~;eJ`^)rb^Pvim5{RGP*4*Kz4i3d#WzbIotD>Q)G90##t!7v&`ws|Yidv- zkVBXd0DTBjw;-kYXZ`Yi#fyH}dJzz>Z6yYUY&&D{{Qdr2Z`L1;l4lJuy8q4F$H-d-6)TlMKoO zK#(fjZxnO4_PHTeK}&L*3B#Xo2(#e91m(FLTJusRqeL|!-s3v$Sc=XU>wnuLE7-e%Z?Qry>gvl$o-$qgqeP)cH3Hz92Ko-r z6dx)xBuSeU2Z93@I22MI6iM#13X%|*023Vh)NLdC1~R1Wp{L)~6SqEp{k+Cge$y*9 z`GyhE=mGafl6IA=a%vCNt8!HKLH|bC@;CgUsdiz0&-Ce>`a^^AH_!?8xqCw}X5k&m z5%SX_v@8C>yJly5j%dyUQ8Rc@X8 zyGaG6#U9pk5vW(2b+&Q!3q}?d$m0I8&7qkgFCAbYd8Xb%;EzGC3<-OszE4s^P$y!$ zLT9`^P1CpmM@$t?rR^f)()=0w62O*2-DE|8=k`L)0PinCZ&b7{Q-yGoGF%V2d?mVbK?5$AD#X0ld24 zUvh6II52d(?ilI|4(Yd&f2EbHZ~z+mqxVk-{POx@6Kpd}hOUoQG#=iT5T(?2u`I}SC=U^@E zu*1~Jpo!M^FI}Te@WrXo4)m&fp|u$S+SEs99Y_(LHPeZ3&Q;HtD!^a*WLflNrt||{ zeKx&g0SPhIg=SefvusD*9C39e{hfSmIvqyZDqSxaB{P>h|G99X{#Gsw;>f>q6SOPzwdW3V z+X!7BzRAPCTn2bJH5wd0OnAoU^dLXc4`!LP27;Njupj|FBbu^R>~F8KjjJ>b!qy{~ zxeFHP4|8m2hF(<1IVjwvg9r8$V-)z(nr7O>K;V^jsjYP~w*wpH1LPDEzIl!H_}nie z+b<4uDqqj26;)`}%{SwXt=NHo9^vL`e>&Q71r&_`vH&PYG**Us!BbE0jJcEWjd&oT zj3`N|E`5J__P}?x`ebj3W4z!F=;#=BR6M^=+DMWgQr`uuiFJrGAm28x8-EUP5WrJbkc1bQjzQ9T{X%-4GTsFvoK$-NZkKd+k0Uxig2)+0z`zIo9=pLrYAf<29v?Z!38 zt#6%nu-ATG^+#NjK>wBMWYFbX98$nUKblkUuIk!jD|N55iT( z`D~f>Hp7tY#pL(!FdKKoyQrXbjrtPp3L5ePSRM5q zq+P$ER2G$n3xr3;dI>CK!Q>&)$e7FUM@u9IS&$B-=bYpgh4K%rZWIbFBSU}=3pq3L zP_93TSOsD4Jgn*OUIH^1uJmn6hh-rd zYXNFj8Rwbapm{OcHTkC3Zht8EQDpThGMA7mm*QSz?TX~@qBZhX-LU0e8-UA;wnFKZ zru=5!^bSeYavkh%! zj>*XS2lC|6Lq@}K&)G-Y4*8JKiqS66_4nE_@O(cCFi zz6%)KYT4YSI zZ^g`E9&5+!TAUfwqr??j^l`4~snj%~I8(MDl-Wvr6#PSML5=LPDw?v+=nNwEy_Q~# z3C9W3XWXZj;-_VQJZm`bz@4&+6ZrcM;t^d^6i^)#AWuW%`>~7SNyqnjvMBv^=?Jv( zF0J1GZF2@}l?4&|k9!6uW-RUF7u8Dl3)jK_52k|_$R+osa-%pQ115}o5i?dTL8cG> z9tgdsn*^QBPE8L^Ch;iHv5rSIc|XdBxmV(G1NN8NF#vjRETp)jyaM;^e}q_#1Vah? z4;H0}M)hS9=3mgpytke^PyDr1%LCSJXiMEziItiB1m@$n} zx`K&laEr5<53jIBv(f}GMt>D`>P;849KAk+m~~f9ezvRf@PGe{cWskMFDkSWAa5kY z>qo!Km#3V*UgicJQk#*|CH81||G)SvXlSHw|7@>`jqmWYzb;PKH=wc;I9`eh2pTX# z9s~(6^#w>5!iLy+%HT0WCLrUIkIY9z?yJ;>zLLZf!x@=Xt}SRf`9?tNg!zy{6#KN5 za}3u@C<_@|>-D?7p`1T6Mi;2HcHVL3ZUt#(vk=p1XV;Z2mRXcMX6Xc(^JUIK+?GKGVOjB%0b38Yjg-IRy~0|HX{${~vHsXZ`QagunSR?;C%U=J9jGO1!L!osAU~ zRE(WCdBNbw0);e;weo!xjP={Q0V*0lonXko0KVBwnjV(IGRD$BVaWp1LXhH*MA>;L zFiW(pLs(cHAdZ2U6eaCuM}@4c(4;!mQ1!s*c>j3+G!SrXe>)>HL$EsR6@PLxFevK`rF@ju$%cUVX!+*HRGJ9 z0#&W<531SO)TL~X$5pOq(+*>cc4fX-3!e0wjRazVywgl8<2IIcrpc*`fO?hz@^1sk zcP5d@Dx}QU$_IDRq$#b-4<-$ZGCOT%ZNUNpOVczGI9cZ*AVAye6uwT`lfFIWXbqeI zxv`ccHA{Cg5iS@Oyk&i(an@IFd)U+OS-5RgDKDrjMJGg3XS<4zBR5d%O{jKeKLbCZ zwoEgDjLJXOYB#Q8!SEN)2tYtN)|7fUw@om3qWC2kG)*>w34gn3hayzNtl04ArmVDinDXYmqy1*yaKc|3(OWLQ6tuEG4;B(+2rJ|g0eqS&nhtWf00-lh`v^bXv3XU z5y)sG@Wku&3w5q!E8ywh^;xrN$Thg)E0X8mfGl1AsXXXFdeyJW6U%}aAcQVvp)OXZ zWS^AoF{)rt5oie4hQ`N@%Lyq496-sLRW~ zxBp6Sc&wT5=C2ize5E+g|D?B~KNK1Y?}Poa03;+N8l>GX$S>q$;{Q)^vXJui^i(KU zwUUBGgw)VB9z-QWB8n#O4r?G+<=2WEb%G#F$`Iai+#Qp#Qa+ z@NVtL4Ww`1Uda9vAD~ho6gIHS9|{&wr3L4$dhGg1B)zn_zm`G}#Ih1X9<(w{oPA_O z2!aheSz^%Q8IK}Ij7Z@W^C(4#E*9AjHY2xfUscI5B88sHDzu||+F}duRXgR00 zbRd;Y+FE~2(uH0kY)27Sg5DXh?yt!{!RW*h zs`EH{uR<_Uo2i7sRiD-7lD^5)yP;0s{8o#4iK}s{8O_mYPU;e`#>xmOhQ?iB5%m9X zbxzTlHQ|@Hl2J%$kd{R$ZNoT2-~G zo@ejhcF?_hOdj61H1!JwyK2Z!W7^FA;_lcoBBs%$kLNgT5mmXN@-R{0iVVnbb;*mQ z+)q61wA_nL8#R5chvCI#*;pyK7(?^2ozKq%>Y>afrC?eu7eWp0*f83jhf(D_#x=CH z7Ixse`HV{toG2`=qNjHxWUhqzAw%)l^?lE61&Q?!PR=iD(5;x8D7D_#H!gH3QRsGbib94Q-PG~;V6zF8c;qgk--zBW?}UC?HM^ZOlYiE%sf-`L({K97 z=4r!zJb$^I{;z;MqSNyn%PA6b%H%GeP^NeMFgb4?acz&tuiwA|cLsfkCin4{GHQFq z!i@T?=(754%2^pBOU>s~zt>s~(fJaXFx6;)F)uEXN9exb`91&gG*;EmO zW#Or_+J-}Y#%&07Sr6|EG5`^E&bcW@(QC5J6eHv}b65Cj!BS#^PoKXF^p_{J)^>`u znfF)OLD81FjRw?I@D}Ycu1|oct{rkAQ4)Flgm#3eTx41)bTr5}aeyDLVOsc?hQ3NC z9yE?eT^?kKJO&gm#?~e$EYuE9S|pbPzWA3*H<9surs|BQynEq{tmF?fp)tED>^?F> zP)-^RdU#I05zA)(J#!~J8)2g|B9CaW5$(~$h>ky7B%?wilVrQx-)5sL5z@wXM7gXai-c^bD}=;~L4iST^9qx=Raq!~nsseo>FqUdlo`bz=c%MFIW$xS^Sr`-+rEmytWI~9-5CNT9iFQL7fuu16H zcNGwC;oj5r8=GyMsvv%J;U&d5UA~LEyT*SmOal3P^#BI5JYOwk8tV9w>$|^* zX_ISm(p`P|9pj(S;%gXW`7^G_n{wFN(6}1*IMh7BtmWU^rI$MK)^&@&L;rSiRqx>` zO2$z4LkHgVOFUl_ek$~loOloeG8V0MB@pBZ%oyoZ$BbzwHDVGfCYB`7=(oGxf_OeetNdwQW6Cz zobGp1_b>1HV0*;P&W`?B)!olLFp#X6Qh+7@m~mq=&$FJK=<@5VsG`_O%*E!|fG7iI zYrHaHN2cUZZEm^r^zGL^E{V1i6%}m0rSj&*Pj$EXafz_v4I+05Ip>%75XXS^iPB^= zZbJcaz-Jv&TaqLJ);gv{J+AhZA&sD+P0cSHr_*CX#!y+6t~Jn`EuXcAC>sf6+m&9l z9!pD^?^Ht*!_|7t0$p4ix8^Aza{{+T^LSXd^3Axmizy}1Zbi*mnI&zs3?;C0iG!Pm z+=mMx5L|7zkW>P-D~ah|cGILPjLtFN}K*tM_-#x*qkf+N!$A+;7gJgna5L{Skq}-Vm}1$P?Y$7 z{@(XjnT_wgh#6UwMvoXY%235HFMvk{Lbavrmx3BiL!_nc6w$cUu*Fq9==1xOzIsKo znP20QA0mYRSF6mH1u!69td35beW>e29*yF9ta-1vBZq?ZH#n6_MHcyfNXT_VCzg2) z*t8BA8ovbg1}(^QTTJJPzG?=cVgd8XExWb-|ak@v&^X$dis zj45st89(Sqfpt`8yBitcF=A$q^l*ml+=N&cK@glz3v`pq+W%4=;5$tGC z$`FEQMWT2+pPFNA{lLa$ucb>fXzX;lg&|9AuHSO4`toL@sHMv*??MCA<)}NgMErHj zsN?$!8JISnY4drGQs1O>D)h4>ji-+a`^`eCd-kYSq_wuxjWQ zrf!_I>4=KK9BPi}={2~VWc^l*J>54Ep2=U{dAsuGtrTJ7^7<*hI%|Xg2TekxekrXH z#SR~x+5do1RLdpl6$rLse7Gzve3w422oIqc(0MOSX@P zNml%eu zEx%zvkmcG~$7J{KwOpKxJ9k>X^03dC9GrA~{`Zmi7t9Xcq;Y8gTKkaUoobAzN(q$+ zG}=pcj~16?iQ+_;djK6<{$*;eBCuw8na7;a_KZL-Cvz`1vwwVX(GkQQgJoW;CKcp{ zfXr9#Mo3_?yMw7CSJBG?mPO9XRJLsXRStXobMdw>s?@loN7v%dMrw@ywn+Ea@>Z_O zp%2kjdyqx<%wQKlU|kZBfA#&Q8Fq*_RlZ)sKANw|SntpfeZKwL(gts+QhvvGZ+QS= zkw5Us*}P!EddeWx0a7|>m-q}Os`3G3Q}VVyn^V||Cr|acP7ScFc;EYswmpYIw>(P`Gf$3Z_ z!{KH3v$Pea@DMvO-I}(LY(EK(`y`KWa$beYfs-!IROYV|`gEl16Sh@fjLLr!U8_xL zjVnnvx8!^DqNdE*_ae@c&tsEzFY5W*y#jmLpq0PC1eq-#j4fZV)IlwM(kajJ>n&P` zzg+_<*TK#6?zf>mR0{#YF{jRO>}8#$73z5vu@0sFj$t@nhvZYvKGBJJqt<~J!fM1Y zL2E%L;-RU%6sz}6nfYhb+qsphMosoU<*QojLC9Q{2@i+L=1tuzqM_=Bw}7skN9cx} zYF%Ey^+Y=w!nb4t(*@>Uqn&db{&@UA@kPzXrDQ|h+sIY)V#E!wp56n)bZUW);jM%( zb8}MkKYjwb16+O+SxB!YWP(%ns|qI=?iC)J{FZw4N7NcvvT|@(O6@klg?-c6&(6nY za4YzB$av_|t{N1!|NFM2xN!&z@w8`@Y!JW_eo-ALlhsqp>(H8nlpe39*+H*p;O1H@ z4^U0kCmD)wGFV{sSkKKBB z_w>9A# z7&>~e(=pOO8+>-)A1*!)^pVNjX}d9Wl)&SdI*;;sAwhbwgc?g9W_YMnf3Xo8SV8KKoVLwN(sLzC*0$0FmSOsO)Q z>%Fd4Z$19&F%pC6XyArRdNT8Y>6-kkQ{mW8uQ0X$4vs#m=cI~UCNEM-GE1ejlB$)+ zvenkUz96&!y#t9c&B>7tI(g_S*4Gxti`Ni#+H5`n=OhkujT(J{f@UXbLe&7RI=jv- zDn+>!*JJ%?qmFU%S9-{L@Z$Dt?VDA$Ox5GHwZZPfSanvox_(XGkGH_f-DsX}Y}<pYHxuRi!?fstM}fM)lBEPf8qlbSLk)l;>+pJsdM6~W$EXY=XGUV@yl3uLeXybnQ?cxYA4lhFYI!c3+zBR+khQf3N>Uw z1fKKq`OUG7z8aR`f=HY%`;6qeJ2pR{@z0?)KVh*oDzP;FffD-)?D^v?4jHp^5tJB-c4mU|mnkt^GY!Y8vY`U-6HCWbP=%~BP0*o0Qa}?f)F7ghitR`^vtcGfi8heC2bSG)A z)=_JSK)4Rc|L-Od>i-pIwT=|$E2N;CLMQ<0FYW~YL|Iu)aR>0su-r6iLf=Viv8W-b z9ZND>L`db3^uBY*5zfWevbn)Z1}6(;FeWBL!iOV4uLoDT3YK>L+0I+>pN2iJUKlaJr(tdIdiJbVhe6oh9joo>cCNA6z8&71k4A8+r6@2G{k zN+SqF>fePbJ?}L1w(DxUc%$>h_-sw6_k=x%M&)Mr&HNdpg{xwx)>gi&!RMf;8%2kd z{}bUfLf%Bu;1?0W46WNAo(CkbIYYj-%yPJ>_c-A0JQ(|GvXV?`XtJK*V!ieF`yx&Zbi?oTs``MnjqKHbjyARWK-WvQ-J%YYepw z`|E1(*W}1!FCu&4;$LbAuzkQRbCZT~nR9^LJ##Iy2`);iMHpjNfan9)z>M;u;Q~NYoYJV4@z-`) zr$gjVWW5XTY(Efg!C-E`J zr681)Kg9C6>WE`h{03k{VN7`7AA2N+7>AA8_5fVL6p1?j)s>E)jG=fVy&4K7p+0X5 z%q9%n{JF*$;&ek#%V14`&zg$5%`D2bnxMO@{=|?5Fj5_4`5|pD|B6u2kVIKi&WhaV zD86M9g-pozBG+}8q7SFE3QuzT*>@$e5$_yzJtR*em=O$6Js{EA?n;>8etf(B;-s{# zM|2fG70?>-N2)`7$oobBHZ7yCDU-OVD0CqSEvtGfT7v&-=?20lcEzRH_+Y}&`#Uqp zLDp8Je(!}V8;KwRG+-ItPX9?t^dx=bHN>XG56&b_S^pabjv0Mlik?^0JRa@$;`@985%t01JhA5X!rgV%~#tr|9l4*`}cpQUs>z0Y?QeOQIpqH%; zq{K@wWt7~}2BDJ#w^6O(MvchLDsz=I_G&*g=10!2<%25>a$=&Q_f4i^!S@ zn!+f`0A%Lf{j(_j>Mgca5K&YFS07VrGmAWn8>u-l2oovNzBifkC`9y8cQDR7@BnS< zBe(2Nr|+R+0+HH1oR02Vg%yvJI(>a#it@+fXk-mSMQ3W0o+hhblF>MMX|kwr!7`cU z*uY!SA1u`aorq}$aN5|28aC*_w3@;lEp65sP_U4Y_25sIDLjURsnw){t=ete@&B`g zzCHRx*_G(IKVPiYWmS@7kEo+Qs;OB?XxMVgvc3K)D+NT#wAcJL7VI~!Jv>Gdv6;iO zsIAxFz`vQ8GCF{Qff0H|ta;K@LTGy)`s15rV z^1VMHaTZ{|CCovluL*x$tx3LeoPA{X=?Zw2n{(@)*J{d~$K>i`l`ji=?C|$8ojxKSvb03as3db$<8jY5?NlUU=ingU4kxOy@DsW(FnDvt+9_;?rx2I8}&Waqe!Wc(xZ>C; zF>X#KH=`quio#px?HWM>g06unf2MSBFh`lI^Yq+wWwwu=gLz1Ef56j7@sv++w~xBI zF<@;5tLvD%E0wBf;~3Lwh%U>Q{gTdrI^Fj(HC7HUHPR&V3)jDCRXNbfIc3Aoh#X!h zYjgdnDo?9AbZxD!N$w7H8a(T;YG(|ooEG^QTr ze!MebAIdCN?+T+wT)(qHuW@$m(;MOUNHU==rdHzfvXHdvb#=rEt~<`wFZ0!P9+dM> z>hqnakSqsfyn4aFP>H*_3Xgy{B$QKha&Gvd5N2fnl@_w>J)Z^GTLW8u3Zfw$9zkY$ zoBTH>=rMzrn^UHCPNSd>D<^$SX@k2|=kA?A)<#o!{h6P@WTajEIP)9N zamY#E-xN4!@ksudm?We9(uhW3b*C15&&3Hv!ap0Tj$9f5^ZWPD93!HB5>KXNP@@WE z{pP;KU8$n|o;g=3n;$q(d=H09icO$@B(Q+sb~KaliA|(w=7ELHA#KcHmYw$4X5HKk#jbmdFWLub7BQx$Vp0`WYS)fFLIG282^7f20^TAkCCSA(3(qgkT~)gjMAP zb1%%K$^*irSNaku5t3O%FXdhT=~3!$KVGh;j(~9OZy+3LOqoYaQ%YX1q#)z{@@17U zlGTudl@TzQ1IAio1fM=bR{Pa}2`{R)($waR0tuj49yE6E43H1VTUop6H?p?uDeWNM zh+h&dSjJfUSPq(Cu~VM*U!w%kIcEp8{We?iZ4%uqaIiy8u~rgns}UVkgJJfO>aCM( z2Vm>Wq#{vFW@kh=5=QW6s%&piX4cB^M;gqOXimi@m7<~Hbl8M!8kk@EG zmC_gTslydbyu^x<)$YW0Ys|zv8JL&-c}>q%rUUgxTW*_}&vnGLsBxrAkeV+|*Pduw z5Zf&y##j2_DM-<>@Fi^OWS7egNFJ5*fVzu?{+YxPUXf1)j8IWF8zFYU%9JpE`a3Q> zQ@`t8NpjQ~cf?xY@llH`94=V^8w?Z~Q9Tq?zYfKPA&eJrC;w&c*zt@Wc2nQ}FQt=z%iHy9bF$L(c?ZwyA*U$(QVTNc^)5N`-t*lcSCVEed8 z_lRMh>XH_HhW8WDK)5RjyfO?ad-#5W0_1!32m(XNmT48fLeFX@(&~#fZdPJStlT=* zZEej@#OtegYjurFF-+T$EW`@e--+YVGLr|O6{I>*c8h1}jMTE(7L1A5L^~4p4%cwO zDZz!lRu%&-5e^LAB0VYBG`S0a^IF}@??wLp-G2DirBEj2g{OKF67_3UpJ?kB11;(p z5FJ+4ThZ+MGi(>_o;E^PH1(kI4-dC`%d$QfC(ni77yHTAT^OIy^59@M@LmF8Off}J zFHC(Rn&m1pv6q04de4(XI-Bv_!zz|ezzqZkz3uy>5nQc?dYYU41$ivMdlyn@-XQRn zSF`e8UGgy6tgmERWAT~akDGO(Bh?3?K8EZLqUn zU*657J0jcW98*57ndk?w4l9P|ug(7)f?=sV$7*iWx>N)`tu~{-(bRh*?<|(a+t5xL z?nt-l@<1A4y!#Z`I7;vx6Le2_^?KtOHD)x@(6uA-W5N@QB8@>HPW$q*f->`7I>|@uW5(ZsO<@zfK43u!?7bvM& z7t_jj{6lK1W?yj{LNwy5@D`4OnT;Q(c{zD_Ug;bEVIV~MgSKL@lfuK1wa>?BbEmTI zp2AelF;J^DgOdPDyy_u79%{N{|I#13V{E?Jc{4~>*+qX@@h7+6L~@P@o}WMr(6ZBG zVOpr&nj-D=}48=@Y2@UU}<;p z{KvEL;uIF(PRU5G;PA;v^PtHm$Soq~x7Y$+;@VWnEy98Mh3M~urMNx25+8NwB1{a~&7;B)z zkC1Ed`?mvX*E*8N>gd%AkW+Hr*^$LP19RKEmJT;;Egtwfe8?!om$eBd{x+F`=a%^D z%4=MBnm^1izxtT$!uvb~+-dbTgFTwbgB~FF{4xR~Yi9T33Q{P83)Du z6cI_-Zl%*3%o~`vEV3yj{j35pEugx7JmA_f*p30wsiN*L+{+*blx1(--#>B8rw8y{ z9AW>@&}O7l6q5Q0*OA?kPyEJ&d{agz&E9n%V-+XHXb)PXJGCXSX%MDkc%`ZUZ$ha_j+_ zA4QZw19a?hE7^BpO8=&sybOhqfqsa7#OpBLp_}+OEj`KPpOX#aD^NK#DU`I&xH;VT6`C$h^b$x|VtU z!XNdfl@8~-#-Aw;Im>J@IH`k2>4#dD6|7Xoo$a`1m_ZMcMsD#nS?RE6z_?L`pldDm ztAiNxw7JylwP}ZtkH?)LjXj?5AwJ3_USJ!)6LQ8QT5(b9y(FyfP5dvE#uTgsbkt#>6O>pdBKaN8_aW(FJxqT^uHHE+SUm&Javb1@a5M2y zejv7+>|aY87M&GdVqk3kskVr(oV#kNO_TM;_=&zhHKPbfzGqZzd%#ewTdLob?^js6 zcy;S+kDB4QvThjp@$ZZl&7vLmTzNdvu1+1)$Uc*|{^X)qIjltoCaeXb&BT_RVEum` zv7JKlVG2O4IAdpxI*Tsr6|!!#_dd1#X&OB|H?r=_0E@0&C)bq7=y_`Y{*U!!{Tcaz z57LvJ?lW37z9C%ris*f@DMjUsa4I~OvmX!NWIU>hZh|?{$YLIOB*j5rHQhWf|Cx`y zyxQ2afO{KnppUv12s4fge~5|RrBAteVCHL`6kjTjjY%FaMHtC{o)qN_!5@Hs;@F7W zB#rhHf4F%%?rGoe5Ntp4Mcp|X-gai%InBsfXzGGrHO?-9Hw=`T@s>Uw>vX^QYFG~a z872tt3BUV^qvXyvYXc8Z{#)8*l7A__Q2M@cqI&~>|6Nq^{$C4gl8Z}q4c3=0bIf19 z2>y>Qj1OQmwlQ>eUeNOP(Q!@sn`Oe1AY(Vnc2OXgkSuPQAw!Z|SkMqGl+guw5?I6_ z>1mptMl~mA*30*bq40wkA@5g3Q(cW3>171jY7vuyBbJVOifUqL-esGBf}?L`Rq&7Z ztgTMxJDZHhKEXq%)}znOZs)Ee@5$B^&Mkpg$}hm(K7`{Z~95JX1+j5kl;i42?T zj_95BUM)jL-A$E68%Odox~xfj=|*Gbhy=%E^1`8Jwv0({tq5Bq<8L$%CNQN@+CYHo z0y1*+S}$*JaZg8jrY(OLe93C9AqtxQueYpscqV&F^Z z%03`Y8sT$&Mj8p@EO!N#rdl!9P-cu!V75ZZHY@ONH%NbV4FQc$ zPxiX-rH!yp*8NA&XtR!Cw?-^U*$%BNZkl2=-lIdpSo0q$4uaIzGce+yMdp9Dq$MR) zcsZ-E#hLWuL!ttpni{l7=!3pcI3J>&`}E_gsMZ&=Ovmuxffki*$<)J}*2cXZ5pUpP zm0>N<)~ZDaR9mCsdM<6Zkq$OXZ?sJdK7d-)Qh}gnsF-b7xPz_BsbfQxlDKZ({hKSlB z4Vb^se=ZozJ-sPoGAjph*fdU8vGTWbi4z!MH>HJa*j)RobGu*T+uqL-Zg0_rPam`pahigr_W@Tjv|&5$h&Z)1Yjf2H3E!HW4(6g z=!rqmQcI%B+6kp{J@>ivV3%3ZQ9jR>nO<2bUjNB`u-~Y)LiA8PEzu1z;?)3yRmlCR z2?vp_#QyUibz5AUdXnZHUx9VI9hCKv!uZn1)#pju3rD>|`ixTcIcU+2ySj3oyqOjV z-$2GsKSYv08}s5UGxNz(bbtZh!afU$0GCCsi8@=)(C8qy^LxuzlDca{)=K^^KJ-nD zn6itM<7(5kQ*jVq7=We`G&WdO)TF^vDd0XMc|Tk2VpXDl_3`b48PU5o21!IiG_MqE zM5TehFaoUspTC0ZVnCkH5N4=?^R489^CaotuVcIp@*bb-G*-Lr0P<&Q5&=U)K>^wl z{)r11&rI8ZdU1h)QynPoBSpSL;pSj@dN6gi4_6X#cwzhQ&W8E`SsDueUbn_`)Ff!x zvY9VpO6&P|QzDnJx~TC55gyT-C!)MnOmiRG$w0To&KHz_X=}+YvF1q5!@Y)tq-m6x zuoe$D8U#>C-GOm`QyNrUf5I;v_@ZL-qY?Ox@(d1M)pY4wHGmE{f z1FAxAtI3t}@j^_#hgklWI*hX1ukp_ruciFw^x*39$Rs-7)Hz%R>m_IGu3TN?^(s{` zf_)z+!+ZOq=kiho@>bI|Nh@q$@n6dw-ZJ+?WEDg5MziC400wc3V10d;y13I~hq7Z_ zI^)o_)PkoHA=_(In@0Qj8medXCzPc2#mxF~iI%wRoQYG|!K>G1ygw37^m6q2a*XtAcZWXGs^_m|nxbv4#f_|Z@ zZi+J1F)zArMFOPB>u^m5bFL417yOj!R%~MSu&pZvybt03W9{WR_3!Q@z}}os<)z}o zjT7jg#5H&53rDt2xw49MTcMbV6p+r5Tu80@=A2f9#5#*y>Og?^t~gRpq0hH3L~UGa zNXKQ*X7CuP?ju0kP$2OhB`b_6hGBUhV#6i(1-dM>IKf41XGX1)d{V;ar4YCJ)if&c z#iW7~IACE+5zNq44`n4n`dA;K)x>wP`4f*ol)8ntDOx_(4uVJEHV0L9`IkCyVCfRc z1+C>%1!VuZq@~taG&{#@3^Z3#RAm{VPGI1cp2QyKO%P30wF{>tlOvZjpm7tcqPF7j z?DjFK{ye|iL+74~FJ*~-3@hm6&1@ut_T}mVHgPLT+PeQ+XIx00mk5Kd$bZ|ooabxr zg%(e<908?Wm@!C)cjzoSeWaNR7soa1kGv$0&tR0$BsbkPgb|-YN*}^Y(+keA7HiIR zO|VxGM5G&Cgx6GV9|(Iq?! zS2vQ@D$So&r^bb@#>w*4Pt)CRF~N))%L7)N$rkpPINH#me~BNA^@pvQdQA3^9?4K7 z4<;T1y=a&r>|I;Nwg;)p)2_g~{{`d&KsG{yYKub<6Gc8%*7mCn8Rl7(T|}Yr{7SqC zSsF9JG>Lf@O`x>s-i}RPWgtWaEp~X7Y`?p6X#mlVhg$vuO|fG{^S{)3Zu*f_Xj{Og zc4RgAXtwUPFuHMjI2LEvUC>j=yaV2Big)og4_T2Cc{fi5Sb0t$50+n)COpI zO}}j^c$~Mq1T^2sbhShUyme~-{&Eq0-XQ2KAu{zlnp?jSwyOb`$@pddH)eyWJUJ_4 zW=jA(`cPd2{{_v2x7|Uc!7Gh%qf?jU)w(f?*HLQ(Z~cu-MdY3GMBwH!HMDw;W6-#I zkNK_m&pwH5-UP20>twr$!MzWF$dGTq8aVBptlA#*WI8&B3S+8+Y-ZtwEzsWf4KSDg$9x zRI}$~rB2S?cxBH*(Lh!d#c$}LkX<=w*ti+H?d{7qZpD9*fQoRs1yK$>?+XX46gS5j zyh})<-=48u-B~dBJI96!eKFpdvF}Xed$nES3!HS0ztcJ3t9HmL#D$9E8TDkzzB&-z zEJpF@4!c?q-ZV$@(Esyv#dYR4#g_{ZGEc3PuwO99{bfJoMrnu!?XQdacq1jZii?)i zS*cB9g5W%$x>!EA*s91?uHUPdZ)DGXeq*7#__1YYcL+c$-rxvoPlMNBEqAzWVIOQ?$Y#gl|p6 z{SgW|6bd4_xdg_55Ja~n?crI4xufLq7mznSy#=?nYWcp6Dh9}M2PNsZUmE&ZInAQ` zldpW`A+y@r&k0E9lFU|`L74jn&v|2_vj0eqj36#r(QpjWPaWa$9ca^Qf+X}KGHqI6 z#vE{LJq6Vqj*>jW$cYCIo(b`9C>FQT7I!U;p7ADMX*srm=H;+%Bh1ZyRanwD%g{_N zb+u8tRX@!1LVxUqZdlvIG1?>twcry5MekOLQ`flpGqTbpQKjn00zDkbPR4jIU5bY` ziPOe76R#xEcQGYmTH;?-dN{hBC~Z|a9k`;t9a#tDZT+F#ui0!7FA$qz;Z2iQ18gJ+ zTR&C^hIzrj&45m1rTw(BO;FX2ZB;?hEmrRC(aFO+=iDDu)c+2lTu zzY~e3cXdG#4Hn&b+}<%SYRI_3Fz0iQk+QAP`;K6>`wo?~o!ccbZ1t0RcBLcunVzc5{*Nlv zQub{icX_l6e@zrI0H!Jun+w)L`xx1ao2zUtPwZTwHjvS3&F^{~-~G_d+^iVoip?lx zrMA5ND%ejC*U~DN^`TBO1V^QUQ&|#;>3;47K?%YEiikp#Hd@LAE-2IGP8a&ruGbJX z*MVGen`&KH*bnKdXXxeeo85qO3o_HTuLnBN+-_(?sry1_S%kS606$BXLCY^HxswZi ziMRfhq65{jkDG%wHMWp=>ltq@3RQ98W8U+|afpkW&-Bo1AEc$8Gf_2=i6ZiBhRvYR z&VMP?YmI-!a@24RF)1lhMd0XkHa+qb#isdp&{~|Z*2Cf9=mKnBNqjkw@b!6rJjWam zL!IRY-bWlz1x}9BqNG^`uP{0;I-V3mQ58PnXg`0>zKKf?k>nFx6(asSSNQgMuGo~4 zFX{+%!o}Sy>vgMA)by&+Y%!>24)G!yoET)1Y}~WHOli|_MoB2kjCkIE8_I8X=(Q6X zo@CA{igV4N*O{ouI$3A`kJWvNz1{C5$2|bz`~T8X`NlANxUfq2 zuC8;LU<^Y#Px(CVQxFey-eAp&HAo3ct{kVQw$JvXk4XM4y7*Nbh-d|!rtyL%CG=ui z{j|NYK~w32>(>>1v^L%67c%7a+vb7$_5w3XS3bRO)zKo)yCxh%QJnef-S=u>9(7?r z;Hzu%%=dwFZnV*<>~GhEy%XMwez?s|^H`UniZlw#f$f7@#;ALn3e(a_o9ZiNQJ&pS zi@qTu4-*a+sKm!diFpQ!jIkyA+tVcX>S~S|@Gw8^r{{2)w8 zC_z^b{AyAz%>K1tV}t@lA~Y92$w-P_Y?W#)+7zV*|BNlj^#?}0iGXcjXU;7{8|sY% z;ex#*jy66#9`T1eJj!MFBs)8lWvb&BRFXf%m)m#QR}wn=jawv3Pt?zsKzW;Sfcx5p z+*!eopJzmvK5Lg?XucwT1p__QJ;aaPs&&G5ZJFAx3A86Z%#14}8d`iEEVfj{@VGWY zEVf}}Fao~J?mlxol^l$Yy?;Ro5|esm92@1<@UvhPx!j;H>(>}kGJ0XwG9(Od@Q%fp zA)hOp{y$t$AW(UCy0^juY#F|5|5@u1up-w}$2I6{h7@Sux$)@7ELA=x?!U|ZG4s=h zb9*J!9R9jY5_W5dFhtd21wuu0W_Zr2E_!&^pf+%rSJf$i?#|+}U_chNs~e}**rU)? zY7`p#=N5-Y%u68JmT@;7h+C00U*Dp$ccS(lTc5~BgbQou3lL_;^`ajaY5JlUeGIRQ- zHlNJO=h@TAf~FAyyr#yv+xc_UG^x zAV%^@hUuU~wJRG4M0!hdRww*ri7&iI;ut|$ku1LyUlg&9Z093ww~**gX9*>da$Ko= zj+4S{zKcq%yXo8H2+aQFVH(qs@mwmDy>1bIL;GC5ZW4df`kb_GL+A$6#dPI3#uH6v zrjEVuw`YO#XKlzuc+Qr@j~f3qCW0&N$!D7Z^kCSIT5ay5X5||*^R_Rp|1T%ALelY%YtOcw z5n$bvfp_YBFPFW3oE1UO)P9#|6N7U?bGLwdHDfP}66NWcS%1@-km*;NQzYFaO&*-5 z{f?3$B@4?Cu)c3rAy`+BI%3>GI|rqo!3`?JanBFfDbXQNTP{5}!~-0$hAh5WEHI}y z$ov}#2WB2RjZ;$1RJvepl>PLq%E*_=KA>vN$`MakmrB?#TUNBBZe?ndyu7wt%e2f) zqUuwvEgzM0&?n3ilqHEpPpg$%IKxwT=vpRGts)1E19NU9Na?=`+Nwm|6$Az8Mj(pP z+JV$0znm39E=izyA5%4BE|MhE@qJIgi<#Nmkb8nk+pOSCp-Ce+{M+d3!gN~*ckG->Wv82lHt z5HDU}U+|}}b!kU-R0#>^a2N^RkH+!0BrD%nkESYx(#0bsTg4oO(k6%R3v~A2wQ_yo z2&BE&k(S)|K-{Hhm~*eLTlDdryLQ!>94dtZhPbxfUz4wP1(OIc5m49(8UFR{iWXgU z_ZddWgE#y2npW9URt6|kV>&WPi2unS&Oo~Y8e>Y{n%#v+8Ow&g@6|v_CQ+5LD z5)Vs;^sui{N2Gj&@S{$jV!7@5De`BH*1nQ+$-t22 z`E!Bld!49R4U)!p^j3|gQKb`y`iZZKRtP~tX1UxaT$B$tLTPac^HEjJOGojH0h~B& zXB#=1_IbaCB$)d?=q#HoodM*CO%W>fP#NCv|5*MUjs(k@Iz=j{&8yXgAUsF_7XpbP zgK|t`oLEw#2Lg%KXL{d42fN>B-SKB&w;ey!Usj-`0->%IKv_!pt@EfxOTou^>L=l|z*j(zF)E%;A1 zi_i2gK>nXYIHf-pLKM*Q^htD2`ztVFV#eYLwS#LQkwXX*zax>$*69p!ewR!QOqP^`>akb&u z*YAq=Y9A6Z`;(l(GyBP1aO>!eu$$B8AxS*@OO4JYQV!gJfCm6d{6nwdZ0$~w5M5Z^ z>LzMS*453PavW}IwKpPMYr>HvptY76afo5FVv~hjYQljbKRCNaHqul%(y!?6?#hQZ zRfTR-Zf9jBfX4l;bi#BmeD%zK1L(PB*>MTg8iZn3_h_})$Nu*2B#tpp*_{A?HPhNuSCqTsA(pvcagDiv&y|9gr*E_TB^gbP|KJkEyfDDQt3Mf3i>b8H|@~{lx!2eg}*k?MRieL z_n)zbeg>*K92Kg-&szgf886I#nDwd`+yT2*+Wzzm|r4bH(>EsLRNpo)IFp8hyt=&mXWGwE}QMT;(Na~*p_WIgh03fa5;_tkKT zx_Y;>Pbi?)jr}*t1NI{AV3&%xI92jSq3s!i4etD6(HEPB8p*Z6#-kM*nL=GojTT1} z^$e@7m0s*daY=77Y)N{~W=#)?&;4y ze5G*c2ZdB?q%=28i@AiT7;1P~miT2Yg>6@CI}X6aYN~L~2IH!K4Cf6ZP(S z<;D1bHRs{(Bf50$*Ef)eOBbOk`znLTPyHMB!8(S0_@tI1FI-Xty+g5Is^ksx13U~a zq>MB%xTZ}5vqYsX%?3T!SmL~EbPq3NgblG@j-cC>LlMx6B^|@)h4~g_AO9o<6R+pt znsNZePH7s-ELX8zR+vI=Ut@nRhW-u~<{HORKABwY-+{`6x0+8FTTHhMP%7*CEUMA~ z8EPyQM3OW*lxOv3OEonVTN0COa+w6H$b&|P1`i9Rp**1M>K)qgw$hekqt4~~=an8_ zjXN3LQ-YhfDr0ciKk3dQmmPNNkafGWGa6;(FnK9c8EJNyW}xMj86ttcox&t zprPN8zC@>VJik!0IgPv3$ENE7B>Ll(Jy+_s{HP~hAAZ=9jzM+q|Q1%=Gv(mt4y(LQW}aCt@RIxjRh zXIxIE0P8QPJLnU<)X>gTedE0r3;*_?&!SNF>mnC2$srr8>BVWYgH-!qyKV*{94nXc zj^f2#jeQEodqVKg9WvFZ?_}>0mb;ma(6Y?DOxR~YFcXTc9pZmQz9YTL&n!tC6Kk`z zGGY+f?ura-GSAmoJ%glBcuhRUFEh-I;Pj#alPly`FVl~0IGo7U=yk4N#Ww&u%*|QA zk}lWz%9!q-6NFqxkD7(NZT)Lmk}lI7{Tus$(;0B~>7^Vc;wXm|y=8l@YhN;v_tJ%p zVTnDlsh+qyncz~%CYGcaX01!*jH522aGuZCt%n_N?5-FRxT>xwc8im&#AM{YgbCcD z>e=B>Hb0Y{q33X-F56V-yD4DkHrF9}7Y|uQFyB6Ug><1gtMS^I??^#Q_=4(9Cm{G} zjVnHKP`NSiYqe7EXK1kguKGPeG)G7^gWIv53-M%B9oTD|^~7vE&XQFy&YPLSgI-HeB4PkU8uV`Q2Ol*({Z zU0r&Jn1}%a+1bRjWF6A_bt^L>ytHbwM?JkH7x)30xba$(DnL(4Y7ejde{pq=U1CPd zwoW?fv~4SG+qP|_ZQF0#wr$(CZQHhUv&TIj&OT$T59=3H)tWWee7wWYa*xy*{-DZ{ zCt1nVqvo{#^M)li4RFRIV761c{u{6h>M{&uS{jV$G>9Vbh37JGKGhtE|OI5HN$C6u6G-mvMx51;n#l_|3$p5 zMY&s(tYK-5=oAwX`O<#!XG=)`Xkni-aNUn@q>3K4MeofAQopUik0JDq$@7>*u#*Hf z9mlP@x>PV{g(5Y-88Rd?r_Ye0Wmca^4kN~D)pY{l?A64$k?b_u_GED*W`0=vOft7D zOsusNMj6Jo^@15V!&Yt>|6U8l4Mu3?me`3chD=E#B4Qyvt+OYp-@6i;(5|W-hHrKQ z8YEKSj5%qK8OPB<+FiQiy*g+6pG09o&r%)iSm)4m)*`BJrWz<|O~)%Isp=i|iOTV# z4i|yPI7Pb0i=A-YUUZ~d5o^Wy)?w_sDThR-W5iWgxZ`3M7&n9L7~I|?`7!OnXmU(Y z>HOJadm1+_2Q5*WSTawWLzo@JtEac#rHzpJt3_=z^n31XDDX%^un~QaTQnd*k62qBS<_wHY|%$I+8F$AWsraBSe7d;b>_*oc4V*)a93VSB4x`tC)G?}&L7 z@trR!k_hHLrbGEue0p+;lUfif@#;!U$W2t%?I;!~Otqi7r+vEaXd(6Q6s|RegAbO< zGcI@k9!un2I9(7f4N}FslV{a?X!dE0DTny`j#;;;e%BBsMVdIwE?Mj+9-A4DlxtwI ze+v!P{m;nrH0QbZELU!K1l=@o$)dCR!9#QEvCs@(U5Z2U&80z21g>IVqH?%kmYnzu z)`Rkmtlcg72*eX|cvW6Dr7va`PEt9URkO*cg1YfjT3+^QYn=oZ8489tGd0V8RnY;x zm3tW?5xI;G5xD}7y7fQ(HrCddf&_?aT2857W;X#6OyHn-J!bHza2_wh-JXb#E^wYI zRPQg0Hy|ZgD3%o{aQu0eOaBSDCyEa=Q6;+X-yYdP|G3_YtL?@d|EB2speM(E$QoF% zopC`-+#RN?zeG099N6$<>&9OS5F{q8B|~TX1=L)y5e_=3*lEA+F}8%gdH`Cc8yE`^ zQF^Ts<$=g|)!2BL+rf?e=S1M>rBidFf;AgvrX`fu+|Q0|rl6niGI{jaRB%ZOre}jM zwsg80V=rwlw zo{WmMWJ@#Zi&D1i8IV8UI2Vg7cWxH7wZwj z6dn6jYtdu0?9*SxoUokpfW27nX_)*{qx3g(7rdYQ56vR^qQ2K3$RlMEP&$*sl{NUlA# z&-$Q{qEorAVWpMFTJ~-h-|}ugwdpVECS=FR`mThbh6;URldWufV;1x1nZ$@|v$H*v zVwoU~oHjF=jah(ciq5Q{-V#SazHh^!XN*dy=r?WcAhMoibOpGLO^~N39sY9ZMQh1f z+tD>jg1U;*!7KWEq4IatO4EogPuWfAx#A&!3%f-X?CO&H`9jP?8Af0`Vv_T)o;2wD zmZ1HXKo8?jCP}o3Sj*tluc#a(QM+%=upk{$)(OV(*yCC~aBYydj>r%B+AQrpV7qP@ z%KAQ8nWCO7kJ~_>l_jz{3JQ-TvVX8PUuV&+v@tM_yK_PO1|`io6P6e}L$GiZt2=@H zb0{yyM349B*zBb~cA#_TL>PKF9M^6?4Q4k}>6JQRdu+s+HGhpeLcoR;{d$LfJCJSb zQh+Tx%lt=ke_{|HnWj)H zrUo7Sz{wjm3xy(0|G*m;`~J<8^`x}7WK~0~5>VvCpxe;s(nZJ0X*^}JXExS2caCzLP7P*>&y4*lT-(t< zI?1X%zZC+zVWXZH-V5(;C2;n=aP$yfDSSL^BkIMi!)YX(3FAj|?gckO$=pnmT&JAA6viGqx6qIl@F($d zB=7eF5>l_HQ5uOskvWhhgM!UF4ue#lR`sWphgH(*KIVwruQ< zG9z?1p2J?b!uXUlCQ>99FYS5+6;vX7glD>h%$WY|NM=Lc^)N4<;0Ha|W)q#^DWFh% zvzU08-ODO)`1$fg@9I%2Jcu_(!h1Q~{k)F`HR-|Yy&3MK(((E7DR6n&kN0-VJ1jT4 z8ofKn;*rsL^bO5mVk#3~cX~(lh1&aA=<>(W)q~N{RdvkAA0w1E=83^&^>lB4<|9^h zRqybo50>+=Ylc#@4NTxaf?HA_oDFCm+!%ux`p;swthFGqcKXLg!L@WXtJ3n1I1vO9z; zbYcMt5MhCpCH)s9mss8O6dqoLLT=nuG63V9e*Ti&I{3`tCFD-~9L^Qxi#adBC%a(X#e} zH%pkO*rxHo7xBzGcrkoffz|YuDAnsE??>lTleN3r;;m5b?-en)`>y;{ahk|%KZMA` zbbf`OH!`?Kh#xpaOYOOz^|;V)DxLVcn8@xQE_SB$88XRZrCqdLH6T~B6lx#F%uPwx z&fk+ePbUp(tSGMqZaNS#K0WY{s*Sfvv{!gk!7nAxHfgB4+a{4;0mKxnK9r$@h~)ZB z)JK)W{hTq$8~3};xBD{WPW6wG2Yw87DMq?IlS?kGJzGYQoSf7$zAk+O-=!GL-oiY) zy8JrLM%hB|j6ahzvD1yPXFcfl#fEdf9m2RV^SwUU#UYGVBaHGg5kBh8(M#0`Dzv1i z9_vi#@5d|S^)=);1H2fOP&ZR!N;Yt3f!kWOP$3oc1a*GG=R#72v&LhF6Y==@mr50h zW~K@7O*8cxM!%lMP(ns6RrDQV6Wm5dK%P1Kb<{-uev6-j-FMKL7%<*<;8Ed?96J8! zn5K!Za9AF1TQSmBF#dNU;n1+iNrN-iw>({^ZuK?Itv&XD+D~|BN@X&;HS{;`{B4!0 z7Q$!dbnNHtfYF;4gd*lA9LL}L`#844iZr07QG2H$&e8AzUuCfPKhiP)?u7^PM zJt!_vfp&S6L!J8kwSJbmBut5zpY_z?<5oq z$&6dXf^lEEgofPeZso5+T7q=ihT}hc=$X3rM!t%Gdv`B+rv-)jSJ1oBligNCxb%0P z(mS>xi+OtYe3n2;+0jH$^hpy$odCD|f!`d9QaWJAcV~)|k}|ot)pnW1BCz$7mBXZ` zizgxEBT-|O#+~|Z{vG1hr2E-L55_!y4(?$SzA*kfKl3DGWt{NWKOZX0w}0O@zKa1W z>NZHK$X_J2+(T0MY(MD&>V9Q_YCZ9plKq0V&g2uv1eep*kIsbHPo={Jn?q@viKKCi zT}zfoqV7^TY%xYQAmy=E!#$iCdYCCSn`bQ7CEFr1#S94w z>ibz_<^BWm!jvIZiuoa~NylvjO|Eih=1=sftiwO#x zLB0T}UV_8hln-V2$^JBOIfSvX%OMi7h70MVQnow+SCq`9vgh=Y%?`DC)6Bpnwo93Q zs9&MIfQUru6ERUd1C$PUr703!GKFbWl6{?2zkP*Vj(ZeQQ$Y^1vX$n|8=5|`O6kc= z4W=x)ni6LvzA0jpObld_aC=!ryb(8d#UKaDIkRPt2>bHOsjg z40%u<&9daF*Q9lB9v-uTPHzBZQ|Ln%bzsPy*|Jw9FTKpxW*O;Fjm<;j9~wh-#?V;p z`al3TM4Q6dV#S{alryV`TK*W?X5jWHbud#TUVHA92j;WyUZ5&99d-``WBU!eL-fH zp51yr41VVA;Pnqb@MC~kt4A2sxU4OKGi#><%4Q#P&QGN*ei9Y>x?u(bvrf5s+*^nGPuXPL2TZ^zX+hKu|g_4UjJq@MTR)Dw+9M@T{#R_2l9(dn&M;?Maup5hG zp(JNlQ-=30CY}d#C?P2#qzJXlM6$Z1Ho!zcM;v7qpAA(6>OJjf8MnkzMTZ*b7g54T zB*kcvgh`I2{cpuzbmZK5>r3~3J_|?ZI9^j+Obc_SXjBi{Z#=csnJ4L{h_e*T7Mek| zmX*pXGU+Ey3kF!FUkX|Jm|a&=lfvmug&5tdOfXY*nii8nv$9wkN9;E-3#xj%<)8@R z%|?*;3YH$k<{~)fAlC0~$W1wgvB=H_p7gIW{c*cHi!t!vP;LDbx3l6|AnSD^HA3%C z)Uqr}0^6l5A_K_FI_e09o5S|>ai+bIqB-8y0P&l(v1*3NYqbH|zffM?nHZ9Sqh{F#{7^A>j{qJK0FQ5_SHxW22m9PUnBct}K zjdcMZT>KJqtuk>oIZ;J956sY8-CAlNl4vg3K0*a#|MJf)hjTJ_@jGe5G+~}@jSH#; zvS(yEG6%|sZxw;e(+ytwU=#^(@iYndY=5$ixP^y%^BH6^oK~v5?se(iooHq~xgq#5 zbij>`)fJq}$<|5>4-p`Go~&cp&_IfqGI&ao@%FVn&dm#7DtqOGWJ8=2zp*-Dl8_Cn z-SOoSBTCz)|I}sl)g@RV5SW?KI>ziv$_Rs$wnr!6Ec}t;_`@0OVZO^F2@5*%s zy??|MCA1-)JWtq)d9;4R(nFzCuK0v%wv}Gm<=8rC5470Y`)l>%dgoW5%PlUc@a+|2 zh7WG_=wajyd%JAqXt5F~yJx9C+~=M-4Nuj^Q+p)C3w2m3V!y;i-ZC(=I-5 z-oVgwBB3%k{P6n=-yAJp6x{ej_`Y$fx1Hy2q~8V6Mt%Vg5In?tEJb&y@i}t<7*9U3 zWykD4VTAVU$A9;dhTokHImuV$-$j9W7342#7GnNYpPHadpUa&PKC+pH2E!lC>Zbb8 zxlrq39A0Od+paWckWR!%EoK8poD_u z6z^GPW)Kn)7@)&0^CGg`n6m{r>cUV>kl5=fX?#{wH%CL0?bs?Jc@W}W?O`exJI0V& zT{QTJh@Qz|n~3TZ6Oy3hZK{Cqde}(-@;dFNE8osf?pQJC)u7`4Uu&13E@{_s?dRG| zIGkmfhy`uM2KBHJOr2pk4O%+g-<+qMJUNMM8Sj3|tTCK&QXi)qS$75E<-b%c7&PC64gZZ$PP*FyZ||>aF*Oz z!=RwFC9Vi)plyEvI2>PU#iC4d>N`HJR49vMC89T_hw%($!?=4*?q7D|y+$Yy9lznV zv*qT5BkRgRzlRslxhL=BU%QqJG5pw6JBPTloyjCSBL%!!>D? zcq0ocaYZr8krKKXqo)cDR6$J*H3S+gEu#JRB^j=~)i4Ufvr^4;5vYpUIdHO7g*5dfrVu`{$YXUmDUTi5ITnD461i+dcn17$d zQ@#(tPiuj`lUd8LaAGUlYejN;PT4)-94mX`MO<2W{6q-n4M6-0v#x(jh>06?oe5Wa zJj~~iHO*bJTc0?MBeW4n(uBj=>h6;{r0pFV=;{h(^P@LJ*k|b=M3h(8fo?}3)P>F3 z_a%Ky8PYsZ&UFbM-m_WgM$?)P(~=h912hsqLP4oiu3WqoT@h`nU7{GRZ)_W=Bh+p6 zhsU>svAWDdd#ZP14=nwN)K( z^O+^A3aTGsf$ZRDt%>MFDQld?7NkYKG@c-Yoy_SSZ2nHpu=Y1Mh8at5%d|MT7I zw(D=*zpx0NM;xjV4%5XkM06NHb{exAukKsy@wMn(^jGK=B=?&d%*cwh?r``aB^TS< z)B2IE_0KRl=EUngNrm03Od=W|`rL@QWoPSg0V34ui*1FH$v_aFU<&i7t-K&F;=txY51nV)WnynK6LiVL)moZO*zugR zdVk`NrbIG#y5Dd>3PC)_X7B8%c-c9oHU8kt5#=UNBF?zY4RzIWpwanUoR#P=BE5|T zx-j~nsqSP9zYYbxkm9F3%PXbF;X;^ts=8A&=v>fdeFn!v@mYmV6@a0$xWh2Mkn=jJ zwR3`7atdoGMy=U1s5Kt;_9bdWfnQk>hbUGWyOVfQXQb$FWm>~a8O*P!h@_8$VXB~9 z#RA@rrMItZd1VU5YuJsbkYD}i1ejyxob4Bkefx2&Co%6k3aD8aS=yLJMXn|R#ps5&J#!12Dp~!=gfmGQzd*$Ji%?qh3jNW7e#dI zlNIZrq7Y;_Djg7)k{3dbrrRVdT%l?Z6W%0xeTEQ)e+eaf_YEE?%S_7+R1dTV{!es0 z>`$bVj(^eh8_Aaq-(>->uPCbbvAf1vm_G3I=W$dP5D?fAzM5WGiAabhdf%r0zBU$+ z*Rfbbf3q}4@%|(dE5xNn2s57=Lu-aKMAQqm2D3MG^>*sbwkm17@i(=4XYJ+AWJ9Ve zm#NOUL$F?%N!hmJtl__}pLn94`{~bzzawAXU|8Ss zWBsiZ6KR0V_Z4wwc7wc&f=ziL>2v3OFhx0kR(W%WA^%B<%FvWdc zg_t=G2xf`{HVlZ5tXQFHHXZ$@5l#Vdu_>p1nmHWES5T=qB5b(lZ2G_VKYa`As8+E^ zqy6P&h(9uCx5R)IJkF(UqZBZX{M!6-_X!$SrW1uD&+oEs`@3>~M(|)#wZD=Kx%8bE zl^PE9e?c-MpOOtp`AW|#RM6XVrv93=4aghX18J2A(-oaSR$F2NJv9FfL`SWXA=ui3 z!8BT5^iHXDjMpqkzHka~=laK*{$9O?V;L#MAz;L2-eU$ZJ3zj~3sobAFJRL)41@CG z+)ASuCh}E(-#0p1?K6cgwA6lsVy2p_MVI`kqNVBX)UkRJ_WOk2yvzGveSSK4Wh*v1CE6&;aGbK&I?R z6}X#bS2{OvWI2;X>dUNFzWWR3yhbO-br1FXr5xF;5ErCjqUuF5sr5qbcdSzdMd@jY zS(Tl2r<fp0#5y(}fyEQ6y)GicB77auO5^ zm{d{g$YJ*gR|b9fpPFNoTfCWk=pI@6mm>8+s5q4?L^ZeEiijimj_dkN*{KJb?AmTP z=?%XHaYWHqJ?zqhyf~irKS3mm?L*{Xorc||+th#7`^3g_eZaz+nl2;s@qgc5$zVuJ z@l)sn;L-LX8M36zmi7Ylf}TYtY%fYGWxEr)Z#9_aew!QmIV*nE!2ZY-f|SlFFdXaZ z`ugWBv=tNm84S8nn%{fLB=G7qt@88mw8U_O8t!LtpEa#M!#E=fRXY#ZSyC{2$hnwL z&=M!ntSLq6Y~M1mZmSC*EGN({J1j3gNM0%i%sig6(fCW|2F;w|*Zgkhbo4}bVfYca z-(W}5z4Jv*C~@~561AOZScj5Y5sScQd>eh%qMAq5O=|t1ZdBUDNv`TGJA6H!=r^0l z?cuk6I5+ILL7Uv5W@6GOwncKxQ?-wT;qcDHHSoZk_JB!rgg`_^e>CLJMqc>^M&VTh z2!B8&yf`y z*B(c2;ek7~?|_-LcBi!$}eJ-R%KFyuWQZH<`jutcHw`EJ-+VZv}NN%_~k4OtlWaNhVu z>2-)b4=j4(=q;m|2;>oh712t^0Q0(kK|SUBB{{kRl2^y2;xVWzBTO0t^;k@STvNu# z$)XCblCR(4)jQ>wT}AuTw!*q!1ys&OBq^BSa}mpf`-;; ze0Z{l*69Pv+en#k=`W2=5+a2%>%p9J_tLG+-H_s3i-o3@g{|tmFGtkYvVBhDSJM*r zT;j*fV$2byZe_-hJY7 z2vvIEu#&>X*@kn7Edyd@Evj-y9Vayu+ktA9{?;1dJ$Ku5nXYx#9SY8 z*acakE8;yYJ=g_Mzce@+=P@QUkD;@cggKbF6={nM)nOVLx3m%ZTBFlOF)YW4M=L;4 zR0^^V!;)8t;vtuEmvXCn*Ie7bOj9FiS}^r1bzMy`M7&{{ zZ;!Rkr;ZDW5w0{FiYsd&CJD%ZDYz>66SigHjIG~h6&e6UY8y9XuSx4jlUN@wWmrY_ zz7?rpc59;k`z2DnQ4lMqu8n`QMF}FkrMD;$i7=yA@_t3{{l;t;-xKsKkpgZhUn$`K zMqqVSpze|QfP-4g$MNmph7pT61~5t~&KgW9&FWw+J?=bXNBcWi+ygjV^!&w--naaq z?cP3^Ft7#g@Z_#2sj>WSw1b+e*<8TglI3>F+XB>;{|se_#vYfuV>r<0T{&!|2R0*X zllL=tPm^vRc2HFHfF#_vgV;C>n#>OV-7SkN($ZNQQI2v|R@6w?|63}Ey0zN^t{)Jb ziD?X;dpibhjmzIjZAzSdS3`8%p>RNL^pm|_qIMprR8G$n)ak#BkG_`xBkN?o+-+fMfS{o|@*v`CKkKs0Th?%e-bNp~2G+3$ISCTq{a1@NSyO|(+ibn89r8^@)UHb#9B+^$Co(P>MAk!6HTH=~INyMyE z7P5Fm#hIPl9vmkav(@yPih1mCMEvX-vUwz*y8!NPrz6Y>)A?P3n<=FVTGF3AsKpl+ z6^#LUNlD_+TiNJb<qJk!n zx=*#Ffh=+0Uyv%&@ae!0_p+r+uY={2rfrBia(@sq1E=!Ags(H>0|HP?!ltBAn% zL%(4+%w{!vYVlMu>PFIe8StVDCcRA{uBeZYQIdyi%5Y4KEbh1h!Yo&w?XlEx1^N}q z9N~$Mypf*!QkeQ__eX$0$ae4z{|3Jg_dv7B3_o2^sWGX}{unJrl+7Oa?jrTwEK!(k zyP9voN(7I5a6X}!g@~=zMlf7>ux+s`2p&TA@Fry1r0s6`2;ys=PmBi)RAnrnHr9%P z7*v4REP`l24jvAbHzN^+jZ%705>ASuRe8_?4yr0I*)pX~=kTeFY_{^wg4&My$EZ%d zHRr%8PcuZHetwFGH}3D{pb68D0Zv67Z7nkoWr6Fgv4s68zI@(H^<(0dW#u*9WEGxW zvFcX}#vIb*IZE~8c~~_mqHm-CKG1u=!!vaMIS~Vw1B*9Y=^AsyojR42K#wylk5bxU zpQ~MZC091>m#(4kSXX($`$E1O9F#%K)zp+ME~>D`EwZjiCP~gQpS*O3c!l93o2I8O zG02s@k0=8TuV>J(zu~a2^u{FY@lyvi5;8-7(=DR(FJlWtap_VjbfPm*th|<~QpzJp z+)VWiMQKz~4Ev_eg7WUyGI91&17W0kdVNy`G+XCXa#?+SnFAMl)`f%GzLUHC(ys=F z>LP)5uX=1UWvJs-!Lzll!+dsq-GfCp(lMEo=^`ifC@t^od}LXLs$#hw>`svEK}@bl zOp$)rF4kQKiEO8dK*}0GY@+BQEn#A5LV9;2PsprEa6&$Wn$Q2Htl&M$9Ij5plp^v_ z3&}x!_7E-nF};9HsFZ9ULOn-^U=!r3n=M*m8?DOO&5*+#Un^6yrD{#PMD^HBtN4~Y zdOY3*7S7#XcHbaNEBYP#sx<=a8D@9aCu`Ta&>ep}9RO{1eH;f~e!F;%rSpc!!tK@W zF@D?~%`^DB=Dmn_MX5dWDPIizueqJ9SE0~tdweF(?xsG~! zy*4CUv}`n>6L&l-i`~V$k(GEj+Wd#?<{OJfpY}kvLX!*U$>b#4%XPkZk?+-aokEoE zQT$I-j|rRl`F9%5oa@>e&up(fI6E{Qle1U)sXbEY?Q8~1U`Wo(znu5@nO052J2Oay zQ3r8xPXv?4?|Uu3Wx@J&Uq4~ahIdk7Wl+p0QD%v$pP!6*Ff#I8VgB4;sn~akl35Zc zKWwWe{E=Dx_6!tqI^*)#pE|J2uG)p%(%;Fy4TFOw@(~6h`wW;H^TY7Y44|@9{&Txm ztucH1BMVq2a@Ul6!u+?C^(sF07?ZsH&l>?`Dr-B;iy(7jQL0cG9?ui^k_4iL;9xE! z{hY%z#hUjC?-z~#l}5VsG^9=_iE9Q*|F^(ReCw@G(uBkJDVH}Vljo820dRCzWiftn z1&9 zuuajOf=Lg1-Ibgo?m8D_Xyz&2yUonNrPkSju>Yb&E&~?GEKlaL1{y-)tTOt{f^JoX zDQs?imP;`Uq=J@>6e+xlv^Hiic$@5gnP7;d3nb>_KlrzMlO;ZMrYH&zPpklBIby@) zBJ(CGWXRi1df>+xD;a_8T6DWBFUZ;S5gi!CtCYAUH(g4a(5ro%(2=Fu4W+(l=t0WM z7!(5<#g!;)O7B6ADdkFUMlH2D^^Kh5H zRMQR%1zlX9cM#z~9~nZ)-(dhmMy*2ByrYUx-N@yJj@q(6$5$M11zFFiFpb25Z$@3) z{W>;ph^gl`)(WcJ_)wIetI+rUH)KlJ~bsm3$A-@ zBR*1}38)m&GRwOw%O9$^wv!HMJm%-nBpHwvZwcS~$wbc|ynlO0{5B6%Gq(ZK^*AXH z-x=zU?@8-Loaxd%VV|HXp?9#_G;d3h=K_+zH!no;BhKxbBCLtW3TKXZew0u5^ieB? ze(#4wb(eilc7D(?c~S+`z|dbItcbd0iF3^MzQyzI>s^7~wX?-zrLOlodjGBu9{nKu zTJ0x;0WN#Ho5RF^JavPhm7HFMrn#3n38#Wj-Mg4(>`JT%;AkQ?yFn+ zqq;;He%}{z0O=o@3qSjT=!T6Qzaj#QaOWy;WVTz}R`A}(*%C>?S$hL}HPm;FAk)W2 z&zM>Gc)gEU_4R+G=OS&-s*vRFk?+btJ#|77sCgm29Lmo|>b|!@(YZCD&;e-;x01Y< zfd=ih!At9UPD#J%FGRctWhA6L5x|Fc6#a4P27xI?>9T*L-sOt>d4rSj^KE}0?OStg zhEI?fv^);?iIJM;?2&KHN8llGf33xN?tCpszq1RKs_Q?u$P;F+U{+Y2@-PzM;+1{P z@PKNyj7l7|T49!?Es1Wm-gw5djW|3feGiW+#n_B1inmAq+wnorgzQWCwo%Sez)nhl z3w}ct_Ls556+ez(9Gh_~%xQ8LBZmUp_zYT1z9krP29?b{j&(qvGxRC>K#cK7c1aP& zT2MjRje9ue1{#5zs8dEidMO()H%>P{iEnrp5EX%VW@QDMyLk+LH}aPtM?3G2;C5+)$|kEtVS?ufg0?;8e|j*3 zvO9W{Mbh7pW$e3xF`Z1#^Nr@iXJ1AN4d)&?ioetRsHQFFW zH8u&dJ%CH1{VQFsEnF$cw`}L}7-fsyluV~Fodzve_T{!)i8d>Z$b%xG#5nIP(0fy( z(Wv(pNtA(BoL)Ft!2iQc_pWs=EuS`6j#izUH#SvLbe`Ko_gYCQYbjt1qX3O1KwY5l zQ%$QsV^4uKI^}oXdr=qD<(*@cJBLHOFuR zDa78V1K4d&|up(`|J3C3Dp$eKt8wd&wqE5PkyzL zIk0cvDB-_-WBX5FA6>F-5EvAYsCur5wT$wYT7w(D4|Sz)h$|vgI-rJ{w`TuW@K1RI zN|c~)N4sngP;EPn$=XhhalO(w&xuUpe;Pg$Qj0P@Z-WhsCZ+s`C#AZZ@!s$nuda2d z1$I_`&}n3PT(us5OgU74eRcyMNPN6s=)yQ4dMETh5$0^4zQW`m0z7tsIZCr}trQw{ zP>-^Ldk98!lzckj5My{Vd~s)R;>snl0lNKjsFH&|!CS zf?6mqI&2w-_BM@{$yeO~m}_E(rkgp+B5G7^gHcIZ4U*czWJzO~iE?6xm0E6pg)6=! zV49anpcTR>C@;~qVZc`G7tsY3HA)~WrCTLEcIob<@N85R9ftv17!AxRx8GdMNc&JH zdF@%ER;&pdjD-M|JG3!F`Imb!)=Xq_9~*8z#DnR{rV}(Xwhk(=1$*?H9{d+w%*CX{ zd*fqKlk+weSJo|hXzQV#JVH82{X1r zT#_DbF)8!Pe)U-X z4@?>2>{vY4*sx{5v{G`haN*7!+D2DQaKM4W&yn`^;@0;U^!~e^R;b=jRpyIw82(rY zNOZS6*#&(J&6fTRn1`*1I)ys=j!-;PQ#lA{>~TgY%!|%tE9-WnrQ4CJakg(2y5y7`A&`2o@F>6(Na;o9vLq!`UnT?U0l38!dw3ADRZEf9yVPd8 z6)N)s&>Rb($w((T__*yuZ#!t)j#S^i;e6_(ilF%Q zOl|uOqgWk{+BrnoQJoIzjfa9%G=ru_k;UFRDqH6{n&?|GQ?}&Jf5cOVVHIWeCMM5x zA7Q((RHgZbUR1(A9r7bsStU%%(j?1q^dt7~eBzf8_rg|nN+;=vMAJL!t4CctFpBM` z*T+B@7pKSqm98~v^OhIwWgp0FximRoPkW?BX2g3wci&>5s=4xk0~WI5)%1lxD=UEjbEnN$ z!RXY15TK8fvp%3*A|=c=AV3HW?gDz&L*J(9GfSeMJ$-9!W?7%ni*+KKM7jqt;*QIF zS9@NMR9S91%{_nbGhkq$d-_S?7%NofE|DqPk*#2E^)O?AX%FVcv-#9NJYg%YPLHpH zDxjS{5+~5*=*#2JIdpU(?-EeZtL7^dNfqLceN+n-R_G(hB^-(tMtCeBDgg-*24eCI zJbD^UwGyo%6b;M@k1f+)rOo<}q78362b=Qmv=V7Scn-58mtY^B_&4yp1h{n<@A>3-yv~9vHH0v?0QohvNH28UR4p^7@ z{9ivL1$Jh$ zy=ID^WarkSeh%)8c0~!@KvbQ(2JAy*?r>W4zJowF#I1&Yp)z;(%RkU?u;H|`p?I)C zyqh_NtPsChROJ7FJ{K*MefN4`U{9rZgXZZiE|Xw*LGiBi9N%H});3A7c`LHf)=v1S zETcPJ@BVP3v^a4^0bX^3C%|z$*~r{*Wa*Se!8{D@qZTFTDQ{oQD;JW&$rrtwOScAi zV6*!z8?9MZA(|AztQMyE8An9ghv?%~c`yAFI7f0xe4kZIFB_Y#ScOpWN|@fPGfzmK zpUdRGZh-$D10)L6eUrhzeKSJ(_Kov@QX8m~ujjwR0~Rhw%P5-$otAENb$mX4xw|Na z725IFV8p4KP-7s%tIM>kZO)4TW%PK`driSQ%A| z(XTVx3(9TRnX}_8RQ_MUGI%`RrnhwYC#@S{A7uf&aw@; zC{_qU$_;|bGw))k(;Uvdv*Sjfm&CwIH9KS$j?S#q6q6~5q8$vQLsL~YwK?c#$+x*& zeQJG34N2zyPRewRD6(~3dCc%~wctlcjff5qfEcUL)PKh+A0#~21n94b99pds{(>!xmdm^zvw;FIf2O;p&JwXY*^=S z;3|$d$54sO-z$SQS<2tNT@~bW%w8RNdXMjCCk5=D95eLkb<4gfTO+$+P*CGnTXz4CMpR`*VH^5TZ)h zQm}Xb;^%icDJ1bAJefI`akQK>HG-{fq!F7DDBRR`Sk;jy(69Uy(~+-TeF;PPc#^6W z7Z9w{A9nzWcu(QTpQmB}a7uA~Nv2ByA~?w0F}C!CPVJK$JMUf(T~w#D6h=X{TcgN^ z-K;%n`Jkb2E4<4oIYDGq#QQAOd zn$>{;zid~U|3R~^4opbhTX2x|mfHT{@`Xghr3g1o9~F#o9EQ#qnQF2UVB6s0Ohy*p zz8i9i_#}4in^N?+q`S;2MXo-ZYH?mH_|0Q^%;X^80DZfT_G^>epB`J|@^!}3eQq=I z@3C*gTq+TWCW$dEy2C1jj0G|8ObvM+?;jj3_{bXl2-nKWTQHM8;dX_kX;m-*2F?oE za}wG8??=gP7eI8!=;+gL0Jy={INUOxWj?knQkq;>9LIeAF_ybI_vrb0sG#HERINf= zw=4l$$K}4Hd@!MYrSD%G*HE?=utBQwHGoWgRuOxMzuX_uUR+Xum}Olsj};P za#%34eNT3ka$uG%hTt~Q)G;ISn9+NnfJ~L%)FLBgVH`;Ho2u0d5Fzn`9J-{}#$Nt{ zppi*CgYbTx)$C%sQ{CKGcdfqF>z9mDp;{(8LlRll{XI+_4l~YdS>6#5CB9C6k~*4~ zYUij}uGUJvIU0fC<~6`zA|`5{c%}rCjXssd#V7+gd=VBu4+bqCaGuuQJD>NhHZrp& z(B+E`PiKOFrvq~wV4Ws=ZTfiT_&W)OkL;PAkJ>TG9M*Di_s*Hn5$MyqLpOA<;{K4k9t&>!4WMKaAfH4k#?fOnVVu+TaA*r zh(Z6=smu(0iy7n!BiIo{pwkckOdm2U(;;~s))M<}DzSh{>GJ3qW;zYhwl%!=Fuc+g zQjEMILbZvsUGGzTt@oF!3Cia?1Rag^bx}OBxWv3|^v~8_MwK6}l5I*iKcWP|8=Au} zZV1oaRHqo%fy<0EB(2|mSc0Rr4EAWj^H3+8b7_{J$n&F1!W}s~CUnjJkE?GC&LrTv zoQac(ZQHhO+qUgzGO=y*iETTRiEZ1qHt&8_yZdfc_m8gXAN`~I+}r2ga}MIt4Q~(e zFHa^wEgjOn=UEt$zC=6Gy+;!Zy>u0`s%hF65% z!wO5oD#eFzH}CG)LJ8hpG6odheJ6H+xZnrJe&RR@h2Qh>`rE^6nRU}ol(hJT%?JY} z>ehQw2NhyU``}xGP81{KKfCSn1jHj)r_en_@yoH+V(2OTM`l0Df!l!(&9gP%+?xGM z@U2ddqBsWtKsbOE&%J5ELQvP83h(T@czvQfX!^@Y{7(xK?0WuS<~x^bxM%sFCMx0nu5nXsm8n0?Kb_G@nDD2N1zR? zLU9iO(3wTR8khhX$<8VG1lX4So-2AXU$67m<ZJ3303^IIPiPvk=3!`Y~IK$*r`8e$I-jpe=W z;gGin@1DK-14GxG9fPHE>cp70*4^2!QXji z0aKyeHdpwNk+U}xU;p2_{;znSpuyCb^`FuJ4J{SiCA3fPX7jvwux3QeMxzych-t~i z>UdKyOfO{iz$kVKb(T3nnE}?E6Cs&h%>*>uwG|W!qR4|vQZ?_ea#-ryIBB)b_mqD+ z3DW)&y6%5H9JZ{)35$E-RmRu({Vut-Jes>db^xE(5wQ>m*;&(v)EC@ zmL|!)FaBhrS~o%95A0zJCn0b4ZL$#qB(vRzN2H{&6(CYGQZs_v=pasK^7<4l+p{VY zDT-7bt;)2lS+SO>S<6}6jkJnk*6Kt?!HVa;V`0#~5 zw(RjeGI_O2UE%+Ize(B+{>Do4^LPoerPIfV$s5RT#YJ{LDVuA?c8gVUy-P(BY1KZOVR1I=kJWNc@o-ssT{Xd zjo^uJSKZQ4Iyir`yiG(jb~FRhiBAZFZ<>9<6a|y zffc7_aCfSW8#AH2xr?1`tMvCgmx4?TnE`cAgg01)MoZdJap2&fCML9#4F?!UnAKA1 zF>cL`hzVz1u(Y{K+OeE3s9LQ)OMFjhDNOp;=?%jt5}E@5d8XWE@BN>3_G)ie=raTI zIS3%UWD?I)pk#vtQ@PWM`_#X!{O|sf96X$QRJK`nuLEVC~js*6- zP4DJ=9p5y2sgCFzDWTMC@W!@#UZC7rc1lzcR^RyGxSsF{_oxllLTA3L{1NwFmoixL z@(8s+Gw4qR6knN#t0&R~aQt3sW%nIrCBqM_QGDcnyw%y}5enbOaUiYtQ5G>QO`0WV zUZMV2C@W2R7bDdx9=Gw zW<3BuLxi$53vOz9w7$RWW@ceqjzAAHAR6!7)OP~mUCN9P8>8gN$?!-+O1ncQa-(5#TLens_0UU388O+Tu-hx1%AUp?G% zOiroMZxr^_Lr3*1l%cdgd@vJzx@~qYvQa>FvFG699#1U?$ycL96{UvAI^sQDe^69< z7$@^`@5R4{R3+=}d&89Ym37=WR1?mspfM(74W~aEjIln9$n zz;v>XW^#{^ej92FQu=3@Q;;9RR;soXfg$o0^>3+nL6G^f50RLRJOOLo(OAkhGDxFs zl=;);>cTIQ$081Y^Rf{S1P0yJhIur9^TEGqLld57e!5V2PcIKGH12C_e$GYf?Y}k5 zm5_M(L;tSN3S^oiwYPXrbwfUSb}R=M11<`F+h7Y55O#&t{WwhF*S+kQzeQdsBoQ$; z*=O!csnaS+T?V8&B{3k6?9}Q4OEX8rP$}JBs1n{-*AB`Frr6P@5Sua^Om^$?61i_$lJrD8NJi}nnP!h zcnkU)V!Lq!RM2LlpXOChhw&C@H#`m4BQ-y=3R!72dIoDujXd_2p5Y2FCMtVJJcZHa zq7I+yi~fEF!}Oa;bgCI{$(}zkSv1M2IZS`(Py3a_{;ui%k=j+8aGZI*-@<9Xb(rS| zIaRj@K0_4Z-XfiiIf}Mn%taH12V@KJ{{Qx5odwqx3LNaQ53b z4R#iG!9xU}3aNT)t+sgSYRH+Cm`6RQ(V&YETT7=uT6H_JdRH32STv$LOl+)4qv4)0 z(%>H_2B8JYg+gJ-Y>RJo`C_tDLFj9P0LqaeP?1q{gCYMx=E$-u{d=fJ&&z?3A2j#vzO)@ zL9@;voQ}iVfqnnBbo3X}6_YZq{u184Z=@&&_OdA&dENrHK+PC&x*7WAMhhiHA?z8G zKG_hc4`ajkWg0DxthTheOF87WBZH#cEOlUkQ|YDu$EM$r{n4iX``y(Q0K^k2^{^2BZa2&_jF>#G zM{|*H%dy3FEu&>Tey10kqqEaW0kau!)%qQZ9)0J(jU5T4VDrG)_t`cC_cJ3 za7_Pt7(_JfT|dSC?z_?$T~HDG`qIl$^*-Ot4=jBvG4UXa?|tV?z(yBDS@y+wFax4$ zW^q;K@JTla+5)XIKkWm4r3>dzdx+;w-=)~c9)$WXHIB5u9)@X`{y;B5Z$AVaisZ-P z<;1?#QpR}0J&}-2`$_oA4%ri4kAMRHRg_xjv&KM&{Q)y5Fe(#OZx}f;!NT6NoUO&B z0b`$61y=IiU|#8aOAp1>yp79m2=??2uR5i>>7+ImiVaAYF`tf>fvNuzoUB=>g|`X_ z!ib8MNr5UdHz$@FRZl--50C&{In~z>NQskG5QVxs8wSIn z_GF28F@-vYD-$bM(6SY#ty1SgHASQP2RpUCTQ%Pu)U1e~?|Q8a2!gqJ0tJr=wdlF@ zHsXU^u$$XVo!?TO`dW<6B3<|vaEDP74SK8W+|*`ld{9NqQFNd%;ry5HNS&|BjUM|f z5uAh>hFxnN#U&e`-yncl8XEQ&>qKonD!ojQ33kkqU>vQ7U$|pE`X4O%G5gn|5TIkk ziW3&uz{O0Y#fUCN91>4*8x@z>7-_JYGjL^`^$A%6m^8LIjGgT^=l>6mnhmvzRY-3D zDx#>=hz7XaBQJT1jV<1nHar5`W6%^DGfs=!kmer>f00meYZN2c=U?A1h3Z(0> zE04h1Ok=yhP9M2$)TXyhyA%4Z(0ajS&c zpy`%ry5>N;&A%r{=G|QOl?m^o)64U&Qklot871_qy3^xU)x3J;&Jn#f@#xv7Qq{%2 z)`M1l5-BnOe}$^{B<4gu`^bw4P*;!gooS(i_4h}#a@2=Y%mHC- z+#~8#{YEI2EjFy}7A?*|iG_2)S~H$OlgOdlM|5dn43GJ~#F+Xf8!caLBoK~6z%(W5 z=UThqap`M2wCQ1Mw2pC?U$EbYgjI@ul5{L4{m_`}F*-mmpbuJ#q%b2VGEdN1lI`uI zoL^%?eh@AJ8$`R${Md&sdtqnjCb{=?%`8iPJpTDuWD~-4|+d#1Zi^*@wT~QhYXsb^&s(>sQnAp2t6YVI9d}%%@W|3gG<*s_x2IJ4a8tAWbtj zTcU_fouGD?=&6;?aH9`>-1BR_olD|G{0UiAEz{i3Sr%AX$whgKOMs+Dl$+ z0@#@~Qw}VwI9|RET))e?1*g^=^K!f6mJ63hKB9Kt|Lo1#Tbdq7XVa)-0H|$WP~*4# z3AmauK*FgcdR%rhwnM8Mu?fpAjW}4%)JYLf5zjPUx*nYRhkxP(SqN`i0GTOOKzF>q zg=9N~*t{ooZiw2R_NnI?&GeSi{PkB?Hqo>mJ6)<%8Y^GCCX_UN5Qj*L{DxctiOoB* zuoSy1+5>aOLrs_DOh;#_44_Fz`tPlipYfWAe|Ou&R~eeEMSXTr>M7?FJ9D*oZ;Oa# z?}K9$X;GK#os8>UEO_-5P9Co$yIOU}pLW-)HlVsO?>8*`%t!ax?537mbt1){f>k&x z+n@FnvnJT80gDKU+`V6FAa1m03^xxsi)zClXUzOWbf3vy@|7Ii<<;Kf{3y}#kCrlk)BsD}Pp=2qV)!U#dt^TK~0dCYe z9#wce&d7o0&^dKCo-s&Epxb?#3FymZWVp+d`Isz|M#8%6DJj}|rt5&iYR<7I%M@rPA$$TBtO;{ech9Z8LM6nh zI;nelbM+8ZczTk*Y;R(BKTTk-Z5Zw_D%7cfk zfoJMs+5_?=tO)5lNGHhwBRnhsFHxLpm-2A8cblojy4T!}qj@7xA}`+*p{@DsVU~=J zZJa{&TUjP`U;biLVLZNC?_8$K=_Nbj#HD3WFM-QNk?zMW|IgfpdL@wk<1d7KHRzr$PDKogTjg9};Ce~0|h!dWLQ;gq} z;hx30)YkPCX7quXm>FM#FX<{6Ih*W>=g&D1Jp}PgW*W4)W;g?3R;FSu;4Y4Q&L@Gl zC9?+AlT5>rn{Ka6eY7k9z(|Q+?2{f^5R?!YV0M@3(<}BaJy7GO+aD#k73hW`8$0wD zHdBnG_QUES*{!R7M`PLGXj1;L#MxqmK`z=6(({(cU$ss>kg;5ApAFSDjS|Myfe=~U ze34db{XGVF*$_uy$-N$YO~VKq?}&O2(_Oj1lPRqaj2%*WuBP>%gmm$ye^Wi;ZwykE6QJg@GJJuU(YZ8{n2h zq?%^NgtZgEvdL>$IC7@yw1M6T6RHb$yZhgVo%8 z&?5V`%?r@)DN@MrJ}mIpyThH$34(onlz#JV6)= zA!|^q2=DP6wmqo(BcJ)=g9<(c%jK1r6_CV6WyR3QTrdYRsbyvexR90<8J;blNv5Y) z^Xl*2)5r=&@||QEW$;EVecoBl6lVtE*{J|HU84LE=(sAMd??ln?=tiM&rzy9 zgi6L2t#Sm>fZ@#|$XAA?;L)Jz!E33y&VQP%x~L;kmhr&3NrbME-Ffa5qv_`4j_MIM)KVmh2>bwl@M#8Sf%D96`oPRI|p*u_e zaU!8x7Dp9r4&|Dn#J{>Mixzz%vm=#d8hu~Ul%*AXhV(SNyF5dD^$M&cIh5NKUGikT z;(sl9K6goovj}Y+eSxC1ToZ-Is@nLyqx_#r^uG(yUuZ`V14Xd!6btB7CHbFpsn?f3 zApy2lre@Cn6KC9{Hld=UhWfP;w;#XXoMdfll20&i4U(++3$(H$Q42RGyef97zy>QRGX4tm{18{%gCfku2qidND&w{?}WHl}}7Z z4n3Fn5baY>}fosRvi->dptz*z!RGeaJ%_Qsr$(7UB0GpvgnIz|s6JSR6#TE0NZ-A)dgNYt| zg9;tB>xDZr-8U0nh}xe+7q=%iH@52b^w;TN+bITR4c8!!k%CJ<4pYu+$S;16Z1i9d zZ{eDfouk#pmldNa}JlGu%()rUYF$xdc>SFUiQFtP9`Z;hY%!4QA5PGkLGFas5TqDulg0*9mW}LwCv_^_$Fhj4?s1VRF4F(4Xx} zzGvklm-~miK$_HYKa1_=&73$|#5@~F6my5{ANm5G-eMH<%QG?Gt%?gk@}aP>hb>N^ zF`>tLMknVz`wallS{=U`ja$Q{;Iv|>Iv=)N<`yl~$}dtFFi-&(@zz{wp)(Omn$yX9IQ! z=lGdV>md11%|4+`v#wVyx$WbN~;6>yW&>O}mVpSV$N_+}_Hq7wMPC&Io z*iqPatWUu-$BIhTLgV!PLBQ!N_&z)MZNaW~{Qj8zvjZQtHqB4IY~JltxUunodt<+r zk$B>3#JLY!iUTl02xp7p-%aTa3v%MOM-%Mke?Pp)C46^8sKefvXX~UCJL;ujq5R`~ z+@_#{2uq#ngB&X+jrc;$P0b8Psb9cM$?RF*_x{<)zye-Kg}V?8Iewc~`D!5cjDv41 zl6N$oGNhCpF^b^B@JQz0rtRwTc3E47VlY)SdAAcm5CHJR3vZ-0Vy`ur-Zv)k869~2 zL+U*QKlvRbc@Jf_M;>jicBKeE&NutCcS^HhKlJZr>~wg7+lFJ+1h5acW;<3TC> zZxpZ7soyp>HUac!+Isv?4EI%E`3&^x7u_5I#MJ(#RqJj4F(Kpf*>bu3xZC=V^e0Li zMD80EPQ#2+dv9`S%n`Le|CS|&m|&P&%P#<6VAu4T*Qf6^q9QcPxsqhduDn=k!Q7+Q zs`2EZ29;NAy~$(D2iZtn&qL@LU*++EcnrKp8oaso6)|nbP6?xJ>XxduOVqE2zLt)K zc-5G0O-@Qx)#XEJQC$)v`i(Gyfz$UQCyIim#U*kh{$(??Eu;s^i}{5pdX4nn_Lcx< z2vGc~E~2ARIGyB1sy+8T5jZ~Xgkv9 z<)_o-lqVF`B`mBf%$kXS4~*ihQKy{WjjtU;=JhkiIHALb=p=F3ydK$2ZxMt*FP&0J~ZPE4KI%i8#<22kK1FiXD|gw z?eBLnlQA~py-w=Pv0zu*D!9;SN`=vGj+N**lXjZ>R_);|Y;3;!8U}L|ooB?H>6p4e z?=#V;vItxz5)4J)F;EY&xYgdeco31Whhs}5> zme8ls-kTL|WbMf8T@a^_ytOWRvy1yZf&{1Z>C6?;m4gYV>|%wommdJ@)SnQWyN8Bl z@@r;Gur~Z627uf#b6<-*l&JW$M{EC?c2gPOi#1DL@{Jurnd0yon%h$ZzXR>dlks~}0wGg~r93lY8_Q8ko8_n98RV$*n`yVLzb@{Vgr>4_ zI~0ppRi1t$SBm34f_(tSuy}+H7Ru`5>W)qd@!trniW^)T}>caS!WNgjyc`oW423Or-x!o2^%mzV#=JG8>0WHpWF z7dB;n#rO3V@ZEhtQ*b`!1v6M6csm8{5w4wry?O>enZSdBxrYJD@YR2Wrklf3B|(!5 z+kyP5MLWJFKW0Y9$s5yD&cmBrL)4RyTpL&_6}7=pC??ZWOmk1A_bkGZlC34mzae;)g!%~kieO-7*9xs?yq=opn_DY^-S>J z2>5`Qq3iceSNFmF2LXTl@U}B@aWzZze)viCA0z|=I2(EWPe+!mZsUQofVQ!ez?b4I zB5RC-Ge*uz6o0@?yd8%)0#8aRG{kNQ$s=zys);>@Ql#{48`V9FdR6H7naATw8e@I5&UvQ@rAW_V_@+NWAeTPH`2d7XuN#a-Wwf|Pj5t^}(KB|w-ab8O4qUd zqGl{yW3`y-GV?K)QTwsC{9+5RpDfV~z#M6u%lU0%^(WeOGNp66q)Pz;q9*=2KujmG z?t(=b$G&O0I$khT_!Z&<&AuECrd%-J>N<$e1UQzjBZ<&1wA=#GVw4!X#^(Qf!u9!* zF}2qtq8O`MOon+*&53?lpa0`}ADRLu1NLfqIl>MG$2!qW7|4mexc}1|;K%s=1osHx>v(6_R)PB&2elBW*| zWwbPsG{Hn@xOHFz4{kShH@i^#2th|1{G=48jk3n=GogWTY-{VEpzR<5=#JN4!LH478q@w6P+*J_H84Zzq=qX%gJK;7l<~zX(bU$8Jd&hDLm7QDQsdvM-`XjUk7|9ZO z9egTNsXXS3DHMD{`&;ioNAK05HS6c%aB$8r_`{{tyC0|U2HVkG<18J7WU)nNflHXc zcm;1>4W##HNG*-2B?ol^Iyq~2-42c&+2kd0>`+&Wpa-X8|A;Gb16(iTl?fvfhNTMA zfWm3FY#@#obOpI4k_|m9%*=&M9h}TlNHY^QS;*O}rEN-2NhJR)SabALCpD4~cD$l7 zu8DDMCR;2j!ko|7-Hn2x12T!ynR=ve8EmrHDO9bjsU7sw%p@a+w|U zqocqX+@Ilcdk&VYM5lW_Y|8nZ@TnJ&`53gn`(`%kRy(tTpDjmY5 z%7>_Cq$X2-unAwbTrrywaMwkn&fBJ9lb@qEb4YH7vjCNg1P|fals<4*13_)0)+3Nh z^=FnS?$82_zpP4n@qouyTZI5;F|RY#ea2e zIiizk1i*loL!%ovX3DuyaBCOPJ=nn=IT1Gf9&i`{obX2y&~3*vFgE`l!C;hPor5^T zub3z==u#-6ULU>`)!EbH_2SJqL+mRw%*th+s`r{qKbrgHc{yGT&@U-U4F9oFR1`|n zlMPmsewcke&chhk0S8A?*%^q7avh!E3inR?`KJf_y1}zW8@$1DYMN~JZGk#%2(ko5 z^c4{RFd^$SDQ~?bo(;j<34T(5hy!`yXhUkbQGL>|v-Qv;h?$`E zsDFhFja*o@Kz`b!ZDeo2j!zafH0(?Rs}>9FiZ>rhE$q4~z{l#*=`5=x>=wLj_$nT{ ztBwd3pE6g9q}WLVj+`D>(mlGpuFiaVM!w#zNq%5o=PHkz2x9S4rYQCk-Xf5gf6qe?aF_UE@mXhTRE3mHX0$q@!(q7+?;zTP}9l24W_J=j;bHsu7B5M!J z6C^#Z)v6-Z5V3&OYauh$csIb1F}y$uBdbA@*+;uo ztd>TWJD#_fCwVAjaAz^@m?M|SiP7Bb9^XtLESpMc7Q-#R6N0qnWG%q6{Lv0eF18{C zL&Go_YD^9G`_X>h__K|$X^O#Xh>NR|OxCh1TKXC#-Qflnmzt%utkY;#9cq%)m(H{6 zkuod_rPSsW;xmxjP*mW}u{kHLvo-hjQuUB`R_C2(q?1yTvO2OBgy%<;-l@$LV@fMG zVY2IneXAA9Q>;guWdKA9C8SFZz2eYxxI(tZP_j6urs9cf6RQ7M$&-l6j7n3`Z3>~t z=~zg7y&rHRomiSBm;cQ~u!n@mC}rjImSf$#6I0=*C0cT{@NhQgCkip6gg07WnHdt* zbqA8L8u?8}>OsjI?;eXIG?iPSp-p<_qc>YLy3f_3^%LWL+t{W!bJmz-{S%pao5vLE zltuOVOV@NZLy@0LLj2zIN$kfYEQWY#OE% z#bmIw05o4-NfFSI?yA`0lx;R_Dt^sqGx_tT6YHbIm zBX|$Z^8n1qiKsG=9@#x6jxToe+!+7JlTCk*vr+`FZuIek1eoHi(K&XNpkOtLuGHI88u zsPpMg-viLKX4+!Ba`IPFZ8L8!hVR;Wb_97it_ONBKU3_9xv{uQ+M{?x#3;)C&Q3{p z=Hif}JH)_LK;sHPd#Lx=<3rvYyWwBgAyhqYpf3n>vnj1{3{3wkyX;Fa^6~sbL~QdA zo=mK3WHc$R_F4q@8=rJhUd8O8P})^>j7kf&GXN<*+S@bkbo#j1%5Nr~g8d_0`~i?y z?31|ZN(%+_gdU~PWQA*>lR7}FV${rWYIp4)6T}Tc98;#mY*@Z9xk=ZEBUYwZ>IR~J z;Ah6J4$%J+DMq>`4^03o_*=6y$0V#^ZcjjQnfGebu zfdHe_@+DaxC-m5`nVl?48TrV^-G=9^APFx1*bz)@1}R>&`pAT-SD%uS=iqvic00R- zVHKuzs!_8U?82({A0~&!H5(MG!x&uMq_3?K=Y|Cxe3Lh5b%GmJOSn#N+yh7!)?M>h zZii)#AtyB{&Fl&tSU_!EMDnOhS?Y3aB!CCbUHFDRfg-J3=Me_qW9{(`&QbZEM^g_G@^Ds zGKO*%e92=HQR~TUi9fe!EG!#GO^pMtHD<>3tRw^3NdIZ6w8UA0rN6GGkJ3k=I9xpY z3%|yWDLh=cJf8G34Ic8LDc!|ZBEZH-8M-pPQu)uYu9|$2tFp9)rDAam&6AB&)5x?~ z9a=24w|Exvp`ty6fGAs5@8V1GY?GdTJYNVQM#`kEM0CjxaL0`^UyRnd?}A zeT3L7D|%IdoWO60`2uja7=V~xb(mA+pFMQ&5jvO{9aP*FN=|zvM1kHpN+&|2%>CtN zMe15PL4mbXxl6vY#-9!z>gM&Nz|Ec0gnOeeca_y|n*! zD}&MnAN~Z<2@k11*KyXHtoO6HrN_r~ifdlLK&S_>-60p(QlU0Cmeb z-2jHhGtF>A^DjbKJ<4E@BMA*IX}PDkrr2~q4y&SP7l z6$2MQK10)+LqSGEs!MK!Q7F@IKx*s$TLl>p`ghMv&!0x0m`{Ml4Z?fkZva=>*VWh0 z|J$0u{Ab@_g{KMv6g1TV0Yn6_CXb?ost3f=wgjR^s9qN6+R7BK3q=lxF=45o(iz{| zSt2lUXIq(_jraNp?K3FiqGG7lz_1~ciorb35UF07V0N3Pqjq5AY$xHB8j=KoNG~M|qns_7 zDr{KQW%Lq!Z$W>Q`IYw2tPA`@i$lk)7q|_30!35Dua_wG(R%#0V0|&@MNCE zZ@D)Qk!#O~a|rEeUN3~3#G4CelhM9ilV^)jW{*!s z8(6*L?)_s+p}IBHuCHV**XGsiE5GW)UNmz@#u;3?md2IMe-`1rO>el(3#!Rt)xv%S zk_N7Zy<)?{dbO>-L;l|{TFLmWRB9J8h%i81P6KBN%bz~MoRlc))Dsp4ag8XP z%t)dR*A&NAJ2FExx)&1{mPn3I5)|KuwV)8GX(P6guW}WzBgdh~dW6bprJ&`OtOpR1 z$IyE~*msS;Z_^;ba$FB{glDO_?0oXeJ^E;Wx~utYN7&YTr;ou8at%TW6GUmfZ!~B3 z9RuL>c#|D1+sMdS%vtZ-dW<=L-%YAfp^*u%VZP8|$xi$8qWxm^Gf9wCkJ>E7IE=W2 zBu9_|8RQCgY*)`kjx=KKmrvjZVBSBEf;{|=Fz-qt2q~==Vhvy52vYkQez|TqX=*T2ry~?EjX^i}wF>5zsUOifbX_ihO#)+sns=8?qrx(Dgjf4qLwCopd%};Zh06Pnr^nuO>=3T6J&Viu?EP5V(iQ1d{V;tj(7D6xi z+P?Imj_m+Us{A`;w3y?SR%OZqPmah}~#| z=E$&cqpPt{VQ~6F6}eST0kUWBOfgX+0~zj`3m_&Vn1-;QCZ7%JjVT^_IXFfVaC!SP zb!3jOj-NTU%`Tdp1wLJwJ1k<6bz(jPY-Xk4>iKiBYc<6ZVaNpkrfnt7>P>XT14ke^X9a0nj`f2kiDUC1b@p zE*=MH`Bq!@sTX$ymAX~rQ-uf3gc><1RdkV%0o$VOuIEI5eXH*vf3=M%Q8IcOMl}+1 zOsQM`l|r{$2)C_xF0lTM^=%0pE-%qdhw^uh{ht&4HNLR#-Ffi)UUbA1z8BvP&+rve z((^kLVF)L{ME8S}2f*4187~*?k!KP8cWb64@Kce6*Us?+hkj5j)Iq@VF_nOu2x7BCm!n0=ZB+}{cU)N1(#SwV{w?KAd7(fd zRZ!m&$B>rrr}yDk`#H=|HIGq< zVm3MjZ?!L7K~0d1NUo0)_#@Ze%GJ=?mE7nSbLgX2Uj74uIO;fE0FQ~Ke4JDpCIE}* zO1AG1ulnCJ8lc`}fJEFAp=PX8R#Z9u;}1IZafrR;)U`FW@$pNzC3ShD`^{qWWYqhc z7rJ~!S{ASh*3JT&I?ySK>Pltsmb@mHd{K4&7aljbs-oI5Ozodij9PrruHSIdMrcd? z_rAeD@eqQZ6NJ!jBgEaLb_i7C&1=g3@CX2*f>d@sgaM?g)39>tYc^%I`3DsDkyL(` zo){*%JHiN;b~dCpHIabB!&+k};g<=f)Ko|CRJ2!*QQIT~Qg6NXlf0f1#$RMrH22)M zwKs9<_~1$oRh+u3ZdZ^6qRQIRTLWmxu!|G^MCjCm z(XB{6Aq{1vNK*>;CEf_fm&VRK^6&<@2a2Ks3;-vSG@?MA)={px%Y7zNv{3!xg+oPA zmcPJ=h!g9*>M|A$n_M}%)*0e)xLj$`zq!A1b?R-(T~VKFl`uaS>a#piE_I*{M;+SQvC*sxUoJkgvETfl z`?+FiCMn}ui;FKKIRd}AaVoE6?YhmP?v1R`a%OUz59v`COs3S-siJA+PdrJ?W7Zk6 zb=J+?s6h|Av6=z@;PS{|N_>%)08ny#zzE8?U$Mlf=b~Gy!Km9e3)VEd%eL9oW!tuG+qUcLvTfV8ZQHhOZ{3NQ-JOXzaUy>} zX2zQjN9`S(@CWUM2KB2$P3^)uIE^-;gkqLn?q*VFrf$61tp6D9se1vma*ZF6&Umd+ z!5hA)2I*I4Z4G{zswsk6`?$?M-$|X{;4DT#6%io!yXoAeXEs7p`FUH`c8;N#BqE{b zlT7V)2zb{r$-^{;4>Fds+CPG7G2K8SXD2{~y8G~)>a=IL#^d?lFC|}IsnFeDtt!~J zZSPf`*O_hv1VW08v`+)rge?W$a)J;=4)mu2BFT}`T!RaQ*&+t!Pn}x-6ic(UOdJXy z2UV(%g{(5u`vV=jbE*Zh7>TFpFAboc;`XPf8I)&+=Y{m}jSeVl8RDW|{9)fm`O)X5 zLB+*a^_xf>Ny;!>qWbY8jZNiAMZzc^=`D)m0OF|*84$-4d}!+Oa_0mm&glDO~=WL!7~ z15wtzSNbI;-*x`naxZlye0j2{LLl@$iv#6(#=y+?CgXAPB?P3pHGXljW3H8E<%Z?E zj|F6M)yey3MN|Mp*aQ<2D?kgCljKr<1!2YYY+2Xc<{sLrdp_We-nF;!9is2k~K>pc**Di^yiY5 zn4qJ2Rm1VR`!=QccNDTEN&HlmW~$`DLt=(bQt6AIf{0RGslPcpG?CVr7FYWY{i5nB^!vH3Pc%cZNF(A$4Gvt*w+ z2!aK%-=rZA_Hw0nu#F}#)4^z zRUpIH%U!%`pp{m|5xgBa-2&1MQZj$5J@fUF4;c_EzL9m8C9!eze?Pjah=6*H$el@q z-f#lH6(m2kN;!iq@O)v;6=@7l2t!)j!DRkW<(vTuIRjL(TBrmyPzkAVGPxIFGy(Q$ z<~kqEJ?<1&MAaC6Q|Lhnnw=f(f-<_cxKtW}HPPmG=8UB}f2a&=4kk)?+g(n8ehOYy zta7Z-yLXvrV`F*_9MwH)=}Xv&1hVe-;DAO~Q^kXGOcz|`zGZol_%4ZM!z?qQj=qh@(Uv#_K6icXEeV8Bb�KEP#Z!tfw^L#wjC`K*s? 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

rF_w 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Ĩ&)Mq@4vu42T>9ZxPCV;l7Ddge07hcb~OU(JR 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

|l%ip5SZY4N};#2_Qp!XXZ>Z_CfqJEjz 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�FE`O3UV;Pzf%$Zh>3{X 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 z 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

U|N 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 diff --git a/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java b/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java index cb79c62a1..07de6be2b 100644 --- a/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java +++ b/src/main/java/zmaster587/advancedRocketry/AdvancedRocketry.java @@ -675,6 +675,7 @@ public void registerBlocks(RegistryEvent.Register evt) { AdvancedRocketryBlocks.blockIntake = new BlockIntake(Material.IRON).setUnlocalizedName("gasIntake").setCreativeTab(tabAdvRocketry).setHardness(3f); AdvancedRocketryBlocks.blockDrill = new BlockMiningDrill().setUnlocalizedName("drill").setCreativeTab(tabAdvRocketry).setHardness(3f); AdvancedRocketryBlocks.blockLandingFloat = new Block(Material.IRON).setUnlocalizedName("landingfloat").setCreativeTab(tabAdvRocketry).setHardness(1).setResistance(1f); + AdvancedRocketryBlocks.blockServiceMonitor = new Block(Material.IRON).setUnlocalizedName("servicemonitor").setCreativeTab(tabAdvRocketry).setHardness(1).setResistance(1f); //Assembly machines AdvancedRocketryBlocks.blockRocketBuilder = new BlockTileWithMultitooltip(TileRocketAssemblingMachine.class, GuiHandler.guiId.MODULARNOINV.ordinal()).setUnlocalizedName("rocketAssembler").setCreativeTab(tabAdvRocketry).setHardness(3f); AdvancedRocketryBlocks.blockStationBuilder = new BlockTileWithMultitooltip(TileStationAssembler.class, GuiHandler.guiId.MODULAR.ordinal()).setUnlocalizedName("stationAssembler").setCreativeTab(tabAdvRocketry).setHardness(3f); @@ -846,6 +847,7 @@ public void registerBlocks(RegistryEvent.Register evt) { LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockIntake.setRegistryName("intake")); LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockDrill.setRegistryName("drill")); LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockLandingFloat.setRegistryName("landingfloat")); + LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockServiceMonitor.setRegistryName("servicemonitor")); //Assembly machines LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockRocketBuilder.setRegistryName("rocketBuilder")); LibVulpesBlocks.registerBlock(AdvancedRocketryBlocks.blockStationBuilder.setRegistryName("stationBuilder")); diff --git a/src/main/java/zmaster587/advancedRocketry/api/AdvancedRocketryBlocks.java b/src/main/java/zmaster587/advancedRocketry/api/AdvancedRocketryBlocks.java index 23d487907..9bcd3d05d 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/AdvancedRocketryBlocks.java +++ b/src/main/java/zmaster587/advancedRocketry/api/AdvancedRocketryBlocks.java @@ -107,4 +107,5 @@ public class AdvancedRocketryBlocks { public static Block blockSolarArray; public static Block blockSolarArrayPanel; public static Block blockRocketFire; + public static Block blockServiceMonitor; } diff --git a/src/main/java/zmaster587/advancedRocketry/api/SatelliteRegistry.java b/src/main/java/zmaster587/advancedRocketry/api/SatelliteRegistry.java index 2c9921bd2..6504b9379 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/SatelliteRegistry.java +++ b/src/main/java/zmaster587/advancedRocketry/api/SatelliteRegistry.java @@ -137,7 +137,7 @@ public static SatelliteProperties getSatelliteProperties(@Nonnull ItemStack stac if (nbt != null) { if (stack.getItem() instanceof ItemSatellite) { - SatelliteProperties properties = new SatelliteProperties(nbt.getInteger("powerGeneration"), nbt.getInteger("powerStorage"), nbt.getString("dataType"), nbt.getInteger("maxData")); + SatelliteProperties properties = new SatelliteProperties(nbt.getInteger("powerGeneration"), nbt.getInteger("powerStorage"), nbt.getString("dataType"), nbt.getInteger("maxData"), nbt.getFloat("weight")); properties.setId(SatelliteRegistry.getSatelliteId(stack)); return properties; } diff --git a/src/main/java/zmaster587/advancedRocketry/api/satellite/SatelliteProperties.java b/src/main/java/zmaster587/advancedRocketry/api/satellite/SatelliteProperties.java index 9772ee9e2..ee3bfbec4 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/satellite/SatelliteProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/api/satellite/SatelliteProperties.java @@ -9,17 +9,20 @@ public class SatelliteProperties implements IWeighted { private int powerGeneration, powerStorage, maxData; private long id; private String satType; + private float weight; + public SatelliteProperties() { satType = null; id = -1; } - public SatelliteProperties(int powerGeneration, int powerStorage, String satType, int maxData) { + public SatelliteProperties(int powerGeneration, int powerStorage, String satType, int maxData, float weight) { this(); this.powerGeneration = powerGeneration; this.powerStorage = powerStorage; this.satType = satType; this.maxData = maxData; + this.weight = weight; } /** @@ -79,7 +82,7 @@ public SatelliteProperties setPowerGeneration(int powerGeneration) { } public float getWeight() { - return 50 + getPowerStorage() * 0.1F + getPowerGeneration() * 0.2F + getMaxDataStorage() * 0.01F; + return this.weight; } /** @@ -136,6 +139,7 @@ public void writeToNBT(NBTTagCompound nbt) { nbt.setString("dataType", satType); nbt.setLong("satId", id); nbt.setInteger("maxData", maxData); + nbt.setFloat("weight", weight); } public void readFromNBT(NBTTagCompound nbt) { @@ -144,6 +148,7 @@ public void readFromNBT(NBTTagCompound nbt) { satType = nbt.getString("dataType"); id = nbt.getLong("satId"); maxData = nbt.getInteger("maxData"); + weight = nbt.getFloat("weight"); } public enum Property { diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java index 78d949c9c..b86f33301 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java @@ -58,6 +58,7 @@ import zmaster587.advancedRocketry.event.PlanetEventHandler; import zmaster587.advancedRocketry.inventory.IPlanetDefiner; import zmaster587.advancedRocketry.inventory.TextureResources; +import zmaster587.advancedRocketry.inventory.modules.ModuleBrokenPart; import zmaster587.advancedRocketry.inventory.modules.ModulePlanetSelector; import zmaster587.advancedRocketry.inventory.modules.ModuleStellarBackground; import zmaster587.advancedRocketry.item.ItemAsteroidChip; @@ -68,6 +69,7 @@ import zmaster587.advancedRocketry.network.PacketSatellite; import zmaster587.advancedRocketry.stations.SpaceObjectManager; import zmaster587.advancedRocketry.stations.SpaceStationObject; +import zmaster587.advancedRocketry.tile.TileBrokenPart; import zmaster587.advancedRocketry.tile.TileGuidanceComputer; import zmaster587.advancedRocketry.tile.TileRocketAssemblingMachine; import zmaster587.advancedRocketry.tile.hatch.TileSatelliteHatch; @@ -2192,6 +2194,23 @@ public List getModules(int ID, EntityPlayer player) { modules.add(new ModuleImage(173, 168, new IconResource(98, 168, 78, 3, CommonResources.genericBackground))); } + // Broken parts + // TODO Add check for the service monitor + + if (storage.hasServiceMonitor()) { + List serviceMonitorList = new ArrayList<>(); + + int ii = 0; + for (TileBrokenPart part : storage.getBrokenBlocks()) { + serviceMonitorList.add(new ModuleBrokenPart((ii % 5) * 18, (ii / 5) * 18, part.getDrop())); + ii++; + } + + modules.add(new ModuleContainerPanYOnly(8 + 80, 17, serviceMonitorList, new ArrayList<>(), null, 50, 45)); + modules.add(new ModuleText(80, 5, LibVulpes.proxy.getLocalizedString("msg.serviceStation.destroyProb") + + ": " + (int)(this.storage.getBreakingProbability() * 100) + "%", 0x000000)); + } + //TODO DEBUG tiles! //Render TEs in a pan-able list y-axis only List tiles = storage.getGUITiles(); @@ -2200,12 +2219,12 @@ public List getModules(int ID, EntityPlayer player) { TileEntity tile = tiles.get(i); IBlockState state = storage.getBlockState(tile.getPos()); try { - panModules.add(new ModuleSlotButton(18 * (i % 9), 18 * (i / 9), i + tilebuttonOffset, this, new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)), world)); + panModules.add(new ModuleSlotButton(18 * (i % 4), 18 * (i / 4), i + tilebuttonOffset, this, new ItemStack(state.getBlock(), 1, state.getBlock().getMetaFromState(state)), world)); } catch (NullPointerException e) { } } - modules.add(new ModuleContainerPanYOnly(8, 17, panModules, new LinkedList<>(), null, 171, 40, 0, 0)); + modules.add(new ModuleContainerPanYOnly(8, 17, panModules, new LinkedList<>(), null, 65, 45, 0, 0)); //Fuel modules.add(new ModuleProgress(192, 7, 0, new ProgressBarImage(2, 173, 12, 71, 17, 6, 3, 69, 1, 1, EnumFacing.UP, TextureResources.rocketHud), this)); diff --git a/src/main/java/zmaster587/advancedRocketry/inventory/modules/ModuleBrokenPart.java b/src/main/java/zmaster587/advancedRocketry/inventory/modules/ModuleBrokenPart.java new file mode 100644 index 000000000..5066fa63f --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/inventory/modules/ModuleBrokenPart.java @@ -0,0 +1,74 @@ +package zmaster587.advancedRocketry.inventory.modules; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; +import zmaster587.libVulpes.LibVulpes; +import zmaster587.libVulpes.gui.CommonResources; +import zmaster587.libVulpes.inventory.modules.ModuleBase; + +import javax.annotation.Nonnull; +import java.util.Arrays; +import java.util.List; + +public class ModuleBrokenPart extends ModuleBase { + + private final ItemStack part; + + public ModuleBrokenPart(final int offsetX, final int offsetY, @Nonnull ItemStack part) { + super(offsetX, offsetY); + this.part = part; + this.sizeX = 18; + this.sizeY = 18; + } + + @SideOnly(Side.CLIENT) + @Override + public void renderBackground(GuiContainer gui, int x, int y, int mouseX, int mouseY, FontRenderer font) { + // render stack + + TextureManager textureManager = Minecraft.getMinecraft().getTextureManager(); + textureManager.bindTexture(CommonResources.genericBackground); + gui.drawTexturedModalRect(x + this.offsetX - 1, y + this.offsetY - 1, 176, 0, 18, 18); + int relativeX = x + this.offsetX; + int relativeY = y + this.offsetY; + int zLevel = 500; + + GL11.glPushMatrix(); + RenderHelper.disableStandardItemLighting(); + RenderHelper.enableGUIStandardItemLighting(); + + GL11.glTranslatef(relativeX, relativeY, zLevel); + Minecraft.getMinecraft().getRenderItem().renderItemIntoGUI(part, 0, 0); + Minecraft.getMinecraft().getRenderItem().renderItemOverlayIntoGUI(font, part, 0, 0, ""); + + RenderHelper.disableStandardItemLighting(); + GL11.glPopMatrix(); + } + + private boolean isMouseOver(int mouseX, int mouseY) { + int relativeX = mouseX - this.offsetX; + int relativeY = mouseY - this.offsetY; + return relativeX > 0 && relativeX < this.sizeX && relativeY > 0 && relativeY < this.sizeY; + } + + @SideOnly(Side.CLIENT) + @Override + public void renderToolTip(final int guiOffsetX, final int guiOffsetY, final int mouseX, final int mouseY, final float zLevel, final GuiContainer gui, final FontRenderer font) { + super.renderToolTip(guiOffsetX, guiOffsetY, mouseX, mouseY, zLevel, gui, font); + + if (this.part != null && this.isMouseOver(mouseX, mouseY)) { + List list = Arrays.asList( + LibVulpes.proxy.getLocalizedString(this.part.getUnlocalizedName() + ".name"), + LibVulpes.proxy.getLocalizedString("msg.brokenstage.text") + ": " + this.part.getItemDamage() / 3 + ); + this.drawTooltip(gui, list, mouseX, mouseY, zLevel, font); + } + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/item/ItemSatellite.java b/src/main/java/zmaster587/advancedRocketry/item/ItemSatellite.java index 50eabb4aa..8510fc3f4 100644 --- a/src/main/java/zmaster587/advancedRocketry/item/ItemSatellite.java +++ b/src/main/java/zmaster587/advancedRocketry/item/ItemSatellite.java @@ -66,6 +66,7 @@ public void addInformation(@Nonnull ItemStack stack, World player, List SatelliteProperties properties = SatelliteRegistry.getSatelliteProperties(stack); int dataStorage, powerGeneration, powerStorage; + float weight; list.add(getName(stack)); list.add("ID: " + properties.getId()); @@ -90,6 +91,12 @@ public void addInformation(@Nonnull ItemStack stack, World player, List else list.add(ChatFormatting.YELLOW + LibVulpes.proxy.getLocalizedString("msg.itemsatellite.nodata")); } + + if ((weight = properties.getWeight()) > 0) + list.add(LibVulpes.proxy.getLocalizedString("msg.itemsatellite.weight") + weight); + else + list.add(ChatFormatting.YELLOW + LibVulpes.proxy.getLocalizedString("msg.itemsatellite.noweight")); + } else { list.add(ChatFormatting.RED + LibVulpes.proxy.getLocalizedString("msg.itemsatellite.empty")); } diff --git a/src/main/java/zmaster587/advancedRocketry/item/ItemSatelliteIdentificationChip.java b/src/main/java/zmaster587/advancedRocketry/item/ItemSatelliteIdentificationChip.java index b851f176a..dc39132a1 100644 --- a/src/main/java/zmaster587/advancedRocketry/item/ItemSatelliteIdentificationChip.java +++ b/src/main/java/zmaster587/advancedRocketry/item/ItemSatelliteIdentificationChip.java @@ -82,6 +82,7 @@ public void setSatellite(@Nonnull ItemStack stack, SatelliteProperties satellite nbt.setString("satelliteName", satellite2.getName()); nbt.setLong("satelliteId", satellite.getId()); + nbt.setFloat("weight", satellite.getWeight()); stack.setTagCompound(nbt); } diff --git a/src/main/java/zmaster587/advancedRocketry/tile/TileBrokenPart.java b/src/main/java/zmaster587/advancedRocketry/tile/TileBrokenPart.java index 9d22ec7fa..8922ab5fb 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/TileBrokenPart.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/TileBrokenPart.java @@ -1,6 +1,8 @@ package zmaster587.advancedRocketry.tile; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import zmaster587.advancedRocketry.util.IBrokenPartBlock; import javax.annotation.Nonnull; import java.util.Random; @@ -72,6 +74,10 @@ public boolean canRenderBreaking() { return true; } + public ItemStack getDrop() { + return ((IBrokenPartBlock) this.getBlockType()).getDropItem(world.getBlockState(pos), world, this); + } + @Nonnull @Override public NBTTagCompound writeToNBT(final NBTTagCompound compound) { diff --git a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java index 1a382c58c..af31a044c 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java @@ -431,7 +431,7 @@ public List getModules(int ID, EntityPlayer player) { private void updateText() { if (linkedRocket != null) { if (!(linkedRocket instanceof EntityRocket)) { - System.out.println("Huh, error...."); +// System.out.println("Huh, error...."); destroyProbText.setText(LibVulpes.proxy.getLocalizedString("msg.serviceStation.destroyProbNA")); return; } @@ -504,7 +504,7 @@ public int getProgress(int id) { if (world.isRemote) if (id == 0) { if (!(linkedRocket instanceof EntityRocket)) { - System.out.println("Huh, error...."); +// System.out.println("Huh, error...."); return 0; } return initialPartToRepairCount - partsToRepair.size() - (int) Arrays.stream(partsProcessing).filter(Objects::nonNull).count(); diff --git a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileSatelliteBuilder.java b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileSatelliteBuilder.java index b63c057b0..3d8847b2c 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileSatelliteBuilder.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileSatelliteBuilder.java @@ -14,6 +14,7 @@ import zmaster587.advancedRocketry.dimension.DimensionManager; import zmaster587.advancedRocketry.inventory.TextureResources; import zmaster587.advancedRocketry.item.*; +import zmaster587.advancedRocketry.util.WeightEngine; import zmaster587.libVulpes.LibVulpes; import zmaster587.libVulpes.client.util.ProgressBarImage; import zmaster587.libVulpes.inventory.modules.*; @@ -97,6 +98,7 @@ public boolean canAssembleSatellite() { public void assembleSatellite() { //Basic properties of the satellite int powerStorage = 0, powerGeneration = 0, maxData = 0; + float weight = 0; //Get the primary function from slot 0 String satType = SatelliteRegistry.getSatelliteProperty(getStackInSlot(primaryFunctionSlot)).getSatelliteType(); @@ -114,11 +116,13 @@ public void assembleSatellite() { if (SatelliteRegistry.getSatelliteProperty(stack).getPropertyFlag() == SatelliteProperties.Property.DATA.getFlag()) maxData += SatelliteRegistry.getSatelliteProperty(getStackInSlot(currentSlotIndex)).getMaxDataStorage(); } + + weight += WeightEngine.INSTANCE.getWeight(stack); } //Set final satellite properties //720 here is the base power buffer, so the satellite has SOMETHING to run on - SatelliteProperties properties = new SatelliteProperties(powerGeneration, powerStorage + 720, satType, maxData); + SatelliteProperties properties = new SatelliteProperties(powerGeneration, powerStorage + 720, satType, maxData, weight); properties.setId(DimensionManager.getInstance().getNextSatelliteId()); //Create the output item diff --git a/src/main/java/zmaster587/advancedRocketry/util/GraphicsHelper.java b/src/main/java/zmaster587/advancedRocketry/util/GraphicsHelper.java new file mode 100644 index 000000000..5f966181c --- /dev/null +++ b/src/main/java/zmaster587/advancedRocketry/util/GraphicsHelper.java @@ -0,0 +1,102 @@ +package zmaster587.advancedRocketry.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import org.lwjgl.opengl.GL11; + +public final class GraphicsHelper { + + public static void drawCenteredScaledString(String text, int x, int y, float scale, int color) { + drawCenteredScaledString(Minecraft.getMinecraft().fontRenderer, text, x, y, scale, color); + } + + public static void drawCenteredScaledString(FontRenderer fontRenderer, String text, int x, int y, float scale, int color) { + GlStateManager.pushMatrix(); + GlStateManager.scale(scale, scale, 1.0F); + drawCenteredString(fontRenderer, text, (int) (x / scale), (int) (y / scale), color); + GlStateManager.popMatrix(); + } + + public static void drawScaledString(String text, int x, int y, float scale, int color) { + drawScaledString(Minecraft.getMinecraft().fontRenderer, text, x, y, scale, color); + } + + public static void drawScaledString(FontRenderer fontRenderer, String text, int x, int y, float scale, int color) { + GlStateManager.pushMatrix(); + GlStateManager.scale(scale, scale, 1.0F); + drawString(fontRenderer, text, (int) (x / scale), (int) (y / scale), color); + GlStateManager.popMatrix(); + } + + public static void drawCenteredString(String text, int x, int y, int color) { + drawCenteredString(Minecraft.getMinecraft().fontRenderer, text, x, y, color); + } + + public static void drawCenteredString(FontRenderer fontRenderer, String text, int x, int y, int color) { + drawString(text, x - fontRenderer.getStringWidth(text) / 2, y, color); + } + + public static void drawString(String text, int x, int y, int color) { + drawString(Minecraft.getMinecraft().fontRenderer, text, x, y, color); + } + + public static void drawString(FontRenderer fontRenderer, String text, int x, int y, int color) { + fontRenderer.drawString(text, x, y, color); + } + + /** + * Represents the GUI adaptation of glScissor mechanism + * Given coordinates are from up-left corner + * + * @param x start X coordinate + * @param y start Y coordinate + * @param width new window width + * @param height new window height + */ + public static void glScissor(int x, int y, int width, int height) { + GL11.glScissor(x, Minecraft.getMinecraft().displayHeight - (y + height), width, height); + } + + public static void drawTexturedModalRect(int x, int y, int width, int height, int u, int v, int textureWidth, int textureHeight, int textureSizeX, int textureSizeY, float zLevel) { + float f = 1.0F / textureSizeX; + float f1 = 1.0F / textureSizeY; + + GlStateManager.enableTexture2D(); + + Tessellator tess = Tessellator.getInstance(); + BufferBuilder bb = tess.getBuffer(); + bb.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); + + bb.pos(x, y + height, zLevel).tex(u * f, (v + textureHeight) * f1).endVertex(); + bb.pos(x + width, y + height, zLevel).tex((u + textureWidth) * f, (v + textureHeight) * f1).endVertex(); + bb.pos(x + width, y, zLevel).tex((u + textureWidth) * f, v * f1).endVertex(); + bb.pos(x, y, zLevel).tex(u * f, v * f1).endVertex(); + + tess.draw(); + } + + public static void drawTexturedModalRect(int x, int y, int textureX, int textureY, int width, int height, float zLevel) { + drawTexturedModalRect(x, y, width, height, textureX, textureY, width, height, 256, 256, zLevel); + } + + public static void drawColoredModalRect(int x, int y, int width, int height, float r, float g, float b, float a, float zLevel) { + drawColoredModalRect(x, y, width, height, (int) (r * 255), (int) (g * 255), (int) (b * 255), (int) (a * 255), zLevel); + } + + public static void drawColoredModalRect(int x, int y, int width, int height, int r, int g, int b, int a, float zLevel) { + Tessellator tess = Tessellator.getInstance(); + BufferBuilder bb = tess.getBuffer(); + bb.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR); + + bb.pos(x, y + height, zLevel).color(r, g, b, a).endVertex(); + bb.pos(x + width, y + height, zLevel).color(r, g, b, a).endVertex(); + bb.pos(x + width, y, zLevel).color(r, g, b, a).endVertex(); + bb.pos(x, y, zLevel).color(r, g, b, a).endVertex(); + + tess.draw(); + } +} diff --git a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java index 82b9a2d8e..5028fde5e 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java +++ b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java @@ -66,11 +66,16 @@ public class StorageChunk implements IBlockAccess, IStorageChunk, IWeighted, IBr private ArrayList liquidTiles; private Entity entity; private float weight; + private boolean hasServiceMonitor; public Block[][][] getblocks() { return blocks; } + public boolean hasServiceMonitor() { + return hasServiceMonitor; + } + public StorageChunk() { sizeX = 0; sizeY = 0; @@ -222,6 +227,10 @@ public void recalculateStats(StatsRocket stats) { drillPower += ((IMiningDrill) block).getMiningSpeed(world, currBlockPos); } + if (block.getUnlocalizedName().contains("servicemonitor")) { + hasServiceMonitor = true; + } + TileEntity tile = world.getTileEntity(currBlockPos); if (tile instanceof TileSatelliteHatch) { if (ARConfiguration.getCurrentConfig().advancedWeightSystem) { @@ -320,6 +329,10 @@ public static StorageChunk copyWorldBB(World world, AxisAlignedBB bb) { ret.blocks[x - actualMinX][y - actualMinY][z - actualMinZ] = state.getBlock(); ret.metas[x - actualMinX][y - actualMinY][z - actualMinZ] = (short) state.getBlock().getMetaFromState(state); + if (state.getBlock() == AdvancedRocketryBlocks.blockServiceMonitor) { + ret.hasServiceMonitor = true; + } + TileEntity entity = world.getTileEntity(pos); if (entity != null) { NBTTagCompound nbt = new NBTTagCompound(); @@ -361,15 +374,11 @@ public static StorageChunk copyWorldBB(World world, AxisAlignedBB bb) { public static StorageChunk cutWorldBB(World worldObj, AxisAlignedBB bb) { StorageChunk chunk = StorageChunk.copyWorldBB(worldObj, bb); - float weight = 0; - for (int x = (int) bb.minX; x <= bb.maxX; x++) { for (int z = (int) bb.minZ; z <= bb.maxZ; z++) { for (int y = (int) bb.minY; y <= bb.maxY; y++) { BlockPos pos = new BlockPos(x, y, z); - weight += WeightEngine.INSTANCE.getWeight(worldObj, pos); - //Workaround for dupe TileEntity tile = worldObj.getTileEntity(pos); if (tile instanceof IInventory) { @@ -384,8 +393,6 @@ public static StorageChunk cutWorldBB(World worldObj, AxisAlignedBB bb) { } } - chunk.weight = (int) weight; - //Carpenter's block's dupe for (Entity entity : worldObj.getEntitiesWithinAABB(EntityItem.class, bb.grow(5, 5, 5))) { entity.setDead(); @@ -465,85 +472,6 @@ public void setBlockState(BlockPos pos, IBlockState state) { metas[x][y][z] = (short) state.getBlock().getMetaFromState(state); } - //TODO: optimize the F*** out of this - public void writeToNBT(NBTTagCompound nbt) { - - if (world.isRemote) return; //client has no business writing here - - nbt.setInteger("xSize", sizeX); - nbt.setInteger("ySize", sizeY); - nbt.setInteger("zSize", sizeZ); - nbt.setFloat("weight", weight); - - Iterator tileEntityIterator = tileEntities.iterator(); - NBTTagList tileList = new NBTTagList(); - while (tileEntityIterator.hasNext()) { - TileEntity tile = tileEntityIterator.next(); - try { - NBTTagCompound tileNbt = new NBTTagCompound(); - tile.writeToNBT(tileNbt); - tileList.appendTag(tileNbt); - } catch (RuntimeException e) { - AdvancedRocketry.logger.warn("A tile entity has thrown an error: " + tile.getClass().getCanonicalName()); - blocks[tile.getPos().getX()][tile.getPos().getY()][tile.getPos().getZ()] = Blocks.AIR; - metas[tile.getPos().getX()][tile.getPos().getY()][tile.getPos().getZ()] = 0; - tileEntityIterator.remove(); - } - } - - int[] blockId = new int[sizeX * sizeY * sizeZ]; - int[] metasId = new int[sizeX * sizeY * sizeZ]; - for (int x = 0; x < sizeX; x++) { - for (int y = 0; y < sizeY; y++) { - for (int z = 0; z < sizeZ; z++) { - blockId[z + (sizeZ * y) + (sizeZ * sizeY * x)] = Block.getIdFromBlock(blocks[x][y][z]); - metasId[z + (sizeZ * y) + (sizeZ * sizeY * x)] = metas[x][y][z]; - } - } - } - - NBTTagIntArray idList = new NBTTagIntArray(blockId); - NBTTagIntArray metaList = new NBTTagIntArray(metasId); - - nbt.setTag("idList", idList); - nbt.setTag("metaList", metaList); - nbt.setTag("tiles", tileList); - - - /*for(int x = 0; x < sizeX; x++) { - for(int y = 0; y < sizeY; y++) { - for(int z = 0; z < sizeZ; z++) { - - idList.appendTag(new NBTTagInt(Block.getIdFromBlock(blocks[x][y][z]))); - metaList.appendTag(new NBTTagInt(metas[x][y][z])); - - //NBTTagCompound tag = new NBTTagCompound(); - tag.setInteger("block", Block.getIdFromBlock(blocks[x][y][z])); - tag.setShort("meta", metas[x][y][z]); - - NBTTagCompound tileNbtData = null; - - for(TileEntity tile : tileEntities) { - NBTTagCompound tileNbt = new NBTTagCompound(); - - tile.writeToNBT(tileNbt); - - if(tileNbt.getInteger("x") == x && tileNbt.getInteger("y") == y && tileNbt.getInteger("z") == z){ - tileNbtData = tileNbt; - break; - } - } - - if(tileNbtData != null) - tag.setTag("tile", tileNbtData); - - nbt.setTag(String.format("%d.%d.%d", x,y,z), tag); - } - - } - }*/ - } - public void rotateBy(EnumFacing dir) { HashedBlockPosition newSizes = new HashedBlockPosition(getSizeX(), getSizeY(), getSizeZ()); @@ -645,6 +573,86 @@ public HashedBlockPosition getNewCoord(HashedBlockPosition in, EnumFacing dir) { return out; } + //TODO: optimize the F*** out of this + public void writeToNBT(NBTTagCompound nbt) { + + if (world.isRemote) return; //client has no business writing here + + nbt.setInteger("xSize", sizeX); + nbt.setInteger("ySize", sizeY); + nbt.setInteger("zSize", sizeZ); + nbt.setFloat("weight", weight); + nbt.setBoolean("hasServiceMonitor", hasServiceMonitor); + + Iterator tileEntityIterator = tileEntities.iterator(); + NBTTagList tileList = new NBTTagList(); + while (tileEntityIterator.hasNext()) { + TileEntity tile = tileEntityIterator.next(); + try { + NBTTagCompound tileNbt = new NBTTagCompound(); + tile.writeToNBT(tileNbt); + tileList.appendTag(tileNbt); + } catch (RuntimeException e) { + AdvancedRocketry.logger.warn("A tile entity has thrown an error: " + tile.getClass().getCanonicalName()); + blocks[tile.getPos().getX()][tile.getPos().getY()][tile.getPos().getZ()] = Blocks.AIR; + metas[tile.getPos().getX()][tile.getPos().getY()][tile.getPos().getZ()] = 0; + tileEntityIterator.remove(); + } + } + + int[] blockId = new int[sizeX * sizeY * sizeZ]; + int[] metasId = new int[sizeX * sizeY * sizeZ]; + for (int x = 0; x < sizeX; x++) { + for (int y = 0; y < sizeY; y++) { + for (int z = 0; z < sizeZ; z++) { + blockId[z + (sizeZ * y) + (sizeZ * sizeY * x)] = Block.getIdFromBlock(blocks[x][y][z]); + metasId[z + (sizeZ * y) + (sizeZ * sizeY * x)] = metas[x][y][z]; + } + } + } + + NBTTagIntArray idList = new NBTTagIntArray(blockId); + NBTTagIntArray metaList = new NBTTagIntArray(metasId); + + nbt.setTag("idList", idList); + nbt.setTag("metaList", metaList); + nbt.setTag("tiles", tileList); + + + /*for(int x = 0; x < sizeX; x++) { + for(int y = 0; y < sizeY; y++) { + for(int z = 0; z < sizeZ; z++) { + + idList.appendTag(new NBTTagInt(Block.getIdFromBlock(blocks[x][y][z]))); + metaList.appendTag(new NBTTagInt(metas[x][y][z])); + + //NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("block", Block.getIdFromBlock(blocks[x][y][z])); + tag.setShort("meta", metas[x][y][z]); + + NBTTagCompound tileNbtData = null; + + for(TileEntity tile : tileEntities) { + NBTTagCompound tileNbt = new NBTTagCompound(); + + tile.writeToNBT(tileNbt); + + if(tileNbt.getInteger("x") == x && tileNbt.getInteger("y") == y && tileNbt.getInteger("z") == z){ + tileNbtData = tileNbt; + break; + } + } + + if(tileNbtData != null) + tag.setTag("tile", tileNbtData); + + nbt.setTag(String.format("%d.%d.%d", x,y,z), tag); + } + + } + }*/ + } + public void readFromNBT(NBTTagCompound nbt) { //System.out.println("read from nbt"); @@ -653,6 +661,7 @@ public void readFromNBT(NBTTagCompound nbt) { sizeY = nbt.getInteger("ySize"); sizeZ = nbt.getInteger("zSize"); weight = nbt.getFloat("weight"); + hasServiceMonitor = nbt.getBoolean("hasServiceMonitor"); blocks = new Block[sizeX][sizeY][sizeZ]; metas = new short[sizeX][sizeY][sizeZ]; @@ -1060,10 +1069,11 @@ public void writeToNetwork(ByteBuf out) { tileIterator.remove(); } } + + buffer.writeBoolean(hasServiceMonitor); } public void readFromNetwork(ByteBuf in) { - //System.out.println("read from network"); finalized = false; @@ -1114,6 +1124,9 @@ public void readFromNetwork(ByteBuf in) { e.printStackTrace(); } } + + hasServiceMonitor = buffer.readBoolean(); + //We are now ready to render this.chunk.generateSkylightMap(); finalized = true; diff --git a/src/main/resources/assets/advancedrocketry/blockstates/servicemonitor.json b/src/main/resources/assets/advancedrocketry/blockstates/servicemonitor.json new file mode 100644 index 000000000..939ed19e6 --- /dev/null +++ b/src/main/resources/assets/advancedrocketry/blockstates/servicemonitor.json @@ -0,0 +1,16 @@ +{ + "forge_marker": 1, + "defaults": { + "transform": "forge:default-block", + "model": "minecraft:orientable", + "textures": { + "top": "libvulpes:blocks/machinegeneric", + "front": "advancedrocketry:blocks/servicemachine", + "side": "libvulpes:blocks/machinegeneric" + } + }, + "variants": { + "normal": [{}], + "inventory" : [{}] + } +} diff --git a/src/main/resources/assets/advancedrocketry/lang/en_US.lang b/src/main/resources/assets/advancedrocketry/lang/en_US.lang index 4d9bbcacc..9c050be22 100644 --- a/src/main/resources/assets/advancedrocketry/lang/en_US.lang +++ b/src/main/resources/assets/advancedrocketry/lang/en_US.lang @@ -16,6 +16,7 @@ entity.hovercraft.name=Hovercraft tile.landingPad.name=Landing Pad tile.seat.name=Seat tile.pad.name=Launch Pad +tile.servicemonitor.name=Service monitor tile.structuretower.name=Structure Tower tile.rocketAssembler.name=Rocket Assembling Machine tile.turf.name=Moon Turf @@ -426,8 +427,8 @@ msg.itemplanetidchip.artifacts=Artifacts: msg.vent.trace=Oxygen Trace msg.serviceStation.destroyProbNA=Destroy probability: N/A -msg.serviceStation.destroyProb=Destroy probability: -msg.serviceStation.serviceProgress=Service progress: +msg.serviceStation.destroyProb=Destroy probability +msg.serviceStation.serviceProgress=Service progress msg.serviceStation.serviceProgressNA=Service progress: N/A msg.serviceStation.wornMotorsText=Engines msg.serviceStation.wornSeatsText=Seats @@ -443,6 +444,11 @@ msg.itemsatellite.microwavestatus=Collecting Power msg.itemsatellite.data=Data Storage: msg.itemsatellite.nodata=No Data Storage! msg.itemsatellite.empty=Empty Chassis +msg.itemsatellite.weight=Chassis weight: +msg.itemsatellite.noweight=Error in weight calculation + +msg.brokenstage.text=Destruction stage + msg.itemsatchip.id=ID: msg.itemsatchip.planet=Planet: msg.itemsatchip.planetunk=Planet: Unknown diff --git a/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang b/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang index 4cf9a9d43..dfdbbb0db 100644 --- a/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang +++ b/src/main/resources/assets/advancedrocketry/lang/ru_RU.lang @@ -8,6 +8,7 @@ entity.rocket.name=Ракета tile.landingPad.name=Посадочная площадка tile.serviceStation.name=Станция техобслуживания +tile.servicemonitor.name=Монитор состояния tile.seat.name=Сиденье tile.pad.name=Стартовая площадка tile.structuretower.name=Структурная башня @@ -269,8 +270,8 @@ msg.monitoringStation.link=Вы подключили частотный связ msg.monitoringStation.progress=Прогресс: msg.serviceStation.destroyProbNA=Вероятность разрушения: Н/Д -msg.serviceStation.destroyProb=Вероятность разрушения: -msg.serviceStation.serviceProgress=Прогресс обслуживания: +msg.serviceStation.destroyProb=Вероятность разрушения +msg.serviceStation.serviceProgress=Прогресс обслуживания msg.serviceStation.serviceProgressNA=Прогресс обслуживания: Н/Д msg.serviceStation.wornMotorsText=Двигатели msg.serviceStation.wornSeatsText=Сиденья @@ -397,6 +398,11 @@ msg.itemsatellite.nopwrgen=Энергия не генерируется! msg.itemsatellite.data=Хранилище данных: msg.itemsatellite.nodata=Нет хранилища данных! msg.itemsatellite.empty=Пустое шасси +msg.itemsatellite.weight=Масса спутника: +msg.itemsatellite.noweight=Ошибка в подсчёте массы + +msg.brokenstage.text=Стадия повреждений + msg.itemsatchip.id=ID: msg.itemsatchip.planet=Планета: msg.itemsatchip.planetunk=Планета: Неизвестно From 1468149e3ec6a540d9f7a271612c9b284972fd71 Mon Sep 17 00:00:00 2001 From: Quarter Date: Tue, 30 Jul 2024 14:45:03 +0300 Subject: [PATCH 37/42] Updated compat --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 5d6a3b44f..72c4ec592 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,5 +9,5 @@ archiveBase=AdvancedRocketry startGitRev=8e676bd # Dependencies -libVulpesVersion=0.4.3 +libVulpesVersion=0.5.0 jeiVersion=4.16.1.301 From 344fc88e78a5b876bddbaa8164442a84605a6674 Mon Sep 17 00:00:00 2001 From: MrToffel Date: Tue, 30 Jul 2024 15:21:14 +0200 Subject: [PATCH 38/42] made all tanks rotable + note on missing planet leo bug --- .../block/BlockBipropellantFuelTank.java | 57 +----------------- .../block/BlockNuclearFuelTank.java | 58 +----------------- .../block/BlockOxidizerFuelTank.java | 59 +------------------ .../event/RocketEventHandler.java | 3 + .../blockstates/bipropellantfueltank.json | 26 ++++++-- .../blockstates/nuclearfueltank.json | 26 ++++++-- .../blockstates/oxidizerfueltank.json | 26 ++++++-- 7 files changed, 72 insertions(+), 183 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantFuelTank.java b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantFuelTank.java index 890e33532..dbac33ace 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantFuelTank.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockBipropellantFuelTank.java @@ -13,54 +13,9 @@ import java.util.Locale; -public class BlockBipropellantFuelTank extends Block implements IFuelTank { - - public final static PropertyEnum TANKSTATES = PropertyEnum.create("tankstates", TankStates.class); - +public class BlockBipropellantFuelTank extends BlockFuelTank implements IFuelTank { public BlockBipropellantFuelTank(Material mat) { super(mat); - this.setDefaultState(this.getDefaultState().withProperty(TANKSTATES, TankStates.MIDDLE)); - } - - @Override - public IBlockState getStateFromMeta(int meta) { - return this.getDefaultState().withProperty(TANKSTATES, TankStates.values()[meta]); - } - - @Override - public int getMetaFromState(IBlockState state) { - return state.getValue(TANKSTATES).ordinal(); - } - - @Override - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, TANKSTATES); - } - - @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, - BlockPos pos) { - int i = world.getBlockState(pos.add(0, 1, 0)).getBlock() == this ? 1 : 0; - i += world.getBlockState(pos.add(0, -1, 0)).getBlock() == this ? 2 : 0; - - //If there is no tank below this one - if (i == 1) { - return state.withProperty(TANKSTATES, TankStates.BOTTOM); - } - //If there is no tank above this one - else if (i == 2) { - return state.withProperty(TANKSTATES, TankStates.TOP); - } - //If there is a tank above and below this one - else { - return state.withProperty(TANKSTATES, TankStates.MIDDLE); - } - } - - - @Override - public boolean isOpaqueCube(IBlockState state) { - return false; } @Override @@ -68,15 +23,5 @@ public int getMaxFill(World world, BlockPos pos, IBlockState state) { return 1000; } - public enum TankStates implements IStringSerializable { - TOP, - BOTTOM, - MIDDLE; - @Override - public String getName() { - return name().toLowerCase(Locale.ENGLISH); - } - - } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockNuclearFuelTank.java b/src/main/java/zmaster587/advancedRocketry/block/BlockNuclearFuelTank.java index 7afd5e4eb..4e8b21c1e 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockNuclearFuelTank.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockNuclearFuelTank.java @@ -13,70 +13,14 @@ import java.util.Locale; -public class BlockNuclearFuelTank extends Block implements IFuelTank { - - public final static PropertyEnum TANKSTATES = PropertyEnum.create("tankstates", TankStates.class); +public class BlockNuclearFuelTank extends BlockFuelTank implements IFuelTank { public BlockNuclearFuelTank(Material mat) { super(mat); - this.setDefaultState(this.getDefaultState().withProperty(TANKSTATES, TankStates.MIDDLE)); - } - - @Override - public IBlockState getStateFromMeta(int meta) { - return this.getDefaultState().withProperty(TANKSTATES, TankStates.values()[meta]); - } - - @Override - public int getMetaFromState(IBlockState state) { - return state.getValue(TANKSTATES).ordinal(); - } - - @Override - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, TANKSTATES); - } - - @Override - public IBlockState getActualState(IBlockState state, IBlockAccess world, - BlockPos pos) { - int i = world.getBlockState(pos.add(0, 1, 0)).getBlock() == this ? 1 : 0; - i += world.getBlockState(pos.add(0, -1, 0)).getBlock() == this ? 2 : 0; - - //If there is no tank below this one - if (i == 1) { - return state.withProperty(TANKSTATES, TankStates.BOTTOM); - } - //If there is no tank above this one - else if (i == 2) { - return state.withProperty(TANKSTATES, TankStates.TOP); - } - //If there is a tank above and below this one - else { - return state.withProperty(TANKSTATES, TankStates.MIDDLE); - } - } - - - @Override - public boolean isOpaqueCube(IBlockState state) { - return false; } @Override public int getMaxFill(World world, BlockPos pos, IBlockState state) { return 1000; } - - public enum TankStates implements IStringSerializable { - TOP, - BOTTOM, - MIDDLE; - - @Override - public String getName() { - return name().toLowerCase(Locale.ENGLISH); - } - - } } diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockOxidizerFuelTank.java b/src/main/java/zmaster587/advancedRocketry/block/BlockOxidizerFuelTank.java index cb8f3cd72..cbdc850c2 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockOxidizerFuelTank.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockOxidizerFuelTank.java @@ -14,57 +14,11 @@ import javax.annotation.Nonnull; import java.util.Locale; -public class BlockOxidizerFuelTank extends Block implements IFuelTank { +public class BlockOxidizerFuelTank extends BlockFuelTank implements IFuelTank { - public final static PropertyEnum TANKSTATES = PropertyEnum.create("tankstates", TankStates.class); public BlockOxidizerFuelTank(Material mat) { super(mat); - this.setDefaultState(this.getDefaultState().withProperty(TANKSTATES, TankStates.MIDDLE)); - } - - @Override - @Nonnull - public IBlockState getStateFromMeta(int meta) { - return this.getDefaultState().withProperty(TANKSTATES, TankStates.values()[meta]); - } - - @Override - public int getMetaFromState(IBlockState state) { - return state.getValue(TANKSTATES).ordinal(); - } - - @Override - @Nonnull - protected BlockStateContainer createBlockState() { - return new BlockStateContainer(this, TANKSTATES); - } - - @Override - @Nonnull - public IBlockState getActualState(@Nonnull IBlockState state, IBlockAccess world, - BlockPos pos) { - int i = world.getBlockState(pos.add(0, 1, 0)).getBlock() == this ? 1 : 0; - i += world.getBlockState(pos.add(0, -1, 0)).getBlock() == this ? 2 : 0; - - //If there is no tank below this one - if (i == 1) { - return state.withProperty(TANKSTATES, TankStates.BOTTOM); - } - //If there is no tank above this one - else if (i == 2) { - return state.withProperty(TANKSTATES, TankStates.TOP); - } - //If there is a tank above and below this one - else { - return state.withProperty(TANKSTATES, TankStates.MIDDLE); - } - } - - - @Override - public boolean isOpaqueCube(IBlockState state) { - return false; } @Override @@ -72,15 +26,4 @@ public int getMaxFill(World world, BlockPos pos, IBlockState state) { return 1000; } - public enum TankStates implements IStringSerializable { - TOP, - BOTTOM, - MIDDLE; - - @Override - public String getName() { - return name().toLowerCase(Locale.ENGLISH); - } - - } } diff --git a/src/main/java/zmaster587/advancedRocketry/event/RocketEventHandler.java b/src/main/java/zmaster587/advancedRocketry/event/RocketEventHandler.java index 93df51a90..d653409bf 100644 --- a/src/main/java/zmaster587/advancedRocketry/event/RocketEventHandler.java +++ b/src/main/java/zmaster587/advancedRocketry/event/RocketEventHandler.java @@ -1,4 +1,7 @@ package zmaster587.advancedRocketry.event; +// This code does not work - it should display the earth below rockets at start but it does not. +// The detailed map is scaled too small and it is ugly even with correct scale +// maybe just use leo as earth? import net.minecraft.block.material.MapColor; import net.minecraft.block.state.IBlockState; diff --git a/src/main/resources/assets/advancedrocketry/blockstates/bipropellantfueltank.json b/src/main/resources/assets/advancedrocketry/blockstates/bipropellantfueltank.json index ad2fd5453..a9dcfb8c9 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/bipropellantfueltank.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/bipropellantfueltank.json @@ -6,14 +6,32 @@ "transform": "forge:default-block" }, "variants": { - "tankstates=top": { "model": "advancedrocketry:models/toptank.obj" }, - "tankstates=middle": { "model": "advancedrocketry:models/middletank.obj" }, - "tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj" }, "inventory": { "model": "advancedrocketry:models/middletank.obj", "textures": { "layer0": "advancedrocketry:textures/models/tank" } - } + }, + "facing=north,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90 }, + "facing=south,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj"}, + "facing=down,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj"}, + + "facing=north,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90 }, + "facing=south,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=top": { "model": "advancedrocketry:models/toptank.obj"}, + "facing=down,tankstates=top": { "model": "advancedrocketry:models/toptank.obj"}, + + "facing=north,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90 }, + "facing=south,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj"}, + "facing=down,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj"} + } } diff --git a/src/main/resources/assets/advancedrocketry/blockstates/nuclearfueltank.json b/src/main/resources/assets/advancedrocketry/blockstates/nuclearfueltank.json index ad2fd5453..a9dcfb8c9 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/nuclearfueltank.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/nuclearfueltank.json @@ -6,14 +6,32 @@ "transform": "forge:default-block" }, "variants": { - "tankstates=top": { "model": "advancedrocketry:models/toptank.obj" }, - "tankstates=middle": { "model": "advancedrocketry:models/middletank.obj" }, - "tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj" }, "inventory": { "model": "advancedrocketry:models/middletank.obj", "textures": { "layer0": "advancedrocketry:textures/models/tank" } - } + }, + "facing=north,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90 }, + "facing=south,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj"}, + "facing=down,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj"}, + + "facing=north,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90 }, + "facing=south,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=top": { "model": "advancedrocketry:models/toptank.obj"}, + "facing=down,tankstates=top": { "model": "advancedrocketry:models/toptank.obj"}, + + "facing=north,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90 }, + "facing=south,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj"}, + "facing=down,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj"} + } } diff --git a/src/main/resources/assets/advancedrocketry/blockstates/oxidizerfueltank.json b/src/main/resources/assets/advancedrocketry/blockstates/oxidizerfueltank.json index ad2fd5453..a9dcfb8c9 100644 --- a/src/main/resources/assets/advancedrocketry/blockstates/oxidizerfueltank.json +++ b/src/main/resources/assets/advancedrocketry/blockstates/oxidizerfueltank.json @@ -6,14 +6,32 @@ "transform": "forge:default-block" }, "variants": { - "tankstates=top": { "model": "advancedrocketry:models/toptank.obj" }, - "tankstates=middle": { "model": "advancedrocketry:models/middletank.obj" }, - "tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj" }, "inventory": { "model": "advancedrocketry:models/middletank.obj", "textures": { "layer0": "advancedrocketry:textures/models/tank" } - } + }, + "facing=north,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90 }, + "facing=south,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj"}, + "facing=down,tankstates=middle": { "model": "advancedrocketry:models/middletank.obj"}, + + "facing=north,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90 }, + "facing=south,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=top": { "model": "advancedrocketry:models/toptank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=top": { "model": "advancedrocketry:models/toptank.obj"}, + "facing=down,tankstates=top": { "model": "advancedrocketry:models/toptank.obj"}, + + "facing=north,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90 }, + "facing=south,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 180 }, + "facing=west,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 270 }, + "facing=east,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj", "x": 90, "y": 90 }, + "facing=up,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj"}, + "facing=down,tankstates=bottom": { "model": "advancedrocketry:models/bottomtank.obj"} + } } From c01290dcb2ce3a56dfe14fa3d4e2a02e4b54d55d Mon Sep 17 00:00:00 2001 From: MrToffel Date: Tue, 20 Aug 2024 16:39:41 +0200 Subject: [PATCH 39/42] some bugfixes --- gradle.properties | 2 +- .../advancedRocketry/api/ARConfiguration.java | 3 +++ .../advancedRocketry/block/BlockFuelTank.java | 11 ++++++----- .../dimension/DimensionManager.java | 9 +++++++++ .../dimension/DimensionProperties.java | 13 +++++++------ .../advancedRocketry/entity/EntityRocket.java | 17 ++++++++++++----- .../satellite/SatelliteData.java | 3 +++ .../tile/TileRocketAssemblingMachine.java | 8 ++++---- .../satellite/TileTerraformingTerminal.java | 2 +- .../advancedRocketry/util/StorageChunk.java | 8 ++++---- 10 files changed, 50 insertions(+), 26 deletions(-) diff --git a/gradle.properties b/gradle.properties index 72c4ec592..26a04fab4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.daemon=false # Project mcVersion=1.12.2 forgeVersion=14.23.5.2860 -modVersion=2.1.1 +modVersion=2.1.3 archiveBase=AdvancedRocketry startGitRev=8e676bd diff --git a/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java b/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java index e63693804..2f7529e38 100644 --- a/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java +++ b/src/main/java/zmaster587/advancedRocketry/api/ARConfiguration.java @@ -236,6 +236,8 @@ public class ARConfiguration { @ConfigProperty public int planetDiscoveryChance; @ConfigProperty + public boolean allowNonArBiomesInTerraforming; + @ConfigProperty public double oxygenVentPowerMultiplier; @ConfigProperty public boolean skyOverride; @@ -370,6 +372,7 @@ public static void loadPreInit() { arConfig.terraformliquidRate = config.get(Configuration.CATEGORY_GENERAL, "TerraformerFluidConsumeRate", 40, "how many millibuckets/t are required to keep the terraformer running").getInt(); arConfig.allowTerraformNonAR = config.get(Configuration.CATEGORY_GENERAL, "allowTerraformingNonARWorlds", false, "If true dimensions not added by AR can be terraformed, including the overworld").getBoolean(); arConfig.enableGravityController = config.get(Configuration.CATEGORY_GENERAL, "enableGravityMachine", true, "If false the gravity controller cannot be built or used").getBoolean(); + arConfig.allowNonArBiomesInTerraforming = config.get(Configuration.CATEGORY_GENERAL, "allowNonArBiomesInTerraforming", false, "non-ar biomes from mods with custom world gen can not be decorated in terraforming. If you want fully decorated terraforming with only default biomes, set this to false").getBoolean(); //Oxygen arConfig.enableOxygen = config.get(OXYGEN, "EnableAtmosphericEffects", true, "If true, allows players being hurt due to lack of oxygen and allows effects from non-standard atmosphere types").getBoolean(); diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockFuelTank.java b/src/main/java/zmaster587/advancedRocketry/block/BlockFuelTank.java index 37ce75e34..1a0b5ae46 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockFuelTank.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockFuelTank.java @@ -13,6 +13,7 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import zmaster587.advancedRocketry.api.IFuelTank; +import zmaster587.advancedRocketry.api.IRocketEngine; import zmaster587.libVulpes.block.BlockFullyRotatable; import javax.annotation.Nonnull; @@ -84,7 +85,7 @@ public IBlockState getActualState(@Nonnull IBlockState state, IBlockAccess world if (world.getBlockState(pos).getValue(FACING) == EnumFacing.DOWN || world.getBlockState(pos).getValue(FACING) == EnumFacing.UP) { int i = (world.getBlockState(pos.add(0, 1, 0)).getBlock() == this && world.getBlockState(pos.add(0, 1, 0)).getValue(FACING) == EnumFacing.UP) ? 1 : 0; - i += (world.getBlockState(pos.add(0, -1, 0)).getBlock() == this && world.getBlockState(pos.add(0, -1, 0)).getValue(FACING) == EnumFacing.UP) || world.getBlockState(pos.add(0, -1, 0)).getBlock() instanceof BlockRocketMotor ? 2 : 0; + i += (world.getBlockState(pos.add(0, -1, 0)).getBlock() == this && world.getBlockState(pos.add(0, -1, 0)).getValue(FACING) == EnumFacing.UP) || world.getBlockState(pos.add(0, -1, 0)).getBlock() instanceof IRocketEngine ? 2 : 0; //If there is no tank below this one and no engine below if (i == 1) { @@ -101,8 +102,8 @@ else if (i == 2) { } if (world.getBlockState(pos).getValue(FACING) == EnumFacing.EAST || world.getBlockState(pos).getValue(FACING) == EnumFacing.WEST) { - int i = (world.getBlockState(pos.add(1, 0, 0)).getBlock() == this && world.getBlockState(pos.add(1, 0, 0)).getValue(FACING) == EnumFacing.EAST) || world.getBlockState(pos.add(1, 0, 0)).getBlock() instanceof BlockRocketMotor ? 1 : 0; - i += (world.getBlockState(pos.add(-1, 0, 0)).getBlock() == this && world.getBlockState(pos.add(-1, 0, 0)).getValue(FACING) == EnumFacing.EAST) || world.getBlockState(pos.add(-1, 0, 0)).getBlock() instanceof BlockRocketMotor ? 2 : 0; + int i = (world.getBlockState(pos.add(1, 0, 0)).getBlock() == this && world.getBlockState(pos.add(1, 0, 0)).getValue(FACING) == EnumFacing.EAST) || world.getBlockState(pos.add(1, 0, 0)).getBlock() instanceof IRocketEngine ? 1 : 0; + i += (world.getBlockState(pos.add(-1, 0, 0)).getBlock() == this && world.getBlockState(pos.add(-1, 0, 0)).getValue(FACING) == EnumFacing.EAST) || world.getBlockState(pos.add(-1, 0, 0)).getBlock() instanceof IRocketEngine ? 2 : 0; //If there is no tank below this one and no engine below if (i == 1) { @@ -119,8 +120,8 @@ else if (i == 2) { } if (world.getBlockState(pos).getValue(FACING) == EnumFacing.NORTH || world.getBlockState(pos).getValue(FACING) == EnumFacing.SOUTH) { - int i = (world.getBlockState(pos.add(0, 0, 1)).getBlock() == this && world.getBlockState(pos.add(0, 0, 1)).getValue(FACING) == EnumFacing.SOUTH) || world.getBlockState(pos.add(0, 0, 1)).getBlock() instanceof BlockRocketMotor ? 1 : 0; - i += (world.getBlockState(pos.add(0, 0, -1)).getBlock() == this && world.getBlockState(pos.add(0, 0, -1)).getValue(FACING) == EnumFacing.SOUTH) || world.getBlockState(pos.add(0, 0, -1)).getBlock() instanceof BlockRocketMotor ? 2 : 0; + int i = (world.getBlockState(pos.add(0, 0, 1)).getBlock() == this && world.getBlockState(pos.add(0, 0, 1)).getValue(FACING) == EnumFacing.SOUTH) || world.getBlockState(pos.add(0, 0, 1)).getBlock() instanceof IRocketEngine ? 1 : 0; + i += (world.getBlockState(pos.add(0, 0, -1)).getBlock() == this && world.getBlockState(pos.add(0, 0, -1)).getValue(FACING) == EnumFacing.SOUTH) || world.getBlockState(pos.add(0, 0, -1)).getBlock() instanceof IRocketEngine ? 2 : 0; //If there is no tank below this one and no engine below if (i == 1) { diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java index fbc2174e0..235cbaa94 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionManager.java @@ -127,6 +127,15 @@ public static DimensionProperties getEffectiveDimId(World world, BlockPos pos) { } else return getInstance().getDimensionProperties(dimId); } + public static DimensionProperties getEffectiveDimId_byID(int dimId, BlockPos pos) { + + if (dimId == ARConfiguration.getCurrentConfig().spaceDimId) { + ISpaceObject spaceObject = SpaceObjectManager.getSpaceManager().getSpaceStationFromBlockCoords(pos); + if (spaceObject != null) return (DimensionProperties) spaceObject.getProperties().getParentProperties(); + else return defaultSpaceDimensionProperties; + } else return getInstance().getDimensionProperties(dimId); + } + /** * @return an Integer array of dimensions registered with this DimensionManager */ diff --git a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java index f102b411f..fdf685881 100644 --- a/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java +++ b/src/main/java/zmaster587/advancedRocketry/dimension/DimensionProperties.java @@ -1036,7 +1036,7 @@ public Collection getTickingSatellites() { public void tick() { Iterator iterator = tickingSatellites.values().iterator(); - + //System.out.println(":"+tickingSatellites.size()); while (iterator.hasNext()) { SatelliteBase satellite = iterator.next(); satellite.tickEntity(); @@ -1120,11 +1120,12 @@ public void setBiomes(List biomes) { public boolean isBiomeblackListed(Biome biome, boolean is_NOT_terraforming) { if (!is_NOT_terraforming) { - //String modId = biome.getRegistryName().getResourceDomain(); - - //if (!modId.equals("minecraft") && !modId.equals("advancedrocketry")) { - // return true; - //} + String modId = biome.getRegistryName().getResourceDomain(); + if (!ARConfiguration.getCurrentConfig().allowNonArBiomesInTerraforming) { + if (!modId.equals("minecraft") && !modId.equals("advancedrocketry")) { + return true; + } + } } if (biome.equals(AdvancedRocketryBiomes.spaceBiome)) return true; diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java index b86f33301..72b31958c 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java @@ -726,7 +726,7 @@ private boolean hasHumanPassenger() { } public boolean isDescentPhase() { - return ARConfiguration.getCurrentConfig().automaticRetroRockets && isInOrbit() && this.posY < 300 && (this.motionY < -0.4f || world.isRemote); + return ARConfiguration.getCurrentConfig().automaticRetroRockets && isInOrbit() && ((this.posY < 500 && (this.motionY < -0.5f || world.isRemote)) || (this.posY < 200 && (this.motionY < -0.2f || world.isRemote))); } public boolean isStartupPhase() { @@ -1119,12 +1119,12 @@ else if (distanceSq > this.spacePosition.world.getRenderSizePlanetView() * this. //if the player holds the forward key then decelerate if (isInOrbit() && (burningFuel || descentPhase)) { float vel = descentPhase ? 1f : getPassengerMovingForward(); - this.motionY -= this.motionY * vel / 50f; + this.motionY -= this.motionY * vel / 40f; } this.velocityChanged = true; } else if (isInOrbit() && descentPhase) { //For unmanned rockets - this.motionY -= this.motionY / 50f; + this.motionY -= this.motionY / 40f; this.velocityChanged = true; } @@ -1132,7 +1132,7 @@ else if (distanceSq > this.spacePosition.world.getRenderSizePlanetView() * this. //If out of fuel or descending then accelerate downwards if (isInOrbit() || !burningFuel) { //this.motionY = Math.min(this.motionY - 0.001, 1); - this.motionY = this.motionY - 0.001; + this.motionY = this.motionY - 0.0001; } else //this.motionY = Math.min(this.motionY + 0.001, 1); this.motionY += stats.getAcceleration(DimensionManager.getInstance().getDimensionProperties(this.world.provider.getDimension()).getGravitationalMultiplier()) * deltaTime; @@ -1217,6 +1217,8 @@ else if (distanceSq > this.spacePosition.world.getRenderSizePlanetView() * this. if (this.posY < getTopBlock(getPosition()).getY() + 5 && this.posX > getTopBlock(getPosition()).getY() && ARConfiguration.getCurrentConfig().launchingDestroysBlocks && motionY < -0.1) { damageGroundBelowRocket(world, (int) this.posX, (int) this.posY - 1, (int) this.posZ, (int) Math.pow(stats.getThrust(), 0.4)); } + + //System.out.println("motiony:"+motionY); } public void onTurnRight(boolean state) { @@ -1533,7 +1535,7 @@ private void unpackSatellites() { } } else { int destinationId = storage.getDestinationDimId(world.provider.getDimension(), (int) posX, (int) posZ); - DimensionProperties properties = DimensionManager.getEffectiveDimId(world, this.getPosition()); + DimensionProperties properties = DimensionManager.getEffectiveDimId_byID(destinationId, this.getPosition()); int world2; if (destinationId == ARConfiguration.getCurrentConfig().spaceDimId || destinationId == Constants.INVALID_PLANET) world2 = properties.getId(); @@ -1621,6 +1623,11 @@ public void launch() { this.storage.recalculateStats(this.stats); + NBTTagCompound nbtdata = new NBTTagCompound(); + writeToNBT(nbtdata); + PacketHandler.sendToNearby(new PacketEntity(this, (byte) 0, nbtdata), this.world.provider.getDimension(), this.getPosition(), 64); + + if (ARConfiguration.getCurrentConfig().advancedWeightSystem) { this.stats.setWeight((int) storage.recalculateWeight()); for (HashedBlockPosition pos : this.infrastructureCoords) { diff --git a/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteData.java b/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteData.java index 2ba335720..5c36fa337 100644 --- a/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteData.java +++ b/src/main/java/zmaster587/advancedRocketry/satellite/SatelliteData.java @@ -53,6 +53,8 @@ public boolean acceptsItemInConstruction(@Nonnull ItemStack item) { public void setProperties(@Nonnull ItemStack satelliteProperties) { super.setProperties(satelliteProperties); data.setMaxData(this.satelliteProperties.getMaxDataStorage()); + powerConsumption = getPowerPerTick(); + collectionTime = (int) (200 / Math.sqrt(0.1 * powerConsumption)); } @@ -113,6 +115,7 @@ public void tickEntity() { //Add data to the buffer, if the satellite has enough power data.addData(getDataCreated(), data.getDataType(), true); + //System.out.println("data: "+data.getData()+":"+getDataCreated()+":"+collectionTime); } @Override diff --git a/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java b/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java index edba120e4..265f7db01 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/TileRocketAssemblingMachine.java @@ -337,18 +337,18 @@ public void scanRocket(World world, BlockPos pos2, AxisAlignedBB bb) { monopropellantfuelUse += ((IRocketEngine) block).getFuelConsumptionRate(world, xCurr, yCurr, zCurr); thrustMonopropellant += ((IRocketEngine) block).getThrust(world, currBlockPos); } - stats.addEngineLocation(x, yCurr - actualMinY, z); + stats.addEngineLocation(x+0.5f, yCurr - actualMinY+0.5f, z+0.5f); } if (block instanceof IFuelTank) { - if (block instanceof BlockFuelTank) { - fuelCapacityMonopropellant += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); - } else if (block instanceof BlockBipropellantFuelTank) { + if (block instanceof BlockBipropellantFuelTank) { fuelCapacityBipropellant += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); } else if (block instanceof BlockOxidizerFuelTank) { fuelCapacityOxidizer += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); } else if (block instanceof BlockNuclearFuelTank) { fuelCapacityNuclearWorkingFluid += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); + } else if (block instanceof BlockFuelTank) { + fuelCapacityMonopropellant += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); } } diff --git a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java index dff8943f4..6c541ac3d 100644 --- a/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java +++ b/src/main/java/zmaster587/advancedRocketry/tile/satellite/TileTerraformingTerminal.java @@ -141,7 +141,7 @@ public void setInventorySlotContents(int slot, @Nonnull ItemStack stack) { public void update() { super.update(); boolean has_redstone = world.isBlockIndirectlyGettingPowered(getPos()) != 0; - int powerrequired = 120; + int powerrequired = 40; //120; if (!world.isRemote) { if (world.getTotalWorldTime() % 20 == 0) diff --git a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java index 5028fde5e..daa190f7c 100644 --- a/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java +++ b/src/main/java/zmaster587/advancedRocketry/util/StorageChunk.java @@ -200,18 +200,18 @@ public void recalculateStats(StatsRocket stats) { monopropellantfuelUse += ((IRocketEngine) block).getFuelConsumptionRate(world, xCurr, yCurr, zCurr); thrustMonopropellant += ((IRocketEngine) block).getThrust(world, currBlockPos); } - stats.addEngineLocation(xCurr, yCurr, zCurr); + stats.addEngineLocation(xCurr - (float) this.sizeX /2+0.5f, yCurr+0.5f, zCurr- (float) this.sizeZ /2+0.5f); } if (block instanceof IFuelTank) { - if (block instanceof BlockFuelTank) { - fuelCapacityMonopropellant += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); - } else if (block instanceof BlockBipropellantFuelTank) { + if (block instanceof BlockBipropellantFuelTank) { fuelCapacityBipropellant += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); } else if (block instanceof BlockOxidizerFuelTank) { fuelCapacityOxidizer += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); } else if (block instanceof BlockNuclearFuelTank) { fuelCapacityNuclearWorkingFluid += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); + }else if (block instanceof BlockFuelTank) { + fuelCapacityMonopropellant += (((IFuelTank) block).getMaxFill(world, currBlockPos, state) * ARConfiguration.getCurrentConfig().fuelCapacityMultiplier); } } From 57641779275e65f0ad7cda462480c01ab79bdc6f Mon Sep 17 00:00:00 2001 From: MrToffel Date: Thu, 22 Aug 2024 11:53:05 +0200 Subject: [PATCH 40/42] make player center on seat in rocket + increase lack hole render distance to make it not render over space station blocks --- .../client/render/planet/RenderSpaceSky.java | 11 ++++++----- .../advancedRocketry/entity/EntityRocket.java | 8 +++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderSpaceSky.java b/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderSpaceSky.java index df1c95f75..8efb2713c 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderSpaceSky.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/planet/RenderSpaceSky.java @@ -50,6 +50,7 @@ public void renderPlanet2(BufferBuilder buffer, DimensionProperties properties, if (properties.isStar()) { planetOrbitalDistance = 190F; if (properties.getStar().isBlackHole()) { + float add_offset = 50; size = 10; GL11.glDepthMask(true); GL11.glEnable(GL11.GL_ALPHA_TEST); @@ -63,7 +64,7 @@ public void renderPlanet2(BufferBuilder buffer, DimensionProperties properties, //GL11.glRotatef(180, 0, 1, 0); GL11.glPushMatrix(); - GL11.glTranslatef(0, 100, 0); + GL11.glTranslatef(0, 100+add_offset, 0); f10 = size * 2f * AstronomicalBodyHelper.getBodySizeMultiplier(planetOrbitalDistance); GlStateManager.color(0,0,0); @@ -141,7 +142,7 @@ public void renderPlanet2(BufferBuilder buffer, DimensionProperties properties, GL11.glPushMatrix(); - GL11.glTranslatef(0, 100, 0); + GL11.glTranslatef(0, 100+add_offset, 0); GL11.glRotatef(90, 0f, 1f, 0f); //GL11.glRotatef(m, 1f, 0f, 0f); //GL11.glRotatef(diskangle, 0, 0, 1); @@ -165,7 +166,7 @@ public void renderPlanet2(BufferBuilder buffer, DimensionProperties properties, mc.renderEngine.bindTexture(TextureResources.locationAccretionDisk); GL11.glPushMatrix(); - GL11.glTranslatef(0, 100, 0); + GL11.glTranslatef(0, 100+add_offset, 0); GL11.glRotatef(60, 1, 0, 0); GL11.glRotatef((System.currentTimeMillis() % (int) (360 * 360 * speedMult)) / (360f * speedMult), 0, 1, 0); @@ -181,7 +182,7 @@ public void renderPlanet2(BufferBuilder buffer, DimensionProperties properties, GL11.glPushMatrix(); - GL11.glTranslatef(0, 99.9f, 0); + GL11.glTranslatef(0, 99.9f+add_offset, 0); GL11.glRotatef(60, 1, 0, 0); GL11.glRotatef((System.currentTimeMillis() % (int) (360 * 200 * speedMult)) / (200f * speedMult), 0, 1, 0); @@ -198,7 +199,7 @@ public void renderPlanet2(BufferBuilder buffer, DimensionProperties properties, GL11.glPushMatrix(); - GL11.glTranslatef(0, 99.8f, 0); + GL11.glTranslatef(0, 99.8f+add_offset, 0); GL11.glRotatef(60, 1, 0, 0); GL11.glRotatef((System.currentTimeMillis() % (int) (36000 * speedMult)) / (100f * speedMult), 0, 1, 0); diff --git a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java index 72b31958c..f91b1e92f 100644 --- a/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java +++ b/src/main/java/zmaster587/advancedRocketry/entity/EntityRocket.java @@ -2160,10 +2160,12 @@ public void updatePassenger(@Nonnull Entity entity) { float xOffset = this.storage.getSizeX() % 2 == 0 ? 0.5f : 0f; float zOffset = this.storage.getSizeZ() % 2 == 0 ? 0.5f : 0f; float halfy = storage.getSizeY() / 2f; + float halfx = storage.getSizeX() / 2f; + float halfz = storage.getSizeZ() / 2f; - double xPos = seatPos.x + xOffset; - double yPos = seatPos.y - 0.5f - halfy; - double zPos = seatPos.z + zOffset; + double xPos = seatPos.x + xOffset - halfx+0.5; + double yPos = seatPos.y - 0.5f - halfy-0.5f; + double zPos = seatPos.z + zOffset - halfz+0.5; float angle = (float) (getRCSRotateProgress() * 0.9f * Math.PI / 180f); double yNew = (yPos) * MathHelper.cos(angle) + (-zPos - 0.5) * MathHelper.sin(angle); From 39587b5384c00a69998c281186ed06dee32fd948 Mon Sep 17 00:00:00 2001 From: Quarter Date: Sat, 24 Aug 2024 15:19:29 +0300 Subject: [PATCH 41/42] Added rotation render for the broken parts --- .../client/render/RendererBrokenPart.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java index 054860a81..a387b3cc8 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java @@ -2,10 +2,13 @@ import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Vec3i; import zmaster587.advancedRocketry.backwardCompat.WavefrontObject; import zmaster587.advancedRocketry.client.ClientProxy; import zmaster587.advancedRocketry.tile.TileBrokenPart; +import zmaster587.libVulpes.block.BlockFullyRotatable; public class RendererBrokenPart extends TileEntitySpecialRenderer { @@ -19,6 +22,22 @@ public void render(TileBrokenPart tile, double x, double y, double z, float t, i GlStateManager.pushMatrix(); GlStateManager.translate((float) x, (float) y, (float) z); + if (tile.getBlockType() instanceof BlockFullyRotatable) { + EnumFacing facing = tile.getWorld().getBlockState(tile.getPos()).getValue(BlockFullyRotatable.FACING); + Vec3i dir = facing.getDirectionVec(); + GlStateManager.translate(0.5F, 0.5F, 0.5F); + if (dir.getY() > 0) { + GlStateManager.rotate(180.0F, 1.0F, 0.0F, 0.0F); + } + if (dir.getX() != 0) { + GlStateManager.rotate(90.0F, 0.0F, 0.0F, dir.getX()); + } + if (dir.getZ() != 0) { + GlStateManager.rotate(90.0F, dir.getZ(), 0.0F, 0.0F); + } + GlStateManager.translate(-0.5F, -0.5F, -0.5F); + } + if (destroyStage >= 0) { this.bindTexture(DESTROY_STAGES[destroyStage]); GlStateManager.matrixMode(5890); From f044e931912bae4638456c10269ddf622dab358e Mon Sep 17 00:00:00 2001 From: Quarter Date: Wed, 4 Sep 2024 16:21:31 +0300 Subject: [PATCH 42/42] Render fixed (now using getActualState() for the real state..) --- .../block/BlockRocketMotor.java | 17 ++++++++--------- .../client/render/RendererBrokenPart.java | 6 ++++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java index 90f6ba96a..088ac702e 100644 --- a/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java +++ b/src/main/java/zmaster587/advancedRocketry/block/BlockRocketMotor.java @@ -9,7 +9,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; @@ -85,14 +84,14 @@ public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, Entity ((TileBrokenPart) te).setStage(stack.getItemDamage()); } - @Override - public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { - if (!worldIn.isRemote) { - TileEntity te = worldIn.getTileEntity(pos); - ((TileBrokenPart) te).transition(); - } - return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); - } +// @Override +// public boolean onBlockActivated(final World worldIn, final BlockPos pos, final IBlockState state, final EntityPlayer playerIn, final EnumHand hand, final EnumFacing facing, final float hitX, final float hitY, final float hitZ) { +// if (!worldIn.isRemote) { +// TileEntity te = worldIn.getTileEntity(pos); +// ((TileBrokenPart) te).transition(); +// } +// return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ); +// } @Override public void harvestBlock(final World world, final EntityPlayer player, final BlockPos pos, final IBlockState state, @Nullable final TileEntity te, final ItemStack stack) { diff --git a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java index a387b3cc8..ce415f2b6 100644 --- a/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java +++ b/src/main/java/zmaster587/advancedRocketry/client/render/RendererBrokenPart.java @@ -1,5 +1,6 @@ package zmaster587.advancedRocketry.client.render; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.util.EnumFacing; @@ -23,14 +24,15 @@ public void render(TileBrokenPart tile, double x, double y, double z, float t, i GlStateManager.translate((float) x, (float) y, (float) z); if (tile.getBlockType() instanceof BlockFullyRotatable) { - EnumFacing facing = tile.getWorld().getBlockState(tile.getPos()).getValue(BlockFullyRotatable.FACING); + IBlockState state = tile.getWorld().getBlockState(tile.getPos()); + EnumFacing facing = state.getBlock().getActualState(state, tile.getWorld(), tile.getPos()).getValue(BlockFullyRotatable.FACING); Vec3i dir = facing.getDirectionVec(); GlStateManager.translate(0.5F, 0.5F, 0.5F); if (dir.getY() > 0) { GlStateManager.rotate(180.0F, 1.0F, 0.0F, 0.0F); } if (dir.getX() != 0) { - GlStateManager.rotate(90.0F, 0.0F, 0.0F, dir.getX()); + GlStateManager.rotate(90.0F, 0.0F, 0.0F, -dir.getX()); } if (dir.getZ() != 0) { GlStateManager.rotate(90.0F, dir.getZ(), 0.0F, 0.0F);