/** Copyright (C) 2007-2010, International Business Machines Corporation and Others. All Rights Reserved. **/

/* NOTE: this file is AUTOMATICALLY GENERATED by gentest.
 * See: {ICU4C}/source/data/icu4j-readme.txt for more information. 
 **/

package com.ibm.icu.dev.test.util;

public class DebugUtilitiesData extends Object {
    public static final String ICU4C_VERSION="4.6";
    public static final int UDebugEnumType = 0;
    public static final int UCalendarDateFields = 1;
    public static final int UCalendarMonths = 2;
    public static final int UDateFormatStyle = 3;
    public static final int UPlugReason = 4;
    public static final int UPlugLevel = 5;
    public static final int UAcceptResult = 6;
    public static final int UColAttributeValue = 7;
    public static final String [] TYPES = { 
        "UDebugEnumType", /* 0 */
        "UCalendarDateFields", /* 1 */
        "UCalendarMonths", /* 2 */
        "UDateFormatStyle", /* 3 */
        "UPlugReason", /* 4 */
        "UPlugLevel", /* 5 */
        "UAcceptResult", /* 6 */
        "UColAttributeValue", /* 7 */
    };

    public static final String [][] NAMES = { 
        /* UDebugEnumType, 0 */
        { 
           "UDebugEnumType", /* 0 */ 
           "UCalendarDateFields", /* 1 */ 
           "UCalendarMonths", /* 2 */ 
           "UDateFormatStyle", /* 3 */ 
           "UPlugReason", /* 4 */ 
           "UPlugLevel", /* 5 */ 
           "UAcceptResult", /* 6 */ 
           "UColAttributeValue", /* 7 */ 
        },
        /* UCalendarDateFields, 1 */
        { 
           "ERA", /* 0 */ 
           "YEAR", /* 1 */ 
           "MONTH", /* 2 */ 
           "WEEK_OF_YEAR", /* 3 */ 
           "WEEK_OF_MONTH", /* 4 */ 
           "DATE", /* 5 */ 
           "DAY_OF_YEAR", /* 6 */ 
           "DAY_OF_WEEK", /* 7 */ 
           "DAY_OF_WEEK_IN_MONTH", /* 8 */ 
           "AM_PM", /* 9 */ 
           "HOUR", /* 10 */ 
           "HOUR_OF_DAY", /* 11 */ 
           "MINUTE", /* 12 */ 
           "SECOND", /* 13 */ 
           "MILLISECOND", /* 14 */ 
           "ZONE_OFFSET", /* 15 */ 
           "DST_OFFSET", /* 16 */ 
           "YEAR_WOY", /* 17 */ 
           "DOW_LOCAL", /* 18 */ 
           "EXTENDED_YEAR", /* 19 */ 
           "JULIAN_DAY", /* 20 */ 
           "MILLISECONDS_IN_DAY", /* 21 */ 
           "IS_LEAP_MONTH", /* 22 */ 
        },
        /* UCalendarMonths, 2 */
        { 
           "JANUARY", /* 0 */ 
           "FEBRUARY", /* 1 */ 
           "MARCH", /* 2 */ 
           "APRIL", /* 3 */ 
           "MAY", /* 4 */ 
           "JUNE", /* 5 */ 
           "JULY", /* 6 */ 
           "AUGUST", /* 7 */ 
           "SEPTEMBER", /* 8 */ 
           "OCTOBER", /* 9 */ 
           "NOVEMBER", /* 10 */ 
           "DECEMBER", /* 11 */ 
           "UNDECIMBER", /* 12 */ 
        },
        /* UDateFormatStyle, 3 */
        { 
           "FULL", /* 0 */ 
           "LONG", /* 1 */ 
           "MEDIUM", /* 2 */ 
           "SHORT", /* 3 */ 
        },
        /* UPlugReason, 4 */
        { 
           "QUERY", /* 0 */ 
           "LOAD", /* 1 */ 
           "UNLOAD", /* 2 */ 
        },
        /* UPlugLevel, 5 */
        { 
           "INVALID", /* 0 */ 
           "UNKNOWN", /* 1 */ 
           "LOW", /* 2 */ 
           "HIGH", /* 3 */ 
        },
        /* UAcceptResult, 6 */
        { 
           "FAILED", /* 0 */ 
           "VALID", /* 1 */ 
           "FALLBACK", /* 2 */ 
        },
        /* UColAttributeValue, 7 */
        { 
           "PRIMARY", /* 0 */ 
           "SECONDARY", /* 1 */ 
           "TERTIARY", /* 2 */ 
           "QUATERNARY", /* 3 */ 
           "IDENTICAL", /* 4 */ 
           "OFF", /* 5 */ 
           "ON", /* 6 */ 
           "SHIFTED", /* 7 */ 
           "NON_IGNORABLE", /* 8 */ 
           "LOWER_FIRST", /* 9 */ 
           "UPPER_FIRST", /* 10 */ 
        },
    };

