// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.core.modules.entity.item;

import com.hypixel.hytale.server.core.modules.entity.BlockMigrationExtraInfo;
import com.hypixel.hytale.codec.ExtraInfo;
import com.hypixel.hytale.server.core.inventory.transaction.ItemStackTransaction;
import com.hypixel.hytale.component.RemoveReason;
import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.server.core.modules.entity.DespawnComponent;
import com.hypixel.hytale.server.core.modules.time.TimeResource;
import com.hypixel.hytale.server.core.modules.entity.component.Intangible;
import com.hypixel.hytale.server.core.entity.UUIDComponent;
import com.hypixel.hytale.server.core.modules.physics.component.PhysicsValues;
import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
import java.util.logging.Level;
import java.util.function.Predicate;
import java.util.Objects;
import com.hypixel.hytale.math.iterator.CircleIterator;
import java.util.concurrent.ThreadLocalRandom;
import com.hypixel.hytale.component.Holder;
import com.hypixel.hytale.math.vector.Vector3f;
import com.hypixel.hytale.math.vector.Vector3d;
import java.util.List;
import com.hypixel.hytale.server.core.asset.type.item.config.Item;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
import com.hypixel.hytale.protocol.ColorLight;
import com.hypixel.hytale.server.core.asset.type.item.config.ItemEntityConfig;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.server.core.modules.entity.EntityModule;
import com.hypixel.hytale.component.ComponentType;
import javax.annotation.Nullable;
import com.hypixel.hytale.server.core.inventory.ItemStack;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import javax.annotation.Nonnull;
import com.hypixel.hytale.logger.HytaleLogger;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import com.hypixel.hytale.component.Component;

public class ItemComponent implements Component<EntityStore>
{
    @Nonnull
    private static final HytaleLogger LOGGER;
    @Nonnull
    public static final BuilderCodec<ItemComponent> CODEC;
    private static final float DROPPED_ITEM_VERTICAL_BOUNCE_VELOCITY = 3.25f;
    private static final float DROPPED_ITEM_HORIZONTAL_BOUNCE_VELOCITY = 3.0f;
    public static final float DEFAULT_PICKUP_DELAY = 0.5f;
    public static final float PICKUP_DELAY_DROPPED = 1.5f;
    public static final float PICKUP_THROTTLE = 0.25f;
    public static final float DEFAULT_MERGE_DELAY = 1.5f;
    @Nullable
    private ItemStack itemStack;
    private boolean isNetworkOutdated;
    private float mergeDelay;
    private float pickupDelay;
    private float pickupThrottle;
    private boolean removedByPlayerPickup;
    private float pickupRange;
    
    @Nonnull
    public static ComponentType<EntityStore, ItemComponent> getComponentType() {
        return EntityModule.get().getItemComponentType();
    }
    
    public ItemComponent() {
        this.mergeDelay = 1.5f;
        this.pickupDelay = 0.5f;
        this.pickupRange = -1.0f;
    }
    
    public ItemComponent(@Nullable final ItemStack itemStack) {
        this.mergeDelay = 1.5f;
        this.pickupDelay = 0.5f;
        this.pickupRange = -1.0f;
        this.itemStack = itemStack;
    }
    
    public ItemComponent(@Nullable final ItemStack itemStack, final float mergeDelay, final float pickupDelay, final float pickupThrottle, final boolean removedByPlayerPickup) {
        this.mergeDelay = 1.5f;
        this.pickupDelay = 0.5f;
        this.pickupRange = -1.0f;
        this.itemStack = itemStack;
        this.mergeDelay = mergeDelay;
        this.pickupDelay = pickupDelay;
        this.pickupThrottle = pickupThrottle;
        this.removedByPlayerPickup = removedByPlayerPickup;
    }
    
    @Nullable
    public ItemStack getItemStack() {
        return this.itemStack;
    }
    
    public void setItemStack(@Nullable final ItemStack itemStack) {
        this.itemStack = itemStack;
        this.isNetworkOutdated = true;
        this.pickupRange = -1.0f;
    }
    
