//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import java.util.Date;

public class Constants {

    static final boolean T = true;
    static final boolean F = false;
    static final char C0 = '\n';
    static final char C1 = 'a';
    static final char C2 = 'Ȁ';
    static final byte BMin = -128;
    static final byte BMax = 127;
    static final short SMin = -32768;
    static final short SMax = 32767;
    static final int IMin = -2147483648;
    static final int IMax = 2147483647;
    static final long LMin = -9223372036854775808L;
    static final long LMax = 9223372036854775807L;
    static final float FNan = 0.0F / 0.0;
    static final float FNeg = -1.0F / 0.0;
    static final float FPos = 1.0F / 0.0;
    static final float FMin = 1.4E-45F;
    static final float FMax = 3.4028235E38F;
    static final double DNan = 0.0D / 0.0;
    static final double DNeg = -1.0D / 0.0;
    static final double DPos = 1.0D / 0.0;
    static final double DMin = 4.9E-324D;
    static final double DMax = 1.7976931348623157E308D;


    public Constants() {
    }

    @Constants(byte.class)
    void m1() {
    }

    @Constants(char.class)
    void m2() {
    }

    @Constants(double.class)
    void m3() {
    }

    @Constants(float.class)
    void m4() {
    }

    @Constants(int.class)
    void m5() {
    }

    @Constants(long.class)
    void m6() {
    }

    @Constants(short.class)
    void m7() {
    }

    @Constants(boolean.class)
    void m8() {
    }

    @Constants(void.class)
    void m9() {
    }

    @Constants(Date.class)
    void m10() {
    }

    @interface A {

        Class<?> value();
    }
}
