home *** CD-ROM | disk | FTP | other *** search
/ Apple Developer Connection Student Program / ADC Tools Sampler CD Disk 3 1999.iso / Metrowerks CodeWarrior / Java Support / Java_Source / Java2 / src / java / lang / Character.java < prev    next >
Encoding:
Text File  |  1999-05-28  |  89.5 KB  |  1,918 lines  |  [TEXT/CWIE]

  1. /*
  2.  * @(#)Character.java    1.55 98/09/16
  3.  *
  4.  * Copyright 1994-1998 by Sun Microsystems, Inc.,
  5.  * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
  6.  * All rights reserved.
  7.  *
  8.  * This software is the confidential and proprietary information
  9.  * of Sun Microsystems, Inc. ("Confidential Information").  You
  10.  * shall not disclose such Confidential Information and shall use
  11.  * it only in accordance with the terms of the license agreement
  12.  * you entered into with Sun.
  13.  */
  14.  
  15. // This file was generated AUTOMATICALLY from a template file Fri Jun 19 11:07:53 PDT 1998
  16. // Hand-merged JDK 1.1.7 Unicode 2.1.2 table changes back into 1.2 source - 7/23/98
  17.  
  18. package java.lang;
  19.  
  20.  
  21. /**
  22.  * The Character class wraps a value of the primitive type <code>char</code> 
  23.  * in an object. An object of type <code>Character</code> contains a 
  24.  * single field whose type is <code>char</code>. 
  25.  * <p>
  26.  * In addition, this class provides several methods for determining 
  27.  * the type of a character and converting characters from uppercase 
  28.  * to lowercase and vice versa. 
  29.  * <p>
  30.  * Many of the methods of class <code>Character</code> are defined 
  31.  * in terms of a "Unicode attribute table" that specifies 
  32.  * a name for every defined Unicode code point. The table also 
  33.  * includes other attributes, such as a decimal value, an uppercase 
  34.  * equivalent, a lowercase equivalent, and/or a titlecase equivalent. 
  35.  * The character attribute tables for specific versions of Unicode
  36.  * are available on the World Wide Web in various subdirectories of:
  37.  * <blockquote><pre>
  38.    *   ftp://ftp.unicode.org/Public/
  39.  * </pre></blockquote>
  40.  * <p>
  41.  * For a more detailed specification of the <code>Character</code> 
  42.  * class, one that encompasses the exact behavior of methods such as 
  43.  * <code>isDigit</code>, <code>isLetter</code>, 
  44.  * <code>isLowerCase</code>, and <code>isUpperCase</code> over the 
  45.  * full range of Unicode values, see Gosling, Joy, and Steele, <i>The 
  46.  * Java Language Specification</i>. 
  47.  *
  48.  * @author  Lee Boynton
  49.  * @author  Guy Steele
  50.  * @author  Akira Tanaka
  51.  * @version 1.55, 98/09/16
  52.  * @since   JDK1.0
  53.  */
  54.  
  55. public final class Character
  56.     extends Object
  57.     implements java.io.Serializable, Comparable
  58. {
  59.  
  60.     /**
  61.      * The minimum radix available for conversion to and from Strings.  
  62.      * The constant value of this field is the smallest value permitted 
  63.      * for the radix argument in radix-conversion methods such as the 
  64.      * <code>digit</code> method, the <code>forDigit</code>
  65.      * method, and the <code>toString</code> method of class 
  66.      * <code>Integer</code>. 
  67.      *
  68.      * @see     java.lang.Character#digit(char, int)
  69.      * @see     java.lang.Character#forDigit(int, int)
  70.      * @see     java.lang.Integer#toString(int, int)
  71.      * @see     java.lang.Integer#valueOf(java.lang.String)
  72.      */
  73.     public static final int MIN_RADIX = 2;
  74.  
  75.     /**
  76.      * The maximum radix available for conversion to and from Strings.
  77.      * The constant value of this field is the largest value permitted 
  78.      * for the radix argument in radix-conversion methods such as the 
  79.      * <code>digit</code> method, the <code>forDigit</code>
  80.      * method, and the <code>toString</code> method of class 
  81.      * <code>Integer</code>. 
  82.      *
  83.      * @see     java.lang.Character#digit(char, int)
  84.      * @see     java.lang.Character#forDigit(int, int)
  85.      * @see     java.lang.Integer#toString(int, int)
  86.      * @see     java.lang.Integer#valueOf(java.lang.String)
  87.      */
  88.     public static final int MAX_RADIX = 36;
  89.  
  90.     /**
  91.      * The constant value of this field is the smallest value of type 
  92.      * <code>char</code>.
  93.      *
  94.      * @since   JDK1.0.2
  95.      */
  96.     public static final char   MIN_VALUE = '\u0000';
  97.  
  98.     /**
  99.      * The constant value of this field is the largest value of type 
  100.      * <code>char</code>.
  101.      *
  102.      * @since   JDK1.0.2
  103.      */
  104.     public static final char   MAX_VALUE = '\uffff';
  105.  
  106.     /**
  107.      * The Class object representing the primitive type char.
  108.      *
  109.      * @since   JDK1.1
  110.      */
  111.     public static final Class    TYPE = Class.getPrimitiveClass("char");
  112.  
  113.     /**
  114.      * Public data for enumerated Unicode general category types
  115.      *
  116.      * @since   JDK1.1
  117.      */
  118.     public static final byte
  119.     UNASSIGNED        = 0,
  120.     UPPERCASE_LETTER    = 1,
  121.     LOWERCASE_LETTER    = 2,
  122.     TITLECASE_LETTER    = 3,
  123.     MODIFIER_LETTER        = 4,
  124.     OTHER_LETTER        = 5,
  125.     NON_SPACING_MARK    = 6,
  126.     ENCLOSING_MARK        = 7,
  127.     COMBINING_SPACING_MARK    = 8,
  128.     DECIMAL_DIGIT_NUMBER    = 9,
  129.     LETTER_NUMBER        = 10,
  130.     OTHER_NUMBER        = 11,
  131.     SPACE_SEPARATOR        = 12,
  132.     LINE_SEPARATOR        = 13,
  133.     PARAGRAPH_SEPARATOR    = 14,
  134.     CONTROL            = 15,
  135.     FORMAT            = 16,
  136.     PRIVATE_USE        = 18,
  137.     SURROGATE        = 19,
  138.     DASH_PUNCTUATION    = 20,
  139.     START_PUNCTUATION    = 21,
  140.     END_PUNCTUATION        = 22,
  141.     CONNECTOR_PUNCTUATION    = 23,
  142.     OTHER_PUNCTUATION    = 24,
  143.     MATH_SYMBOL        = 25,
  144.     CURRENCY_SYMBOL        = 26,
  145.     MODIFIER_SYMBOL        = 27,
  146.     OTHER_SYMBOL        = 28;
  147.  
  148.     /**
  149.      * Instances of this class represent particular subsets of the Unicode
  150.      * character set.  The only family of subsets defined in the
  151.      * <code>Character</code> class is <code>{@link Character.UnicodeBlock
  152.      * UnicodeBlock}</code>.  Other portions of the Java API may define other
  153.      * subsets for their own purposes.
  154.      *
  155.      * @since JDK1.2
  156.      */
  157.     public static class Subset  {
  158.  
  159.     private String name;
  160.  
  161.     /**
  162.          * Constructs a new <code>Subset</code> instance.
  163.      *
  164.      * @param  name  The name of this subset
  165.          */
  166.         protected Subset(String name) {
  167.         this.name = name;
  168.     }
  169.  
  170.     /**
  171.      * Compares two <code>Subset</code> objects for equality.  This
  172.          * method returns <code>true</code> if and only if <code>x</code> and
  173.          * <code>y</code> refer to the same object, and because it is final it
  174.      * guarantees this for all subclasses.
  175.      */
  176.     public final boolean equals(Object obj) {
  177.         return (this == obj);
  178.     }
  179.  
  180.     /**
  181.          * Returns the standard hash code as defined by the <code>{@link
  182.      * Object#hashCode}</code> method.  This method is final in order to
  183.      * ensure that the <code>equals</code> and <code>hashCode</code>
  184.      * methods will be consistent in all subclasses.
  185.      */
  186.     public final int hashCode() {
  187.         return super.hashCode();
  188.     }
  189.  
  190.     /**
  191.      * Returns the name of this subset.
  192.      */
  193.     public final String toString() {
  194.         return name;
  195.     }
  196.  
  197.     }
  198.  
  199.     /**
  200.      * A family of character subsets representing the character blocks defined
  201.      * by the Unicode 2.0 specification.  Any given character is contained by
  202.      * at most one Unicode block.
  203.      *
  204.      * @since JDK1.2
  205.      */
  206.     public static final class UnicodeBlock extends Subset {
  207.  
  208.     private UnicodeBlock(String name) {
  209.         super(name);
  210.     }
  211.  
  212.         /** Constant for the Unicode character block of the same name. */
  213.         public static final UnicodeBlock
  214.         BASIC_LATIN
  215.                 = new UnicodeBlock("BASIC_LATIN"),
  216.         LATIN_1_SUPPLEMENT
  217.                 = new UnicodeBlock("LATIN_1_SUPPLEMENT"),
  218.             LATIN_EXTENDED_A
  219.                 = new UnicodeBlock("LATIN_EXTENDED_A"),
  220.             LATIN_EXTENDED_B
  221.                 = new UnicodeBlock("LATIN_EXTENDED_B"),
  222.             IPA_EXTENSIONS
  223.                 = new UnicodeBlock("IPA_EXTENSIONS"),
  224.             SPACING_MODIFIER_LETTERS
  225.                 = new UnicodeBlock("SPACING_MODIFIER_LETTERS"),
  226.             COMBINING_DIACRITICAL_MARKS
  227.                 = new UnicodeBlock("COMBINING_DIACRITICAL_MARKS"),
  228.             GREEK
  229.                 = new UnicodeBlock("GREEK"),
  230.             CYRILLIC
  231.                 = new UnicodeBlock("CYRILLIC"),
  232.             ARMENIAN
  233.                 = new UnicodeBlock("ARMENIAN"),
  234.             HEBREW
  235.                 = new UnicodeBlock("HEBREW"),
  236.             ARABIC
  237.                 = new UnicodeBlock("ARABIC"),
  238.             DEVANAGARI
  239.                 = new UnicodeBlock("DEVANAGARI"),
  240.             BENGALI
  241.                 = new UnicodeBlock("BENGALI"),
  242.             GURMUKHI
  243.                 = new UnicodeBlock("GURMUKHI"),
  244.             GUJARATI
  245.                 = new UnicodeBlock("GUJARATI"),
  246.             ORIYA
  247.                 = new UnicodeBlock("ORIYA"),
  248.             TAMIL
  249.                 = new UnicodeBlock("TAMIL"),
  250.             TELUGU
  251.                 = new UnicodeBlock("TELUGU"),
  252.             KANNADA
  253.                 = new UnicodeBlock("KANNADA"),
  254.             MALAYALAM
  255.                 = new UnicodeBlock("MALAYALAM"),
  256.             THAI
  257.                 = new UnicodeBlock("THAI"),
  258.             LAO
  259.                 = new UnicodeBlock("LAO"),
  260.             TIBETAN
  261.                 = new UnicodeBlock("TIBETAN"),
  262.             GEORGIAN
  263.                 = new UnicodeBlock("GEORGIAN"),
  264.             HANGUL_JAMO
  265.                 = new UnicodeBlock("HANGUL_JAMO"),
  266.             LATIN_EXTENDED_ADDITIONAL
  267.                 = new UnicodeBlock("LATIN_EXTENDED_ADDITIONAL"),
  268.             GREEK_EXTENDED
  269.                 = new UnicodeBlock("GREEK_EXTENDED"),
  270.             GENERAL_PUNCTUATION
  271.                 = new UnicodeBlock("GENERAL_PUNCTUATION"),
  272.             SUPERSCRIPTS_AND_SUBSCRIPTS
  273.                 = new UnicodeBlock("SUPERSCRIPTS_AND_SUBSCRIPTS"),
  274.             CURRENCY_SYMBOLS
  275.                 = new UnicodeBlock("CURRENCY_SYMBOLS"),
  276.             COMBINING_MARKS_FOR_SYMBOLS
  277.                 = new UnicodeBlock("COMBINING_MARKS_FOR_SYMBOLS"),
  278.             LETTERLIKE_SYMBOLS
  279.                 = new UnicodeBlock("LETTERLIKE_SYMBOLS"),
  280.             NUMBER_FORMS
  281.                 = new UnicodeBlock("NUMBER_FORMS"),
  282.             ARROWS
  283.                 = new UnicodeBlock("ARROWS"),
  284.             MATHEMATICAL_OPERATORS
  285.                 = new UnicodeBlock("MATHEMATICAL_OPERATORS"),
  286.             MISCELLANEOUS_TECHNICAL
  287.                 = new UnicodeBlock("MISCELLANEOUS_TECHNICAL"),
  288.             CONTROL_PICTURES
  289.                 = new UnicodeBlock("CONTROL_PICTURES"),
  290.             OPTICAL_CHARACTER_RECOGNITION
  291.                 = new UnicodeBlock("OPTICAL_CHARACTER_RECOGNITION"),
  292.             ENCLOSED_ALPHANUMERICS
  293.                 = new UnicodeBlock("ENCLOSED_ALPHANUMERICS"),
  294.             BOX_DRAWING
  295.                 = new UnicodeBlock("BOX_DRAWING"),
  296.             BLOCK_ELEMENTS
  297.                 = new UnicodeBlock("BLOCK_ELEMENTS"),
  298.             GEOMETRIC_SHAPES
  299.                 = new UnicodeBlock("GEOMETRIC_SHAPES"),
  300.             MISCELLANEOUS_SYMBOLS
  301.                 = new UnicodeBlock("MISCELLANEOUS_SYMBOLS"),
  302.             DINGBATS
  303.                 = new UnicodeBlock("DINGBATS"),
  304.             CJK_SYMBOLS_AND_PUNCTUATION
  305.                 = new UnicodeBlock("CJK_SYMBOLS_AND_PUNCTUATION"),
  306.             HIRAGANA
  307.                 = new UnicodeBlock("HIRAGANA"),
  308.             KATAKANA
  309.                 = new UnicodeBlock("KATAKANA"),
  310.             BOPOMOFO
  311.                 = new UnicodeBlock("BOPOMOFO"),
  312.             HANGUL_COMPATIBILITY_JAMO
  313.                 = new UnicodeBlock("HANGUL_COMPATIBILITY_JAMO"),
  314.             KANBUN
  315.                 = new UnicodeBlock("KANBUN"),
  316.             ENCLOSED_CJK_LETTERS_AND_MONTHS
  317.                 = new UnicodeBlock("ENCLOSED_CJK_LETTERS_AND_MONTHS"),
  318.             CJK_COMPATIBILITY
  319.                 = new UnicodeBlock("CJK_COMPATIBILITY"),
  320.             CJK_UNIFIED_IDEOGRAPHS
  321.                 = new UnicodeBlock("CJK_UNIFIED_IDEOGRAPHS"),
  322.             HANGUL_SYLLABLES
  323.                 = new UnicodeBlock("HANGUL_SYLLABLES"),
  324.             SURROGATES_AREA
  325.                 = new UnicodeBlock("SURROGATES_AREA"),
  326.             PRIVATE_USE_AREA
  327.                 = new UnicodeBlock("PRIVATE_USE_AREA"),
  328.             CJK_COMPATIBILITY_IDEOGRAPHS
  329.                 = new UnicodeBlock("CJK_COMPATIBILITY_IDEOGRAPHS"),
  330.             ALPHABETIC_PRESENTATION_FORMS
  331.                 = new UnicodeBlock("ALPHABETIC_PRESENTATION_FORMS"),
  332.             ARABIC_PRESENTATION_FORMS_A
  333.                 = new UnicodeBlock("ARABIC_PRESENTATION_FORMS_A"),
  334.             COMBINING_HALF_MARKS
  335.                 = new UnicodeBlock("COMBINING_HALF_MARKS"),
  336.             CJK_COMPATIBILITY_FORMS
  337.                 = new UnicodeBlock("CJK_COMPATIBILITY_FORMS"),
  338.             SMALL_FORM_VARIANTS
  339.                 = new UnicodeBlock("SMALL_FORM_VARIANTS"),
  340.             ARABIC_PRESENTATION_FORMS_B
  341.                 = new UnicodeBlock("ARABIC_PRESENTATION_FORMS_B"),
  342.             HALFWIDTH_AND_FULLWIDTH_FORMS
  343.                 = new UnicodeBlock("HALFWIDTH_AND_FULLWIDTH_FORMS"),
  344.             SPECIALS
  345.                 = new UnicodeBlock("SPECIALS");
  346.  
  347.     private static final char blockStarts[] = {
  348.         '\u0000',
  349.         '\u0080',
  350.         '\u0100',
  351.         '\u0180',
  352.         '\u0250',
  353.         '\u02B0',
  354.         '\u0300',
  355.         '\u0370',
  356.         '\u0400',
  357.         '\u0500', // unassigned
  358.         '\u0530',
  359.         '\u0590',
  360.         '\u0600',
  361.         '\u0700', // unassigned
  362.         '\u0900',
  363.         '\u0980',
  364.         '\u0A00',
  365.         '\u0A80',
  366.         '\u0B00',
  367.         '\u0B80',
  368.         '\u0C00',
  369.         '\u0C80',
  370.         '\u0D00',
  371.         '\u0D80', // unassigned
  372.         '\u0E00',
  373.         '\u0E80',
  374.         '\u0F00',
  375.         '\u0FC0', // unassigned
  376.         '\u10A0',
  377.         '\u1100',
  378.         '\u1200', // unassigned
  379.         '\u1E00',
  380.         '\u1F00',
  381.         '\u2000',
  382.         '\u2070',
  383.         '\u20A0',
  384.         '\u20D0',
  385.         '\u2100',
  386.         '\u2150',
  387.         '\u2190',
  388.         '\u2200',
  389.         '\u2300',
  390.         '\u2400',
  391.         '\u2440',
  392.         '\u2460',
  393.         '\u2500',
  394.         '\u2580',
  395.         '\u25A0',
  396.         '\u2600',
  397.         '\u2700',
  398.         '\u27C0', // unassigned
  399.         '\u3000',
  400.         '\u3040',
  401.         '\u30A0',
  402.         '\u3100',
  403.         '\u3130',
  404.         '\u3190',
  405.         '\u3200',
  406.         '\u3300',
  407.         '\u3400', // unassigned
  408.         '\u4E00',
  409.         '\uA000', // unassigned
  410.         '\uAC00',
  411.         '\uD7A4', // unassigned
  412.         '\uD800',
  413.         '\uE000',
  414.         '\uF900',
  415.         '\uFB00',
  416.         '\uFB50',
  417.         '\uFE00', // unassigned
  418.         '\uFE20',
  419.         '\uFE30',
  420.         '\uFE50',
  421.         '\uFE70',
  422.         '\uFEFF', // special
  423.         '\uFF00',
  424.         '\uFFF0'
  425.     };
  426.  
  427.     private static final UnicodeBlock blocks[] = {
  428.         BASIC_LATIN,
  429.         LATIN_1_SUPPLEMENT,
  430.         LATIN_EXTENDED_A,
  431.         LATIN_EXTENDED_B,
  432.         IPA_EXTENSIONS,
  433.         SPACING_MODIFIER_LETTERS,
  434.         COMBINING_DIACRITICAL_MARKS,
  435.         GREEK,
  436.         CYRILLIC,
  437.         null,
  438.         ARMENIAN,
  439.         HEBREW,
  440.         ARABIC,
  441.         null,
  442.         DEVANAGARI,
  443.         BENGALI,
  444.         GURMUKHI,
  445.         GUJARATI,
  446.         ORIYA,
  447.         TAMIL,
  448.         TELUGU,
  449.         KANNADA,
  450.         MALAYALAM,
  451.         null,
  452.         THAI,
  453.         LAO,
  454.         TIBETAN,
  455.         null,
  456.         GEORGIAN,
  457.         HANGUL_JAMO,
  458.         null,
  459.         LATIN_EXTENDED_ADDITIONAL,
  460.         GREEK_EXTENDED,
  461.         GENERAL_PUNCTUATION,
  462.         SUPERSCRIPTS_AND_SUBSCRIPTS,
  463.         CURRENCY_SYMBOLS,
  464.         COMBINING_MARKS_FOR_SYMBOLS,
  465.         LETTERLIKE_SYMBOLS,
  466.         NUMBER_FORMS,
  467.         ARROWS,
  468.         MATHEMATICAL_OPERATORS,
  469.         MISCELLANEOUS_TECHNICAL,
  470.         CONTROL_PICTURES,
  471.         OPTICAL_CHARACTER_RECOGNITION,
  472.         ENCLOSED_ALPHANUMERICS,
  473.         BOX_DRAWING,
  474.         BLOCK_ELEMENTS,
  475.         GEOMETRIC_SHAPES,
  476.         MISCELLANEOUS_SYMBOLS,
  477.         DINGBATS,
  478.         null,
  479.         CJK_SYMBOLS_AND_PUNCTUATION,
  480.         HIRAGANA,
  481.         KATAKANA,
  482.         BOPOMOFO,
  483.         HANGUL_COMPATIBILITY_JAMO,
  484.         KANBUN,
  485.         ENCLOSED_CJK_LETTERS_AND_MONTHS,
  486.         CJK_COMPATIBILITY,
  487.         null,
  488.         CJK_UNIFIED_IDEOGRAPHS,
  489.         null,
  490.         HANGUL_SYLLABLES,
  491.         null,
  492.         SURROGATES_AREA,
  493.         PRIVATE_USE_AREA,
  494.         CJK_COMPATIBILITY_IDEOGRAPHS,
  495.         ALPHABETIC_PRESENTATION_FORMS,
  496.         ARABIC_PRESENTATION_FORMS_A,
  497.         null,
  498.         COMBINING_HALF_MARKS,
  499.         CJK_COMPATIBILITY_FORMS,
  500.         SMALL_FORM_VARIANTS,
  501.         ARABIC_PRESENTATION_FORMS_B,
  502.         SPECIALS,
  503.         HALFWIDTH_AND_FULLWIDTH_FORMS,
  504.         SPECIALS
  505.     };
  506.  
  507.     /**
  508.          * Returns the object representing the Unicode block containing the
  509.          * given character, or <code>null</code> if the character is not a
  510.          * member of a defined block.
  511.          *
  512.          * @param   c  The character in question
  513.          * @return  The <code>UnicodeBlock</code> instance representing the
  514.          *          Unicode block of which this character is a member, or
  515.          *          <code>null</code> if the character is not a member of any
  516.          *          Unicode block
  517.          */
  518.     public static UnicodeBlock of(char c) {
  519.         int top, bottom, current;
  520.         bottom = 0;
  521.         top = blockStarts.length;
  522.         current = top/2;
  523.         // invariant: top > current >= bottom && ch >= unicodeBlockStarts[bottom]
  524.         while (top - bottom > 1) {
  525.         if (c >= blockStarts[current]) {
  526.             bottom = current;
  527.         } else {
  528.             top = current;
  529.         }
  530.         current = (top + bottom) / 2;
  531.         }
  532.         return blocks[current];
  533.     }
  534.  
  535.     }
  536.  
  537.     /**
  538.      * The value of the Character.
  539.      *
  540.      * @serial
  541.      */
  542.     private char value;
  543.  
  544.     /** use serialVersionUID from JDK 1.0.2 for interoperability */
  545.     private static final long serialVersionUID = 3786198910865385080L;
  546.  
  547.     /**
  548.      * Constructs a <code>Character</code> object and initializes it so 
  549.      * that it represents the primitive <code>value</code> argument. 
  550.      *
  551.      * @param  value   value for the new <code>Character</code> object.
  552.      */
  553.     public Character(char value) {
  554.     this.value = value;
  555.     }
  556.  
  557.     /**
  558.      * Returns the value of this Character object.
  559.      * @return  the primitive <code>char</code> value represented by
  560.      *          this object.
  561.      */
  562.     public char charValue() {
  563.     return value;
  564.     }
  565.  
  566.     /**
  567.      * Returns a hash code for this Character.
  568.      * @return  a hash code value for this object. 
  569.      */
  570.     public int hashCode() {
  571.     return (int)value;
  572.     }
  573.  
  574.     /**
  575.      * Compares this object against the specified object.
  576.      * The result is <code>true</code> if and only if the argument is not 
  577.      * <code>null</code> and is a <code>Character</code> object that 
  578.      * represents the same <code>char</code> value as this object. 
  579.      *
  580.      * @param   obj   the object to compare with.
  581.      * @return  <code>true</code> if the objects are the same;
  582.      *          <code>false</code> otherwise.
  583.      */
  584.     public boolean equals(Object obj) {
  585.     if ((obj != null) && (obj instanceof Character)) {
  586.         return value == ((Character)obj).charValue();
  587.     } 
  588.     return false;
  589.     }
  590.  
  591.     /**
  592.      * Returns a String object representing this character's value.
  593.      * Converts this <code>Character</code> object to a string. The 
  594.      * result is a string whose length is <code>1</code>. The string's 
  595.      * sole component is the primitive <code>char</code> value represented 
  596.      * by this object. 
  597.      *
  598.      * @return  a string representation of this object.
  599.      */
  600.     public String toString() {
  601.     char buf[] = {value};
  602.     return String.valueOf(buf);
  603.     }
  604.  
  605.    /**
  606.      * Determines if the specified character is a lowercase character. 
  607.      * A character is lowercase if it is not in the range 
  608.      * <code>'\u2000'</code> through <code>'\u2FFF'</code>, the Unicode 
  609.      * attribute table does not specify a mapping to lowercase for the 
  610.      * character, and at least one of the following is true: 
  611.      * <ul>
  612.      * <li>The attribute table specifies a mapping to uppercase for the 
  613.      *     character. 
  614.      * <li>The name for the character contains the words "<code>SMALL 
  615.      *     LETTER</code>". 
  616.      * <li>The name for the character contains the words "<code>SMALL 
  617.      *     LIGATURE</code>". 
  618.      * </ul>
  619.      * <p> A character is considered to be lowercase if and only if
  620.      * it is specified to be lowercase by the Unicode 2.0 standard
  621.      * (category "Ll" in the Unicode specification data file).
  622.      * <p>
  623.      * Of the ISO-LATIN-1 characters (character codes 0x0000 through 0x00FF),
  624.      * the following are lowercase:
  625.      * <p><blockquote><pre>
  626.      * a b c d e f g h i j k l m n o p q r s t u v w x y z
  627.      * \u00DF \u00E0 \u00E1 \u00E2 \u00E3 \u00E4 \u00E5 \u00E6 \u00E7
  628.      * \u00E8 \u00E9 \u00EA \u00EB \u00EC \u00ED \u00EE \u00EF \u00F0
  629.      * \u00F1 \u00F2 \u00F3 \u00F4 \u00F5 \u00F6 \u00F8 \u00F9 \u00FA
  630.      * \u00FB \u00FC \u00FD \u00FE \u00FF
  631.      * </pre></blockquote>
  632.      * <p> Many other Unicode characters are lowercase, too.
  633.      *
  634.      * @param   ch   the character to be tested.
  635.      * @return  <code>true</code> if the character is lowercase;
  636.      *          <code>false</code> otherwise.
  637.      * @see     java.lang.Character#isLowerCase(char)
  638.      * @see     java.lang.Character#isTitleCase(char)
  639.      * @see     java.lang.Character#toLowerCase(char)
  640.      */
  641.     public static boolean isLowerCase(char ch) {
  642.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) == LOWERCASE_LETTER;
  643.     }
  644.  
  645.    /**
  646.      * Determines if the specified character is an uppercase character. 
  647.      * A character is uppercase if it is not in the range 
  648.      * <code>'\u2000'</code> through <code>'\u2FFF'</code>, the Unicode 
  649.      * attribute table does not specify a mapping to uppercase for the 
  650.      * character, and at least one of the following is true: 
  651.      * <ul>
  652.      * <li>The attribute table specifies a mapping to lowercase for the
  653.      *     character. 
  654.      * <li>The name for the character contains the words 
  655.      *     "<code>CAPITAL LETTER</code>".
  656.      * <li>The name for the character contains the words
  657.      *     "<code>CAPITAL LIGATURE</code>".
  658.      * </ul>
  659.      * <p>
  660.      * Of the ISO-LATIN-1 characters (character codes 0x0000 through 0x00FF),
  661.      * the following are uppercase:
  662.      * <p><blockquote><pre>
  663.      * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  664.      * \u00C0 \u00C1 \u00C2 \u00C3 \u00C4 \u00C5 \u00C6 \u00C7
  665.      * \u00C8 \u00C9 \u00CA \u00CB \u00CC \u00CD \u00CE \u00CF \u00D0
  666.      * \u00D1 \u00D2 \u00D3 \u00D4 \u00D5 \u00D6 \u00D8 \u00D9 \u00DA
  667.      * \u00DB \u00DC \u00DD \u00DE
  668.      * </pre></blockquote>
  669.      * <p> Many other Unicode characters are uppercase, too.
  670.      *
  671.      * @param   ch   the character to be tested.
  672.      * @return  <code>true</code> if the character is uppercase;
  673.      *          <code>false</code> otherwise.
  674.      * @see     java.lang.Character#isLowerCase(char)
  675.      * @see     java.lang.Character#isTitleCase(char)
  676.      * @see     java.lang.Character#toUpperCase(char)
  677.      * @since   1.0
  678.      */
  679.     public static boolean isUpperCase(char ch) {
  680.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) == UPPERCASE_LETTER;
  681.     }
  682.  
  683.     /**
  684.      * Determines if the specified character is a titlecase character.
  685.      * A character is considered to be titlecase if and only if
  686.      * it is specified to be titlecase by the Unicode 2.0 standard
  687.      * (category "Lt" in the Unicode specification data file).
  688.      * <p>
  689.      * The printed representations of four Unicode characters look like 
  690.      * pairs of Latin letters. For example, there is an uppercase letter 
  691.      * that looks like "LJ" and has a corresponding lowercase letter that 
  692.      * looks like "lj". A third form, which looks like "Lj", 
  693.      * is the appropriate form to use when rendering a word in lowercase 
  694.      * with initial capitals, as for a book title.
  695.      * <p>
  696.      * These are the Unicode characters for which this method returns 
  697.      * <code>true</code>: 
  698.      * <ul>
  699.      * <li><code>LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON</code> 
  700.      * <li><code>LATIN CAPITAL LETTER L WITH SMALL LETTER J</code> 
  701.      * <li><code>LATIN CAPITAL LETTER N WITH SMALL LETTER J</code> 
  702.      * <li><code>LATIN CAPITAL LETTER D WITH SMALL LETTER Z</code> 
  703.      * </ul>
  704.      *
  705.      * @param   ch   the character to be tested.
  706.      * @return  <code>true</code> if the character is titlecase;
  707.      *          <code>false</code> otherwise.
  708.      * @see     java.lang.Character#isLowerCase(char)
  709.      * @see     java.lang.Character#isUpperCase(char)
  710.      * @see     java.lang.Character#toTitleCase(char)
  711.      * @since   JDK1.0.2
  712.      */
  713.     public static boolean isTitleCase(char ch) {
  714.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) == TITLECASE_LETTER;
  715.     }
  716.  
  717.     /**
  718.      * Determines if the specified character is a digit.
  719.      * A character is considered to be a digit if it is not in the range 
  720.      * <code>'\u2000' <= ch <= '\u2FFF'</code>
  721.      * and its Unicode name contains the word 
  722.      * "<code>DIGIT</code>". For a more complete 
  723.      * specification that encompasses all Unicode characters that are 
  724.      * defined as digits, see Gosling, Joy, and Steele, <i>The Java 
  725.      * Language Specification</i>.
  726.      * <p>
  727.      * These are the ranges of Unicode characters that are considered digits:
  728.      * <table>
  729.      * <tr><td>0x0030 through 0x0039</td>
  730.      *                        <td>ISO-LATIN-1 digits ('0' through '9')</td></tr>
  731.      * <tr><td>0x0660 through 0x0669</td>  <td>Arabic-Indic digits</td></tr>
  732.      * <tr><td>0x06F0 through 0x06F9</td>
  733.      *                                <td>Extended Arabic-Indic digits</td></tr>
  734.      * <tr><td>0x0966 through 0x096F</td>  <td>Devanagari digits</td></tr>
  735.      * <tr><td>0x09E6 through 0x09EF</td>  <td>Bengali digits</td></tr>
  736.      * <tr><td>0x0A66 through 0x0A6F</td>  <td>Gurmukhi digits</td></tr>
  737.      * <tr><td>0x0AE6 through 0x0AEF</td>  <td>Gujarati digits</td></tr>
  738.      * <tr><td>0x0B66 through 0x0B6F</td>  <td>Oriya digits</td></tr>
  739.      * <tr><td>0x0BE7 through 0x0BEF</td>  <td>Tamil digits</td></tr>
  740.      * <tr><td>0x0C66 through 0x0C6F</td>  <td>Telugu digits</td></tr>
  741.      * <tr><td>0x0CE6 through 0x0CEF</td>  <td>Kannada digits</td></tr>
  742.      * <tr><td>0x0D66 through 0x0D6F</td>  <td>Malayalam digits</td></tr>
  743.      * <tr><td>0x0E50 through 0x0E59</td>  <td>Thai digits</td></tr>
  744.      * <tr><td>0x0ED0 through 0x0ED9</td>  <td>Lao digits</td></tr>
  745.      * <tr><td>0x0F20 through 0x0F29</td>  <td>Tibetan digits</td></tr>
  746.      * <tr><td>0xFF10 through 0xFF19</td>  <td>Fullwidth digits</td></tr>
  747.      * </table>
  748.      *
  749.      * @param   ch   the character to be tested.
  750.      * @return  <code>true</code> if the character is a digit;
  751.      *          <code>false</code> otherwise.
  752.      * @see     java.lang.Character#digit(char, int)
  753.      * @see     java.lang.Character#forDigit(int, int)
  754.      */
  755.     public static boolean isDigit(char ch) {
  756.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) == DECIMAL_DIGIT_NUMBER;
  757.     }
  758.  
  759.     /**
  760.      * Determines if a character has a defined meaning in Unicode.
  761.      * A character is defined if at least one of the following is true: 
  762.      * <ul>
  763.      * <li>It has an entry in the Unicode attribute table. 
  764.      * <li>Its value is in the range 
  765.      *     <code>
  766.      *     '\u3040' <= ch <= '\u9FA5'</code>. 
  767.      * <li>Its value is in the range 
  768.      *     <code>
  769.      *     '\uF900' <= ch <= '\uFA2D'</code>. 
  770.      * </ul>
  771.      * 
  772.      * @param   ch   the character to be tested
  773.      * @return  <code>true</code> if the character has a defined meaning
  774.      *          in Unicode; <code>false</code> otherwise.
  775.      * @see     java.lang.Character#isDigit(char)
  776.      * @see     java.lang.Character#isLetter(char)
  777.      * @see     java.lang.Character#isLetterOrDigit(char)
  778.      * @see     java.lang.Character#isLowerCase(char)
  779.      * @see     java.lang.Character#isTitleCase(char)
  780.      * @see     java.lang.Character#isUpperCase(char)
  781.      * @since   JDK1.0.2
  782.      */
  783.     public static boolean isDefined(char ch) {
  784.         return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F) != UNASSIGNED;
  785.     }
  786.  
  787.     /**
  788.      * Determines if the specified character is a letter. For a 
  789.      * more complete specification that encompasses all Unicode 
  790.      * characters, see Gosling, Joy, and Steele, <i>The Java Language 
  791.      * Specification</i>. 
  792.      *
  793.      * <p> A character is considered to be a letter if and only if
  794.      * it is specified to be a letter by the Unicode 2.0 standard
  795.      * (category "Lu", "Ll", "Lt", "Lm", or "Lo" in the Unicode
  796.      * specification data file).
  797.      *
  798.      * <p> Note that most ideographic characters are considered
  799.      * to be letters (category "Lo") for this purpose.
  800.      *
  801.      * <p> Note also that not all letters have case: many Unicode characters are
  802.      * letters but are neither uppercase nor lowercase nor titlecase.
  803.      * 
  804.      * @param   ch   the character to be tested.
  805.      * @return  <code>true</code> if the character is a letter;
  806.      *          <code>false</code> otherwise.
  807.      * @see     java.lang.Character#isDigit(char)
  808.      * @see     java.lang.Character#isJavaIdentifierStart(char)
  809.      * @see     java.lang.Character#isJavaLetter(char)
  810.      * @see     java.lang.Character#isJavaLetterOrDigit(char)
  811.      * @see     java.lang.Character#isLetterOrDigit(char)
  812.      * @see     java.lang.Character#isLowerCase(char)
  813.      * @see     java.lang.Character#isTitleCase(char)
  814.      * @see     java.lang.Character#isUnicodeIdentifierStart(char)
  815.      * @see     java.lang.Character#isUpperCase(char)
  816.      */
  817.     public static boolean isLetter(char ch) {
  818.         return (((((1 << UPPERCASE_LETTER) |
  819.                    (1 << LOWERCASE_LETTER) |
  820.                    (1 << TITLECASE_LETTER) |
  821.                    (1 << MODIFIER_LETTER) |
  822.                    (1 << OTHER_LETTER))
  823.                   >> (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F)) & 1) != 0);
  824.     }
  825.  
  826.     /**
  827.      * Determines if the specified character is a letter or digit. 
  828.      * For a more complete specification that encompasses all Unicode 
  829.      * characters, see Gosling, Joy, and Steele, <i>The Java Language 
  830.      * Specification</i>. 
  831.      *
  832.      * <p> A character is considered to be a letter if and only if
  833.      * it is specified to be a letter or a digit by the Unicode 2.0 standard
  834.      * (category "Lu", "Ll", "Lt", "Lm", "Lo", or "Nd" in the Unicode
  835.      * specification data file).  In other words, isLetterOrDigit is true
  836.      * of a character if and only if either isLetter is true of the character
  837.      * or isDigit is true of the character.
  838.      * 
  839.      * @param   ch   the character to be tested.
  840.      * @return  <code>true</code> if the character is a letter or digit;
  841.      *          <code>false</code> otherwise.
  842.      * @see     java.lang.Character#isDigit(char)
  843.      * @see     java.lang.Character#isJavaIdentifierPart(char)
  844.      * @see     java.lang.Character#isJavaLetter(char)
  845.      * @see     java.lang.Character#isJavaLetterOrDigit(char)
  846.      * @see     java.lang.Character#isLetter(char)
  847.      * @see     java.lang.Character#isUnicodeIdentifierPart(char)
  848.      * @since   JDK1.0.2
  849.      */
  850.     public static boolean isLetterOrDigit(char ch) {
  851.         return (((((1 << UPPERCASE_LETTER) |
  852.                    (1 << LOWERCASE_LETTER) |
  853.                    (1 << TITLECASE_LETTER) |
  854.                    (1 << MODIFIER_LETTER) |
  855.                    (1 << OTHER_LETTER) |
  856.                    (1 << DECIMAL_DIGIT_NUMBER))
  857.                   >> (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F)) & 1) != 0);
  858.     }
  859.  
  860.     /**
  861.      * Determines if the specified character is a 
  862.      * "Java" letter, that is, the character is permissible 
  863.      * as the first character in an identifier in the Java language. 
  864.      * <p>
  865.      * A character is considered to be a Java letter if and only if it 
  866.      * is a letter, the ASCII dollar sign character <code>'$'</code>, or 
  867.      * the underscore character <code>'_'</code>. 
  868.      *
  869.      * @param      ch   the character to be tested.
  870.      * @return     <code>true</code> if the character is a Java letter;
  871.      *             <code>false</code> otherwise.
  872.      * @see        java.lang.Character#isJavaIdentifierStart(char)
  873.      * @see        java.lang.Character#isJavaLetterOrDigit(char)
  874.      * @see        java.lang.Character#isLetter(char)
  875.      * @see        java.lang.Character#isLetterOrDigit(char)
  876.      * @see        java.lang.Character#isUnicodeIdentifierStart(char)
  877.      * @since      JDK1.0.2
  878.      * @deprecated Replaced by isJavaIdentifierStart(char).
  879.      */
  880.     public static boolean isJavaLetter(char ch) {
  881.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) >= 0x00050000;
  882.     }
  883.  
  884.     /**
  885.      * Determines if the specified character is a 
  886.      * "Java" letter or digit, that is, the character is 
  887.      * permissible as a non-initial character in an identifier in the 
  888.      * Java language. 
  889.      * <p>
  890.      * A character is considered to be a Java letter or digit if and 
  891.      * only if it is a letter, a digit, the ASCII dollar sign character 
  892.      * <code>'$'</code>, or the underscore character <code>'_'</code>. 
  893.      *
  894.      * @param      ch   the character to be tested.
  895.      * @return     <code>true</code> if the character is a Java letter or digit;
  896.      *             <code>false</code> otherwise.
  897.      * @see        java.lang.Character#isJavaIdentifierPart(char)
  898.      * @see        java.lang.Character#isJavaLetter(char)
  899.      * @see        java.lang.Character#isLetter(char)
  900.      * @see        java.lang.Character#isLetterOrDigit(char)
  901.      * @see        java.lang.Character#isUnicodeIdentifierPart(char)
  902.      * @since      JDK1.0.2
  903.      * @deprecated Replaced by isJavaIdentifierPart(char).
  904.      */
  905.     public static boolean isJavaLetterOrDigit(char ch) {
  906.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00030000) != 0;
  907.     }
  908.  
  909.     /**
  910.      * Determines if the specified character is
  911.      * permissible as the first character in a Java identifier.
  912.      * A character may start a Java identifier if and only if
  913.      * it is one of the following:
  914.      * <ul>
  915.      * <li>  a letter
  916.      * <li>  a currency symbol (such as "$")
  917.      * <li>  a connecting punctuation character (such as "_").
  918.      * </ul>
  919.      *
  920.      * @param   ch    the character to be tested.
  921.      * @return  true if the character may start a Java identifier;
  922.      *          false otherwise.
  923.      * @see     java.lang.Character#isJavaIdentifierPart(char)
  924.      * @see     java.lang.Character#isLetter(char)
  925.      * @see     java.lang.Character#isUnicodeIdentifierStart(char)
  926.      * @since   JDK1.1
  927.      */
  928.     public static boolean isJavaIdentifierStart(char ch) {
  929.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) >= 0x00050000;
  930.     }
  931.  
  932.     /**
  933.      * Determines if the specified character may be part of a Java
  934.      * identifier as other than the first character.
  935.      * A character may be part of a Java identifier if and only if
  936.      * it is one of the following:
  937.      * <ul>
  938.      * <li>  a letter
  939.      * <li>  a currency symbol (such as "$")
  940.      * <li>  a connecting punctuation character (such as "_").
  941.      * <li>  a digit
  942.      * <li>  a numeric letter (such as a Roman numeral character)
  943.      * <li>  a combining mark
  944.      * <li>  a non-spacing mark
  945.      * <li>  an ignorable control character
  946.      * </ul>
  947.      * 
  948.      * @param   ch    the character to be tested.
  949.      * @return  true if the character may be part of a Unicode identifier; 
  950.      *          false otherwise.
  951.      * @see     java.lang.Character#isIdentifierIgnorable(char)
  952.      * @see     java.lang.Character#isJavaIdentifierStart(char)
  953.      * @see     java.lang.Character#isLetterOrDigit(char)
  954.      * @see     java.lang.Character#isUnicodeIdentifierPart(char)
  955.      * @since   JDK1.1
  956.      */
  957.     public static boolean isJavaIdentifierPart(char ch) {
  958.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00030000) != 0;
  959.     }
  960.  
  961.     /**
  962.      * Determines if the specified character is
  963.      * permissible as the first character in a Unicode identifier.
  964.      * A character may start a Unicode identifier if and only if
  965.      * it is a letter.
  966.      *
  967.      * @param   ch    the character to be tested.
  968.      * @return  true if the character may start a Unicode identifier;
  969.      *          false otherwise.
  970.      * @see     java.lang.Character#isJavaIdentifierStart(char)
  971.      * @see     java.lang.Character#isLetter(char)
  972.      * @see     java.lang.Character#isUnicodeIdentifierPart(char)
  973.      * @since   JDK1.1
  974.      */
  975.     public static boolean isUnicodeIdentifierStart(char ch) {
  976.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) == 0x00070000;
  977.     }
  978.  
  979.     /**
  980.      * Determines if the specified character may be part of a Unicode
  981.      * identifier as other than the first character.
  982.      * A character may be part of a Unicode identifier if and only if
  983.      * it is one of the following:
  984.      * <ul>
  985.      * <li>  a letter
  986.      * <li>  a connecting punctuation character (such as "_").
  987.      * <li>  a digit
  988.      * <li>  a numeric letter (such as a Roman numeral character)
  989.      * <li>  a combining mark
  990.      * <li>  a non-spacing mark
  991.      * <li>  an ignorable control character
  992.      * </ul>
  993.      * 
  994.      * @param   ch    the character to be tested.
  995.      * @return  true if the character may be part of a Unicode identifier;
  996.      *          false otherwise.
  997.      * @see     java.lang.Character#isIdentifierIgnorable(char)
  998.      * @see     java.lang.Character#isJavaIdentifierPart(char)
  999.      * @see     java.lang.Character#isLetterOrDigit(char)
  1000.      * @see     java.lang.Character#isUnicodeIdentifierStart(char)
  1001.      * @since   JDK1.1
  1002.      */
  1003.     public static boolean isUnicodeIdentifierPart(char ch) {
  1004.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00010000) != 0;
  1005.     }
  1006.  
  1007.     /**
  1008.      * Determines if the specified character should be regarded as
  1009.      * an ignorable character in a Java identifier or a Unicode identifier.
  1010.      * The following Unicode characters are ignorable in a Java identifier
  1011.      * or a Unicode identifier:
  1012.      * <table>
  1013.      * <tr><td>0x0000 through 0x0008,</td>
  1014.      *                                 <td>ISO control characters that</td></tr>
  1015.      * <tr><td>0x000E through 0x001B,</td> <td>are not whitespace</td></tr>
  1016.      * <tr><td>and 0x007F through 0x009F</td></tr>
  1017.      * <tr><td>0x200C through 0x200F</td>  <td>join controls</td></tr>
  1018.      * <tr><td>0x200A through 0x200E</td>  <td>bidirectional controls</td></tr>
  1019.      * <tr><td>0x206A through 0x206F</td>  <td>format controls</td></tr>
  1020.      * <tr><td>0xFEFF</td>               <td>zero-width no-break space</td></tr>
  1021.      * </table>
  1022.      * 
  1023.      * @param   ch    the character to be tested.
  1024.      * @return     true if the character may be part of a Unicode identifier;
  1025.      *          false otherwise.
  1026.      * @see     java.lang.Character#isJavaIdentifierPart(char)
  1027.      * @see     java.lang.Character#isUnicodeIdentifierPart(char)
  1028.      * @since   JDK1.1
  1029.      */
  1030.     public static boolean isIdentifierIgnorable(char ch) {
  1031.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) == 0x00010000;
  1032.     }
  1033.  
  1034.     /**
  1035.      * The given character is mapped to its lowercase equivalent; if the 
  1036.      * character has no lowercase equivalent, the character itself is 
  1037.      * returned. 
  1038.      * <p>
  1039.      * A character has a lowercase equivalent if and only if a lowercase 
  1040.      * mapping is specified for the character in the Unicode attribute 
  1041.      * table. 
  1042.      * <p>
  1043.      * Note that some Unicode characters in the range 
  1044.      * <code>'\u2000'</code> to <code>'\u2FFF'</code> have lowercase 
  1045.      * mappings; this method does map such characters to their lowercase 
  1046.      * equivalents even though the method <code>isUpperCase</code> does 
  1047.      * not return <code>true</code> for such characters. 
  1048.      *
  1049.      * @param   ch   the character to be converted.
  1050.      * @return  the lowercase equivalent of the character, if any;
  1051.      *          otherwise the character itself.
  1052.      * @see     java.lang.Character#isLowerCase(char)
  1053.      * @see     java.lang.Character#isUpperCase(char)
  1054.      * @see     java.lang.Character#toTitleCase(char)
  1055.      * @see     java.lang.Character#toUpperCase(char)
  1056.      */
  1057.     public static char toLowerCase(char ch) {
  1058.         int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  1059.         if ((val & 0x00200000) != 0)
  1060.           return (char)(ch + (val >> 22));
  1061.         else
  1062.           return ch;
  1063.     }
  1064.  
  1065.     /**
  1066.      * Converts the character argument to uppercase. A character has an 
  1067.      * uppercase equivalent if and only if an uppercase mapping is 
  1068.      * specified for the character in the Unicode attribute table. 
  1069.      * <p>
  1070.      * Note that some Unicode characters in the range 
  1071.      * <code>'\u2000'</code> to <code>'\u2000FFF'</code> have uppercase 
  1072.      * mappings; this method does map such characters to their titlecase 
  1073.      * equivalents even though the method <code>isLowerCase</code> does 
  1074.      * not return <code>true</code> for such characters. 
  1075.      *
  1076.      * @param   ch   the character to be converted.
  1077.      * @return  the uppercase equivalent of the character, if any;
  1078.      *          otherwise the character itself.
  1079.      * @see     java.lang.Character#isLowerCase(char)
  1080.      * @see     java.lang.Character#isUpperCase(char)
  1081.      * @see     java.lang.Character#toLowerCase(char)
  1082.      * @see     java.lang.Character#toTitleCase(char)
  1083.      */
  1084.     public static char toUpperCase(char ch) {
  1085.         int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  1086.         if ((val & 0x00100000) != 0)
  1087.           return (char)(ch - (val >> 22));
  1088.         else
  1089.           return ch;
  1090.     }
  1091.  
  1092.     /**
  1093.      * Converts the character argument to titlecase. A character has a 
  1094.      * titlecase equivalent if and only if a titlecase mapping is 
  1095.      * specified for the character in the Unicode attribute table. 
  1096.      * <p>
  1097.      * Note that some Unicode characters in the range 
  1098.      * <code>'\u2000'</code> through <code>'\u2FFF'</code> have titlecase 
  1099.      * mappings; this method does map such characters to their titlecase 
  1100.      * equivalents even though the method <code>isTitleCase</code> does 
  1101.      * not return <code>true</code> for such characters.
  1102.      * <p>
  1103.      * There are only four Unicode characters that are truly titlecase forms
  1104.      * that are distinct from uppercase forms.  As a rule, if a character has no
  1105.      * true titlecase equivalent but does have an uppercase mapping, then the
  1106.      * Unicode 2.0 attribute table specifies a titlecase mapping that is the
  1107.      * same as the uppercase mapping.
  1108.      *
  1109.      * @param   ch   the character to be converted.
  1110.      * @return  the titlecase equivalent of the character, if any;
  1111.      *          otherwise the character itself.
  1112.      * @see     java.lang.Character#isTitleCase(char)
  1113.      * @see     java.lang.Character#toLowerCase(char)
  1114.      * @see     java.lang.Character#toUpperCase(char)
  1115.      * @since   JDK1.0.2
  1116.      */
  1117.     public static char toTitleCase(char ch) {
  1118.         int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  1119.         if ((val & 0x00080000) != 0) {
  1120.           // There is a titlecase equivalent.  Perform further checks:
  1121.           if ((val & 0x00100000) == 0) {
  1122.             // The character does not have an uppercase equivalent, so it must
  1123.             // already be uppercase; so add 1 to get the titlecase form.
  1124.             return (char)(ch + 1);
  1125.           }
  1126.           else if ((val & 0x00200000) == 0) {
  1127.             // The character does not have a lowercase equivalent, so it must
  1128.             // already be lowercase; so subtract 1 to get the titlecase form.
  1129.             return (char)(ch - 1);
  1130.           }
  1131.           else {
  1132.             // The character has both an uppercase equivalent and a lowercase
  1133.             // equivalent, so it must itself be a titlecase form; return it.
  1134.             return ch;
  1135.           }
  1136.         }
  1137.         else if ((val & 0x00100000) != 0) {
  1138.           // This character has no titlecase equivalent but it does have an
  1139.           // uppercase equivalent, so use that (subtract the signed case offset).
  1140.           return (char)(ch - (val >> 22));
  1141.         }
  1142.         else
  1143.           return ch;
  1144.     }
  1145.  
  1146.     /**
  1147.      * Returns the numeric value of the character <code>ch</code> in the 
  1148.      * specified radix. 
  1149.      * <p>
  1150.      * If the radix is not in the range <code>MIN_RADIX</code> <= 
  1151.      * <code>radix</code> <= <code>MAX_RADIX</code> or if the 
  1152.      * value of <code>ch</code> is not a valid digit in the specified 
  1153.      * radix, <code>-1</code> is returned. A character is a valid digit 
  1154.      * if at least one of the following is true:
  1155.      * <ul>
  1156.      * <li>The method <code>isDigit</code> is true of the character 
  1157.      *     and the Unicode decimal digit value of the character (or its 
  1158.      *     single-character decomposition) is less than the specified radix. 
  1159.      *     In this case the decimal digit value is returned. 
  1160.      * <li>The character is one of the uppercase Latin letters 
  1161.      *     <code>'A'</code> through <code>'Z'</code> and its code is less than
  1162.      *     <code>radix + 'A' - 10</code>. 
  1163.      *     In this case, <code>ch - 'A' + 10</code> 
  1164.      *     is returned. 
  1165.      * <li>The character is one of the lowercase Latin letters 
  1166.      *     <code>'a'</code> through <code>'z'</code> and its code is less than
  1167.      *     <code>radix + 'a' - 10</code>. 
  1168.      *     In this case, <code>ch - 'a' + 10</code> 
  1169.      *     is returned. 
  1170.      * </ul>
  1171.      *
  1172.      * @param   ch      the character to be converted.
  1173.      * @param   radix   the radix.
  1174.      * @return  the numeric value represented by the character in the
  1175.      *          specified radix.
  1176.      * @see     java.lang.Character#forDigit(int, int)
  1177.      * @see     java.lang.Character#isDigit(char)
  1178.      */
  1179.     public static int digit(char ch, int radix) {
  1180.         int value = -1;
  1181.         if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) {
  1182.           int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  1183.           int kind = val & 0x1F;
  1184.           if (kind == DECIMAL_DIGIT_NUMBER) {
  1185.             value = ((ch + (val >> 9)) & 0x1F);
  1186.           }
  1187.           else if ((val & 0x0000C000) == 0x0000C000) {
  1188.             // Java supradecimal digit
  1189.             value = ((ch + (val >> 9)) & 0x1F) + 10;
  1190.           }
  1191.         }
  1192.         return (value < radix) ? value : -1;
  1193.     }
  1194.  
  1195.     /**
  1196.      * Returns the Unicode numeric value of the character as a
  1197.      * nonnegative integer.
  1198.      * If the character does not have a numeric value, then -1 is returned.
  1199.      * If the character has a numeric value that cannot be represented as a
  1200.      * nonnegative integer (for example, a fractional value), then -2
  1201.      * is returned.
  1202.      *
  1203.      * @param   ch    the character to be converted.
  1204.      * @return  the numeric value of the character, as a nonnegative int value;
  1205.      *          -2 if the character has a numeric value that is not a
  1206.      *          nonnegative integer; -1 if the character has no numeric value.
  1207.      * @see     java.lang.Character#forDigit(int, int)
  1208.      * @see     java.lang.Character#isDigit(char)
  1209.      * @since   JDK1.1
  1210.      */
  1211.     public static int getNumericValue(char ch) {
  1212.         int val = A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)];
  1213.         switch ((val >> 14) & 0x3) {
  1214.         default: // cannot occur
  1215.         case (0x00000000 >> 14):         // not numeric
  1216.             return -1;
  1217.         case (0x00004000 >> 14):              // simple numeric
  1218.             return (ch + (val >> 9)) & 0x1F;
  1219.         case (0x00008000 >> 14)      :       // "strange" numeric
  1220.             switch (ch) {
  1221.             case '\u0BF1': return 100;          // TAMIL NUMBER ONE HUNDRED
  1222.             case '\u0BF2': return 1000;         // TAMIL NUMBER ONE THOUSAND
  1223.             case '\u216C': return 50;           // ROMAN NUMERAL FIFTY
  1224.             case '\u216D': return 100;          // ROMAN NUMERAL ONE HUNDRED
  1225.             case '\u216E': return 500;          // ROMAN NUMERAL FIVE HUNDRED
  1226.             case '\u216F': return 1000;         // ROMAN NUMERAL ONE THOUSAND
  1227.             case '\u217C': return 50;           // SMALL ROMAN NUMERAL FIFTY
  1228.             case '\u217D': return 100;          // SMALL ROMAN NUMERAL ONE HUNDRED
  1229.             case '\u217E': return 500;          // SMALL ROMAN NUMERAL FIVE HUNDRED
  1230.             case '\u217F': return 1000;         // SMALL ROMAN NUMERAL ONE THOUSAND
  1231.             case '\u2180': return 1000;         // ROMAN NUMERAL ONE THOUSAND C D
  1232.             case '\u2181': return 5000;         // ROMAN NUMERAL FIVE THOUSAND
  1233.             case '\u2182': return 10000;        // ROMAN NUMERAL TEN THOUSAND
  1234.             default:       return -2;
  1235.             }
  1236.         case (0x0000C000 >> 14):           // Java supradecimal
  1237.             return ((ch + (val >> 9)) & 0x1F) + 10;
  1238.         }
  1239.     }
  1240.  
  1241.     /**
  1242.      * Determines if the specified character is ISO-LATIN-1 white space. 
  1243.      * This method returns <code>true</code> for the following five 
  1244.      * characters only: 
  1245.      * <table>
  1246.      * <tr><td>'\t'</td>            <td>\u0009</td>
  1247.      *     <td><code>HORIZONTAL TABULATION</code></td></tr>
  1248.      * <tr><td>'\n'</td>            <td>\u000A</td>
  1249.      *     <td><code>NEW LINE</code></td></tr>
  1250.      * <tr><td>'\f'</td>            <td>\u000C</td>
  1251.      *     <td><code>FORM FEED</code></td></tr>
  1252.      * <tr><td>'\r'</td>            <td>\u000D</td>
  1253.      *     <td><code>CARRIAGE RETURN</code></td></tr>
  1254.      * <tr><td>'  '</td>  <td>\u0020</td>
  1255.      *     <td><code>SPACE</code></td></tr>
  1256.      * </table>
  1257.      *
  1258.      * @param      ch   the character to be tested.
  1259.      * @return     <code>true</code> if the character is ISO-LATIN-1 white
  1260.      *             space; <code>false</code> otherwise.
  1261.      * @see        java.lang.Character#isSpaceChar(char)
  1262.      * @see        java.lang.Character#isWhitespace(char)
  1263.      * @deprecated Replaced by isWhitespace(char).
  1264.      */
  1265.     public static boolean isSpace(char ch) {
  1266.       return (ch <= 0x0020) &&
  1267.          (((((1L << 0x0009) |
  1268.          (1L << 0x000A) |
  1269.          (1L << 0x000C) |
  1270.          (1L << 0x000D) |
  1271.          (1L << 0x0020)) >> ch) & 1L) != 0);
  1272.     }
  1273.  
  1274.     /**
  1275.      * Determines if the specified character is a Unicode space character.
  1276.      * A character is considered to be a space character if and only if
  1277.      * it is specified to be a space character by the Unicode 2.0 standard
  1278.      * (category "Zs", "Zl, or "Zp" in the Unicode specification data file).
  1279.      * 
  1280.      * @param   ch    the character to be tested.
  1281.      * @return     true if the character is a space character; false otherwise.
  1282.      * @see     java.lang.Character#isWhitespace(char)
  1283.      * @since   JDK1.1
  1284.      */
  1285.     public static boolean isSpaceChar(char ch) {
  1286.         return (((((1 << SPACE_SEPARATOR) |
  1287.                    (1 << LINE_SEPARATOR) |
  1288.                    (1 << PARAGRAPH_SEPARATOR))
  1289.                   >> (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F)) & 1) != 0);
  1290.     }
  1291.  
  1292.     /**
  1293.      * Determines if the specified character is white space according to Java.
  1294.      * A character is considered to be a Java whitespace character if and only
  1295.      * if it satisfies one of the following criteria:
  1296.      * <ul>
  1297.      * <li> It is a Unicode space separator (category "Zs"), but is not
  1298.      *      a no-break space (\u00A0 or \uFEFF).
  1299.      * <li> It is a Unicode line separator (category "Zl").
  1300.      * <li> It is a Unicode paragraph separator (category "Zp").
  1301.      * <li> It is \u0009, HORIZONTAL TABULATION.
  1302.      * <li> It is \u000A, LINE FEED.
  1303.      * <li> It is \u000B, VERTICAL TABULATION.
  1304.      * <li> It is \u000C, FORM FEED.
  1305.      * <li> It is \u000D, CARRIAGE RETURN.
  1306.      * <li> It is \u001C, FILE SEPARATOR.
  1307.      * <li> It is \u001D, GROUP SEPARATOR.
  1308.      * <li> It is \u001E, RECORD SEPARATOR.
  1309.      * <li> It is \u001F, UNIT SEPARATOR.
  1310.      * </ul>
  1311.      *
  1312.      * @param   ch    the character to be tested.
  1313.      * @return  true if the character is a Java whitespace character;
  1314.      *          false otherwise.
  1315.      * @see     java.lang.Character#isSpaceChar(char)
  1316.      * @since   JDK1.1
  1317.      */
  1318.     public static boolean isWhitespace(char ch) {
  1319.       return (A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x00070000) == 0x00040000;
  1320.     }
  1321.  
  1322.     /**
  1323.      * Determines if the specified character is an ISO control character.
  1324.      * A character is considered to be an ISO control character if its
  1325.      * code is in the range \u0000 through \u001F or in the range
  1326.      * \u007F through \u009F.
  1327.      *
  1328.      * @param   ch    the character to be tested.
  1329.      * @return  true if the character is an ISO control character;
  1330.      *          false otherwise.
  1331.      *
  1332.      * @see     java.lang.Character#isSpaceChar(char)
  1333.      * @see     java.lang.Character#isWhitespace(char)
  1334.      * @since   JDK1.1
  1335.      */
  1336.     public static boolean isISOControl(char ch) {
  1337.       return (ch <= 0x009F) && ((ch <= 0x001F) || (ch >= 0x007F));
  1338.     }
  1339.  
  1340.     /**
  1341.      * Returns a value indicating a character category.
  1342.      *
  1343.      * @param   ch      the character to be tested.
  1344.      * @return  a value of type int, the character category.
  1345.      * @see     java.lang.Character#COMBINING_SPACING_MARK
  1346.      * @see     java.lang.Character#CONNECTOR_PUNCTUATION
  1347.      * @see     java.lang.Character#CONTROL
  1348.      * @see     java.lang.Character#CURRENCY_SYMBOL
  1349.      * @see     java.lang.Character#DASH_PUNCTUATION
  1350.      * @see     java.lang.Character#DECIMAL_DIGIT_NUMBER
  1351.      * @see     java.lang.Character#ENCLOSING_MARK
  1352.      * @see     java.lang.Character#END_PUNCTUATION
  1353.      * @see     java.lang.Character#FORMAT
  1354.      * @see     java.lang.Character#LETTER_NUMBER
  1355.      * @see     java.lang.Character#LINE_SEPARATOR
  1356.      * @see     java.lang.Character#LOWERCASE_LETTER
  1357.      * @see     java.lang.Character#MATH_SYMBOL
  1358.      * @see     java.lang.Character#MODIFIER_LETTER
  1359.      * @see     java.lang.Character#MODIFIER_SYMBOL
  1360.      * @see     java.lang.Character#NON_SPACING_MARK
  1361.      * @see     java.lang.Character#OTHER_LETTER
  1362.      * @see     java.lang.Character#OTHER_NUMBER
  1363.      * @see     java.lang.Character#OTHER_PUNCTUATION
  1364.      * @see     java.lang.Character#OTHER_SYMBOL
  1365.      * @see     java.lang.Character#PARAGRAPH_SEPARATOR
  1366.      * @see     java.lang.Character#PRIVATE_USE
  1367.      * @see     java.lang.Character#SPACE_SEPARATOR
  1368.      * @see     java.lang.Character#START_PUNCTUATION
  1369.      * @see     java.lang.Character#SURROGATE
  1370.      * @see     java.lang.Character#TITLECASE_LETTER
  1371.      * @see     java.lang.Character#UNASSIGNED
  1372.      * @see     java.lang.Character#UPPERCASE_LETTER
  1373.      * @since   JDK1.1
  1374.      */
  1375.     public static int getType(char ch) {
  1376.         return A[Y[(X[ch>>6]<<5)|((ch>>1)&0x1F)]|(ch&0x1)] & 0x1F;
  1377.     }
  1378.  
  1379.     /**
  1380.      * Determines the character representation for a specific digit in 
  1381.      * the specified radix. If the value of <code>radix</code> is not a 
  1382.      * valid radix, or the value of <code>digit</code> is not a valid 
  1383.      * digit in the specified radix, the null character 
  1384.      * (<code>'\u0000'</code>) is returned. 
  1385.      * <p>
  1386.      * The <code>radix</code> argument is valid if it is greater than or 
  1387.      * equal to <code>MIN_RADIX</code> and less than or equal to 
  1388.      * <code>MAX_RADIX</code>. The <code>digit</code> argument is valid if
  1389.      * <code>0 <= digit <= radix</code>. 
  1390.      * <p>
  1391.      * If the digit is less than 10, then 
  1392.      * <code>'0' + digit</code> is returned. Otherwise, the value 
  1393.      * <code>'a' + digit - 10</code> is returned. 
  1394.      *
  1395.      * @param   digit   the number to convert to a character.
  1396.      * @param   radix   the radix.
  1397.      * @return  the <code>char</code> representation of the specified digit
  1398.      *          in the specified radix. 
  1399.      * @see     java.lang.Character#MIN_RADIX
  1400.      * @see     java.lang.Character#MAX_RADIX
  1401.      * @see     java.lang.Character#digit(char, int)
  1402.      */
  1403.     public static char forDigit(int digit, int radix) {
  1404.     if ((digit >= radix) || (digit < 0)) {
  1405.         return '\0';
  1406.     }
  1407.     if ((radix < MIN_RADIX) || (radix > MAX_RADIX)) {
  1408.         return '\0';
  1409.     }
  1410.     if (digit < 10) {
  1411.         return (char)('0' + digit);
  1412.     } 
  1413.     return (char)('a' - 10 + digit);
  1414.     }
  1415.  
  1416.     /**
  1417.      * Compares two Characters numerically.
  1418.      *
  1419.      * @param   anotherCharacter   the <code>Character</code> to be compared.
  1420.      * @return  the value <code>0</code> if the argument Character is equal to
  1421.      *          this Character; a value less than <code>0</code> if this
  1422.      *          Character is numerically less than the Character argument; and
  1423.      *          a value greater than <code>0</code> if this Character is
  1424.      *          numerically greater than the Character argument (unsigned
  1425.      *        comparison).  Note that this is strictly a numerical
  1426.      *        comparison; it is not locale-dependent.
  1427.      * @since   JDK1.2
  1428.      */
  1429.     public int compareTo(Character anotherCharacter) {
  1430.     return this.value - anotherCharacter.value;
  1431.     }
  1432.  
  1433.     /**
  1434.      * Compares this Character to another Object.  If the Object is
  1435.      * a Character, this function behaves like
  1436.      * <code>compareTo(Character)</code>.  Otherwise, it throws a
  1437.      * <code>ClassCastException</code> (as Characters are
  1438.      * comparable only to other Characters).
  1439.      *
  1440.      * @param   o the <code>Object</code> to be compared.
  1441.      * @return  the value <code>0</code> if the argument is a Character
  1442.      *        numerically equal to this Character; a value less than
  1443.      *        <code>0</code> if the argument is a Character numerically
  1444.      *        greater than this Character; and a value greater than
  1445.      *        <code>0</code> if the argument is a Character numerically
  1446.      *        less than this Character.
  1447.      * @exception <code>ClassCastException</code> if the argument is not a
  1448.      *          <code>Character</code>. 
  1449.      * @see     java.lang.Comparable
  1450.      * @since JDK1.2 */
  1451.     public int compareTo(Object o) {
  1452.     return compareTo((Character)o);
  1453.     }
  1454.  
  1455.     /* The character properties are currently encoded into 32 bits in the following manner:
  1456.        10 bits    signed offset used for converting case
  1457.     1 bit    if 1, adding the signed offset converts the character to lowercase
  1458.     1 bit    if 1, subtracting the signed offset converts the character to uppercase
  1459.     1 bit   if 1, this character has a titlecase equivalent (possibly itself)
  1460.     3 bits    0  may not be part of an identifier
  1461.         1  ignorable control; may continue a Unicode identifier or Java identifier
  1462.         2  may continue a Java identifier but not a Unicode identifier (unused)
  1463.         3  may continue a Unicode identifier or Java identifier
  1464.         4  is a Java whitespace character
  1465.         5  may start or continue a Java identifier;
  1466.            may continue but not start a Unicode identifier (underscores)
  1467.         6  may start or continue a Java identifier but not a Unicode identifier ($)
  1468.         7  may start or continue a Unicode identifier or Java identifier
  1469.         Thus:
  1470.            5, 6, 7 may start a Java identifier
  1471.            1, 2, 3, 5, 6, 7 may continue a Java identifier
  1472.            7 may start a Unicode identifier
  1473.            1, 3, 5, 7 may continue a Unicode identifier
  1474.            1 is ignorable within an identifier
  1475.            4 is Java whitespace
  1476.     2 bits    0  this character has no numeric property
  1477.         1  adding the digit offset to the character code and then
  1478.            masking with 0x1F will produce the desired numeric value
  1479.         2  this character has a "strange" numeric value
  1480.         3  a Java supradecimal digit: adding the digit offset to the
  1481.            character code, then masking with 0x1F, then adding 10
  1482.            will produce the desired numeric value
  1483.     5 bits  digit offset
  1484.     4 bits    reserved for future use
  1485.     5 bits    character type
  1486.      */
  1487.  
  1488.   // The following tables and code generated using:
  1489.   // java GenerateCharacter -string -o Character.java.x [10 5 1] [-spec UnicodeData-2.1.2.txt] [-template Character.java.template]
  1490.   // The X table has 1024 entries for a total of 1024 bytes.
  1491.  
  1492.   private static final byte X[] = new byte[1024];
  1493.   private static final String X_DATA =
  1494.     "\u0100\u0302\u0504\u0706\u0908\u0B0A\u0D0C\u0F0E\u1110\u1312\u1514\u1716\u1918"+
  1495.     "\u1B1A\u1C1C\u1C1C\u1C1C\u1C1C\u1E1D\u201F\u2221\u2423\u2625\u2827\u2A29\u2C2B"+
  1496.     "\u2E2D\u1C1C\u302F\u3231\u3433\u1C35\u1C1C\u3736\u3938\u3B3A\u1C1C\u1C1C\u1C1C"+
  1497.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1498.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u3C3C\u3E3D\u403F\u4241\u4443"+
  1499.     "\u4645\u4847\u4A49\u4C4B\u4E4D\u504F\u1C1C\u5251\u5453\u5555\u5756\u5758\u1C1C"+
  1500.     "\u5A59\u1C5B\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1501.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u5D5C\u5F5E\u3860\u1C61\u6362\u6564\u6766\u6866"+
  1502.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1503.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1504.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1505.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1506.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1507.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1508.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1509.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1510.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1511.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1512.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1513.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1514.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1515.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1516.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1517.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1518.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u1C69\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1519.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C"+
  1520.     "\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u1C1C\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1521.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1522.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1523.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1524.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1525.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1526.     "\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838\u3838"+
  1527.     "\u3838\u3838\u1C6A\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B"+
  1528.     "\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6B6B\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C"+
  1529.     "\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C"+
  1530.     "\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C"+
  1531.     "\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C\u6C6C"+
  1532.     "\u6C6C\u6C6C\u6C6C\u6C6C\u3838\u3838\u1C6D\u1C1C\u6F6E\u7170\u7272\u7272\u7473"+
  1533.     "\u7675\u7877\u7972\u7B7A\u7D7C";
  1534.  
  1535.   // The Y table has 4032 entries for a total of 8064 bytes.
  1536.  
  1537.   private static final short Y[] = new short[4032];
  1538.   private static final String Y_DATA =
  1539.     "\000\000\000\000\002\004\004\000\000\000\000\000\000\000\004\004\006\010\012"+
  1540.     "\014\016\020\022\024\026\026\026\026\026\030\032\034\036\040\040\040\040\040"+
  1541.     "\040\040\040\040\040\040\040\042\044\046\050\052\052\052\052\052\052\052\052"+
  1542.     "\052\052\052\052\054\056\060\000\000\000\000\000\000\000\000\000\000\000\000"+
  1543.     "\000\000\000\000\062\064\064\066\070\072\074\076\100\102\104\106\110\112\114"+
  1544.     "\116\120\120\120\120\120\120\120\120\120\120\120\122\120\120\120\124\126\126"+
  1545.     "\126\126\126\126\126\126\126\126\126\130\126\126\126\132\134\134\134\134\134"+
  1546.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1547.     "\136\134\134\134\140\142\142\142\142\142\142\142\144\134\134\134\134\134\134"+
  1548.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\146\142"+
  1549.     "\142\150\152\134\134\154\156\160\144\162\164\156\166\170\134\172\174\176\134"+
  1550.     "\134\134\200\202\204\134\206\210\212\142\214\134\216\134\220\220\220\222\224"+
  1551.     "\226\222\230\142\142\142\142\142\142\142\232\134\134\134\134\134\134\134\134"+
  1552.     "\134\234\226\134\236\236\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1553.     "\134\134\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236"+
  1554.     "\236\236\236\236\236\236\236\236\236\236\236\172\240\242\244\246\250\172\172"+
  1555.     "\252\254\172\172\256\172\172\260\172\262\264\172\172\172\172\172\172\266\172"+
  1556.     "\172\270\272\172\172\172\274\172\172\172\172\172\172\172\172\172\172\276\236"+
  1557.     "\236\236\300\300\300\300\302\304\300\300\300\306\306\306\306\306\306\306\300"+
  1558.     "\306\306\306\306\306\306\310\300\300\302\306\306\236\236\236\236\236\236\236"+
  1559.     "\236\236\236\236\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312"+
  1560.     "\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312\312"+
  1561.     "\312\236\236\236\236\236\236\236\236\236\236\236\236\236\312\236\236\236\236"+
  1562.     "\236\236\236\236\236\314\236\236\316\236\320\236\236\306\322\324\326\330\332"+
  1563.     "\334\120\120\120\120\120\120\120\120\336\120\120\120\120\340\342\344\126\126"+
  1564.     "\126\126\126\126\126\126\346\126\126\126\126\350\352\354\356\360\362\236\364"+
  1565.     "\364\364\364\134\134\134\134\134\134\134\366\216\236\236\236\236\236\236\370"+
  1566.     "\372\372\372\372\372\374\372\120\120\120\120\120\120\120\120\120\120\120\120"+
  1567.     "\120\120\120\120\126\126\126\126\126\126\126\126\126\126\126\126\126\126\126"+
  1568.     "\126\376\u0100\u0100\u0100\u0100\u0100\u0102\u0100\134\134\134\134\134\134"+
  1569.     "\134\134\134\134\134\134\134\134\134\134\134\u0104\312\u0106\236\236\236\236"+
  1570.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1571.     "\134\134\134\134\134\u0108\142\u010A\u010C\u010A\u010C\u010A\236\134\134\134"+
  1572.     "\134\134\134\134\134\134\134\134\134\134\134\236\134\134\134\134\236\134\236"+
  1573.     "\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236"+
  1574.     "\236\236\236\236\236\236\236\u010E\u0110\u0110\u0110\u0110\u0110\u0110\u0110"+
  1575.     "\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0112\u0114"+
  1576.     "\314\314\314\u0116\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u0118"+
  1577.     "\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u0118\u011A\u011C\236\236\236\u011E"+
  1578.     "\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u011E\u0120\u0120\u0120\u0120"+
  1579.     "\u0120\u0120\u0120\u0120\u0120\u0120\u0120\u011E\u0120\u0122\u0122\u0124\u0126"+
  1580.     "\236\236\236\236\236\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1581.     "\u0128\u0128\u0128\u0128\u012A\236\236\u0128\u012C\u012E\236\236\236\236\236"+
  1582.     "\236\236\236\236\236\236\u012E\236\236\236\236\236\236\u0130\236\u0130\u0132"+
  1583.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u012A"+
  1584.     "\236\236\u0134\u0128\u0128\u0128\u0128\u0136\u0120\u0120\u0120\u0126\236\236"+
  1585.     "\236\236\236\236\u0138\u0138\u0138\u0138\u0138\u013A\u013C\236\u013E\u0128"+
  1586.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1587.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1588.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\236\u0128\u0128\u012A\u0128"+
  1589.     "\u0128\u0128\u0128\u0128\u0128\u0128\u012A\u0128\u0128\u0140\u0120\u0120\u0120"+
  1590.     "\u0142\u0144\u0120\u0120\u0146\u0148\u014A\u0120\u0120\236\026\026\026\026"+
  1591.     "\026\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236"+
  1592.     "\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u014C"+
  1593.     "\u014E\u0150\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1594.     "\220\220\220\220\220\220\220\220\220\220\236\u0152\u0154\u0156\312\312\312"+
  1595.     "\u014E\u0154\u0156\236\u0104\312\u0106\236\220\220\220\220\220\312\314\u0158"+
  1596.     "\u0158\u0158\u0158\u0158\320\236\236\236\236\236\236\236\u014C\u0154\u0150"+
  1597.     "\220\220\220\u015A\u0150\u015A\u0150\220\220\220\220\220\220\220\220\220\220"+
  1598.     "\u015A\220\220\220\u015A\u015A\236\220\220\236\u0106\u0154\u0156\312\u0106"+
  1599.     "\u015C\u015E\u015C\u0156\236\236\236\236\u015C\236\236\220\u0150\220\312\236"+
  1600.     "\u0158\u0158\u0158\u0158\u0158\220\u0160\u0162\u0162\u0164\u0166\236\236\236"+
  1601.     "\u0106\u0150\220\220\u015A\236\u0150\u015A\u0150\220\220\220\220\220\220\220"+
  1602.     "\220\220\220\u015A\220\220\220\u015A\220\u0150\u015A\220\236\u0106\u0154\u0156"+
  1603.     "\u0106\236\u014C\u0106\u014C\312\236\236\236\236\236\u0150\220\u015A\u015A"+
  1604.     "\236\236\236\u0158\u0158\u0158\u0158\u0158\312\220\u015A\236\236\236\236\236"+
  1605.     "\u014C\u014E\u0150\220\220\220\u0150\u0150\220\u0150\220\220\220\220\220\220"+
  1606.     "\220\220\220\220\u015A\220\220\220\u015A\220\u0150\220\220\236\u0152\u0154"+
  1607.     "\u0156\312\312\u014C\u014E\u015C\u0156\236\u0166\236\236\236\236\236\236\236"+
  1608.     "\u015A\236\236\u0158\u0158\u0158\u0158\u0158\236\236\236\236\236\236\236\236"+
  1609.     "\u014C\u0154\u0150\220\220\220\u015A\u0150\u015A\u0150\220\220\220\220\220"+
  1610.     "\220\220\220\220\220\u015A\220\220\220\u015A\220\236\220\220\236\u0152\u0156"+
  1611.     "\u0156\312\236\u015C\u015E\u015C\u0156\236\236\236\236\u014E\236\236\220\u0150"+
  1612.     "\220\236\236\u0158\u0158\u0158\u0158\u0158\u0166\236\236\236\236\236\236\236"+
  1613.     "\236\u014E\u0150\220\220\u015A\236\220\u015A\220\220\236\u0150\u015A\u015A"+
  1614.     "\220\236\u0150\u015A\236\220\u015A\236\220\220\220\220\u0150\220\236\236\u0154"+
  1615.     "\u014E\u015E\236\u0154\u015E\u0154\u0156\236\236\236\236\u015C\236\236\236"+
  1616.     "\236\236\236\236\u0168\u0158\u0158\u0158\u0158\u016A\u016C\236\236\236\236"+
  1617.     "\236\236\u015C\u0154\u0150\220\220\220\u015A\220\u015A\220\220\220\220\220"+
  1618.     "\220\220\220\220\220\220\u015A\220\220\220\220\220\u0150\220\220\236\236\312"+
  1619.     "\u014E\u0154\u015E\312\u0106\312\312\236\236\236\u014C\u0106\236\236\236\236"+
  1620.     "\220\236\236\u0158\u0158\u0158\u0158\u0158\236\236\236\236\236\236\236\236"+
  1621.     "\236\u0154\u0150\220\220\220\u015A\220\u015A\220\220\220\220\220\220\220\220"+
  1622.     "\220\220\220\u015A\220\220\220\220\220\u0150\220\220\236\236\u0156\u0154\u0154"+
  1623.     "\u015E\u014E\u015E\u0154\312\236\236\236\u015C\u015E\236\236\236\u015A\220"+
  1624.     "\236\236\u0158\u0158\u0158\u0158\u0158\236\236\236\236\236\236\236\236\236"+
  1625.     "\u0154\u0150\220\220\220\u015A\220\u015A\220\220\220\220\220\220\220\220\220"+
  1626.     "\220\220\u015A\220\220\220\220\220\220\220\220\236\236\u0154\u0156\312\236"+
  1627.     "\u0154\u015E\u0154\u0156\236\236\236\236\u015C\236\236\236\236\220\236\236"+
  1628.     "\u0158\u0158\u0158\u0158\u0158\236\236\236\236\236\236\236\236\u0150\220\220"+
  1629.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1630.     "\220\u016E\u0170\220\312\312\312\u0106\236\u0172\220\220\220\u0174\312\312"+
  1631.     "\312\u0176\u0178\u0178\u0178\u0178\u0178\314\236\236\236\236\236\236\236\236"+
  1632.     "\236\236\236\236\236\236\236\236\236\236\u0150\u015A\u015A\u0150\u015A\u015A"+
  1633.     "\u0150\236\236\236\220\220\u0150\220\220\220\u0150\220\u0150\u0150\236\220"+
  1634.     "\u0150\u016E\u0170\220\312\312\312\u014C\u0152\236\220\220\u015A\316\312\312"+
  1635.     "\312\236\u0178\u0178\u0178\u0178\u0178\236\220\236\236\236\236\236\236\236"+
  1636.     "\236\236\236\236\236\236\236\236\236\236\u017A\u017A\314\314\314\314\314\314"+
  1637.     "\314\u017C\u017A\u017A\312\u017A\u017A\u017A\u017E\u017E\u017E\u017E\u017E"+
  1638.     "\u0180\u0180\u0180\u0180\u0180\u0104\u0104\u0104\u0182\u0182\u0154\220\220"+
  1639.     "\220\220\u0150\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1640.     "\220\236\236\236\u014C\312\312\312\312\312\312\u014E\312\312\u0184\312\312"+
  1641.     "\312\236\236\312\312\312\u014C\u014C\312\312\312\312\312\312\312\312\312\312"+
  1642.     "\236\u014C\312\312\312\u014C\236\236\236\236\236\236\236\236\236\236\236\236"+
  1643.     "\236\236\236\236\236\236\236\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110"+
  1644.     "\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\u0110\236\236"+
  1645.     "\236\236\236\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172\172"+
  1646.     "\172\172\172\276\236\u011C\236\236\220\220\220\220\220\220\220\220\220\220"+
  1647.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1648.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\236\236\u0150"+
  1649.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1650.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\u015A\236\236\220"+
  1651.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1652.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1653.     "\220\220\236\236\236\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1654.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1655.     "\134\134\134\134\134\134\134\134\134\134\172\172\u0186\236\236\134\134\134"+
  1656.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1657.     "\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134\134"+
  1658.     "\134\134\134\134\236\236\236\u0188\u0188\u0188\u0188\u018A\u018A\u018A\u018A"+
  1659.     "\u0188\u0188\u0188\236\u018A\u018A\u018A\236\u0188\u0188\u0188\u0188\u018A"+
  1660.     "\u018A\u018A\u018A\u0188\u0188\u0188\u0188\u018A\u018A\u018A\u018A\u0188\u0188"+
  1661.     "\u0188\236\u018A\u018A\u018A\236\u018C\u018C\u018C\u018C\u018E\u018E\u018E"+
  1662.     "\u018E\u0188\u0188\u0188\u0188\u018A\u018A\u018A\u018A\u0190\u0192\u0192\u0194"+
  1663.     "\u0196\u0198\u019A\236\u0188\u0188\u0188\u0188\u018A\u018A\u018A\u018A\u0188"+
  1664.     "\u0188\u0188\u0188\u018A\u018A\u018A\u018A\u0188\u0188\u0188\u0188\u018A\u018A"+
  1665.     "\u018A\u018A\u0188\u019C\276\172\u018A\u019E\u01A0\u01A2\306\u019C\276\172"+
  1666.     "\u01A4\u01A4\u01A0\306\u0188\172\236\172\u018A\u01A6\u01A8\306\u0188\172\u01AA"+
  1667.     "\172\u018A\u01AC\u01AE\306\236\u019C\276\172\u01B0\u01B2\u01A0\310\u01B4\u01B4"+
  1668.     "\u01B4\u01B6\u01B4\u01B4\u01B8\u01BA\u01BC\u01BC\u01BC\014\u01BE\u01C0\u01BE"+
  1669.     "\u01C0\014\014\014\014\u01C2\u01B8\u01B8\u01C4\u01C6\u01C6\u01C8\014\u01CA"+
  1670.     "\u01CC\014\u01CE\u01D0\014\u01D2\u01D4\236\236\236\236\236\236\236\236\236"+
  1671.     "\236\236\236\236\236\236\236\236\u01B8\u01B8\u01B8\u01D6\236\102\102\102\u01D8"+
  1672.     "\u01D2\u01DA\u01DC\u01DC\u01DC\u01DC\u01DC\u01D8\u01D2\u01D4\236\236\236\236"+
  1673.     "\236\236\236\236\064\064\064\064\064\064\u01DE\236\236\236\236\236\236\236"+
  1674.     "\236\236\236\236\236\236\236\236\236\236\312\312\312\312\312\312\u01E0\u01E2"+
  1675.     "\u01E4\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\066\u01E6"+
  1676.     "\066\u01E8\066\u01EA\u01EC\u01EE\u01EC\u01F0\u01E8\066\u01EC\u01EC\u01EC\066"+
  1677.     "\066\066\u01E6\u01E6\u01E6\u01EC\u01EC\u01EE\u01EC\u01E8\u01F2\u01F4\u01F6"+
  1678.     "\236\236\236\236\236\236\236\236\236\236\236\236\u01F8\114\114\114\114\114"+
  1679.     "\u01FA\u01FC\u01FC\u01FC\u01FC\u01FC\u01FC\u01FE\u01FE\u0200\u0200\u0200\u0200"+
  1680.     "\u0200\u0200\u0202\u0202\u0204\u0206\236\236\236\236\236\236\u0208\u0208\u020A"+
  1681.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1682.     "\066\066\066\066\066\066\066\066\066\066\066\u020A\u020A\066\066\066\066\066"+
  1683.     "\066\066\066\066\066\u020C\236\236\236\236\236\236\236\236\236\236\u020E\u0210"+
  1684.     "\032\u0208\u0210\u0210\u0210\u0208\u020E\u01D8\u020E\032\u0208\u0210\u0210"+
  1685.     "\u020E\u0210\032\032\032\u0208\u020E\u0210\u0210\u0210\u0210\u0208\u0208\u020E"+
  1686.     "\u020E\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\032\u0208\u0208\u0210"+
  1687.     "\u0210\u0208\u0208\u0208\u0208\u020E\032\032\u0210\u0210\u0210\u0210\u0208"+
  1688.     "\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210"+
  1689.     "\u0210\u0210\032\u020E\u0210\032\u0208\u0208\032\u0208\u0208\u0208\u0208\u0210"+
  1690.     "\u0208\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\032\u0208\u0208"+
  1691.     "\u0210\u0208\u0208\u0208\u0208\u020E\u0210\u0210\u0208\u0210\u0208\u0208\u0210"+
  1692.     "\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0210\u0208\u0210"+
  1693.     "\236\236\236\236\236\236\236\u020C\066\066\066\u0210\u0210\066\066\066\066"+
  1694.     "\066\066\066\066\066\066\u0210\066\066\066\u0212\u0214\066\066\066\066\066"+
  1695.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1696.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1697.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u0166\236\236\066\066\066"+
  1698.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\u020C\236\236"+
  1699.     "\236\236\236\236\236\236\236\236\236\236\236\066\066\066\066\066\u020C\236"+
  1700.     "\236\236\236\236\236\236\236\236\236\u0216\u0216\u0216\u0216\u0216\u0216\u0216"+
  1701.     "\u0216\u0216\u0216\u0218\u0218\u0218\u0218\u0218\u0218\u0218\u0218\u0218\u0218"+
  1702.     "\u021A\u021A\u021A\u021A\u021A\u021A\u021A\u021A\u021A\u021A\066\066\066\066"+
  1703.     "\066\066\066\066\066\066\066\066\066\u021C\u021C\u021C\u021C\u021C\u021C\u021C"+
  1704.     "\u021C\u021C\u021C\u021C\u021C\u021C\u021E\u021E\u021E\u021E\u021E\u021E\u021E"+
  1705.     "\u021E\u021E\u021E\u021E\u021E\u021E\u0220\236\236\236\236\236\236\236\236"+
  1706.     "\236\236\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1707.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1708.     "\066\066\066\066\066\066\066\236\236\236\236\236\066\066\066\066\066\066\066"+
  1709.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1710.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\236\236\236\236\236"+
  1711.     "\236\236\236\066\066\066\066\066\066\066\066\066\066\236\236\236\066\066\066"+
  1712.     "\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\u0222\066"+
  1713.     "\u020C\066\066\236\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1714.     "\u0222\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"+
  1715.     "\u0222\u0222\066\u020C\236\u020C\066\066\066\u020C\u0222\066\066\066\236\236"+
  1716.     "\236\236\236\236\236\u0224\u0224\u0224\u0224\u0224\u0216\u0216\u0216\u0216"+
  1717.     "\u0216\u0226\u0226\u0226\u0226\u0226\u020C\236\066\066\066\066\066\066\066"+
  1718.     "\066\066\066\066\066\u0222\066\066\066\066\066\066\u020C\006\014\u0228\u022A"+
  1719.     "\016\016\016\016\016\066\016\016\016\016\u022C\u022E\u0230\u0232\u0232\u0232"+
  1720.     "\u0232\312\312\312\u0234\u0236\u0236\066\236\236\236\u0222\u0150\220\220\220"+
  1721.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1722.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1723.     "\u015A\236\u014C\u0238\300\316\u0150\220\220\220\220\220\220\220\220\220\220"+
  1724.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1725.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\u016E\300\316"+
  1726.     "\236\236\u0150\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1727.     "\220\220\220\220\u015A\236\u0150\220\220\220\220\220\220\220\220\220\220\220"+
  1728.     "\220\220\220\u015A\u017A\u0180\u0180\u017A\u017A\u017A\u017A\u017A\236\236"+
  1729.     "\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u017A\u017A\u017A"+
  1730.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u0166\236"+
  1731.     "\u0180\u0180\u0180\u0180\u0180\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1732.     "\u017A\u017A\u017A\u017A\u017A\236\236\236\236\236\236\236\236\236\236\236"+
  1733.     "\236\236\236\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1734.     "\u017A\u017A\u017A\236\u023A\u023C\u023C\u023C\u023C\u023C\u017A\u017A\u017A"+
  1735.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1736.     "\u017A\u017A\u017A\u0166\236\236\236\236\236\236\236\u017A\u017A\u017A\u017A"+
  1737.     "\u017A\u017A\236\236\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1738.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1739.     "\u017A\u0166\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1740.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1741.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1742.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1743.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u0166\236\u023A\u017A"+
  1744.     "\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1745.     "\u017A\u017A\u017A\236\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A\u017A"+
  1746.     "\u017A\u017A\u017A\u017A\u017A\u017A\u0166\220\220\220\220\220\220\220\220"+
  1747.     "\220\220\220\220\220\220\220\220\220\220\220\236\236\236\236\236\236\236\236"+
  1748.     "\236\236\236\236\236\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1749.     "\220\220\220\220\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u023E"+
  1750.     "\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E"+
  1751.     "\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E\u023E"+
  1752.     "\u023E\u023E\u023E\u023E\u023E\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240"+
  1753.     "\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240"+
  1754.     "\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\u0240\220\220"+
  1755.     "\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220"+
  1756.     "\220\220\236\236\236\236\236\236\236\236\236\172\172\172\276\236\236\236\236"+
  1757.     "\236\u0242\172\172\236\236\236\u013E\u0128\u0128\u0128\u0128\u0244\u0128\u0128"+
  1758.     "\u0128\u0128\u0128\u0128\u012A\u0128\u0128\u012A\u012A\u0128\u0132\u012A\u0128"+
  1759.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1760.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1761.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1762.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1763.     "\u0128\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u0132"+
  1764.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1765.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1766.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1767.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1768.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1769.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1770.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u01BE\236\236\236\236\236\236\236"+
  1771.     "\236\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1772.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1773.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\236\u0128\u0128\u0128\u0128\u0128"+
  1774.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1775.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\236\236\236\236\236"+
  1776.     "\236\236\236\236\236\236\236\236\236\236\236\236\236\236\236\u0128\u0128\u0128"+
  1777.     "\u0128\u0128\u0128\236\236\236\236\236\236\236\236\236\236\236\236\236\236"+
  1778.     "\236\236\236\236\u0246\u0246\236\236\236\236\236\236\u0248\u024A\u024C\u024E"+
  1779.     "\u024E\u024E\u024E\u024E\u024E\u024E\u0250\236\u0252\014\u01CE\u0254\014\u0256"+
  1780.     "\014\014\u022C\u024E\u024E\u01CC\014\074\u0208\u0258\u025A\014\236\236\u0128"+
  1781.     "\u012A\u012A\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1782.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128"+
  1783.     "\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u0128\u012A\u025C"+
  1784.     "\u0252\014\u025E\014\u01BE\u0260\u0248\014\026\026\026\026\026\014\u0208\u0262"+
  1785.     "\036\040\040\040\040\040\040\040\040\040\040\040\040\u0264\u0266\046\050\052"+
  1786.     "\052\052\052\052\052\052\052\052\052\052\052\u0268\u026A\u0258\u0252\u01BE"+
  1787.     "\u026C\220\220\220\220\220\u026E\220\220\220\220\220\220\220\220\220\220\220"+
  1788.     "\220\220\220\220\220\220\220\220\220\220\220\300\220\220\220\220\220\220\220"+
  1789.     "\220\220\220\220\220\220\220\220\u015A\236\220\220\220\236\220\220\220\236"+
  1790.     "\220\220\220\236\220\u015A\236\u0270\u0272\u0274\u0276\u0208\u0208\u020A\u020C"+
  1791.     "\236\236\236\236\236\236\066\236";
  1792.  
  1793.   // The A table has 632 entries for a total of 2528 bytes.
  1794.  
  1795.   private static final int A[] = new int[632];
  1796.   private static final String A_DATA =
  1797.     "\001\u018F\001\u018F\001\u018F\004\u012F\004\u018F\004\u018F\004\u014C\000"+
  1798.     "\u0198\000\u0198\000\270\006\272\000\270\000\u0198\000\u0198\000\u0175\000"+
  1799.     "\u0176\000\u0198\000\271\000\370\000\264\000\370\000\230\003\u6069\003\u6069"+
  1800.     "\000\370\000\u0198\000\u0179\000\u0199\000\u0179\000\u0198\000\u0198\u0827"+
  1801.     "\uFE21\u0827\uFE21\u0827\uFE21\u0827\uFE21\000\u0175\000\u0198\000\u0176\000"+
  1802.     "\u019B\005\u0197\000\u019B\u0817\uFE22\u0817\uFE22\u0817\uFE22\u0817\uFE22"+
  1803.     "\000\u0175\000\u0199\000\u0176\000\u0199\001\u018F\000\u014C\000\u0198\006"+
  1804.     "\272\006\272\000\u019C\000\u019C\000\u019B\000\u019C\007\u0182\000\u0195\000"+
  1805.     "\u0199\000\u0194\000\u019C\000\u019B\000\274\000\271\000\u606B\000\u606B\000"+
  1806.     "\u019B\007\u0182\000\u019C\000\u0198\000\u019B\000\u506B\007\u0182\000\u0196"+
  1807.     "\000\u818B\000\u818B\000\u818B\000\u0198\u0827\041\u0827\041\u0827\041\000"+
  1808.     "\u0199\u0827\041\007\042\u0817\042\u0817\042\u0817\042\000\u0199\u0817\042"+
  1809.     "\uE1D7\042\147\041\127\042\uCE67\041\u3A17\042\007\042\147\041\127\042\147"+
  1810.     "\041\127\042\007\042\uE1E7\041\147\041\127\042\u4B17\042\007\042\u34A7\041"+
  1811.     "\u33A7\041\147\041\127\042\u3367\041\u3367\041\147\041\u13E7\041\u32A7\041"+
  1812.     "\u32E7\041\147\041\u33E7\041\007\042\u34E7\041\u3467\041\007\042\007\042\u34E7"+
  1813.     "\041\u3567\041\007\042\u35A7\041\007\041\147\041\127\042\u36A7\041\007\045"+
  1814.     "\007\042\u36A7\041\147\041\127\042\u3667\041\u3667\041\147\041\127\042\u36E7"+
  1815.     "\041\007\042\007\045\007\045\007\045\257\041\177\043\237\042\257\041\177\043"+
  1816.     "\237\042\237\042\147\041\127\042\u13D7\042\007\042\257\041\000\000\000\000"+
  1817.     "\007\042\u3497\042\u3397\042\007\042\u3357\042\u3357\042\007\042\u3297\042"+
  1818.     "\007\042\u32D7\042\u3357\042\007\042\007\042\u33D7\042\u3457\042\u34D7\042"+
  1819.     "\007\042\u34D7\042\u3557\042\007\042\007\042\uCAA7\042\007\042\u3697\042\u3697"+
  1820.     "\042\007\042\u3657\042\u3657\042\u36D7\042\007\042\007\042\000\000\007\044"+
  1821.     "\007\044\007\044\000\073\000\073\007\044\000\073\000\073\000\073\000\000\003"+
  1822.     "\046\003\046\000\070\000\070\007\044\000\000\000\070\000\000\u09A7\041\000"+
  1823.     "\070\u0967\041\u0967\041\u0967\041\000\000\u1027\041\000\000\u0FE7\041\u0FE7"+
  1824.     "\041\007\042\u0827\041\000\000\u0827\041\u0997\042\u0957\042\u0957\042\u0957"+
  1825.     "\042\007\042\u0817\042\u07D7\042\u0817\042\u1017\042\u0FD7\042\u0FD7\042\000"+
  1826.     "\000\u0F97\042\u0E57\042\007\041\007\041\007\041\u0BD7\042\u0D97\042\000\000"+
  1827.     "\007\041\000\000\u1597\042\u1417\042\000\000\u1427\041\u1427\041\u1427\041"+
  1828.     "\u1427\041\000\000\000\000\u1417\042\u1417\042\u1417\042\u1417\042\000\000"+
  1829.     "\000\074\003\046\003\046\000\000\007\045\147\041\127\042\000\000\000\000\147"+
  1830.     "\041\000\000\u0C27\041\u0C27\041\u0C27\041\u0C27\041\000\000\000\000\007\044"+
  1831.     "\000\000\u0C17\042\u0C17\042\u0C17\042\u0C17\042\007\042\000\000\000\070\000"+
  1832.     "\000\003\106\003\106\003\106\000\130\003\106\003\106\000\130\003\106\000\000"+
  1833.     "\007\105\007\105\007\105\000\000\007\105\000\130\000\130\000\000\000\000\000"+
  1834.     "\130\000\000\007\105\007\104\007\105\007\105\003\106\003\u40C9\003\u40C9\000"+
  1835.     "\270\000\330\000\330\000\130\003\106\007\105\000\130\007\105\003\106\000\107"+
  1836.     "\000\107\003\106\003\106\007\104\007\104\003\106\003\106\000\134\000\000\003"+
  1837.     "\046\003\046\003\050\000\000\007\045\003\046\007\045\003\050\003\050\003\050"+
  1838.     "\003\046\003\u7429\003\u7429\007\045\000\000\000\000\003\050\003\050\000\000"+
  1839.     "\006\072\006\072\000\u5A2B\000\u5A2B\000\u802B\000\u6E2B\000\074\000\000\000"+
  1840.     "\000\003\u7429\000\u742B\000\u802B\000\u802B\000\000\007\045\000\070\007\045"+
  1841.     "\003\046\000\000\006\072\007\044\003\046\003\046\000\074\003\u6029\003\u6029"+
  1842.     "\000\074\000\074\000\070\000\074\003\u4029\003\u4029\000\053\000\053\000\065"+
  1843.     "\000\066\003\046\000\070\007\042\u0ED7\042\uFE17\042\uFE17\042\uFE27\041\uFE27"+
  1844.     "\041\007\042\uFE17\042\000\000\uFE27\041\uED97\042\uED97\042\uEA97\042\uEA97"+
  1845.     "\042\uE717\042\uE717\042\uE017\042\uE017\042\uE417\042\uE417\042\uE097\042"+
  1846.     "\uE097\042\007\042\uFDD7\042\uEDA7\041\uEDA7\041\uFDE7\041\000\073\007\041"+
  1847.     "\000\073\uEAA7\041\uEAA7\041\uE727\041\uE727\041\000\000\000\073\007\042\uFE57"+
  1848.     "\042\uE427\041\uE427\041\uFE67\041\000\073\uE027\041\uE027\041\uE0A7\041\uE0A7"+
  1849.     "\041\004\u014C\004\u014C\004\u014C\004\354\001\u0190\001\u0190\001\060\001"+
  1850.     "\120\000\u0194\000\u0194\000\u0195\000\u0196\000\u0195\000\u0195\004\u010D"+
  1851.     "\004\u010E\001\u0190\000\000\000\270\000\270\000\270\000\u0198\000\u0198\000"+
  1852.     "\u0195\000\u0196\000\u0198\000\u0198\005\u0197\005\u0197\000\u0198\000\u0199"+
  1853.     "\000\u0175\000\u0176\000\000\000\u606B\000\000\000\271\000\271\000\u0176\007"+
  1854.     "\u0182\000\u406B\000\u406B\006\272\000\000\003\046\000\047\000\047\000\047"+
  1855.     "\000\047\003\046\007\u0181\000\u019C\000\u019C\007\u0181\007\u0182\007\u0181"+
  1856.     "\007\u0181\007\u0181\007\u0182\007\u0182\007\u0181\007\u0182\007\u0182\007"+
  1857.     "\u0185\007\u0185\007\u0185\007\u0185\000\000\000\000\000\u818B\000\u818B\000"+
  1858.     "\u458B\u0427\u422A\u0427\u422A\u0427\u802A\u0427\u802A\u0417\u622A\u0417\u622A"+
  1859.     "\u0417\u802A\u0417\u802A\007\u802A\007\u802A\007\u802A\000\000\000\u0199\000"+
  1860.     "\u0199\000\u0199\000\u019C\000\u019C\000\000\000\u0199\000\u0179\000\u0179"+
  1861.     "\000\u0179\000\u019C\000\u0175\000\u0176\000\u019C\000\u438B\000\u438B\000"+
  1862.     "\u5B8B\000\u5B8B\000\u738B\000\u738B\u06A0\u019C\u06A0\u019C\u0690\u019C\u0690"+
  1863.     "\u019C\000\u6D8B\000\000\000\000\000\u019C\000\u578B\000\u578B\000\u6F8B\000"+
  1864.     "\u6F8B\000\u019C\007\u0184\000\u0198\007\u738A\000\u0194\000\u0195\000\u0196"+
  1865.     "\000\u0196\000\u019C\007\u402A\007\u402A\007\u402A\000\u0194\007\u0184\007"+
  1866.     "\u0184\007\u0184\003\046\007\044\000\000\000\074\000\u422B\000\u422B\000\063"+
  1867.     "\000\063\000\062\000\062\000\000\007\042\007\105\000\131\003\u0186\003\u0186"+
  1868.     "\000\u0198\000\u0194\000\u0194\005\u0197\005\u0197\000\u0195\000\u0196\000"+
  1869.     "\u0195\000\u0196\000\000\000\000\000\u0198\005\u0197\005\u0197\000\u0198\000"+
  1870.     "\000\000\u0199\000\000\000\u0198\006\u019A\000\000\001\u0190\006\u019A\000"+
  1871.     "\u0198\000\u0198\000\u0199\000\u0199\000\u0198\u0827\uFE21\000\u0195\000\u0198"+
  1872.     "\000\u0196\u0817\uFE22\000\u0195\000\u0199\000\u0196\000\u0198\000\070\007"+
  1873.     "\044\007\045\006\u019A\006\u019A\000\u0199\000\u019B\000\u019C\006\u019A\006"+
  1874.     "\u019A\000\000";
  1875.  
  1876.   // In all, the character property tables require 11616 bytes.
  1877.  
  1878.     static {
  1879.         { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
  1880.             int len = X_DATA.length();
  1881.             int j=0;
  1882.             for (int i=0; i<len; ++i) {
  1883.                 int c = X_DATA.charAt(i);
  1884.                 for (int k=0; k<2; ++k) {
  1885.                     X[j++] = (byte)c;
  1886.                     c >>= 8;
  1887.                 }
  1888.             }
  1889.             if (j != 1024) throw new RuntimeException();
  1890.         }
  1891.         { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
  1892.             if (Y_DATA.length() != 4032) throw new RuntimeException();
  1893.             for (int i=0; i<4032; ++i)
  1894.                 Y[i] = (short)Y_DATA.charAt(i);
  1895.         }
  1896.         { // THIS CODE WAS AUTOMATICALLY CREATED BY GenerateCharacter:
  1897.             int len = A_DATA.length();
  1898.             int j=0;
  1899.             int charsInEntry=0;
  1900.             int entry=0;
  1901.             for (int i=0; i<len; ++i) {
  1902.                 entry |= A_DATA.charAt(i);
  1903.                 if (++charsInEntry == 2) {
  1904.                     A[j++] = entry;
  1905.                     entry = 0;
  1906.                     charsInEntry = 0;
  1907.                 }
  1908.                 else {
  1909.                     entry <<= 16;
  1910.                 }
  1911.             }
  1912.             if (j != 632) throw new RuntimeException();
  1913.         }
  1914.  
  1915.     }
  1916.  
  1917. }
  1918.