    public void setPickupDelay(final float pickupDelay) {
        this.pickupDelay = pickupDelay;
    }
    
    public float getPickupRadius(@Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        if (this.pickupRange < 0.0f) {
            final World world = componentAccessor.getExternalData().getWorld();
            final ItemEntityConfig defaultConfig = world.getGameplayConfig().getItemEntityConfig();
            final ItemEntityConfig config = (this.itemStack != null) ? this.itemStack.getItem().getItemEntityConfig() : null;
            this.pickupRange = ((config != null && config.getPickupRadius() != -1.0f) ? config.getPickupRadius() : defaultConfig.getPickupRadius());
        }
        return this.pickupRange;
    }
    
    public float computeLifetimeSeconds(@Nonnull final ComponentAccessor<EntityStore> componentAccessor) {
        final ItemEntityConfig itemEntityConfig = (this.itemStack != null) ? this.itemStack.getItem().getItemEntityConfig() : null;
        final ItemEntityConfig defaultConfig = componentAccessor.getExternalData().getWorld().getGameplayConfig().getItemEntityConfig();
        final Float ttl = (itemEntityConfig != null && itemEntityConfig.getTtl() != null) ? itemEntityConfig.getTtl() : defaultConfig.getTtl();
        return (ttl != null) ? ttl : 120.0f;
    }
    
    @Nullable
    public ColorLight computeDynamicLight() {
        ColorLight dynamicLight = null;
        final Item item = (this.itemStack != null) ? this.itemStack.getItem() : null;
        if (item != null) {
            if (item.hasBlockType()) {
                final BlockType blockType = BlockType.getAssetMap().getAsset(this.itemStack.getBlockKey());
                if (blockType != null && blockType.getLight() != null) {
                    dynamicLight = blockType.getLight();
                }
            }
            else if (item.getLight() != null) {
                dynamicLight = item.getLight();
            }
        }
        return dynamicLight;
    }
    
    public boolean pollPickupDelay(final float dt) {
        if (this.pickupDelay <= 0.0f) {
            return true;
        }
        this.pickupDelay -= dt;
        return this.pickupDelay <= 0.0f;
    }
    
    public boolean pollPickupThrottle(final float dt) {
        this.pickupThrottle -= dt;
        if (this.pickupThrottle <= 0.0f) {
            this.pickupThrottle = 0.25f;
            return true;
        }
        return false;
    }
    
    public boolean pollMergeDelay(final float dt) {
        this.mergeDelay -= dt;
        if (this.mergeDelay <= 0.0f) {
            this.mergeDelay = 1.5f;
            return true;
        }
        return false;
    }
    
    public boolean canPickUp() {
        return this.pickupDelay <= 0.0f;
    }
    
    public boolean isRemovedByPlayerPickup() {
        return this.removedByPlayerPickup;
    }
    
    public void setRemovedByPlayerPickup(final boolean removedByPlayerPickup) {
        this.removedByPlayerPickup = removedByPlayerPickup;
    }
    
    public boolean consumeNetworkOutdated() {
        final boolean temp = this.isNetworkOutdated;
        this.isNetworkOutdated = false;
        return temp;
    }
    
    @Nonnull
    @Override
    public ItemComponent clone() {
        return new ItemComponent(this.itemStack, this.mergeDelay, this.pickupDelay, this.pickupThrottle, this.removedByPlayerPickup);
    }
    
    @Nonnull
    public static Holder<EntityStore>[] generateItemDrops(@Nonnull final ComponentAccessor<EntityStore> accessor, @Nonnull final List<ItemStack> itemStacks, @Nonnull final Vector3d position, @Nonnull final Vector3f rotation) {
        if (itemStacks.size() != 1) {
            final float randomAngleOffset = ThreadLocalRandom.current().nextFloat() * 6.2831855f;
            final CircleIterator iterator = new CircleIterator(Vector3d.ZERO, 3.0, itemStacks.size(), randomAngleOffset);
            return itemStacks.stream().map(item -> {
                final Vector3d circlePos = iterator.next();
                return generateItemDrop(accessor, item, position, rotation, (float)circlePos.getX(), 3.25f, (float)circlePos.getZ());
            }).filter(Objects::nonNull).toArray(Holder[]::new);
        }
        final Holder<EntityStore> itemEntityHolder = generateItemDrop(accessor, itemStacks.getFirst(), position, rotation, 0.0f, 3.25f, 0.0f);
        if (itemEntityHolder == null) {
            return Holder.emptyArray();
        }
        return new Holder[] { itemEntityHolder };
    }
    