    public static final int [][] VALUES = { 
        /* UDebugEnumType, 0 */
        { 
           0, /* UDebugEnumType */
           1, /* UCalendarDateFields */
           2, /* UCalendarMonths */
           3, /* UDateFormatStyle */
           4, /* UPlugReason */
           5, /* UPlugLevel */
           6, /* UAcceptResult */
           7, /* UColAttributeValue */
        },
        /* UCalendarDateFields, 1 */
        { 
           com.ibm.icu.util.Calendar.ERA, /* 0 */
           com.ibm.icu.util.Calendar.YEAR, /* 1 */
           com.ibm.icu.util.Calendar.MONTH, /* 2 */
           com.ibm.icu.util.Calendar.WEEK_OF_YEAR, /* 3 */
           com.ibm.icu.util.Calendar.WEEK_OF_MONTH, /* 4 */
           com.ibm.icu.util.Calendar.DATE, /* 5 */
           com.ibm.icu.util.Calendar.DAY_OF_YEAR, /* 6 */
           com.ibm.icu.util.Calendar.DAY_OF_WEEK, /* 7 */
           com.ibm.icu.util.Calendar.DAY_OF_WEEK_IN_MONTH, /* 8 */
           com.ibm.icu.util.Calendar.AM_PM, /* 9 */
           com.ibm.icu.util.Calendar.HOUR, /* 10 */
           com.ibm.icu.util.Calendar.HOUR_OF_DAY, /* 11 */
           com.ibm.icu.util.Calendar.MINUTE, /* 12 */
           com.ibm.icu.util.Calendar.SECOND, /* 13 */
           com.ibm.icu.util.Calendar.MILLISECOND, /* 14 */
           com.ibm.icu.util.Calendar.ZONE_OFFSET, /* 15 */
           com.ibm.icu.util.Calendar.DST_OFFSET, /* 16 */
           com.ibm.icu.util.Calendar.YEAR_WOY, /* 17 */
           com.ibm.icu.util.Calendar.DOW_LOCAL, /* 18 */
           com.ibm.icu.util.Calendar.EXTENDED_YEAR, /* 19 */
           com.ibm.icu.util.Calendar.JULIAN_DAY, /* 20 */
           com.ibm.icu.util.Calendar.MILLISECONDS_IN_DAY, /* 21 */
           com.ibm.icu.util.ChineseCalendar.IS_LEAP_MONTH, /* 22 */
        },
        /* UCalendarMonths, 2 */
        { 
           com.ibm.icu.util.Calendar.JANUARY, /* 0 */
           com.ibm.icu.util.Calendar.FEBRUARY, /* 1 */
           com.ibm.icu.util.Calendar.MARCH, /* 2 */
           com.ibm.icu.util.Calendar.APRIL, /* 3 */
           com.ibm.icu.util.Calendar.MAY, /* 4 */
           com.ibm.icu.util.Calendar.JUNE, /* 5 */
           com.ibm.icu.util.Calendar.JULY, /* 6 */
           com.ibm.icu.util.Calendar.AUGUST, /* 7 */
           com.ibm.icu.util.Calendar.SEPTEMBER, /* 8 */
           com.ibm.icu.util.Calendar.OCTOBER, /* 9 */
           com.ibm.icu.util.Calendar.NOVEMBER, /* 10 */
           com.ibm.icu.util.Calendar.DECEMBER, /* 11 */
           com.ibm.icu.util.Calendar.UNDECIMBER, /* 12 */
        },
        /* UDateFormatStyle, 3 */
        { 
           0, /* FULL */
           1, /* LONG */
           2, /* MEDIUM */
           3, /* SHORT */
        },
        /* UPlugReason, 4 */
        { 
           0, /* QUERY */
           1, /* LOAD */
           2, /* UNLOAD */
        },
        /* UPlugLevel, 5 */
        { 
           0, /* INVALID */
           1, /* UNKNOWN */
           2, /* LOW */
           3, /* HIGH */
        },
        /* UAcceptResult, 6 */
        { 
           0, /* FAILED */
           1, /* VALID */
           2, /* FALLBACK */
        },
        /* UColAttributeValue, 7 */
        { 
           0, /* PRIMARY */
           1, /* SECONDARY */
           2, /* TERTIARY */
           3, /* QUATERNARY */
           4, /* IDENTICAL */
           5, /* OFF */
           6, /* ON */
           7, /* SHIFTED */
           8, /* NON_IGNORABLE */
           9, /* LOWER_FIRST */
           10, /* UPPER_FIRST */
        },
    };

}
