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

package com.hypixel.hytale.math.vector;

import com.hypixel.hytale.math.util.HashUtil;
import javax.annotation.Nullable;
import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.math.util.TrigMathUtil;
import java.util.Random;
import com.hypixel.hytale.math.codec.Vector2dArrayCodec;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class Vector2d
{
    @Nonnull
    public static final BuilderCodec<Vector2d> CODEC;
    @Deprecated
    public static final Vector2dArrayCodec AS_ARRAY_CODEC;
    public static final Vector2d ZERO;
    public static final Vector2d UP;
    public static final Vector2d POS_Y;
    public static final Vector2d DOWN;
    public static final Vector2d NEG_Y;
    public static final Vector2d RIGHT;
    public static final Vector2d POS_X;
    public static final Vector2d LEFT;
    public static final Vector2d NEG_X;
    public static final Vector2d ALL_ONES;
    public static final Vector2d[] DIRECTIONS;
    public double x;
    public double y;
    private transient int hash;
    
    public Vector2d() {
        this(0.0, 0.0);
    }
    
    public Vector2d(@Nonnull final Vector2d v) {
        this(v.x, v.y);
    }
    
    public Vector2d(final double x, final double y) {
        this.x = x;
        this.y = y;
        this.hash = 0;
    }
    
    public Vector2d(@Nonnull final Random random, final double length) {
        final float yaw = random.nextFloat() * 6.2831855f;
        final float pitch = random.nextFloat() * 6.2831855f;
        this.x = TrigMathUtil.sin(pitch) * TrigMathUtil.cos(yaw);
        this.y = TrigMathUtil.cos(pitch);
        this.scale(length);
        this.hash = 0;
    }
    
    public double getX() {
        return this.x;
    }
    
    public void setX(final double x) {
        this.x = x;
        this.hash = 0;
    }
    
    public double getY() {
        return this.y;
    }
    
    public void setY(final double y) {
        this.y = y;
        this.hash = 0;
    }
    
    @Nonnull
    public Vector2d assign(@Nonnull final Vector2d v) {
        this.x = v.x;
        this.y = v.y;
        this.hash = v.hash;
        return this;
    }
    
    @Nonnull
    public Vector2d assign(final double v) {
        this.x = v;
        this.y = v;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d assign(@Nonnull final double[] v) {
        this.x = v[0];
        this.y = v[1];
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d assign(@Nonnull final float[] v) {
        this.x = v[0];
        this.y = v[1];
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d assign(final double x, final double y) {
        this.x = x;
        this.y = y;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d add(@Nonnull final Vector2d v) {
        this.x += v.x;
        this.y += v.y;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d add(final double x, final double y) {
        this.x += x;
        this.y += y;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d addScaled(@Nonnull final Vector2d v, final double s) {
        this.x += v.x * s;
        this.y += v.y * s;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d subtract(@Nonnull final Vector2d v) {
        this.x -= v.x;
        this.y -= v.y;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d subtract(final double x, final double y) {
        this.x -= x;
        this.y -= y;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d negate() {
        this.x = -this.x;
        this.y = -this.y;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d scale(final double s) {
        this.x *= s;
        this.y *= s;
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d scale(@Nonnull final Vector2d p) {
        this.x *= p.x;
        this.y *= p.y;
        this.hash = 0;
        return this;
    }
    
    public double dot(@Nonnull final Vector2d other) {
        return this.x * other.x + this.y * other.y;
    }
    
    public double distanceTo(@Nonnull final Vector2d v) {
        return Math.sqrt(this.distanceSquaredTo(v));
    }
    
    public double distanceTo(final double x, final double y) {
        return Math.sqrt(this.distanceSquaredTo(x, y));
    }
    
    public double distanceSquaredTo(@Nonnull final Vector2d v) {
        final double x0 = v.x - this.x;
        final double y0 = v.y - this.y;
        return x0 * x0 + y0 * y0;
    }
    
    public double distanceSquaredTo(double x, double y) {
        x -= this.x;
        y -= this.y;
        return x * x + y * y;
    }
    
    @Nonnull
    public Vector2d normalize() {
        return this.setLength(1.0);
    }
    
    public double length() {
        return Math.sqrt(this.squaredLength());
    }
    
    public double squaredLength() {
        return this.x * this.x + this.y * this.y;
    }
    
    @Nonnull
    public Vector2d setLength(final double newLen) {
        return this.scale(newLen / this.length());
    }
    
    @Nonnull
    public Vector2d clampLength(final double maxLength) {
        final double length = this.length();
        if (maxLength > length) {
            return this;
        }
        return this.scale(maxLength / length);
    }
    
    @Nonnull
    public Vector2d floor() {
        this.x = Math.floor(this.x);
        this.y = Math.floor(this.y);
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d ceil() {
        this.x = Math.ceil(this.x);
        this.y = Math.ceil(this.y);
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public Vector2d clipToZero(final double epsilon) {
        this.x = MathUtil.clipToZero(this.x, epsilon);
        this.y = MathUtil.clipToZero(this.y, epsilon);
        this.hash = 0;
        return this;
    }
    
    public boolean closeToZero(final double epsilon) {
        return MathUtil.closeToZero(this.x, epsilon) && MathUtil.closeToZero(this.y, epsilon);
    }
    
    public boolean isFinite() {
        return Double.isFinite(this.x) && Double.isFinite(this.y);
    }
    
    @Nonnull
    public Vector2d dropHash() {
        this.hash = 0;
        return this;
    }
    
    @Nonnull
    public static Vector2d max(@Nonnull final Vector2d a, @Nonnull final Vector2d b) {
        return new Vector2d(Math.max(a.x, b.x), Math.max(a.y, b.y));
    }
    
    @Nonnull
    public static Vector2d min(@Nonnull final Vector2d a, @Nonnull final Vector2d b) {
        return new Vector2d(Math.min(a.x, b.x), Math.min(a.y, b.y));
    }
    
    @Nonnull
    public static Vector2d lerp(@Nonnull final Vector2d a, @Nonnull final Vector2d b, final double t) {
        return lerpUnclamped(a, b, MathUtil.clamp(t, 0.0, 1.0));
    }
    
    @Nonnull
    public static Vector2d lerpUnclamped(@Nonnull final Vector2d a, @Nonnull final Vector2d b, final double t) {
        return new Vector2d(a.x + t * (b.x - a.x), a.y + t * (b.y - a.y));
    }
    
    public static double distance(final double x1, final double y1, final double x2, final double y2) {
        return Math.sqrt(distanceSquared(x1, y1, x2, y2));
    }
    
    public static double distanceSquared(double x1, double y1, final double x2, final double y2) {
        x1 -= x2;
        y1 -= y2;
        return x1 * x1 + y1 * y1;
    }
    
    @Nonnull
    public Vector2d clone() {
        return new Vector2d(this.x, this.y);
    }
    
    @Override
    public boolean equals(@Nullable final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || this.getClass() != o.getClass()) {
            return false;
        }
        final Vector2d vector2d = (Vector2d)o;
        return vector2d.x == this.x && vector2d.y == this.y;
    }
    
    @Override
    public int hashCode() {
        if (this.hash == 0) {
            this.hash = (int)HashUtil.hash(Double.doubleToLongBits(this.x), Double.doubleToLongBits(this.y));
        }
        return this.hash;
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "Vector2d{x=" + this.x + ", y=" + this.y;
    }
    
    static {
        // 
        // This method could not be decompiled.
        // 
        // Original Bytecode:
        // 
        //     2: invokedynamic   BootstrapMethod #1, get:()Ljava/util/function/Supplier;
        //     7: invokestatic    com/hypixel/hytale/codec/builder/BuilderCodec.builder:(Ljava/lang/Class;Ljava/util/function/Supplier;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    10: getstatic       com/hypixel/hytale/codec/schema/metadata/ui/UIDisplayMode.COMPACT:Lcom/hypixel/hytale/codec/schema/metadata/ui/UIDisplayMode;
        //    13: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.metadata:(Lcom/hypixel/hytale/codec/schema/metadata/Metadata;)Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    16: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    19: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    22: dup            
        //    23: ldc             "X"
        //    25: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE:Lcom/hypixel/hytale/codec/codecs/simple/DoubleCodec;
        //    28: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    31: invokedynamic   BootstrapMethod #2, accept:()Ljava/util/function/BiConsumer;
        //    36: invokedynamic   BootstrapMethod #3, apply:()Ljava/util/function/Function;
        //    41: invokedynamic   BootstrapMethod #4, accept:()Ljava/util/function/BiConsumer;
        //    46: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    49: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //    52: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    55: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //    58: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //    61: new             Lcom/hypixel/hytale/codec/KeyedCodec;
        //    64: dup            
        //    65: ldc             "Y"
        //    67: getstatic       com/hypixel/hytale/codec/Codec.DOUBLE:Lcom/hypixel/hytale/codec/codecs/simple/DoubleCodec;
        //    70: invokespecial   com/hypixel/hytale/codec/KeyedCodec.<init>:(Ljava/lang/String;Lcom/hypixel/hytale/codec/Codec;)V
        //    73: invokedynamic   BootstrapMethod #5, accept:()Ljava/util/function/BiConsumer;
        //    78: invokedynamic   BootstrapMethod #6, apply:()Ljava/util/function/Function;
        //    83: invokedynamic   BootstrapMethod #7, accept:()Ljava/util/function/BiConsumer;
        //    88: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.appendInherited:(Lcom/hypixel/hytale/codec/KeyedCodec;Ljava/util/function/BiConsumer;Ljava/util/function/Function;Ljava/util/function/BiConsumer;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    91: invokestatic    com/hypixel/hytale/codec/validation/Validators.nonNull:()Lcom/hypixel/hytale/codec/validation/Validator;
        //    94: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.addValidator:(Lcom/hypixel/hytale/codec/validation/Validator;)Lcom/hypixel/hytale/codec/builder/BuilderField$FieldBuilder;
        //    97: invokevirtual   com/hypixel/hytale/codec/builder/BuilderField$FieldBuilder.add:()Lcom/hypixel/hytale/codec/builder/BuilderCodec$BuilderBase;
        //   100: checkcast       Lcom/hypixel/hytale/codec/builder/BuilderCodec$Builder;
        //   103: invokevirtual   com/hypixel/hytale/codec/builder/BuilderCodec$Builder.build:()Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   106: putstatic       com/hypixel/hytale/math/vector/Vector2d.CODEC:Lcom/hypixel/hytale/codec/builder/BuilderCodec;
        //   109: new             Lcom/hypixel/hytale/math/codec/Vector2dArrayCodec;
        //   112: dup            
        //   113: invokespecial   com/hypixel/hytale/math/codec/Vector2dArrayCodec.<init>:()V
        //   116: putstatic       com/hypixel/hytale/math/vector/Vector2d.AS_ARRAY_CODEC:Lcom/hypixel/hytale/math/codec/Vector2dArrayCodec;
        //   119: new             Lcom/hypixel/hytale/math/vector/Vector2d;
        //   122: dup            
        //   123: dconst_0       
        //   124: dconst_0       
        //   125: invokespecial   com/hypixel/hytale/math/vector/Vector2d.<init>:(DD)V
        //   128: putstatic       com/hypixel/hytale/math/vector/Vector2d.ZERO:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   131: new             Lcom/hypixel/hytale/math/vector/Vector2d;
        //   134: dup            
        //   135: dconst_0       
        //   136: dconst_1       
        //   137: invokespecial   com/hypixel/hytale/math/vector/Vector2d.<init>:(DD)V
        //   140: putstatic       com/hypixel/hytale/math/vector/Vector2d.UP:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   143: getstatic       com/hypixel/hytale/math/vector/Vector2d.UP:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   146: putstatic       com/hypixel/hytale/math/vector/Vector2d.POS_Y:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   149: new             Lcom/hypixel/hytale/math/vector/Vector2d;
        //   152: dup            
        //   153: dconst_0       
        //   154: ldc2_w          -1.0
        //   157: invokespecial   com/hypixel/hytale/math/vector/Vector2d.<init>:(DD)V
        //   160: putstatic       com/hypixel/hytale/math/vector/Vector2d.DOWN:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   163: getstatic       com/hypixel/hytale/math/vector/Vector2d.DOWN:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   166: putstatic       com/hypixel/hytale/math/vector/Vector2d.NEG_Y:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   169: new             Lcom/hypixel/hytale/math/vector/Vector2d;
        //   172: dup            
        //   173: dconst_1       
        //   174: dconst_0       
        //   175: invokespecial   com/hypixel/hytale/math/vector/Vector2d.<init>:(DD)V
        //   178: putstatic       com/hypixel/hytale/math/vector/Vector2d.RIGHT:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   181: getstatic       com/hypixel/hytale/math/vector/Vector2d.RIGHT:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   184: putstatic       com/hypixel/hytale/math/vector/Vector2d.POS_X:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   187: new             Lcom/hypixel/hytale/math/vector/Vector2d;
        //   190: dup            
        //   191: ldc2_w          -1.0
        //   194: dconst_0       
        //   195: invokespecial   com/hypixel/hytale/math/vector/Vector2d.<init>:(DD)V
        //   198: putstatic       com/hypixel/hytale/math/vector/Vector2d.LEFT:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   201: getstatic       com/hypixel/hytale/math/vector/Vector2d.LEFT:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   204: putstatic       com/hypixel/hytale/math/vector/Vector2d.NEG_X:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   207: new             Lcom/hypixel/hytale/math/vector/Vector2d;
        //   210: dup            
        //   211: dconst_1       
        //   212: dconst_1       
        //   213: invokespecial   com/hypixel/hytale/math/vector/Vector2d.<init>:(DD)V
        //   216: putstatic       com/hypixel/hytale/math/vector/Vector2d.ALL_ONES:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   219: iconst_4       
        //   220: anewarray       Lcom/hypixel/hytale/math/vector/Vector2d;
        //   223: dup            
        //   224: iconst_0       
        //   225: getstatic       com/hypixel/hytale/math/vector/Vector2d.UP:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   228: aastore        
        //   229: dup            
        //   230: iconst_1       
        //   231: getstatic       com/hypixel/hytale/math/vector/Vector2d.DOWN:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   234: aastore        
        //   235: dup            
        //   236: iconst_2       
        //   237: getstatic       com/hypixel/hytale/math/vector/Vector2d.LEFT:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   240: aastore        
        //   241: dup            
        //   242: iconst_3       
        //   243: getstatic       com/hypixel/hytale/math/vector/Vector2d.RIGHT:Lcom/hypixel/hytale/math/vector/Vector2d;
        //   246: aastore        
        //   247: putstatic       com/hypixel/hytale/math/vector/Vector2d.DIRECTIONS:[Lcom/hypixel/hytale/math/vector/Vector2d;
        //   250: return         
        // 
        // 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: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: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.");
    }
}