    @Nullable
    public static Holder<EntityStore> generateItemDrop(@Nonnull final ComponentAccessor<EntityStore> accessor, @Nullable final ItemStack itemStack, @Nonnull final Vector3d position, @Nonnull final Vector3f rotation, final float velocityX, final float velocityY, final float velocityZ) {
        if (itemStack == null || itemStack.isEmpty() || !itemStack.isValid()) {
            ItemComponent.LOGGER.at(Level.WARNING).log("Attempted to drop invalid item %s at %s", itemStack, position);
            return null;
        }
        final Holder<EntityStore> holder = EntityStore.REGISTRY.newHolder();
        final ItemComponent itemComponent = new ItemComponent(itemStack);
        holder.addComponent(getComponentType(), itemComponent);
        holder.addComponent(TransformComponent.getComponentType(), new TransformComponent(position, rotation));
        holder.ensureAndGetComponent(Velocity.getComponentType()).set(velocityX, velocityY, velocityZ);
        holder.ensureComponent(PhysicsValues.getComponentType());
        holder.ensureComponent(UUIDComponent.getComponentType());
        holder.ensureComponent(Intangible.getComponentType());
        final float tempTtl = itemComponent.computeLifetimeSeconds(accessor);
        final TimeResource timeResource = accessor.getResource(TimeResource.getResourceType());
        holder.addComponent(DespawnComponent.getComponentType(), DespawnComponent.despawnInSeconds(timeResource, tempTtl));
        return holder;
    }
    
    @Nonnull
    public static Holder<EntityStore> generatePickedUpItem(@Nonnull final Ref<EntityStore> ref, @Nonnull final ComponentAccessor<EntityStore> componentAccessor, @Nonnull final Ref<EntityStore> targetRef, @Nonnull final Vector3d targetPosition) {
        final Holder<EntityStore> holder = EntityStore.REGISTRY.newHolder();
        final TransformComponent itemTransformComponent = componentAccessor.getComponent(ref, TransformComponent.getComponentType());
        assert itemTransformComponent != null;
        final ItemComponent itemItemComponent = componentAccessor.getComponent(ref, getComponentType());
        assert itemItemComponent != null;
        final HeadRotation itemHeadRotationComponent = componentAccessor.getComponent(ref, HeadRotation.getComponentType());
        assert itemHeadRotationComponent != null;
        final PickupItemComponent pickupItemComponent = new PickupItemComponent(targetRef, targetPosition.clone());
        holder.addComponent(PickupItemComponent.getComponentType(), pickupItemComponent);
        holder.addComponent(getComponentType(), itemItemComponent.clone());
        holder.addComponent(TransformComponent.getComponentType(), itemTransformComponent.clone());
        holder.ensureComponent(PreventItemMerging.getComponentType());
        holder.ensureComponent(Intangible.getComponentType());
        holder.addComponent(NetworkId.getComponentType(), new NetworkId(ref.getStore().getExternalData().takeNextNetworkId()));
        holder.ensureComponent(EntityStore.REGISTRY.getNonSerializedComponentType());
        return holder;
    }
    
    @Nonnull
    public static Holder<EntityStore> generatePickedUpItem(@Nonnull final ItemStack itemStack, @Nonnull final Vector3d position, @Nonnull final ComponentAccessor<EntityStore> componentAccessor, @Nonnull final Ref<EntityStore> targetRef) {
        final Holder<EntityStore> holder = EntityStore.REGISTRY.newHolder();
        final PickupItemComponent pickupItemComponent = new PickupItemComponent(targetRef, position.clone());
        holder.addComponent(PickupItemComponent.getComponentType(), pickupItemComponent);
        holder.addComponent(getComponentType(), new ItemComponent(new ItemStack(itemStack.getItemId())));
        holder.addComponent(TransformComponent.getComponentType(), new TransformComponent(position.clone(), Vector3f.ZERO.clone()));
        holder.ensureComponent(PreventItemMerging.getComponentType());
        holder.ensureComponent(Intangible.getComponentType());
        holder.addComponent(NetworkId.getComponentType(), new NetworkId(componentAccessor.getExternalData().takeNextNetworkId()));
        holder.ensureComponent(EntityStore.REGISTRY.getNonSerializedComponentType());
        return holder;
    }
    
    @Nullable
    public static ItemStack addToItemContainer(@Nonnull final Store<EntityStore> store, @Nonnull final Ref<EntityStore> itemRef, @Nonnull final ItemContainer itemContainer) {
        if (!itemRef.isValid()) {
            return null;
        }
        final ItemComponent itemComponent = store.getComponent(itemRef, getComponentType());
        if (itemComponent == null || itemComponent.pickupDelay > 0.0f) {
            return null;
        }
        final ItemStack itemStack = itemComponent.getItemStack();
        if (itemStack == null) {
            return null;
        }
        final ItemStackTransaction transaction = itemContainer.addItemStack(itemStack);
        final ItemStack remainder = transaction.getRemainder();
        if (remainder == null || remainder.isEmpty()) {
            store.removeEntity(itemRef, RemoveReason.REMOVE);
            return itemStack;
        }
        itemComponent.setPickupDelay(0.25f);
        itemComponent.setItemStack(remainder);
        final int quantity = itemStack.getQuantity() - remainder.getQuantity();
        if (quantity <= 0) {
            return null;
        }
        return itemStack.withQuantity(quantity);
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokevirtual   java/lang/Class.desiredAssertionStatus:()Z
        //     5: ifne            12
        //     8: iconst_1       
        //     9: goto            13
        //    12: iconst_0       
        //    13: putstatic       com/hypixel/hytale/server/core/modules/entity/item/ItemComponent.$assertionsDisabled:Z
        //    16: invokestatic    com/hypixel/hytale/logger/HytaleLogger.forEnclosingClass:()Lcom/hypixel/hytale/logger/HytaleLogger;
        //    19: putstatic       com/hypixel/hytale/server/core/modules/entity/item/ItemComponent.LOGGER:Lcom/hypixel/hytale/logger/HytaleLogger;
        //    22: ldc             Lcom/hypixel/hytale/server/core/modules/entity/item/ItemComponent;.class
        //    24: invokedynamic   BootstrapMethod #3, get:()Ljava/util/function/Supplier;
        //    29: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    32: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    35: dup            
        //    36: ldc_w           "Item"
        //    39: getstatic       com/hypixel/hytale/server/core/inventory/ItemStack.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //    42: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    45: invokedynamic   BootstrapMethod #4, accept:()Lcom/hypixel/hytale/function/consumer/TriConsumer;
        //    50: invokedynamic   BootstrapMethod #5, apply:()Ljava/util/function/BiFunction;
        //    55: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Lcom/hypixel/hytale/function/consumer/TriConsumer;Ljava/util/function/BiFunction;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    58: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    61: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    64: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    67: dup            
        //    68: ldc_w           "StackDelay"
        //    71: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //    74: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    77: invokedynamic   BootstrapMethod #6, accept:()Ljava/util/function/BiConsumer;
        //    82: invokedynamic   BootstrapMethod #7, apply:()Ljava/util/function/Function;
        //    87: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    90: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    93: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    96: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    99: dup            
        //   100: ldc_w           "PickupDelay"
        //   103: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   106: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   109: invokedynamic   BootstrapMethod #8, accept:()Ljava/util/function/BiConsumer;
        //   114: invokedynamic   BootstrapMethod #9, apply:()Ljava/util/function/Function;
        //   119: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   122: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   125: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   128: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   131: dup            
        //   132: ldc_w           "PickupThrottle"
        //   135: getstatic       com/hypixel/hytale/codec/Codec.FLOAT:Lcom/hypixel/hytale/codec/codecs/simple/FloatCodec;
        //   138: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   141: invokedynamic   BootstrapMethod #10, accept:()Ljava/util/function/BiConsumer;
        //   146: invokedynamic   BootstrapMethod #11, apply:()Ljava/util/function/Function;
        //   151: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   154: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   157: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   160: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //   163: dup            
        //   164: ldc_w           "RemovedByPlayerPickup"
        //   167: getstatic       com/hypixel/hytale/codec/Codec.BOOLEAN:Lcom/hypixel/hytale/codec/codecs/simple/BooleanCodec;
        //   170: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //   173: invokedynamic   BootstrapMethod #12, accept:()Ljava/util/function/BiConsumer;
        //   178: invokedynamic   BootstrapMethod #13, apply:()Ljava/util/function/Function;
        //   183: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.append:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //   186: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   189: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   192: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   195: putstatic       com/hypixel/hytale/server/core/modules/entity/item/ItemComponent.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   198: return         
        //    StackMapTable: 00 02 0C 40 01
        // 
        // The error that occurred was:
        // 
        // java.lang.UnsupportedOperationException: The requested operation is not supported.
        //     at com.strobel.util.ContractUtils.unsupported(ContractUtils.java:27)
        //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:284)
        //     at com.strobel.assembler.metadata.TypeReference.getRawType(TypeReference.java:279)
        //     at com.strobel.assembler.metadata.TypeReference.makeGenericType(TypeReference.java:154)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:225)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:211)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitParameterizedType(TypeSubstitutionVisitor.java:25)
        //     at com.strobel.assembler.metadata.ParameterizedType.accept(ParameterizedType.java:103)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visit(TypeSubstitutionVisitor.java:40)
        //     at com.strobel.assembler.metadata.TypeSubstitutionVisitor.visitMethod(TypeSubstitutionVisitor.java:314)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2611)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1510)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:790)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferCall(TypeAnalysis.java:2689)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1040)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:782)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:778)
        //     at com.strobel.decompiler.ast.TypeAnalysis.doInferTypeForExpression(TypeAnalysis.java:1083)
        //     at com.strobel.decompiler.ast.TypeAnalysis.inferTypeForExpression(TypeAnalysis.java:815)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:684)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:667)
        //     at com.strobel.decompiler.ast.TypeAnalysis.runInference(TypeAnalysis.java:373)
        //     at com.strobel.decompiler.ast.TypeAnalysis.run(TypeAnalysis.java:95)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:344)
        //     at com.strobel.decompiler.ast.AstOptimizer.optimize(AstOptimizer.java:42)
        //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:206)
        //     at com.strobel.decompiler.languages.java.ast.AstMethodBodyBuilder.createMethodBody(AstMethodBodyBuilder.java:93)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethodBody(AstBuilder.java:868)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createMethod(AstBuilder.java:761)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addTypeMembers(AstBuilder.java:638)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeCore(AstBuilder.java:605)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createTypeNoCache(AstBuilder.java:195)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.createType(AstBuilder.java:162)
        //     at com.strobel.decompiler.languages.java.ast.AstBuilder.addType(AstBuilder.java:137)
        //     at com.strobel.decompiler.languages.java.JavaLanguage.buildAst(JavaLanguage.java:71)
        //     at com.strobel.decompiler.languages.java.JavaLanguage.decompileType(JavaLanguage.java:59)
        //     at com.strobel.decompiler.DecompilerDriver.decompileType(DecompilerDriver.java:333)
        //     at com.strobel.decompiler.DecompilerDriver.decompileJar(DecompilerDriver.java:254)
        //     at com.strobel.decompiler.DecompilerDriver.main(DecompilerDriver.java:129)
        // 
        throw new IllegalStateException("An error occurred while decompiling this method.");
    }
}
