Merge
authortbell
Sat, 18 Apr 2009 14:10:27 -0700
changeset 2627 c66fa5c0e626
parent 2541 824a5ff07bcb (current diff)
parent 2626 b49ee2080eb8 (diff)
child 2628 50912ad83111
Merge
jdk/src/share/classes/sun/font/FontManager.java
jdk/src/share/native/java/util/zip/ZipEntry.c
--- a/jdk/make/java/zip/FILES_c.gmk	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/make/java/zip/FILES_c.gmk	Sat Apr 18 14:10:27 2009 -0700
@@ -29,7 +29,6 @@
 	Deflater.c \
 	Inflater.c \
 	ZipFile.c \
-	ZipEntry.c \
 	zadler32.c \
 	zcrc32.c \
 	deflate.c \
--- a/jdk/make/java/zip/mapfile-vers	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/make/java/zip/mapfile-vers	Sat Apr 18 14:10:27 2009 -0700
@@ -50,15 +50,17 @@
 		Java_java_util_zip_Inflater_initIDs;
 		Java_java_util_zip_Inflater_reset;
 		Java_java_util_zip_Inflater_setDictionary;
-		Java_java_util_zip_ZipEntry_initFields;
-		Java_java_util_zip_ZipEntry_initIDs;
 		Java_java_util_zip_ZipFile_close;
 		Java_java_util_zip_ZipFile_freeEntry;
-		Java_java_util_zip_ZipFile_getCSize;
 		Java_java_util_zip_ZipFile_getEntry;
-		Java_java_util_zip_ZipFile_getMethod;
+		Java_java_util_zip_ZipFile_getEntryBytes;
+		Java_java_util_zip_ZipFile_getEntryCrc;
+		Java_java_util_zip_ZipFile_getEntryCSize;
+		Java_java_util_zip_ZipFile_getEntryFlag;
+		Java_java_util_zip_ZipFile_getEntryMethod;
+		Java_java_util_zip_ZipFile_getEntrySize;
+		Java_java_util_zip_ZipFile_getEntryTime;
 		Java_java_util_zip_ZipFile_getNextEntry;
-		Java_java_util_zip_ZipFile_getSize;
 		Java_java_util_zip_ZipFile_getZipMessage;
 		Java_java_util_zip_ZipFile_getTotal;
 		Java_java_util_zip_ZipFile_initIDs;
--- a/jdk/make/java/zip/reorder-i586	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/make/java/zip/reorder-i586	Sat Apr 18 14:10:27 2009 -0700
@@ -20,12 +20,14 @@
 text: .text%Java_java_util_zip_ZipFile_open;
 text: .text%Java_java_util_zip_ZipFile_getTotal;
 text: .text%Java_java_util_zip_ZipFile_getEntry;
-text: .text%Java_java_util_zip_ZipEntry_initIDs;
-text: .text%Java_java_util_zip_ZipEntry_initFields;
 text: .text%Java_java_util_zip_ZipFile_freeEntry;
-text: .text%Java_java_util_zip_ZipFile_getCSize;
-text: .text%Java_java_util_zip_ZipFile_getSize;
-text: .text%Java_java_util_zip_ZipFile_getMethod;
+text: .text%Java_java_util_zip_ZipFile_getEntryTime;
+text: .text%Java_java_util_zip_ZipFile_getEntryCrc;
+text: .text%Java_java_util_zip_ZipFile_getEntryCSize;
+text: .text%Java_java_util_zip_ZipFile_getEntrySize;
+text: .text%Java_java_util_zip_ZipFile_getEntryFlag;
+text: .text%Java_java_util_zip_ZipFile_getEntryMethod;
+text: .text%Java_java_util_zip_ZipFile_getEntryBytes;
 text: .text%Java_java_util_zip_Inflater_initIDs;
 text: .text%Java_java_util_zip_Inflater_init;
 text: .text%inflateInit2_;
--- a/jdk/make/java/zip/reorder-sparc	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/make/java/zip/reorder-sparc	Sat Apr 18 14:10:27 2009 -0700
@@ -19,12 +19,14 @@
 text: .text%Java_java_util_zip_ZipFile_open;
 text: .text%Java_java_util_zip_ZipFile_getTotal;
 text: .text%Java_java_util_zip_ZipFile_getEntry;
-text: .text%Java_java_util_zip_ZipEntry_initIDs;
-text: .text%Java_java_util_zip_ZipEntry_initFields;
 text: .text%Java_java_util_zip_ZipFile_freeEntry;
-text: .text%Java_java_util_zip_ZipFile_getCSize;
-text: .text%Java_java_util_zip_ZipFile_getSize;
-text: .text%Java_java_util_zip_ZipFile_getMethod;
+text: .text%Java_java_util_zip_ZipFile_getEntryTime;
+text: .text%Java_java_util_zip_ZipFile_getEntryCrc;
+text: .text%Java_java_util_zip_ZipFile_getEntryCSize;
+text: .text%Java_java_util_zip_ZipFile_getEntrySize;
+text: .text%Java_java_util_zip_ZipFile_getEntryFlag;
+text: .text%Java_java_util_zip_ZipFile_getEntryMethod;
+text: .text%Java_java_util_zip_ZipFile_getEntryBytes;
 text: .text%Java_java_util_zip_Inflater_initIDs;
 text: .text%Java_java_util_zip_Inflater_init;
 text: .text%inflateInit2_;
--- a/jdk/make/java/zip/reorder-sparcv9	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/make/java/zip/reorder-sparcv9	Sat Apr 18 14:10:27 2009 -0700
@@ -20,12 +20,14 @@
 text: .text%Java_java_util_zip_ZipFile_open;
 text: .text%Java_java_util_zip_ZipFile_getTotal;
 text: .text%Java_java_util_zip_ZipFile_getEntry;
-text: .text%Java_java_util_zip_ZipEntry_initIDs;
-text: .text%Java_java_util_zip_ZipEntry_initFields;
 text: .text%Java_java_util_zip_ZipFile_freeEntry;
-text: .text%Java_java_util_zip_ZipFile_getCSize;
-text: .text%Java_java_util_zip_ZipFile_getSize;
-text: .text%Java_java_util_zip_ZipFile_getMethod;
+text: .text%Java_java_util_zip_ZipFile_getEntryTime;
+text: .text%Java_java_util_zip_ZipFile_getEntryCrc;
+text: .text%Java_java_util_zip_ZipFile_getEntryCSize;
+text: .text%Java_java_util_zip_ZipFile_getEntrySize;
+text: .text%Java_java_util_zip_ZipFile_getEntryFlag;
+text: .text%Java_java_util_zip_ZipFile_getEntryMethod;
+text: .text%Java_java_util_zip_ZipFile_getEntryBytes;
 text: .text%Java_java_util_zip_Inflater_initIDs;
 text: .text%Java_java_util_zip_Inflater_init;
 text: .text%inflateInit2_;
--- a/jdk/src/share/bin/emessages.h	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/bin/emessages.h	Sat Apr 18 14:10:27 2009 -0700
@@ -50,6 +50,12 @@
 #define JAR_ERROR2      "Error: Unable to access jarfile %s"
 #define JAR_ERROR3      "Error: Invalid or corrupt jarfile %s"
 
+#define CLS_ERROR1      "Error: Could not find the main class %s.\n" JNI_ERROR
+#define CLS_ERROR2      "Error: Failed to load Main Class: %s\n%s"
+#define CLS_ERROR3      "Error: No main method found in specified class.\n" GEN_ERROR
+#define CLS_ERROR4      "Error: Main method not public\n" GEN_ERROR
+#define CLS_ERROR5      "Error: main-class: attribute exceeds system limits of %d bytes\n" GEN_ERROR
+
 #define CFG_WARN1       "Warning: %s VM not supported; %s VM will be used"
 #define CFG_WARN2       "Warning: No leading - on line %d of `%s'"
 #define CFG_WARN3       "Warning: Missing VM type on line %d of `%s'"
--- a/jdk/src/share/bin/java.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/bin/java.c	Sat Apr 18 14:10:27 2009 -0700
@@ -915,8 +915,14 @@
      * to avoid locating, expanding and parsing the manifest extra
      * times.
      */
-    if (info.main_class != NULL)
-        (void)JLI_StrCat(env_entry, info.main_class);
+    if (info.main_class != NULL) {
+        if (JLI_StrLen(info.main_class) <= MAXNAMELEN) {
+            (void)JLI_StrCat(env_entry, info.main_class);
+        } else {
+            JLI_ReportErrorMessage(CLS_ERROR5, MAXNAMELEN);
+            exit(1);
+        }
+    }
     (void)putenv(env_entry);
     ExecJRE(jre, new_argv);
     JLI_FreeManifest();
--- a/jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/remote/internal/ClientNotifForwarder.java	Sat Apr 18 14:10:27 2009 -0700
@@ -22,7 +22,6 @@
  * CA 95054 USA or visit www.sun.com if you need additional information or
  * have any questions.
  */
-
 package com.sun.jmx.remote.internal;
 
 import java.io.IOException;
@@ -34,6 +33,7 @@
 import java.util.Map;
 import java.util.concurrent.Executor;
 
+import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import javax.security.auth.Subject;
@@ -54,7 +54,10 @@
 
 
 public abstract class ClientNotifForwarder {
-    public ClientNotifForwarder(Map<String, ?> env) {
+
+    private final AccessControlContext acc;
+
+    public ClientNotifForwarder(Map env) {
         this(null, env);
     }
 
@@ -87,6 +90,8 @@
             this.command = command;
             if (thread == null) {
                 thread = new Thread() {
+
+                    @Override
                     public void run() {
                         while (true) {
                             Runnable r;
@@ -130,6 +135,7 @@
 
         this.defaultClassLoader = defaultClassLoader;
         this.executor = ex;
+        this.acc = AccessController.getContext();
     }
 
     /**
@@ -380,28 +386,85 @@
         setState(TERMINATED);
     }
 
-// -------------------------------------------------
-// private classes
-// -------------------------------------------------
+
+    // -------------------------------------------------
+    // private classes
+    // -------------------------------------------------
     //
+
     private class NotifFetcher implements Runnable {
+
+        private volatile boolean alreadyLogged = false;
+
+        private void logOnce(String msg, SecurityException x) {
+            if (alreadyLogged) return;
+            // Log only once.
+            logger.config("setContextClassLoader",msg);
+            if (x != null) logger.fine("setContextClassLoader", x);
+            alreadyLogged = true;
+        }
+
+        // Set new context class loader, returns previous one.
+        private final ClassLoader setContextClassLoader(final ClassLoader loader) {
+            final AccessControlContext ctxt = ClientNotifForwarder.this.acc;
+            // if ctxt is null, log a config message and throw a
+            // SecurityException.
+            if (ctxt == null) {
+                logOnce("AccessControlContext must not be null.",null);
+                throw new SecurityException("AccessControlContext must not be null");
+            }
+            return AccessController.doPrivileged(
+                new PrivilegedAction<ClassLoader>() {
+                    public ClassLoader run() {
+                        try {
+                            // get context class loader - may throw
+                            // SecurityException - though unlikely.
+                            final ClassLoader previous =
+                                Thread.currentThread().getContextClassLoader();
+
+                            // if nothing needs to be done, break here...
+                            if (loader == previous) return previous;
+
+                            // reset context class loader - may throw
+                            // SecurityException
+                            Thread.currentThread().setContextClassLoader(loader);
+                            return previous;
+                        } catch (SecurityException x) {
+                            logOnce("Permission to set ContextClassLoader missing. " +
+                                    "Notifications will not be dispatched. " +
+                                    "Please check your Java policy configuration: " +
+                                    x, x);
+                            throw x;
+                        }
+                    }
+                }, ctxt);
+        }
+
         public void run() {
+            final ClassLoader previous;
+            if (defaultClassLoader != null) {
+                previous = setContextClassLoader(defaultClassLoader);
+            } else {
+                previous = null;
+            }
+            try {
+                doRun();
+            } finally {
+                if (defaultClassLoader != null) {
+                    setContextClassLoader(previous);
+                }
+            }
+        }
+
+        private void doRun() {
             synchronized (ClientNotifForwarder.this) {
                 currentFetchThread = Thread.currentThread();
 
-                if (state == STARTING)
+                if (state == STARTING) {
                     setState(STARTED);
+                }
             }
 
-            if (defaultClassLoader != null) {
-                AccessController.doPrivileged(new PrivilegedAction<Void>() {
-                        public Void run() {
-                            Thread.currentThread().
-                                setContextClassLoader(defaultClassLoader);
-                            return null;
-                        }
-                    });
-            }
 
             NotificationResult nr = null;
             if (!shouldStop() && (nr = fetchNotifs()) != null) {
@@ -434,8 +497,9 @@
                         // check if an mbean unregistration notif
                         if (!listenerID.equals(mbeanRemovedNotifID)) {
                             final ClientListenerInfo li = infoList.get(listenerID);
-                            if (li != null)
-                                listeners.put(listenerID,li);
+                            if (li != null) {
+                                listeners.put(listenerID, li);
+                            }
                             continue;
                         }
                         final Notification notif = tn.getNotification();
@@ -799,9 +863,7 @@
     private long clientSequenceNumber = -1;
     private final int maxNotifications;
     private final long timeout;
-
     private Integer mbeanRemovedNotifID = null;
-
     private Thread currentFetchThread;
 
     // state
--- a/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerAccessController.java	Sat Apr 18 14:10:27 2009 -0700
@@ -111,6 +111,22 @@
      */
     protected abstract void checkWrite();
 
+    /**
+     * Check if the caller can create the named class.  The default
+     * implementation of this method calls {@link #checkWrite()}.
+     */
+    protected void checkCreate(String className) {
+        checkWrite();
+    }
+
+    /**
+     * Check if the caller can unregister the named MBean.  The default
+     * implementation of this method calls {@link #checkWrite()}.
+     */
+    protected void checkUnregister(ObjectName name) {
+        checkWrite();
+    }
+
     //--------------------------------------------
     //--------------------------------------------
     //
@@ -148,7 +164,7 @@
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkCreate(className)</code>, then forward this method to the
      * wrapped object.
      */
     public ObjectInstance createMBean(String className, ObjectName name)
@@ -158,7 +174,7 @@
         MBeanRegistrationException,
         MBeanException,
         NotCompliantMBeanException {
-        checkWrite();
+        checkCreate(className);
         SecurityManager sm = System.getSecurityManager();
         if (sm == null) {
             Object object = getMBeanServer().instantiate(className);
@@ -170,7 +186,7 @@
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkCreate(className)</code>, then forward this method to the
      * wrapped object.
      */
     public ObjectInstance createMBean(String className, ObjectName name,
@@ -181,7 +197,7 @@
         MBeanRegistrationException,
         MBeanException,
         NotCompliantMBeanException {
-        checkWrite();
+        checkCreate(className);
         SecurityManager sm = System.getSecurityManager();
         if (sm == null) {
             Object object = getMBeanServer().instantiate(className,
@@ -196,7 +212,7 @@
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkCreate(className)</code>, then forward this method to the
      * wrapped object.
      */
     public ObjectInstance createMBean(String className,
@@ -209,7 +225,7 @@
         MBeanException,
         NotCompliantMBeanException,
         InstanceNotFoundException {
-        checkWrite();
+        checkCreate(className);
         SecurityManager sm = System.getSecurityManager();
         if (sm == null) {
             Object object = getMBeanServer().instantiate(className,
@@ -222,7 +238,7 @@
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkCreate(className)</code>, then forward this method to the
      * wrapped object.
      */
     public ObjectInstance createMBean(String className,
@@ -237,7 +253,7 @@
         MBeanException,
         NotCompliantMBeanException,
         InstanceNotFoundException {
-        checkWrite();
+        checkCreate(className);
         SecurityManager sm = System.getSecurityManager();
         if (sm == null) {
             Object object = getMBeanServer().instantiate(className,
@@ -394,45 +410,45 @@
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkCreate(className)</code>, then forward this method to the
      * wrapped object.
      */
     public Object instantiate(String className)
         throws ReflectionException, MBeanException {
-        checkWrite();
+        checkCreate(className);
         return getMBeanServer().instantiate(className);
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkCreate(className)</code>, then forward this method to the
      * wrapped object.
      */
     public Object instantiate(String className,
                               Object params[],
                               String signature[])
         throws ReflectionException, MBeanException {
-        checkWrite();
+        checkCreate(className);
         return getMBeanServer().instantiate(className, params, signature);
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkCreate(className)</code>, then forward this method to the
      * wrapped object.
      */
     public Object instantiate(String className, ObjectName loaderName)
         throws ReflectionException, MBeanException, InstanceNotFoundException {
-        checkWrite();
+        checkCreate(className);
         return getMBeanServer().instantiate(className, loaderName);
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkCreate(className)</code>, then forward this method to the
      * wrapped object.
      */
     public Object instantiate(String className, ObjectName loaderName,
                               Object params[], String signature[])
         throws ReflectionException, MBeanException, InstanceNotFoundException {
-        checkWrite();
+        checkCreate(className);
         return getMBeanServer().instantiate(className, loaderName,
                                             params, signature);
     }
@@ -579,12 +595,12 @@
     }
 
     /**
-     * Call <code>checkWrite()</code>, then forward this method to the
+     * Call <code>checkUnregister()</code>, then forward this method to the
      * wrapped object.
      */
     public void unregisterMBean(ObjectName name)
         throws InstanceNotFoundException, MBeanRegistrationException {
-        checkWrite();
+        checkUnregister(name);
         getMBeanServer().unregisterMBean(name);
     }
 
--- a/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/com/sun/jmx/remote/security/MBeanServerFileAccessController.java	Sat Apr 18 14:10:27 2009 -0700
@@ -31,11 +31,17 @@
 import java.security.AccessController;
 import java.security.Principal;
 import java.security.PrivilegedAction;
-import java.util.Collection;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.regex.Pattern;
 import javax.management.MBeanServer;
+import javax.management.ObjectName;
 import javax.security.auth.Subject;
 
 /**
@@ -46,7 +52,8 @@
  * not allowed; in this case the request is not forwarded to the
  * wrapped object.</p>
  *
- * <p>This class implements the {@link #checkRead()} and {@link #checkWrite()}
+ * <p>This class implements the {@link #checkRead()}, {@link #checkWrite()},
+ * {@link #checkCreate(String)}, and {@link #checkUnregister(ObjectName)}
  * methods based on an access level properties file containing username/access
  * level pairs. The set of username/access level pairs is passed either as a
  * filename which denotes a properties file on disk, or directly as an instance
@@ -56,14 +63,50 @@
  * has exactly one access level. The same access level can be shared by several
  * usernames.</p>
  *
- * <p>The supported access level values are <i>readonly</i> and
- * <i>readwrite</i>.</p>
+ * <p>The supported access level values are {@code readonly} and
+ * {@code readwrite}.  The {@code readwrite} access level can be
+ * qualified by one or more <i>clauses</i>, where each clause looks
+ * like <code>create <i>classNamePattern</i></code> or {@code
+ * unregister}.  For example:</p>
+ *
+ * <pre>
+ * monitorRole  readonly
+ * controlRole  readwrite \
+ *              create javax.management.timer.*,javax.management.monitor.* \
+ *              unregister
+ * </pre>
+ *
+ * <p>(The continuation lines with {@code \} come from the parser for
+ * Properties files.)</p>
  */
 public class MBeanServerFileAccessController
     extends MBeanServerAccessController {
 
-    public static final String READONLY = "readonly";
-    public static final String READWRITE = "readwrite";
+    static final String READONLY = "readonly";
+    static final String READWRITE = "readwrite";
+
+    static final String CREATE = "create";
+    static final String UNREGISTER = "unregister";
+
+    private enum AccessType {READ, WRITE, CREATE, UNREGISTER};
+
+    private static class Access {
+        final boolean write;
+        final String[] createPatterns;
+        private boolean unregister;
+
+        Access(boolean write, boolean unregister, List<String> createPatternList) {
+            this.write = write;
+            int npats = (createPatternList == null) ? 0 : createPatternList.size();
+            if (npats == 0)
+                this.createPatterns = NO_STRINGS;
+            else
+                this.createPatterns = createPatternList.toArray(new String[npats]);
+            this.unregister = unregister;
+        }
+
+        private final String[] NO_STRINGS = new String[0];
+    }
 
     /**
      * <p>Create a new MBeanServerAccessController that forwards all the
@@ -87,8 +130,8 @@
         throws IOException {
         super();
         this.accessFileName = accessFileName;
-        props = propertiesFromFile(accessFileName);
-        checkValues(props);
+        Properties props = propertiesFromFile(accessFileName);
+        parseProperties(props);
     }
 
     /**
@@ -123,14 +166,14 @@
      * #setMBeanServer} method after doing access checks based on read and
      * write permissions.</p>
      *
-     * <p>This instance is initialized from the specified properties instance.
-     * This constructor makes a copy of the properties instance using its
-     * <code>clone</code> method and it is the copy that is consulted to check
-     * the username and access level of an incoming connection. The original
-     * properties object can be modified without affecting the copy. If the
-     * {@link #refresh} method is then called, the
-     * <code>MBeanServerFileAccessController</code> will make a new copy of the
-     * properties object at that time.</p>
+     * <p>This instance is initialized from the specified properties
+     * instance.  This constructor makes a copy of the properties
+     * instance and it is the copy that is consulted to check the
+     * username and access level of an incoming connection. The
+     * original properties object can be modified without affecting
+     * the copy. If the {@link #refresh} method is then called, the
+     * <code>MBeanServerFileAccessController</code> will make a new
+     * copy of the properties object at that time.</p>
      *
      * @param accessFileProps properties list containing the username/access
      * level entries.
@@ -145,8 +188,7 @@
         if (accessFileProps == null)
             throw new IllegalArgumentException("Null properties");
         originalProps = accessFileProps;
-        props = (Properties) accessFileProps.clone();
-        checkValues(props);
+        parseProperties(accessFileProps);
     }
 
     /**
@@ -155,14 +197,14 @@
      * #setMBeanServer} method after doing access checks based on read and
      * write permissions.</p>
      *
-     * <p>This instance is initialized from the specified properties instance.
-     * This constructor makes a copy of the properties instance using its
-     * <code>clone</code> method and it is the copy that is consulted to check
-     * the username and access level of an incoming connection. The original
-     * properties object can be modified without affecting the copy. If the
-     * {@link #refresh} method is then called, the
-     * <code>MBeanServerFileAccessController</code> will make a new copy of the
-     * properties object at that time.</p>
+     * <p>This instance is initialized from the specified properties
+     * instance.  This constructor makes a copy of the properties
+     * instance and it is the copy that is consulted to check the
+     * username and access level of an incoming connection. The
+     * original properties object can be modified without affecting
+     * the copy. If the {@link #refresh} method is then called, the
+     * <code>MBeanServerFileAccessController</code> will make a new
+     * copy of the properties object at that time.</p>
      *
      * @param accessFileProps properties list containing the username/access
      * level entries.
@@ -184,16 +226,36 @@
      * Check if the caller can do read operations. This method does
      * nothing if so, otherwise throws SecurityException.
      */
+    @Override
     public void checkRead() {
-        checkAccessLevel(READONLY);
+        checkAccess(AccessType.READ, null);
     }
 
     /**
      * Check if the caller can do write operations.  This method does
      * nothing if so, otherwise throws SecurityException.
      */
+    @Override
     public void checkWrite() {
-        checkAccessLevel(READWRITE);
+        checkAccess(AccessType.WRITE, null);
+    }
+
+    /**
+     * Check if the caller can create MBeans or instances of the given class.
+     * This method does nothing if so, otherwise throws SecurityException.
+     */
+    @Override
+    public void checkCreate(String className) {
+        checkAccess(AccessType.CREATE, className);
+    }
+
+    /**
+     * Check if the caller can do unregister operations.  This method does
+     * nothing if so, otherwise throws SecurityException.
+     */
+    @Override
+    public void checkUnregister(ObjectName name) {
+        checkAccess(AccessType.UNREGISTER, null);
     }
 
     /**
@@ -218,14 +280,13 @@
      * @exception IllegalArgumentException if any of the supplied access
      * level values differs from "readonly" or "readwrite".
      */
-    public void refresh() throws IOException {
-        synchronized (props) {
-            if (accessFileName == null)
-                props = (Properties) originalProps.clone();
-            else
-                props = propertiesFromFile(accessFileName);
-            checkValues(props);
-        }
+    public synchronized void refresh() throws IOException {
+        Properties props;
+        if (accessFileName == null)
+            props = (Properties) originalProps;
+        else
+            props = propertiesFromFile(accessFileName);
+        parseProperties(props);
     }
 
     private static Properties propertiesFromFile(String fname)
@@ -240,7 +301,7 @@
         }
     }
 
-    private void checkAccessLevel(String accessLevel) {
+    private synchronized void checkAccess(AccessType requiredAccess, String arg) {
         final AccessControlContext acc = AccessController.getContext();
         final Subject s =
             AccessController.doPrivileged(new PrivilegedAction<Subject>() {
@@ -249,39 +310,235 @@
                     }
                 });
         if (s == null) return; /* security has not been enabled */
-        final Set<Principal> principals = s.getPrincipals();
-        for (Principal p : principals) {
-            String grantedAccessLevel;
-            synchronized (props) {
-                grantedAccessLevel = props.getProperty(p.getName());
-            }
-            if (grantedAccessLevel != null) {
-                if (accessLevel.equals(READONLY) &&
-                    (grantedAccessLevel.equals(READONLY) ||
-                     grantedAccessLevel.equals(READWRITE)))
-                    return;
-                if (accessLevel.equals(READWRITE) &&
-                    grantedAccessLevel.equals(READWRITE))
+        final Set principals = s.getPrincipals();
+        String newPropertyValue = null;
+        for (Iterator i = principals.iterator(); i.hasNext(); ) {
+            final Principal p = (Principal) i.next();
+            Access access = accessMap.get(p.getName());
+            if (access != null) {
+                boolean ok;
+                switch (requiredAccess) {
+                    case READ:
+                        ok = true;  // all access entries imply read
+                        break;
+                    case WRITE:
+                        ok = access.write;
+                        break;
+                    case UNREGISTER:
+                        ok = access.unregister;
+                        if (!ok && access.write)
+                            newPropertyValue = "unregister";
+                        break;
+                    case CREATE:
+                        ok = checkCreateAccess(access, arg);
+                        if (!ok && access.write)
+                            newPropertyValue = "create " + arg;
+                        break;
+                    default:
+                        throw new AssertionError();
+                }
+                if (ok)
                     return;
             }
         }
-        throw new SecurityException("Access denied! Invalid access level for " +
-                                    "requested MBeanServer operation.");
+        SecurityException se = new SecurityException("Access denied! Invalid " +
+                "access level for requested MBeanServer operation.");
+        // Add some more information to help people with deployments that
+        // worked before we required explicit create clauses. We're not giving
+        // any information to the bad guys, other than that the access control
+        // is based on a file, which they could have worked out from the stack
+        // trace anyway.
+        if (newPropertyValue != null) {
+            SecurityException se2 = new SecurityException("Access property " +
+                    "for this identity should be similar to: " + READWRITE +
+                    " " + newPropertyValue);
+            se.initCause(se2);
+        }
+        throw se;
+    }
+
+    private static boolean checkCreateAccess(Access access, String className) {
+        for (String classNamePattern : access.createPatterns) {
+            if (classNameMatch(classNamePattern, className))
+                return true;
+        }
+        return false;
     }
 
-    private void checkValues(Properties props) {
-        Collection<?> c = props.values();
-        for (Iterator<?> i = c.iterator(); i.hasNext(); ) {
-            final String accessLevel = (String) i.next();
-            if (!accessLevel.equals(READONLY) &&
-                !accessLevel.equals(READWRITE)) {
-                throw new IllegalArgumentException(
-                    "Syntax error in access level entry [" + accessLevel + "]");
-            }
+    private static boolean classNameMatch(String pattern, String className) {
+        // We studiously avoided regexes when parsing the properties file,
+        // because that is done whenever the VM is started with the
+        // appropriate -Dcom.sun.management options, even if nobody ever
+        // creates an MBean.  We don't want to incur the overhead of loading
+        // all the regex code whenever those options are specified, but if we
+        // get as far as here then the VM is already running and somebody is
+        // doing the very unusual operation of remotely creating an MBean.
+        // Because that operation is so unusual, we don't try to optimize
+        // by hand-matching or by caching compiled Pattern objects.
+        StringBuilder sb = new StringBuilder();
+        StringTokenizer stok = new StringTokenizer(pattern, "*", true);
+        while (stok.hasMoreTokens()) {
+            String tok = stok.nextToken();
+            if (tok.equals("*"))
+                sb.append("[^.]*");
+            else
+                sb.append(Pattern.quote(tok));
+        }
+        return className.matches(sb.toString());
+    }
+
+    private void parseProperties(Properties props) {
+        this.accessMap = new HashMap<String, Access>();
+        for (Map.Entry<Object, Object> entry : props.entrySet()) {
+            String identity = (String) entry.getKey();
+            String accessString = (String) entry.getValue();
+            Access access = Parser.parseAccess(identity, accessString);
+            accessMap.put(identity, access);
         }
     }
 
-    private Properties props;
+    private static class Parser {
+        private final static int EOS = -1;  // pseudo-codepoint "end of string"
+        static {
+            assert !Character.isWhitespace(EOS);
+        }
+
+        private final String identity;  // just for better error messages
+        private final String s;  // the string we're parsing
+        private final int len;   // s.length()
+        private int i;
+        private int c;
+        // At any point, either c is s.codePointAt(i), or i == len and
+        // c is EOS.  We use int rather than char because it is conceivable
+        // (if unlikely) that a classname in a create clause might contain
+        // "supplementary characters", the ones that don't fit in the original
+        // 16 bits for Unicode.
+
+        private Parser(String identity, String s) {
+            this.identity = identity;
+            this.s = s;
+            this.len = s.length();
+            this.i = 0;
+            if (i < len)
+                this.c = s.codePointAt(i);
+            else
+                this.c = EOS;
+        }
+
+        static Access parseAccess(String identity, String s) {
+            return new Parser(identity, s).parseAccess();
+        }
+
+        private Access parseAccess() {
+            skipSpace();
+            String type = parseWord();
+            Access access;
+            if (type.equals(READONLY))
+                access = new Access(false, false, null);
+            else if (type.equals(READWRITE))
+                access = parseReadWrite();
+            else {
+                throw syntax("Expected " + READONLY + " or " + READWRITE +
+                        ": " + type);
+            }
+            if (c != EOS)
+                throw syntax("Extra text at end of line");
+            return access;
+        }
+
+        private Access parseReadWrite() {
+            List<String> createClasses = new ArrayList<String>();
+            boolean unregister = false;
+            while (true) {
+                skipSpace();
+                if (c == EOS)
+                    break;
+                String type = parseWord();
+                if (type.equals(UNREGISTER))
+                    unregister = true;
+                else if (type.equals(CREATE))
+                    parseCreate(createClasses);
+                else
+                    throw syntax("Unrecognized keyword " + type);
+            }
+            return new Access(true, unregister, createClasses);
+        }
+
+        private void parseCreate(List<String> createClasses) {
+            while (true) {
+                skipSpace();
+                createClasses.add(parseClassName());
+                skipSpace();
+                if (c == ',')
+                    next();
+                else
+                    break;
+            }
+        }
+
+        private String parseClassName() {
+            // We don't check that classname components begin with suitable
+            // characters (so we accept 1.2.3 for example).  This means that
+            // there are only two states, which we can call dotOK and !dotOK
+            // according as a dot (.) is legal or not.  Initially we're in
+            // !dotOK since a classname can't start with a dot; after a dot
+            // we're in !dotOK again; and after any other characters we're in
+            // dotOK.  The classname is only accepted if we end in dotOK,
+            // so we reject an empty name or a name that ends with a dot.
+            final int start = i;
+            boolean dotOK = false;
+            while (true) {
+                if (c == '.') {
+                    if (!dotOK)
+                        throw syntax("Bad . in class name");
+                    dotOK = false;
+                } else if (c == '*' || Character.isJavaIdentifierPart(c))
+                    dotOK = true;
+                else
+                    break;
+                next();
+            }
+            String className = s.substring(start, i);
+            if (!dotOK)
+                throw syntax("Bad class name " + className);
+            return className;
+        }
+
+        // Advance c and i to the next character, unless already at EOS.
+        private void next() {
+            if (c != EOS) {
+                i += Character.charCount(c);
+                if (i < len)
+                    c = s.codePointAt(i);
+                else
+                    c = EOS;
+            }
+        }
+
+        private void skipSpace() {
+            while (Character.isWhitespace(c))
+                next();
+        }
+
+        private String parseWord() {
+            skipSpace();
+            if (c == EOS)
+                throw syntax("Expected word at end of line");
+            final int start = i;
+            while (c != EOS && !Character.isWhitespace(c))
+                next();
+            String word = s.substring(start, i);
+            skipSpace();
+            return word;
+        }
+
+        private IllegalArgumentException syntax(String msg) {
+            return new IllegalArgumentException(
+                    msg + " [" + identity + " " + s + "]");
+        }
+    }
+
+    private Map<String, Access> accessMap;
     private Properties originalProps;
     private String accessFileName;
 }
--- a/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/LdapCtx.java	Sat Apr 18 14:10:27 2009 -0700
@@ -302,7 +302,16 @@
 
         schemaTrees = new Hashtable(11, 0.75f);
         initEnv();
-        connect(false);
+        try {
+            connect(false);
+        } catch (NamingException e) {
+            try {
+                close();
+            } catch (Exception e2) {
+                // Nothing
+            }
+            throw e;
+        }
     }
 
     LdapCtx(LdapCtx existing, String newDN) throws NamingException {
--- a/jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/com/sun/jndi/ldap/VersionHelper12.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 1999-2009 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -33,12 +33,33 @@
 
 final class VersionHelper12 extends VersionHelper {
 
+    // System property to control whether classes may be loaded from an
+    // arbitrary URL code base.
+    private static final String TRUST_URL_CODEBASE_PROPERTY =
+        "com.sun.jndi.ldap.object.trustURLCodebase";
+
+    // Determine whether classes may be loaded from an arbitrary URL code base.
+    private static final String trustURLCodebase =
+        AccessController.doPrivileged(
+            new PrivilegedAction<String>() {
+                public String run() {
+                    return System.getProperty(TRUST_URL_CODEBASE_PROPERTY,
+                            "false");
+                }
+            }
+        );
+
     VersionHelper12() {} // Disallow external from creating one of these.
 
     ClassLoader getURLClassLoader(String[] url)
         throws MalformedURLException {
             ClassLoader parent = getContextClassLoader();
-            if (url != null) {
+            /*
+             * Classes may only be loaded from an arbitrary URL code base when
+             * the system property com.sun.jndi.ldap.object.trustURLCodebase
+             * has been set to "true".
+             */
+            if (url != null && "true".equalsIgnoreCase(trustURLCodebase)) {
                 return URLClassLoader.newInstance(getUrlArray(url), parent);
             } else {
                 return parent;
--- a/jdk/src/share/classes/java/awt/Font.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/awt/Font.java	Sat Apr 18 14:10:27 2009 -0700
@@ -37,6 +37,8 @@
 import java.awt.peer.FontPeer;
 import java.io.*;
 import java.lang.ref.SoftReference;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
 import java.text.AttributedCharacterIterator.Attribute;
 import java.text.CharacterIterator;
 import java.text.StringCharacterIterator;
@@ -51,6 +53,7 @@
 import sun.font.AttributeValues;
 import sun.font.EAttribute;
 import sun.font.CompositeFont;
+import sun.font.CreatedFontTracker;
 import sun.font.Font2D;
 import sun.font.Font2DHandle;
 import sun.font.FontManager;
@@ -575,14 +578,16 @@
     }
 
     /* used to implement Font.createFont */
-    private Font(File fontFile, int fontFormat, boolean isCopy)
+    private Font(File fontFile, int fontFormat,
+                 boolean isCopy, CreatedFontTracker tracker)
         throws FontFormatException {
         this.createdFont = true;
         /* Font2D instances created by this method track their font file
          * so that when the Font2D is GC'd it can also remove the file.
          */
         this.font2DHandle =
-            FontManager.createFont2D(fontFile, fontFormat, isCopy).handle;
+            FontManager.createFont2D(fontFile, fontFormat,
+                                     isCopy, tracker).handle;
         this.name = this.font2DHandle.font2D.getFontName(Locale.getDefault());
         this.style = Font.PLAIN;
         this.size = 1;
@@ -788,6 +793,29 @@
     }
 
     /**
+     * Used with the byte count tracker for fonts created from streams.
+     * If a thread can create temp files anyway, no point in counting
+     * font bytes.
+     */
+    private static boolean hasTempPermission() {
+
+        if (System.getSecurityManager() == null) {
+            return true;
+        }
+        File f = null;
+        boolean hasPerm = false;
+        try {
+            f = File.createTempFile("+~JT", ".tmp", null);
+            f.delete();
+            f = null;
+            hasPerm = true;
+        } catch (Throwable t) {
+            /* inc. any kind of SecurityException */
+        }
+        return hasPerm;
+    }
+
+    /**
      * Returns a new <code>Font</code> using the specified font type
      * and input data.  The new <code>Font</code> is
      * created with a point size of 1 and style {@link #PLAIN PLAIN}.
@@ -822,58 +850,96 @@
             fontFormat != Font.TYPE1_FONT) {
             throw new IllegalArgumentException ("font format not recognized");
         }
-        final InputStream fStream = fontStream;
-        Object ret = java.security.AccessController.doPrivileged(
-           new java.security.PrivilegedAction() {
-              public Object run() {
-                  File tFile = null;
-                  FileOutputStream outStream = null;
-                  try {
-                      tFile = File.createTempFile("+~JF", ".tmp", null);
-                      /* Temp file deleted by font shutdown hook */
-                      BufferedInputStream inStream =
-                          new BufferedInputStream(fStream);
-                      outStream = new FileOutputStream(tFile);
-                      int bytesRead = 0;
-                      int bufSize = 8192;
-                      byte [] buf = new byte[bufSize];
-                      while (bytesRead != -1) {
-                          try {
-                              bytesRead = inStream.read(buf, 0, bufSize);
-                          } catch (Throwable t) {
-                              throw new IOException();
-                          }
-                          if (bytesRead != -1) {
-                              outStream.write(buf, 0, bytesRead);
-                          }
-                      }
-                      /* don't close the input stream */
-                      outStream.close();
-                  } catch (IOException e) {
-                      if (outStream != null) {
-                          try {
-                              outStream.close();
-                          } catch (Exception e1) {
-                          }
-                      }
-                      if (tFile != null) {
-                          try {
-                              tFile.delete();
-                          }  catch (Exception e2) {
-                          }
-                      }
-                      return e;
-                  }
-                  return tFile;
-              }
-          });
+        boolean copiedFontData = false;
+
+        try {
+            final File tFile = AccessController.doPrivileged(
+                new PrivilegedExceptionAction<File>() {
+                    public File run() throws IOException {
+                        return File.createTempFile("+~JF", ".tmp", null);
+                    }
+                }
+            );
 
-        if (ret instanceof File) {
-            return new Font((File)ret, fontFormat, true);
-        } else if (ret instanceof IOException) {
-            throw (IOException)ret;
-        } else {
-            throw new FontFormatException("Couldn't access font stream");
+            int totalSize = 0;
+            CreatedFontTracker tracker = null;
+            try {
+                final OutputStream outStream =
+                    AccessController.doPrivileged(
+                        new PrivilegedExceptionAction<OutputStream>() {
+                            public OutputStream run() throws IOException {
+                                return new FileOutputStream(tFile);
+                            }
+                        }
+                    );
+                if (!hasTempPermission()) {
+                    tracker = CreatedFontTracker.getTracker();
+                }
+                try {
+                    byte[] buf = new byte[8192];
+                    for (;;) {
+                        int bytesRead = fontStream.read(buf);
+                        if (bytesRead < 0) {
+                            break;
+                        }
+                        if (tracker != null) {
+                            if (totalSize+bytesRead > tracker.MAX_FILE_SIZE) {
+                                throw new IOException("File too big.");
+                            }
+                            if (totalSize+tracker.getNumBytes() >
+                                tracker.MAX_TOTAL_BYTES)
+                              {
+                                throw new IOException("Total files too big.");
+                            }
+                            totalSize += bytesRead;
+                            tracker.addBytes(bytesRead);
+                        }
+                        outStream.write(buf, 0, bytesRead);
+                    }
+                    /* don't close the input stream */
+                } finally {
+                    outStream.close();
+                }
+                /* After all references to a Font2D are dropped, the file
+                 * will be removed. To support long-lived AppContexts,
+                 * we need to then decrement the byte count by the size
+                 * of the file.
+                 * If the data isn't a valid font, the implementation will
+                 * delete the tmp file and decrement the byte count
+                 * in the tracker object before returning from the
+                 * constructor, so we can set 'copiedFontData' to true here
+                 * without waiting for the results of that constructor.
+                 */
+                copiedFontData = true;
+                Font font = new Font(tFile, fontFormat, true, tracker);
+                return font;
+            } finally {
+                if (!copiedFontData) {
+                    if (tracker != null) {
+                        tracker.subBytes(totalSize);
+                    }
+                    AccessController.doPrivileged(
+                        new PrivilegedExceptionAction<Void>() {
+                            public Void run() {
+                                tFile.delete();
+                                return null;
+                            }
+                        }
+                    );
+                }
+            }
+        } catch (Throwable t) {
+            if (t instanceof FontFormatException) {
+                throw (FontFormatException)t;
+            }
+            if (t instanceof IOException) {
+                throw (IOException)t;
+            }
+            Throwable cause = t.getCause();
+            if (cause instanceof FontFormatException) {
+                throw (FontFormatException)cause;
+            }
+            throw new IOException("Problem reading font data.");
         }
     }
 
@@ -913,6 +979,9 @@
      */
     public static Font createFont(int fontFormat, File fontFile)
         throws java.awt.FontFormatException, java.io.IOException {
+
+        fontFile = new File(fontFile.getPath());
+
         if (fontFormat != Font.TRUETYPE_FONT &&
             fontFormat != Font.TYPE1_FONT) {
             throw new IllegalArgumentException ("font format not recognized");
@@ -926,7 +995,7 @@
         if (!fontFile.canRead()) {
             throw new IOException("Can't read " + fontFile);
         }
-        return new Font(fontFile, fontFormat, false);
+        return new Font(fontFile, fontFormat, false, null);
     }
 
     /**
--- a/jdk/src/share/classes/java/lang/NoSuchFieldError.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/lang/NoSuchFieldError.java	Sat Apr 18 14:10:27 2009 -0700
@@ -41,14 +41,14 @@
     private static final long serialVersionUID = -3456430195886129035L;
 
     /**
-     * Constructs a <code>NoSuchFieldException</code> with no detail  message.
+     * Constructs a <code>NoSuchFieldError</code> with no detail message.
      */
     public NoSuchFieldError() {
         super();
     }
 
     /**
-     * Constructs a <code>NoSuchFieldException</code> with the specified
+     * Constructs a <code>NoSuchFieldError</code> with the specified
      * detail message.
      *
      * @param   s   the detail message.
--- a/jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/nio/ByteBufferAs-X-Buffer.java	Sat Apr 18 14:10:27 2009 -0700
@@ -196,10 +196,12 @@
 
         if ((start < 0) || (end > len) || (start > end))
             throw new IndexOutOfBoundsException();
-        int sublen = end - start;
-        int off = offset + ((pos + start) << $LG_BYTES_PER_VALUE$);
-        assert (off >= 0);
-        return new ByteBufferAsCharBuffer$RW$$BO$(bb, -1, 0, sublen, sublen, off);
+        return new ByteBufferAsCharBuffer$RW$$BO$(bb,
+                                                  -1,
+                                                  pos + start,
+                                                  pos + end,
+                                                  capacity(),
+                                                  offset);
     }
 
 #end[char]
--- a/jdk/src/share/classes/java/nio/Direct-X-Buffer.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/nio/Direct-X-Buffer.java	Sat Apr 18 14:10:27 2009 -0700
@@ -412,10 +412,12 @@
 
         if ((start < 0) || (end > len) || (start > end))
             throw new IndexOutOfBoundsException();
-        int sublen = end - start;
-        int off = (pos + start) << $LG_BYTES_PER_VALUE$;
-        assert (off >= 0);
-        return new DirectCharBuffer$RW$$BO$(this, -1, 0, sublen, sublen, off);
+        return new DirectCharBuffer$RW$$BO$(this,
+                                            -1,
+                                            pos + start,
+                                            pos + end,
+                                            capacity(),
+                                            offset);
     }
 
 #end[char]
--- a/jdk/src/share/classes/java/nio/Heap-X-Buffer.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/nio/Heap-X-Buffer.java	Sat Apr 18 14:10:27 2009 -0700
@@ -572,10 +572,13 @@
             || (end > length())
             || (start > end))
             throw new IndexOutOfBoundsException();
-        int len = end - start;
+        int pos = position();
         return new HeapCharBuffer$RW$(hb,
-                                      -1, 0, len, len,
-                                      offset + position() + start);
+                                      -1,
+                                      pos + start,
+                                      pos + end,
+                                      capacity(),
+                                      offset);
     }
 
 #end[char]
--- a/jdk/src/share/classes/java/nio/StringCharBuffer.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/nio/StringCharBuffer.java	Sat Apr 18 14:10:27 2009 -0700
@@ -102,10 +102,12 @@
     public final CharBuffer subSequence(int start, int end) {
         try {
             int pos = position();
-            return new StringCharBuffer(str, -1,
+            return new StringCharBuffer(str,
+                                        -1,
                                         pos + checkIndex(start, pos),
                                         pos + checkIndex(end, pos),
-                                        remaining(), offset);
+                                        capacity(),
+                                        offset);
         } catch (IllegalArgumentException x) {
             throw new IndexOutOfBoundsException();
         }
--- a/jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/nio/channels/AsynchronousDatagramChannel.java	Sat Apr 18 14:10:27 2009 -0700
@@ -443,7 +443,7 @@
      * at least care must be taken to ensure that the buffer is not accessed
      * while the channel remains open.
      *
-     * <p> If there is a security manager installed and the the channel is not
+     * <p> If there is a security manager installed and the channel is not
      * connected then this method verifies that the target address and port number
      * are permitted by the security manager's {@link SecurityManager#checkConnect
      * checkConnect} method.  The overhead of this security check can be avoided
--- a/jdk/src/share/classes/java/nio/file/Path.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/nio/file/Path.java	Sat Apr 18 14:10:27 2009 -0700
@@ -494,7 +494,7 @@
      * @throws  IOException
      *          if an I/O error occurs
      * @throws  SecurityException
-     *          In the case of the the default provider, and a security manager
+     *          In the case of the default provider, and a security manager
      *          is installed, it denies {@link LinkPermission}<tt>("symbolic")</tt>
      *          or its {@link SecurityManager#checkWrite(String) checkWrite}
      *          method denies write access to the path of the symbolic link.
@@ -531,7 +531,7 @@
      * @throws  IOException
      *          if an I/O error occurs
      * @throws  SecurityException
-     *          In the case of the the default provider, and a security manager
+     *          In the case of the default provider, and a security manager
      *          is installed, it denies {@link LinkPermission}<tt>("hard")</tt>
      *          or its {@link SecurityManager#checkWrite(String) checkWrite}
      *          method denies write access to both this path and the path of the
@@ -560,7 +560,7 @@
      * @throws  IOException
      *          if an I/O error occurs
      * @throws  SecurityException
-     *          In the case of the the default provider, and a security manager
+     *          In the case of the default provider, and a security manager
      *          is installed, it checks that {@code FilePermission} has been
      *          granted with the "{@code readlink}" action to read the link.
      */
@@ -615,7 +615,7 @@
      *          obtained
      *
      * @throws  SecurityException
-     *          In the case of the the default provider, and a security manager
+     *          In the case of the default provider, and a security manager
      *          is installed, the {@link #toAbsolutePath toAbsolutePath} method
      *          throws a security exception.
      */
@@ -636,7 +636,7 @@
      * @throws  IOError
      *          if an I/O error occurs
      * @throws  SecurityException
-     *          In the case of the the default provider, and a security manager
+     *          In the case of the default provider, and a security manager
      *          is installed, its {@link SecurityManager#checkPropertyAccess(String)
      *          checkPropertyAccess} method is invoked to check access to the
      *          system property {@code user.dir}
@@ -677,7 +677,7 @@
      * @throws  IOException
      *          if the file does not exist or an I/O error occurs
      * @throws  SecurityException
-     *          In the case of the the default provider, and a security manager
+     *          In the case of the default provider, and a security manager
      *          is installed, its {@link SecurityManager#checkRead(String) checkRead}
      *          method is invoked to check read access to the file, and where
      *          this path is not absolute, its {@link SecurityManager#checkPropertyAccess(String)
--- a/jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/nio/file/SecureDirectoryStream.java	Sat Apr 18 14:10:27 2009 -0700
@@ -208,7 +208,7 @@
      * @throws  ClosedDirectoryStreamException
      *          if the directory stream is closed
      * @throws  NoSuchFileException
-     *          if the the directory does not exist <i>(optional specific exception)</i>
+     *          if the directory does not exist <i>(optional specific exception)</i>
      * @throws  DirectoryNotEmptyException
      *          if the directory could not otherwise be deleted because it is
      *          not empty <i>(optional specific exception)</i>
--- a/jdk/src/share/classes/java/security/AccessController.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/security/AccessController.java	Sat Apr 18 14:10:27 2009 -0700
@@ -425,7 +425,7 @@
      * Performs the specified <code>PrivilegedExceptionAction</code> with
      * privileges enabled and restricted by the specified
      * <code>AccessControlContext</code>.  The action is performed with the
-     * intersection of the the permissions possessed by the caller's
+     * intersection of the permissions possessed by the caller's
      * protection domain, and those possessed by the domains represented by the
      * specified <code>AccessControlContext</code>.
      * <p>
--- a/jdk/src/share/classes/java/security/AlgorithmParametersSpi.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/security/AlgorithmParametersSpi.java	Sat Apr 18 14:10:27 2009 -0700
@@ -102,7 +102,7 @@
      * parameters should be returned in an instance of the
      * <code>DSAParameterSpec</code> class.
      *
-     * @param paramSpec the the specification class in which
+     * @param paramSpec the specification class in which
      * the parameters should be returned.
      *
      * @return the parameter specification.
--- a/jdk/src/share/classes/java/security/PrivilegedActionException.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/security/PrivilegedActionException.java	Sat Apr 18 14:10:27 2009 -0700
@@ -87,7 +87,7 @@
     }
 
     /**
-     * Returns the the cause of this exception (the exception thrown by
+     * Returns the cause of this exception (the exception thrown by
      * the privileged computation that resulted in this
      * <code>PrivilegedActionException</code>).
      *
--- a/jdk/src/share/classes/java/security/Security.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/security/Security.java	Sat Apr 18 14:10:27 2009 -0700
@@ -501,7 +501,7 @@
      * <li> <i>&lt;crypto_service>.&lt;algorithm_or_type>
      * &lt;attribute_name>:&lt attribute_value></i>
      * <p> The cryptographic service name must not contain any dots. There
-     * must be one or more space charaters between the the
+     * must be one or more space charaters between the
      * <i>&lt;algorithm_or_type></i> and the <i>&lt;attribute_name></i>.
      *  <p> A provider satisfies this selection criterion iff the
      * provider implements the specified algorithm or type for the specified
--- a/jdk/src/share/classes/java/security/SecurityPermission.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/security/SecurityPermission.java	Sat Apr 18 14:10:27 2009 -0700
@@ -118,7 +118,7 @@
  *   <td>setProperty.{key}</td>
  *   <td>Setting of the security property with the specified key</td>
  *   <td>This could include setting a security provider or defining
- * the location of the the system-wide security policy.  Malicious
+ * the location of the system-wide security policy.  Malicious
  * code that has permission to set a new security provider may
  * set a rogue provider that steals confidential information such
  * as cryptographic private keys. In addition, malicious code with
--- a/jdk/src/share/classes/java/security/SignatureSpi.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/security/SignatureSpi.java	Sat Apr 18 14:10:27 2009 -0700
@@ -316,7 +316,7 @@
      * overridden by a provider
      *
      * @exception InvalidAlgorithmParameterException if this method is
-     * overridden by a provider and the the given parameters
+     * overridden by a provider and the given parameters
      * are inappropriate for this signature engine
      */
     protected void engineSetParameter(AlgorithmParameterSpec params)
--- a/jdk/src/share/classes/java/security/cert/CertificateFactory.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/security/cert/CertificateFactory.java	Sat Apr 18 14:10:27 2009 -0700
@@ -460,7 +460,7 @@
      * {@link java.io.InputStream#reset() reset}, this method will
      * consume the entire input stream. Otherwise, each call to this
      * method consumes one CRL and the read position of the input stream
-     * is positioned to the next available byte after the the inherent
+     * is positioned to the next available byte after the inherent
      * end-of-CRL marker. If the data in the
      * input stream does not contain an inherent end-of-CRL marker (other
      * than EOF) and there is trailing data after the CRL is parsed, a
--- a/jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/security/cert/CertificateFactorySpi.java	Sat Apr 18 14:10:27 2009 -0700
@@ -88,7 +88,7 @@
      * {@link java.io.InputStream#reset() reset}, this method will
      * consume the entire input stream. Otherwise, each call to this
      * method consumes one certificate and the read position of the input stream
-     * is positioned to the next available byte after the the inherent
+     * is positioned to the next available byte after the inherent
      * end-of-certificate marker. If the data in the
      * input stream does not contain an inherent end-of-certificate marker (other
      * than EOF) and there is trailing data after the certificate is parsed, a
@@ -261,7 +261,7 @@
      * {@link java.io.InputStream#reset() reset}, this method will
      * consume the entire input stream. Otherwise, each call to this
      * method consumes one CRL and the read position of the input stream
-     * is positioned to the next available byte after the the inherent
+     * is positioned to the next available byte after the inherent
      * end-of-CRL marker. If the data in the
      * input stream does not contain an inherent end-of-CRL marker (other
      * than EOF) and there is trailing data after the CRL is parsed, a
--- a/jdk/src/share/classes/java/util/Calendar.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/util/Calendar.java	Sat Apr 18 14:10:27 2009 -0700
@@ -41,9 +41,14 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.io.OptionalDataException;
 import java.io.Serializable;
+import java.security.AccessControlContext;
 import java.security.AccessController;
+import java.security.PermissionCollection;
+import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
+import java.security.ProtectionDomain;
 import java.text.DateFormat;
 import java.text.DateFormatSymbols;
 import sun.util.BuddhistCalendar;
@@ -2628,6 +2633,18 @@
         }
     }
 
+    private static class CalendarAccessControlContext {
+        private static final AccessControlContext INSTANCE;
+        static {
+            RuntimePermission perm = new RuntimePermission("accessClassInPackage.sun.util.calendar");
+            PermissionCollection perms = perm.newPermissionCollection();
+            perms.add(perm);
+            INSTANCE = new AccessControlContext(new ProtectionDomain[] {
+                                                    new ProtectionDomain(null, perms)
+                                                });
+        }
+    }
+
     /**
      * Reconstitutes this object from a stream (i.e., deserialize it).
      */
@@ -2657,17 +2674,30 @@
         serialVersionOnStream = currentSerialVersion;
 
         // If there's a ZoneInfo object, use it for zone.
+        ZoneInfo zi = null;
         try {
-            ZoneInfo zi = (ZoneInfo) AccessController.doPrivileged(
-                new PrivilegedExceptionAction() {
-                    public Object run() throws Exception {
-                        return input.readObject();
-                    }
-                });
-            if (zi != null) {
-                zone = zi;
+            zi = AccessController.doPrivileged(
+                    new PrivilegedExceptionAction<ZoneInfo>() {
+                        public ZoneInfo run() throws Exception {
+                            return (ZoneInfo) input.readObject();
+                        }
+                    },
+                    CalendarAccessControlContext.INSTANCE);
+        } catch (PrivilegedActionException pae) {
+            Exception e = pae.getException();
+            if (!(e instanceof OptionalDataException)) {
+                if (e instanceof RuntimeException) {
+                    throw (RuntimeException) e;
+                } else if (e instanceof IOException) {
+                    throw (IOException) e;
+                } else if (e instanceof ClassNotFoundException) {
+                    throw (ClassNotFoundException) e;
+                }
+                throw new RuntimeException(e);
             }
-        } catch (Exception e) {
+        }
+        if (zi != null) {
+            zone = zi;
         }
 
         // If the deserialized object has a SimpleTimeZone, try to
@@ -2676,9 +2706,9 @@
         // implementation as much as possible.
         if (zone instanceof SimpleTimeZone) {
             String id = zone.getID();
-            TimeZone zi = TimeZone.getTimeZone(id);
-            if (zi != null && zi.hasSameRules(zone) && zi.getID().equals(id)) {
-                zone = zi;
+            TimeZone tz = TimeZone.getTimeZone(id);
+            if (tz != null && tz.hasSameRules(zone) && tz.getID().equals(id)) {
+                zone = tz;
             }
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/util/zip/ZipCoder.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package java.util.zip;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.CoderResult;
+import java.nio.charset.CodingErrorAction;
+import java.util.Arrays;
+
+/**
+ * Utility class for zipfile name and comment decoding and encoding
+ */
+
+final class ZipCoder {
+
+    String toString(byte[] ba, int length) {
+        CharsetDecoder cd = decoder().reset();
+        int len = (int)(length * cd.maxCharsPerByte());
+        char[] ca = new char[len];
+        if (len == 0)
+            return new String(ca);
+        ByteBuffer bb = ByteBuffer.wrap(ba, 0, length);
+        CharBuffer cb = CharBuffer.wrap(ca);
+        CoderResult cr = cd.decode(bb, cb, true);
+        if (!cr.isUnderflow())
+            throw new IllegalArgumentException(cr.toString());
+        cr = cd.flush(cb);
+        if (!cr.isUnderflow())
+            throw new IllegalArgumentException(cr.toString());
+        return new String(ca, 0, cb.position());
+    }
+
+    String toString(byte[] ba) {
+        return toString(ba, ba.length);
+    }
+
+    byte[] getBytes(String s) {
+        CharsetEncoder ce = encoder().reset();
+        char[] ca = s.toCharArray();
+        int len = (int)(ca.length * ce.maxBytesPerChar());
+        byte[] ba = new byte[len];
+        if (len == 0)
+            return ba;
+        ByteBuffer bb = ByteBuffer.wrap(ba);
+        CharBuffer cb = CharBuffer.wrap(ca);
+        CoderResult cr = ce.encode(cb, bb, true);
+        if (!cr.isUnderflow())
+            throw new IllegalArgumentException(cr.toString());
+        cr = ce.flush(bb);
+        if (!cr.isUnderflow())
+            throw new IllegalArgumentException(cr.toString());
+        if (bb.position() == ba.length)  // defensive copy?
+            return ba;
+        else
+            return Arrays.copyOf(ba, bb.position());
+    }
+
+    // assume invoked only if "this" is not utf8
+    byte[] getBytesUTF8(String s) {
+        if (isutf8)
+            return getBytes(s);
+        if (utf8 == null)
+            utf8 = new ZipCoder(Charset.forName("UTF-8"));
+        return utf8.getBytes(s);
+    }
+
+
+    String toStringUTF8(byte[] ba, int len) {
+        if (isutf8)
+            return toString(ba, len);
+        if (utf8 == null)
+            utf8 = new ZipCoder(Charset.forName("UTF-8"));
+        return utf8.toString(ba, len);
+    }
+
+    boolean isUTF8() {
+        return isutf8;
+    }
+
+    private Charset cs;
+    private CharsetDecoder dec;
+    private CharsetEncoder enc;
+    private boolean isutf8;
+    private ZipCoder utf8;
+
+    private ZipCoder(Charset cs) {
+        this.cs = cs;
+        this.isutf8 = cs.name().equals("UTF-8");
+    }
+
+    static ZipCoder get(Charset charset) {
+        return new ZipCoder(charset);
+    }
+
+    private CharsetDecoder decoder() {
+        if (dec == null) {
+            dec = cs.newDecoder()
+              .onMalformedInput(CodingErrorAction.REPORT)
+              .onUnmappableCharacter(CodingErrorAction.REPORT);
+        }
+        return dec;
+    }
+
+    private CharsetEncoder encoder() {
+        if (enc == null) {
+            enc = cs.newEncoder()
+              .onMalformedInput(CodingErrorAction.REPORT)
+              .onUnmappableCharacter(CodingErrorAction.REPORT);
+        }
+        return enc;
+    }
+}
--- a/jdk/src/share/classes/java/util/zip/ZipConstants64.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipConstants64.java	Sat Apr 18 14:10:27 2009 -0700
@@ -73,5 +73,12 @@
     static final int  ZIP64_EXTSIZ = 8;       // compressed size, 8-byte
     static final int  ZIP64_EXTLEN = 16;      // uncompressed size, 8-byte
 
+    /*
+     * Language encoding flag EFS
+     */
+    static final int EFS = 0x800;       // If this bit is set the filename and
+                                        // comment fields for this file must be
+                                        // encoded using UTF-8.
+
     private ZipConstants64() {}
 }
--- a/jdk/src/share/classes/java/util/zip/ZipEntry.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipEntry.java	Sat Apr 18 14:10:27 2009 -0700
@@ -40,6 +40,7 @@
     long size = -1;     // uncompressed size of entry data
     long csize = -1;    // compressed size of entry data
     int method = -1;    // compression method
+    int flag = 0;       // general purpose flag
     byte[] extra;       // optional extra field data for entry
     String comment;     // optional comment string for entry
 
@@ -53,13 +54,6 @@
      */
     public static final int DEFLATED = 8;
 
-    static {
-        /* Zip library is loaded from System.initializeSystemClass */
-        initIDs();
-    }
-
-    private static native void initIDs();
-
     /**
      * Creates a new zip entry with the specified name.
      *
@@ -90,28 +84,15 @@
         size = e.size;
         csize = e.csize;
         method = e.method;
+        flag = e.flag;
         extra = e.extra;
         comment = e.comment;
     }
 
     /*
-     * Creates a new zip entry for the given name with fields initialized
-     * from the specified jzentry data.
+     * Creates a new un-initialized zip entry
      */
-    ZipEntry(String name, long jzentry) {
-        this.name = name;
-        initFields(jzentry);
-    }
-
-    private native void initFields(long jzentry);
-
-    /*
-     * Creates a new zip entry with fields initialized from the specified
-     * jzentry data.
-     */
-    ZipEntry(long jzentry) {
-        initFields(jzentry);
-    }
+    ZipEntry() {}
 
     /**
      * Returns the name of the entry.
@@ -258,16 +239,16 @@
 
     /**
      * Sets the optional comment string for the entry.
+     *
+     * <p>ZIP entry comments have maximum length of 0xffff. If the length of the
+     * specified comment string is greater than 0xFFFF bytes after encoding, only
+     * the first 0xFFFF bytes are output to the ZIP file entry.
+     *
      * @param comment the comment string
-     * @exception IllegalArgumentException if the length of the specified
-     *            comment string is greater than 0xFFFF bytes
+     *
      * @see #getComment()
      */
     public void setComment(String comment) {
-        if (comment != null && comment.length() > 0xffff/3
-                    && ZipOutputStream.getUTF8Length(comment) > 0xffff) {
-            throw new IllegalArgumentException("invalid entry comment length");
-        }
         this.comment = comment;
     }
 
--- a/jdk/src/share/classes/java/util/zip/ZipFile.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipFile.java	Sat Apr 18 14:10:27 2009 -0700
@@ -29,9 +29,11 @@
 import java.io.IOException;
 import java.io.EOFException;
 import java.io.File;
+import java.nio.charset.Charset;
 import java.util.Vector;
 import java.util.Enumeration;
 import java.util.NoSuchElementException;
+import static java.util.zip.ZipConstants64.*;
 
 /**
  * This class is used to read entries from a zip file.
@@ -76,16 +78,19 @@
     /**
      * Opens a zip file for reading.
      *
-     * <p>First, if there is a security
-     * manager, its <code>checkRead</code> method
-     * is called with the <code>name</code> argument
-     * as its argument to ensure the read is allowed.
+     * <p>First, if there is a security manager, its <code>checkRead</code>
+     * method is called with the <code>name</code> argument as its argument
+     * to ensure the read is allowed.
+     *
+     * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used to
+     * decode the entry names and comments.
      *
      * @param name the name of the zip file
      * @throws ZipException if a ZIP format error has occurred
      * @throws IOException if an I/O error has occurred
      * @throws SecurityException if a security manager exists and its
      *         <code>checkRead</code> method doesn't allow read access to the file.
+     *
      * @see SecurityManager#checkRead(java.lang.String)
      */
     public ZipFile(String name) throws IOException {
@@ -101,6 +106,9 @@
      * method is called with the <code>name</code> argument as its argument to
      * ensure the read is allowed.
      *
+     * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used to
+     * decode the entry names and comments
+     *
      * @param file the ZIP file to be opened for reading
      * @param mode the mode in which the file is to be opened
      * @throws ZipException if a ZIP format error has occurred
@@ -115,6 +123,59 @@
      * @since 1.3
      */
     public ZipFile(File file, int mode) throws IOException {
+        this(file, mode, Charset.forName("UTF-8"));
+    }
+
+    /**
+     * Opens a ZIP file for reading given the specified File object.
+     *
+     * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used to
+     * decode the entry names and comments.
+     *
+     * @param file the ZIP file to be opened for reading
+     * @throws ZipException if a ZIP format error has occurred
+     * @throws IOException if an I/O error has occurred
+     */
+    public ZipFile(File file) throws ZipException, IOException {
+        this(file, OPEN_READ);
+    }
+
+    private ZipCoder zc;
+
+    /**
+     * Opens a new <code>ZipFile</code> to read from the specified
+     * <code>File</code> object in the specified mode.  The mode argument
+     * must be either <tt>OPEN_READ</tt> or <tt>OPEN_READ | OPEN_DELETE</tt>.
+     *
+     * <p>First, if there is a security manager, its <code>checkRead</code>
+     * method is called with the <code>name</code> argument as its argument to
+     * ensure the read is allowed.
+     *
+     * @param file the ZIP file to be opened for reading
+     * @param mode the mode in which the file is to be opened
+     * @param charset
+     *        the {@link java.nio.charset.Charset {@code charset}} to
+     *        be used to decode the ZIP entry name and comment that are not
+     *        encoded by using UTF-8 encoding (indicated by entry's general
+     *        purpose flag).
+     *
+     * @throws ZipException if a ZIP format error has occurred
+     * @throws IOException if an I/O error has occurred
+     *
+     * @throws SecurityException
+     *         if a security manager exists and its <code>checkRead</code>
+     *         method doesn't allow read access to the file,or its
+     *         <code>checkDelete</code> method doesn't allow deleting the
+     *         file when the <tt>OPEN_DELETE</tt> flag is set
+     *
+     * @throws IllegalArgumentException if the <tt>mode</tt> argument is invalid
+     *
+     * @see SecurityManager#checkRead(java.lang.String)
+     *
+     * @since 1.7
+     */
+    public ZipFile(File file, int mode, Charset charset) throws IOException
+    {
         if (((mode & OPEN_READ) == 0) ||
             ((mode & ~(OPEN_READ | OPEN_DELETE)) != 0)) {
             throw new IllegalArgumentException("Illegal mode: 0x"+
@@ -128,24 +189,61 @@
                 sm.checkDelete(name);
             }
         }
+        if (charset == null)
+            throw new NullPointerException("charset is null");
+        this.zc = ZipCoder.get(charset);
         jzfile = open(name, mode, file.lastModified());
-
         this.name = name;
         this.total = getTotal(jzfile);
     }
 
-    private static native long open(String name, int mode, long lastModified);
-    private static native int getTotal(long jzfile);
-
+    /**
+     * Opens a zip file for reading.
+     *
+     * <p>First, if there is a security manager, its <code>checkRead</code>
+     * method is called with the <code>name</code> argument as its argument
+     * to ensure the read is allowed.
+     *
+     * @param name the name of the zip file
+     * @param charset
+     *        the {@link java.nio.charset.Charset {@code charset}} to
+     *        be used to decode the ZIP entry name and comment that are not
+     *        encoded by using UTF-8 encoding (indicated by entry's general
+     *        purpose flag).
+     *
+     * @throws ZipException if a ZIP format error has occurred
+     * @throws IOException if an I/O error has occurred
+     * @throws SecurityException
+     *         if a security manager exists and its <code>checkRead</code>
+     *         method doesn't allow read access to the file
+     *
+     * @see SecurityManager#checkRead(java.lang.String)
+     *
+     * @since 1.7
+     */
+    public ZipFile(String name, Charset charset) throws IOException
+    {
+        this(new File(name), OPEN_READ, charset);
+    }
 
     /**
      * Opens a ZIP file for reading given the specified File object.
      * @param file the ZIP file to be opened for reading
-     * @throws ZipException if a ZIP error has occurred
+     * @param charset
+     *        The {@link java.nio.charset.Charset {@code charset}} to be
+     *        used to decode the ZIP entry name and comment (ignored if
+     *        the <a href="package-summary.html#lang_encoding"> language
+     *        encoding bit</a> of the ZIP entry's general purpose bit
+     *        flag is set).
+     *
+     * @throws ZipException if a ZIP format error has occurred
      * @throws IOException if an I/O error has occurred
+     *
+     * @since 1.7
      */
-    public ZipFile(File file) throws ZipException, IOException {
-        this(file, OPEN_READ);
+    public ZipFile(File file, Charset charset) throws IOException
+    {
+        this(file, OPEN_READ, charset);
     }
 
     /**
@@ -163,9 +261,9 @@
         long jzentry = 0;
         synchronized (this) {
             ensureOpen();
-            jzentry = getEntry(jzfile, name, true);
+            jzentry = getEntry(jzfile, zc.getBytes(name), true);
             if (jzentry != 0) {
-                ZipEntry ze = new ZipEntry(name, jzentry);
+                ZipEntry ze = getZipEntry(name, jzentry);
                 freeEntry(jzfile, jzentry);
                 return ze;
             }
@@ -173,7 +271,7 @@
         return null;
     }
 
-    private static native long getEntry(long jzfile, String name,
+    private static native long getEntry(long jzfile, byte[] name,
                                         boolean addSlash);
 
     // freeEntry releases the C jzentry struct.
@@ -194,36 +292,30 @@
      * @throws IllegalStateException if the zip file has been closed
      */
     public InputStream getInputStream(ZipEntry entry) throws IOException {
-        return getInputStream(entry.name);
-    }
-
-    /**
-     * Returns an input stream for reading the contents of the specified
-     * entry, or null if the entry was not found.
-     */
-    private InputStream getInputStream(String name) throws IOException {
-        if (name == null) {
-            throw new NullPointerException("name");
+        if (entry == null) {
+            throw new NullPointerException("entry");
         }
         long jzentry = 0;
         ZipFileInputStream in = null;
         synchronized (this) {
             ensureOpen();
-            jzentry = getEntry(jzfile, name, false);
+            if (!zc.isUTF8() && (entry.flag & EFS) != 0) {
+                jzentry = getEntry(jzfile, zc.getBytesUTF8(entry.name), false);
+            } else {
+                jzentry = getEntry(jzfile, zc.getBytes(entry.name), false);
+            }
             if (jzentry == 0) {
                 return null;
             }
-
             in = new ZipFileInputStream(jzentry);
-
         }
         final ZipFileInputStream zfin = in;
-        switch (getMethod(jzentry)) {
+        switch (getEntryMethod(jzentry)) {
         case STORED:
             return zfin;
         case DEFLATED:
             // MORE: Compute good size for inflater stream:
-            long size = getSize(jzentry) + 2; // Inflater likes a bit of slack
+            long size = getEntrySize(jzentry) + 2; // Inflater likes a bit of slack
             if (size > 65536) size = 8192;
             if (size <= 0) size = 4096;
             return new InflaterInputStream(zfin, getInflater(), (int)size) {
@@ -267,8 +359,6 @@
         }
     }
 
-    private static native int getMethod(long jzentry);
-
     /*
      * Gets an inflater from the list of available inflaters or allocates
      * a new one.
@@ -343,7 +433,7 @@
                                                ",\n message = " + message
                                 );
                         }
-                        ZipEntry ze = new ZipEntry(jzentry);
+                        ZipEntry ze = getZipEntry(null, jzentry);
                         freeEntry(jzfile, jzentry);
                         return ze;
                     }
@@ -351,6 +441,38 @@
             };
     }
 
+    private ZipEntry getZipEntry(String name, long jzentry) {
+        ZipEntry e = new ZipEntry();
+        e.flag = getEntryFlag(jzentry);  // get the flag first
+        if (name != null) {
+            e.name = name;
+        } else {
+            byte[] bname = getEntryBytes(jzentry, JZENTRY_NAME);
+            if (!zc.isUTF8() && (e.flag & EFS) != 0) {
+                e.name = zc.toStringUTF8(bname, bname.length);
+            } else {
+                e.name = zc.toString(bname, bname.length);
+            }
+        }
+        e.time = getEntryTime(jzentry);
+        e.crc = getEntryCrc(jzentry);
+        e.size = getEntrySize(jzentry);
+        e. csize = getEntryCSize(jzentry);
+        e.method = getEntryMethod(jzentry);
+        e.extra = getEntryBytes(jzentry, JZENTRY_EXTRA);
+        byte[] bcomm = getEntryBytes(jzentry, JZENTRY_COMMENT);
+        if (bcomm == null) {
+            e.comment = null;
+        } else {
+            if (!zc.isUTF8() && (e.flag & EFS) != 0) {
+                e.comment = zc.toStringUTF8(bcomm, bcomm.length);
+            } else {
+                e.comment = zc.toString(bcomm, bcomm.length);
+            }
+        }
+        return e;
+    }
+
     private static native long getNextEntry(long jzfile, int i);
 
     /**
@@ -443,8 +565,8 @@
 
         ZipFileInputStream(long jzentry) {
             pos = 0;
-            rem = getCSize(jzentry);
-            size = getSize(jzentry);
+            rem = getEntryCSize(jzentry);
+            size = getEntrySize(jzentry);
             this.jzentry = jzentry;
         }
 
@@ -514,13 +636,25 @@
 
     }
 
+
+    private static native long open(String name, int mode, long lastModified)
+        throws IOException;
+    private static native int getTotal(long jzfile);
     private static native int read(long jzfile, long jzentry,
                                    long pos, byte[] b, int off, int len);
 
-    private static native long getCSize(long jzentry);
+    // access to the native zentry object
+    private static native long getEntryTime(long jzentry);
+    private static native long getEntryCrc(long jzentry);
+    private static native long getEntryCSize(long jzentry);
+    private static native long getEntrySize(long jzentry);
+    private static native int getEntryMethod(long jzentry);
+    private static native int getEntryFlag(long jzentry);
 
-    private static native long getSize(long jzentry);
+    private static final int JZENTRY_NAME = 0;
+    private static final int JZENTRY_EXTRA = 1;
+    private static final int JZENTRY_COMMENT = 2;
+    private static native byte[] getEntryBytes(long jzentry, int type);
 
-    // Temporary add on for bug troubleshooting
     private static native String getZipMessage(long jzfile);
 }
--- a/jdk/src/share/classes/java/util/zip/ZipInputStream.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipInputStream.java	Sat Apr 18 14:10:27 2009 -0700
@@ -29,6 +29,7 @@
 import java.io.IOException;
 import java.io.EOFException;
 import java.io.PushbackInputStream;
+import java.nio.charset.Charset;
 import static java.util.zip.ZipConstants64.*;
 
 /**
@@ -54,6 +55,8 @@
     // one entry
     private boolean entryEOF = false;
 
+    private ZipCoder zc;
+
     /**
      * Check to make sure that this stream has not been closed
      */
@@ -65,14 +68,39 @@
 
     /**
      * Creates a new ZIP input stream.
+     *
+     * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used to
+     * decode the entry names.
+     *
      * @param in the actual input stream
      */
     public ZipInputStream(InputStream in) {
+        this(in, Charset.forName("UTF-8"));
+    }
+
+    /**
+     * Creates a new ZIP input stream.
+     *
+     * @param in the actual input stream
+     *
+     * @param charset
+     *        The {@link java.nio.charset.Charset {@code charset}} to be
+     *        used to decode the ZIP entry name (ignored if the
+     *        <a href="package-summary.html#lang_encoding"> language
+     *        encoding bit</a> of the ZIP entry's general purpose bit
+     *        flag is set).
+     *
+     * @since 1.7
+     */
+    public ZipInputStream(InputStream in, Charset charset) {
         super(new PushbackInputStream(in, 512), new Inflater(true), 512);
         usesDefaultInflater = true;
         if(in == null) {
             throw new NullPointerException("in is null");
         }
+        if (charset == null)
+            throw new NullPointerException("charset is null");
+        this.zc = ZipCoder.get(charset);
     }
 
     /**
@@ -141,8 +169,8 @@
      * @param len the maximum number of bytes read
      * @return the actual number of bytes read, or -1 if the end of the
      *         entry is reached
-     * @exception  NullPointerException If <code>b</code> is <code>null</code>.
-     * @exception  IndexOutOfBoundsException If <code>off</code> is negative,
+     * @exception  NullPointerException if <code>b</code> is <code>null</code>.
+     * @exception  IndexOutOfBoundsException if <code>off</code> is negative,
      * <code>len</code> is negative, or <code>len</code> is greater than
      * <code>b.length - off</code>
      * @exception ZipException if a ZIP file error has occurred
@@ -252,6 +280,8 @@
         if (get32(tmpbuf, 0) != LOCSIG) {
             return null;
         }
+        // get flag first, we need check EFS.
+        flag = get16(tmpbuf, LOCFLG);
         // get the entry name and create the ZipEntry first
         int len = get16(tmpbuf, LOCNAM);
         int blen = b.length;
@@ -262,9 +292,11 @@
             b = new byte[blen];
         }
         readFully(b, 0, len);
-        ZipEntry e = createZipEntry(getUTF8String(b, 0, len));
+        // Force to use UTF-8 if the EFS bit is ON, even the cs is NOT UTF-8
+        ZipEntry e = createZipEntry(((flag & EFS) != 0)
+                                    ? zc.toStringUTF8(b, len)
+                                    : zc.toString(b, len));
         // now get the remaining fields for the entry
-        flag = get16(tmpbuf, LOCFLG);
         if ((flag & 1) == 1) {
             throw new ZipException("encrypted ZIP entry not supported");
         }
@@ -313,71 +345,6 @@
         return e;
     }
 
-    /*
-     * Fetches a UTF8-encoded String from the specified byte array.
-     */
-    private static String getUTF8String(byte[] b, int off, int len) {
-        // First, count the number of characters in the sequence
-        int count = 0;
-        int max = off + len;
-        int i = off;
-        while (i < max) {
-            int c = b[i++] & 0xff;
-            switch (c >> 4) {
-            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
-                // 0xxxxxxx
-                count++;
-                break;
-            case 12: case 13:
-                // 110xxxxx 10xxxxxx
-                if ((b[i++] & 0xc0) != 0x80) {
-                    throw new IllegalArgumentException();
-                }
-                count++;
-                break;
-            case 14:
-                // 1110xxxx 10xxxxxx 10xxxxxx
-                if (((b[i++] & 0xc0) != 0x80) ||
-                    ((b[i++] & 0xc0) != 0x80)) {
-                    throw new IllegalArgumentException();
-                }
-                count++;
-                break;
-            default:
-                // 10xxxxxx, 1111xxxx
-                throw new IllegalArgumentException();
-            }
-        }
-        if (i != max) {
-            throw new IllegalArgumentException();
-        }
-        // Now decode the characters...
-        char[] cs = new char[count];
-        i = 0;
-        while (off < max) {
-            int c = b[off++] & 0xff;
-            switch (c >> 4) {
-            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
-                // 0xxxxxxx
-                cs[i++] = (char)c;
-                break;
-            case 12: case 13:
-                // 110xxxxx 10xxxxxx
-                cs[i++] = (char)(((c & 0x1f) << 6) | (b[off++] & 0x3f));
-                break;
-            case 14:
-                // 1110xxxx 10xxxxxx 10xxxxxx
-                int t = (b[off++] & 0x3f) << 6;
-                cs[i++] = (char)(((c & 0x0f) << 12) | t | (b[off++] & 0x3f));
-                break;
-            default:
-                // 10xxxxxx, 1111xxxx
-                throw new IllegalArgumentException();
-            }
-        }
-        return new String(cs, 0, count);
-    }
-
     /**
      * Creates a new <code>ZipEntry</code> object for the specified
      * entry name.
--- a/jdk/src/share/classes/java/util/zip/ZipOutputStream.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/util/zip/ZipOutputStream.java	Sat Apr 18 14:10:27 2009 -0700
@@ -27,6 +27,7 @@
 
 import java.io.OutputStream;
 import java.io.IOException;
+import java.nio.charset.Charset;
 import java.util.Vector;
 import java.util.HashSet;
 import static java.util.zip.ZipConstants64.*;
@@ -44,19 +45,9 @@
     private static class XEntry {
         public final ZipEntry entry;
         public final long offset;
-        public final int flag;
         public XEntry(ZipEntry entry, long offset) {
             this.entry = entry;
             this.offset = offset;
-            this.flag = (entry.method == DEFLATED &&
-                         (entry.size  == -1 ||
-                          entry.csize == -1 ||
-                          entry.crc   == -1))
-                // store size, compressed size, and crc-32 in data descriptor
-                // immediately following the compressed entry data
-                ? 8
-                // store size, compressed size, and crc-32 in LOC header
-                : 0;
         }
     }
 
@@ -66,12 +57,14 @@
     private CRC32 crc = new CRC32();
     private long written = 0;
     private long locoff = 0;
-    private String comment;
+    private byte[] comment;
     private int method = DEFLATED;
     private boolean finished;
 
     private boolean closed = false;
 
+    private final ZipCoder zc;
+
     private static int version(ZipEntry e) throws ZipException {
         switch (e.method) {
         case DEFLATED: return 20;
@@ -100,10 +93,31 @@
 
     /**
      * Creates a new ZIP output stream.
+     *
+     * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used
+     * to encode the entry names and comments.
+     *
      * @param out the actual output stream
      */
     public ZipOutputStream(OutputStream out) {
+        this(out, Charset.forName("UTF-8"));
+    }
+
+    /**
+     * Creates a new ZIP output stream.
+     *
+     * @param out the actual output stream
+     *
+     * @param charset the {@link java.nio.charset.Charset </code>charset<code>}
+     *                to be used to encode the entry names and comments
+     *
+     * @since 1.7
+     */
+    public ZipOutputStream(OutputStream out, Charset charset) {
         super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
+        if (charset == null)
+            throw new NullPointerException("charset is null");
+        this.zc = ZipCoder.get(charset);
         usesDefaultDeflater = true;
     }
 
@@ -114,11 +128,11 @@
      *            ZIP file comment is greater than 0xFFFF bytes
      */
     public void setComment(String comment) {
-        if (comment != null && comment.length() > 0xffff/3
-                                           && getUTF8Length(comment) > 0xffff) {
-            throw new IllegalArgumentException("ZIP file comment too long.");
+        if (comment != null) {
+            this.comment = zc.getBytes(comment);
+            if (this.comment.length > 0xffff)
+                throw new IllegalArgumentException("ZIP file comment too long.");
         }
-        this.comment = comment;
     }
 
     /**
@@ -167,8 +181,15 @@
         if (e.method == -1) {
             e.method = method;  // use default method
         }
+        // store size, compressed size, and crc-32 in LOC header
+        e.flag = 0;
         switch (e.method) {
         case DEFLATED:
+            // store size, compressed size, and crc-32 in data descriptor
+            // immediately following the compressed entry data
+            if (e.size  == -1 || e.csize == -1 || e.crc   == -1)
+                e.flag = 8;
+
             break;
         case STORED:
             // compressed size, uncompressed size, and crc-32 must all be
@@ -192,6 +213,8 @@
         if (! names.add(e.name)) {
             throw new ZipException("duplicate entry: " + e.name);
         }
+        if (zc.isUTF8())
+            e.flag |= EFS;
         current = new XEntry(e, written);
         xentries.add(current);
         writeLOC(current);
@@ -213,7 +236,7 @@
                 while (!def.finished()) {
                     deflate();
                 }
-                if ((current.flag & 8) == 0) {
+                if ((e.flag & 8) == 0) {
                     // verify size, compressed size, and crc-32 settings
                     if (e.size != def.getBytesRead()) {
                         throw new ZipException(
@@ -343,11 +366,11 @@
      */
     private void writeLOC(XEntry xentry) throws IOException {
         ZipEntry e = xentry.entry;
-        int flag = xentry.flag;
+        int flag = e.flag;
         int elen = (e.extra != null) ? e.extra.length : 0;
         boolean hasZip64 = false;
 
-        writeInt(LOCSIG);           // LOC header signature
+        writeInt(LOCSIG);               // LOC header signature
 
         if ((flag & 8) == 8) {
             writeShort(version(e));     // version needed to extract
@@ -380,7 +403,7 @@
                 writeInt(e.size);   // uncompressed size
             }
         }
-        byte[] nameBytes = getUTF8Bytes(e.name);
+        byte[] nameBytes = zc.getBytes(e.name);
         writeShort(nameBytes.length);
         writeShort(elen);
         writeBytes(nameBytes, 0, nameBytes.length);
@@ -417,7 +440,7 @@
      */
     private void writeCEN(XEntry xentry) throws IOException {
         ZipEntry e  = xentry.entry;
-        int flag = xentry.flag;
+        int flag = e.flag;
         int version = version(e);
 
         long csize = e.csize;
@@ -454,7 +477,7 @@
         writeInt(e.crc);            // crc-32
         writeInt(csize);            // compressed size
         writeInt(size);             // uncompressed size
-        byte[] nameBytes = getUTF8Bytes(e.name);
+        byte[] nameBytes = zc.getBytes(e.name);
         writeShort(nameBytes.length);
         if (hasZip64) {
             // + headid(2) + datasize(2)
@@ -464,8 +487,8 @@
         }
         byte[] commentBytes;
         if (e.comment != null) {
-            commentBytes = getUTF8Bytes(e.comment);
-            writeShort(commentBytes.length);
+            commentBytes = zc.getBytes(e.comment);
+            writeShort(Math.min(commentBytes.length, 0xffff));
         } else {
             commentBytes = null;
             writeShort(0);
@@ -489,7 +512,7 @@
             writeBytes(e.extra, 0, e.extra.length);
         }
         if (commentBytes != null) {
-            writeBytes(commentBytes, 0, commentBytes.length);
+            writeBytes(commentBytes, 0, Math.min(commentBytes.length, 0xffff));
         }
     }
 
@@ -541,9 +564,8 @@
         writeInt(xlen);                   // length of central directory
         writeInt(xoff);                   // offset of central directory
         if (comment != null) {            // zip file comment
-            byte[] b = getUTF8Bytes(comment);
-            writeShort(b.length);
-            writeBytes(b, 0, b.length);
+            writeShort(comment.length);
+            writeBytes(comment, 0, comment.length);
         } else {
             writeShort(0);
         }
@@ -594,60 +616,4 @@
         super.out.write(b, off, len);
         written += len;
     }
-
-    /*
-     * Returns the length of String's UTF8 encoding.
-     */
-    static int getUTF8Length(String s) {
-        int count = 0;
-        for (int i = 0; i < s.length(); i++) {
-            char ch = s.charAt(i);
-            if (ch <= 0x7f) {
-                count++;
-            } else if (ch <= 0x7ff) {
-                count += 2;
-            } else {
-                count += 3;
-            }
-        }
-        return count;
-    }
-
-    /*
-     * Returns an array of bytes representing the UTF8 encoding
-     * of the specified String.
-     */
-    private static byte[] getUTF8Bytes(String s) {
-        char[] c = s.toCharArray();
-        int len = c.length;
-        // Count the number of encoded bytes...
-        int count = 0;
-        for (int i = 0; i < len; i++) {
-            int ch = c[i];
-            if (ch <= 0x7f) {
-                count++;
-            } else if (ch <= 0x7ff) {
-                count += 2;
-            } else {
-                count += 3;
-            }
-        }
-        // Now return the encoded bytes...
-        byte[] b = new byte[count];
-        int off = 0;
-        for (int i = 0; i < len; i++) {
-            int ch = c[i];
-            if (ch <= 0x7f) {
-                b[off++] = (byte)ch;
-            } else if (ch <= 0x7ff) {
-                b[off++] = (byte)((ch >> 6) | 0xc0);
-                b[off++] = (byte)((ch & 0x3f) | 0x80);
-            } else {
-                b[off++] = (byte)((ch >> 12) | 0xe0);
-                b[off++] = (byte)(((ch >> 6) & 0x3f) | 0x80);
-                b[off++] = (byte)((ch & 0x3f) | 0x80);
-            }
-        }
-        return b;
-    }
 }
--- a/jdk/src/share/classes/java/util/zip/package.html	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/java/util/zip/package.html	Sat Apr 18 14:10:27 2009 -0700
@@ -53,6 +53,11 @@
       PKWARE ZIP File Format Specification</a>. The ZIP64(tm) format extensions
       are used to overcome the size limitations of the original ZIP format.
 <p>
+  <a name="lang_encoding">
+  <li>APPENDIX D of <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT">
+      PKWARE ZIP File Format Specification</a> - Language Encoding Flag (EFS) to
+      encode ZIP entry filename and comment fields using UTF-8.
+<p>
   <li><a href="http://www.isi.edu/in-notes/rfc1950.txt">
       ZLIB Compressed Data Format Specification version 3.3</a>
       &nbsp;
--- a/jdk/src/share/classes/javax/management/monitor/CounterMonitor.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/javax/management/monitor/CounterMonitor.java	Sat Apr 18 14:10:27 2009 -0700
@@ -599,7 +599,7 @@
      */
     @Override
     public MBeanNotificationInfo[] getNotificationInfo() {
-        return notifsInfo;
+        return notifsInfo.clone();
     }
 
     /*
--- a/jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/javax/management/monitor/GaugeMonitor.java	Sat Apr 18 14:10:27 2009 -0700
@@ -481,7 +481,7 @@
      */
     @Override
     public MBeanNotificationInfo[] getNotificationInfo() {
-        return notifsInfo;
+        return notifsInfo.clone();
     }
 
     /*
--- a/jdk/src/share/classes/javax/management/monitor/Monitor.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/javax/management/monitor/Monitor.java	Sat Apr 18 14:10:27 2009 -0700
@@ -32,7 +32,10 @@
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
+import java.security.ProtectionDomain;
 import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -163,7 +166,10 @@
     /**
      * AccessControlContext of the Monitor.start() caller.
      */
-    private AccessControlContext acc;
+    private static final AccessControlContext noPermissionsACC =
+            new AccessControlContext(
+            new ProtectionDomain[] {new ProtectionDomain(null, null)});
+    private volatile AccessControlContext acc = noPermissionsACC;
 
     /**
      * Scheduler Service.
@@ -173,14 +179,20 @@
             new DaemonThreadFactory("Scheduler"));
 
     /**
+     * Map containing the thread pool executor per thread group.
+     */
+    private static final Map<ThreadPoolExecutor, Void> executors =
+            new WeakHashMap<ThreadPoolExecutor, Void>();
+
+    /**
+     * Lock for executors map.
+     */
+    private static final Object executorsLock = new Object();
+
+    /**
      * Maximum Pool Size
      */
     private static final int maximumPoolSize;
-
-    /**
-     * Executor Service.
-     */
-    private static final ThreadPoolExecutor executor;
     static {
         final String maximumPoolSizeSysProp = "jmx.x.monitor.maximum.pool.size";
         final String maximumPoolSizeStr = AccessController.doPrivileged(
@@ -210,22 +222,9 @@
                 maximumPoolSize = maximumPoolSizeTmp;
             }
         }
-        executor = new ThreadPoolExecutor(
-                maximumPoolSize,
-                maximumPoolSize,
-                60L,
-                TimeUnit.SECONDS,
-                new LinkedBlockingQueue<Runnable>(),
-                new DaemonThreadFactory("Executor"));
-        executor.allowCoreThreadTimeOut(true);
     }
 
     /**
-     * Monitor task to be executed by the Executor Service.
-     */
-    private final MonitorTask monitorTask = new MonitorTask();
-
-    /**
      * Future associated to the current monitor task.
      */
     private Future<?> monitorFuture;
@@ -233,7 +232,7 @@
     /**
      * Scheduler task to be executed by the Scheduler Service.
      */
-    private final SchedulerTask schedulerTask = new SchedulerTask(monitorTask);
+    private final SchedulerTask schedulerTask = new SchedulerTask();
 
     /**
      * ScheduledFuture associated to the current scheduler task.
@@ -719,6 +718,7 @@
             // Start the scheduler.
             //
             cleanupFutures();
+            schedulerTask.setMonitorTask(new MonitorTask());
             schedulerFuture = scheduler.schedule(schedulerTask,
                                                  getGranularityPeriod(),
                                                  TimeUnit.MILLISECONDS);
@@ -748,7 +748,7 @@
 
             // Reset the AccessControlContext.
             //
-            acc = null;
+            acc = noPermissionsACC;
 
             // Reset the complex type attribute information
             // such that it is recalculated again.
@@ -1467,7 +1467,7 @@
      */
     private class SchedulerTask implements Runnable {
 
-        private Runnable task = null;
+        private MonitorTask task;
 
         /*
          * ------------------------------------------
@@ -1475,7 +1475,16 @@
          * ------------------------------------------
          */
 
-        public SchedulerTask(Runnable task) {
+        public SchedulerTask() {
+        }
+
+        /*
+         * ------------------------------------------
+         *  GETTERS/SETTERS
+         * ------------------------------------------
+         */
+
+        public void setMonitorTask(MonitorTask task) {
             this.task = task;
         }
 
@@ -1487,7 +1496,7 @@
 
         public void run() {
             synchronized (Monitor.this) {
-                Monitor.this.monitorFuture = executor.submit(task);
+                Monitor.this.monitorFuture = task.submit();
             }
         }
     }
@@ -1500,6 +1509,8 @@
      */
     private class MonitorTask implements Runnable {
 
+        private ThreadPoolExecutor executor;
+
         /*
          * ------------------------------------------
          *  CONSTRUCTORS
@@ -1507,6 +1518,38 @@
          */
 
         public MonitorTask() {
+            // Find out if there's already an existing executor for the calling
+            // thread and reuse it. Otherwise, create a new one and store it in
+            // the executors map. If there is a SecurityManager, the group of
+            // System.getSecurityManager() is used, else the group of the thread
+            // instantiating this MonitorTask, i.e. the group of the thread that
+            // calls "Monitor.start()".
+            SecurityManager s = System.getSecurityManager();
+            ThreadGroup group = (s != null) ? s.getThreadGroup() :
+                Thread.currentThread().getThreadGroup();
+            synchronized (executorsLock) {
+                for (ThreadPoolExecutor e : executors.keySet()) {
+                    DaemonThreadFactory tf =
+                            (DaemonThreadFactory) e.getThreadFactory();
+                    ThreadGroup tg = tf.getThreadGroup();
+                    if (tg == group) {
+                        executor = e;
+                        break;
+                    }
+                }
+                if (executor == null) {
+                    executor = new ThreadPoolExecutor(
+                            maximumPoolSize,
+                            maximumPoolSize,
+                            60L,
+                            TimeUnit.SECONDS,
+                            new LinkedBlockingQueue<Runnable>(),
+                            new DaemonThreadFactory("ThreadGroup<" +
+                            group.getName() + "> Executor", group));
+                    executor.allowCoreThreadTimeOut(true);
+                    executors.put(executor, null);
+                }
+            }
         }
 
         /*
@@ -1515,12 +1558,18 @@
          * ------------------------------------------
          */
 
+        public Future<?> submit() {
+            return executor.submit(this);
+        }
+
         public void run() {
             final ScheduledFuture<?> sf;
+            final AccessControlContext ac;
             synchronized (Monitor.this) {
                 sf = Monitor.this.schedulerFuture;
+                ac = Monitor.this.acc;
             }
-            AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            PrivilegedAction<Void> action = new PrivilegedAction<Void>() {
                 public Void run() {
                     if (Monitor.this.isActive()) {
                         final int an[] = alreadyNotifieds;
@@ -1533,7 +1582,11 @@
                     }
                     return null;
                 }
-            }, Monitor.this.acc);
+            };
+            if (ac == null) {
+                throw new SecurityException("AccessControlContext cannot be null");
+            }
+            AccessController.doPrivileged(action, ac);
             synchronized (Monitor.this) {
                 if (Monitor.this.isActive() &&
                     Monitor.this.schedulerFuture == sf) {
@@ -1573,6 +1626,15 @@
             namePrefix = "JMX Monitor " + poolName + " Pool [Thread-";
         }
 
+        public DaemonThreadFactory(String poolName, ThreadGroup threadGroup) {
+            group = threadGroup;
+            namePrefix = "JMX Monitor " + poolName + " Pool [Thread-";
+        }
+
+        public ThreadGroup getThreadGroup() {
+            return group;
+        }
+
         public Thread newThread(Runnable r) {
             Thread t = new Thread(group,
                                   r,
--- a/jdk/src/share/classes/javax/management/monitor/StringMonitor.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/javax/management/monitor/StringMonitor.java	Sat Apr 18 14:10:27 2009 -0700
@@ -184,6 +184,7 @@
      * @return The derived gauge of the specified object.
      *
      */
+    @Override
     public synchronized String getDerivedGauge(ObjectName object) {
         return (String) super.getDerivedGauge(object);
     }
@@ -199,6 +200,7 @@
      * @return The derived gauge timestamp of the specified object.
      *
      */
+    @Override
     public synchronized long getDerivedGaugeTimeStamp(ObjectName object) {
         return super.getDerivedGaugeTimeStamp(object);
     }
@@ -341,8 +343,9 @@
      * the Java class of the notification and the notification types sent by
      * the string monitor.
      */
+    @Override
     public MBeanNotificationInfo[] getNotificationInfo() {
-        return notifsInfo;
+        return notifsInfo.clone();
     }
 
     /*
--- a/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/javax/print/attribute/standard/MediaSize.java	Sat Apr 18 14:10:27 2009 -0700
@@ -123,8 +123,10 @@
         if (x > y) {
             throw new IllegalArgumentException("X dimension > Y dimension");
         }
-        mediaName = media;
-        mediaMap.put(mediaName, this);
+        if (media != null && mediaMap.get(media) == null) {
+            mediaName = media;
+            mediaMap.put(mediaName, this);
+        }
         sizeVector.add(this);
     }
 
@@ -147,8 +149,10 @@
         if (x > y) {
             throw new IllegalArgumentException("X dimension > Y dimension");
         }
-        mediaName = media;
-        mediaMap.put(mediaName, this);
+        if (media != null && mediaMap.get(media) == null) {
+            mediaName = media;
+            mediaMap.put(mediaName, this);
+        }
         sizeVector.add(this);
     }
 
--- a/jdk/src/share/classes/sun/awt/image/GifImageDecoder.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/awt/image/GifImageDecoder.java	Sat Apr 18 14:10:27 2009 -0700
@@ -585,9 +585,16 @@
             System.out.print("Reading a " + width + " by " + height + " " +
                       (interlace ? "" : "non-") + "interlaced image...");
         }
-
+        int initCodeSize = ExtractByte(block, 9);
+        if (initCodeSize >= 12) {
+            if (verbose) {
+                System.out.println("Invalid initial code size: " +
+                                   initCodeSize);
+            }
+            return false;
+        }
         boolean ret = parseImage(x, y, width, height,
-                                 interlace, ExtractByte(block, 9),
+                                 interlace, initCodeSize,
                                  block, rasline, model);
 
         if (!ret) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/font/CreatedFontTracker.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package sun.font;
+
+public class CreatedFontTracker {
+
+    public static final int MAX_FILE_SIZE = 32 * 1024 * 1024;
+    public static final int MAX_TOTAL_BYTES = 10 * MAX_FILE_SIZE;
+
+    static int numBytes;
+    static CreatedFontTracker tracker;
+
+    public static synchronized CreatedFontTracker getTracker() {
+        if (tracker == null) {
+            tracker = new CreatedFontTracker();
+        }
+        return tracker;
+    }
+
+    public synchronized int getNumBytes() {
+        return numBytes;
+    }
+
+    public synchronized void addBytes(int sz) {
+        numBytes += sz;
+    }
+
+    public synchronized void subBytes(int sz) {
+        numBytes -= sz;
+    }
+}
--- a/jdk/src/share/classes/sun/font/FileFont.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/font/FileFont.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -125,9 +125,9 @@
         return true;
     }
 
-    void setFileToRemove(File file) {
+    void setFileToRemove(File file, CreatedFontTracker tracker) {
         Disposer.addObjectRecord(this,
-                                 new CreatedFontFileDisposerRecord(file));
+                         new CreatedFontFileDisposerRecord(file, tracker));
     }
 
     /* This is called when a font scaler is determined to
@@ -246,12 +246,16 @@
         return getScaler().getUnitsPerEm();
     }
 
-    private static class CreatedFontFileDisposerRecord implements DisposerRecord {
+    private static class CreatedFontFileDisposerRecord
+        implements DisposerRecord {
 
         File fontFile = null;
+        CreatedFontTracker tracker;
 
-        private CreatedFontFileDisposerRecord(File file) {
+        private CreatedFontFileDisposerRecord(File file,
+                                              CreatedFontTracker tracker) {
             fontFile = file;
+            this.tracker = tracker;
         }
 
         public void dispose() {
@@ -260,6 +264,9 @@
                       public Object run() {
                           if (fontFile != null) {
                               try {
+                                  if (tracker != null) {
+                                      tracker.subBytes((int)fontFile.length());
+                                  }
                                   /* REMIND: is it possible that the file is
                                    * still open? It will be closed when the
                                    * font2D is disposed but could this code
--- a/jdk/src/share/classes/sun/font/FontManager.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/font/FontManager.java	Sat Apr 18 14:10:27 2009 -0700
@@ -2357,19 +2357,21 @@
     static Vector<File> tmpFontFiles = null;
 
     public static Font2D createFont2D(File fontFile, int fontFormat,
-                                      boolean isCopy)
+                                      boolean isCopy,
+                                      CreatedFontTracker tracker)
         throws FontFormatException {
 
         String fontFilePath = fontFile.getPath();
         FileFont font2D = null;
         final File fFile = fontFile;
+        final CreatedFontTracker _tracker = tracker;
         try {
             switch (fontFormat) {
             case Font.TRUETYPE_FONT:
                 font2D = new TrueTypeFont(fontFilePath, null, 0, true);
                 break;
             case Font.TYPE1_FONT:
-                font2D = new Type1Font(fontFilePath, null);
+                font2D = new Type1Font(fontFilePath, null, isCopy);
                 break;
             default:
                 throw new FontFormatException("Unrecognised Font Format");
@@ -2379,6 +2381,9 @@
                 java.security.AccessController.doPrivileged(
                      new java.security.PrivilegedAction() {
                           public Object run() {
+                              if (_tracker != null) {
+                                  _tracker.subBytes((int)fFile.length());
+                              }
                               fFile.delete();
                               return null;
                           }
@@ -2387,7 +2392,7 @@
             throw(e);
         }
         if (isCopy) {
-            font2D.setFileToRemove(fontFile);
+            font2D.setFileToRemove(fontFile, tracker);
             synchronized (FontManager.class) {
 
                 if (tmpFontFiles == null) {
--- a/jdk/src/share/classes/sun/font/TrueTypeFont.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/font/TrueTypeFont.java	Sat Apr 18 14:10:27 2009 -0700
@@ -175,8 +175,17 @@
         super(platname, nativeNames);
         useJavaRasterizer = javaRasterizer;
         fontRank = Font2D.TTF_RANK;
-        verify();
-        init(fIndex);
+        try {
+            verify();
+            init(fIndex);
+        } catch (Throwable t) {
+            close();
+            if (t instanceof FontFormatException) {
+                throw (FontFormatException)t;
+            } else {
+                throw new FontFormatException("Unexpected runtime exception.");
+            }
+        }
         Disposer.addObjectRecord(this, disposerRecord);
     }
 
--- a/jdk/src/share/classes/sun/font/Type1Font.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/font/Type1Font.java	Sat Apr 18 14:10:27 2009 -0700
@@ -39,6 +39,7 @@
 import java.nio.channels.ClosedChannelException;
 import java.nio.channels.FileChannel;
 import sun.java2d.Disposer;
+import sun.java2d.DisposerRecord;
 import java.util.HashSet;
 import java.util.HashMap;
 import java.awt.Font;
@@ -76,6 +77,27 @@
  */
 public class Type1Font extends FileFont {
 
+     private static class T1DisposerRecord  implements DisposerRecord {
+        String fileName = null;
+
+        T1DisposerRecord(String name) {
+            fileName = name;
+        }
+
+        public synchronized void dispose() {
+            java.security.AccessController.doPrivileged(
+                new java.security.PrivilegedAction() {
+                    public Object run() {
+
+                        if (fileName != null) {
+                            (new java.io.File(fileName)).delete();
+                        }
+                        return null;
+                    }
+             });
+        }
+    }
+
     WeakReference bufferRef = new WeakReference(null);
 
     private String psName = null;
@@ -125,18 +147,42 @@
 
 
     /**
+     * Constructs a Type1 Font.
+     * @param platname - Platform identifier of the font. Typically file name.
+     * @param nativeNames - Native names - typically XLFDs on Unix.
+     */
+    public Type1Font(String platname, Object nativeNames)
+        throws FontFormatException {
+
+        this(platname, nativeNames, false);
+    }
+
+    /**
      * - does basic verification of the file
      * - reads the names (full, family).
      * - determines the style of the font.
      * @throws FontFormatException - if the font can't be opened
      * or fails verification,  or there's no usable cmap
      */
-    public Type1Font(String platname, Object nativeNames)
+    public Type1Font(String platname, Object nativeNames, boolean createdCopy)
         throws FontFormatException {
         super(platname, nativeNames);
         fontRank = Font2D.TYPE1_RANK;
         checkedNatives = true;
-        verify();
+        try {
+            verify();
+        } catch (Throwable t) {
+            if (createdCopy) {
+                T1DisposerRecord ref = new T1DisposerRecord(platname);
+                Disposer.addObjectRecord(bufferRef, ref);
+                bufferRef = null;
+            }
+            if (t instanceof FontFormatException) {
+                throw (FontFormatException)t;
+            } else {
+                throw new FontFormatException("Unexpected runtime exception.");
+            }
+        }
     }
 
     private synchronized ByteBuffer getBuffer() throws FontFormatException {
--- a/jdk/src/share/classes/sun/io/ByteToCharBig5.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/io/ByteToCharBig5.java	Sat Apr 18 14:10:27 2009 -0700
@@ -26,6 +26,8 @@
 
 package sun.io;
 
+import sun.nio.cs.ext.Big5;
+
 /**
  * Tables and data to convert Big5 to Unicode
  *
@@ -34,2179 +36,16 @@
 
 public class ByteToCharBig5 extends ByteToCharDoubleByte {
 
+    private final static Big5 nioCoder = new Big5();
+
     public String getCharacterEncoding() {
         return "Big5";
     }
 
     public ByteToCharBig5() {
-        super.index1 = index1;
-        super.index2 = index2;
+        super.index1 = nioCoder.getDecoderIndex1();
+        super.index2 = nioCoder.getDecoderIndex2();
         start = 0x40;
         end = 0xFE;
     }
-
-    private final static String innerIndex0=
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u3000"+
-        "\uFF0C\u3001\u3002\uFF0E\u2022\uFF1B\uFF1A\uFF1F"+
-        "\uFF01\uFE30\u2026\u2025\uFE50\uFF64\uFE52\u00B7"+
-        "\uFE54\uFE55\uFE56\uFE57\uFF5C\u2013\uFE31\u2014"+
-        "\uFE33\uFF3F\uFE34\uFE4F\uFF08\uFF09\uFE35\uFE36"+
-        "\uFF5B\uFF5D\uFE37\uFE38\u3014\u3015\uFE39\uFE3A"+
-        "\u3010\u3011\uFE3B\uFE3C\u300A\u300B\uFE3D\uFE3E"+
-        "\u3008\u3009\uFE3F\uFE40\u300C\u300D\uFE41\uFE42"+
-        "\u300E\u300F\uFE43\uFE44\uFE59\uFE5A\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFE5B\uFE5C\uFE5D\uFE5E\u2018\u2019\u201C\u201D"+
-        "\u301D\u301E\u2035\u2032\uFF03\uFF06\uFF0A\u203B"+
-        "\u00A7\u3003\u25CB\u25CF\u25B3\u25B2\u25CE\u2606"+
-        "\u2605\u25C7\u25C6\u25A1\u25A0\u25BD\u25BC\u32A3"+
-        "\u2105\u203E\uFFFD\uFF3F\uFFFD\uFE49\uFE4A\uFE4D"+
-        "\uFE4E\uFE4B\uFE4C\uFE5F\uFE60\uFE61\uFF0B\uFF0D"+
-        "\u00D7\u00F7\u00B1\u221A\uFF1C\uFF1E\uFF1D\u2266"+
-        "\u2267\u2260\u221E\u2252\u2261\uFE62\uFE63\uFE64"+
-        "\uFE65\uFE66\u223C\u2229\u222A\u22A5\u2220\u221F"+
-        "\u22BF\u33D2\u33D1\u222B\u222E\u2235\u2234\u2640"+
-        "\u2642\u2641\u2609\u2191\u2193\u2190\u2192\u2196"+
-        "\u2197\u2199\u2198\u2225\u2223\u2571\u2572\uFF0F"+
-        "\uFF3C\uFF04\u00A5\u3012\u00A2\u00A3\uFF05\uFF20"+
-        "\u2103\u2109\uFE69\uFE6A\uFE6B\u33D5\u339C\u339D"+
-        "\u339E\u33CE\u33A1\u338E\u338F\u33C4\u00B0\u5159"+
-        "\u515B\u515E\u515D\u5161\u5163\u55E7\u74E9\u7CCE"+
-        "\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588"+
-        "\u258F\u258E\u258D\u258C\u258B\u258A\u2589\u253C"+
-        "\u2534\u252C\u2524\u251C\u2594\u2500\u2502\u2595"+
-        "\u250C\u2510\u2514\u2518\u256D\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u256E"+
-        "\u2570\u256F\u2550\u255E\u256A\u2561\u25E2\u25E3"+
-        "\u25E5\u25E4\u2571\u2572\u2573\uFF10\uFF11\uFF12"+
-        "\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\u2160"+
-        "\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168"+
-        "\u2169\u3021\u3022\u3023\u3024\u3025\u3026\u3027"+
-        "\u3028\u3029\u5341\u5344\u5345\uFF21\uFF22\uFF23"+
-        "\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B"+
-        "\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33"+
-        "\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A\uFF41"+
-        "\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49"+
-        "\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51"+
-        "\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59"+
-        "\uFF5A\u0391\u0392\u0393\u0394\u0395\u0396\u0397"+
-        "\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F"+
-        "\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8"+
-        "\u03A9\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7"+
-        "\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF"+
-        "\u03C0\u03C1\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8"+
-        "\u03C9\u3105\u3106\u3107\u3108\u3109\u310A\u310B"+
-        "\u310C\u310D\u310E\u310F\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u3110\u3111"+
-        "\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119"+
-        "\u311A\u311B\u311C\u311D\u311E\u311F\u3120\u3121"+
-        "\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129"+
-        "\u02D9\u02C9\u02CA\u02C7\u02CB\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u4E00\u4E59\u4E01\u4E03"+
-        "\u4E43\u4E5D\u4E86\u4E8C\u4EBA\u513F\u5165\u516B"+
-        "\u51E0\u5200\u5201\u529B\u5315\u5341\u535C\u53C8"+
-        "\u4E09\u4E0B\u4E08\u4E0A\u4E2B\u4E38\u51E1\u4E45"+
-        "\u4E48\u4E5F\u4E5E\u4E8E\u4EA1\u5140\u5203\u52FA"+
-        "\u5343\u53C9\u53E3\u571F\u58EB\u5915\u5927\u5973"+
-        "\u5B50\u5B51\u5B53\u5BF8\u5C0F\u5C22\u5C38\u5C71"+
-        "\u5DDD\u5DE5\u5DF1\u5DF2\u5DF3\u5DFE\u5E72\u5EFE"+
-        "\u5F0B\u5F13\u624D\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u4E11\u4E10\u4E0D"+
-        "\u4E2D\u4E30\u4E39\u4E4B\u5C39\u4E88\u4E91\u4E95"+
-        "\u4E92\u4E94\u4EA2\u4EC1\u4EC0\u4EC3\u4EC6\u4EC7"+
-        "\u4ECD\u4ECA\u4ECB\u4EC4\u5143\u5141\u5167\u516D"+
-        "\u516E\u516C\u5197\u51F6\u5206\u5207\u5208\u52FB"+
-        "\u52FE\u52FF\u5316\u5339\u5348\u5347\u5345\u535E"+
-        "\u5384\u53CB\u53CA\u53CD\u58EC\u5929\u592B\u592A"+
-        "\u592D\u5B54\u5C11\u5C24\u5C3A\u5C6F\u5DF4\u5E7B"+
-        "\u5EFF\u5F14\u5F15\u5FC3\u6208\u6236\u624B\u624E"+
-        "\u652F\u6587\u6597\u65A4\u65B9\u65E5\u66F0\u6708"+
-        "\u6728\u6B20\u6B62\u6B79\u6BCB\u6BD4\u6BDB\u6C0F"+
-        "\u6C34\u706B\u722A\u7236\u723B\u7247\u7259\u725B"+
-        "\u72AC\u738B\u4E19\u4E16\u4E15\u4E14\u4E18\u4E3B"+
-        "\u4E4D\u4E4F\u4E4E\u4EE5\u4ED8\u4ED4\u4ED5\u4ED6"+
-        "\u4ED7\u4EE3\u4EE4\u4ED9\u4EDE\u5145\u5144\u5189"+
-        "\u518A\u51AC\u51F9\u51FA\u51F8\u520A\u52A0\u529F"+
-        "\u5305\u5306\u5317\u531D\u4EDF\u534A\u5349\u5361"+
-        "\u5360\u536F\u536E\u53BB\u53EF\u53E4\u53F3\u53EC"+
-        "\u53EE\u53E9\u53E8\u53FC\u53F8\u53F5\u53EB\u53E6"+
-        "\u53EA\u53F2\u53F1\u53F0\u53E5\u53ED\u53FB\u56DB"+
-        "\u56DA\u5916\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u592E\u5931\u5974\u5976"+
-        "\u5B55\u5B83\u5C3C\u5DE8\u5DE7\u5DE6\u5E02\u5E03"+
-        "\u5E73\u5E7C\u5F01\u5F18\u5F17\u5FC5\u620A\u6253"+
-        "\u6254\u6252\u6251\u65A5\u65E6\u672E\u672C\u672A"+
-        "\u672B\u672D\u6B63\u6BCD\u6C11\u6C10\u6C38\u6C41"+
-        "\u6C40\u6C3E\u72AF\u7384\u7389\u74DC\u74E6\u7518"+
-        "\u751F\u7528\u7529\u7530\u7531\u7532\u7533\u758B"+
-        "\u767D\u76AE\u76BF\u76EE\u77DB\u77E2\u77F3\u793A"+
-        "\u79BE\u7A74\u7ACB\u4E1E\u4E1F\u4E52\u4E53\u4E69"+
-        "\u4E99\u4EA4\u4EA6\u4EA5\u4EFF\u4F09\u4F19\u4F0A"+
-        "\u4F15\u4F0D\u4F10\u4F11\u4F0F\u4EF2\u4EF6\u4EFB"+
-        "\u4EF0\u4EF3\u4EFD\u4F01\u4F0B\u5149\u5147\u5146"+
-        "\u5148\u5168\u5171\u518D\u51B0\u5217\u5211\u5212"+
-        "\u520E\u5216\u52A3\u5308\u5321\u5320\u5370\u5371"+
-        "\u5409\u540F\u540C\u540A\u5410\u5401\u540B\u5404"+
-        "\u5411\u540D\u5408\u5403\u540E\u5406\u5412\u56E0"+
-        "\u56DE\u56DD\u5733\u5730\u5728\u572D\u572C\u572F"+
-        "\u5729\u5919\u591A\u5937\u5938\u5984\u5978\u5983"+
-        "\u597D\u5979\u5982\u5981\u5B57\u5B58\u5B87\u5B88"+
-        "\u5B85\u5B89\u5BFA\u5C16\u5C79\u5DDE\u5E06\u5E76"+
-        "\u5E74\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u5F0F\u5F1B\u5FD9\u5FD6\u620E"+
-        "\u620C\u620D\u6210\u6263\u625B\u6258\u6536\u65E9"+
-        "\u65E8\u65EC\u65ED\u66F2\u66F3\u6709\u673D\u6734"+
-        "\u6731\u6735\u6B21\u6B64\u6B7B\u6C16\u6C5D\u6C57"+
-        "\u6C59\u6C5F\u6C60\u6C50\u6C55\u6C61\u6C5B\u6C4D"+
-        "\u6C4E\u7070\u725F\u725D\u767E\u7AF9\u7C73\u7CF8"+
-        "\u7F36\u7F8A\u7FBD\u8001\u8003\u800C\u8012\u8033"+
-        "\u807F\u8089\u808B\u808C\u81E3\u81EA\u81F3\u81FC"+
-        "\u820C\u821B\u821F\u826E\u8272\u827E\u866B\u8840"+
-        "\u884C\u8863\u897F\u9621\u4E32\u4EA8\u4F4D\u4F4F"+
-        "\u4F47\u4F57\u4F5E\u4F34\u4F5B\u4F55\u4F30\u4F50"+
-        "\u4F51\u4F3D\u4F3A\u4F38\u4F43\u4F54\u4F3C\u4F46"+
-        "\u4F63\u4F5C\u4F60\u4F2F\u4F4E\u4F36\u4F59\u4F5D"+
-        "\u4F48\u4F5A\u514C\u514B\u514D\u5175\u51B6\u51B7"+
-        "\u5225\u5224\u5229\u522A\u5228\u52AB\u52A9\u52AA"+
-        "\u52AC\u5323\u5373\u5375\u541D\u542D\u541E\u543E"+
-        "\u5426\u544E\u5427\u5446\u5443\u5433\u5448\u5442"+
-        "\u541B\u5429\u544A\u5439\u543B\u5438\u542E\u5435"+
-        "\u5436\u5420\u543C\u5440\u5431\u542B\u541F\u542C"+
-        "\u56EA\u56F0\u56E4\u56EB\u574A\u5751\u5740\u574D"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u5747\u574E\u573E\u5750\u574F\u573B"+
-        "\u58EF\u593E\u599D\u5992\u59A8\u599E\u59A3\u5999"+
-        "\u5996\u598D\u59A4\u5993\u598A\u59A5\u5B5D\u5B5C"+
-        "\u5B5A\u5B5B\u5B8C\u5B8B\u5B8F\u5C2C\u5C40\u5C41"+
-        "\u5C3F\u5C3E\u5C90\u5C91\u5C94\u5C8C\u5DEB\u5E0C"+
-        "\u5E8F\u5E87\u5E8A\u5EF7\u5F04\u5F1F\u5F64\u5F62"+
-        "\u5F77\u5F79\u5FD8\u5FCC\u5FD7\u5FCD\u5FF1\u5FEB"+
-        "\u5FF8\u5FEA\u6212\u6211\u6284\u6297\u6296\u6280"+
-        "\u6276\u6289\u626D\u628A\u627C\u627E\u6279\u6273"+
-        "\u6292\u626F\u6298\u626E\u6295\u6293\u6291\u6286"+
-        "\u6539\u653B\u6538\u65F1\u66F4\u675F\u674E\u674F"+
-        "\u6750\u6751\u675C\u6756\u675E\u6749\u6746\u6760"+
-        "\u6753\u6757\u6B65\u6BCF\u6C42\u6C5E\u6C99\u6C81"+
-        "\u6C88\u6C89\u6C85\u6C9B\u6C6A\u6C7A\u6C90\u6C70"+
-        "\u6C8C\u6C68\u6C96\u6C92\u6C7D\u6C83\u6C72\u6C7E"+
-        "\u6C74\u6C86\u6C76\u6C8D\u6C94\u6C98\u6C82\u7076"+
-        "\u707C\u707D\u7078\u7262\u7261\u7260\u72C4\u72C2"+
-        "\u7396\u752C\u752B\u7537\u7538\u7682\u76EF\u77E3"+
-        "\u79C1\u79C0\u79BF\u7A76\u7CFB\u7F55\u8096\u8093"+
-        "\u809D\u8098\u809B\u809A\u80B2\u826F\u8292\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u828B\u828D\u898B\u89D2\u8A00\u8C37\u8C46"+
-        "\u8C55\u8C9D\u8D64\u8D70\u8DB3\u8EAB\u8ECA\u8F9B"+
-        "\u8FB0\u8FC2\u8FC6\u8FC5\u8FC4\u5DE1\u9091\u90A2"+
-        "\u90AA\u90A6\u90A3\u9149\u91C6\u91CC\u9632\u962E"+
-        "\u9631\u962A\u962C\u4E26\u4E56\u4E73\u4E8B\u4E9B"+
-        "\u4E9E\u4EAB\u4EAC\u4F6F\u4F9D\u4F8D\u4F73\u4F7F"+
-        "\u4F6C\u4F9B\u4F8B\u4F86\u4F83\u4F70\u4F75\u4F88"+
-        "\u4F69\u4F7B\u4F96\u4F7E\u4F8F\u4F91\u4F7A\u5154"+
-        "\u5152\u5155\u5169\u5177\u5176\u5178\u51BD\u51FD"+
-        "\u523B\u5238\u5237\u523A\u5230\u522E\u5236\u5241"+
-        "\u52BE\u52BB\u5352\u5354\u5353\u5351\u5366\u5377"+
-        "\u5378\u5379\u53D6\u53D4\u53D7\u5473\u5475\u5496"+
-        "\u5478\u5495\u5480\u547B\u5477\u5484\u5492\u5486"+
-        "\u547C\u5490\u5471\u5476\u548C\u549A\u5462\u5468"+
-        "\u548B\u547D\u548E\u56FA\u5783\u5777\u576A\u5769"+
-        "\u5761\u5766\u5764\u577C\u591C\u5949\u5947\u5948"+
-        "\u5944\u5954\u59BE\u59BB\u59D4\u59B9\u59AE\u59D1"+
-        "\u59C6\u59D0\u59CD\u59CB\u59D3\u59CA\u59AF\u59B3"+
-        "\u59D2\u59C5\u5B5F\u5B64\u5B63\u5B97\u5B9A\u5B98"+
-        "\u5B9C\u5B99\u5B9B\u5C1A\u5C48\u5C45\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u5C46\u5CB7\u5CA1\u5CB8\u5CA9\u5CAB\u5CB1\u5CB3"+
-        "\u5E18\u5E1A\u5E16\u5E15\u5E1B\u5E11\u5E78\u5E9A"+
-        "\u5E97\u5E9C\u5E95\u5E96\u5EF6\u5F26\u5F27\u5F29"+
-        "\u5F80\u5F81\u5F7F\u5F7C\u5FDD\u5FE0\u5FFD\u5FF5"+
-        "\u5FFF\u600F\u6014\u602F\u6035\u6016\u602A\u6015"+
-        "\u6021\u6027\u6029\u602B\u601B\u6216\u6215\u623F"+
-        "\u623E\u6240\u627F\u62C9\u62CC\u62C4\u62BF\u62C2"+
-        "\u62B9\u62D2\u62DB\u62AB\u62D3\u62D4\u62CB\u62C8"+
-        "\u62A8\u62BD\u62BC\u62D0\u62D9\u62C7\u62CD\u62B5"+
-        "\u62DA\u62B1\u62D8\u62D6\u62D7\u62C6\u62AC\u62CE"+
-        "\u653E\u65A7\u65BC\u65FA\u6614\u6613\u660C\u6606"+
-        "\u6602\u660E\u6600\u660F\u6615\u660A\u6607\u670D"+
-        "\u670B\u676D\u678B\u6795\u6771\u679C\u6773\u6777"+
-        "\u6787\u679D\u6797\u676F\u6770\u677F\u6789\u677E"+
-        "\u6790\u6775\u679A\u6793\u677C\u676A\u6772\u6B23"+
-        "\u6B66\u6B67\u6B7F\u6C13\u6C1B\u6CE3\u6CE8\u6CF3"+
-        "\u6CB1\u6CCC\u6CE5\u6CB3\u6CBD\u6CBE\u6CBC\u6CE2"+
-        "\u6CAB\u6CD5\u6CD3\u6CB8\u6CC4\u6CB9\u6CC1\u6CAE"+
-        "\u6CD7\u6CC5\u6CF1\u6CBF\u6CBB\u6CE1\u6CDB\u6CCA"+
-        "\u6CAC\u6CEF\u6CDC\u6CD6\u6CE0\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7095"+
-        "\u708E\u7092\u708A\u7099\u722C\u722D\u7238\u7248"+
-        "\u7267\u7269\u72C0\u72CE\u72D9\u72D7\u72D0\u73A9"+
-        "\u73A8\u739F\u73AB\u73A5\u753D\u759D\u7599\u759A"+
-        "\u7684\u76C2\u76F2\u76F4\u77E5\u77FD\u793E\u7940"+
-        "\u7941\u79C9\u79C8\u7A7A\u7A79\u7AFA\u7CFE\u7F54"+
-        "\u7F8C\u7F8B\u8005\u80BA\u80A5\u80A2\u80B1\u80A1"+
-        "\u80AB\u80A9\u80B4\u80AA\u80AF\u81E5\u81FE\u820D"+
-        "\u82B3\u829D\u8299\u82AD\u82BD\u829F\u82B9\u82B1"+
-        "\u82AC\u82A5\u82AF\u82B8\u82A3\u82B0\u82BE\u82B7"+
-        "\u864E\u8671\u521D\u8868\u8ECB\u8FCE\u8FD4\u8FD1"+
-        "\u90B5\u90B8\u90B1\u90B6\u91C7\u91D1\u9577\u9580"+
-        "\u961C\u9640\u963F\u963B\u9644\u9642\u96B9\u96E8"+
-        "\u9752\u975E\u4E9F\u4EAD\u4EAE\u4FE1\u4FB5\u4FAF"+
-        "\u4FBF\u4FE0\u4FD1\u4FCF\u4FDD\u4FC3\u4FB6\u4FD8"+
-        "\u4FDF\u4FCA\u4FD7\u4FAE\u4FD0\u4FC4\u4FC2\u4FDA"+
-        "\u4FCE\u4FDE\u4FB7\u5157\u5192\u5191\u51A0\u524E"+
-        "\u5243\u524A\u524D\u524C\u524B\u5247\u52C7\u52C9"+
-        "\u52C3\u52C1\u530D\u5357\u537B\u539A\u53DB\u54AC"+
-        "\u54C0\u54A8\u54CE\u54C9\u54B8\u54A6\u54B3\u54C7"+
-        "\u54C2\u54BD\u54AA\u54C1\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u54C4\u54C8"+
-        "\u54AF\u54AB\u54B1\u54BB\u54A9\u54A7\u54BF\u56FF"+
-        "\u5782\u578B\u57A0\u57A3\u57A2\u57CE\u57AE\u5793"+
-        "\u5955\u5951\u594F\u594E\u5950\u59DC\u59D8\u59FF"+
-        "\u59E3\u59E8\u5A03\u59E5\u59EA\u59DA\u59E6\u5A01"+
-        "\u59FB\u5B69\u5BA3\u5BA6\u5BA4\u5BA2\u5BA5\u5C01"+
-        "\u5C4E\u5C4F\u5C4D\u5C4B\u5CD9\u5CD2\u5DF7\u5E1D"+
-        "\u5E25\u5E1F\u5E7D\u5EA0\u5EA6\u5EFA\u5F08\u5F2D"+
-        "\u5F65\u5F88\u5F85\u5F8A\u5F8B\u5F87\u5F8C\u5F89"+
-        "\u6012\u601D\u6020\u6025\u600E\u6028\u604D\u6070"+
-        "\u6068\u6062\u6046\u6043\u606C\u606B\u606A\u6064"+
-        "\u6241\u62DC\u6316\u6309\u62FC\u62ED\u6301\u62EE"+
-        "\u62FD\u6307\u62F1\u62F7\u62EF\u62EC\u62FE\u62F4"+
-        "\u6311\u6302\u653F\u6545\u65AB\u65BD\u65E2\u6625"+
-        "\u662D\u6620\u6627\u662F\u661F\u6628\u6631\u6624"+
-        "\u66F7\u67FF\u67D3\u67F1\u67D4\u67D0\u67EC\u67B6"+
-        "\u67AF\u67F5\u67E9\u67EF\u67C4\u67D1\u67B4\u67DA"+
-        "\u67E5\u67B8\u67CF\u67DE\u67F3\u67B0\u67D9\u67E2"+
-        "\u67DD\u67D2\u6B6A\u6B83\u6B86\u6BB5\u6BD2\u6BD7"+
-        "\u6C1F\u6CC9\u6D0B\u6D32\u6D2A\u6D41\u6D25\u6D0C"+
-        "\u6D31\u6D1E\u6D17\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6D3B\u6D3D\u6D3E"+
-        "\u6D36\u6D1B\u6CF5\u6D39\u6D27\u6D38\u6D29\u6D2E"+
-        "\u6D35\u6D0E\u6D2B\u70AB\u70BA\u70B3\u70AC\u70AF"+
-        "\u70AD\u70B8\u70AE\u70A4\u7230\u7272\u726F\u7274"+
-        "\u72E9\u72E0\u72E1\u73B7\u73CA\u73BB\u73B2\u73CD"+
-        "\u73C0\u73B3\u751A\u752D\u754F\u754C\u754E\u754B"+
-        "\u75AB\u75A4\u75A5\u75A2\u75A3\u7678\u7686\u7687"+
-        "\u7688\u76C8\u76C6\u76C3\u76C5\u7701\u76F9\u76F8"+
-        "\u7709\u770B\u76FE\u76FC\u7707\u77DC\u7802\u7814"+
-        "\u780C\u780D\u7946\u7949\u7948\u7947\u79B9\u79BA"+
-        "\u79D1\u79D2\u79CB\u7A7F\u7A81\u7AFF\u7AFD\u7C7D"+
-        "\u7D02\u7D05\u7D00\u7D09\u7D07\u7D04\u7D06\u7F38"+
-        "\u7F8E\u7FBF\u8004\u8010\u800D\u8011\u8036\u80D6"+
-        "\u80E5\u80DA\u80C3\u80C4\u80CC\u80E1\u80DB\u80CE"+
-        "\u80DE\u80E4\u80DD\u81F4\u8222\u82E7\u8303\u8305"+
-        "\u82E3\u82DB\u82E6\u8304\u82E5\u8302\u8309\u82D2"+
-        "\u82D7\u82F1\u8301\u82DC\u82D4\u82D1\u82DE\u82D3"+
-        "\u82DF\u82EF\u8306\u8650\u8679\u867B\u867A\u884D"+
-        "\u886B\u8981\u89D4\u8A08\u8A02\u8A03\u8C9E\u8CA0"+
-        "\u8D74\u8D73\u8DB4\u8ECD\u8ECC\u8FF0\u8FE6\u8FE2"+
-        "\u8FEA\u8FE5\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u8FED\u8FEB\u8FE4\u8FE8"+
-        "\u90CA\u90CE\u90C1\u90C3\u914B\u914A\u91CD\u9582"+
-        "\u9650\u964B\u964C\u964D\u9762\u9769\u97CB\u97ED"+
-        "\u97F3\u9801\u98A8\u98DB\u98DF\u9996\u9999\u4E58"+
-        "\u4EB3\u500C\u500D\u5023\u4FEF\u5026\u5025\u4FF8"+
-        "\u5029\u5016\u5006\u503C\u501F\u501A\u5012\u5011"+
-        "\u4FFA\u5000\u5014\u5028\u4FF1\u5021\u500B\u5019"+
-        "\u5018\u4FF3\u4FEE\u502D\u502A\u4FFE\u502B\u5009"+
-        "\u517C\u51A4\u51A5\u51A2\u51CD\u51CC\u51C6\u51CB"+
-        "\u5256\u525C\u5254\u525B\u525D\u532A\u537F\u539F"+
-        "\u539D\u53DF\u54E8\u5510\u5501\u5537\u54FC\u54E5"+
-        "\u54F2\u5506\u54FA\u5514\u54E9\u54ED\u54E1\u5509"+
-        "\u54EE\u54EA\u54E6\u5527\u5507\u54FD\u550F\u5703"+
-        "\u5704\u57C2\u57D4\u57CB\u57C3\u5809\u590F\u5957"+
-        "\u5958\u595A\u5A11\u5A18\u5A1C\u5A1F\u5A1B\u5A13"+
-        "\u59EC\u5A20\u5A23\u5A29\u5A25\u5A0C\u5A09\u5B6B"+
-        "\u5C58\u5BB0\u5BB3\u5BB6\u5BB4\u5BAE\u5BB5\u5BB9"+
-        "\u5BB8\u5C04\u5C51\u5C55\u5C50\u5CED\u5CFD\u5CFB"+
-        "\u5CEA\u5CE8\u5CF0\u5CF6\u5D01\u5CF4\u5DEE\u5E2D"+
-        "\u5E2B\u5EAB\u5EAD\u5EA7\u5F31\u5F92\u5F91\u5F90"+
-        "\u6059\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u6063\u6065\u6050\u6055\u606D"+
-        "\u6069\u606F\u6084\u609F\u609A\u608D\u6094\u608C"+
-        "\u6085\u6096\u6247\u62F3\u6308\u62FF\u634E\u633E"+
-        "\u632F\u6355\u6342\u6346\u634F\u6349\u633A\u6350"+
-        "\u633D\u632A\u632B\u6328\u634D\u634C\u6548\u6549"+
-        "\u6599\u65C1\u65C5\u6642\u6649\u664F\u6643\u6652"+
-        "\u664C\u6645\u6641\u66F8\u6714\u6715\u6717\u6821"+
-        "\u6838\u6848\u6846\u6853\u6839\u6842\u6854\u6829"+
-        "\u68B3\u6817\u684C\u6851\u683D\u67F4\u6850\u6840"+
-        "\u683C\u6843\u682A\u6845\u6813\u6818\u6841\u6B8A"+
-        "\u6B89\u6BB7\u6C23\u6C27\u6C28\u6C26\u6C24\u6CF0"+
-        "\u6D6A\u6D95\u6D88\u6D87\u6D66\u6D78\u6D77\u6D59"+
-        "\u6D93\u6D6C\u6D89\u6D6E\u6D5A\u6D74\u6D69\u6D8C"+
-        "\u6D8A\u6D79\u6D85\u6D65\u6D94\u70CA\u70D8\u70E4"+
-        "\u70D9\u70C8\u70CF\u7239\u7279\u72FC\u72F9\u72FD"+
-        "\u72F8\u72F7\u7386\u73ED\u7409\u73EE\u73E0\u73EA"+
-        "\u73DE\u7554\u755D\u755C\u755A\u7559\u75BE\u75C5"+
-        "\u75C7\u75B2\u75B3\u75BD\u75BC\u75B9\u75C2\u75B8"+
-        "\u768B\u76B0\u76CA\u76CD\u76CE\u7729\u771F\u7720"+
-        "\u7728\u77E9\u7830\u7827\u7838\u781D\u7834\u7837"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u7825\u782D\u7820\u781F\u7832\u7955"+
-        "\u7950\u7960\u795F\u7956\u795E\u795D\u7957\u795A"+
-        "\u79E4\u79E3\u79E7\u79DF\u79E6\u79E9\u79D8\u7A84"+
-        "\u7A88\u7AD9\u7B06\u7B11\u7C89\u7D21\u7D17\u7D0B"+
-        "\u7D0A\u7D20\u7D22\u7D14\u7D10\u7D15\u7D1A\u7D1C"+
-        "\u7D0D\u7D19\u7D1B\u7F3A\u7F5F\u7F94\u7FC5\u7FC1"+
-        "\u8006\u8018\u8015\u8019\u8017\u803D\u803F\u80F1"+
-        "\u8102\u80F0\u8105\u80ED\u80F4\u8106\u80F8\u80F3"+
-        "\u8108\u80FD\u810A\u80FC\u80EF\u81ED\u81EC\u8200"+
-        "\u8210\u822A\u822B\u8228\u822C\u82BB\u832B\u8352"+
-        "\u8354\u834A\u8338\u8350\u8349\u8335\u8334\u834F"+
-        "\u8332\u8339\u8336\u8317\u8340\u8331\u8328\u8343";
-
-    private final static String innerIndex1=
-        "\u8654\u868A\u86AA\u8693\u86A4\u86A9\u868C\u86A3"+
-        "\u869C\u8870\u8877\u8881\u8882\u887D\u8879\u8A18"+
-        "\u8A10\u8A0E\u8A0C\u8A15\u8A0A\u8A17\u8A13\u8A16"+
-        "\u8A0F\u8A11\u8C48\u8C7A\u8C79\u8CA1\u8CA2\u8D77"+
-        "\u8EAC\u8ED2\u8ED4\u8ECF\u8FB1\u9001\u9006\u8FF7"+
-        "\u9000\u8FFA\u8FF4\u9003\u8FFD\u9005\u8FF8\u9095"+
-        "\u90E1\u90DD\u90E2\u9152\u914D\u914C\u91D8\u91DD"+
-        "\u91D7\u91DC\u91D9\u9583\u9662\u9663\u9661\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u965B\u965D\u9664\u9658\u965E\u96BB\u98E2"+
-        "\u99AC\u9AA8\u9AD8\u9B25\u9B32\u9B3C\u4E7E\u507A"+
-        "\u507D\u505C\u5047\u5043\u504C\u505A\u5049\u5065"+
-        "\u5076\u504E\u5055\u5075\u5074\u5077\u504F\u500F"+
-        "\u506F\u506D\u515C\u5195\u51F0\u526A\u526F\u52D2"+
-        "\u52D9\u52D8\u52D5\u5310\u530F\u5319\u533F\u5340"+
-        "\u533E\u53C3\u66FC\u5546\u556A\u5566\u5544\u555E"+
-        "\u5561\u5543\u554A\u5531\u5556\u554F\u5555\u552F"+
-        "\u5564\u5538\u552E\u555C\u552C\u5563\u5533\u5541"+
-        "\u5557\u5708\u570B\u5709\u57DF\u5805\u580A\u5806"+
-        "\u57E0\u57E4\u57FA\u5802\u5835\u57F7\u57F9\u5920"+
-        "\u5962\u5A36\u5A41\u5A49\u5A66\u5A6A\u5A40\u5A3C"+
-        "\u5A62\u5A5A\u5A46\u5A4A\u5B70\u5BC7\u5BC5\u5BC4"+
-        "\u5BC2\u5BBF\u5BC6\u5C09\u5C08\u5C07\u5C60\u5C5C"+
-        "\u5C5D\u5D07\u5D06\u5D0E\u5D1B\u5D16\u5D22\u5D11"+
-        "\u5D29\u5D14\u5D19\u5D24\u5D27\u5D17\u5DE2\u5E38"+
-        "\u5E36\u5E33\u5E37\u5EB7\u5EB8\u5EB6\u5EB5\u5EBE"+
-        "\u5F35\u5F37\u5F57\u5F6C\u5F69\u5F6B\u5F97\u5F99"+
-        "\u5F9E\u5F98\u5FA1\u5FA0\u5F9C\u607F\u60A3\u6089"+
-        "\u60A0\u60A8\u60CB\u60B4\u60E6\u60BD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u60C5\u60BB\u60B5\u60DC\u60BC\u60D8\u60D5\u60C6"+
-        "\u60DF\u60B8\u60DA\u60C7\u621A\u621B\u6248\u63A0"+
-        "\u63A7\u6372\u6396\u63A2\u63A5\u6377\u6367\u6398"+
-        "\u63AA\u6371\u63A9\u6389\u6383\u639B\u636B\u63A8"+
-        "\u6384\u6388\u6399\u63A1\u63AC\u6392\u638F\u6380"+
-        "\u637B\u6369\u6368\u637A\u655D\u6556\u6551\u6559"+
-        "\u6557\u555F\u654F\u6558\u6555\u6554\u659C\u659B"+
-        "\u65AC\u65CF\u65CB\u65CC\u65CE\u665D\u665A\u6664"+
-        "\u6668\u6666\u665E\u66F9\u52D7\u671B\u6881\u68AF"+
-        "\u68A2\u6893\u68B5\u687F\u6876\u68B1\u68A7\u6897"+
-        "\u68B0\u6883\u68C4\u68AD\u6886\u6885\u6894\u689D"+
-        "\u68A8\u689F\u68A1\u6882\u6B32\u6BBA\u6BEB\u6BEC"+
-        "\u6C2B\u6D8E\u6DBC\u6DF3\u6DD9\u6DB2\u6DE1\u6DCC"+
-        "\u6DE4\u6DFB\u6DFA\u6E05\u6DC7\u6DCB\u6DAF\u6DD1"+
-        "\u6DAE\u6DDE\u6DF9\u6DB8\u6DF7\u6DF5\u6DC5\u6DD2"+
-        "\u6E1A\u6DB5\u6DDA\u6DEB\u6DD8\u6DEA\u6DF1\u6DEE"+
-        "\u6DE8\u6DC6\u6DC4\u6DAA\u6DEC\u6DBF\u6DE6\u70F9"+
-        "\u7109\u710A\u70FD\u70EF\u723D\u727D\u7281\u731C"+
-        "\u731B\u7316\u7313\u7319\u7387\u7405\u740A\u7403"+
-        "\u7406\u73FE\u740D\u74E0\u74F6\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u74F7"+
-        "\u751C\u7522\u7565\u7566\u7562\u7570\u758F\u75D4"+
-        "\u75D5\u75B5\u75CA\u75CD\u768E\u76D4\u76D2\u76DB"+
-        "\u7737\u773E\u773C\u7736\u7738\u773A\u786B\u7843"+
-        "\u784E\u7965\u7968\u796D\u79FB\u7A92\u7A95\u7B20"+
-        "\u7B28\u7B1B\u7B2C\u7B26\u7B19\u7B1E\u7B2E\u7C92"+
-        "\u7C97\u7C95\u7D46\u7D43\u7D71\u7D2E\u7D39\u7D3C"+
-        "\u7D40\u7D30\u7D33\u7D44\u7D2F\u7D42\u7D32\u7D31"+
-        "\u7F3D\u7F9E\u7F9A\u7FCC\u7FCE\u7FD2\u801C\u804A"+
-        "\u8046\u812F\u8116\u8123\u812B\u8129\u8130\u8124"+
-        "\u8202\u8235\u8237\u8236\u8239\u838E\u839E\u8398"+
-        "\u8378\u83A2\u8396\u83BD\u83AB\u8392\u838A\u8393"+
-        "\u8389\u83A0\u8377\u837B\u837C\u8386\u83A7\u8655"+
-        "\u5F6A\u86C7\u86C0\u86B6\u86C4\u86B5\u86C6\u86CB"+
-        "\u86B1\u86AF\u86C9\u8853\u889E\u8888\u88AB\u8892"+
-        "\u8896\u888D\u888B\u8993\u898F\u8A2A\u8A1D\u8A23"+
-        "\u8A25\u8A31\u8A2D\u8A1F\u8A1B\u8A22\u8C49\u8C5A"+
-        "\u8CA9\u8CAC\u8CAB\u8CA8\u8CAA\u8CA7\u8D67\u8D66"+
-        "\u8DBE\u8DBA\u8EDB\u8EDF\u9019\u900D\u901A\u9017"+
-        "\u9023\u901F\u901D\u9010\u9015\u901E\u9020\u900F"+
-        "\u9022\u9016\u901B\u9014\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u90E8\u90ED"+
-        "\u90FD\u9157\u91CE\u91F5\u91E6\u91E3\u91E7\u91ED"+
-        "\u91E9\u9589\u966A\u9675\u9673\u9678\u9670\u9674"+
-        "\u9676\u9677\u966C\u96C0\u96EA\u96E9\u7AE0\u7ADF"+
-        "\u9802\u9803\u9B5A\u9CE5\u9E75\u9E7F\u9EA5\u9EBB"+
-        "\u50A2\u508D\u5085\u5099\u5091\u5080\u5096\u5098"+
-        "\u509A\u6700\u51F1\u5272\u5274\u5275\u5269\u52DE"+
-        "\u52DD\u52DB\u535A\u53A5\u557B\u5580\u55A7\u557C"+
-        "\u558A\u559D\u5598\u5582\u559C\u55AA\u5594\u5587"+
-        "\u558B\u5583\u55B3\u55AE\u559F\u553E\u55B2\u559A"+
-        "\u55BB\u55AC\u55B1\u557E\u5589\u55AB\u5599\u570D"+
-        "\u582F\u582A\u5834\u5824\u5830\u5831\u5821\u581D"+
-        "\u5820\u58F9\u58FA\u5960\u5A77\u5A9A\u5A7F\u5A92"+
-        "\u5A9B\u5AA7\u5B73\u5B71\u5BD2\u5BCC\u5BD3\u5BD0"+
-        "\u5C0A\u5C0B\u5C31\u5D4C\u5D50\u5D34\u5D47\u5DFD"+
-        "\u5E45\u5E3D\u5E40\u5E43\u5E7E\u5ECA\u5EC1\u5EC2"+
-        "\u5EC4\u5F3C\u5F6D\u5FA9\u5FAA\u5FA8\u60D1\u60E1"+
-        "\u60B2\u60B6\u60E0\u611C\u6123\u60FA\u6115\u60F0"+
-        "\u60FB\u60F4\u6168\u60F1\u610E\u60F6\u6109\u6100"+
-        "\u6112\u621F\u6249\u63A3\u638C\u63CF\u63C0\u63E9"+
-        "\u63C9\u63C6\u63CD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u63D2\u63E3\u63D0"+
-        "\u63E1\u63D6\u63ED\u63EE\u6376\u63F4\u63EA\u63DB"+
-        "\u6452\u63DA\u63F9\u655E\u6566\u6562\u6563\u6591"+
-        "\u6590\u65AF\u666E\u6670\u6674\u6676\u666F\u6691"+
-        "\u667A\u667E\u6677\u66FE\u66FF\u671F\u671D\u68FA"+
-        "\u68D5\u68E0\u68D8\u68D7\u6905\u68DF\u68F5\u68EE"+
-        "\u68E7\u68F9\u68D2\u68F2\u68E3\u68CB\u68CD\u690D"+
-        "\u6912\u690E\u68C9\u68DA\u696E\u68FB\u6B3E\u6B3A"+
-        "\u6B3D\u6B98\u6B96\u6BBC\u6BEF\u6C2E\u6C2F\u6C2C"+
-        "\u6E2F\u6E38\u6E54\u6E21\u6E32\u6E67\u6E4A\u6E20"+
-        "\u6E25\u6E23\u6E1B\u6E5B\u6E58\u6E24\u6E56\u6E6E"+
-        "\u6E2D\u6E26\u6E6F\u6E34\u6E4D\u6E3A\u6E2C\u6E43"+
-        "\u6E1D\u6E3E\u6ECB\u6E89\u6E19\u6E4E\u6E63\u6E44"+
-        "\u6E72\u6E69\u6E5F\u7119\u711A\u7126\u7130\u7121"+
-        "\u7136\u716E\u711C\u724C\u7284\u7280\u7336\u7325"+
-        "\u7334\u7329\u743A\u742A\u7433\u7422\u7425\u7435"+
-        "\u7436\u7434\u742F\u741B\u7426\u7428\u7525\u7526"+
-        "\u756B\u756A\u75E2\u75DB\u75E3\u75D9\u75D8\u75DE"+
-        "\u75E0\u767B\u767C\u7696\u7693\u76B4\u76DC\u774F"+
-        "\u77ED\u785D\u786C\u786F\u7A0D\u7A08\u7A0B\u7A05"+
-        "\u7A00\u7A98\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u7A97\u7A96\u7AE5\u7AE3"+
-        "\u7B49\u7B56\u7B46\u7B50\u7B52\u7B54\u7B4D\u7B4B"+
-        "\u7B4F\u7B51\u7C9F\u7CA5\u7D5E\u7D50\u7D68\u7D55"+
-        "\u7D2B\u7D6E\u7D72\u7D61\u7D66\u7D62\u7D70\u7D73"+
-        "\u5584\u7FD4\u7FD5\u800B\u8052\u8085\u8155\u8154"+
-        "\u814B\u8151\u814E\u8139\u8146\u813E\u814C\u8153"+
-        "\u8174\u8212\u821C\u83E9\u8403\u83F8\u840D\u83E0"+
-        "\u83C5\u840B\u83C1\u83EF\u83F1\u83F4\u8457\u840A"+
-        "\u83F0\u840C\u83CC\u83FD\u83F2\u83CA\u8438\u840E"+
-        "\u8404\u83DC\u8407\u83D4\u83DF\u865B\u86DF\u86D9"+
-        "\u86ED\u86D4\u86DB\u86E4\u86D0\u86DE\u8857\u88C1"+
-        "\u88C2\u88B1\u8983\u8996\u8A3B\u8A60\u8A55\u8A5E"+
-        "\u8A3C\u8A41\u8A54\u8A5B\u8A50\u8A46\u8A34\u8A3A"+
-        "\u8A36\u8A56\u8C61\u8C82\u8CAF\u8CBC\u8CB3\u8CBD"+
-        "\u8CC1\u8CBB\u8CC0\u8CB4\u8CB7\u8CB6\u8CBF\u8CB8"+
-        "\u8D8A\u8D85\u8D81\u8DCE\u8DDD\u8DCB\u8DDA\u8DD1"+
-        "\u8DCC\u8DDB\u8DC6\u8EFB\u8EF8\u8EFC\u8F9C\u902E"+
-        "\u9035\u9031\u9038\u9032\u9036\u9102\u90F5\u9109"+
-        "\u90FE\u9163\u9165\u91CF\u9214\u9215\u9223\u9209"+
-        "\u921E\u920D\u9210\u9207\u9211\u9594\u958F\u958B"+
-        "\u9591\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u9593\u9592\u958E\u968A\u968E"+
-        "\u968B\u967D\u9685\u9686\u968D\u9672\u9684\u96C1"+
-        "\u96C5\u96C4\u96C6\u96C7\u96EF\u96F2\u97CC\u9805"+
-        "\u9806\u9808\u98E7\u98EA\u98EF\u98E9\u98F2\u98ED"+
-        "\u99AE\u99AD\u9EC3\u9ECD\u9ED1\u4E82\u50AD\u50B5"+
-        "\u50B2\u50B3\u50C5\u50BE\u50AC\u50B7\u50BB\u50AF"+
-        "\u50C7\u527F\u5277\u527D\u52DF\u52E6\u52E4\u52E2"+
-        "\u52E3\u532F\u55DF\u55E8\u55D3\u55E6\u55CE\u55DC"+
-        "\u55C7\u55D1\u55E3\u55E4\u55EF\u55DA\u55E1\u55C5"+
-        "\u55C6\u55E5\u55C9\u5712\u5713\u585E\u5851\u5858"+
-        "\u5857\u585A\u5854\u586B\u584C\u586D\u584A\u5862"+
-        "\u5852\u584B\u5967\u5AC1\u5AC9\u5ACC\u5ABE\u5ABD"+
-        "\u5ABC\u5AB3\u5AC2\u5AB2\u5D69\u5D6F\u5E4C\u5E79"+
-        "\u5EC9\u5EC8\u5F12\u5F59\u5FAC\u5FAE\u611A\u610F"+
-        "\u6148\u611F\u60F3\u611B\u60F9\u6101\u6108\u614E"+
-        "\u614C\u6144\u614D\u613E\u6134\u6127\u610D\u6106"+
-        "\u6137\u6221\u6222\u6413\u643E\u641E\u642A\u642D"+
-        "\u643D\u642C\u640F\u641C\u6414\u640D\u6436\u6416"+
-        "\u6417\u6406\u656C\u659F\u65B0\u6697\u6689\u6687"+
-        "\u6688\u6696\u6684\u6698\u668D\u6703\u6994\u696D"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u695A\u6977\u6960\u6954\u6975\u6930"+
-        "\u6982\u694A\u6968\u696B\u695E\u6953\u6979\u6986"+
-        "\u695D\u6963\u695B\u6B47\u6B72\u6BC0\u6BBF\u6BD3"+
-        "\u6BFD\u6EA2\u6EAF\u6ED3\u6EB6\u6EC2\u6E90\u6E9D"+
-        "\u6EC7\u6EC5\u6EA5\u6E98\u6EBC\u6EBA\u6EAB\u6ED1"+
-        "\u6E96\u6E9C\u6EC4\u6ED4\u6EAA\u6EA7\u6EB4\u714E"+
-        "\u7159\u7169\u7164\u7149\u7167\u715C\u716C\u7166"+
-        "\u714C\u7165\u715E\u7146\u7168\u7156\u723A\u7252"+
-        "\u7337\u7345\u733F\u733E\u746F\u745A\u7455\u745F"+
-        "\u745E\u7441\u743F\u7459\u745B\u745C\u7576\u7578"+
-        "\u7600\u75F0\u7601\u75F2\u75F1\u75FA\u75FF\u75F4"+
-        "\u75F3\u76DE\u76DF\u775B\u776B\u7766\u775E\u7763"+
-        "\u7779\u776A\u776C\u775C\u7765\u7768\u7762\u77EE"+
-        "\u788E\u78B0\u7897\u7898\u788C\u7889\u787C\u7891"+
-        "\u7893\u787F\u797A\u797F\u7981\u842C\u79BD\u7A1C"+
-        "\u7A1A\u7A20\u7A14\u7A1F\u7A1E\u7A9F\u7AA0\u7B77"+
-        "\u7BC0\u7B60\u7B6E\u7B67\u7CB1\u7CB3\u7CB5\u7D93"+
-        "\u7D79\u7D91\u7D81\u7D8F\u7D5B\u7F6E\u7F69\u7F6A"+
-        "\u7F72\u7FA9\u7FA8\u7FA4\u8056\u8058\u8086\u8084"+
-        "\u8171\u8170\u8178\u8165\u816E\u8173\u816B\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u8179\u817A\u8166\u8205\u8247\u8482\u8477"+
-        "\u843D\u8431\u8475\u8466\u846B\u8449\u846C\u845B"+
-        "\u843C\u8435\u8461\u8463\u8469\u846D\u8446\u865E"+
-        "\u865C\u865F\u86F9\u8713\u8708\u8707\u8700\u86FE"+
-        "\u86FB\u8702\u8703\u8706\u870A\u8859\u88DF\u88D4"+
-        "\u88D9\u88DC\u88D8\u88DD\u88E1\u88CA\u88D5\u88D2"+
-        "\u899C\u89E3\u8A6B\u8A72\u8A73\u8A66\u8A69\u8A70"+
-        "\u8A87\u8A7C\u8A63\u8AA0\u8A71\u8A85\u8A6D\u8A62"+
-        "\u8A6E\u8A6C\u8A79\u8A7B\u8A3E\u8A68\u8C62\u8C8A"+
-        "\u8C89\u8CCA\u8CC7\u8CC8\u8CC4\u8CB2\u8CC3\u8CC2"+
-        "\u8CC5\u8DE1\u8DDF\u8DE8\u8DEF\u8DF3\u8DFA\u8DEA"+
-        "\u8DE4\u8DE6\u8EB2\u8F03\u8F09\u8EFE\u8F0A\u8F9F"+
-        "\u8FB2\u904B\u904A\u9053\u9042\u9054\u903C\u9055"+
-        "\u9050\u9047\u904F\u904E\u904D\u9051\u903E\u9041"+
-        "\u9112\u9117\u916C\u916A\u9169\u91C9\u9237\u9257"+
-        "\u9238\u923D\u9240\u923E\u925B\u924B\u9264\u9251"+
-        "\u9234\u9249\u924D\u9245\u9239\u923F\u925A\u9598"+
-        "\u9698\u9694\u9695\u96CD\u96CB\u96C9\u96CA\u96F7"+
-        "\u96FB\u96F9\u96F6\u9756\u9774\u9776\u9810\u9811"+
-        "\u9813\u980A\u9812\u980C\u98FC\u98F4\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u98FD\u98FE\u99B3\u99B1\u99B4\u9AE1\u9CE9\u9E82"+
-        "\u9F0E\u9F13\u9F20\u50E7\u50EE\u50E5\u50D6\u50ED"+
-        "\u50DA\u50D5\u50CF\u50D1\u50F1\u50CE\u50E9\u5162"+
-        "\u51F3\u5283\u5282\u5331\u53AD\u55FE\u5600\u561B"+
-        "\u5617\u55FD\u5614\u5606\u5609\u560D\u560E\u55F7"+
-        "\u5616\u561F\u5608\u5610\u55F6\u5718\u5716\u5875"+
-        "\u587E\u5883\u5893\u588A\u5879\u5885\u587D\u58FD"+
-        "\u5925\u5922\u5924\u596A\u5969\u5AE1\u5AE6\u5AE9"+
-        "\u5AD7\u5AD6\u5AD8\u5AE3\u5B75\u5BDE\u5BE7\u5BE1"+
-        "\u5BE5\u5BE6\u5BE8\u5BE2\u5BE4\u5BDF\u5C0D\u5C62"+
-        "\u5D84\u5D87\u5E5B\u5E63\u5E55\u5E57\u5E54\u5ED3"+
-        "\u5ED6\u5F0A\u5F46\u5F70\u5FB9\u6147\u613F\u614B"+
-        "\u6177\u6162\u6163\u615F\u615A\u6158\u6175\u622A"+
-        "\u6487\u6458\u6454\u64A4\u6478\u645F\u647A\u6451"+
-        "\u6467\u6434\u646D\u647B\u6572\u65A1\u65D7\u65D6"+
-        "\u66A2\u66A8\u669D\u699C\u69A8\u6995\u69C1\u69AE"+
-        "\u69D3\u69CB\u699B\u69B7\u69BB\u69AB\u69B4\u69D0"+
-        "\u69CD\u69AD\u69CC\u69A6\u69C3\u69A3\u6B49\u6B4C"+
-        "\u6C33\u6F33\u6F14\u6EFE\u6F13\u6EF4\u6F29\u6F3E"+
-        "\u6F20\u6F2C\u6F0F\u6F02\u6F22\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6EFF"+
-        "\u6EEF\u6F06\u6F31\u6F38\u6F32\u6F23\u6F15\u6F2B"+
-        "\u6F2F\u6F88\u6F2A\u6EEC\u6F01\u6EF2\u6ECC\u6EF7"+
-        "\u7194\u7199\u717D\u718A\u7184\u7192\u723E\u7292"+
-        "\u7296\u7344\u7350\u7464\u7463\u746A\u7470\u746D"+
-        "\u7504\u7591\u7627\u760D\u760B\u7609\u7613\u76E1"+
-        "\u76E3\u7784\u777D\u777F\u7761\u78C1\u789F\u78A7"+
-        "\u78B3\u78A9\u78A3\u798E\u798F\u798D\u7A2E\u7A31"+
-        "\u7AAA\u7AA9\u7AED\u7AEF\u7BA1\u7B95\u7B8B\u7B75"+
-        "\u7B97\u7B9D\u7B94\u7B8F\u7BB8\u7B87\u7B84\u7CB9"+
-        "\u7CBD\u7CBE\u7DBB\u7DB0\u7D9C\u7DBD\u7DBE\u7DA0"+
-        "\u7DCA\u7DB4\u7DB2\u7DB1\u7DBA\u7DA2\u7DBF\u7DB5"+
-        "\u7DB8\u7DAD\u7DD2\u7DC7\u7DAC\u7F70\u7FE0\u7FE1"+
-        "\u7FDF\u805E\u805A\u8087\u8150\u8180\u818F\u8188"+
-        "\u818A\u817F\u8182\u81E7\u81FA\u8207\u8214\u821E"+
-        "\u824B\u84C9\u84BF\u84C6\u84C4\u8499\u849E\u84B2"+
-        "\u849C\u84CB\u84B8\u84C0\u84D3\u8490\u84BC\u84D1"+
-        "\u84CA\u873F\u871C\u873B\u8722\u8725\u8734\u8718"+
-        "\u8755\u8737\u8729\u88F3\u8902\u88F4\u88F9\u88F8"+
-        "\u88FD\u88E8\u891A\u88EF\u8AA6\u8A8C\u8A9E\u8AA3"+
-        "\u8A8D\u8AA1\u8A93\u8AA4\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8AAA\u8AA5"+
-        "\u8AA8\u8A98\u8A91\u8A9A\u8AA7\u8C6A\u8C8D\u8C8C"+
-        "\u8CD3\u8CD1\u8CD2\u8D6B\u8D99\u8D95\u8DFC\u8F14"+
-        "\u8F12\u8F15\u8F13\u8FA3\u9060\u9058\u905C\u9063"+
-        "\u9059\u905E\u9062\u905D\u905B\u9119\u9118\u911E"+
-        "\u9175\u9178\u9177\u9174\u9278\u9280\u9285\u9298"+
-        "\u9296\u927B\u9293\u929C\u92A8\u927C\u9291\u95A1"+
-        "\u95A8\u95A9\u95A3\u95A5\u95A4\u9699\u969C\u969B"+
-        "\u96CC\u96D2\u9700\u977C\u9785\u97F6\u9817\u9818"+
-        "\u98AF\u98B1\u9903\u9905\u990C\u9909\u99C1\u9AAF"+
-        "\u9AB0\u9AE6\u9B41\u9B42\u9CF4\u9CF6\u9CF3\u9EBC"+
-        "\u9F3B\u9F4A\u5104\u5100\u50FB\u50F5\u50F9\u5102"+
-        "\u5108\u5109\u5105\u51DC\u5287\u5288\u5289\u528D"+
-        "\u528A\u52F0\u53B2\u562E\u563B\u5639\u5632\u563F"+
-        "\u5634\u5629\u5653\u564E\u5657\u5674\u5636\u562F"+
-        "\u5630\u5880\u589F\u589E\u58B3\u589C\u58AE\u58A9"+
-        "\u58A6\u596D\u5B09\u5AFB\u5B0B\u5AF5\u5B0C\u5B08"+
-        "\u5BEE\u5BEC\u5BE9\u5BEB\u5C64\u5C65\u5D9D\u5D94"+
-        "\u5E62\u5E5F\u5E61\u5EE2\u5EDA\u5EDF\u5EDD\u5EE3"+
-        "\u5EE0\u5F48\u5F71\u5FB7\u5FB5\u6176\u6167\u616E"+
-        "\u615D\u6155\u6182\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u617C\u6170\u616B"+
-        "\u617E\u61A7\u6190\u61AB\u618E\u61AC\u619A\u61A4"+
-        "\u6194\u61AE\u622E\u6469\u646F\u6479\u649E\u64B2"+
-        "\u6488\u6490\u64B0\u64A5\u6493\u6495\u64A9\u6492"+
-        "\u64AE\u64AD\u64AB\u649A\u64AC\u6499\u64A2\u64B3"+
-        "\u6575\u6577\u6578\u66AE\u66AB\u66B4\u66B1\u6A23"+
-        "\u6A1F\u69E8\u6A01\u6A1E\u6A19\u69FD\u6A21\u6A13"+
-        "\u6A0A\u69F3\u6A02\u6A05\u69ED\u6A11\u6B50\u6B4E"+
-        "\u6BA4\u6BC5\u6BC6\u6F3F\u6F7C\u6F84\u6F51\u6F66"+
-        "\u6F54\u6F86\u6F6D\u6F5B\u6F78\u6F6E\u6F8E\u6F7A"+
-        "\u6F70\u6F64\u6F97\u6F58\u6ED5\u6F6F\u6F60\u6F5F"+
-        "\u719F\u71AC\u71B1\u71A8\u7256\u729B\u734E\u7357"+
-        "\u7469\u748B\u7483\u747E\u7480\u757F\u7620\u7629"+
-        "\u761F\u7624\u7626\u7621\u7622\u769A\u76BA\u76E4"+
-        "\u778E\u7787\u778C\u7791\u778B\u78CB\u78C5\u78BA"+
-        "\u78CA\u78BE\u78D5\u78BC\u78D0\u7A3F\u7A3C\u7A40"+
-        "\u7A3D\u7A37\u7A3B\u7AAF\u7AAE\u7BAD\u7BB1\u7BC4"+
-        "\u7BB4\u7BC6\u7BC7\u7BC1\u7BA0\u7BCC\u7CCA\u7DE0"+
-        "\u7DF4\u7DEF\u7DFB\u7DD8\u7DEC\u7DDD\u7DE8\u7DE3"+
-        "\u7DDA\u7DDE\u7DE9\u7D9E\u7DD9\u7DF2\u7DF9\u7F75"+
-        "\u7F77\u7FAF\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u7FE9\u8026\u819B\u819C"+
-        "\u819D\u81A0\u819A\u8198\u8517\u853D\u851A\u84EE"+
-        "\u852C\u852D\u8513\u8511\u8523\u8521\u8514\u84EC"+
-        "\u8525\u84FF\u8506\u8782\u8774\u8776\u8760\u8766"+
-        "\u8778\u8768\u8759\u8757\u874C\u8753\u885B\u885D"+
-        "\u8910\u8907\u8912\u8913\u8915\u890A\u8ABC\u8AD2"+
-        "\u8AC7\u8AC4\u8A95\u8ACB\u8AF8\u8AB2\u8AC9\u8AC2"+
-        "\u8ABF\u8AB0\u8AD6\u8ACD\u8AB6\u8AB9\u8ADB\u8C4C"+
-        "\u8C4E\u8C6C\u8CE0\u8CDE\u8CE6\u8CE4\u8CEC\u8CED"+
-        "\u8CE2\u8CE3\u8CDC\u8CEA\u8CE1\u8D6D\u8D9F\u8DA3"+
-        "\u8E2B\u8E10\u8E1D\u8E22\u8E0F\u8E29\u8E1F\u8E21"+
-        "\u8E1E\u8EBA\u8F1D\u8F1B\u8F1F\u8F29\u8F26\u8F2A"+
-        "\u8F1C\u8F1E\u8F25\u9069\u906E\u9068\u906D\u9077"+
-        "\u9130\u912D\u9127\u9131\u9187\u9189\u918B\u9183"+
-        "\u92C5\u92BB\u92B7\u92EA\u92AC\u92E4\u92C1\u92B3"+
-        "\u92BC\u92D2\u92C7\u92F0\u92B2\u95AD\u95B1\u9704"+
-        "\u9706\u9707\u9709\u9760\u978D\u978B\u978F\u9821"+
-        "\u982B\u981C\u98B3\u990A\u9913\u9912\u9918\u99DD"+
-        "\u99D0\u99DF\u99DB\u99D1\u99D5\u99D2\u99D9\u9AB7"+
-        "\u9AEE\u9AEF\u9B27\u9B45\u9B44\u9B77\u9B6F\u9D06"+
-        "\u9D09\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u9D03\u9EA9\u9EBE\u9ECE\u58A8"+
-        "\u9F52\u5112\u5118\u5114\u5110\u5115\u5180\u51AA"+
-        "\u51DD\u5291\u5293\u52F3\u5659\u566B\u5679\u5669"+
-        "\u5664\u5678\u566A\u5668\u5665\u5671\u566F\u566C"+
-        "\u5662\u5676\u58C1\u58BE\u58C7\u58C5\u596E\u5B1D"+
-        "\u5B34\u5B78\u5BF0\u5C0E\u5F4A\u61B2\u6191\u61A9"+
-        "\u618A\u61CD\u61B6\u61BE\u61CA\u61C8\u6230\u64C5"+
-        "\u64C1\u64CB\u64BB\u64BC\u64DA\u64C4\u64C7\u64C2"+
-        "\u64CD\u64BF\u64D2\u64D4\u64BE\u6574\u66C6\u66C9"+
-        "\u66B9\u66C4\u66C7\u66B8\u6A3D\u6A38\u6A3A\u6A59"+
-        "\u6A6B\u6A58\u6A39\u6A44\u6A62\u6A61\u6A4B\u6A47"+
-        "\u6A35\u6A5F\u6A48\u6B59\u6B77\u6C05\u6FC2\u6FB1"+
-        "\u6FA1\u6FC3\u6FA4\u6FC1\u6FA7\u6FB3\u6FC0\u6FB9"+
-        "\u6FB6\u6FA6\u6FA0\u6FB4\u71BE\u71C9\u71D0\u71D2"+
-        "\u71C8\u71D5\u71B9\u71CE\u71D9\u71DC\u71C3\u71C4"+
-        "\u7368\u749C\u74A3\u7498\u749F\u749E\u74E2\u750C"+
-        "\u750D\u7634\u7638\u763A\u76E7\u76E5\u77A0\u779E"+
-        "\u779F\u77A5\u78E8\u78DA\u78EC\u78E7\u79A6\u7A4D"+
-        "\u7A4E\u7A46\u7A4C\u7A4B\u7ABA\u7BD9\u7C11\u7BC9"+
-        "\u7BE4\u7BDB\u7BE1\u7BE9\u7BE6\u7CD5\u7CD6\u7E0A"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u7E11\u7E08\u7E1B\u7E23\u7E1E\u7E1D"+
-        "\u7E09\u7E10\u7F79\u7FB2\u7FF0\u7FF1\u7FEE\u8028"+
-        "\u81B3\u81A9\u81A8\u81FB\u8208\u8258\u8259\u854A"+
-        "\u8559\u8548\u8568\u8569\u8543\u8549\u856D\u856A"+
-        "\u855E\u8783\u879F\u879E\u87A2\u878D\u8861\u892A"+
-        "\u8932\u8925\u892B\u8921\u89AA\u89A6\u8AE6\u8AFA"+
-        "\u8AEB\u8AF1\u8B00\u8ADC\u8AE7\u8AEE\u8AFE\u8B01"+
-        "\u8B02\u8AF7\u8AED\u8AF3\u8AF6\u8AFC\u8C6B\u8C6D"+
-        "\u8C93\u8CF4\u8E44\u8E31\u8E34\u8E42\u8E39\u8E35"+
-        "\u8F3B\u8F2F\u8F38\u8F33\u8FA8\u8FA6\u9075\u9074"+
-        "\u9078\u9072\u907C\u907A\u9134\u9192\u9320\u9336"+
-        "\u92F8\u9333\u932F\u9322\u92FC\u932B\u9304\u931A";
-
-    private final static String innerIndex2=
-        "\u9310\u9326\u9321\u9315\u932E\u9319\u95BB\u96A7"+
-        "\u96A8\u96AA\u96D5\u970E\u9711\u9716\u970D\u9713"+
-        "\u970F\u975B\u975C\u9766\u9798\u9830\u9838\u983B"+
-        "\u9837\u982D\u9839\u9824\u9910\u9928\u991E\u991B"+
-        "\u9921\u991A\u99ED\u99E2\u99F1\u9AB8\u9ABC\u9AFB"+
-        "\u9AED\u9B28\u9B91\u9D15\u9D23\u9D26\u9D28\u9D12"+
-        "\u9D1B\u9ED8\u9ED4\u9F8D\u9F9C\u512A\u511F\u5121"+
-        "\u5132\u52F5\u568E\u5680\u5690\u5685\u5687\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u568F\u58D5\u58D3\u58D1\u58CE\u5B30\u5B2A"+
-        "\u5B24\u5B7A\u5C37\u5C68\u5DBC\u5DBA\u5DBD\u5DB8"+
-        "\u5E6B\u5F4C\u5FBD\u61C9\u61C2\u61C7\u61E6\u61CB"+
-        "\u6232\u6234\u64CE\u64CA\u64D8\u64E0\u64F0\u64E6"+
-        "\u64EC\u64F1\u64E2\u64ED\u6582\u6583\u66D9\u66D6"+
-        "\u6A80\u6A94\u6A84\u6AA2\u6A9C\u6ADB\u6AA3\u6A7E"+
-        "\u6A97\u6A90\u6AA0\u6B5C\u6BAE\u6BDA\u6C08\u6FD8"+
-        "\u6FF1\u6FDF\u6FE0\u6FDB\u6FE4\u6FEB\u6FEF\u6F80"+
-        "\u6FEC\u6FE1\u6FE9\u6FD5\u6FEE\u6FF0\u71E7\u71DF"+
-        "\u71EE\u71E6\u71E5\u71ED\u71EC\u71F4\u71E0\u7235"+
-        "\u7246\u7370\u7372\u74A9\u74B0\u74A6\u74A8\u7646"+
-        "\u7642\u764C\u76EA\u77B3\u77AA\u77B0\u77AC\u77A7"+
-        "\u77AD\u77EF\u78F7\u78FA\u78F4\u78EF\u7901\u79A7"+
-        "\u79AA\u7A57\u7ABF\u7C07\u7C0D\u7BFE\u7BF7\u7C0C"+
-        "\u7BE0\u7CE0\u7CDC\u7CDE\u7CE2\u7CDF\u7CD9\u7CDD"+
-        "\u7E2E\u7E3E\u7E46\u7E37\u7E32\u7E43\u7E2B\u7E3D"+
-        "\u7E31\u7E45\u7E41\u7E34\u7E39\u7E48\u7E35\u7E3F"+
-        "\u7E2F\u7F44\u7FF3\u7FFC\u8071\u8072\u8070\u806F"+
-        "\u8073\u81C6\u81C3\u81BA\u81C2\u81C0\u81BF\u81BD"+
-        "\u81C9\u81BE\u81E8\u8209\u8271\u85AA\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u8584\u857E\u859C\u8591\u8594\u85AF\u859B\u8587"+
-        "\u85A8\u858A\u8667\u87C0\u87D1\u87B3\u87D2\u87C6"+
-        "\u87AB\u87BB\u87BA\u87C8\u87CB\u893B\u8936\u8944"+
-        "\u8938\u893D\u89AC\u8B0E\u8B17\u8B19\u8B1B\u8B0A"+
-        "\u8B20\u8B1D\u8B04\u8B10\u8C41\u8C3F\u8C73\u8CFA"+
-        "\u8CFD\u8CFC\u8CF8\u8CFB\u8DA8\u8E49\u8E4B\u8E48"+
-        "\u8E4A\u8F44\u8F3E\u8F42\u8F45\u8F3F\u907F\u907D"+
-        "\u9084\u9081\u9082\u9080\u9139\u91A3\u919E\u919C"+
-        "\u934D\u9382\u9328\u9375\u934A\u9365\u934B\u9318"+
-        "\u937E\u936C\u935B\u9370\u935A\u9354\u95CA\u95CB"+
-        "\u95CC\u95C8\u95C6\u96B1\u96B8\u96D6\u971C\u971E"+
-        "\u97A0\u97D3\u9846\u98B6\u9935\u9A01\u99FF\u9BAE"+
-        "\u9BAB\u9BAA\u9BAD\u9D3B\u9D3F\u9E8B\u9ECF\u9EDE"+
-        "\u9EDC\u9EDD\u9EDB\u9F3E\u9F4B\u53E2\u5695\u56AE"+
-        "\u58D9\u58D8\u5B38\u5F5D\u61E3\u6233\u64F4\u64F2"+
-        "\u64FE\u6506\u64FA\u64FB\u64F7\u65B7\u66DC\u6726"+
-        "\u6AB3\u6AAC\u6AC3\u6ABB\u6AB8\u6AC2\u6AAE\u6AAF"+
-        "\u6B5F\u6B78\u6BAF\u7009\u700B\u6FFE\u7006\u6FFA"+
-        "\u7011\u700F\u71FB\u71FC\u71FE\u71F8\u7377\u7375"+
-        "\u74A7\u74BF\u7515\u7656\u7658\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7652"+
-        "\u77BD\u77BF\u77BB\u77BC\u790E\u79AE\u7A61\u7A62"+
-        "\u7A60\u7AC4\u7AC5\u7C2B\u7C27\u7C2A\u7C1E\u7C23"+
-        "\u7C21\u7CE7\u7E54\u7E55\u7E5E\u7E5A\u7E61\u7E52"+
-        "\u7E59\u7F48\u7FF9\u7FFB\u8077\u8076\u81CD\u81CF"+
-        "\u820A\u85CF\u85A9\u85CD\u85D0\u85C9\u85B0\u85BA"+
-        "\u85B9\u85A6\u87EF\u87EC\u87F2\u87E0\u8986\u89B2"+
-        "\u89F4\u8B28\u8B39\u8B2C\u8B2B\u8C50\u8D05\u8E59"+
-        "\u8E63\u8E66\u8E64\u8E5F\u8E55\u8EC0\u8F49\u8F4D"+
-        "\u9087\u9083\u9088\u91AB\u91AC\u91D0\u9394\u938A"+
-        "\u9396\u93A2\u93B3\u93AE\u93AC\u93B0\u9398\u939A"+
-        "\u9397\u95D4\u95D6\u95D0\u95D5\u96E2\u96DC\u96D9"+
-        "\u96DB\u96DE\u9724\u97A3\u97A6\u97AD\u97F9\u984D"+
-        "\u984F\u984C\u984E\u9853\u98BA\u993E\u993F\u993D"+
-        "\u992E\u99A5\u9A0E\u9AC1\u9B03\u9B06\u9B4F\u9B4E"+
-        "\u9B4D\u9BCA\u9BC9\u9BFD\u9BC8\u9BC0\u9D51\u9D5D"+
-        "\u9D60\u9EE0\u9F15\u9F2C\u5133\u56A5\u58DE\u58DF"+
-        "\u58E2\u5BF5\u9F90\u5EEC\u61F2\u61F7\u61F6\u61F5"+
-        "\u6500\u650F\u66E0\u66DD\u6AE5\u6ADD\u6ADA\u6AD3"+
-        "\u701B\u701F\u7028\u701A\u701D\u7015\u7018\u7206"+
-        "\u720D\u7258\u72A2\u7378\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u737A\u74BD"+
-        "\u74CA\u74E3\u7587\u7586\u765F\u7661\u77C7\u7919"+
-        "\u79B1\u7A6B\u7A69\u7C3E\u7C3F\u7C38\u7C3D\u7C37"+
-        "\u7C40\u7E6B\u7E6D\u7E79\u7E69\u7E6A\u7F85\u7E73"+
-        "\u7FB6\u7FB9\u7FB8\u81D8\u85E9\u85DD\u85EA\u85D5"+
-        "\u85E4\u85E5\u85F7\u87FB\u8805\u880D\u87F9\u87FE"+
-        "\u8960\u895F\u8956\u895E\u8B41\u8B5C\u8B58\u8B49"+
-        "\u8B5A\u8B4E\u8B4F\u8B46\u8B59\u8D08\u8D0A\u8E7C"+
-        "\u8E72\u8E87\u8E76\u8E6C\u8E7A\u8E74\u8F54\u8F4E"+
-        "\u8FAD\u908A\u908B\u91B1\u91AE\u93E1\u93D1\u93DF"+
-        "\u93C3\u93C8\u93DC\u93DD\u93D6\u93E2\u93CD\u93D8"+
-        "\u93E4\u93D7\u93E8\u95DC\u96B4\u96E3\u972A\u9727"+
-        "\u9761\u97DC\u97FB\u985E\u9858\u985B\u98BC\u9945"+
-        "\u9949\u9A16\u9A19\u9B0D\u9BE8\u9BE7\u9BD6\u9BDB"+
-        "\u9D89\u9D61\u9D72\u9D6A\u9D6C\u9E92\u9E97\u9E93"+
-        "\u9EB4\u52F8\u56A8\u56B7\u56B6\u56B4\u56BC\u58E4"+
-        "\u5B40\u5B43\u5B7D\u5BF6\u5DC9\u61F8\u61FA\u6518"+
-        "\u6514\u6519\u66E6\u6727\u6AEC\u703E\u7030\u7032"+
-        "\u7210\u737B\u74CF\u7662\u7665\u7926\u792A\u792C"+
-        "\u792B\u7AC7\u7AF6\u7C4C\u7C43\u7C4D\u7CEF\u7CF0"+
-        "\u8FAE\u7E7D\u7E7C\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u7E82\u7F4C\u8000"+
-        "\u81DA\u8266\u85FB\u85F9\u8611\u85FA\u8606\u860B"+
-        "\u8607\u860A\u8814\u8815\u8964\u89BA\u89F8\u8B70"+
-        "\u8B6C\u8B66\u8B6F\u8B5F\u8B6B\u8D0F\u8D0D\u8E89"+
-        "\u8E81\u8E85\u8E82\u91B4\u91CB\u9418\u9403\u93FD"+
-        "\u95E1\u9730\u98C4\u9952\u9951\u99A8\u9A2B\u9A30"+
-        "\u9A37\u9A35\u9C13\u9C0D\u9E79\u9EB5\u9EE8\u9F2F"+
-        "\u9F5F\u9F63\u9F61\u5137\u5138\u56C1\u56C0\u56C2"+
-        "\u5914\u5C6C\u5DCD\u61FC\u61FE\u651D\u651C\u6595"+
-        "\u66E9\u6AFB\u6B04\u6AFA\u6BB2\u704C\u721B\u72A7"+
-        "\u74D6\u74D4\u7669\u77D3\u7C50\u7E8F\u7E8C\u7FBC"+
-        "\u8617\u862D\u861A\u8823\u8822\u8821\u881F\u896A"+
-        "\u896C\u89BD\u8B74\u8B77\u8B7D\u8D13\u8E8A\u8E8D"+
-        "\u8E8B\u8F5F\u8FAF\u91BA\u942E\u9433\u9435\u943A"+
-        "\u9438\u9432\u942B\u95E2\u9738\u9739\u9732\u97FF"+
-        "\u9867\u9865\u9957\u9A45\u9A43\u9A40\u9A3E\u9ACF"+
-        "\u9B54\u9B51\u9C2D\u9C25\u9DAF\u9DB4\u9DC2\u9DB8"+
-        "\u9E9D\u9EEF\u9F19\u9F5C\u9F66\u9F67\u513C\u513B"+
-        "\u56C8\u56CA\u56C9\u5B7F\u5DD4\u5DD2\u5F4E\u61FF"+
-        "\u6524\u6B0A\u6B61\u7051\u7058\u7380\u74E4\u758A"+
-        "\u766E\u766C\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u79B3\u7C60\u7C5F\u807E"+
-        "\u807D\u81DF\u8972\u896F\u89FC\u8B80\u8D16\u8D17"+
-        "\u8E91\u8E93\u8F61\u9148\u9444\u9451\u9452\u973D"+
-        "\u973E\u97C3\u97C1\u986B\u9955\u9A55\u9A4D\u9AD2"+
-        "\u9B1A\u9C49\u9C31\u9C3E\u9C3B\u9DD3\u9DD7\u9F34"+
-        "\u9F6C\u9F6A\u9F94\u56CC\u5DD6\u6200\u6523\u652B"+
-        "\u652A\u66EC\u6B10\u74DA\u7ACA\u7C64\u7C63\u7C65"+
-        "\u7E93\u7E96\u7E94\u81E2\u8638\u863F\u8831\u8B8A"+
-        "\u9090\u908F\u9463\u9460\u9464\u9768\u986F\u995C"+
-        "\u9A5A\u9A5B\u9A57\u9AD3\u9AD4\u9AD1\u9C54\u9C57"+
-        "\u9C56\u9DE5\u9E9F\u9EF4\u56D1\u58E9\u652C\u705E"+
-        "\u7671\u7672\u77D7\u7F50\u7F88\u8836\u8839\u8862"+
-        "\u8B93\u8B92\u8B96\u8277\u8D1B\u91C0\u946A\u9742"+
-        "\u9748\u9744\u97C6\u9870\u9A5F\u9B22\u9B58\u9C5F"+
-        "\u9DF9\u9DFA\u9E7C\u9E7D\u9F07\u9F77\u9F72\u5EF3"+
-        "\u6B16\u7063\u7C6C\u7C6E\u883B\u89C0\u8EA1\u91C1"+
-        "\u9472\u9470\u9871\u995E\u9AD6\u9B23\u9ECC\u7064"+
-        "\u77DA\u8B9A\u9477\u97C9\u9A62\u9A65\u7E9C\u8B9C"+
-        "\u8EAA\u91C5\u947D\u947E\u947C\u9C77\u9C78\u9EF7"+
-        "\u8C54\u947F\u9E1A\u7228\u9A6A\u9B31\u9E1B\u9E1E"+
-        "\u7C72\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u30FE\u309D\u309E\u3005\u3041"+
-        "\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049"+
-        "\u304A\u304B\u304C\u304D\u304E\u304F\u3050\u3051"+
-        "\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059"+
-        "\u305A\u305B\u305C\u305D\u305E\u305F\u3060\u3061"+
-        "\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069"+
-        "\u306A\u306B\u306C\u306D\u306E\u306F\u3070\u3071"+
-        "\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079"+
-        "\u307A\u307B\u307C\u307D\u307E\u307F\u3080\u3081"+
-        "\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089"+
-        "\u308A\u308B\u308C\u308D\u308E\u308F\u3090\u3091"+
-        "\u3092\u3093\u30A1\u30A2\u30A3\u30A4\u30A5\u30A6"+
-        "\u30A7\u30A8\u30A9\u30AA\u30AB\u30AC\u30AD\u30AE"+
-        "\u30AF\u30B0\u30B1\u30B2\u30B3\u30B4\u30B5\u30B6"+
-        "\u30B7\u30B8\u30B9\u30BA\u30BB\u30BC\u30BD\u30BE"+
-        "\u30BF\u30C0\u30C1\u30C2\u30C3\u30C4\u30C5\u30C6"+
-        "\u30C7\u30C8\u30C9\u30CA\u30CB\u30CC\u30CD\u30CE"+
-        "\u30CF\u30D0\u30D1\u30D2\u30D3\u30D4\u30D5\u30D6"+
-        "\u30D7\u30D8\u30D9\u30DA\u30DB\u30DC\u30DD\u30DE"+
-        "\u30DF\u30E0\u30E1\u30E2\u30E3\u30E4\u30E5\u30E6"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u30E7\u30E8\u30E9\u30EA\u30EB\u30EC"+
-        "\u30ED\u30EE\u30EF\u30F0\u30F1\u30F2\u30F3\u30F4"+
-        "\u30F5\u30F6\u0414\u0415\u0401\u0416\u0417\u0418"+
-        "\u0419\u041A\u041B\u041C\u0423\u0424\u0425\u0426"+
-        "\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E"+
-        "\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0451"+
-        "\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D"+
-        "\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445"+
-        "\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D"+
-        "\u044E\u044F\u2460\u2461\u2462\u2463\u2464\u2465"+
-        "\u2466\u2467\u2468\u2469\u2474\u2475\u2476\u2477"+
-        "\u2478\u2479\u247A\u247B\u247C\u247D\uFFFD\uFFFD"+
-        "\u4E42\u4E5C\u51F5\u531A\u5382\u4E07\u4E0C\u4E47"+
-        "\u4E8D\u56D7\uFA0C\u5C6E\u5F73\u4E0F\u5187\u4E0E"+
-        "\u4E2E\u4E93\u4EC2\u4EC9\u4EC8\u5198\u52FC\u536C"+
-        "\u53B9\u5720\u5903\u592C\u5C10\u5DFF\u65E1\u6BB3"+
-        "\u6BCC\u6C14\u723F\u4E31\u4E3C\u4EE8\u4EDC\u4EE9"+
-        "\u4EE1\u4EDD\u4EDA\u520C\u531C\u534C\u5722\u5723"+
-        "\u5917\u592F\u5B81\u5B84\u5C12\u5C3B\u5C74\u5C73"+
-        "\u5E04\u5E80\u5E82\u5FC9\u6209\u6250\u6C15\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u6C36\u6C43\u6C3F\u6C3B\u72AE\u72B0\u738A"+
-        "\u79B8\u808A\u961E\u4F0E\u4F18\u4F2C\u4EF5\u4F14"+
-        "\u4EF1\u4F00\u4EF7\u4F08\u4F1D\u4F02\u4F05\u4F22"+
-        "\u4F13\u4F04\u4EF4\u4F12\u51B1\u5213\u5209\u5210"+
-        "\u52A6\u5322\u531F\u534D\u538A\u5407\u56E1\u56DF"+
-        "\u572E\u572A\u5734\u593C\u5980\u597C\u5985\u597B"+
-        "\u597E\u5977\u597F\u5B56\u5C15\u5C25\u5C7C\u5C7A"+
-        "\u5C7B\u5C7E\u5DDF\u5E75\u5E84\u5F02\u5F1A\u5F74"+
-        "\u5FD5\u5FD4\u5FCF\u625C\u625E\u6264\u6261\u6266"+
-        "\u6262\u6259\u6260\u625A\u6265\u65EF\u65EE\u673E"+
-        "\u6739\u6738\u673B\u673A\u673F\u673C\u6733\u6C18"+
-        "\u6C46\u6C52\u6C5C\u6C4F\u6C4A\u6C54\u6C4B\u6C4C"+
-        "\u7071\u725E\u72B4\u72B5\u738E\u752A\u767F\u7A75"+
-        "\u7F51\u8278\u827C\u8280\u827D\u827F\u864D\u897E"+
-        "\u9099\u9097\u9098\u909B\u9094\u9622\u9624\u9620"+
-        "\u9623\u4F56\u4F3B\u4F62\u4F49\u4F53\u4F64\u4F3E"+
-        "\u4F67\u4F52\u4F5F\u4F41\u4F58\u4F2D\u4F33\u4F3F"+
-        "\u4F61\u518F\u51B9\u521C\u521E\u5221\u52AD\u52AE"+
-        "\u5309\u5363\u5372\u538E\u538F\u5430\u5437\u542A"+
-        "\u5454\u5445\u5419\u541C\u5425\u5418\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u543D\u544F\u5441\u5428\u5424\u5447\u56EE\u56E7"+
-        "\u56E5\u5741\u5745\u574C\u5749\u574B\u5752\u5906"+
-        "\u5940\u59A6\u5998\u59A0\u5997\u598E\u59A2\u5990"+
-        "\u598F\u59A7\u59A1\u5B8E\u5B92\u5C28\u5C2A\u5C8D"+
-        "\u5C8F\u5C88\u5C8B\u5C89\u5C92\u5C8A\u5C86\u5C93"+
-        "\u5C95\u5DE0\u5E0A\u5E0E\u5E8B\u5E89\u5E8C\u5E88"+
-        "\u5E8D\u5F05\u5F1D\u5F78\u5F76\u5FD2\u5FD1\u5FD0"+
-        "\u5FED\u5FE8\u5FEE\u5FF3\u5FE1\u5FE4\u5FE3\u5FFA"+
-        "\u5FEF\u5FF7\u5FFB\u6000\u5FF4\u623A\u6283\u628C"+
-        "\u628E\u628F\u6294\u6287\u6271\u627B\u627A\u6270"+
-        "\u6281\u6288\u6277\u627D\u6272\u6274\u6537\u65F0"+
-        "\u65F4\u65F3\u65F2\u65F5\u6745\u6747\u6759\u6755"+
-        "\u674C\u6748\u675D\u674D\u675A\u674B\u6BD0\u6C19"+
-        "\u6C1A\u6C78\u6C67\u6C6B\u6C84\u6C8B\u6C8F\u6C71"+
-        "\u6C6F\u6C69\u6C9A\u6C6D\u6C87\u6C95\u6C9C\u6C66"+
-        "\u6C73\u6C65\u6C7B\u6C8E\u7074\u707A\u7263\u72BF"+
-        "\u72BD\u72C3\u72C6\u72C1\u72BA\u72C5\u7395\u7397"+
-        "\u7393\u7394\u7392\u753A\u7539\u7594\u7595\u7681"+
-        "\u793D\u8034\u8095\u8099\u8090\u8092\u809C\u8290"+
-        "\u828F\u8285\u828E\u8291\u8293\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u828A"+
-        "\u8283\u8284\u8C78\u8FC9\u8FBF\u909F\u90A1\u90A5"+
-        "\u909E\u90A7\u90A0\u9630\u9628\u962F\u962D\u4E33"+
-        "\u4F98\u4F7C\u4F85\u4F7D\u4F80\u4F87\u4F76\u4F74"+
-        "\u4F89\u4F84\u4F77\u4F4C\u4F97\u4F6A\u4F9A\u4F79"+
-        "\u4F81\u4F78\u4F90\u4F9C\u4F94\u4F9E\u4F92\u4F82"+
-        "\u4F95\u4F6B\u4F6E\u519E\u51BC\u51BE\u5235\u5232"+
-        "\u5233\u5246\u5231\u52BC\u530A\u530B\u533C\u5392"+
-        "\u5394\u5487\u547F\u5481\u5491\u5482\u5488\u546B"+
-        "\u547A\u547E\u5465\u546C\u5474\u5466\u548D\u546F"+
-        "\u5461\u5460\u5498\u5463\u5467\u5464\u56F7\u56F9"+
-        "\u576F\u5772\u576D\u576B\u5771\u5770\u5776\u5780"+
-        "\u5775\u577B\u5773\u5774\u5762\u5768\u577D\u590C"+
-        "\u5945\u59B5\u59BA\u59CF\u59CE\u59B2\u59CC\u59C1"+
-        "\u59B6\u59BC\u59C3\u59D6\u59B1\u59BD\u59C0\u59C8"+
-        "\u59B4\u59C7\u5B62\u5B65\u5B93\u5B95\u5C44\u5C47"+
-        "\u5CAE\u5CA4\u5CA0\u5CB5\u5CAF\u5CA8\u5CAC\u5C9F"+
-        "\u5CA3\u5CAD\u5CA2\u5CAA\u5CA7\u5C9D\u5CA5\u5CB6"+
-        "\u5CB0\u5CA6\u5E17\u5E14\u5E19\u5F28\u5F22\u5F23"+
-        "\u5F24\u5F54\u5F82\u5F7E\u5F7D\u5FDE\u5FE5\u602D"+
-        "\u6026\u6019\u6032\u600B\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6034\u600A"+
-        "\u6017\u6033\u601A\u601E\u602C\u6022\u600D\u6010"+
-        "\u602E\u6013\u6011\u600C\u6009\u601C\u6214\u623D"+
-        "\u62AD\u62B4\u62D1\u62BE\u62AA\u62B6\u62CA\u62AE"+
-        "\u62B3\u62AF\u62BB\u62A9\u62B0\u62B8\u653D\u65A8"+
-        "\u65BB\u6609\u65FC\u6604\u6612\u6608\u65FB\u6603"+
-        "\u660B\u660D\u6605\u65FD\u6611\u6610\u66F6\u670A"+
-        "\u6785\u676C\u678E\u6792\u6776\u677B\u6798\u6786"+
-        "\u6784\u6774\u678D\u678C\u677A\u679F\u6791\u6799"+
-        "\u6783\u677D\u6781\u6778\u6779\u6794\u6B25\u6B80"+
-        "\u6B7E\u6BDE\u6C1D\u6C93\u6CEC\u6CEB\u6CEE\u6CD9"+
-        "\u6CB6\u6CD4\u6CAD\u6CE7\u6CB7\u6CD0\u6CC2\u6CBA"+
-        "\u6CC3\u6CC6\u6CED\u6CF2\u6CD2\u6CDD\u6CB4\u6C8A"+
-        "\u6C9D\u6C80\u6CDE\u6CC0\u6D30\u6CCD\u6CC7\u6CB0"+
-        "\u6CF9\u6CCF\u6CE9\u6CD1\u7094\u7098\u7085\u7093"+
-        "\u7086\u7084\u7091\u7096\u7082\u709A\u7083\u726A"+
-        "\u72D6\u72CB\u72D8\u72C9\u72DC\u72D2\u72D4\u72DA"+
-        "\u72CC\u72D1\u73A4\u73A1\u73AD\u73A6\u73A2\u73A0"+
-        "\u73AC\u739D\u74DD\u74E8\u753F\u7540\u753E\u758C"+
-        "\u7598\u76AF\u76F3\u76F1\u76F0\u76F5\u77F8\u77FC"+
-        "\u77F9\u77FB\u77FA\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u77F7\u7942\u793F"+
-        "\u79C5\u7A78\u7A7B\u7AFB\u7C75\u7CFD\u8035\u808F"+
-        "\u80AE\u80A3\u80B8\u80B5\u80AD\u8220\u82A0\u82C0"+
-        "\u82AB\u829A\u8298\u829B\u82B5\u82A7\u82AE\u82BC"+
-        "\u829E\u82BA\u82B4\u82A8\u82A1\u82A9\u82C2\u82A4"+
-        "\u82C3\u82B6\u82A2\u8670\u866F\u866D\u866E\u8C56"+
-        "\u8FD2\u8FCB\u8FD3\u8FCD\u8FD6\u8FD5\u8FD7\u90B2"+
-        "\u90B4\u90AF\u90B3\u90B0\u9639\u963D\u963C\u963A"+
-        "\u9643\u4FCD\u4FC5\u4FD3\u4FB2\u4FC9\u4FCB\u4FC1"+
-        "\u4FD4\u4FDC\u4FD9\u4FBB\u4FB3\u4FDB\u4FC7\u4FD6"+
-        "\u4FBA\u4FC0\u4FB9\u4FEC\u5244\u5249\u52C0\u52C2"+
-        "\u533D\u537C\u5397\u5396\u5399\u5398\u54BA\u54A1"+
-        "\u54AD\u54A5\u54CF\u54C3\u830D\u54B7\u54AE\u54D6"+
-        "\u54B6\u54C5\u54C6\u54A0\u5470\u54BC\u54A2\u54BE"+
-        "\u5472\u54DE\u54B0\u57B5\u579E\u579F\u57A4\u578C"+
-        "\u5797\u579D\u579B\u5794\u5798\u578F\u5799\u57A5"+
-        "\u579A\u5795\u58F4\u590D\u5953\u59E1\u59DE\u59EE"+
-        "\u5A00\u59F1\u59DD\u59FA\u59FD\u59FC\u59F6\u59E4"+
-        "\u59F2\u59F7\u59DB\u59E9\u59F3\u59F5\u59E0\u59FE"+
-        "\u59F4\u59ED\u5BA8\u5C4C\u5CD0\u5CD8\u5CCC\u5CD7"+
-        "\u5CCB\u5CDB\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u5CDE\u5CDA\u5CC9\u5CC7"+
-        "\u5CCA\u5CD6\u5CD3\u5CD4\u5CCF\u5CC8\u5CC6\u5CCE"+
-        "\u5CDF\u5CF8\u5DF9\u5E21\u5E22\u5E23\u5E20\u5E24"+
-        "\u5EB0\u5EA4\u5EA2\u5E9B\u5EA3\u5EA5\u5F07\u5F2E"+
-        "\u5F56\u5F86\u6037\u6039\u6054\u6072\u605E\u6045"+
-        "\u6053\u6047\u6049\u605B\u604C\u6040\u6042\u605F"+
-        "\u6024\u6044\u6058\u6066\u606E\u6242\u6243\u62CF"+
-        "\u630D\u630B\u62F5\u630E\u6303\u62EB\u62F9\u630F"+
-        "\u630C\u62F8\u62F6\u6300\u6313\u6314\u62FA\u6315"+
-        "\u62FB\u62F0\u6541\u6543\u65AA\u65BF\u6636\u6621"+
-        "\u6632\u6635\u661C\u6626\u6622\u6633\u662B\u663A"+
-        "\u661D\u6634\u6639\u662E\u670F\u6710\u67C1\u67F2"+
-        "\u67C8\u67BA\u67DC\u67BB\u67F8\u67D8\u67C0\u67B7"+
-        "\u67C5\u67EB\u67E4\u67DF\u67B5\u67CD\u67B3\u67F7"+
-        "\u67F6\u67EE\u67E3\u67C2\u67B9\u67CE\u67E7\u67F0"+
-        "\u67B2\u67FC\u67C6\u67ED\u67CC\u67AE\u67E6\u67DB"+
-        "\u67FA\u67C9\u67CA\u67C3\u67EA\u67CB\u6B28\u6B82"+
-        "\u6B84\u6BB6\u6BD6\u6BD8\u6BE0\u6C20\u6C21\u6D28"+
-        "\u6D34\u6D2D\u6D1F\u6D3C\u6D3F\u6D12\u6D0A\u6CDA"+
-        "\u6D33\u6D04\u6D19\u6D3A\u6D1A\u6D11\u6D00\u6D1D"+
-        "\u6D42\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u6D01\u6D18\u6D37\u6D03\u6D0F"+
-        "\u6D40\u6D07\u6D20\u6D2C\u6D08\u6D22\u6D09\u6D10"+
-        "\u70B7\u709F\u70BE\u70B1\u70B0\u70A1\u70B4\u70B5"+
-        "\u70A9\u7241\u7249\u724A\u726C\u7270\u7273\u726E"+
-        "\u72CA\u72E4\u72E8\u72EB\u72DF\u72EA\u72E6\u72E3"+
-        "\u7385\u73CC\u73C2\u73C8\u73C5\u73B9\u73B6\u73B5"+
-        "\u73B4\u73EB\u73BF\u73C7\u73BE\u73C3\u73C6\u73B8"+
-        "\u73CB\u74EC\u74EE\u752E\u7547\u7548\u75A7\u75AA"+
-        "\u7679\u76C4\u7708\u7703\u7704\u7705\u770A\u76F7"+
-        "\u76FB\u76FA\u77E7\u77E8\u7806\u7811\u7812\u7805"+
-        "\u7810\u780F\u780E\u7809\u7803\u7813\u794A\u794C"+
-        "\u794B\u7945\u7944\u79D5\u79CD\u79CF\u79D6\u79CE"+
-        "\u7A80\u7A7E\u7AD1\u7B00\u7B01\u7C7A\u7C78\u7C79"+
-        "\u7C7F\u7C80\u7C81\u7D03\u7D08\u7D01\u7F58\u7F91"+
-        "\u7F8D\u7FBE\u8007\u800E\u800F\u8014\u8037\u80D8"+
-        "\u80C7\u80E0\u80D1\u80C8\u80C2\u80D0\u80C5\u80E3"+
-        "\u80D9\u80DC\u80CA\u80D5\u80C9\u80CF\u80D7\u80E6"+
-        "\u80CD\u81FF\u8221\u8294\u82D9\u82FE\u82F9\u8307"+
-        "\u82E8\u8300\u82D5\u833A\u82EB\u82D6\u82F4\u82EC"+
-        "\u82E1\u82F2\u82F5\u830C\u82FB\u82F6\u82F0\u82EA"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u82E4\u82E0\u82FA\u82F3\u82ED\u8677"+
-        "\u8674\u867C\u8673\u8841\u884E\u8867\u886A\u8869"+
-        "\u89D3\u8A04\u8A07\u8D72\u8FE3\u8FE1\u8FEE\u8FE0"+
-        "\u90F1\u90BD\u90BF\u90D5\u90C5\u90BE\u90C7\u90CB"+
-        "\u90C8\u91D4\u91D3\u9654\u964F\u9651\u9653\u964A"+
-        "\u964E\u501E\u5005\u5007\u5013\u5022\u5030\u501B"+
-        "\u4FF5\u4FF4\u5033\u5037\u502C\u4FF6\u4FF7\u5017"+
-        "\u501C\u5020\u5027\u5035\u502F\u5031\u500E\u515A"+
-        "\u5194\u5193\u51CA\u51C4\u51C5\u51C8\u51CE\u5261"+
-        "\u525A\u5252\u525E\u525F\u5255\u5262\u52CD\u530E"+
-        "\u539E\u5526\u54E2\u5517\u5512\u54E7\u54F3\u54E4"+
-        "\u551A\u54FF\u5504\u5508\u54EB\u5511\u5505\u54F1";
-
-    private final static String innerIndex3=
-        "\u550A\u54FB\u54F7\u54F8\u54E0\u550E\u5503\u550B"+
-        "\u5701\u5702\u57CC\u5832\u57D5\u57D2\u57BA\u57C6"+
-        "\u57BD\u57BC\u57B8\u57B6\u57BF\u57C7\u57D0\u57B9"+
-        "\u57C1\u590E\u594A\u5A19\u5A16\u5A2D\u5A2E\u5A15"+
-        "\u5A0F\u5A17\u5A0A\u5A1E\u5A33\u5B6C\u5BA7\u5BAD"+
-        "\u5BAC\u5C03\u5C56\u5C54\u5CEC\u5CFF\u5CEE\u5CF1"+
-        "\u5CF7\u5D00\u5CF9\u5E29\u5E28\u5EA8\u5EAE\u5EAA"+
-        "\u5EAC\u5F33\u5F30\u5F67\u605D\u605A\u6067\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u6041\u60A2\u6088\u6080\u6092\u6081\u609D"+
-        "\u6083\u6095\u609B\u6097\u6087\u609C\u608E\u6219"+
-        "\u6246\u62F2\u6310\u6356\u632C\u6344\u6345\u6336"+
-        "\u6343\u63E4\u6339\u634B\u634A\u633C\u6329\u6341"+
-        "\u6334\u6358\u6354\u6359\u632D\u6347\u6333\u635A"+
-        "\u6351\u6338\u6357\u6340\u6348\u654A\u6546\u65C6"+
-        "\u65C3\u65C4\u65C2\u664A\u665F\u6647\u6651\u6712"+
-        "\u6713\u681F\u681A\u6849\u6832\u6833\u683B\u684B"+
-        "\u684F\u6816\u6831\u681C\u6835\u682B\u682D\u682F"+
-        "\u684E\u6844\u6834\u681D\u6812\u6814\u6826\u6828"+
-        "\u682E\u684D\u683A\u6825\u6820\u6B2C\u6B2F\u6B2D"+
-        "\u6B31\u6B34\u6B6D\u8082\u6B88\u6BE6\u6BE4\u6BE8"+
-        "\u6BE3\u6BE2\u6BE7\u6C25\u6D7A\u6D63\u6D64\u6D76"+
-        "\u6D0D\u6D61\u6D92\u6D58\u6D62\u6D6D\u6D6F\u6D91"+
-        "\u6D8D\u6DEF\u6D7F\u6D86\u6D5E\u6D67\u6D60\u6D97"+
-        "\u6D70\u6D7C\u6D5F\u6D82\u6D98\u6D2F\u6D68\u6D8B"+
-        "\u6D7E\u6D80\u6D84\u6D16\u6D83\u6D7B\u6D7D\u6D75"+
-        "\u6D90\u70DC\u70D3\u70D1\u70DD\u70CB\u7F39\u70E2"+
-        "\u70D7\u70D2\u70DE\u70E0\u70D4\u70CD\u70C5\u70C6"+
-        "\u70C7\u70DA\u70CE\u70E1\u7242\u7278\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u7277\u7276\u7300\u72FA\u72F4\u72FE\u72F6\u72F3"+
-        "\u72FB\u7301\u73D3\u73D9\u73E5\u73D6\u73BC\u73E7"+
-        "\u73E3\u73E9\u73DC\u73D2\u73DB\u73D4\u73DD\u73DA"+
-        "\u73D7\u73D8\u73E8\u74DE\u74DF\u74F4\u74F5\u7521"+
-        "\u755B\u755F\u75B0\u75C1\u75BB\u75C4\u75C0\u75BF"+
-        "\u75B6\u75BA\u768A\u76C9\u771D\u771B\u7710\u7713"+
-        "\u7712\u7723\u7711\u7715\u7719\u771A\u7722\u7727"+
-        "\u7823\u782C\u7822\u7835\u782F\u7828\u782E\u782B"+
-        "\u7821\u7829\u7833\u782A\u7831\u7954\u795B\u794F"+
-        "\u795C\u7953\u7952\u7951\u79EB\u79EC\u79E0\u79EE"+
-        "\u79ED\u79EA\u79DC\u79DE\u79DD\u7A86\u7A89\u7A85"+
-        "\u7A8B\u7A8C\u7A8A\u7A87\u7AD8\u7B10\u7B04\u7B13"+
-        "\u7B05\u7B0F\u7B08\u7B0A\u7B0E\u7B09\u7B12\u7C84"+
-        "\u7C91\u7C8A\u7C8C\u7C88\u7C8D\u7C85\u7D1E\u7D1D"+
-        "\u7D11\u7D0E\u7D18\u7D16\u7D13\u7D1F\u7D12\u7D0F"+
-        "\u7D0C\u7F5C\u7F61\u7F5E\u7F60\u7F5D\u7F5B\u7F96"+
-        "\u7F92\u7FC3\u7FC2\u7FC0\u8016\u803E\u8039\u80FA"+
-        "\u80F2\u80F9\u80F5\u8101\u80FB\u8100\u8201\u822F"+
-        "\u8225\u8333\u832D\u8344\u8319\u8351\u8325\u8356"+
-        "\u833F\u8341\u8326\u831C\u8322\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8342"+
-        "\u834E\u831B\u832A\u8308\u833C\u834D\u8316\u8324"+
-        "\u8320\u8337\u832F\u8329\u8347\u8345\u834C\u8353"+
-        "\u831E\u832C\u834B\u8327\u8348\u8653\u8652\u86A2"+
-        "\u86A8\u8696\u868D\u8691\u869E\u8687\u8697\u8686"+
-        "\u868B\u869A\u8685\u86A5\u8699\u86A1\u86A7\u8695"+
-        "\u8698\u868E\u869D\u8690\u8694\u8843\u8844\u886D"+
-        "\u8875\u8876\u8872\u8880\u8871\u887F\u886F\u8883"+
-        "\u887E\u8874\u887C\u8A12\u8C47\u8C57\u8C7B\u8CA4"+
-        "\u8CA3\u8D76\u8D78\u8DB5\u8DB7\u8DB6\u8ED1\u8ED3"+
-        "\u8FFE\u8FF5\u9002\u8FFF\u8FFB\u9004\u8FFC\u8FF6"+
-        "\u90D6\u90E0\u90D9\u90DA\u90E3\u90DF\u90E5\u90D8"+
-        "\u90DB\u90D7\u90DC\u90E4\u9150\u914E\u914F\u91D5"+
-        "\u91E2\u91DA\u965C\u965F\u96BC\u98E3\u9ADF\u9B2F"+
-        "\u4E7F\u5070\u506A\u5061\u505E\u5060\u5053\u504B"+
-        "\u505D\u5072\u5048\u504D\u5041\u505B\u504A\u5062"+
-        "\u5015\u5045\u505F\u5069\u506B\u5063\u5064\u5046"+
-        "\u5040\u506E\u5073\u5057\u5051\u51D0\u526B\u526D"+
-        "\u526C\u526E\u52D6\u52D3\u532D\u539C\u5575\u5576"+
-        "\u553C\u554D\u5550\u5534\u552A\u5551\u5562\u5536"+
-        "\u5535\u5530\u5552\u5545\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u550C\u5532"+
-        "\u5565\u554E\u5539\u5548\u552D\u553B\u5540\u554B"+
-        "\u570A\u5707\u57FB\u5814\u57E2\u57F6\u57DC\u57F4"+
-        "\u5800\u57ED\u57FD\u5808\u57F8\u580B\u57F3\u57CF"+
-        "\u5807\u57EE\u57E3\u57F2\u57E5\u57EC\u57E1\u580E"+
-        "\u57FC\u5810\u57E7\u5801\u580C\u57F1\u57E9\u57F0"+
-        "\u580D\u5804\u595C\u5A60\u5A58\u5A55\u5A67\u5A5E"+
-        "\u5A38\u5A35\u5A6D\u5A50\u5A5F\u5A65\u5A6C\u5A53"+
-        "\u5A64\u5A57\u5A43\u5A5D\u5A52\u5A44\u5A5B\u5A48"+
-        "\u5A8E\u5A3E\u5A4D\u5A39\u5A4C\u5A70\u5A69\u5A47"+
-        "\u5A51\u5A56\u5A42\u5A5C\u5B72\u5B6E\u5BC1\u5BC0"+
-        "\u5C59\u5D1E\u5D0B\u5D1D\u5D1A\u5D20\u5D0C\u5D28"+
-        "\u5D0D\u5D26\u5D25\u5D0F\u5D30\u5D12\u5D23\u5D1F"+
-        "\u5D2E\u5E3E\u5E34\u5EB1\u5EB4\u5EB9\u5EB2\u5EB3"+
-        "\u5F36\u5F38\u5F9B\u5F96\u5F9F\u608A\u6090\u6086"+
-        "\u60BE\u60B0\u60BA\u60D3\u60D4\u60CF\u60E4\u60D9"+
-        "\u60DD\u60C8\u60B1\u60DB\u60B7\u60CA\u60BF\u60C3"+
-        "\u60CD\u60C0\u6332\u6365\u638A\u6382\u637D\u63BD"+
-        "\u639E\u63AD\u639D\u6397\u63AB\u638E\u636F\u6387"+
-        "\u6390\u636E\u63AF\u6375\u639C\u636D\u63AE\u637C"+
-        "\u63A4\u633B\u639F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6378\u6385\u6381"+
-        "\u6391\u638D\u6370\u6553\u65CD\u6665\u6661\u665B"+
-        "\u6659\u665C\u6662\u6718\u6879\u6887\u6890\u689C"+
-        "\u686D\u686E\u68AE\u68AB\u6956\u686F\u68A3\u68AC"+
-        "\u68A9\u6875\u6874\u68B2\u688F\u6877\u6892\u687C"+
-        "\u686B\u6872\u68AA\u6880\u6871\u687E\u689B\u6896"+
-        "\u688B\u68A0\u6889\u68A4\u6878\u687B\u6891\u688C"+
-        "\u688A\u687D\u6B36\u6B33\u6B37\u6B38\u6B91\u6B8F"+
-        "\u6B8D\u6B8E\u6B8C\u6C2A\u6DC0\u6DAB\u6DB4\u6DB3"+
-        "\u6E74\u6DAC\u6DE9\u6DE2\u6DB7\u6DF6\u6DD4\u6E00"+
-        "\u6DC8\u6DE0\u6DDF\u6DD6\u6DBE\u6DE5\u6DDC\u6DDD"+
-        "\u6DDB\u6DF4\u6DCA\u6DBD\u6DED\u6DF0\u6DBA\u6DD5"+
-        "\u6DC2\u6DCF\u6DC9\u6DD0\u6DF2\u6DD3\u6DFD\u6DD7"+
-        "\u6DCD\u6DE3\u6DBB\u70FA\u710D\u70F7\u7117\u70F4"+
-        "\u710C\u70F0\u7104\u70F3\u7110\u70FC\u70FF\u7106"+
-        "\u7113\u7100\u70F8\u70F6\u710B\u7102\u710E\u727E"+
-        "\u727B\u727C\u727F\u731D\u7317\u7307\u7311\u7318"+
-        "\u730A\u7308\u72FF\u730F\u731E\u7388\u73F6\u73F8"+
-        "\u73F5\u7404\u7401\u73FD\u7407\u7400\u73FA\u73FC"+
-        "\u73FF\u740C\u740B\u73F4\u7408\u7564\u7563\u75CE"+
-        "\u75D2\u75CF\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u75CB\u75CC\u75D1\u75D0"+
-        "\u768F\u7689\u76D3\u7739\u772F\u772D\u7731\u7732"+
-        "\u7734\u7733\u773D\u7725\u773B\u7735\u7848\u7852"+
-        "\u7849\u784D\u784A\u784C\u7826\u7845\u7850\u7964"+
-        "\u7967\u7969\u796A\u7963\u796B\u7961\u79BB\u79FA"+
-        "\u79F8\u79F6\u79F7\u7A8F\u7A94\u7A90\u7B35\u7B47"+
-        "\u7B34\u7B25\u7B30\u7B22\u7B24\u7B33\u7B18\u7B2A"+
-        "\u7B1D\u7B31\u7B2B\u7B2D\u7B2F\u7B32\u7B38\u7B1A"+
-        "\u7B23\u7C94\u7C98\u7C96\u7CA3\u7D35\u7D3D\u7D38"+
-        "\u7D36\u7D3A\u7D45\u7D2C\u7D29\u7D41\u7D47\u7D3E"+
-        "\u7D3F\u7D4A\u7D3B\u7D28\u7F63\u7F95\u7F9C\u7F9D"+
-        "\u7F9B\u7FCA\u7FCB\u7FCD\u7FD0\u7FD1\u7FC7\u7FCF"+
-        "\u7FC9\u801F\u801E\u801B\u8047\u8043\u8048\u8118"+
-        "\u8125\u8119\u811B\u812D\u811F\u812C\u811E\u8121"+
-        "\u8115\u8127\u811D\u8122\u8211\u8238\u8233\u823A"+
-        "\u8234\u8232\u8274\u8390\u83A3\u83A8\u838D\u837A"+
-        "\u8373\u83A4\u8374\u838F\u8381\u8395\u8399\u8375"+
-        "\u8394\u83A9\u837D\u8383\u838C\u839D\u839B\u83AA"+
-        "\u838B\u837E\u83A5\u83AF\u8388\u8397\u83B0\u837F"+
-        "\u83A6\u8387\u83AE\u8376\u839A\u8659\u8656\u86BF"+
-        "\u86B7\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u86C2\u86C1\u86C5\u86BA\u86B0"+
-        "\u86C8\u86B9\u86B3\u86B8\u86CC\u86B4\u86BB\u86BC"+
-        "\u86C3\u86BD\u86BE\u8852\u8889\u8895\u88A8\u88A2"+
-        "\u88AA\u889A\u8891\u88A1\u889F\u8898\u88A7\u8899"+
-        "\u889B\u8897\u88A4\u88AC\u888C\u8893\u888E\u8982"+
-        "\u89D6\u89D9\u89D5\u8A30\u8A27\u8A2C\u8A1E\u8C39"+
-        "\u8C3B\u8C5C\u8C5D\u8C7D\u8CA5\u8D7D\u8D7B\u8D79"+
-        "\u8DBC\u8DC2\u8DB9\u8DBF\u8DC1\u8ED8\u8EDE\u8EDD"+
-        "\u8EDC\u8ED7\u8EE0\u8EE1\u9024\u900B\u9011\u901C"+
-        "\u900C\u9021\u90EF\u90EA\u90F0\u90F4\u90F2\u90F3"+
-        "\u90D4\u90EB\u90EC\u90E9\u9156\u9158\u915A\u9153"+
-        "\u9155\u91EC\u91F4\u91F1\u91F3\u91F8\u91E4\u91F9"+
-        "\u91EA\u91EB\u91F7\u91E8\u91EE\u957A\u9586\u9588"+
-        "\u967C\u966D\u966B\u9671\u966F\u96BF\u976A\u9804"+
-        "\u98E5\u9997\u509B\u5095\u5094\u509E\u508B\u50A3"+
-        "\u5083\u508C\u508E\u509D\u5068\u509C\u5092\u5082"+
-        "\u5087\u515F\u51D4\u5312\u5311\u53A4\u53A7\u5591"+
-        "\u55A8\u55A5\u55AD\u5577\u5645\u55A2\u5593\u5588"+
-        "\u558F\u55B5\u5581\u55A3\u5592\u55A4\u557D\u558C"+
-        "\u55A6\u557F\u5595\u55A1\u558E\u570C\u5829\u5837"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u5819\u581E\u5827\u5823\u5828\u57F5"+
-        "\u5848\u5825\u581C\u581B\u5833\u583F\u5836\u582E"+
-        "\u5839\u5838\u582D\u582C\u583B\u5961\u5AAF\u5A94"+
-        "\u5A9F\u5A7A\u5AA2\u5A9E\u5A78\u5AA6\u5A7C\u5AA5"+
-        "\u5AAC\u5A95\u5AAE\u5A37\u5A84\u5A8A\u5A97\u5A83"+
-        "\u5A8B\u5AA9\u5A7B\u5A7D\u5A8C\u5A9C\u5A8F\u5A93"+
-        "\u5A9D\u5BEA\u5BCD\u5BCB\u5BD4\u5BD1\u5BCA\u5BCE"+
-        "\u5C0C\u5C30\u5D37\u5D43\u5D6B\u5D41\u5D4B\u5D3F"+
-        "\u5D35\u5D51\u5D4E\u5D55\u5D33\u5D3A\u5D52\u5D3D"+
-        "\u5D31\u5D59\u5D42\u5D39\u5D49\u5D38\u5D3C\u5D32"+
-        "\u5D36\u5D40\u5D45\u5E44\u5E41\u5F58\u5FA6\u5FA5"+
-        "\u5FAB\u60C9\u60B9\u60CC\u60E2\u60CE\u60C4\u6114"+
-        "\u60F2\u610A\u6116\u6105\u60F5\u6113\u60F8\u60FC"+
-        "\u60FE\u60C1\u6103\u6118\u611D\u6110\u60FF\u6104"+
-        "\u610B\u624A\u6394\u63B1\u63B0\u63CE\u63E5\u63E8"+
-        "\u63EF\u63C3\u649D\u63F3\u63CA\u63E0\u63F6\u63D5"+
-        "\u63F2\u63F5\u6461\u63DF\u63BE\u63DD\u63DC\u63C4"+
-        "\u63D8\u63D3\u63C2\u63C7\u63CC\u63CB\u63C8\u63F0"+
-        "\u63D7\u63D9\u6532\u6567\u656A\u6564\u655C\u6568"+
-        "\u6565\u658C\u659D\u659E\u65AE\u65D0\u65D2\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u667C\u666C\u667B\u6680\u6671\u6679\u666A"+
-        "\u6672\u6701\u690C\u68D3\u6904\u68DC\u692A\u68EC"+
-        "\u68EA\u68F1\u690F\u68D6\u68F7\u68EB\u68E4\u68F6"+
-        "\u6913\u6910\u68F3\u68E1\u6907\u68CC\u6908\u6970"+
-        "\u68B4\u6911\u68EF\u68C6\u6914\u68F8\u68D0\u68FD"+
-        "\u68FC\u68E8\u690B\u690A\u6917\u68CE\u68C8\u68DD"+
-        "\u68DE\u68E6\u68F4\u68D1\u6906\u68D4\u68E9\u6915"+
-        "\u6925\u68C7\u6B39\u6B3B\u6B3F\u6B3C\u6B94\u6B97"+
-        "\u6B99\u6B95\u6BBD\u6BF0\u6BF2\u6BF3\u6C30\u6DFC"+
-        "\u6E46\u6E47\u6E1F\u6E49\u6E88\u6E3C\u6E3D\u6E45"+
-        "\u6E62\u6E2B\u6E3F\u6E41\u6E5D\u6E73\u6E1C\u6E33"+
-        "\u6E4B\u6E40\u6E51\u6E3B\u6E03\u6E2E\u6E5E\u6E68"+
-        "\u6E5C\u6E61\u6E31\u6E28\u6E60\u6E71\u6E6B\u6E39"+
-        "\u6E22\u6E30\u6E53\u6E65\u6E27\u6E78\u6E64\u6E77"+
-        "\u6E55\u6E79\u6E52\u6E66\u6E35\u6E36\u6E5A\u7120"+
-        "\u711E\u712F\u70FB\u712E\u7131\u7123\u7125\u7122"+
-        "\u7132\u711F\u7128\u713A\u711B\u724B\u725A\u7288"+
-        "\u7289\u7286\u7285\u728B\u7312\u730B\u7330\u7322"+
-        "\u7331\u7333\u7327\u7332\u732D\u7326\u7323\u7335"+
-        "\u730C\u742E\u742C\u7430\u742B\u7416\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u741A\u7421\u742D\u7431\u7424\u7423\u741D\u7429"+
-        "\u7420\u7432\u74FB\u752F\u756F\u756C\u75E7\u75DA"+
-        "\u75E1\u75E6\u75DD\u75DF\u75E4\u75D7\u7695\u7692"+
-        "\u76DA\u7746\u7747\u7744\u774D\u7745\u774A\u774E"+
-        "\u774B\u774C\u77DE\u77EC\u7860\u7864\u7865\u785C"+
-        "\u786D\u7871\u786A\u786E\u7870\u7869\u7868\u785E"+
-        "\u7862\u7974\u7973\u7972\u7970\u7A02\u7A0A\u7A03"+
-        "\u7A0C\u7A04\u7A99\u7AE6\u7AE4\u7B4A\u7B3B\u7B44"+
-        "\u7B48\u7B4C\u7B4E\u7B40\u7B58\u7B45\u7CA2\u7C9E"+
-        "\u7CA8\u7CA1\u7D58\u7D6F\u7D63\u7D53\u7D56\u7D67"+
-        "\u7D6A\u7D4F\u7D6D\u7D5C\u7D6B\u7D52\u7D54\u7D69"+
-        "\u7D51\u7D5F\u7D4E\u7F3E\u7F3F\u7F65\u7F66\u7FA2"+
-        "\u7FA0\u7FA1\u7FD7\u8051\u804F\u8050\u80FE\u80D4"+
-        "\u8143\u814A\u8152\u814F\u8147\u813D\u814D\u813A"+
-        "\u81E6\u81EE\u81F7\u81F8\u81F9\u8204\u823C\u823D"+
-        "\u823F\u8275\u833B\u83CF\u83F9\u8423\u83C0\u83E8"+
-        "\u8412\u83E7\u83E4\u83FC\u83F6\u8410\u83C6\u83C8"+
-        "\u83EB\u83E3\u83BF\u8401\u83DD\u83E5\u83D8\u83FF"+
-        "\u83E1\u83CB\u83CE\u83D6\u83F5\u83C9\u8409\u840F"+
-        "\u83DE\u8411\u8406\u83C2\u83F3\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u83D5"+
-        "\u83FA\u83C7\u83D1\u83EA\u8413\u83C3\u83EC\u83EE"+
-        "\u83C4\u83FB\u83D7\u83E2\u841B\u83DB\u83FE\u86D8"+
-        "\u86E2\u86E6\u86D3\u86E3\u86DA\u86EA\u86DD\u86EB"+
-        "\u86DC\u86EC\u86E9\u86D7\u86E8\u86D1\u8848\u8856"+
-        "\u8855\u88BA\u88D7\u88B9\u88B8\u88C0\u88BE\u88B6"+
-        "\u88BC\u88B7\u88BD\u88B2\u8901\u88C9\u8995\u8998"+
-        "\u8997\u89DD\u89DA\u89DB\u8A4E\u8A4D\u8A39\u8A59"+
-        "\u8A40\u8A57\u8A58\u8A44\u8A45\u8A52\u8A48\u8A51"+
-        "\u8A4A\u8A4C\u8A4F\u8C5F\u8C81\u8C80\u8CBA\u8CBE"+
-        "\u8CB0\u8CB9\u8CB5\u8D84\u8D80\u8D89\u8DD8\u8DD3"+
-        "\u8DCD\u8DC7\u8DD6\u8DDC\u8DCF\u8DD5\u8DD9\u8DC8"+
-        "\u8DD7\u8DC5\u8EEF\u8EF7\u8EFA\u8EF9\u8EE6\u8EEE"+
-        "\u8EE5\u8EF5\u8EE7\u8EE8\u8EF6\u8EEB\u8EF1\u8EEC"+
-        "\u8EF4\u8EE9\u902D\u9034\u902F\u9106\u912C\u9104"+
-        "\u90FF\u90FC\u9108\u90F9\u90FB\u9101\u9100\u9107"+
-        "\u9105\u9103\u9161\u9164\u915F\u9162\u9160\u9201"+
-        "\u920A\u9225\u9203\u921A\u9226\u920F\u920C\u9200"+
-        "\u9212\u91FF\u91FD\u9206\u9204\u9227\u9202\u921C"+
-        "\u9224\u9219\u9217\u9205\u9216\u957B\u958D\u958C"+
-        "\u9590\u9687\u967E\u9688\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9689\u9683"+
-        "\u9680\u96C2\u96C8\u96C3\u96F1\u96F0\u976C\u9770"+
-        "\u976E\u9807\u98A9\u98EB\u9CE6\u9EF9\u4E83\u4E84"+
-        "\u4EB6\u50BD\u50BF\u50C6\u50AE\u50C4\u50CA\u50B4"+
-        "\u50C8\u50C2\u50B0\u50C1\u50BA\u50B1\u50CB\u50C9"+
-        "\u50B6\u50B8\u51D7\u527A\u5278\u527B\u527C\u55C3"+
-        "\u55DB\u55CC\u55D0\u55CB\u55CA\u55DD\u55C0\u55D4"+
-        "\u55C4\u55E9\u55BF\u55D2\u558D\u55CF\u55D5\u55E2"+
-        "\u55D6\u55C8\u55F2\u55CD\u55D9\u55C2\u5714\u5853"+
-        "\u5868\u5864\u584F\u584D\u5849\u586F\u5855\u584E"+
-        "\u585D\u5859\u5865\u585B\u583D\u5863\u5871\u58FC"+
-        "\u5AC7\u5AC4\u5ACB\u5ABA\u5AB8\u5AB1\u5AB5\u5AB0"+
-        "\u5ABF\u5AC8\u5ABB\u5AC6\u5AB7\u5AC0\u5ACA\u5AB4"+
-        "\u5AB6\u5ACD\u5AB9\u5A90\u5BD6\u5BD8\u5BD9\u5C1F"+
-        "\u5C33\u5D71\u5D63\u5D4A\u5D65\u5D72\u5D6C\u5D5E"+
-        "\u5D68\u5D67\u5D62\u5DF0\u5E4F\u5E4E\u5E4A\u5E4D"+
-        "\u5E4B\u5EC5\u5ECC\u5EC6\u5ECB\u5EC7\u5F40\u5FAF"+
-        "\u5FAD\u60F7\u6149\u614A\u612B\u6145\u6136\u6132"+
-        "\u612E\u6146\u612F\u614F\u6129\u6140\u6220\u9168"+
-        "\u6223\u6225\u6224\u63C5\u63F1\u63EB\u6410\u6412"+
-        "\u6409\u6420\u6424\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u6433\u6443\u641F"+
-        "\u6415\u6418\u6439\u6437\u6422\u6423\u640C\u6426"+
-        "\u6430\u6428\u6441\u6435\u642F\u640A\u641A\u6440"+
-        "\u6425\u6427\u640B\u63E7\u641B\u642E\u6421\u640E"+
-        "\u656F\u6592\u65D3\u6686\u668C\u6695\u6690\u668B"+
-        "\u668A\u6699\u6694\u6678\u6720\u6966\u695F\u6938"+
-        "\u694E\u6962\u6971\u693F\u6945\u696A\u6939\u6942"+
-        "\u6957\u6959\u697A\u6948\u6949\u6935\u696C\u6933"+
-        "\u693D\u6965\u68F0\u6978\u6934\u6969\u6940\u696F"+
-        "\u6944\u6976\u6958\u6941\u6974\u694C\u693B\u694B"+
-        "\u6937\u695C\u694F\u6951\u6932\u6952\u692F\u697B"+
-        "\u693C\u6B46\u6B45\u6B43\u6B42\u6B48\u6B41\u6B9B"+
-        "\uFA0D\u6BFB\u6BFC\u6BF9\u6BF7\u6BF8\u6E9B\u6ED6"+
-        "\u6EC8\u6E8F\u6EC0\u6E9F\u6E93\u6E94\u6EA0\u6EB1"+
-        "\u6EB9\u6EC6\u6ED2\u6EBD\u6EC1\u6E9E\u6EC9\u6EB7"+
-        "\u6EB0\u6ECD\u6EA6\u6ECF\u6EB2\u6EBE\u6EC3\u6EDC"+
-        "\u6ED8\u6E99\u6E92\u6E8E\u6E8D\u6EA4\u6EA1\u6EBF"+
-        "\u6EB3\u6ED0\u6ECA\u6E97\u6EAE\u6EA3\u7147\u7154"+
-        "\u7152\u7163\u7160\u7141\u715D\u7162\u7172\u7178"+
-        "\u716A\u7161\u7142\u7158\u7143\u714B\u7170\u715F"+
-        "\u7150\u7153\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u7144\u714D\u715A\u724F"+
-        "\u728D\u728C\u7291\u7290\u728E\u733C\u7342\u733B"+
-        "\u733A\u7340\u734A\u7349\u7444\u744A\u744B\u7452"+
-        "\u7451\u7457\u7440\u744F\u7450\u744E\u7442\u7446"+
-        "\u744D\u7454\u74E1\u74FF\u74FE\u74FD\u751D\u7579"+
-        "\u7577\u6983\u75EF\u760F\u7603\u75F7\u75FE\u75FC"+
-        "\u75F9\u75F8\u7610\u75FB\u75F6\u75ED\u75F5\u75FD"+
-        "\u7699\u76B5\u76DD\u7755\u775F\u7760\u7752\u7756"+
-        "\u775A\u7769\u7767\u7754\u7759\u776D\u77E0\u7887"+
-        "\u789A\u7894\u788F\u7884\u7895\u7885\u7886\u78A1"+
-        "\u7883\u7879\u7899\u7880\u7896\u787B\u797C\u7982"+
-        "\u797D\u7979\u7A11\u7A18\u7A19\u7A12\u7A17\u7A15"+
-        "\u7A22\u7A13\u7A1B\u7A10\u7AA3\u7AA2\u7A9E\u7AEB"+
-        "\u7B66\u7B64\u7B6D\u7B74\u7B69\u7B72\u7B65\u7B73"+
-        "\u7B71\u7B70\u7B61\u7B78\u7B76\u7B63\u7CB2\u7CB4"+
-        "\u7CAF\u7D88\u7D86\u7D80\u7D8D\u7D7F\u7D85\u7D7A"+
-        "\u7D8E\u7D7B\u7D83\u7D7C\u7D8C\u7D94\u7D84\u7D7D"+
-        "\u7D92\u7F6D\u7F6B\u7F67\u7F68\u7F6C\u7FA6\u7FA5"+
-        "\u7FA7\u7FDB\u7FDC\u8021\u8164\u8160\u8177\u815C"+
-        "\u8169\u815B\u8162\u8172\u6721\u815E\u8176\u8167"+
-        "\u816F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u8144\u8161\u821D\u8249\u8244"+
-        "\u8240\u8242\u8245\u84F1\u843F\u8456\u8476\u8479"+
-        "\u848F\u848D\u8465\u8451\u8440\u8486\u8467\u8430"+
-        "\u844D\u847D\u845A\u8459\u8474\u8473\u845D\u8507"+
-        "\u845E\u8437\u843A\u8434\u847A\u8443\u8478\u8432"+
-        "\u8445\u8429\u83D9\u844B\u842F\u8442\u842D\u845F"+
-        "\u8470\u8439\u844E\u844C\u8452\u846F\u84C5\u848E"+
-        "\u843B\u8447\u8436\u8433\u8468\u847E\u8444\u842B"+
-        "\u8460\u8454\u846E\u8450\u870B\u8704\u86F7\u870C"+
-        "\u86FA\u86D6\u86F5\u874D\u86F8\u870E\u8709\u8701"+
-        "\u86F6\u870D\u8705\u88D6\u88CB\u88CD\u88CE\u88DE"+
-        "\u88DB\u88DA\u88CC\u88D0\u8985\u899B\u89DF\u89E5"+
-        "\u89E4\u89E1\u89E0\u89E2\u89DC\u89E6\u8A76\u8A86"+
-        "\u8A7F\u8A61\u8A3F\u8A77\u8A82\u8A84\u8A75\u8A83"+
-        "\u8A81\u8A74\u8A7A\u8C3C\u8C4B\u8C4A\u8C65\u8C64"+
-        "\u8C66\u8C86\u8C84\u8C85\u8CCC\u8D68\u8D69\u8D91"+
-        "\u8D8C\u8D8E\u8D8F\u8D8D\u8D93\u8D94\u8D90\u8D92"+
-        "\u8DF0\u8DE0\u8DEC\u8DF1\u8DEE\u8DD0\u8DE9\u8DE3"+
-        "\u8DE2\u8DE7\u8DF2\u8DEB\u8DF4\u8F06\u8EFF\u8F01"+
-        "\u8F00\u8F05\u8F07\u8F08\u8F02\u8F0B\u9052\u903F"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u9044\u9049\u903D\u9110\u910D\u910F"+
-        "\u9111\u9116\u9114\u910B\u910E\u916E\u916F\u9248"+
-        "\u9252\u9230\u923A\u9266\u9233\u9265\u925E\u9283"+
-        "\u922E\u924A\u9246\u926D\u926C\u924F\u9260\u9267"+
-        "\u926F\u9236\u9261\u9270\u9231\u9254\u9263\u9250"+
-        "\u9272\u924E\u9253\u924C\u9256\u9232\u959F\u959C"+
-        "\u959E\u959B\u9692\u9693\u9691\u9697\u96CE\u96FA"+
-        "\u96FD\u96F8\u96F5\u9773\u9777\u9778\u9772\u980F"+
-        "\u980D\u980E\u98AC\u98F6\u98F9\u99AF\u99B2\u99B0"+
-        "\u99B5\u9AAD\u9AAB\u9B5B\u9CEA\u9CED\u9CE7\u9E80"+
-        "\u9EFD\u50E6\u50D4\u50D7\u50E8\u50F3\u50DB\u50EA"+
-        "\u50DD\u50E4\u50D3\u50EC\u50F0\u50EF\u50E3\u50E0";
-
-    private final static String innerIndex4=
-        "\u51D8\u5280\u5281\u52E9\u52EB\u5330\u53AC\u5627"+
-        "\u5615\u560C\u5612\u55FC\u560F\u561C\u5601\u5613"+
-        "\u5602\u55FA\u561D\u5604\u55FF\u55F9\u5889\u587C"+
-        "\u5890\u5898\u5886\u5881\u587F\u5874\u588B\u587A"+
-        "\u5887\u5891\u588E\u5876\u5882\u5888\u587B\u5894"+
-        "\u588F\u58FE\u596B\u5ADC\u5AEE\u5AE5\u5AD5\u5AEA"+
-        "\u5ADA\u5AED\u5AEB\u5AF3\u5AE2\u5AE0\u5ADB\u5AEC"+
-        "\u5ADE\u5ADD\u5AD9\u5AE8\u5ADF\u5B77\u5BE0\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u5BE3\u5C63\u5D82\u5D80\u5D7D\u5D86\u5D7A"+
-        "\u5D81\u5D77\u5D8A\u5D89\u5D88\u5D7E\u5D7C\u5D8D"+
-        "\u5D79\u5D7F\u5E58\u5E59\u5E53\u5ED8\u5ED1\u5ED7"+
-        "\u5ECE\u5EDC\u5ED5\u5ED9\u5ED2\u5ED4\u5F44\u5F43"+
-        "\u5F6F\u5FB6\u612C\u6128\u6141\u615E\u6171\u6173"+
-        "\u6152\u6153\u6172\u616C\u6180\u6174\u6154\u617A"+
-        "\u615B\u6165\u613B\u616A\u6161\u6156\u6229\u6227"+
-        "\u622B\u642B\u644D\u645B\u645D\u6474\u6476\u6472"+
-        "\u6473\u647D\u6475\u6466\u64A6\u644E\u6482\u645E"+
-        "\u645C\u644B\u6453\u6460\u6450\u647F\u643F\u646C"+
-        "\u646B\u6459\u6465\u6477\u6573\u65A0\u66A1\u66A0"+
-        "\u669F\u6705\u6704\u6722\u69B1\u69B6\u69C9\u69A0"+
-        "\u69CE\u6996\u69B0\u69AC\u69BC\u6991\u6999\u698E"+
-        "\u69A7\u698D\u69A9\u69BE\u69AF\u69BF\u69C4\u69BD"+
-        "\u69A4\u69D4\u69B9\u69CA\u699A\u69CF\u69B3\u6993"+
-        "\u69AA\u69A1\u699E\u69D9\u6997\u6990\u69C2\u69B5"+
-        "\u69A5\u69C6\u6B4A\u6B4D\u6B4B\u6B9E\u6B9F\u6BA0"+
-        "\u6BC3\u6BC4\u6BFE\u6ECE\u6EF5\u6EF1\u6F03\u6F25"+
-        "\u6EF8\u6F37\u6EFB\u6F2E\u6F09\u6F4E\u6F19\u6F1A"+
-        "\u6F27\u6F18\u6F3B\u6F12\u6EED\u6F0A\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u6F36\u6F73\u6EF9\u6EEE\u6F2D\u6F40\u6F30\u6F3C"+
-        "\u6F35\u6EEB\u6F07\u6F0E\u6F43\u6F05\u6EFD\u6EF6"+
-        "\u6F39\u6F1C\u6EFC\u6F3A\u6F1F\u6F0D\u6F1E\u6F08"+
-        "\u6F21\u7187\u7190\u7189\u7180\u7185\u7182\u718F"+
-        "\u717B\u7186\u7181\u7197\u7244\u7253\u7297\u7295"+
-        "\u7293\u7343\u734D\u7351\u734C\u7462\u7473\u7471"+
-        "\u7475\u7472\u7467\u746E\u7500\u7502\u7503\u757D"+
-        "\u7590\u7616\u7608\u760C\u7615\u7611\u760A\u7614"+
-        "\u76B8\u7781\u777C\u7785\u7782\u776E\u7780\u776F"+
-        "\u777E\u7783\u78B2\u78AA\u78B4\u78AD\u78A8\u787E"+
-        "\u78AB\u789E\u78A5\u78A0\u78AC\u78A2\u78A4\u7998"+
-        "\u798A\u798B\u7996\u7995\u7994\u7993\u7997\u7988"+
-        "\u7992\u7990\u7A2B\u7A4A\u7A30\u7A2F\u7A28\u7A26"+
-        "\u7AA8\u7AAB\u7AAC\u7AEE\u7B88\u7B9C\u7B8A\u7B91"+
-        "\u7B90\u7B96\u7B8D\u7B8C\u7B9B\u7B8E\u7B85\u7B98"+
-        "\u5284\u7B99\u7BA4\u7B82\u7CBB\u7CBF\u7CBC\u7CBA"+
-        "\u7DA7\u7DB7\u7DC2\u7DA3\u7DAA\u7DC1\u7DC0\u7DC5"+
-        "\u7D9D\u7DCE\u7DC4\u7DC6\u7DCB\u7DCC\u7DAF\u7DB9"+
-        "\u7D96\u7DBC\u7D9F\u7DA6\u7DAE\u7DA9\u7DA1\u7DC9"+
-        "\u7F73\u7FE2\u7FE3\u7FE5\u7FDE\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8024"+
-        "\u805D\u805C\u8189\u8186\u8183\u8187\u818D\u818C"+
-        "\u818B\u8215\u8497\u84A4\u84A1\u849F\u84BA\u84CE"+
-        "\u84C2\u84AC\u84AE\u84AB\u84B9\u84B4\u84C1\u84CD"+
-        "\u84AA\u849A\u84B1\u84D0\u849D\u84A7\u84BB\u84A2"+
-        "\u8494\u84C7\u84CC\u849B\u84A9\u84AF\u84A8\u84D6"+
-        "\u8498\u84B6\u84CF\u84A0\u84D7\u84D4\u84D2\u84DB"+
-        "\u84B0\u8491\u8661\u8733\u8723\u8728\u876B\u8740"+
-        "\u872E\u871E\u8721\u8719\u871B\u8743\u872C\u8741"+
-        "\u873E\u8746\u8720\u8732\u872A\u872D\u873C\u8712"+
-        "\u873A\u8731\u8735\u8742\u8726\u8727\u8738\u8724"+
-        "\u871A\u8730\u8711\u88F7\u88E7\u88F1\u88F2\u88FA"+
-        "\u88FE\u88EE\u88FC\u88F6\u88FB\u88F0\u88EC\u88EB"+
-        "\u899D\u89A1\u899F\u899E\u89E9\u89EB\u89E8\u8AAB"+
-        "\u8A99\u8A8B\u8A92\u8A8F\u8A96\u8C3D\u8C68\u8C69"+
-        "\u8CD5\u8CCF\u8CD7\u8D96\u8E09\u8E02\u8DFF\u8E0D"+
-        "\u8DFD\u8E0A\u8E03\u8E07\u8E06\u8E05\u8DFE\u8E00"+
-        "\u8E04\u8F10\u8F11\u8F0E\u8F0D\u9123\u911C\u9120"+
-        "\u9122\u911F\u911D\u911A\u9124\u9121\u911B\u917A"+
-        "\u9172\u9179\u9173\u92A5\u92A4\u9276\u929B\u927A"+
-        "\u92A0\u9294\u92AA\u928D\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u92A6\u929A"+
-        "\u92AB\u9279\u9297\u927F\u92A3\u92EE\u928E\u9282"+
-        "\u9295\u92A2\u927D\u9288\u92A1\u928A\u9286\u928C"+
-        "\u9299\u92A7\u927E\u9287\u92A9\u929D\u928B\u922D"+
-        "\u969E\u96A1\u96FF\u9758\u977D\u977A\u977E\u9783"+
-        "\u9780\u9782\u977B\u9784\u9781\u977F\u97CE\u97CD"+
-        "\u9816\u98AD\u98AE\u9902\u9900\u9907\u999D\u999C"+
-        "\u99C3\u99B9\u99BB\u99BA\u99C2\u99BD\u99C7\u9AB1"+
-        "\u9AE3\u9AE7\u9B3E\u9B3F\u9B60\u9B61\u9B5F\u9CF1"+
-        "\u9CF2\u9CF5\u9EA7\u50FF\u5103\u5130\u50F8\u5106"+
-        "\u5107\u50F6\u50FE\u510B\u510C\u50FD\u510A\u528B"+
-        "\u528C\u52F1\u52EF\u5648\u5642\u564C\u5635\u5641"+
-        "\u564A\u5649\u5646\u5658\u565A\u5640\u5633\u563D"+
-        "\u562C\u563E\u5638\u562A\u563A\u571A\u58AB\u589D"+
-        "\u58B1\u58A0\u58A3\u58AF\u58AC\u58A5\u58A1\u58FF"+
-        "\u5AFF\u5AF4\u5AFD\u5AF7\u5AF6\u5B03\u5AF8\u5B02"+
-        "\u5AF9\u5B01\u5B07\u5B05\u5B0F\u5C67\u5D99\u5D97"+
-        "\u5D9F\u5D92\u5DA2\u5D93\u5D95\u5DA0\u5D9C\u5DA1"+
-        "\u5D9A\u5D9E\u5E69\u5E5D\u5E60\u5E5C\u7DF3\u5EDB"+
-        "\u5EDE\u5EE1\u5F49\u5FB2\u618B\u6183\u6179\u61B1"+
-        "\u61B0\u61A2\u6189\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u619B\u6193\u61AF"+
-        "\u61AD\u619F\u6192\u61AA\u61A1\u618D\u6166\u61B3"+
-        "\u622D\u646E\u6470\u6496\u64A0\u6485\u6497\u649C"+
-        "\u648F\u648B\u648A\u648C\u64A3\u649F\u6468\u64B1"+
-        "\u6498\u6576\u657A\u6579\u657B\u65B2\u65B3\u66B5"+
-        "\u66B0\u66A9\u66B2\u66B7\u66AA\u66AF\u6A00\u6A06"+
-        "\u6A17\u69E5\u69F8\u6A15\u69F1\u69E4\u6A20\u69FF"+
-        "\u69EC\u69E2\u6A1B\u6A1D\u69FE\u6A27\u69F2\u69EE"+
-        "\u6A14\u69F7\u69E7\u6A40\u6A08\u69E6\u69FB\u6A0D"+
-        "\u69FC\u69EB\u6A09\u6A04\u6A18\u6A25\u6A0F\u69F6"+
-        "\u6A26\u6A07\u69F4\u6A16\u6B51\u6BA5\u6BA3\u6BA2"+
-        "\u6BA6\u6C01\u6C00\u6BFF\u6C02\u6F41\u6F26\u6F7E"+
-        "\u6F87\u6FC6\u6F92\u6F8D\u6F89\u6F8C\u6F62\u6F4F"+
-        "\u6F85\u6F5A\u6F96\u6F76\u6F6C\u6F82\u6F55\u6F72"+
-        "\u6F52\u6F50\u6F57\u6F94\u6F93\u6F5D\u6F00\u6F61"+
-        "\u6F6B\u6F7D\u6F67\u6F90\u6F53\u6F8B\u6F69\u6F7F"+
-        "\u6F95\u6F63\u6F77\u6F6A\u6F7B\u71B2\u71AF\u719B"+
-        "\u71B0\u71A0\u719A\u71A9\u71B5\u719D\u71A5\u719E"+
-        "\u71A4\u71A1\u71AA\u719C\u71A7\u71B3\u7298\u729A"+
-        "\u7358\u7352\u735E\u735F\u7360\u735D\u735B\u7361"+
-        "\u735A\u7359\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u7362\u7487\u7489\u748A"+
-        "\u7486\u7481\u747D\u7485\u7488\u747C\u7479\u7508"+
-        "\u7507\u757E\u7625\u761E\u7619\u761D\u761C\u7623"+
-        "\u761A\u7628\u761B\u769C\u769D\u769E\u769B\u778D"+
-        "\u778F\u7789\u7788\u78CD\u78BB\u78CF\u78CC\u78D1"+
-        "\u78CE\u78D4\u78C8\u78C3\u78C4\u78C9\u799A\u79A1"+
-        "\u79A0\u799C\u79A2\u799B\u6B76\u7A39\u7AB2\u7AB4"+
-        "\u7AB3\u7BB7\u7BCB\u7BBE\u7BAC\u7BCE\u7BAF\u7BB9"+
-        "\u7BCA\u7BB5\u7CC5\u7CC8\u7CCC\u7CCB\u7DF7\u7DDB"+
-        "\u7DEA\u7DE7\u7DD7\u7DE1\u7E03\u7DFA\u7DE6\u7DF6"+
-        "\u7DF1\u7DF0\u7DEE\u7DDF\u7F76\u7FAC\u7FB0\u7FAD"+
-        "\u7FED\u7FEB\u7FEA\u7FEC\u7FE6\u7FE8\u8064\u8067"+
-        "\u81A3\u819F\u819E\u8195\u81A2\u8199\u8197\u8216"+
-        "\u824F\u8253\u8252\u8250\u824E\u8251\u8524\u853B"+
-        "\u850F\u8500\u8529\u850E\u8509\u850D\u851F\u850A"+
-        "\u8527\u851C\u84FB\u852B\u84FA\u8508\u850C\u84F4"+
-        "\u852A\u84F2\u8515\u84F7\u84EB\u84F3\u84FC\u8512"+
-        "\u84EA\u84E9\u8516\u84FE\u8528\u851D\u852E\u8502"+
-        "\u84FD\u851E\u84F6\u8531\u8526\u84E7\u84E8\u84F0"+
-        "\u84EF\u84F9\u8518\u8520\u8530\u850B\u8519\u852F"+
-        "\u8662\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u8756\u8763\u8764\u8777\u87E1"+
-        "\u8773\u8758\u8754\u875B\u8752\u8761\u875A\u8751"+
-        "\u875E\u876D\u876A\u8750\u874E\u875F\u875D\u876F"+
-        "\u876C\u877A\u876E\u875C\u8765\u874F\u877B\u8775"+
-        "\u8762\u8767\u8769\u885A\u8905\u890C\u8914\u890B"+
-        "\u8917\u8918\u8919\u8906\u8916\u8911\u890E\u8909"+
-        "\u89A2\u89A4\u89A3\u89ED\u89F0\u89EC\u8ACF\u8AC6"+
-        "\u8AB8\u8AD3\u8AD1\u8AD4\u8AD5\u8ABB\u8AD7\u8ABE"+
-        "\u8AC0\u8AC5\u8AD8\u8AC3\u8ABA\u8ABD\u8AD9\u8C3E"+
-        "\u8C4D\u8C8F\u8CE5\u8CDF\u8CD9\u8CE8\u8CDA\u8CDD"+
-        "\u8CE7\u8DA0\u8D9C\u8DA1\u8D9B\u8E20\u8E23\u8E25"+
-        "\u8E24\u8E2E\u8E15\u8E1B\u8E16\u8E11\u8E19\u8E26"+
-        "\u8E27\u8E14\u8E12\u8E18\u8E13\u8E1C\u8E17\u8E1A"+
-        "\u8F2C\u8F24\u8F18\u8F1A\u8F20\u8F23\u8F16\u8F17"+
-        "\u9073\u9070\u906F\u9067\u906B\u912F\u912B\u9129"+
-        "\u912A\u9132\u9126\u912E\u9185\u9186\u918A\u9181"+
-        "\u9182\u9184\u9180\u92D0\u92C3\u92C4\u92C0\u92D9"+
-        "\u92B6\u92CF\u92F1\u92DF\u92D8\u92E9\u92D7\u92DD"+
-        "\u92CC\u92EF\u92C2\u92E8\u92CA\u92C8\u92CE\u92E6"+
-        "\u92CD\u92D5\u92C9\u92E0\u92DE\u92E7\u92D1\u92D3"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u92B5\u92E1\u92C6\u92B4\u957C\u95AC"+
-        "\u95AB\u95AE\u95B0\u96A4\u96A2\u96D3\u9705\u9708"+
-        "\u9702\u975A\u978A\u978E\u9788\u97D0\u97CF\u981E"+
-        "\u981D\u9826\u9829\u9828\u9820\u981B\u9827\u98B2"+
-        "\u9908\u98FA\u9911\u9914\u9916\u9917\u9915\u99DC"+
-        "\u99CD\u99CF\u99D3\u99D4\u99CE\u99C9\u99D6\u99D8"+
-        "\u99CB\u99D7\u99CC\u9AB3\u9AEC\u9AEB\u9AF3\u9AF2"+
-        "\u9AF1\u9B46\u9B43\u9B67\u9B74\u9B71\u9B66\u9B76"+
-        "\u9B75\u9B70\u9B68\u9B64\u9B6C\u9CFC\u9CFA\u9CFD"+
-        "\u9CFF\u9CF7\u9D07\u9D00\u9CF9\u9CFB\u9D08\u9D05"+
-        "\u9D04\u9E83\u9ED3\u9F0F\u9F10\u511C\u5113\u5117"+
-        "\u511A\u5111\u51DE\u5334\u53E1\u5670\u5660\u566E"+
-        "\u5673\u5666\u5663\u566D\u5672\u565E\u5677\u571C"+
-        "\u571B\u58C8\u58BD\u58C9\u58BF\u58BA\u58C2\u58BC"+
-        "\u58C6\u5B17\u5B19\u5B1B\u5B21\u5B14\u5B13\u5B10"+
-        "\u5B16\u5B28\u5B1A\u5B20\u5B1E\u5BEF\u5DAC\u5DB1"+
-        "\u5DA9\u5DA7\u5DB5\u5DB0\u5DAE\u5DAA\u5DA8\u5DB2"+
-        "\u5DAD\u5DAF\u5DB4\u5E67\u5E68\u5E66\u5E6F\u5EE9"+
-        "\u5EE7\u5EE6\u5EE8\u5EE5\u5F4B\u5FBC\u619D\u61A8"+
-        "\u6196\u61C5\u61B4\u61C6\u61C1\u61CC\u61BA\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u61BF\u61B8\u618C\u64D7\u64D6\u64D0\u64CF"+
-        "\u64C9\u64BD\u6489\u64C3\u64DB\u64F3\u64D9\u6533"+
-        "\u657F\u657C\u65A2\u66C8\u66BE\u66C0\u66CA\u66CB"+
-        "\u66CF\u66BD\u66BB\u66BA\u66CC\u6723\u6A34\u6A66"+
-        "\u6A49\u6A67\u6A32\u6A68\u6A3E\u6A5D\u6A6D\u6A76"+
-        "\u6A5B\u6A51\u6A28\u6A5A\u6A3B\u6A3F\u6A41\u6A6A"+
-        "\u6A64\u6A50\u6A4F\u6A54\u6A6F\u6A69\u6A60\u6A3C"+
-        "\u6A5E\u6A56\u6A55\u6A4D\u6A4E\u6A46\u6B55\u6B54"+
-        "\u6B56\u6BA7\u6BAA\u6BAB\u6BC8\u6BC7\u6C04\u6C03"+
-        "\u6C06\u6FAD\u6FCB\u6FA3\u6FC7\u6FBC\u6FCE\u6FC8"+
-        "\u6F5E\u6FC4\u6FBD\u6F9E\u6FCA\u6FA8\u7004\u6FA5"+
-        "\u6FAE\u6FBA\u6FAC\u6FAA\u6FCF\u6FBF\u6FB8\u6FA2"+
-        "\u6FC9\u6FAB\u6FCD\u6FAF\u6FB2\u6FB0\u71C5\u71C2"+
-        "\u71BF\u71B8\u71D6\u71C0\u71C1\u71CB\u71D4\u71CA"+
-        "\u71C7\u71CF\u71BD\u71D8\u71BC\u71C6\u71DA\u71DB"+
-        "\u729D\u729E\u7369\u7366\u7367\u736C\u7365\u736B"+
-        "\u736A\u747F\u749A\u74A0\u7494\u7492\u7495\u74A1"+
-        "\u750B\u7580\u762F\u762D\u7631\u763D\u7633\u763C"+
-        "\u7635\u7632\u7630\u76BB\u76E6\u779A\u779D\u77A1"+
-        "\u779C\u779B\u77A2\u77A3\u7795\u7799\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u7797\u78DD\u78E9\u78E5\u78EA\u78DE\u78E3\u78DB"+
-        "\u78E1\u78E2\u78ED\u78DF\u78E0\u79A4\u7A44\u7A48"+
-        "\u7A47\u7AB6\u7AB8\u7AB5\u7AB1\u7AB7\u7BDE\u7BE3"+
-        "\u7BE7\u7BDD\u7BD5\u7BE5\u7BDA\u7BE8\u7BF9\u7BD4"+
-        "\u7BEA\u7BE2\u7BDC\u7BEB\u7BD8\u7BDF\u7CD2\u7CD4"+
-        "\u7CD7\u7CD0\u7CD1\u7E12\u7E21\u7E17\u7E0C\u7E1F"+
-        "\u7E20\u7E13\u7E0E\u7E1C\u7E15\u7E1A\u7E22\u7E0B"+
-        "\u7E0F\u7E16\u7E0D\u7E14\u7E25\u7E24\u7F43\u7F7B"+
-        "\u7F7C\u7F7A\u7FB1\u7FEF\u802A\u8029\u806C\u81B1"+
-        "\u81A6\u81AE\u81B9\u81B5\u81AB\u81B0\u81AC\u81B4"+
-        "\u81B2\u81B7\u81A7\u81F2\u8255\u8256\u8257\u8556"+
-        "\u8545\u856B\u854D\u8553\u8561\u8558\u8540\u8546"+
-        "\u8564\u8541\u8562\u8544\u8551\u8547\u8563\u853E"+
-        "\u855B\u8571\u854E\u856E\u8575\u8555\u8567\u8560"+
-        "\u858C\u8566\u855D\u8554\u8565\u856C\u8663\u8665"+
-        "\u8664\u879B\u878F\u8797\u8793\u8792\u8788\u8781"+
-        "\u8796\u8798\u8779\u8787\u87A3\u8785\u8790\u8791"+
-        "\u879D\u8784\u8794\u879C\u879A\u8789\u891E\u8926"+
-        "\u8930\u892D\u892E\u8927\u8931\u8922\u8929\u8923"+
-        "\u892F\u892C\u891F\u89F1\u8AE0\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u8AE2"+
-        "\u8AF2\u8AF4\u8AF5\u8ADD\u8B14\u8AE4\u8ADF\u8AF0"+
-        "\u8AC8\u8ADE\u8AE1\u8AE8\u8AFF\u8AEF\u8AFB\u8C91"+
-        "\u8C92\u8C90\u8CF5\u8CEE\u8CF1\u8CF0\u8CF3\u8D6C"+
-        "\u8D6E\u8DA5\u8DA7\u8E33\u8E3E\u8E38\u8E40\u8E45"+
-        "\u8E36\u8E3C\u8E3D\u8E41\u8E30\u8E3F\u8EBD\u8F36"+
-        "\u8F2E\u8F35\u8F32\u8F39\u8F37\u8F34\u9076\u9079"+
-        "\u907B\u9086\u90FA\u9133\u9135\u9136\u9193\u9190"+
-        "\u9191\u918D\u918F\u9327\u931E\u9308\u931F\u9306"+
-        "\u930F\u937A\u9338\u933C\u931B\u9323\u9312\u9301"+
-        "\u9346\u932D\u930E\u930D\u92CB\u931D\u92FA\u9325"+
-        "\u9313\u92F9\u92F7\u9334\u9302\u9324\u92FF\u9329"+
-        "\u9339\u9335\u932A\u9314\u930C\u930B\u92FE\u9309"+
-        "\u9300\u92FB\u9316\u95BC\u95CD\u95BE\u95B9\u95BA"+
-        "\u95B6\u95BF\u95B5\u95BD\u96A9\u96D4\u970B\u9712"+
-        "\u9710\u9799\u9797\u9794\u97F0\u97F8\u9835\u982F"+
-        "\u9832\u9924\u991F\u9927\u9929\u999E\u99EE\u99EC"+
-        "\u99E5\u99E4\u99F0\u99E3\u99EA\u99E9\u99E7\u9AB9"+
-        "\u9ABF\u9AB4\u9ABB\u9AF6\u9AFA\u9AF9\u9AF7\u9B33"+
-        "\u9B80\u9B85\u9B87\u9B7C\u9B7E\u9B7B\u9B82\u9B93"+
-        "\u9B92\u9B90\u9B7A\u9B95\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9B7D\u9B88"+
-        "\u9D25\u9D17\u9D20\u9D1E\u9D14\u9D29\u9D1D\u9D18"+
-        "\u9D22\u9D10\u9D19\u9D1F\u9E88\u9E86\u9E87\u9EAE"+
-        "\u9EAD\u9ED5\u9ED6\u9EFA\u9F12\u9F3D\u5126\u5125"+
-        "\u5122\u5124\u5120\u5129\u52F4\u5693\u568C\u568D"+
-        "\u5686\u5684\u5683\u567E\u5682\u567F\u5681\u58D6"+
-        "\u58D4\u58CF\u58D2\u5B2D\u5B25\u5B32\u5B23\u5B2C"+
-        "\u5B27\u5B26\u5B2F\u5B2E\u5B7B\u5BF1\u5BF2\u5DB7"+
-        "\u5E6C\u5E6A\u5FBE\u5FBB\u61C3\u61B5\u61BC\u61E7"+
-        "\u61E0\u61E5\u61E4\u61E8\u61DE\u64EF\u64E9\u64E3"+
-        "\u64EB\u64E4\u64E8\u6581\u6580\u65B6\u65DA\u66D2"+
-        "\u6A8D\u6A96\u6A81\u6AA5\u6A89\u6A9F\u6A9B\u6AA1"+
-        "\u6A9E\u6A87\u6A93\u6A8E\u6A95\u6A83\u6AA8\u6AA4"+
-        "\u6A91\u6A7F\u6AA6\u6A9A\u6A85\u6A8C\u6A92\u6B5B"+
-        "\u6BAD\u6C09\u6FCC\u6FA9\u6FF4\u6FD4\u6FE3\u6FDC"+
-        "\u6FED\u6FE7\u6FE6\u6FDE\u6FF2\u6FDD\u6FE2\u6FE8"+
-        "\u71E1\u71F1\u71E8\u71F2\u71E4\u71F0\u71E2\u7373"+
-        "\u736E\u736F\u7497\u74B2\u74AB\u7490\u74AA\u74AD"+
-        "\u74B1\u74A5\u74AF\u7510\u7511\u7512\u750F\u7584"+
-        "\u7643\u7648\u7649\u7647\u76A4\u76E9\u77B5\u77AB"+
-        "\u77B2\u77B7\u77B6\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u77B4\u77B1\u77A8"+
-        "\u77F0\u78F3\u78FD\u7902\u78FB\u78FC\u78F2\u7905"+
-        "\u78F9\u78FE\u7904\u79AB\u79A8\u7A5C\u7A5B\u7A56"+
-        "\u7A58\u7A54\u7A5A\u7ABE\u7AC0\u7AC1\u7C05\u7C0F"+
-        "\u7BF2\u7C00\u7BFF\u7BFB\u7C0E\u7BF4\u7C0B\u7BF3"+
-        "\u7C02\u7C09\u7C03\u7C01\u7BF8\u7BFD\u7C06\u7BF0"+
-        "\u7BF1\u7C10\u7C0A\u7CE8\u7E2D\u7E3C\u7E42\u7E33"+
-        "\u9848\u7E38\u7E2A\u7E49\u7E40\u7E47\u7E29\u7E4C"+
-        "\u7E30\u7E3B\u7E36\u7E44\u7E3A\u7F45\u7F7F\u7F7E"+
-        "\u7F7D\u7FF4\u7FF2\u802C\u81BB\u81C4\u81CC\u81CA"+
-        "\u81C5\u81C7\u81BC\u81E9\u825B\u825A\u825C\u8583"+
-        "\u8580\u858F\u85A7\u8595\u85A0\u858B\u85A3\u857B"+
-        "\u85A4\u859A\u859E\u8577\u857C\u8589\u85A1\u857A"+
-        "\u8578\u8557\u858E\u8596\u8586\u858D\u8599\u859D"+
-        "\u8581\u85A2\u8582\u8588\u8585\u8579\u8576\u8598"+
-        "\u8590\u859F\u8668\u87BE\u87AA\u87AD\u87C5\u87B0"+
-        "\u87AC\u87B9\u87B5\u87BC\u87AE\u87C9\u87C3\u87C2"+
-        "\u87CC\u87B7\u87AF\u87C4\u87CA\u87B4\u87B6\u87BF"+
-        "\u87B8\u87BD\u87DE\u87B2\u8935\u8933\u893C\u893E"+
-        "\u8941\u8952\u8937\u8942\u89AD\u89AF\u89AE\u89F2"+
-        "\u89F3\u8B1E\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u8B18\u8B16\u8B11\u8B05"+
-        "\u8B0B\u8B22\u8B0F\u8B12\u8B15\u8B07\u8B0D\u8B08"+
-        "\u8B06\u8B1C\u8B13\u8B1A\u8C4F\u8C70\u8C72\u8C71"+
-        "\u8C6F\u8C95\u8C94\u8CF9\u8D6F\u8E4E\u8E4D\u8E53"+
-        "\u8E50\u8E4C\u8E47\u8F43\u8F40\u9085\u907E\u9138"+
-        "\u919A\u91A2\u919B\u9199\u919F\u91A1\u919D\u91A0"+
-        "\u93A1\u9383\u93AF\u9364\u9356\u9347\u937C\u9358"+
-        "\u935C\u9376\u9349\u9350\u9351\u9360\u936D\u938F"+
-        "\u934C\u936A\u9379\u9357\u9355\u9352\u934F\u9371"+
-        "\u9377\u937B\u9361\u935E\u9363\u9367\u9380\u934E"+
-        "\u9359\u95C7\u95C0\u95C9\u95C3\u95C5\u95B7\u96AE"+
-        "\u96B0\u96AC\u9720\u971F\u9718\u971D\u9719\u979A"+
-        "\u97A1\u979C\u979E\u979D\u97D5\u97D4\u97F1\u9841"+
-        "\u9844\u984A\u9849\u9845\u9843\u9925\u992B\u992C"+
-        "\u992A\u9933\u9932\u992F\u992D\u9931\u9930\u9998"+
-        "\u99A3\u99A1\u9A02\u99FA\u99F4\u99F7\u99F9\u99F8"+
-        "\u99F6\u99FB\u99FD\u99FE\u99FC\u9A03\u9ABE\u9AFE"+
-        "\u9AFD\u9B01\u9AFC\u9B48\u9B9A\u9BA8\u9B9E\u9B9B"+
-        "\u9BA6\u9BA1\u9BA5\u9BA4\u9B86\u9BA2\u9BA0\u9BAF"+
-        "\u9D33\u9D41\u9D67\u9D36\u9D2E\u9D2F\u9D31\u9D38"+
-        "\u9D30\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u9D45\u9D42\u9D43\u9D3E\u9D37"+
-        "\u9D40\u9D3D\u7FF5\u9D2D\u9E8A\u9E89\u9E8D\u9EB0"+
-        "\u9EC8\u9EDA\u9EFB\u9EFF\u9F24\u9F23\u9F22\u9F54"+
-        "\u9FA0\u5131\u512D\u512E\u5698\u569C\u5697\u569A"+
-        "\u569D\u5699\u5970\u5B3C\u5C69\u5C6A\u5DC0\u5E6D"+
-        "\u5E6E\u61D8\u61DF\u61ED\u61EE\u61F1\u61EA\u61F0"+
-        "\u61EB\u61D6\u61E9\u64FF\u6504\u64FD\u64F8\u6501"+
-        "\u6503\u64FC\u6594\u65DB\u66DA\u66DB\u66D8\u6AC5"+
-        "\u6AB9\u6ABD\u6AE1\u6AC6\u6ABA\u6AB6\u6AB7\u6AC7"+
-        "\u6AB4\u6AAD\u6B5E\u6BC9\u6C0B\u7007\u700C\u700D"+
-        "\u7001\u7005\u7014\u700E\u6FFF\u7000\u6FFB\u7026"+
-        "\u6FFC\u6FF7\u700A\u7201\u71FF\u71F9\u7203\u71FD"+
-        "\u7376\u74B8\u74C0\u74B5\u74C1\u74BE\u74B6\u74BB"+
-        "\u74C2\u7514\u7513\u765C\u7664\u7659\u7650\u7653"+
-        "\u7657\u765A\u76A6\u76BD\u76EC\u77C2\u77BA\u78FF"+
-        "\u790C\u7913\u7914\u7909\u7910\u7912\u7911\u79AD"+
-        "\u79AC\u7A5F\u7C1C\u7C29\u7C19\u7C20\u7C1F\u7C2D"+
-        "\u7C1D\u7C26\u7C28\u7C22\u7C25\u7C30\u7E5C\u7E50"+
-        "\u7E56\u7E63\u7E58\u7E62\u7E5F\u7E51\u7E60\u7E57"+
-        "\u7E53\u7FB5\u7FB3\u7FF7\u7FF8\u8075\u81D1\u81D2"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u81D0\u825F\u825E\u85B4\u85C6\u85C0"+
-        "\u85C3\u85C2\u85B3\u85B5\u85BD\u85C7\u85C4\u85BF"+
-        "\u85CB\u85CE\u85C8\u85C5\u85B1\u85B6\u85D2\u8624"+
-        "\u85B8\u85B7\u85BE\u8669\u87E7\u87E6\u87E2\u87DB"+
-        "\u87EB\u87EA\u87E5\u87DF\u87F3\u87E4\u87D4\u87DC"+
-        "\u87D3\u87ED\u87D8\u87E3\u87A4\u87D7\u87D9\u8801"+
-        "\u87F4\u87E8\u87DD\u8953\u894B\u894F\u894C\u8946"+
-        "\u8950\u8951\u8949\u8B2A\u8B27\u8B23\u8B33\u8B30"+
-        "\u8B35\u8B47\u8B2F\u8B3C\u8B3E\u8B31\u8B25\u8B37"+
-        "\u8B26\u8B36\u8B2E\u8B24\u8B3B\u8B3D\u8B3A\u8C42"+
-        "\u8C75\u8C99\u8C98\u8C97\u8CFE\u8D04\u8D02\u8D00"+
-        "\u8E5C\u8E62\u8E60\u8E57\u8E56\u8E5E\u8E65\u8E67";
-
-    private final static String innerIndex5=
-        "\u8E5B\u8E5A\u8E61\u8E5D\u8E69\u8E54\u8F46\u8F47"+
-        "\u8F48\u8F4B\u9128\u913A\u913B\u913E\u91A8\u91A5"+
-        "\u91A7\u91AF\u91AA\u93B5\u938C\u9392\u93B7\u939B"+
-        "\u939D\u9389\u93A7\u938E\u93AA\u939E\u93A6\u9395"+
-        "\u9388\u9399\u939F\u938D\u93B1\u9391\u93B2\u93A4"+
-        "\u93A8\u93B4\u93A3\u93A5\u95D2\u95D3\u95D1\u96B3"+
-        "\u96D7\u96DA\u5DC2\u96DF\u96D8\u96DD\u9723\u9722"+
-        "\u9725\u97AC\u97AE\u97A8\u97AB\u97A4\u97AA\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u97A2\u97A5\u97D7\u97D9\u97D6\u97D8\u97FA"+
-        "\u9850\u9851\u9852\u98B8\u9941\u993C\u993A\u9A0F"+
-        "\u9A0B\u9A09\u9A0D\u9A04\u9A11\u9A0A\u9A05\u9A07"+
-        "\u9A06\u9AC0\u9ADC\u9B08\u9B04\u9B05\u9B29\u9B35"+
-        "\u9B4A\u9B4C\u9B4B\u9BC7\u9BC6\u9BC3\u9BBF\u9BC1"+
-        "\u9BB5\u9BB8\u9BD3\u9BB6\u9BC4\u9BB9\u9BBD\u9D5C"+
-        "\u9D53\u9D4F\u9D4A\u9D5B\u9D4B\u9D59\u9D56\u9D4C"+
-        "\u9D57\u9D52\u9D54\u9D5F\u9D58\u9D5A\u9E8E\u9E8C"+
-        "\u9EDF\u9F01\u9F00\u9F16\u9F25\u9F2B\u9F2A\u9F29"+
-        "\u9F28\u9F4C\u9F55\u5134\u5135\u5296\u52F7\u53B4"+
-        "\u56AB\u56AD\u56A6\u56A7\u56AA\u56AC\u58DA\u58DD"+
-        "\u58DB\u5912\u5B3D\u5B3E\u5B3F\u5DC3\u5E70\u5FBF"+
-        "\u61FB\u6507\u6510\u650D\u6509\u650C\u650E\u6584"+
-        "\u65DE\u65DD\u66DE\u6AE7\u6AE0\u6ACC\u6AD1\u6AD9"+
-        "\u6ACB\u6ADF\u6ADC\u6AD0\u6AEB\u6ACF\u6ACD\u6ADE"+
-        "\u6B60\u6BB0\u6C0C\u7019\u7027\u7020\u7016\u702B"+
-        "\u7021\u7022\u7023\u7029\u7017\u7024\u701C\u702A"+
-        "\u720C\u720A\u7207\u7202\u7205\u72A5\u72A6\u72A4"+
-        "\u72A3\u72A1\u74CB\u74C5\u74B7\u74C3\u7516\u7660"+
-        "\u77C9\u77CA\u77C4\u77F1\u791D\u791B\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\u7921\u791C\u7917\u791E\u79B0\u7A67\u7A68\u7C33"+
-        "\u7C3C\u7C39\u7C2C\u7C3B\u7CEC\u7CEA\u7E76\u7E75"+
-        "\u7E78\u7E70\u7E77\u7E6F\u7E7A\u7E72\u7E74\u7E68"+
-        "\u7F4B\u7F4A\u7F83\u7F86\u7FB7\u7FFD\u7FFE\u8078"+
-        "\u81D7\u81D5\u8264\u8261\u8263\u85EB\u85F1\u85ED"+
-        "\u85D9\u85E1\u85E8\u85DA\u85D7\u85EC\u85F2\u85F8"+
-        "\u85D8\u85DF\u85E3\u85DC\u85D1\u85F0\u85E6\u85EF"+
-        "\u85DE\u85E2\u8800\u87FA\u8803\u87F6\u87F7\u8809"+
-        "\u880C\u880B\u8806\u87FC\u8808\u87FF\u880A\u8802"+
-        "\u8962\u895A\u895B\u8957\u8961\u895C\u8958\u895D"+
-        "\u8959\u8988\u89B7\u89B6\u89F6\u8B50\u8B48\u8B4A"+
-        "\u8B40\u8B53\u8B56\u8B54\u8B4B\u8B55\u8B51\u8B42"+
-        "\u8B52\u8B57\u8C43\u8C77\u8C76\u8C9A\u8D06\u8D07"+
-        "\u8D09\u8DAC\u8DAA\u8DAD\u8DAB\u8E6D\u8E78\u8E73"+
-        "\u8E6A\u8E6F\u8E7B\u8EC2\u8F52\u8F51\u8F4F\u8F50"+
-        "\u8F53\u8FB4\u9140\u913F\u91B0\u91AD\u93DE\u93C7"+
-        "\u93CF\u93C2\u93DA\u93D0\u93F9\u93EC\u93CC\u93D9"+
-        "\u93A9\u93E6\u93CA\u93D4\u93EE\u93E3\u93D5\u93C4"+
-        "\u93CE\u93C0\u93D2\u93E7\u957D\u95DA\u95DB\u96E1"+
-        "\u9729\u972B\u972C\u9728\u9726\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u97B3"+
-        "\u97B7\u97B6\u97DD\u97DE\u97DF\u985C\u9859\u985D"+
-        "\u9857\u98BF\u98BD\u98BB\u98BE\u9948\u9947\u9943"+
-        "\u99A6\u99A7\u9A1A\u9A15\u9A25\u9A1D\u9A24\u9A1B"+
-        "\u9A22\u9A20\u9A27\u9A23\u9A1E\u9A1C\u9A14\u9AC2"+
-        "\u9B0B\u9B0A\u9B0E\u9B0C\u9B37\u9BEA\u9BEB\u9BE0"+
-        "\u9BDE\u9BE4\u9BE6\u9BE2\u9BF0\u9BD4\u9BD7\u9BEC"+
-        "\u9BDC\u9BD9\u9BE5\u9BD5\u9BE1\u9BDA\u9D77\u9D81"+
-        "\u9D8A\u9D84\u9D88\u9D71\u9D80\u9D78\u9D86\u9D8B"+
-        "\u9D8C\u9D7D\u9D6B\u9D74\u9D75\u9D70\u9D69\u9D85"+
-        "\u9D73\u9D7B\u9D82\u9D6F\u9D79\u9D7F\u9D87\u9D68"+
-        "\u9E94\u9E91\u9EC0\u9EFC\u9F2D\u9F40\u9F41\u9F4D"+
-        "\u9F56\u9F57\u9F58\u5337\u56B2\u56B5\u56B3\u58E3"+
-        "\u5B45\u5DC6\u5DC7\u5EEE\u5EEF\u5FC0\u5FC1\u61F9"+
-        "\u6517\u6516\u6515\u6513\u65DF\u66E8\u66E3\u66E4"+
-        "\u6AF3\u6AF0\u6AEA\u6AE8\u6AF9\u6AF1\u6AEE\u6AEF"+
-        "\u703C\u7035\u702F\u7037\u7034\u7031\u7042\u7038"+
-        "\u703F\u703A\u7039\u7040\u703B\u7033\u7041\u7213"+
-        "\u7214\u72A8\u737D\u737C\u74BA\u76AB\u76AA\u76BE"+
-        "\u76ED\u77CC\u77CE\u77CF\u77CD\u77F2\u7925\u7923"+
-        "\u7927\u7928\u7924\u7929\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u79B2\u7A6E"+
-        "\u7A6C\u7A6D\u7AF7\u7C49\u7C48\u7C4A\u7C47\u7C45"+
-        "\u7CEE\u7E7B\u7E7E\u7E81\u7E80\u7FBA\u7FFF\u8079"+
-        "\u81DB\u81D9\u820B\u8268\u8269\u8622\u85FF\u8601"+
-        "\u85FE\u861B\u8600\u85F6\u8604\u8609\u8605\u860C"+
-        "\u85FD\u8819\u8810\u8811\u8817\u8813\u8816\u8963"+
-        "\u8966\u89B9\u89F7\u8B60\u8B6A\u8B5D\u8B68\u8B63"+
-        "\u8B65\u8B67\u8B6D\u8DAE\u8E86\u8E88\u8E84\u8F59"+
-        "\u8F56\u8F57\u8F55\u8F58\u8F5A\u908D\u9143\u9141"+
-        "\u91B7\u91B5\u91B2\u91B3\u940B\u9413\u93FB\u9420"+
-        "\u940F\u9414\u93FE\u9415\u9410\u9428\u9419\u940D"+
-        "\u93F5\u9400\u93F7\u9407\u940E\u9416\u9412\u93FA"+
-        "\u9409\u93F8\u940A\u93FF\u93FC\u940C\u93F6\u9411"+
-        "\u9406\u95DE\u95E0\u95DF\u972E\u972F\u97B9\u97BB"+
-        "\u97FD\u97FE\u9860\u9862\u9863\u985F\u98C1\u98C2"+
-        "\u9950\u994E\u9959\u994C\u994B\u9953\u9A32\u9A34"+
-        "\u9A31\u9A2C\u9A2A\u9A36\u9A29\u9A2E\u9A38\u9A2D"+
-        "\u9AC7\u9ACA\u9AC6\u9B10\u9B12\u9B11\u9C0B\u9C08"+
-        "\u9BF7\u9C05\u9C12\u9BF8\u9C40\u9C07\u9C0E\u9C06"+
-        "\u9C17\u9C14\u9C09\u9D9F\u9D99\u9DA4\u9D9D\u9D92"+
-        "\u9D98\u9D90\u9D9B\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u9DA0\u9D94\u9D9C"+
-        "\u9DAA\u9D97\u9DA1\u9D9A\u9DA2\u9DA8\u9D9E\u9DA3"+
-        "\u9DBF\u9DA9\u9D96\u9DA6\u9DA7\u9E99\u9E9B\u9E9A"+
-        "\u9EE5\u9EE4\u9EE7\u9EE6\u9F30\u9F2E\u9F5B\u9F60"+
-        "\u9F5E\u9F5D\u9F59\u9F91\u513A\u5139\u5298\u5297"+
-        "\u56C3\u56BD\u56BE\u5B48\u5B47\u5DCB\u5DCF\u5EF1"+
-        "\u61FD\u651B\u6B02\u6AFC\u6B03\u6AF8\u6B00\u7043"+
-        "\u7044\u704A\u7048\u7049\u7045\u7046\u721D\u721A"+
-        "\u7219\u737E\u7517\u766A\u77D0\u792D\u7931\u792F"+
-        "\u7C54\u7C53\u7CF2\u7E8A\u7E87\u7E88\u7E8B\u7E86"+
-        "\u7E8D\u7F4D\u7FBB\u8030\u81DD\u8618\u862A\u8626"+
-        "\u861F\u8623\u861C\u8619\u8627\u862E\u8621\u8620"+
-        "\u8629\u861E\u8625\u8829\u881D\u881B\u8820\u8824"+
-        "\u881C\u882B\u884A\u896D\u8969\u896E\u896B\u89FA"+
-        "\u8B79\u8B78\u8B45\u8B7A\u8B7B\u8D10\u8D14\u8DAF"+
-        "\u8E8E\u8E8C\u8F5E\u8F5B\u8F5D\u9146\u9144\u9145"+
-        "\u91B9\u943F\u943B\u9436\u9429\u943D\u943C\u9430"+
-        "\u9439\u942A\u9437\u942C\u9440\u9431\u95E5\u95E4"+
-        "\u95E3\u9735\u973A\u97BF\u97E1\u9864\u98C9\u98C6"+
-        "\u98C0\u9958\u9956\u9A39\u9A3D\u9A46\u9A44\u9A42"+
-        "\u9A41\u9A3A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\u9A3F\u9ACD\u9B15\u9B17"+
-        "\u9B18\u9B16\u9B3A\u9B52\u9C2B\u9C1D\u9C1C\u9C2C"+
-        "\u9C23\u9C28\u9C29\u9C24\u9C21\u9DB7\u9DB6\u9DBC"+
-        "\u9DC1\u9DC7\u9DCA\u9DCF\u9DBE\u9DC5\u9DC3\u9DBB"+
-        "\u9DB5\u9DCE\u9DB9\u9DBA\u9DAC\u9DC8\u9DB1\u9DAD"+
-        "\u9DCC\u9DB3\u9DCD\u9DB2\u9E7A\u9E9C\u9EEB\u9EEE"+
-        "\u9EED\u9F1B\u9F18\u9F1A\u9F31\u9F4E\u9F65\u9F64"+
-        "\u9F92\u4EB9\u56C6\u56C5\u56CB\u5971\u5B4B\u5B4C"+
-        "\u5DD5\u5DD1\u5EF2\u6521\u6520\u6526\u6522\u6B0B"+
-        "\u6B08\u6B09\u6C0D\u7055\u7056\u7057\u7052\u721E"+
-        "\u721F\u72A9\u737F\u74D8\u74D5\u74D9\u74D7\u766D"+
-        "\u76AD\u7935\u79B4\u7A70\u7A71\u7C57\u7C5C\u7C59"+
-        "\u7C5B\u7C5A\u7CF4\u7CF1\u7E91\u7F4F\u7F87\u81DE"+
-        "\u826B\u8634\u8635\u8633\u862C\u8632\u8636\u882C"+
-        "\u8828\u8826\u882A\u8825\u8971\u89BF\u89BE\u89FB"+
-        "\u8B7E\u8B84\u8B82\u8B86\u8B85\u8B7F\u8D15\u8E95"+
-        "\u8E94\u8E9A\u8E92\u8E90\u8E96\u8E97\u8F60\u8F62"+
-        "\u9147\u944C\u9450\u944A\u944B\u944F\u9447\u9445"+
-        "\u9448\u9449\u9446\u973F\u97E3\u986A\u9869\u98CB"+
-        "\u9954\u995B\u9A4E\u9A53\u9A54\u9A4C\u9A4F\u9A48"+
-        "\u9A4A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\u9A49\u9A52\u9A50\u9AD0\u9B19"+
-        "\u9B2B\u9B3B\u9B56\u9B55\u9C46\u9C48\u9C3F\u9C44"+
-        "\u9C39\u9C33\u9C41\u9C3C\u9C37\u9C34\u9C32\u9C3D"+
-        "\u9C36\u9DDB\u9DD2\u9DDE\u9DDA\u9DCB\u9DD0\u9DDC"+
-        "\u9DD1\u9DDF\u9DE9\u9DD9\u9DD8\u9DD6\u9DF5\u9DD5"+
-        "\u9DDD\u9EB6\u9EF0\u9F35\u9F33\u9F32\u9F42\u9F6B"+
-        "\u9F95\u9FA2\u513D\u5299\u58E8\u58E7\u5972\u5B4D"+
-        "\u5DD8\u882F\u5F4F\u6201\u6203\u6204\u6529\u6525"+
-        "\u6596\u66EB\u6B11\u6B12\u6B0F\u6BCA\u705B\u705A"+
-        "\u7222\u7382\u7381\u7383\u7670\u77D4\u7C67\u7C66"+
-        "\u7E95\u826C\u863A\u8640\u8639\u863C\u8631\u863B"+
-        "\u863E\u8830\u8832\u882E\u8833\u8976\u8974\u8973"+
-        "\u89FE\u8B8C\u8B8E\u8B8B\u8B88\u8C45\u8D19\u8E98"+
-        "\u8F64\u8F63\u91BC\u9462\u9455\u945D\u9457\u945E"+
-        "\u97C4\u97C5\u9800\u9A56\u9A59\u9B1E\u9B1F\u9B20"+
-        "\u9C52\u9C58\u9C50\u9C4A\u9C4D\u9C4B\u9C55\u9C59"+
-        "\u9C4C\u9C4E\u9DFB\u9DF7\u9DEF\u9DE3\u9DEB\u9DF8"+
-        "\u9DE4\u9DF6\u9DE1\u9DEE\u9DE6\u9DF2\u9DF0\u9DE2"+
-        "\u9DEC\u9DF4\u9DF3\u9DE8\u9DED\u9EC2\u9ED0\u9EF2"+
-        "\u9EF3\u9F06\u9F1C\u9F38\u9F37\u9F36\u9F43\u9F4F"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\u9F71\u9F70\u9F6E\u9F6F\u56D3\u56CD"+
-        "\u5B4E\u5C6D\u652D\u66ED\u66EE\u6B13\u705F\u7061"+
-        "\u705D\u7060\u7223\u74DB\u74E5\u77D5\u7938\u79B7"+
-        "\u79B6\u7C6A\u7E97\u7F89\u826D\u8643\u8838\u8837"+
-        "\u8835\u884B\u8B94\u8B95\u8E9E\u8E9F\u8EA0\u8E9D"+
-        "\u91BE\u91BD\u91C2\u946B\u9468\u9469\u96E5\u9746"+
-        "\u9743\u9747\u97C7\u97E5\u9A5E\u9AD5\u9B59\u9C63"+
-        "\u9C67\u9C66\u9C62\u9C5E\u9C60\u9E02\u9DFE\u9E07"+
-        "\u9E03\u9E06\u9E05\u9E00\u9E01\u9E09\u9DFF\u9DFD"+
-        "\u9E04\u9EA0\u9F1E\u9F46\u9F74\u9F75\u9F76\u56D4"+
-        "\u652E\u65B8\u6B18\u6B19\u6B17\u6B1A\u7062\u7226"+
-        "\u72AA\u77D8\u77D9\u7939\u7C69\u7C6B\u7CF6\u7E9A"+
-        "\u7E98\u7E9B\u7E99\u81E0\u81E1\u8646\u8647\u8648"+
-        "\u8979\u897A\u897C\u897B\u89FF\u8B98\u8B99\u8EA5"+
-        "\u8EA4\u8EA3\u946E\u946D\u946F\u9471\u9473\u9749"+
-        "\u9872\u995F\u9C68\u9C6E\u9C6D\u9E0B\u9E0D\u9E10"+
-        "\u9E0F\u9E12\u9E11\u9EA1\u9EF5\u9F09\u9F47\u9F78"+
-        "\u9F7B\u9F7A\u9F79\u571E\u7066\u7C6F\u883C\u8DB2"+
-        "\u8EA6\u91C3\u9474\u9478\u9476\u9475\u9A60\u9C74"+
-        "\u9C73\u9C71\u9C75\u9E14\u9E13\u9EF6\u9F0A\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\u9FA4\u7068\u7065\u7CF7\u866A\u883E\u883D"+
-        "\u883F\u8B9E\u8C9C\u8EA9\u8EC9\u974B\u9873\u9874"+
-        "\u98CC\u9961\u99AB\u9A64\u9A66\u9A67\u9B24\u9E15"+
-        "\u9E17\u9F48\u6207\u6B1E\u7227\u864C\u8EA8\u9482"+
-        "\u9480\u9481\u9A69\u9A68\u9B2E\u9E19\u7229\u864B"+
-        "\u8B9F\u9483\u9C79\u9EB7\u7675\u9A6B\u9C7A\u9E1D"+
-        "\u7069\u706A\u9EA4\u9F7E\u9F49\u9F98\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"+
-        "\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD";
-
-    private final static short index1[] = {
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
-        16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
-        32, 33, 34, 35, 36, 37, 38, 39, 0, 40, 41, 42, 43, 44, 45, 46,
-        47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
-        63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
-        79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 0, 0, 0, 0, 0, 0
-    };
-
-    String index2[] = {
-        innerIndex0,
-        innerIndex1,
-        innerIndex2,
-        innerIndex3,
-        innerIndex4,
-        innerIndex5
-    };
 }
--- a/jdk/src/share/classes/sun/io/CharToByteJohab.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/io/CharToByteJohab.java	Sat Apr 18 14:10:27 2009 -0700
@@ -46,4728 +46,4 @@
         super.index1 = nioCoder.getEncoderIndex1();
         super.index2 = nioCoder.getEncoderIndex2();
     }
-
-    private final static String innerIndex0=
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0020\u0021\"\u0023\u0024\u0025\u0026\'"+
-        "\u0028\u0029\u002A\u002B\u002C\u002D\u002E\u002F"+
-        "\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037"+
-        "\u0038\u0039\u003A\u003B\u003C\u003D\u003E\u003F"+
-        "\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047"+
-        "\u0048\u0049\u004A\u004B\u004C\u004D\u004E\u004F"+
-        "\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057"+
-        "\u0058\u0059\u005A\u005B\\\u005D\u005E\u005F"+
-        "\u0060\u0061\u0062\u0063\u0064\u0065\u0066\u0067"+
-        "\u0068\u0069\u006A\u006B\u006C\u006D\u006E\u006F"+
-        "\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077"+
-        "\u0078\u0079\u007A\u007B\u007C\u007D\u007E\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uD9AE\u0000\u0000\uD9B4\u0000\u0000\uD967"+
-        "\uD937\u0000\uDCA3\u0000\u0000\uD939\u0000\u0000"+
-        "\uD956\uD94E\uDD99\uDD9A\uD9A5\u0000\uD9D2\uD934"+
-        "\uD9AC\uDD98\uDCAC\u0000\uDCF9\uDCF6\uDCFA\uD9AF"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uDCA1\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDCA2\u0000\u0000\u0000\u0000\u0000\u0000\uD94F"+
-        "\uDCAA\u0000\u0000\u0000\u0000\u0000\uDCAD\uDD3C"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uDD31\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDD33\u0000\u0000\u0000\u0000\u0000\u0000\uD950"+
-        "\uDD3A\u0000\u0000\u0000\u0000\u0000\uDD3D\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDD32\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uDCA4\uDD34"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDD35\uDCA6\uDD36\u0000\u0000\u0000\u0000"+
-        "\uDD37\u0000\u0000\u0000\u0000\u0000\u0000\uDCA8"+
-        "\uDD38\uDCA9\uDD39\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDD40\uDCAF\uDD3F\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uDCAB\uDD3B\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uDCAE\uDD3E"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uD9A7"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD9B0\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD9A8\uD9AB\uD9AA\uD9AD\u0000\uD9A9\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDB51\uDB52\uDB53\uDB54\uDB55\uDB56\uDB57"+
-        "\uDB58\uDB59\uDB5A\uDB5B\uDB5C\uDB5D\uDB5E\uDB5F"+
-        "\uDB60\uDB61\u0000\uDB62\uDB63\uDB64\uDB65\uDB66"+
-        "\uDB67\uDB68\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDB71\uDB72\uDB73\uDB74\uDB75\uDB76\uDB77"+
-        "\uDB78\uDB79\uDB7A\uDB7B\uDB7C\uDB7D\uDB7E\uDB91"+
-        "\uDB92\uDB93\u0000\uDB94\uDB95\uDB96\uDB97\uDB98"+
-        "\uDB99\uDB9A\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDEA7\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDEA1\uDEA2\uDEA3\uDEA4\uDEA5\uDEA6\uDEA8\uDEA9"+
-        "\uDEAA\uDEAB\uDEAC\uDEAD\uDEAE\uDEAF\uDEB0\uDEB1"+
-        "\uDEB2\uDEB3\uDEB4\uDEB5\uDEB6\uDEB7\uDEB8\uDEB9"+
-        "\uDEBA\uDEBB\uDEBC\uDEBD\uDEBE\uDEBF\uDEC0\uDEC1"+
-        "\uDED1\uDED2\uDED3\uDED4\uDED5\uDED6\uDED8\uDED9"+
-        "\uDEDA\uDEDB\uDEDC\uDEDD\uDEDE\uDEDF\uDEE0\uDEE1"+
-        "\uDEE2\uDEE3\uDEE4\uDEE5\uDEE6\uDEE7\uDEE8\uDEE9"+
-        "\uDEEA\uDEEB\uDEEC\uDEED\uDEEE\uDEEF\uDEF0\uDEF1"+
-        "\u0000\uDED7\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uD93A\u0000\u0000"+
-        "\uD93E\uD93F\u0000\u0000\uD940\uD941\u0000\u0000"+
-        "\uD9D3\uD9D4\u0000\u0000\u0000\uD935\uD936\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD9B6\u0000\uD957\uD958\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uD968\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uDD9B\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uDD9C"+
-        "\u0000\uDD9D\uDD9E\uDD9F\uDDA0\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uD959\u0000\u0000\u0000\u0000"+
-        "\u0000\uD9B5\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uDC34\u0000\u0000\uD9E0\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uD9E5\uD9E2\u0000\u0000\u0000\uDC69\u0000"+
-        "\u0000\u0000\u0000\uD95A\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uDCF7\uDCF8\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uDCFB\uDCFC\uDCFD\uDCFE\u0000"+
-        "\uDB40\uDB41\uDB42\uDB43\uDB44\uDB45\uDB46\uDB47"+
-        "\uDB48\uDB49\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDB31\uDB32\uDB33\uDB34\uDB35\uDB36\uDB37\uDB38"+
-        "\uDB39\uDB3A\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD977\uD978\uD976\uD979\uD97A\uD9D5\uD9D8\uD9D6"+
-        "\uD9D9\uD9D7\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uD9A1\u0000\uD9A2\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD9A3\u0000\uD963\uD9A4\u0000\u0000\u0000\uD964"+
-        "\uD996\u0000\u0000\uD997\u0000\u0000\u0000\uD9B3"+
-        "\u0000\uD9B2\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uD97E\u0000\u0000\uD992\uD954\u0000"+
-        "\uD960\u0000\u0000\u0000\u0000\uD93B\u0000\uD99E"+
-        "\uD99F\uD99D\uD99C\uD994\uD995\u0000\uD9B1\u0000"+
-        "\u0000\u0000\u0000\u0000\uD955\uD993\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uD93D\uD991\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uD966\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD951\uD965\u0000\u0000\uD952\uD953\u0000\u0000"+
-        "\u0000\u0000\uD97C\uD97D\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uD99A\uD99B\u0000\u0000\uD998\uD999"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uD9C1\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uD961\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uD962\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDCE7\uDCE8\uDCE9\uDCEA\uDCEB\uDCEC\uDCED\uDCEE"+
-        "\uDCEF\uDCF0\uDCF1\uDCF2\uDCF3\uDCF4\uDCF5\u0000"+
-        "\u0000\u0000\u0000\u0000\uDD77\uDD78\uDD79\uDD7A"+
-        "\uDD7B\uDD7C\uDD7D\uDD7E\uDD91\uDD92\uDD93\uDD94"+
-        "\uDD95\uDD96\uDD97\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uDD5D\uDD5E\uDD5F\uDD60"+
-        "\uDD61\uDD62\uDD63\uDD64\uDD65\uDD66\uDD67\uDD68"+
-        "\uDD69\uDD6A\uDD6B\uDD6C\uDD6D\uDD6E\uDD6F\uDD70"+
-        "\uDD71\uDD72\uDD73\uDD74\uDD75\uDD76\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDCCD\uDCCE\uDCCF\uDCD0\uDCD1\uDCD2\uDCD3\uDCD4"+
-        "\uDCD5\uDCD6\uDCD7\uDCD8\uDCD9\uDCDA\uDCDB\uDCDC"+
-        "\uDCDD\uDCDE\uDCDF\uDCE0\uDCE1\uDCE2\uDCE3\uDCE4"+
-        "\uDCE5\uDCE6\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDBA1\uDBAC\uDBA2\uDBAD\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uDBA3\uDBC8\uDBC7\uDBAE"+
-        "\uDBA4\uDBC2\uDBC1\uDBAF\uDBA6\uDBC6\uDBC5\uDBB1"+
-        "\uDBA5\uDBC4\uDBC3\uDBB0\uDBA7\uDBBC\uDBC9\uDBCA"+
-        "\uDBB7\uDBCB\uDBCC\uDBB2\uDBA9\uDBBE\uDBCD\uDBCE"+
-        "\uDBB9\uDBCF\uDBD0\uDBB4\uDBA8\uDBD1\uDBD2\uDBB8"+
-        "\uDBBD\uDBD3\uDBD4\uDBB3\uDBAA\uDBD5\uDBD6\uDBBA"+
-        "\uDBBF\uDBD7\uDBD8\uDBB5\uDBAB\uDBD9\uDBDA\uDBBB"+
-        "\uDBDB\uDBDC\uDBC0\uDBDD\uDBDE\uDBDF\uDBE0\uDBE1"+
-        "\uDBE2\uDBE3\uDBE4\uDBB6\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uD9C6\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD971\uD970\u0000\uD9C3\uD9C7\uD9C8\uD9CB\uD9CA"+
-        "\uD9C9\uD9CC\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uD973\uD972\u0000\u0000\uD9BA\uD9B9"+
-        "\u0000\u0000\u0000\u0000\uD975\uD974\u0000\u0000"+
-        "\uD9B8\uD9B7\u0000\u0000\u0000\u0000\uD96F\uD96E"+
-        "\uD9C2\u0000\u0000\uD96B\u0000\u0000\uD96D\uD96C"+
-        "\uD9C4\uD9C5\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uD96A\uD969\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uD9CF\uD9CE"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uD9D0\u0000\uD9D1\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD95F\u0000\uD95E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD9BC\uD9BD\u0000\uD9C0\uD9BB\uD9BE\u0000\uD9BF"+
-        "\uD9CD\uD9DB\uD9DC\u0000\uD9DD\uD9DA\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD931\uD932\uD933\uD938\u0000\u0000\u0000\u0000"+
-        "\uD944\uD945\uD946\uD947\uD948\uD949\uD94A\uD94B"+
-        "\uD94C\uD94D\u0000\uD97B\uD942\uD943\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDDA1\uDDA2\uDDA3\uDDA4\uDDA5\uDDA6\uDDA7"+
-        "\uDDA8\uDDA9\uDDAA\uDDAB\uDDAC\uDDAD\uDDAE\uDDAF"+
-        "\uDDB0\uDDB1\uDDB2\uDDB3\uDDB4\uDDB5\uDDB6\uDDB7"+
-        "\uDDB8\uDDB9\uDDBA\uDDBB\uDDBC\uDDBD\uDDBE\uDDBF"+
-        "\uDDC0\uDDC1\uDDC2\uDDC3\uDDC4\uDDC5\uDDC6\uDDC7"+
-        "\uDDC8\uDDC9\uDDCA\uDDCB\uDDCC\uDDCD\uDDCE\uDDCF"+
-        "\uDDD0\uDDD1\uDDD2\uDDD3\uDDD4\uDDD5\uDDD6\uDDD7"+
-        "\uDDD8\uDDD9\uDDDA\uDDDB\uDDDC\uDDDD\uDDDE\uDDDF"+
-        "\uDDE0\uDDE1\uDDE2\uDDE3\uDDE4\uDDE5\uDDE6\uDDE7"+
-        "\uDDE8\uDDE9\uDDEA\uDDEB\uDDEC\uDDED\uDDEE\uDDEF"+
-        "\uDDF0\uDDF1\uDDF2\uDDF3\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDE31\uDE32\uDE33\uDE34\uDE35\uDE36\uDE37"+
-        "\uDE38\uDE39\uDE3A\uDE3B\uDE3C\uDE3D\uDE3E\uDE3F"+
-        "\uDE40\uDE41\uDE42\uDE43\uDE44\uDE45\uDE46\uDE47"+
-        "\uDE48\uDE49\uDE4A\uDE4B\uDE4C\uDE4D\uDE4E\uDE4F"+
-        "\uDE50\uDE51\uDE52\uDE53\uDE54\uDE55\uDE56\uDE57"+
-        "\uDE58\uDE59\uDE5A\uDE5B\uDE5C\uDE5D\uDE5E\uDE5F"+
-        "\uDE60\uDE61\uDE62\uDE63\uDE64\uDE65\uDE66\uDE67"+
-        "\uDE68\uDE69\uDE6A\uDE6B\uDE6C\uDE6D\uDE6E\uDE6F"+
-        "\uDE70\uDE71\uDE72\uDE73\uDE74\uDE75\uDE76\uDE77"+
-        "\uDE78\uDE79\uDE7A\uDE7B\uDE7C\uDE7D\uDE7E\uDE91"+
-        "\uDE92\uDE93\uDE94\uDE95\uDE96\uDE97\uDE98\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u8841\u8C41\u8444\u9041\u8446\u8447\u9441"+
-        "\u9841\u9C41\u844A\u844B\u844C\u844D\u844E\u844F"+
-        "\u8450\uA041\uA441\uA841\u8454\uAC41\uB041\uB441"+
-        "\uB841\uBC41\uC041\uC441\uC841\uCC41\uD041\u8461"+
-        "\u8481\u84A1\u84C1\u84E1\u8541\u8561\u8581\u85A1"+
-        "\u85C1\u85E1\u8641\u8661\u8681\u86A1\u86C1\u86E1"+
-        "\u8741\u8761\u8781\u87A1\uDAD4\uDAD5\uDAD6\uDAD7"+
-        "\uDAD8\uDAD9\uDADA\uDADB\uDADC\uDADD\uDADE\uDADF"+
-        "\uDAE0\uDAE1\uDAE2\uDAE3\uDAE4\uDAE5\uDAE6\uDAE7"+
-        "\uDAE8\uDAE9\uDAEA\uDAEB\uDAEC\uDAED\uDAEE\uDAEF"+
-        "\uDAF0\uDAF1\uDAF2\uDAF3\uDAF4\uDAF5\uDAF6\uDAF7"+
-        "\uDAF8\uDAF9\uDAFA\uDAFB\uDAFC\uDAFD\uDAFE\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDD41\uDD42\uDD43\uDD44\uDD45\uDD46\uDD47\uDD48"+
-        "\uDD49\uDD4A\uDD4B\uDD4C\uDD4D\uDD4E\uDD4F\uDD50"+
-        "\uDD51\uDD52\uDD53\uDD54\uDD55\uDD56\uDD57\uDD58"+
-        "\uDD59\uDD5A\uDD5B\uDD5C\uD9DF\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDCB1\uDCB2\uDCB3\uDCB4\uDCB5\uDCB6\uDCB7\uDCB8"+
-        "\uDCB9\uDCBA\uDCBB\uDCBC\uDCBD\uDCBE\uDCBF\uDCC0"+
-        "\uDCC1\uDCC2\uDCC3\uDCC4\uDCC5\uDCC6\uDCC7\uDCC8"+
-        "\uDCC9\uDCCA\uDCCB\uDCCC\u0000\u0000\u0000\uD9DE"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000";
-
-    private final static String innerIndex1=
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uDC59\uDC5A\uDC5B\uDC5C\uDC5D\u0000\u0000\u0000"+
-        "\uDC4A\uDC4B\uDC6C\uDC6D\uDC6E\uDC46\uDC47\uDC48"+
-        "\uDC64\uDC65\uDC66\uDC67\uDC68\uDC31\uDC32\uDC33"+
-        "\uDC35\uDC3B\uDC3C\uDC3D\uDC3E\uDC3F\uDC40\uDC41"+
-        "\uDC42\uDC43\uDC44\uDC37\uDC38\uDC39\uDC3A\uDC4D"+
-        "\uDC4E\uDC75\uDC76\uDC77\uDC78\uDC71\uDC72\uDC73"+
-        "\uDC4F\uDC50\uDC51\uDC52\uDC53\uDC54\uDC55\uDC56"+
-        "\uDC57\uDC58\uDC5E\uDC5F\uDC60\uDC61\uDC62\uDC63"+
-        "\uDC6A\uDC6B\uD9E3\uDC7C\uDC36\uDC70\uDC91\uD9E1"+
-        "\uDC4C\uDC7D\uDC45\u0000\u0000\u0000\u0000\uDC49"+
-        "\uDC7A\u0000\u0000\uDC7B\u0000\u0000\uDC6F\u0000"+
-        "\uD9E4\u0000\u0000\uDC74\uDC7E\uDC79\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF179\uF2CB\u0000\uF662\u0000\u0000\u0000\uE742"+
-        "\uF1DB\uEAB2\uEABE\uF7BB\u0000\uE996\u0000\u0000"+
-        "\u0000\uF5E4\u0000\u0000\uF4A6\uE9E0\uEBA6\u0000"+
-        "\uE29A\uE940\u0000\u0000\u0000\u0000\uECAA\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF3E9\u0000\u0000"+
-        "\u0000\u0000\uE1FA\u0000\u0000\u0000\u0000\u0000"+
-        "\uF93F\uE4A1\u0000\uF3AB\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEED1\uE43C\u0000\uE29B\u0000\u0000"+
-        "\u0000\u0000\u0000\uF3FD\u0000\uEA4F\uF8BA\uF7B9"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE262\u0000"+
-        "\uECAB\uF0E0\u0000\u0000\u0000\uE29C\uE0F7\uEDA5"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE071\u0000\uE55C\u0000\u0000"+
-        "\u0000\u0000\u0000\uF071\u0000\u0000\uE973\uEAAD"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE0EB\u0000"+
-        "\u0000\u0000\uE5AF\u0000\u0000\u0000\uE697\u0000"+
-        "\uEDF8\u0000\u0000\uEA50\uF133\u0000\uEFCD\u0000"+
-        "\uF037\uEFF6\uF8BB\u0000\uEEE9\uF2CC\u0000\u0000"+
-        "\uE376\u0000\u0000\uEA51\u0000\u0000\uED3C\u0000"+
-        "\u0000\uE75C\uF7F1\u0000\uE26F\uF834\uEE42\u0000"+
-        "\uF89D\u0000\u0000\uF84D\uE158\uF2CD\uE5D5\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE4A2\u0000"+
-        "\u0000\u0000\uF161\u0000\u0000\u0000\u0000\u0000"+
-        "\uED37\uF162\u0000\u0000\uF641\u0000\u0000\uE29D"+
-        "\u0000\u0000\uE361\uE0BF\u0000\uF1A4\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF1A8\uEA52\uF672\uF1DC"+
-        "\uE997\uEB49\u0000\u0000\u0000\uE55E\u0000\uF545"+
-        "\u0000\u0000\u0000\uE4DB\uE645\uF134\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uED76\u0000\uF3EA\u0000\u0000\u0000\uE0EC\uE0C0"+
-        "\u0000\u0000\u0000\uF194\u0000\u0000\u0000\u0000"+
-        "\u0000\uE37A\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF7F2\uF135\uE36F\u0000\uEEEA\uE37B\uE961"+
-        "\uE8E9\uF9CC\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8D7"+
-        "\u0000\u0000\u0000\u0000\uE871\u0000\uE646\u0000"+
-        "\uECDF\u0000\uEA53\u0000\uEA54\uE031\u0000\u0000"+
-        "\u0000\u0000\u0000\uF27C\u0000\u0000\uE4A3\uF247"+
-        "\uF75F\u0000\u0000\u0000\u0000\uF058\uF248\uF3AC"+
-        "\uF3A5\uEFCE\u0000\u0000\u0000\uF7BC\u0000\u0000"+
-        "\u0000\uEDF9\uF17A\uE9D6\uF1C2\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF735\u0000\u0000\u0000\u0000\u0000\uEDBA"+
-        "\uE8D8\u0000\u0000\uE032\u0000\u0000\uE3CD\u0000"+
-        "\u0000\u0000\uF27D\u0000\u0000\u0000\uF17B\uEA55"+
-        "\u0000\uECE0\u0000\uE059\uF479\u0000\uE5CE\u0000"+
-        "\uF646\u0000\uE252\uE657\u0000\uECB4\u0000\uF3AD"+
-        "\u0000\uF072\u0000\u0000\u0000\u0000\uE6C2\u0000"+
-        "\uF4A7\u0000\u0000\uE1EA\u0000\uF0EE\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE7B2\uF9A5"+
-        "\u0000\u0000\u0000\u0000\u0000\uF665\uE5E2\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF745"+
-        "\u0000\u0000\uE197\uF5B5\uED3D\u0000\u0000\u0000"+
-        "\u0000\uEEEB\uF3D5\u0000\u0000\u0000\uF34B\u0000"+
-        "\u0000\uEFB5\u0000\uE159\uF865\u0000\u0000\uEBD4"+
-        "\u0000\u0000\uE6D6\u0000\u0000\uE951\u0000\uEA56"+
-        "\uF891\uECE1\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEBF3\uE998"+
-        "\u0000\uE29E\u0000\uE8C4\u0000\uF793\u0000\u0000"+
-        "\uE974\u0000\uEDEF\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE941\u0000\u0000\u0000\uE5D6\u0000"+
-        "\u0000\uF4DA\u0000\uE0C1\u0000\uE8C3\u0000\u0000"+
-        "\u0000\uE7FA\uE4EE\u0000\u0000\u0000\uF848\u0000"+
-        "\u0000\uF9A6\uF0EF\u0000\uF536\u0000\uE15A\uF4A8"+
-        "\u0000\uF4DB\u0000\uE8A7\uF647\u0000\uE2E6\uF394"+
-        "\uE0DA\u0000\uEED2\uE6C3\uF692\uEF6E\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEDA6\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEDE7\u0000\u0000\u0000\uE033"+
-        "\uE137\uF059\u0000\u0000\u0000\u0000\u0000\uF746"+
-        "\u0000\u0000\u0000\u0000\u0000\uF835\u0000\u0000"+
-        "\u0000\u0000\uF3AE\u0000\uF2CE\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE0ED\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF640\uF2CF\uEFCF\u0000"+
-        "\uF6DE\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE263\u0000\u0000\u0000\u0000\uE999\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE8A8\u0000\u0000"+
-        "\u0000\uE0F8\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEAA1\uE9E1\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF5CA\uEFB6\u0000\u0000"+
-        "\u0000\u0000\uEEEC\uF27E\u0000\uF4F0\u0000\uEABF"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE15B\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE351\u0000\u0000"+
-        "\u0000\uF562\uEB4A\u0000\u0000\u0000\u0000\uEAC0"+
-        "\u0000\uE270\u0000\u0000\u0000\uE962\uF9EA\u0000"+
-        "\u0000\u0000\uE698\u0000\u0000\u0000\uF05A\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEF79\u0000\uECAC"+
-        "\u0000\u0000\u0000\u0000\u0000\uF4D0\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE034\u0000\uE8F8\u0000\u0000\u0000\uEA57"+
-        "\uF0F0\uF3D6\u0000\u0000\uEDE2\u0000\uE15C\u0000"+
-        "\u0000\uE0FB\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF073\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEAC1"+
-        "\u0000\uE67D\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEFD0\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF249\u0000\u0000\u0000\u0000\uE5E3"+
-        "\u0000\u0000\uE3D3\u0000\uEDF0\u0000\u0000\u0000"+
-        "\uEF44\uF0C3\u0000\uF03A\uF89E\uF5F6\uF34C\uF9D4"+
-        "\uEB4B\uE253\u0000\uE34A\uF6BA\uE795\uF6CD\u0000"+
-        "\u0000\u0000\uED3E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE56F\u0000\u0000\u0000"+
-        "\u0000\u0000\uE377\u0000\u0000\uF19F\u0000\uE43E"+
-        "\uF291\uE5D7\uF074\uF732\uE1EB\uE6BF\uF8B1\u0000"+
-        "\u0000\uE1EC\u0000\u0000\u0000\uE942\uE37C\uE29F"+
-        "\uF292\u0000\u0000\u0000\uE152\u0000\u0000\u0000"+
-        "\uE37D\u0000\u0000\u0000\u0000\u0000\uEDF7\u0000"+
-        "\u0000\u0000\uF4FC\u0000\u0000\uF232\u0000\u0000"+
-        "\u0000\u0000\uE7B3\u0000\u0000\uE796\u0000\uEFB7"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE23E\u0000\u0000\u0000\u0000\uE7A2\u0000\u0000"+
-        "\u0000\u0000\uE793\u0000\uE55F\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEDA7\uE5D2"+
-        "\u0000\u0000\u0000\u0000\u0000\uE639\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF532\u0000\uF3D7\u0000"+
-        "\u0000\uE5D8\u0000\uF34D\uE6D0\uE560\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE6CF\uF0EA\uF9EB\u0000"+
-        "\u0000\uE8ED\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF955\uE0C2\u0000\u0000\u0000\u0000\uF9D5\u0000"+
-        "\uF558\uEF7A\uF5F3\u0000\u0000\uF7DE\u0000\u0000"+
-        "\uE4EF\u0000\u0000\uF163\u0000\u0000\uE9C2\uF2B7"+
-        "\uEED4\u0000\uE05A\u0000\u0000\u0000\uE7FB\u0000"+
-        "\u0000\uF89F\u0000\u0000\u0000\u0000\u0000\uE63A"+
-        "\u0000\u0000\u0000\u0000\u0000\uF59A\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF6F7\uE93C\u0000\u0000"+
-        "\u0000\uE6D7\uEAA2\u0000\u0000\u0000\uE24E\u0000"+
-        "\uE4F0\u0000\u0000\u0000\u0000\u0000\uF334\uEBEC"+
-        "\uE2E7\uF4CB\uF1A9\uE04E\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF591\u0000\u0000\u0000\uF65E"+
-        "\u0000\u0000\uEA9D\uE34B\uE5B7\uF293\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF538\u0000\uE99A\u0000"+
-        "\u0000\u0000\u0000\uE0A7\u0000\uE85E\u0000\u0000"+
-        "\u0000\uEB76\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF1A5\uF294\u0000\u0000\u0000\u0000\uE99B"+
-        "\u0000\u0000\uF7DC\u0000\u0000\uF4DC\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF794\u0000\uF59B"+
-        "\u0000\u0000\u0000\uF993\u0000\u0000\u0000\uE34C"+
-        "\uE8F9\uE6B1\u0000\u0000\u0000\uE0FC\u0000\u0000"+
-        "\u0000\uF335\uE0FD\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE5F4\u0000\u0000\u0000\uE1ED"+
-        "\uE035\u0000\u0000\uE63B\uE352\u0000\u0000\u0000"+
-        "\u0000\uF34E\uE44D\uE134\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF846\u0000"+
-        "\u0000\uE15D\u0000\uE89C\u0000\uF65F\u0000\uEFB8"+
-        "\u0000\uE797\u0000\u0000\u0000\uE15E\u0000\u0000"+
-        "\u0000\u0000\uE6CD\u0000\u0000\uE561\uEFED\u0000"+
-        "\uE07B\uE7E2\u0000\uF9B2\u0000\uECAD\uE65C\uE7B4"+
-        "\u0000\u0000\uEBA7\uF263\uE353\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF9B3\u0000\uE5E4\u0000\u0000"+
-        "\uE2E8\u0000\uF1C3\uE342\u0000\u0000\uE2A0\uE838"+
-        "\u0000\u0000\u0000\u0000\u0000\uF760\u0000\u0000"+
-        "\uF9D6\u0000\u0000\u0000\u0000\uF761\u0000\uF762"+
-        "\uE963\u0000\u0000\u0000\u0000\uE9E2\uF8F9\uE9C1"+
-        "\u0000\uECB5\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF1DD\uE254\u0000\uE0A1\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE9E3\u0000\u0000\u0000\u0000\uF96D"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF7AF\u0000\u0000\u0000\u0000\u0000\uE49D"+
-        "\uE2A1\uED38\u0000\uF546\uF1A0\u0000\u0000\uECAE"+
-        "\uEEED\uF9C1\uE872\u0000\u0000\uE743\u0000\u0000"+
-        "\u0000\uE9E4\uF391\uF693\uF892\u0000\u0000\uE3F5"+
-        "\u0000\u0000\uE85F\u0000\uE964\u0000\uE936\u0000"+
-        "\uF2BF\u0000\u0000\u0000\u0000\u0000\uE25F\u0000"+
-        "\uEB69\u0000\u0000\u0000\u0000\u0000\u0000\uE7D6"+
-        "\uF164\uF05B\u0000\u0000\uE04F\uE5B0\u0000\uE2E9"+
-        "\u0000\u0000\u0000\u0000\u0000\uF3ED\u0000\uE15F"+
-        "\u0000\u0000\u0000\u0000\uED9A\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uED7D\u0000\u0000\u0000\u0000"+
-        "\uE6D8\u0000\uF9A7\u0000\u0000\u0000\u0000\uF03B"+
-        "\uF642\u0000\u0000\u0000\u0000\uE2F0\uF7BD\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEE96\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE0DB\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF4D1\u0000\u0000\u0000\u0000"+
-        "\uEFD1\uF4A9\uE370\uEFD2\u0000\uE873\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEC62\u0000\uF632\uEBF4"+
-        "\u0000\u0000\u0000\uE874\u0000\u0000\u0000\u0000"+
-        "\u0000\uEED5\uF5BF\uE2A2\uE1AF\uE2A3\u0000\u0000"+
-        "\u0000\uE1B0\uF3FE\uE333\uEBAF\uF733\u0000\uE036"+
-        "\uF6BB\uF47A\uEA58\uEFD3\u0000\u0000\u0000\u0000"+
-        "\uEA59\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF9DE\uE050\u0000\u0000\u0000"+
-        "\uF7EA\uE3CE\uF264\u0000\uE562\uE7A3\uF9A8\uE6D9"+
-        "\uF6CE\uF84E\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE2D6\u0000\uE6F0\u0000\uF0E1"+
-        "\uF755\u0000\u0000\u0000\u0000\u0000\uE99C\u0000"+
-        "\u0000\uE9C3\u0000\uF7DF\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEEEF\u0000\u0000\u0000\u0000"+
-        "\uF9E5\uF633\u0000\uE7FC\uF9A9\u0000\uEEEE\u0000"+
-        "\u0000\u0000\uE5E5\u0000\u0000\u0000\u0000\u0000"+
-        "\uF2D0\u0000\uE1B1\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF6A2\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF3B2\u0000\uF3B1\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE1B2\u0000\uE83B\u0000\uE037\u0000\u0000"+
-        "\u0000\u0000\u0000\uECE2\uF8BC\uE7A4\u0000\u0000"+
-        "\uF24A\u0000\u0000\u0000\u0000\u0000\uF763\u0000"+
-        "\u0000\u0000\u0000\u0000\uF8FA\u0000\uE2A4\u0000"+
-        "\uE99D\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF673\u0000\u0000\u0000"+
-        "\uF1AA\u0000\u0000\uF431\uE271\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF836\u0000\u0000\u0000\u0000"+
-        "\uF7E0\u0000\u0000\u0000\u0000\uF166\u0000\u0000"+
-        "\uED7E\uF7A1\u0000\u0000\uF8EF\u0000\u0000\u0000"+
-        "\uF7EB\uF233\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF03C\u0000\u0000\u0000\uE038\u0000\u0000"+
-        "\uF59C\u0000\u0000\u0000\u0000\uE1D6\uF998\u0000"+
-        "\u0000\u0000\uF559\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF764\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF736\u0000\uEA5A\uF456"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE6DA\u0000"+
-        "\uE4D0\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE755\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF076"+
-        "\u0000\uF4DD\u0000\u0000\u0000\uED6A\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF674\u0000"+
-        "\u0000\u0000\u0000\u0000\uF694\u0000\uEAC2\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7FD"+
-        "\u0000\u0000\u0000\uE198\u0000\u0000\uE4BA\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uED3F\u0000"+
-        "\u0000\u0000\u0000\uF7E1\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF336\u0000\u0000\u0000"+
-        "\uE0D3\u0000\u0000\u0000\uEB4C\u0000\uF55A\uE59C"+
-        "\u0000\uF9AA\uF7E2\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF547\uF9C2\uF940\u0000\uF9EC\uE072\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9BD"+
-        "\u0000\uF077\uEAC3\uE3D2\uE272\u0000\uE4A4\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF9AB\u0000\uEAE0"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF457\u0000\u0000\u0000"+
-        "\u0000\u0000\uEEF0\u0000\uE37E\u0000\u0000\uF4AA"+
-        "\u0000\u0000\u0000\uEA5B\uF648\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEBF5\uF3B3\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF6A3\u0000"+
-        "\u0000\uE039\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE2A5\u0000\u0000\uEAC4"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEBB0"+
-        "\u0000\u0000\uF34F\u0000\uF634\u0000\uECB6\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF856\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE391\u0000\u0000\uF9ED\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE9C4\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF999\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEE4F\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEA3D\u0000\uF84F\u0000"+
-        "\u0000\u0000\u0000\u0000\uEDF1\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF1C4\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE435\u0000\u0000\uF9EE\u0000\u0000"+
-        "\u0000\uF5B6\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEBF6\uEA5C\u0000\u0000\uF96E\u0000"+
-        "\uF167\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE1DD\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE647\uE1B3\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF765\uEDD8\u0000\u0000\u0000"+
-        "\uE2EA\u0000\u0000\uE2D0\u0000\uF05C\u0000\u0000"+
-        "\u0000\u0000\uF03E\uF03D\u0000\u0000\uE4F1\u0000"+
-        "\uE4A5\u0000\u0000\u0000\u0000\u0000\u0000\uF6CF"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF234\u0000\u0000\u0000\u0000\uE334\u0000\u0000"+
-        "\uF432\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE392\u0000\u0000\u0000\u0000"+
-        "\uF433\u0000\uF6F8\u0000\u0000\u0000\u0000\uE343"+
-        "\u0000\u0000\uE8A9\u0000\u0000\uE4BB\uE07C\u0000"+
-        "\uF3A6\uE0D5\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF6E7\u0000\u0000\uE1DE\u0000\uF6A4\u0000"+
-        "\u0000\u0000\uF750\u0000\u0000\u0000\uE4DD\u0000"+
-        "\uE160\u0000\u0000\u0000\u0000\uE2A6\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF695\u0000\u0000\u0000"+
-        "\u0000\u0000\uEBF7\u0000\u0000\u0000\u0000\u0000"+
-        "\uE4DC\u0000\u0000\uF8A0\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF837\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF0D9\u0000\uE2A7\uF03F\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uED91\u0000\u0000\u0000\uEFB9"+
-        "\uF3D8\u0000\u0000\uE768\u0000\u0000\uEB94\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE44"+
-        "\uE99E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF4F1\u0000\u0000\u0000\uECD0\u0000\u0000\uF49D"+
-        "\u0000\uE8C6\uE393\u0000\uE394\u0000\u0000\u0000"+
-        "\uE2DC\u0000\uE4D1\u0000\u0000\uE141\uF6D8\u0000"+
-        "\uE0A8\uF0BC\uED4E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF56C\u0000"+
-        "\u0000\uE952\u0000\u0000\uF337\u0000\u0000\uEE50"+
-        "\u0000\u0000\uE07D\u0000\u0000\u0000\u0000\uEF7B"+
-        "\uEDE8\uE953\u0000\u0000\uF1DE\uE4F2\u0000\u0000"+
-        "\u0000\u0000\uE199\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE264\uEEAB\u0000\u0000\u0000\uE0C3"+
-        "\u0000\uEBB1\u0000\u0000\uF6B2\u0000\u0000\uE4F3"+
-        "\uE4D2\u0000\uF5C0\u0000\u0000\u0000\uEADD\u0000"+
-        "\u0000\uF295\uEEF1\u0000\uF9B4\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF458\u0000\u0000"+
-        "\u0000\uF4D2\u0000\u0000\uF296\u0000\uEC63\u0000"+
-        "\u0000\u0000\u0000\uE161\u0000\uEAEA\u0000\u0000"+
-        "\u0000\uEFBA\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE7D7\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF5CD\u0000\uF3F2\uF857"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE7F8\uE552\u0000\u0000\u0000\u0000\uF675\u0000"+
-        "\u0000\u0000\u0000\uE9C5\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEEF2\uF1DF\u0000\u0000\uE05B\u0000"+
-        "\u0000\uE8FA\u0000\u0000\u0000\uEF45\u0000\uE4A6"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF9B5\u0000"+
-        "\u0000\uF7C9\u0000\uED72\u0000\uF8BD\u0000\u0000"+
-        "\uE6A4\uE255\u0000\u0000\u0000\u0000\uE265\uE676"+
-        "\u0000\u0000\u0000\u0000\uEDBD\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEA5D\uF195\u0000\u0000\uF1E0"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF17C\uF8BE\uEAEB\u0000\uEBF8\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF7BE"+
-        "\u0000\u0000\u0000\u0000\uE395\uEB3A\uEF72\u0000"+
-        "\u0000\uEC64\uE49F\u0000\uEDA8\u0000\u0000\u0000"+
-        "\u0000\u0000\uE7D3\u0000\u0000\u0000\u0000\uE4DE"+
-        "\u0000\uF548\uF6BC\uE99F\u0000\uEF7C\uED77\u0000"+
-        "\u0000\uECF7\u0000\u0000\u0000\u0000\u0000\uF138"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF893\u0000"+
-        "\u0000\u0000\u0000\u0000\uEDF2\u0000\u0000\uE396"+
-        "\uE43F\uE975\u0000\u0000\u0000\u0000\uE335\uF3B4"+
-        "\uF941\uE19A\u0000\u0000\uE9C6\uF861\u0000\uF6DF"+
-        "\u0000\u0000\uF838\u0000\u0000\u0000\u0000\u0000"+
-        "\uF297\u0000\uEA5E\u0000\u0000\u0000\u0000\uEEF3"+
-        "\u0000\u0000\uF6AC\uF0C4\uF1E1\uEB3B\uE9C7\u0000"+
-        "\u0000\u0000\u0000\uE443\uE44F\u0000\u0000\u0000"+
-        "\uE05C\u0000\u0000\u0000\u0000\uF8BF\u0000\u0000"+
-        "\u0000\u0000\uEDFD\uE9E5\uE75D\u0000\u0000\u0000"+
-        "\u0000\u0000\uF196\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE397\u0000\u0000\uEF7D\uE362"+
-        "\u0000\uE7D8\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF676\u0000\u0000"+
-        "\uE8AA\u0000\u0000\u0000\uF6E0\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE769\u0000\uF533\u0000\u0000\uF56D\u0000"+
-        "\u0000\u0000\u0000\uF2D1\u0000\u0000\uE7B5\u0000"+
-        "\u0000\uF1AB\u0000\uECB7\u0000\u0000\u0000\u0000"+
-        "\uF24B\uE1B4\u0000\uEB95\uF05D\u0000\u0000\u0000"+
-        "\u0000\uF197\uEF7E\u0000\uE0A9\uF3AF\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE05D\u0000"+
-        "\uF139\u0000\uF47B\u0000\uF9EF\u0000\uF7F3\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEE51\u0000\u0000\uF168\u0000\u0000\u0000\uF1AC"+
-        "\u0000\uF05E\u0000\uEF6F\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEA5F\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE436\u0000\u0000\uEEF4\uE3D6\u0000\u0000\uEE52"+
-        "\uECE3\u0000\u0000\u0000\u0000\uED40\u0000\u0000"+
-        "\u0000\uE744\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF635\u0000"+
-        "\u0000\u0000\u0000\u0000\uF4DE\u0000\u0000\u0000"+
-        "\u0000\uE6A5\u0000\u0000\u0000\u0000\uF6E8\u0000"+
-        "\u0000\uEF56\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF8E6\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE9E6\u0000\u0000\u0000\uE9A0\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE76A\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE83C\uF040\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uECB8\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE03A\uEBF9\u0000\uF041\u0000\u0000\u0000"+
-        "\u0000\uF47C\u0000\u0000\uF87E\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF265\u0000\u0000\u0000\u0000\uF7F4\u0000"+
-        "\u0000\uE47C\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF8FB\u0000\u0000"+
-        "\u0000\uF9F0\u0000\uEB4D\uE273\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF756\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEA3E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEAC5\u0000\u0000\uEDBE\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF1AD\uF87A\u0000\u0000\uE1EE\uF1A6\u0000\uF1AE"+
-        "\uF37D\u0000\uE9A1\u0000\uF1AF\uF99A\u0000\uE77B"+
-        "\u0000\u0000\u0000\uE19B\uE1B5\u0000\u0000\u0000"+
-        "\u0000\uF839\u0000\uEBDD\u0000\u0000\u0000\u0000"+
-        "\uEC65\uF1CF\u0000\u0000\u0000\uE9A2\u0000\u0000"+
-        "\uF7CA\u0000\uF078\u0000\uEDED\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE4EB\u0000\uEFD4"+
-        "\uEBFA\uED5C\u0000\uEBE4\uEF57\u0000\u0000\uE26B"+
-        "\u0000\u0000\u0000\uE965\u0000\uF6B5\uF995\uF395"+
-        "\uE23F\uF3B5\uF2D2\uEF58\uF0F1\u0000\u0000\u0000"+
-        "\u0000\u0000\uE0D4\uEB4E\uECF8\uF079\uF942\u0000"+
-        "\u0000\u0000\u0000\u0000\uEB96\u0000\uE2E0\u0000"+
-        "\uF235\u0000\u0000\uF83A\uEE53\uEBB2\uE03B\u0000"+
-        "\uECE4\uEFBB\u0000\u0000\u0000\u0000\u0000\uEC66"+
-        "\uF4F2\u0000\uF266\uF042\uE398\uF169\uE85B\uE2A8"+
-        "\u0000\u0000\u0000\u0000\uE9A3\u0000\u0000\u0000"+
-        "\uE76B\u0000\uF7CE\uEFD5\uECD1\u0000\u0000\uE44C"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE73C\uF4CC"+
-        "\u0000\uE1FB\uF666\u0000\uEEF5\uEF91\uECF9\uE44B"+
-        "\uF4F3\uECFB\u0000\uEA60\uE240\u0000\uE699\uF3D9"+
-        "\u0000\u0000\u0000\u0000\u0000\uF5C1\uE954\u0000"+
-        "\uF5BB\u0000\uEA61\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE976\u0000\u0000\uEA62\u0000\u0000\uF1E2"+
-        "\uF298\uF05F\uF37E\uECFC\u0000\uE4DF\uE4F4\uEBB3"+
-        "\u0000\uEBB4\u0000\u0000\u0000\u0000\uF563\u0000"+
-        "\u0000\uEAC6\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEFD6\u0000\u0000\u0000"+
-        "\uE8AB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF636\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uECB9\uF0C5\uF539\uE1B6\uE49B\u0000\uE83D\uE473"+
-        "\uE2D1\u0000\u0000\u0000\u0000\uE0DC\uE19C\u0000"+
-        "\uE2DD\u0000\u0000\uEF39\u0000\uECBB\uECBA\u0000"+
-        "\u0000\uEB6A\u0000\u0000\u0000\uF299\u0000\u0000"+
-        "\u0000\u0000\u0000\uE943\u0000\u0000\u0000\u0000"+
-        "\uE4F5\u0000\uE6A6\u0000\uF645\uE6DB\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEBD5\u0000\u0000\uE57A"+
-        "\u0000\uEAA3\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF9DF\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE399\uF1D4\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE0AA\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uED6B\u0000\uEBFB\uE0A2\u0000\u0000\u0000"+
-        "\u0000\uE4E0\u0000\uED4F\u0000\uF8C0\u0000\uE84E"+
-        "\uED5D\u0000\uE649\u0000\u0000\u0000\uF2C0\u0000"+
-        "\uEBFC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF649\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEAC7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uED41\u0000\u0000\u0000\u0000\u0000\u0000\uE977"+
-        "\uE978\u0000\u0000\u0000\uF866\u0000\uE4F6\u0000"+
-        "\u0000\u0000\u0000\uF3DA\u0000\uF894\u0000\u0000";
-
-    private final static String innerIndex2=
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC9F"+
-        "\u0000\u0000\u0000\u0000\u0000\uE5CF\uE39A\u0000"+
-        "\u0000\uE1DF\u0000\u0000\uF5CB\u0000\uED92\uE0AB"+
-        "\u0000\uE6C4\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uECA0"+
-        "\u0000\uE9DA\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE83E\uE07E\u0000\u0000\u0000"+
-        "\uE5B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uECA1\u0000\u0000\uEF73\u0000\u0000\uF4AB"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2A9"+
-        "\u0000\u0000\u0000\uE4F7\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE593\u0000\u0000"+
-        "\uE274\u0000\uEF94\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEDF5\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEEAE\u0000\uE64A\u0000\uEAEC\uED50\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEF74\u0000\u0000"+
-        "\u0000\u0000\uE745\u0000\u0000\u0000\uED6C\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF549\uF3B6\u0000"+
-        "\u0000\uEC6E\uEBB5\u0000\u0000\uE1EF\uF3A7\uE275"+
-        "\uE0DD\u0000\u0000\uE7E3\u0000\u0000\uF4AC\u0000"+
-        "\u0000\uE39B\uF13B\uEA63\uF6E9\u0000\u0000\uF7F5"+
-        "\u0000\u0000\u0000\u0000\u0000\uEBDE\uE0EE\u0000"+
-        "\u0000\u0000\uECBC\uF766\u0000\u0000\uE8EE\u0000"+
-        "\u0000\u0000\u0000\u0000\uF9F1\u0000\u0000\u0000"+
-        "\u0000\uF6B6\u0000\u0000\u0000\u0000\uF56E\u0000"+
-        "\u0000\uF47D\u0000\uE8D9\u0000\uF338\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEBFD\u0000\u0000"+
-        "\u0000\u0000\u0000\uEA64\u0000\uEB3C\u0000\u0000"+
-        "\u0000\u0000\u0000\uF1E3\u0000\u0000\uE4E1\u0000"+
-        "\uEAC8\u0000\u0000\u0000\u0000\uE7B6\u0000\uF9AC"+
-        "\uF2D3\u0000\u0000\u0000\uED51\uF77B\u0000\uE8AC"+
-        "\u0000\u0000\u0000\u0000\uF956\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE73D\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF64A"+
-        "\u0000\uE8DF\uE4D3\uF757\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE05E\uF751\uE444\u0000\u0000\uE944"+
-        "\uF849\uE05F\u0000\uF943\uF07A\uF07B\uE39C\u0000"+
-        "\u0000\u0000\u0000\u0000\uF1E4\u0000\u0000\uE9E7"+
-        "\u0000\u0000\uEAC9\u0000\u0000\u0000\u0000\uEAED"+
-        "\u0000\u0000\u0000\u0000\u0000\uF24C\u0000\uF2C1"+
-        "\u0000\u0000\uE162\u0000\uE9A4\u0000\u0000\u0000"+
-        "\uEACA\u0000\u0000\u0000\u0000\u0000\uE4F8\uF3A8"+
-        "\u0000\u0000\u0000\uE1B7\u0000\uF2D4\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uED6D\uEAEE\uE0AC"+
-        "\uEFBC\u0000\u0000\u0000\u0000\u0000\uF07C\u0000"+
-        "\u0000\u0000\uEACB\u0000\u0000\u0000\u0000\u0000"+
-        "\uF7BF\uE63F\uE5C6\u0000\u0000\u0000\u0000\u0000"+
-        "\uE2AA\u0000\u0000\uE239\u0000\u0000\uE69A\u0000"+
-        "\u0000\u0000\uF3B7\uF29A\u0000\u0000\u0000\uE7D9"+
-        "\uF4DF\u0000\uF758\uE256\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE5E6\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF576\u0000\u0000\uEE55\uF2D5"+
-        "\u0000\u0000\uE0EF\uF96F\u0000\u0000\u0000\u0000"+
-        "\u0000\uE937\u0000\u0000\uE677\u0000\u0000\u0000"+
-        "\u0000\u0000\uF759\u0000\u0000\u0000\u0000\uECD2"+
-        "\u0000\uECBD\u0000\uE2E1\uF350\uF16A\u0000\uE9D7"+
-        "\uF8F0\u0000\u0000\uF13C\u0000\u0000\u0000\uF339"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF867\uF8C1"+
-        "\u0000\uE450\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEDB0\u0000\u0000\u0000\uF1E5\u0000\u0000"+
-        "\u0000\u0000\uE0AD\u0000\uF7B0\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF6A5\u0000\uE0AE\u0000\uE83F\u0000\uE746\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE4A7\uF8B2"+
-        "\u0000\uF9C4\u0000\uF13D\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF8A1\u0000\u0000\u0000\uEDE9\uEFEE"+
-        "\u0000\uF4F4\uF795\uF351\uEA3F\uF740\u0000\u0000"+
-        "\uF4E0\uEEAF\u0000\u0000\u0000\u0000\u0000\uE8AD"+
-        "\u0000\uEE45\u0000\u0000\uF7A8\u0000\u0000\uE9D8"+
-        "\uEF69\uF2D6\u0000\u0000\u0000\uE4E2\u0000\uEC6F"+
-        "\u0000\u0000\uF970\uE6C8\uF9AD\u0000\u0000\u0000"+
-        "\uEAEF\uE163\uE4F9\u0000\u0000\u0000\u0000\uE592"+
-        "\uE8C7\uEA65\u0000\u0000\u0000\u0000\uF396\u0000"+
-        "\uE5D0\uEDD9\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF957\uE966\uEC70\u0000\u0000\u0000\uE840\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF4A3\u0000\uE4EC"+
-        "\u0000\uF55B\u0000\u0000\u0000\uF9C5\u0000\u0000"+
-        "\u0000\u0000\u0000\uECFD\u0000\uF7B1\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE39D\uF16B\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF5BC\uF434"+
-        "\uE75E\uE75F\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF5F7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF671\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE447\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF8EC\u0000\uE9C8"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED78"+
-        "\u0000\u0000\uE451\u0000\u0000\u0000\uF767\u0000"+
-        "\u0000\u0000\u0000\u0000\uE64B\uEA66\u0000\u0000"+
-        "\uF6BD\uF13E\u0000\u0000\u0000\uE371\u0000\uEB97"+
-        "\uF043\u0000\uE266\u0000\u0000\u0000\u0000\uE135"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF198\uEC71\uECBE\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF958\u0000\u0000"+
-        "\uE1F0\u0000\uF7F6\u0000\u0000\uEAF0\u0000\u0000"+
-        "\u0000\uEDBF\u0000\u0000\u0000\uE24F\u0000\u0000"+
-        "\u0000\u0000\uF971\uF1B0\uF9D1\uF64B\u0000\u0000"+
-        "\uF7CF\uF0DA\uE051\u0000\uE448\uE1F1\u0000\uECD3"+
-        "\uF9E6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEE7D\u0000\u0000"+
-        "\u0000\uECFA\u0000\u0000\uF33A\uF7D0\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF972\u0000\uF737\u0000"+
-        "\u0000\u0000\uEBE5\uF29B\u0000\u0000\u0000\uEEF6"+
-        "\uF07D\u0000\u0000\uF944\uF5C2\u0000\u0000\uE6DC"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF397\u0000\uE9E8\uE4ED\uF5FC\u0000\uE84F\u0000"+
-        "\uE19D\u0000\u0000\u0000\uE4FA\uF534\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF2D7\u0000\uE553"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF8E3\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF8ED\u0000\uEB3D\u0000\u0000\uF07E"+
-        "\uF8B3\uED52\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF677\uE46D\u0000\uEACC\u0000\u0000\uF959\u0000"+
-        "\u0000\uEDA9\uEB98\uF643\u0000\u0000\u0000\u0000"+
-        "\u0000\uEBFE\u0000\u0000\u0000\u0000\uE0F0\u0000"+
-        "\uF091\uF092\u0000\u0000\u0000\uE850\uF744\uF0F2"+
-        "\u0000\u0000\u0000\u0000\u0000\uED53\u0000\u0000"+
-        "\u0000\u0000\uEFD7\uED93\u0000\u0000\u0000\uE091"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE267"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF95A\u0000\u0000\u0000\uF4E1\u0000\u0000\uE0C4"+
-        "\u0000\u0000\u0000\u0000\uECE5\u0000\uE0C5\uF044"+
-        "\u0000\u0000\uEFBD\u0000\uE6C9\u0000\u0000\uF0DB"+
-        "\uF1B1\u0000\uE153\uF6BE\uF95B\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF796\u0000\uE7B7\u0000\u0000"+
-        "\uF4D3\uF4D4\u0000\u0000\u0000\uF6E4\u0000\uF6D1"+
-        "\u0000\u0000\uE747\uE241\uE052\u0000\u0000\uF8B4"+
-        "\uE0C6\u0000\u0000\uF398\u0000\u0000\uE5E7\u0000"+
-        "\uF060\u0000\u0000\u0000\u0000\u0000\uE164\uE0AF"+
-        "\u0000\u0000\u0000\u0000\u0000\uF53A\uEFAF\u0000"+
-        "\u0000\uF5C3\uEFD8\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE9E9\u0000\u0000\u0000\uF3F3\u0000"+
-        "\uE5FB\uEA4B\u0000\u0000\uF59D\u0000\u0000\u0000"+
-        "\uF9F3\uF9F2\uF6A6\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE9C9\u0000\u0000\uE563"+
-        "\u0000\uE138\u0000\uE851\uE165\u0000\uE7E4\u0000"+
-        "\u0000\u0000\uF85A\u0000\u0000\u0000\uEDE3\u0000"+
-        "\u0000\u0000\uE4BC\u0000\u0000\u0000\uE092\u0000"+
-        "\u0000\u0000\u0000\uE354\u0000\u0000\u0000\uE060"+
-        "\uF83B\uF0EB\uEEF8\uE7E5\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE3D7\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF4A4\u0000\u0000\u0000\uE59D\uF973"+
-        "\uF868\u0000\uF4D5\u0000\uE2AB\u0000\u0000\uF0F3"+
-        "\uE5FC\u0000\u0000\u0000\u0000\u0000\u0000\uE4D4"+
-        "\uE1FC\u0000\uE7E6\u0000\uEC9B\uEC31\uF0D4\u0000"+
-        "\uEB99\uED42\uE19E\u0000\u0000\u0000\uF8E4\u0000"+
-        "\u0000\u0000\uF53B\u0000\u0000\u0000\u0000\uE34D"+
-        "\u0000\uE093\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF2B8\u0000\u0000\u0000\uE6C0\u0000"+
-        "\uF29C\uF9F4\u0000\u0000\uE4E3\u0000\uF8C2\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE5E8\uE8AE"+
-        "\uEBB6\uF747\u0000\u0000\u0000\u0000\u0000\uEB4F"+
-        "\uF8C3\uE9EA\u0000\uEC32\u0000\uF236\u0000\u0000"+
-        "\u0000\u0000\u0000\uF678\u0000\u0000\u0000\u0000"+
-        "\uF697\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE9CA\u0000"+
-        "\u0000\uE372\u0000\u0000\u0000\u0000\uE9A6\u0000"+
-        "\u0000\uE9EB\u0000\u0000\uED9B\u0000\u0000\uECAF"+
-        "\uE39E\u0000\u0000\u0000\uF59E\u0000\u0000\u0000"+
-        "\u0000\uE14C\uF6EA\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEDE4\uEAF1\u0000\u0000\uF6E1\u0000\uF7F7"+
-        "\uF2B9\u0000\u0000\uF768\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF7A9\u0000\u0000\u0000\u0000"+
-        "\u0000\uF769\u0000\u0000\u0000\uF24D\u0000\u0000"+
-        "\u0000\uE756\u0000\u0000\uED73\uF5CE\u0000\u0000"+
-        "\u0000\u0000\uE9D9\u0000\u0000\u0000\u0000\uE7E7"+
-        "\uE449\uE5C3\u0000\u0000\uE875\uE860\u0000\uE3D9"+
-        "\uE268\u0000\uE0DE\uF53C\uE89D\u0000\uF679\uEF95"+
-        "\uE2AC\uF392\u0000\uF59F\uE8C8\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE250\uECD4\uE3CF\uF3F5"+
-        "\u0000\uE1F2\u0000\uE2EB\u0000\u0000\u0000\uE1B8"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uECA6\uE3DA"+
-        "\u0000\uF435\u0000\u0000\u0000\u0000\u0000\uF436"+
-        "\u0000\uED5E\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE4FB\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF3A9\u0000\u0000\u0000\uF459"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF2D8\uEE59\u0000\uE748\uF895\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF4B5\u0000\u0000\uF734\u0000\u0000\uE3F3"+
-        "\uEE58\u0000\u0000\u0000\u0000\uF76A\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE979"+
-        "\uEA67\u0000\u0000\u0000\u0000\u0000\uE0DF\u0000"+
-        "\u0000\u0000\uE2EC\u0000\u0000\u0000\u0000\uF56F"+
-        "\u0000\u0000\uE3F4\uE44A\u0000\u0000\u0000\uEAF2"+
-        "\u0000\u0000\u0000\uEBB7\u0000\u0000\u0000\u0000"+
-        "\uEC33\uE4FC\u0000\u0000\uF1E6\u0000\u0000\u0000"+
-        "\u0000\u0000\uE8C9\u0000\u0000\u0000\uED9C\u0000"+
-        "\uE2DE\u0000\u0000\uE260\u0000\u0000\u0000\u0000"+
-        "\uE5D3\uF4F5\uF6AE\u0000\u0000\uF2C8\u0000\uE1F3"+
-        "\uF5CF\uEDF3\uF352\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE061\u0000\u0000\u0000\uF093\u0000\uE336\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7DA"+
-        "\uF33B\u0000\u0000\u0000\u0000\u0000\uF0E7\u0000"+
-        "\u0000\u0000\uEDC0\uF945\u0000\u0000\u0000\u0000"+
-        "\u0000\uED54\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE139\uF9C6\u0000"+
-        "\u0000\u0000\u0000\u0000\uF045\u0000\uEDAA\uEABA"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEBDF\u0000\uE861"+
-        "\u0000\u0000\u0000\u0000\uEBB8\u0000\uEF96\uE4FD"+
-        "\u0000\u0000\u0000\u0000\uEC34\u0000\u0000\u0000"+
-        "\u0000\u0000\uF45A\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE876\uF6B3\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF9CD\u0000\u0000\u0000\uF4B6\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF267\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF5C4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE734\u0000\u0000\u0000\u0000\u0000\uF437"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE7B8\uE7B9\uF2C9\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE65E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF6CB\uEAAE\uEF97\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE445\u0000\u0000\u0000\uE4D5\u0000"+
-        "\u0000\u0000\u0000\u0000\uF55C\uE89E\u0000\u0000"+
-        "\u0000\u0000\u0000\uE7E8\u0000\uF6EB\uF5C9\u0000"+
-        "\uF4BC\u0000\uE862\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE4B5\u0000\u0000\u0000\u0000"+
-        "\u0000\uEF46\u0000\u0000\uE65F\uF54A\u0000\uF6C9"+
-        "\u0000\u0000\uE13A\u0000\u0000\uF353\uE166\u0000"+
-        "\u0000\u0000\uE363\u0000\uE4BD\u0000\u0000\u0000"+
-        "\uE8FB\u0000\uE0E0\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE4E4\uF699\u0000\u0000\uE5BA\uF4CD\uE0E1"+
-        "\u0000\u0000\u0000\u0000\uF0F4\u0000\u0000\u0000"+
-        "\u0000\u0000\uF53D\u0000\uF93A\u0000\u0000\u0000"+
-        "\u0000\u0000\uF6EC\u0000\u0000\u0000\uEF98\u0000"+
-        "\uE877\u0000\u0000\u0000\uF6CC\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEDC1\u0000\u0000\u0000\u0000\uEB7E\u0000\u0000"+
-        "\u0000\u0000\u0000\uE5FD\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE276\uF93B\uE5BB\u0000\u0000\uF438"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEC35\uE1B9"+
-        "\uF094\uE0C7\u0000\uE1F4\u0000\u0000\uE8AF\uF2D9"+
-        "\u0000\u0000\u0000\u0000\u0000\uE1BA\u0000\u0000"+
-        "\uF99B\u0000\u0000\u0000\u0000\uEAF3\uE277\uE852"+
-        "\u0000\uE2AD\u0000\u0000\u0000\u0000\uEEF9\uF738"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF4E2\u0000"+
-        "\u0000\u0000\uE094\uEAA4\u0000\u0000\uE554\u0000"+
-        "\u0000\u0000\u0000\u0000\uE167\uEDC2\u0000\u0000"+
-        "\u0000\u0000\uE1BB\u0000\uF2DA\uF268\u0000\uE9A7"+
-        "\uEC36\u0000\u0000\u0000\u0000\u0000\uEB50\u0000"+
-        "\u0000\u0000\uE640\uF75A\u0000\uF99C\u0000\uE7FE"+
-        "\u0000\u0000\u0000\u0000\uEA40\u0000\u0000\u0000"+
-        "\uE9EC\uE878\u0000\u0000\u0000\u0000\u0000\uE570"+
-        "\u0000\uE69B\u0000\uE1D7\uEA68\u0000\u0000\uF49A"+
-        "\u0000\uED66\u0000\u0000\uE355\uF53E\u0000\uE9A8"+
-        "\u0000\u0000\u0000\uF1C5\uF4D6\u0000\u0000\uEA69"+
-        "\uECE6\u0000\u0000\u0000\u0000\u0000\u0000\uE4A8"+
-        "\u0000\uE8B0\u0000\u0000\uEDDA\uECBF\u0000\u0000"+
-        "\u0000\uE8B1\u0000\u0000\u0000\uE5E9\u0000\u0000"+
-        "\u0000\u0000\u0000\uEB51\uF2DB\u0000\u0000\uF379"+
-        "\u0000\u0000\uE6B2\u0000\u0000\u0000\u0000\uE39F"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE7E9\u0000\u0000\uE3A0\u0000\uF17D\uE4A9\u0000"+
-        "\uF439\uF354\u0000\u0000\uEC72\uEFEF\u0000\u0000"+
-        "\u0000\uF7D1\u0000\u0000\uEFD9\u0000\u0000\u0000"+
-        "\u0000\u0000\uEF6A\uE853\uE854\uE555\u0000\uEEFA"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE1E0\uECB0"+
-        "\u0000\uE8B2\uF8C4\u0000\uF4E3\u0000\uE7A5\uF8E7"+
-        "\uE9CB\uE364\u0000\uEE46\uEB3E\uF9DA\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE945\uEB9A"+
-        "\uEEB1\u0000\u0000\u0000\u0000\uF5F0\u0000\uE76C"+
-        "\uF1C6\u0000\u0000\u0000\u0000\uEBB9\u0000\uECC0"+
-        "\uF7C0\uEFF0\u0000\u0000\uE7DB\u0000\uF4E4\u0000"+
-        "\u0000\u0000\uE946\uED79\u0000\u0000\u0000\u0000"+
-        "\u0000\uF355\uECC1\uF95C\uF95D\u0000\u0000\u0000"+
-        "\u0000\uF45B\u0000\uF45C\u0000\u0000\u0000\uED5F"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF3DB\u0000\uF869\u0000\uF3B8\uF9F5\uEB9B"+
-        "\u0000\u0000\u0000\u0000\uEEFB\uF947\uF974\uF8C5"+
-        "\uECE7\uE749\u0000\uF69A\u0000\u0000\uE955\uE168"+
-        "\u0000\u0000\u0000\uEB3F\uF577\u0000\uF2DC\uE2FC"+
-        "\uF2DD\u0000\uF43A\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF9BE\u0000\u0000\uE03C"+
-        "\uF9BB\uF9C7\u0000\u0000\u0000\u0000\uEEB2\u0000"+
-        "\uF061\uEAF4\u0000\u0000\u0000\u0000\uE3EC\uED6E"+
-        "\uEDC3\u0000\u0000\u0000\u0000\uE7A6\u0000\u0000"+
-        "\uE1BC\u0000\uF4E5\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF1D5\u0000\u0000\uE7BA\u0000"+
-        "\u0000\u0000\uF1E7\uF8B5\uF77C\u0000\u0000\u0000"+
-        "\u0000\uEB77\u0000\uE169\u0000\u0000\uE556\u0000"+
-        "\u0000\u0000\u0000\u0000\uEEA5\u0000\uE5F5\uE4BE"+
-        "\u0000\uF99D\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uED94\u0000"+
-        "\u0000\uEAF5\u0000\u0000\uEF9A\uF77D\u0000\u0000"+
-        "\uE257\u0000\u0000\u0000\u0000\u0000\uF9F6\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEF68\u0000\uE1D8\uEED6\uE16A\u0000\u0000\uE073"+
-        "\uEAF6\uF357\uF356\u0000\uE74A\u0000\uF3F4\uF592"+
-        "\uF5CC\u0000\u0000\uF975\u0000\u0000\u0000\u0000"+
-        "\uF055\uF095\u0000\uE9DB\u0000\uE967\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEA9F\uF49B\u0000\uE5C7"+
-        "\u0000\u0000\u0000\uE760\u0000\uF358\uE3A1\uE3A2"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE7D4\uE678"+
-        "\uE7CA\u0000\uE841\uE757\uE972\uF4CE\uF5F4\u0000"+
-        "\u0000\uF3B9\u0000\u0000\uE863\u0000\uF67A\u0000"+
-        "\u0000\u0000\uE2F5\u0000\u0000\uF9AE\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE062\u0000"+
-        "\u0000\uEAB4\u0000\u0000\u0000\u0000\uE6DD\uF84A"+
-        "\uF237\uF5BD\u0000\uF797\u0000\u0000\uF1E8\u0000"+
-        "\u0000\u0000\u0000\u0000\uE571\u0000\uE3A3\uEBD6"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF7F8\u0000\uE8CA"+
-        "\uE0F9\uE564\u0000\uE7DC\u0000\uF24E\u0000\uF6ED"+
-        "\u0000\u0000\u0000\uE47E\u0000\u0000\uEBE6\uF6F9"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE9ED"+
-        "\u0000\uEF6B\u0000\uE8B3\u0000\u0000\u0000\uE3F7"+
-        "\uEB40\u0000\u0000\uE572\u0000\uF667\u0000\uE6F9"+
-        "\u0000\u0000\uE76D\u0000\uE1FD\uF43B\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1BD"+
-        "\uF752\u0000\u0000\uF43C\u0000\u0000\uE03D\uE03E"+
-        "\uE2AE\u0000\u0000\u0000\u0000\u0000\uECC2\u0000"+
-        "\u0000\u0000\u0000\u0000\uE947\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8DA"+
-        "\uE7BB\uE095\uF663\uEE9A\uF097\u0000\u0000\u0000"+
-        "\u0000\u0000\uF098\u0000\u0000\uF69B\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE2AF\u0000\u0000\uE063\u0000\u0000\uE03F"+
-        "\uE440\uF3BA\u0000\uE6B3\uECC3\uF4FD\uEA6A\u0000"+
-        "\u0000\u0000\u0000\uEA6B\u0000\u0000\uF2DE\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEC73\uF29D\u0000\u0000\uEAF7\uE6CA"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE278\uE8DB\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF3BB\u0000\u0000\u0000\u0000\uEFF1"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF847\uE356\u0000\u0000\uE13B\uF238\u0000\u0000"+
-        "\uE0FA\uF7F9\uE19F\uE4FE\u0000\u0000\u0000\u0000"+
-        "\uED60\u0000\u0000\u0000\u0000\u0000\uF47E\u0000"+
-        "\uE565\uEACD\u0000\uF948\uE3D0\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF45D\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF6D2\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE064"+
-        "\u0000\uE5D9\u0000\u0000\u0000\uE76E\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1D9"+
-        "\u0000\u0000\u0000\uF239\uF64C\u0000\u0000\uE16B"+
-        "\u0000\u0000\u0000\u0000\u0000\uF359\u0000\uF99E"+
-        "\u0000\uEF59\uF5A0\u0000\u0000\u0000\u0000\uEEFC"+
-        "\uE6DE\u0000\u0000\u0000\u0000\uEA6C\u0000\uF33C"+
-        "\uE1A0\uE1E1\u0000\uEBBA\u0000\uE8EF\uE842\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE3A5\uE948\u0000\u0000"+
-        "\u0000\uE798\u0000\uE3A4\u0000\uE1E2\u0000\u0000"+
-        "\u0000\u0000\uE97A\u0000\u0000\uF399\u0000\uF35A"+
-        "\uE34E\u0000\uE9DC\u0000\u0000\u0000\u0000\uE566"+
-        "\uE4D6\u0000\u0000\u0000\u0000\u0000\u0000\uF1D0"+
-        "\uE1A1\u0000\u0000\u0000\u0000\u0000\uEAB5\u0000"+
-        "\u0000\u0000\uEAF8\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE531\uE242\u0000\u0000\u0000\u0000\u0000"+
-        "\uEF5A\u0000\u0000\u0000\u0000\uF0F5\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uECD5\uF5D0\u0000"+
-        "\u0000\u0000\uF5A1\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7A7"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEDAB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEE5B\u0000\uF5F1"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEDC5\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF7A3\uEB6B\uF67B\u0000\uE0F1"+
-        "\u0000\uE7EA\uF5A2\u0000\u0000\u0000\uE6D1\u0000"+
-        "\uE3F8\uF09A\uF09B\uE843\u0000\u0000\u0000\u0000"+
-        "\uF2DF\u0000\u0000\uF3EF\u0000\uEDF6\uF24F\uEC74"+
-        "\u0000\u0000\u0000\u0000\u0000\uE34F\u0000\uF83C"+
-        "\uF5D1\uEEB3\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEFBE\u0000\u0000"+
-        "\u0000\u0000\u0000\uF45E\uE8B4\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF95E\u0000\uE9EE"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEEB4\u0000"+
-        "\u0000\u0000\u0000\u0000\uE6B4\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF6B4\u0000\u0000\u0000\u0000"+
-        "\u0000\uE1BE\u0000\uE879\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE2B0\uF6D9\uF4E6\u0000\u0000"+
-        "\uE269\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE23A\u0000\uE0C8\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE337\u0000\uF35B\u0000\uE357"+
-        "\u0000\u0000\uED55\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE8E0\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE5DA\u0000\uE6A7\u0000\u0000\u0000\uF250"+
-        "\u0000\uF798\u0000\u0000\u0000\u0000\uF5D2\uF1E9"+
-        "\u0000\uE7BC\u0000\uEDC6\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF5A3\u0000\u0000"+
-        "\uE864\uEC37\uF8FC\u0000\u0000\uF3DC\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE096\u0000\u0000\u0000"+
-        "\uEF9C\u0000\u0000\uE279\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEFF8\uEC75\u0000\u0000\u0000\u0000"+
-        "\uE349\uE594\u0000\u0000\u0000\u0000\u0000\uE3A6"+
-        "\u0000\uEACE\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF996\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE4AA\u0000\u0000\u0000\uE13C\u0000\u0000\u0000"+
-        "\u0000\uF2E0\u0000\u0000\u0000\uEDE5\uE365\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE8FC"+
-        "\u0000\u0000\u0000\u0000\uF976\u0000\u0000\u0000"+
-        "\u0000\u0000\uE0FE\uF1EA\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEA41\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF7E3\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE532\uE2F6\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE660\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE5EA\uF3EE\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF85B\u0000"+
-        "\u0000\u0000\u0000\uEDA1\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE5B1\u0000\u0000\u0000"+
-        "\u0000\u0000\uE2ED\u0000\uF1EB\u0000\u0000\u0000"+
-        "\u0000\u0000\uE5B2\u0000\u0000\u0000\uE5BC\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF9E2\uF4AD\u0000\uF9DB\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEFB0\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE3A7\u0000\u0000\uF9E3\uE243\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF9E4\uF85E"+
-        "\u0000\u0000\u0000\u0000\uE040\u0000\uF6A7\u0000"+
-        "\uE2B1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE32"+
-        "\u0000\uF946\uF43D\uF2E1\uF4AE\uE956\uE7EB\u0000"+
-        "\u0000\u0000\uEF70\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEBA8\u0000\u0000\u0000\u0000\uE5F6"+
-        "\uE2FD\u0000\u0000\uEA6D\u0000\u0000\u0000\uE7D1"+
-        "\u0000\u0000\u0000\uED7A\uF45F\u0000\uF6BF\u0000"+
-        "\u0000\uEC76\uEC38\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uECD6\u0000"+
-        "\uF1D1\u0000\u0000\u0000\u0000\u0000\uEFF9\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE641\uEA42"+
-        "\u0000\u0000\uEB78\u0000\u0000\uE4AB\u0000\uF0DC"+
-        "\u0000\u0000\uEAAF\u0000\uE053\u0000\u0000\uF29E"+
-        "\u0000\uF9C3\u0000\u0000\u0000\uF0F6\uE2B2\u0000"+
-        "\u0000\u0000\u0000\uE7EC\u0000\uE7BD\u0000\uE76F"+
-        "\u0000\u0000\uE548\uF0BE\uE9EF\u0000\uE9F0\uE9F1"+
-        "\uE9F2\u0000\u0000\uE7BE\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF8C6\uE2B3\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF29F\u0000\u0000\u0000\u0000\u0000\u0000\uED3B"+
-        "\u0000\uE855\u0000\uE77C\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE3A8\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEC39\u0000\u0000\uEA4C"+
-        "\uEEB5\u0000\u0000\u0000\u0000\u0000\uE8F0\u0000"+
-        "\uF2E2\uF3F0\uE2B4\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE8F1\u0000"+
-        "\uEB41\u0000\u0000\u0000\u0000\uEAA5\u0000\uF7D2"+
-        "\u0000\u0000\uEEFD\u0000\u0000\uEE33\uF8F1\uE0B0"+
-        "\uF43E\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE1E7\u0000\uEF6C\u0000\u0000\uEED7\u0000\u0000"+
-        "\uF6C0\u0000\uE373\u0000\u0000\u0000\uE831\u0000"+
-        "\u0000\u0000\uE14D\u0000\u0000\uE3A9\uE9CC\u0000"+
-        "\u0000\uECFE\uE3AA\uEF3A\u0000\uF046\uF7FA\uEE5C"+
-        "\uF668\u0000\u0000\u0000\uE557\u0000\u0000\u0000"+
-        "\uE7CB\u0000\uE7D2\uE4CB\uE799\uE839\uF5F8\u0000"+
-        "\u0000\uEA6E\uF43F\uF739\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE758\u0000\u0000\uF251\u0000"+
-        "\u0000\u0000\u0000\uF7C1\u0000\u0000\u0000\u0000"+
-        "\uE9F3\uF09C\u0000\uF64D\uEBBB\uE1BF\uF564\uEE5D"+
-        "\u0000\uF95F\uF8A2\u0000\uEB6C\u0000\u0000\u0000"+
-        "\u0000\uF54B\uE865\u0000\uF7B2\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF8F2\u0000\uE8F6\u0000\uEA6F"+
-        "\u0000\u0000\u0000\uE8F2\u0000\u0000\u0000\u0000"+
-        "\u0000\uF76C\uF6EE\uF0E8\u0000\uE49C\u0000\u0000"+
-        "\uF3BC\u0000\u0000\uF86A\u0000\u0000\uE87A\uE856"+
-        "\uF6C1\u0000\u0000\uEEB6\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000";
-
-    private final static String innerIndex3=
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEDC7\uE63C\u0000\u0000\u0000"+
-        "\u0000\uE957\u0000\u0000\u0000\u0000\u0000\uEBA9"+
-        "\u0000\uEC3A\u0000\uE5A6\u0000\u0000\uE567\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF460\u0000\uF09D"+
-        "\u0000\uEB6D\uF8F3\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF3BD\u0000\u0000\uEC77\uF9D7\u0000"+
-        "\uE258\uF047\u0000\uF950\u0000\uF9E7\uF6EF\u0000"+
-        "\u0000\uE6B5\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF2BA\uF3DD\u0000\uEA43\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEF5B\u0000\u0000\uF76D\u0000"+
-        "\u0000\uF8C7\uE5C8\u0000\uE6DF\u0000\uE9A9\u0000"+
-        "\u0000\u0000\u0000\u0000\uEFB1\u0000\u0000\uF83D"+
-        "\uF669\uF896\u0000\u0000\u0000\u0000\u0000\uF73A"+
-        "\u0000\u0000\u0000\u0000\u0000\uEE7E\u0000\uE16C"+
-        "\uEBBC\uEB91\u0000\u0000\uEFBF\uF99F\uEE5E\u0000"+
-        "\u0000\uEBD7\u0000\uEE5F\u0000\uF593\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED95"+
-        "\u0000\u0000\uED9D\u0000\u0000\uF7E4\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF2E3\u0000\u0000\uE2EE\uF64E\uEB42\uF9A0\uE3AB"+
-        "\u0000\u0000\u0000\uE6FA\u0000\u0000\u0000\uF8C8"+
-        "\u0000\uEC67\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE533\uF39A\uE6A8\u0000\u0000\u0000\uEBE7\u0000"+
-        "\u0000\uE4BF\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF2E4\u0000\uE6C5\uF0E2\u0000\u0000\uF977\u0000"+
-        "\u0000\uED32\u0000\uEC78\u0000\uEE60\u0000\uF8E8"+
-        "\uF578\uEDF4\uF54C\uF565\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEAB6"+
-        "\u0000\uF949\uF252\uE097\u0000\u0000\u0000\uF2E5"+
-        "\uE0E2\uE534\u0000\uEA70\uE89F\uED56\uEF4E\u0000"+
-        "\u0000\u0000\u0000\uEB6E\uF644\uF062\u0000\uF7FB"+
-        "\u0000\u0000\uEB52\u0000\uE074\u0000\uEEB7\u0000"+
-        "\uF09F\u0000\uE7DD\u0000\uE844\uF23A\uF8E9\u0000"+
-        "\u0000\u0000\u0000\uE8CB\uE845\u0000\u0000\u0000"+
-        "\u0000\u0000\uF3BE\u0000\u0000\uE4AC\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF8C9\u0000"+
-        "\uEACF\u0000\u0000\uE4C0\uECD7\u0000\uF2E6\uF960"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEFC0"+
-        "\u0000\u0000\u0000\uF5D3\u0000\u0000\uF16C\uF6B7"+
-        "\u0000\u0000\uF048\uE3F9\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE958\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF049\u0000\u0000\u0000\u0000\u0000\uF3DE\u0000"+
-        "\u0000\u0000\u0000\u0000\uE6B6\uE2B5\u0000\uE7A8"+
-        "\u0000\u0000\uF17E\u0000\u0000\uE9AA\u0000\u0000"+
-        "\u0000\u0000\uE1A2\uEF3E\u0000\u0000\u0000\uEBBD"+
-        "\u0000\uF461\u0000\u0000\u0000\u0000\uEFC1\u0000"+
-        "\u0000\u0000\uE49E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE8B5\u0000\uF4E7\uE7A0\u0000\u0000"+
-        "\u0000\uF961\u0000\uF1B2\uF53F\u0000\uF8A3\u0000"+
-        "\u0000\uF951\u0000\uF23B\uE535\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF594"+
-        "\u0000\u0000\u0000\u0000\uF269\u0000\u0000\u0000"+
-        "\uF8CA\u0000\u0000\u0000\u0000\u0000\uE1E3\uE74B"+
-        "\u0000\uEDDB\uF799\u0000\u0000\u0000\uF664\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6A9"+
-        "\u0000\uE0C9\u0000\u0000\uEE61\uF35C\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE73E\u0000\uF7D3\uE5FE\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE74C\uF440\u0000\u0000\u0000"+
-        "\u0000\uEC3B\uF4E8\u0000\u0000\u0000\u0000\u0000"+
-        "\uF2C2\u0000\u0000\u0000\u0000\u0000\u0000\uF1EC"+
-        "\u0000\uEEB8\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE8A0\u0000\u0000\uE14E\u0000\u0000\uF49E"+
-        "\uE87B\u0000\uEC68\uF1D6\u0000\u0000\uE661\uEB43"+
-        "\u0000\u0000\uF962\u0000\uF0C8\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE4C1\uF35D\u0000"+
-        "\uE2F7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF1D2\u0000\uE568\uE959\uE6F1\u0000"+
-        "\u0000\uEABB\u0000\u0000\uF4A5\u0000\u0000\u0000"+
-        "\uF55D\u0000\u0000\u0000\u0000\uF3BF\uF741\u0000"+
-        "\uEFFA\u0000\u0000\u0000\uF8CB\u0000\u0000\uE065"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF7D4\uF6CA\u0000\u0000\uE658"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF978\uF4BD"+
-        "\u0000\uF2A0\u0000\uEEFE\u0000\u0000\u0000\u0000"+
-        "\u0000\uE4C2\u0000\u0000\u0000\u0000\uE4B6\u0000"+
-        "\uE13D\uF69C\uE642\uE468\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEED8\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uECA5\u0000\u0000"+
-        "\u0000\u0000\uEEB9\u0000\u0000\u0000\u0000\uF33D"+
-        "\uF8CC\uF0A1\u0000\u0000\uE536\u0000\u0000\u0000"+
-        "\u0000\uF8CD\u0000\uE5BD\uF3DF\u0000\u0000\uF69D"+
-        "\u0000\uEA44\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE5EB\u0000"+
-        "\u0000\uEDC8\u0000\u0000\u0000\uF8A4\uE549\u0000"+
-        "\u0000\uEA71\u0000\uED33\u0000\u0000\u0000\uE6B7"+
-        "\u0000\uF77E\u0000\u0000\u0000\uEA45\u0000\u0000"+
-        "\uE662\u0000\uF7D5\uEEBA\uF0D5\uE5F7\uF2E7\uEBBE"+
-        "\u0000\u0000\u0000\uF83E\u0000\u0000\u0000\uE679"+
-        "\uE67E\u0000\u0000\u0000\u0000\u0000\u0000\uEEBB"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF15B"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE5B3\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE244\u0000\u0000\u0000"+
-        "\uF8A5\uEBEE\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF6A8\u0000\u0000\u0000\u0000\uF8CE\u0000\u0000"+
-        "\u0000\u0000\u0000\uE74D\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF8FD\u0000\u0000\u0000\u0000"+
-        "\uF979\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE2B6\u0000\u0000\u0000\uF1C7\uF23C\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE16D\u0000\u0000"+
-        "\u0000\u0000\uF637\u0000\u0000\u0000\uEE9C\u0000"+
-        "\u0000\u0000\uF5A4\u0000\u0000\u0000\u0000\u0000"+
-        "\uF9DC\uF1B3\uE259\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF2E8\u0000\u0000\uEBBF\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF86B\uE0E3\uF6A9\u0000\uF8A6"+
-        "\u0000\u0000\u0000\uE949\u0000\u0000\u0000\uF3C0"+
-        "\uF1C8\uF2C3\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE63D\u0000\u0000\uF9CE\u0000\u0000\u0000\uEF31"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF8F4\uE5A7\u0000\u0000\u0000\uF3F6\u0000\uEE63"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE16E\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF742\u0000\u0000\u0000\uE97B\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF9B6\u0000\u0000\u0000"+
-        "\u0000\uEDEA\u0000\u0000\uF3E0\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE8CC\uE9CD\u0000\u0000\u0000\uE558\u0000"+
-        "\u0000\uE7ED\u0000\u0000\u0000\u0000\uF5A5\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEE9D\u0000\u0000\u0000\u0000\u0000\uEE64\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9C8"+
-        "\u0000\uE631\uF9BF\u0000\uF963\u0000\uF2A1\u0000"+
-        "\uEEBC\u0000\u0000\u0000\u0000\u0000\uE3EE\u0000"+
-        "\u0000\uEE65\u0000\u0000\uEFF2\u0000\uEAB0\u0000"+
-        "\u0000\u0000\u0000\u0000\uE770\uF94A\uF9AF\uF35E"+
-        "\u0000\uE8E1\u0000\u0000\uEDC9\u0000\uF1B4\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEB53\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uECD8\u0000\u0000\u0000"+
-        "\u0000\uEFFB\uF038\u0000\u0000\u0000\u0000\uF9B7"+
-        "\u0000\u0000\uF8A7\u0000\uEFC2\u0000\u0000\u0000"+
-        "\u0000\uF9F7\u0000\u0000\u0000\u0000\u0000\uEC69"+
-        "\u0000\u0000\uE97C\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEF32\u0000\u0000\u0000"+
-        "\u0000\uEE92\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF9F8\uF9F9\u0000\u0000\u0000\uF64F\u0000"+
-        "\u0000\uEEA7\u0000\uEE67\u0000\u0000\u0000\u0000"+
-        "\uE595\uE559\u0000\u0000\u0000\u0000\uE69C\u0000"+
-        "\uE6F2\u0000\uEBC0\u0000\uE8E2\uEE68\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEEBD"+
-        "\u0000\u0000\u0000\u0000\u0000\uF35F\uF4BE\uEC3C"+
-        "\u0000\u0000\u0000\u0000\u0000\uF5B7\uEB92\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF9B8\uECE8\u0000\uE537\uEF9E"+
-        "\uF862\u0000\u0000\u0000\u0000\u0000\uF791\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE663\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE5B4\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF360\u0000\uF6F0\uF243\u0000\u0000"+
-        "\uF04A\u0000\uF063\u0000\u0000\uF1C9\uE9AB\u0000"+
-        "\u0000\u0000\uEDAC\uF9A1\u0000\uEAD0\uF143\u0000"+
-        "\uEAD1\u0000\u0000\u0000\u0000\u0000\uF1ED\uF748"+
-        "\uF6FA\u0000\u0000\u0000\uF73B\u0000\u0000\u0000"+
-        "\u0000\u0000\uF570\u0000\u0000\u0000\u0000\u0000"+
-        "\uE54A\uED43\u0000\uEFDA\u0000\uEA46\u0000\uE7BF"+
-        "\u0000\uE7C0\uE691\u0000\u0000\u0000\u0000\uE7CC"+
-        "\u0000\uE83A\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEAE5\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF6E5\u0000\u0000\u0000\uE142\u0000\u0000"+
-        "\uEAF9\uE6E0\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE54B\u0000\u0000\u0000\u0000\uF9FA"+
-        "\u0000\u0000\u0000\u0000\uE143\u0000\u0000\uE8F3"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEAD2\u0000\uE25A\u0000\uF26A\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uED74\u0000"+
-        "\uF8CF\u0000\u0000\u0000\u0000\u0000\u0000\uE2B7"+
-        "\u0000\uF253\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE27A\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEC3D\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE6E1\uF897\u0000\u0000\uE5C9\uF73C\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEED9\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF4E9\u0000"+
-        "\u0000\u0000\u0000\uE77D\uECC4\uF393\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEF75\u0000\u0000"+
-        "\u0000\uEB9C\uF254\uE7DE\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF0A2\uF0A3"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF952\uF04B"+
-        "\u0000\u0000\u0000\u0000\uEF3B\uEA72\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF1EF\u0000\uEF33\u0000\u0000\u0000\u0000\uE2F1"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE54C\u0000\uF97A\u0000\u0000\u0000\u0000\u0000"+
-        "\uEEBE\u0000\uF994\u0000\u0000\uE644\u0000\u0000"+
-        "\uEC3E\u0000\uE4B7\uF85C\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF86C\u0000\uF1B5\uEBE3"+
-        "\u0000\uEF3C\u0000\uEF6D\u0000\u0000\uF2E9\u0000"+
-        "\u0000\u0000\u0000\u0000\uF54D\u0000\uE2B8\uEFDB"+
-        "\uE3AC\u0000\u0000\u0000\u0000\u0000\u0000\uE857"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF0C9"+
-        "\u0000\uEF5C\u0000\u0000\u0000\uEA47\u0000\u0000"+
-        "\u0000\u0000\uE64C\uE4E5\u0000\u0000\u0000\u0000"+
-        "\u0000\uF86D\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE866\u0000\uE041\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE858\uEAA6\u0000\uF7B3\uF462\u0000\uE054"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE25B\u0000"+
-        "\u0000\uE1F5\u0000\u0000\u0000\uF9B0\uE5A8\u0000"+
-        "\uF3C1\u0000\u0000\uEC79\uE95A\uF144\uF850\u0000"+
-        "\u0000\uF8A8\uE338\u0000\u0000\uE87C\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7EE"+
-        "\u0000\uEB9D\u0000\u0000\u0000\uF2EA\uF86E\u0000"+
-        "\u0000\uEB54\u0000\uE2B9\u0000\uE5CA\uE6E2\uEC3F"+
-        "\u0000\uE6B8\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEF5D\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF66A\u0000\u0000\u0000\u0000"+
-        "\uF2A2\uEC6A\uF69E\u0000\u0000\uF8D0\uE3AD\u0000"+
-        "\uE1E4\u0000\uE3AE\uE97D\uEF5E\u0000\uF39B\uE245"+
-        "\uEE9E\u0000\u0000\uE6FB\uE366\uE9F5\uF6F1\u0000"+
-        "\uF69F\u0000\uE8F7\u0000\u0000\u0000\u0000\uF8EA"+
-        "\uEFDC\uE7C1\u0000\uF5F2\uEB55\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF064\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF7C2\u0000\uF04C"+
-        "\u0000\uE455\uF8D1\uEEC0\uF0A5\u0000\uEAFA\uECA2"+
-        "\uE6B9\u0000\uEFC3\u0000\uEF9F\uEF3F\u0000\u0000"+
-        "\uF463\uF8A9\uE735\u0000\u0000\u0000\u0000\uE5CB"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE358\u0000"+
-        "\u0000\u0000\uE3AF\uE6E3\u0000\u0000\u0000\uEB56"+
-        "\u0000\uE632\u0000\uF1F0\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE6F3\u0000\u0000\u0000\uF964\u0000\uE867\uE16F"+
-        "\u0000\uF464\u0000\uE3B0\u0000\uE170\u0000\uE8FD"+
-        "\uF4BF\u0000\uF361\u0000\u0000\u0000\u0000\u0000"+
-        "\uF94B\u0000\uEC40\u0000\u0000\uEE35\u0000\u0000"+
-        "\u0000\uEC6B\u0000\u0000\u0000\uEADE\u0000\uEB57"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF491\u0000"+
-        "\u0000\u0000\uE171\u0000\u0000\u0000\u0000\uE67A"+
-        "\u0000\u0000\u0000\u0000\uEEC2\u0000\u0000\u0000"+
-        "\uE246\u0000\uF4C0\u0000\uE1FE\u0000\u0000\u0000"+
-        "\uF8D2\u0000\uF79A\uF6FB\u0000\u0000\uEF4F\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEF47\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF1B6"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE94A\u0000\u0000\uE144\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF3F7\u0000\u0000\u0000\uEF48\u0000\u0000"+
-        "\uE098\u0000\uED34\uF566\u0000\u0000\u0000\uEAE6"+
-        "\u0000\u0000\u0000\uEAA7\u0000\uEAE7\uEBC1\u0000"+
-        "\uEFC4\u0000\u0000\uE95B\uEFC5\u0000\u0000\u0000"+
-        "\uF2A3\uF0A6\uE0A3\uECE9\u0000\u0000\u0000\uE3FB"+
-        "\uF2A4\u0000\uF2EB\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE344"+
-        "\u0000\u0000\u0000\u0000\uE1A3\u0000\u0000\uEF76"+
-        "\u0000\uF2A5\u0000\uE4CC\uE87D\u0000\u0000\u0000"+
-        "\u0000\uE6BA\u0000\uF465\uF5E5\uE7EF\u0000\u0000"+
-        "\u0000\u0000\uF7B4\u0000\u0000\uE5D4\uF9CF\u0000"+
-        "\u0000\u0000\uE8E3\u0000\u0000\u0000\u0000\uF3E1"+
-        "\uF146\u0000\u0000\u0000\u0000\uF8FE\uE4D7\u0000"+
-        "\uE3B1\u0000\uE0B1\u0000\u0000\u0000\u0000\uE3B2"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE0B2\uF3C2"+
-        "\u0000\u0000\uF571\uF7B5\u0000\u0000\uEBC3\uEBC2"+
-        "\u0000\uF0F7\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEAA8\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE0CA\u0000\u0000"+
-        "\u0000\u0000\u0000\uEE49\u0000\u0000\u0000\u0000"+
-        "\u0000\uF76E\uF7AA\uE099\u0000\uF1B7\u0000\u0000"+
-        "\uE4B8\uF466\u0000\u0000\uE569\uF255\uF492\u0000"+
-        "\u0000\u0000\uE042\u0000\u0000\uE94B\u0000\uF3F8"+
-        "\u0000\u0000\u0000\u0000\u0000\uF147\u0000\u0000"+
-        "\u0000\u0000\uEDCA\u0000\uF650\uF9DD\u0000\u0000"+
-        "\uE573\uE172\u0000\uF6D4\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE6E5\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE4C3\u0000\uE736\u0000\uF651\u0000\u0000\u0000"+
-        "\u0000\u0000\uE9F6\u0000\uE1C0\u0000\u0000\u0000"+
-        "\uEDDC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEDCB\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEBC4\u0000\u0000\u0000\u0000\u0000\uEF40"+
-        "\uF540\uF4EA\uE87E\u0000\uE6BB\u0000\uEC41\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE6AA\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE69D\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uED6F\u0000\uE066\u0000"+
-        "\u0000\u0000\uF0A8\u0000\u0000\u0000\uE8FE\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF652\u0000\u0000\uF2BB\u0000\u0000\u0000"+
-        "\u0000\uE59F\u0000\u0000\uEB58\u0000\u0000\u0000"+
-        "\uEF49\u0000\uF2A6\u0000\u0000\u0000\u0000\u0000"+
-        "\uE1A4\u0000\u0000\uE596\uE8A1\uE8DC\uE8DD\u0000"+
-        "\u0000\u0000\u0000\u0000\uF26C\u0000\uE0CB\uF965"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE27B\u0000"+
-        "\uE1C1\u0000\u0000\uF8D3\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF7AB\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF5D4\u0000\u0000\u0000\u0000\uE7A9"+
-        "\u0000\u0000\uEFDD\uE8CD\u0000\u0000\uE9CE\u0000"+
-        "\uEEC3\u0000\uF15C\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF7EC\u0000\u0000\u0000\uE0CC\u0000"+
-        "\u0000\u0000\u0000\uEB9E\uE538\u0000\uF1D3\uE791"+
-        "\u0000\uF467\u0000\uE09A\uE891\u0000\u0000\uE664"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE7CD\u0000"+
-        "\u0000\u0000\uE77E\u0000\uF451\u0000\u0000\u0000"+
-        "\uEAD3\u0000\u0000\u0000\uE892\u0000\uEC7A\u0000"+
-        "\u0000\uEB9F\u0000\u0000\uE79A\u0000\u0000\u0000"+
-        "\uF6AF\uE846\u0000\uE067\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF468\u0000"+
-        "\uE79B\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF86F\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2EF"+
-        "\uE7C2\u0000\uF362\u0000\uED61\u0000\u0000\u0000"+
-        "\uF4B7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF870\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF2EC\u0000\u0000\u0000\u0000"+
-        "\u0000\uEC42\u0000\uE54D\u0000\u0000\uE7CE\u0000"+
-        "\u0000\u0000\u0000\uF572\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE539\u0000\u0000\u0000\u0000\uE1C2\uEEDA"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF469\u0000\u0000\u0000\u0000"+
-        "\u0000\uE7AA\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE74E\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE93D\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEC7B\uE69E\u0000\u0000"+
-        "\uE09B\u0000\u0000\uE56A\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF567\uE131\u0000\u0000\uE2BA"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF5B8"+
-        "\u0000\u0000\u0000\uE7C3\uE378\u0000\u0000\u0000"+
-        "\u0000\u0000\uECC5\uF0F8\u0000\uF441\u0000\u0000"+
-        "\u0000\uE2BB\u0000\u0000\u0000\uE4AD\uEF71\uE27C"+
-        "\u0000\u0000\u0000\uEB44\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEA73\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE9F7\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF442\uF4F6\uF66B"+
-        "\u0000\u0000\u0000\u0000\uE6FE\u0000\u0000\u0000"+
-        "\u0000\u0000\uF76F\u0000\uF6F2\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE339\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE6A"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF5A6\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE6BC\uE173\u0000\u0000\uEE6B"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE9DD\u0000\u0000\u0000"+
-        "\u0000\uE3B3\u0000\u0000\u0000\u0000\u0000\uF2ED"+
-        "\u0000\u0000\u0000\u0000\uE66E\uED96\uEBEF\u0000"+
-        "\u0000\uE9F8\u0000\u0000\u0000\u0000\u0000\uEF5F"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE075\u0000\u0000\u0000\uE931"+
-        "\u0000\uEB45\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF93C\uF93D\uE737\u0000\u0000\u0000"+
-        "\u0000\uF1B8\u0000\u0000\u0000\uE8B6\u0000\u0000"+
-        "\u0000\u0000\uE692\uF4AF\u0000\u0000\uE1A5\u0000"+
-        "\uE893\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE738\u0000\u0000\u0000\uE174\u0000\u0000\uE3B4"+
-        "\u0000\u0000\u0000\u0000\u0000\uE068\u0000\u0000"+
-        "\u0000\u0000\u0000\uE894\u0000\u0000\u0000\u0000"+
-        "\u0000\uF5A7\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF5A8\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEE36\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE5EC\uE5F8\uE895\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uECC6\u0000\u0000\u0000\uEA74\u0000"+
-        "\uEA75\uE3B5\u0000\u0000\u0000\u0000\u0000\uE3B6"+
-        "\uE3B7\uF443\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEFDE\u0000\u0000\u0000\u0000\u0000\uF363\uF444"+
-        "\u0000\u0000\uF364\uE0E4\uF8D4\uF5E6\uECEA\u0000"+
-        "\uEA76\u0000\u0000\u0000\u0000\uEAD4\u0000\u0000"+
-        "\uF79B\u0000\u0000\u0000\u0000\uF33E\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE3B8\u0000\u0000\u0000\u0000\uE66F"+
-        "\u0000\uE367\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF931\uF2EE\uE968"+
-        "\u0000\uEFDF\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEDDD\uF9FB"+
-        "\u0000\u0000\uEB59\u0000\u0000\u0000\uE659\u0000"+
-        "\u0000\uE53A\u0000\uEDCC\u0000\u0000\u0000\u0000"+
-        "\u0000\uEFE0\u0000\u0000\u0000\uE368\uF932\uE54E"+
-        "\uEC43\uEA77\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE94C\uE446\uF5D5\u0000\u0000\u0000\u0000"+
-        "\u0000\uE231\uF5A9\u0000\u0000\uE9F9\u0000\u0000"+
-        "\uE9FA\u0000\u0000\u0000\u0000\u0000\u0000\uF365"+
-        "\u0000\u0000\u0000\u0000\uF66F\u0000\uF46A\uED7B"+
-        "\u0000\uF493\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF149\u0000\u0000\u0000\u0000"+
-        "\uF9FC\u0000\u0000\u0000\u0000\uEBAA\u0000\u0000"+
-        "\uE069\u0000\u0000\uF2EF\u0000\uF5AA\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF19B\u0000\u0000\uF73D"+
-        "\u0000\uF452\uF653\u0000\uE6D2\u0000\u0000\uF7A2"+
-        "\uF366\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF39C\u0000"+
-        "\u0000\uF670\u0000\u0000\u0000\u0000\uEFF3\uF453"+
-        "\u0000\u0000\u0000\uE53B\uE043\uE1A6\u0000\uE1C3"+
-        "\uE1DA\u0000\u0000\u0000\u0000\u0000\uE7CF\u0000"+
-        "\u0000\uF654\u0000\u0000\u0000\uF26D\uEEC4\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC44"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEAE2\uEEDB\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEF41\u0000\uF93E\u0000\u0000\u0000\u0000"+
-        "\uEDCD\u0000\u0000\u0000\uF87B\u0000\uE2BC\u0000"+
-        "\u0000\uE2E2\uE1F6\u0000\u0000\uF2F0\u0000\uF54E"+
-        "\u0000\uE55D\u0000\u0000\uF4B8\u0000\u0000\u0000"+
-        "\uEFA1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF494\uF4EB\u0000\uF367\u0000\u0000"+
-        "\uE2D7\u0000\u0000\u0000\u0000\u0000\u0000\uE2DF"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEF50\uEF51\u0000\u0000\u0000\uE2E3\uEFA2"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE33A\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF4C1\uE33B\u0000\uE574"+
-        "\u0000\u0000\uF2BC\uE731\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7DF"+
-        "\u0000\uF4D7\u0000\u0000\u0000\uE94D\u0000\uE175"+
-        "\uF1F1\u0000\u0000\uF3E2\u0000\uE56B\u0000\u0000"+
-        "\u0000\u0000\uEC45\u0000\u0000\uE076\u0000\uE4AE"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE176\u0000"+
-        "\u0000\uF3D3\uF5E7\u0000\u0000\u0000\u0000\uE06A"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF8EE"+
-        "\u0000\uEBC5\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEAE9\u0000\uF26E\u0000\u0000\uF6C2\u0000"+
-        "\uE732\u0000\u0000\u0000\u0000\u0000\uE9AC\u0000"+
-        "\u0000\u0000\u0000\u0000\uF33F\uE64D\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEBAB\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF7B6\u0000"+
-        "\u0000\uE597\u0000\uE359\uF2A7\uEC7C\u0000\uE8EA"+
-        "\uE25C\uF5E8\uF6D5\u0000\uE4CD\u0000\uF4FE\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE345\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEBA0\u0000\uEAFB\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEE6D\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEF34\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE0CD"+
-        "\u0000\u0000\u0000\uF2A8\u0000\u0000\u0000\uF244"+
-        "\u0000\u0000\u0000\u0000\uE868\uE3B9\u0000\uEAA9"+
-        "\u0000\u0000\uF4B0\u0000\u0000\uE154\u0000\u0000"+
-        "\u0000\uE247\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF2A9\u0000\u0000"+
-        "\u0000\uEAD5\u0000\u0000\uF1D7\u0000\u0000\u0000"+
-        "\uF256\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF2BD\uF966\u0000\u0000\uE8F4\u0000\uF2AA\uF749"+
-        "\u0000\uF5E9\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uECD9\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEBC6\u0000\u0000\u0000\uE54F\u0000\u0000\u0000"+
-        "\u0000\uEA78\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF37A"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF4C2\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE4AF\u0000"+
-        "\u0000\uE06B\u0000\u0000\u0000\u0000\u0000\uF967"+
-        "\u0000\u0000\uF1D8\uEBC7\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF568\uE643\uE9AD"+
-        "\u0000\u0000\u0000\uE5BE\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF3C3\uF26F\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE67B\u0000\u0000\u0000\uF569\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE6E6\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE847\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE9FB\u0000\u0000\u0000\u0000"+
-        "\u0000\uE9CF\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE733\u0000\u0000\uE869\u0000\uF368"+
-        "\uF2C4\u0000\u0000\u0000\u0000\u0000\u0000\uEBD8"+
-        "\u0000\u0000\u0000\u0000\u0000\uF3D4\u0000\uF1F2"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE5DB\u0000"+
-        "\u0000\uE5DC\uF4C4\uE0D7\u0000\u0000\u0000\u0000"+
-        "\u0000\uEC46\u0000\u0000\u0000\u0000\uF2F1\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF8D5\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE4D8\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE9D0\uF369"+
-        "\uE0B3\u0000\u0000\u0000\u0000\u0000\u0000\uE5DD"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE1A7\u0000\u0000\uE33C\u0000";
-
-    private final static String innerIndex4=
-        "\uE3BA\u0000\uF3C4\u0000\uEDB3\uF8F5\uEFE1\uF9E0"+
-        "\uF94C\u0000\uE832\uE833\u0000\uE431\u0000\u0000"+
-        "\uE491\u0000\u0000\u0000\uEC7D\u0000\u0000\uEA79"+
-        "\uE26C\uF445\uE374\uE9D1\u0000\u0000\u0000\u0000"+
-        "\uEBC8\uE8B7\uEAE3\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF1B9\uF3C5\u0000\uF4CF\uE6AB"+
-        "\uEBAC\u0000\u0000\uECEB\u0000\uF257\u0000\u0000"+
-        "\u0000\uEBC9\uE09C\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF39D\uF871\uF36A\uE177\uE896\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE14F\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE27D\u0000"+
-        "\u0000\uE5A9\uF872\u0000\u0000\u0000\uE375\u0000"+
-        "\uF0D6\u0000\uF16F\u0000\u0000\u0000\uEAFC\u0000"+
-        "\u0000\uF6D6\uEA7A\uE0B4\u0000\u0000\uF2BE\u0000"+
-        "\u0000\uE145\u0000\u0000\u0000\u0000\u0000\uE2BD"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF2F2\uEC47"+
-        "\u0000\u0000\u0000\uE178\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF39E\u0000\u0000\u0000"+
-        "\uE670\u0000\uF3C6\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEC48\uF0AB\u0000\u0000"+
-        "\u0000\uE0B5\uE761\u0000\uF55E\uF4F7\u0000\u0000"+
-        "\uE6C6\u0000\uE3BB\uF6AA\u0000\uF1CA\uE6D3\uE79C"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF655"+
-        "\u0000\u0000\uE3CC\uE9FC\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEAFD\u0000"+
-        "\uF7E5\u0000\uEB5A\u0000\u0000\uF49F\uE4B0\u0000"+
-        "\uF595\uE859\u0000\uEE6E\u0000\u0000\u0000\u0000"+
-        "\uF74A\uEF60\u0000\u0000\uE79D\u0000\u0000\uF065"+
-        "\u0000\u0000\u0000\u0000\uE633\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF656\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF46B\uED9E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEF42\u0000\u0000"+
-        "\u0000\u0000\u0000\uE86A\u0000\uF46C\uF8D6\uEFB2"+
-        "\u0000\uF23D\u0000\uF873\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE97E\u0000\u0000\uF5EA\uEE70"+
-        "\u0000\uF39F\u0000\u0000\u0000\u0000\u0000\uE6AC"+
-        "\u0000\u0000\u0000\u0000\u0000\uF5C5\uF270\u0000"+
-        "\u0000\uE8E5\u0000\uE9DE\u0000\u0000\uE7F0\uEFA3"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF3F9\u0000\uF454\uEB5B\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEFA4\u0000"+
-        "\u0000\uEC49\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uECB1\uF97B\uE1A8\u0000\uE146\u0000\u0000"+
-        "\uF36B\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEE4A\u0000\u0000\uE1A9\u0000\u0000\u0000"+
-        "\u0000\u0000\uF4C3\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEBD9\u0000\u0000\uF2AB"+
-        "\u0000\u0000\u0000\uEEC5\u0000\u0000\uEB79\u0000"+
-        "\uF4C5\u0000\u0000\uE550\uE5BF\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE9AE\u0000"+
-        "\uF7FC\u0000\uE150\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEDA2\u0000\u0000\u0000"+
-        "\uE248\u0000\u0000\u0000\uE762\uF7D6\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF3AA\uE261\u0000\u0000\uF657\u0000"+
-        "\uE8EB\u0000\uEAFE\u0000\u0000\uE771\u0000\uF6F3"+
-        "\u0000\uE6E7\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE5A0\u0000\u0000"+
-        "\uE3BC\u0000\uEDCF\u0000\uE0B6\u0000\uE848\u0000"+
-        "\u0000\u0000\u0000\u0000\uE1C4\u0000\u0000\u0000"+
-        "\u0000\u0000\uE64E\u0000\u0000\u0000\uEC4A\u0000"+
-        "\u0000\u0000\u0000\u0000\uE2D8\u0000\u0000\u0000"+
-        "\uEB5C\uF0F9\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF9FD\u0000\u0000\u0000\u0000\u0000"+
-        "\uE6E8\uE0D8\u0000\u0000\u0000\uEFE2\u0000\u0000"+
-        "\u0000\uEF4A\u0000\u0000\u0000\uECC7\u0000\u0000"+
-        "\u0000\u0000\uF15D\u0000\uF15E\u0000\uE64F\u0000"+
-        "\u0000\u0000\uECA7\u0000\uEAD6\uF9E8\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF271"+
-        "\uF638\uE9FD\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF74B\u0000\uEF61\u0000\u0000\u0000\u0000"+
-        "\uF7D7\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE27E\u0000\u0000\uF15F\u0000\u0000\u0000"+
-        "\uEFA5\uE665\u0000\uE1C5\u0000\uF1BA\uE3BD\u0000"+
-        "\u0000\uE2BE\u0000\u0000\uF14B\u0000\u0000\u0000"+
-        "\uE441\u0000\u0000\u0000\u0000\uE179\u0000\uE7C4"+
-        "\uEFFC\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE3BE\u0000\u0000"+
-        "\u0000\u0000\u0000\uF14C\u0000\u0000\uEDAD\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF6B0\u0000\uE17A"+
-        "\u0000\u0000\u0000\uE4C4\u0000\u0000\uE650\u0000"+
-        "\u0000\u0000\uE69F\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEBA1\u0000"+
-        "\uEA4D\u0000\uF639\u0000\u0000\u0000\uE834\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE634"+
-        "\uF5C6\u0000\uEBA2\uEFC6\u0000\u0000\u0000\uF455"+
-        "\u0000\u0000\u0000\u0000\u0000\uF579\uE67C\uF0D3"+
-        "\u0000\u0000\u0000\u0000\uF14D\uEC6C\uEA7B\uF36C"+
-        "\u0000\uF0BF\u0000\uE6CE\uE3BF\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF5AB\u0000"+
-        "\u0000\u0000\u0000\uF7FD\u0000\uE06C\u0000\u0000"+
-        "\u0000\uE1C6\uF446\u0000\u0000\uE9FE\u0000\u0000"+
-        "\u0000\uE147\uE8B8\u0000\u0000\u0000\u0000\uE379"+
-        "\u0000\uE26D\uF0C0\u0000\uF9A2\u0000\u0000\u0000"+
-        "\u0000\u0000\uF75B\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF066\uF3B0\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE8CE\u0000\uF6C3\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE8CF\uE0A4\u0000\u0000\uF770\u0000"+
-        "\u0000\uF8D7\u0000\u0000\uF0CA\uEB31\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE25D\u0000\u0000\uE56C\u0000\u0000\u0000"+
-        "\uF9D8\u0000\u0000\u0000\u0000\uE498\u0000\u0000"+
-        "\u0000\u0000\uF447\u0000\u0000\uF898\uF63A\uF899"+
-        "\uE776\u0000\uF541\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEF62\u0000\uE055\uE17B\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEC7E\u0000\u0000\u0000\u0000"+
-        "\u0000\uEC4B\u0000\uF6AD\u0000\u0000\u0000\uF771"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF4EC\u0000\u0000\u0000\u0000\uEA31\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uED9F\u0000\u0000\uECEC\u0000"+
-        "\uE9AF\uE9B0\u0000\u0000\uE0B7\uEF63\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEBA3\uE470\u0000"+
-        "\u0000\u0000\u0000\uF3A0\u0000\u0000\u0000\u0000"+
-        "\uEFA6\uE0F2\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF1F3\uE969\uEB5D\u0000\u0000\u0000\u0000\uF6DA"+
-        "\uE8B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE13E\u0000\uE86B\u0000\u0000\u0000\u0000\uE1C7"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE9B1\u0000\uE73F\uECA3\u0000\u0000"+
-        "\uE291\u0000\u0000\uF495\u0000\u0000\u0000\u0000"+
-        "\uF743\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEB5E\u0000\uF5FD\u0000\u0000"+
-        "\u0000\u0000\uF0EC\u0000\u0000\uE4C5\uF97C\uE46B"+
-        "\uE57B\u0000\uEA32\u0000\u0000\u0000\uEDE6\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF340\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE5C4\u0000\u0000\u0000\u0000\u0000\u0000\uF1F4"+
-        "\u0000\u0000\u0000\uECED\u0000\uEF52\u0000\uF1F5"+
-        "\uE6FC\u0000\uF1BB\u0000\u0000\uF63B\u0000\u0000"+
-        "\u0000\u0000\u0000\uF448\uF658\u0000\u0000\u0000"+
-        "\u0000\u0000\uE4E6\uF46D\uE2BF\u0000\uF0AC\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE2C0\u0000\uEE38"+
-        "\uF9E9\u0000\uE2C1\u0000\uEB6F\uEA7C\u0000\u0000"+
-        "\u0000\u0000\uEB32\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF54F\uEC91\u0000\uE7F1\uF3C7"+
-        "\u0000\uE0B8\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF7FE\uE8BA\uE897\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF67C\uE86C\uF874"+
-        "\u0000\uEB5F\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE9B2\u0000\u0000\u0000\u0000\uEE39\u0000\uF2F3"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF4ED\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF0FA\u0000\uF7E6\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE06D\uE5DE"+
-        "\u0000\uE06E\uEAE4\u0000\u0000\u0000\uEE9F\u0000"+
-        "\uF5AC\u0000\u0000\u0000\u0000\u0000\uED97\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEFE3\u0000\uF1CB\uE2E4\u0000"+
-        "\u0000\u0000\uE763\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE9B3\uE57C\u0000\u0000\uF449\u0000\uEAB7"+
-        "\u0000\u0000\u0000\u0000\u0000\uE0CE\uF8D8\u0000"+
-        "\u0000\uE369\u0000\u0000\uE9D2\uF6F4\uEEDC\uED35"+
-        "\u0000\uF933\u0000\uE8BB\u0000\u0000\u0000\uF44A"+
-        "\uEFFD\uE35A\u0000\uF5D6\uE7C5\uED44\u0000\uF1A7"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF04D\uEEA0\u0000\uF6C4\uF5AD\u0000\uE7E0"+
-        "\u0000\u0000\u0000\uE044\u0000\u0000\uF772\uE2C2"+
-        "\u0000\uF14E\u0000\u0000\u0000\uEDB4\uE1C8\uF258"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEEC8\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE1C9\uF7B7\u0000"+
-        "\u0000\uF3E8\uE7F2\uE8F5\uE045\uE7C6\u0000\u0000"+
-        "\u0000\uE759\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7AB"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF1BC\u0000\u0000\uE764\u0000\u0000\u0000\uE96A"+
-        "\u0000\uEC4C\u0000\u0000\uF97D\uF170\uE4A0\u0000"+
-        "\uEFC7\uEE3A\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEC92\u0000\u0000\u0000\u0000\u0000\u0000\uF84B"+
-        "\u0000\uF5AE\uF8AA\u0000\u0000\u0000\u0000\uF19D"+
-        "\u0000\uF14F\uF968\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE575\u0000\u0000\u0000\uF7C3"+
-        "\u0000\u0000\u0000\uF272\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE6E9\uF1F6\u0000\u0000\u0000\uEA7D\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE17C\u0000"+
-        "\uECEE\u0000\u0000\u0000\u0000\u0000\uEF64\u0000"+
-        "\u0000\u0000\uF89A\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE9B4\uED45\uE740\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE765\u0000\u0000"+
-        "\u0000\uF57A\u0000\u0000\u0000\uE249\u0000\u0000"+
-        "\u0000\uE671\uE2D2\u0000\uE346\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE232\u0000\u0000\uF4EE\u0000"+
-        "\u0000\u0000\u0000\u0000\uF4F8\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE95C\u0000\uE35B\u0000\u0000\u0000\uF934"+
-        "\uE1CA\uE6D4\uEA33\u0000\uED70\u0000\u0000\u0000"+
-        "\u0000\uF259\u0000\u0000\u0000\uEC6D\u0000\u0000"+
-        "\u0000\u0000\u0000\uF5FE\uE53C\u0000\u0000\u0000"+
-        "\u0000\u0000\uE5D1\u0000\uE792\uF753\uF067\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF5D7\u0000\u0000\uE74F\u0000\u0000\u0000"+
-        "\u0000\uF9C0\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF0AD\u0000\u0000\u0000\u0000\uE5AA\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEEA8\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF25A"+
-        "\u0000\u0000\u0000\uE077\u0000\u0000\u0000\u0000"+
-        "\u0000\uF773\u0000\uE56D\u0000\u0000\uF068\u0000"+
-        "\u0000\u0000\u0000\uF8D9\uF1F7\u0000\u0000\uEDB5"+
-        "\u0000\u0000\u0000\u0000\u0000\uE33D\u0000\u0000"+
-        "\u0000\u0000\uF3F1\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEC4D\u0000\u0000\u0000\uECC8\u0000\u0000\u0000"+
-        "\u0000\uE7D5\u0000\u0000\uEAAA\u0000\u0000\u0000"+
-        "\u0000\uE8BC\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF774\u0000\u0000\u0000\u0000\u0000"+
-        "\uF3FA\u0000\u0000\uEDB6\uF4EF\u0000\u0000\uF8DA"+
-        "\uEBE0\u0000\uE7AC\u0000\uF5EB\u0000\uEB46\u0000"+
-        "\u0000\uEFC8\u0000\uE0CF\u0000\uECC9\u0000\u0000"+
-        "\u0000\uEA7E\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEC4E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE991\u0000\uE635\u0000"+
-        "\u0000\u0000\u0000\u0000\uEC93\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE6A0\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE7A1\u0000\uE750\uE96B\u0000\u0000\uF1BD"+
-        "\uEAB8\u0000\uF035\u0000\u0000\u0000\uE6AD\u0000"+
-        "\u0000\uF4F9\u0000\uF1F8\u0000\uF5C7\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEBCA\uF0E3\u0000\uF46E"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF75C\u0000\uF069"+
-        "\u0000\uE4C6\u0000\uE8E6\u0000\u0000\u0000\u0000"+
-        "\u0000\uF5AF\u0000\u0000\u0000\u0000\uE292\u0000"+
-        "\u0000\u0000\u0000\uEFFE\u0000\u0000\u0000\u0000"+
-        "\u0000\uF8B6\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEC94\u0000\u0000\u0000\u0000"+
-        "\uE2F2\uF6B9\uE7F3\u0000\u0000\uEBCB\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE86D\u0000\u0000\uE849"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF0FB"+
-        "\u0000\uE0B9\u0000\u0000\uF1F9\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEB70\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF550\u0000"+
-        "\uF9BC\uEAB1\uECEF\u0000\u0000\u0000\u0000\uEB33"+
-        "\uF9B9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF341\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE1CB\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF1BE\u0000\u0000\u0000\uE5C0\uECF0\uF1FA"+
-        "\u0000\u0000\u0000\u0000\u0000\uEFE4\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE5ED\uEEDD\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE598\uEDB7\u0000\u0000"+
-        "\u0000\uE8E7\uEC4F\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF25B"+
-        "\u0000\u0000\uE6F4\uF36D\u0000\u0000\u0000\uE23B"+
-        "\u0000\u0000\uEEDE\u0000\u0000\u0000\uE666\uEBCC"+
-        "\u0000\u0000\uEF43\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEDEE\uE932"+
-        "\u0000\u0000\uEB60\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE5B5\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE5A1"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF8DB\u0000"+
-        "\uF7CB\u0000\u0000\u0000\uE0F3\uF535\u0000\u0000"+
-        "\u0000\u0000\u0000\uF858\uE667\u0000\uEFE5\uF8DC"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF9D0"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF8F6\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE835\u0000\uE8BD\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF172\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE1F7\uF36E\u0000\u0000\u0000"+
-        "\u0000\uF659\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEA91"+
-        "\u0000\u0000\u0000\uE4B1\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF97E\u0000\u0000\u0000"+
-        "\u0000\uEF53\u0000\uF3C8\u0000\u0000\u0000\uE293"+
-        "\u0000\u0000\u0000\u0000\uF7ED\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF496\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uED46\u0000"+
-        "\uF5B9\u0000\uE992\uECF1\u0000\u0000\u0000\u0000"+
-        "\uEF35\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF44B\u0000\uEA34\u0000\uE85C\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE079\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uECDA\u0000\uF969"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF06A"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF7C4\u0000"+
-        "\uECA4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF8DD\u0000\uF2CA\u0000"+
-        "\uEF54\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE5CC\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF0D7\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7AD"+
-        "\u0000\u0000\uF8AB\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE4D9\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE5A2\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF66E\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE898\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEB61\u0000\u0000\uEFA8"+
-        "\u0000\u0000\uF5F9\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF83F\u0000\uF0FC\u0000\u0000\uEB7A\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uECB2\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE5C5"+
-        "\u0000\u0000\uF3E3\uE5EE\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE1CC\u0000\u0000\u0000\u0000\uF1D9\u0000"+
-        "\u0000\u0000\u0000\uE751\u0000\u0000\u0000\u0000"+
-        "\uF87C\u0000\u0000\u0000\u0000\u0000\uF3EB\u0000"+
-        "\u0000\u0000\u0000\u0000\uF84C\uEE72\u0000\u0000"+
-        "\u0000\u0000\uF875\uEC9C\u0000\u0000\u0000\uE046"+
-        "\u0000\uED47\u0000\uF06B\u0000\uF5FA\u0000\u0000"+
-        "\u0000\uF8AC\uE2C3\uF0FD\u0000\u0000\u0000\u0000"+
-        "\uF79C\u0000\u0000\uEAB9\u0000\u0000\u0000\u0000"+
-        "\uEBF1\u0000\uE434\u0000\u0000\u0000\u0000\uF5FB"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE36A\uE36B"+
-        "\u0000\uF04E\uE7B1\u0000\u0000\u0000\u0000\u0000"+
-        "\uE047\u0000\u0000\uE4E7\u0000\uF775\u0000\u0000"+
-        "\u0000\u0000\uE4B2\u0000\u0000\u0000\uEC50\uF46F"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE1E5\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF7AC\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE1CD\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF23E\uE63E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6EA"+
-        "\u0000\u0000\u0000\u0000\uEEE0\uF0AE\u0000\u0000"+
-        "\u0000\uE2D9\u0000\u0000\uE95D\uF1FB\u0000\uEA92"+
-        "\u0000\uE6EB\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEA35\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEAD7\uE8D0\uE8D1\u0000\u0000"+
-        "\uE5A3\u0000\u0000\u0000\u0000\uF342\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE96C"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE078\u0000\uF776\uE95E\u0000\u0000\u0000\u0000"+
-        "\uF06C\uE8D2\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEFB3\u0000\u0000"+
-        "\u0000\u0000\uF6DB\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uECA8\u0000"+
-        "\uE6AE\u0000\u0000\uEB71\u0000\u0000\u0000\u0000"+
-        "\u0000\uE0BA\u0000\u0000\uEDD1\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE36C"+
-        "\u0000\u0000\u0000\u0000\uE5C1\u0000\u0000\u0000"+
-        "\u0000\u0000\uE75A\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uECA9\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEB34"+
-        "\u0000\uEFA9\u0000\uE4C7\u0000\u0000\uE96D\uF73E"+
-        "\u0000\u0000\u0000\uE148\u0000\u0000\u0000\uE33E"+
-        "\u0000\u0000\u0000\uE794\u0000\u0000\uECCA\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE13F\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE53D\uF661\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE35C\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE056\u0000\u0000\uE5C2\u0000\u0000"+
-        "\uE24A\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE057\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF840\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEAD8\u0000\u0000\u0000"+
-        "\uF5BA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEDEB\u0000\uF2F4\uE9B5\u0000\u0000\u0000\u0000"+
-        "\uE1AA\u0000\uECF2\u0000\uF8F7\u0000\uF6D0\u0000"+
-        "\u0000\u0000\u0000\uF9BA\u0000\u0000\uF9E1\uF6A0"+
-        "\uE3C0\u0000\u0000\uEF55\u0000\uED48\u0000\uEBE8"+
-        "\u0000\u0000\u0000\uE151\u0000\uE47D\u0000\u0000"+
-        "\u0000\u0000\uE8BE\u0000\u0000\uEB72\u0000\u0000"+
-        "\u0000\uF859\u0000\u0000\uEBCD\u0000\uE048\u0000"+
-        "\u0000\u0000\uF470\uF3C9\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEA93\u0000\u0000\u0000\uF36F\uF754\u0000\u0000"+
-        "\u0000\u0000\u0000\uF25C\u0000\u0000\uEA94\u0000"+
-        "\uEEC9\u0000\uEC95\uEEE1\u0000\u0000\uECCB\u0000"+
-        "\u0000\uECCC\u0000\u0000\u0000\uE2F8\uF2AC\u0000"+
-        "\uF9FE\uF935\uF841\uEAD9\u0000\uEB62\u0000\u0000"+
-        "\u0000\uF56A\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF3CA\u0000\uE233"+
-        "\u0000\u0000\u0000\u0000\uF44C\uF173\u0000\u0000"+
-        "\u0000\u0000\u0000\uEB35\u0000\uF6AB\u0000\u0000"+
-        "\uF0AF\u0000\u0000\u0000\u0000\u0000\uEDDE\u0000"+
-        "\uEBA4\uE1AB\u0000\uE7F4\uEF36\uE1CE\uEBE9\u0000"+
-        "\uF991\u0000\uEB73\u0000\u0000\u0000\u0000\u0000"+
-        "\uEC51\u0000\uE234\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEA36\u0000\u0000\uF0FE\u0000\uF0DD\uF370"+
-        "\u0000\u0000\uF56B\u0000\uEC96\u0000\u0000\uE4C8"+
-        "\u0000\u0000\u0000\uF57B\u0000\uF245\u0000\uF5D8"+
-        "\u0000\u0000\uE5DF\u0000\u0000\u0000\uE675\u0000"+
-        "\u0000\u0000\u0000\uF0B0\uF573\u0000\u0000\u0000"+
-        "\u0000\uECCD\u0000\u0000\u0000\u0000\uF596\uF842"+
-        "\u0000\u0000\uF2F5\uE06F\u0000\uF0B1\uF1BF\u0000"+
-        "\u0000\uF9C9\u0000\u0000\u0000\u0000\uED36\uF7A4"+
-        "\uF343\u0000\uEDEC\u0000\u0000\u0000\uE3E7\u0000"+
-        "\uE7C7\uED67\uF06D\u0000\uE599\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE84A\u0000"+
-        "\uE85D\u0000\u0000\u0000\uF7CC\u0000\uEBDA\uE8BF"+
-        "\u0000\uE155\uF160\uE0BB\u0000\uEA95\u0000\u0000"+
-        "\uEFAA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE7C8\u0000\u0000\uF273\uE6BD\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE2C4\u0000\u0000\u0000\u0000"+
-        "\u0000\uE35D\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF936\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF3FB\u0000\u0000\u0000\u0000\uF9D2\uE3C1"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uECDB\u0000\uE4C9\u0000\uE95F\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE17D\u0000"+
-        "\u0000\u0000\u0000\u0000\uEA37\u0000\u0000\uEE4B"+
-        "\uF131\u0000\u0000\u0000\uE149\u0000\u0000\uF8DE"+
-        "\u0000\u0000\u0000\u0000\u0000\uEEE2\u0000\u0000"+
-        "\uE551\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE938\u0000\u0000\u0000\u0000\u0000"+
-        "\uEC52\u0000\uF4D8\uEDD3\u0000\u0000\uF4D9\u0000"+
-        "\u0000\u0000\uF4C6\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1DB"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE1AC"+
-        "\u0000\uF953\u0000\u0000\u0000\u0000\uE577\u0000"+
-        "\uE3C2\u0000\uF7A5\u0000\uEF65\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uECCE\u0000\u0000"+
-        "\u0000\u0000\uE55A\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEADA\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF8DF\uEEE3\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF79D\uECCF\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF5B0\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE777\u0000\uE7C9\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF73F\uF2F6\u0000"+
-        "\uE9B6\uF23F\uE1F8\u0000\u0000\u0000\u0000\uEA48"+
-        "\uF937\uF6FC\uF6B1\uE24B\uF531\u0000\u0000\uF25D"+
-        "\uEBAE\u0000\u0000\uF153\uE2FE\u0000\uF74F\uE772"+
-        "\uE4E8\u0000\u0000\uEA38\uF574\uF152\u0000\uE7F5"+
-        "\uF7C5\uE9D3\uE693\uF19E\uF992\u0000\u0000\uF1C0"+
-        "\uE049\u0000\uF274\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF471\u0000\uEA49\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE694\u0000\uEA96\u0000\uEADB\u0000"+
-        "\uE8D3\u0000\uF877\uE773\uF551\u0000\uE9B7\u0000"+
-        "\u0000\u0000\uF497\u0000\u0000\uE53E\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE695\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE9B8\uE2C5\uEADF\u0000\u0000";
-
-    private final static String innerIndex5=
-        "\u0000\u0000\u0000\u0000\uF44E\uF631\u0000\uF0CB"+
-        "\uF3FC\u0000\uF4C7\u0000\u0000\uEB7B\u0000\u0000"+
-        "\u0000\u0000\u0000\uF1FC\u0000\u0000\uEBDB\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF275\u0000\uEA97\u0000"+
-        "\u0000\u0000\u0000\uF863\u0000\u0000\u0000\u0000"+
-        "\uF3CB\u0000\u0000\uE33F\uE9B9\u0000\u0000\uE3C3"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF5B1\u0000\u0000"+
-        "\u0000\u0000\uF056\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF371\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF63C\u0000\u0000\u0000\u0000"+
-        "\uF5D9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF37B\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE9BA\u0000\u0000\u0000\uF44F\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF6C5\u0000"+
-        "\u0000\u0000\u0000\uE8A2\uF498\u0000\u0000\uE04A"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF6F5\u0000\uE0E5\u0000\u0000"+
-        "\u0000\uF276\u0000\uEB63\u0000\u0000\u0000\u0000"+
-        "\uE235\u0000\u0000\u0000\u0000\u0000\u0000\uE668"+
-        "\u0000\u0000\u0000\uE53F\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEFC9\u0000\u0000\u0000\u0000\uE4CE"+
-        "\uF552\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE0E6\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF3A1\u0000\u0000\u0000\u0000\u0000"+
-        "\uF0B2\u0000\u0000\u0000\u0000\uF3A2\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF0B3\u0000\uF344\u0000\u0000\uE0F4"+
-        "\uE540\uF4B2\uF8B7\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF5EC\u0000\u0000\u0000\u0000\u0000\uF277"+
-        "\uF542\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF5ED\u0000\uE2F3\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF372\u0000\u0000\u0000\u0000\u0000\uF25E"+
-        "\u0000\u0000\uF3CC\u0000\u0000\uEDB8\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE6F5\uECF3\uE2E5\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE2C6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF4B3\uED68\uE2F9\uE2DA\u0000\u0000"+
-        "\u0000\u0000\uF85D\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEE73"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF472\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF5EE\u0000\u0000\uE04B\u0000\u0000\uECDC\u0000"+
-        "\u0000\u0000\u0000\uE294\u0000\uE669\u0000\u0000"+
-        "\u0000\uF240\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF575\uE752\uE960\uE17E\u0000\u0000"+
-        "\u0000\u0000\u0000\uE5E0\uF65A\uF9CA\uE766\uF55F"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE636\uE94E"+
-        "\u0000\uE8D4\uE6C7\u0000\u0000\u0000\u0000\uF4A0"+
-        "\u0000\u0000\u0000\uF3CD\u0000\u0000\u0000\u0000"+
-        "\uEC53\uE96E\u0000\uE96F\u0000\u0000\uF2AD\uEE3B"+
-        "\u0000\u0000\u0000\u0000\uF7DD\uF04F\u0000\u0000"+
-        "\u0000\uF2AE\u0000\u0000\u0000\uF560\uE295\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEE3C\u0000\uE26E"+
-        "\u0000\u0000\uE5F9\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uECF4\uE1D0\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE5B8\u0000\u0000\uF6FD\u0000"+
-        "\uE939\u0000\u0000\u0000\u0000\uEA98\u0000\uE93A"+
-        "\uF473\uEFB4\uE46C\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEFE6\u0000\u0000\uECF6\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEECA\u0000"+
-        "\u0000\uE35E\u0000\u0000\uE899\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE04C\u0000"+
-        "\u0000\u0000\uF278\uE86E\u0000\uF499\u0000\u0000"+
-        "\uEC9D\u0000\uE136\u0000\u0000\u0000\u0000\uE84B"+
-        "\u0000\uF279\u0000\u0000\u0000\uF5DA\u0000\u0000"+
-        "\uF6DC\uEBEA\uE251\uE541\u0000\uF9B1\uEE4D\u0000"+
-        "\uF8AD\u0000\u0000\uF777\u0000\uEBCE\u0000\uF6E2"+
-        "\uF5EF\uE2C7\u0000\u0000\uE542\uE191\u0000\uE578"+
-        "\u0000\uF25F\uF6D7\u0000\u0000\uEB36\uE651\uEBDC"+
-        "\uF373\uF3E4\uE993\uE637\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF597\u0000"+
-        "\u0000\uF3CE\uF474\u0000\u0000\uE340\u0000\u0000"+
-        "\uF191\u0000\u0000\u0000\uF7BA\u0000\uF0B5\u0000"+
-        "\u0000\uE57D\uEC54\u0000\u0000\u0000\u0000\uEFE7"+
-        "\u0000\u0000\uF0B4\uF031\u0000\uF74C\uE236\u0000"+
-        "\uF7C6\uF96A\u0000\uE543\uE4B9\uF06E\u0000\u0000"+
-        "\u0000\uEFAB\u0000\u0000\uEBE1\uE4CF\uF598\u0000"+
-        "\uF050\uEBCF\u0000\uE14A\u0000\u0000\u0000\u0000"+
-        "\u0000\uF27A\u0000\u0000\u0000\uF374\uF4B4\uE57E"+
-        "\u0000\u0000\uF450\u0000\u0000\uF3E5\u0000\uF553"+
-        "\uEB64\u0000\uF0B6\u0000\uE6A1\uE0E8\u0000\uF7AD"+
-        "\uEFAD\uE774\uF843\uEC55\uF94D\u0000\u0000\uF154"+
-        "\uE741\u0000\uE93B\u0000\u0000\u0000\u0000\uE5A4"+
-        "\u0000\uF0E9\u0000\u0000\u0000\uEF4B\u0000\u0000"+
-        "\u0000\uE767\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF8AE\uE3E1\u0000\u0000\uE8C0\u0000"+
-        "\uF5BE\u0000\uEA99\u0000\u0000\u0000\u0000\uE09D"+
-        "\uF6C6\uE2C8\u0000\u0000\u0000\uEBD0\u0000\u0000"+
-        "\uF260\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEFF4\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE296\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE5CD\u0000"+
-        "\u0000\uE2DB\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE9BB\u0000\u0000\u0000\u0000\uE23C\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEFE8\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE544\u0000\u0000"+
-        "\u0000\u0000\uED57\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF5DB\u0000\u0000\uF851\u0000\u0000"+
-        "\u0000\uEA39\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE59A"+
-        "\u0000\u0000\u0000\u0000\u0000\uF2F7\u0000\u0000"+
-        "\u0000\u0000\uE4B3\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF0B7\uF2F8\uF5DC\uF1CC\uE8D5\uF3CF\u0000"+
-        "\u0000\u0000\uF3D0\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF5B2\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE7AE\uE5AC\u0000\uEC56\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF9A3\u0000\uF8E5"+
-        "\uEAAB\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEC97"+
-        "\u0000\uF63D\u0000\uF5B3\u0000\uF345\u0000\u0000"+
-        "\u0000\u0000\uEBA5\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF5DD\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF132\uF1FD\u0000\uF5B4\uF8B8"+
-        "\u0000\uE8A3\u0000\u0000\uE65A\uE0D9\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEDD4\u0000\u0000\u0000\u0000\u0000\u0000\uF4FA"+
-        "\u0000\uF0B8\u0000\uEB47\uE6EC\uF3EC\uEDAF\uE5E1"+
-        "\uE6ED\uE3D1\u0000\u0000\u0000\u0000\u0000\uEBF2"+
-        "\uF2F9\u0000\u0000\u0000\uE9BC\uF66C\u0000\u0000"+
-        "\u0000\u0000\u0000\uF375\u0000\u0000\u0000\uF554"+
-        "\u0000\u0000\uEFE9\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF4FB\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE591\u0000\u0000"+
-        "\uE132\uF6FE\uEABC\u0000\u0000\u0000\u0000\uF0CD"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE347\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE652\u0000\u0000\u0000"+
-        "\u0000\u0000\uEF3D\u0000\u0000\u0000\u0000\uF2AF"+
-        "\uE0A5\u0000\u0000\u0000\u0000\uE0E9\u0000\u0000"+
-        "\u0000\uF878\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE156"+
-        "\u0000\u0000\u0000\uEE77\u0000\u0000\uF057\u0000"+
-        "\u0000\u0000\uE8A4\u0000\uE2C9\uEC9E\uF2FA\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF0DE\u0000\u0000\uF5C8\u0000\uE56E\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uEB65\u0000\uF2B0\u0000\u0000\uEC57\u0000"+
-        "\uE7AF\u0000\u0000\u0000\uF7E7\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEEE5\u0000\u0000\uE2CA\uEBD1"+
-        "\u0000\uEC58\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF2FB\u0000\u0000\uF89B"+
-        "\u0000\u0000\uE994\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEB37\u0000\u0000\u0000"+
-        "\u0000\u0000\uF778\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE0EA\u0000\u0000\u0000\uE0BC\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE672\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF5DE\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF5DF\u0000\uF246\u0000\u0000\u0000\uEC98\uE4CA"+
-        "\uF2FC\uE3C4\uF2B1\u0000\uE3C5\u0000\uE36E\u0000"+
-        "\uE7E1\u0000\u0000\uEB48\u0000\u0000\uE1D1\uF4B9"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEECC\u0000\uE638\uE237\u0000\uE545\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uED58\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE4B4\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF0B9\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE0F5\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF66D\u0000\uF3A3\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE157\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEFCA\u0000\uEBF0\u0000"+
-        "\u0000\u0000\uF5E0\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF8AF\u0000\u0000\u0000\uE0D1"+
-        "\u0000\u0000\u0000\u0000\uF8E0\uF475\u0000\u0000"+
-        "\uF192\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF37C\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF27B\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEFCB\u0000"+
-        "\u0000\uE192\u0000\u0000\uE6AF\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF4A1\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF997\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF3A4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEB66\u0000\u0000"+
-        "\u0000\u0000\u0000\uF2B2\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF561\u0000\u0000"+
-        "\uF6A1\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF3D1\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE09E\uE09F\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE25E\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF4C8\u0000\uF4BA"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF1FE"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE836\u0000\u0000\uEB7C\u0000\u0000\u0000\u0000"+
-        "\u0000\uF75D\u0000\uE0D2\u0000\u0000\u0000\uF0CE"+
-        "\u0000\uF7D8\uF7D9\uE070\uE85A\u0000\u0000\u0000"+
-        "\uE0A6\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE058\uF7EE\uE8EC\u0000\u0000"+
-        "\uE341\u0000\u0000\u0000\u0000\uE5EF\u0000\u0000"+
-        "\u0000\uEE95\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEEA2\uED69\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED71"+
-        "\u0000\u0000\uF954\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF7EF\uE2F4\uF6E6\u0000"+
-        "\u0000\u0000\u0000\u0000\uE24C\u0000\u0000\u0000"+
-        "\u0000\uF555\uE933\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE9BD\u0000\u0000\u0000"+
-        "\u0000\uF556\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF731\u0000\u0000\u0000\uEF66\u0000"+
-        "\u0000\u0000\uE8C1\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF376\u0000\u0000\u0000\uED49"+
-        "\uF67D\u0000\uF7AE\u0000\uE9BE\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE6B0\uE778\uE0BD\u0000\u0000"+
-        "\uF7DA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF75E\uF7F0\uEB7D\uECB3\uF543"+
-        "\u0000\u0000\uF052\uF476\uF346\u0000\u0000\u0000"+
-        "\u0000\u0000\uE8D6\u0000\u0000\u0000\u0000\u0000"+
-        "\uF0E4\u0000\u0000\uF477\u0000\uE6D5\uE546\uF7E8"+
-        "\uE6C1\u0000\u0000\u0000\u0000\uEDD5\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEFEA\uE6CC\u0000"+
-        "\u0000\u0000\uE4E9\uEC59\u0000\uF96B\uE1AD\u0000"+
-        "\u0000\u0000\u0000\u0000\uE140\uF032\u0000\u0000"+
-        "\uED98\uE350\u0000\uF347\uF231\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE6F6\u0000\u0000\u0000\uEC5A"+
-        "\uEC5B\u0000\uF85F\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF0DF\u0000\u0000\u0000\u0000\u0000\uE65B"+
-        "\u0000\u0000\u0000\uF544\u0000\u0000\u0000\u0000"+
-        "\uF1CD\uED62\u0000\u0000\uF039\uED4A\uF4A2\uE1D2"+
-        "\u0000\uF65B\u0000\uF3E6\uF1C1\uEF4C\uF261\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF377\uEC5C\u0000"+
-        "\u0000\uED3A\u0000\uF5E1\uF1DA\u0000\u0000\u0000"+
-        "\u0000\u0000\uE6EE\uE3F1\u0000\u0000\u0000\u0000"+
-        "\uEFEB\uEFEC\uEB74\u0000\u0000\u0000\u0000\uE837"+
-        "\uE9D4\u0000\uF033\u0000\u0000\u0000\uE653\uE696"+
-        "\u0000\uE86F\u0000\uF2B3\u0000\u0000\u0000\u0000"+
-        "\uEC5D\u0000\u0000\u0000\u0000\u0000\uF2FD\uF478"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF2C5\u0000\uEEE7\u0000\u0000\uE6FD\u0000"+
-        "\u0000\uEECE\u0000\u0000\uEADC\u0000\uF7C7\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE7F6"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEAAC\u0000\uE66A\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE934\u0000\u0000\u0000\uF348\u0000\u0000"+
-        "\u0000\u0000\uE5FA\u0000\uED99\u0000\u0000\u0000"+
-        "\uE654\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF57C\u0000\u0000\u0000\u0000\uF2FE\u0000"+
-        "\u0000\u0000\u0000\u0000\uF331\u0000\uEA3A\u0000"+
-        "\u0000\uE84C\uE79E\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF864\u0000\u0000\u0000\uF175\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF938\u0000\u0000\uF176"+
-        "\u0000\u0000\uE75B\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF8B9\u0000\uED63\u0000\uE1F9"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE2D3\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE07A\u0000\u0000\uE2D4\u0000\uF74D\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF557\u0000"+
-        "\u0000\u0000\u0000\uF06F\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF7DB\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE547\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF0E5\u0000\u0000\uEBD2\u0000"+
-        "\u0000\u0000\u0000\uF034\u0000\u0000\u0000\uF852"+
-        "\uF8E1\uF87D\uF332\uE193\u0000\uF833\uEC99\u0000"+
-        "\uEC5E\u0000\uEFF5\u0000\uEBEB\u0000\u0000\u0000"+
-        "\uEEE8\uEF67\uE89A\uE55B\u0000\u0000\u0000\uF6F6"+
-        "\uE655\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE579\u0000\u0000"+
-        "\uF89C\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE194\uF6DD\u0000\uEA4A\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE238\u0000"+
-        "\u0000\u0000\u0000\u0000\uF349\uEDA0\uED59\u0000"+
-        "\u0000\u0000\u0000\u0000\uED64\u0000\u0000\u0000"+
-        "\uF053\u0000\uF2B4\u0000\u0000\u0000\uE6BE\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF8E2\u0000\uE1D3"+
-        "\u0000\u0000\u0000\uF2B5\u0000\u0000\u0000\uF879"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF7A6\u0000\u0000\u0000\u0000\u0000\u0000\uEABD"+
-        "\u0000\uF6C7\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uF79F\u0000\u0000\uF79E"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEA3B\uE8E8\u0000\u0000\uECDD"+
-        "\u0000\uEBE2\uE3C6\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF660\uF0E6\uE89B"+
-        "\u0000\u0000\u0000\u0000\uF157\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uEA9A\uF779\uECDE\u0000"+
-        "\u0000\u0000\u0000\uE297\u0000\u0000\u0000\u0000"+
-        "\u0000\uF853\uEDD7\u0000\uF158\u0000\u0000\u0000"+
-        "\uF4C9\u0000\u0000\uED4B\u0000\u0000\u0000\u0000"+
-        "\uEE3E\u0000\u0000\u0000\u0000\u0000\uF2B6\u0000"+
-        "\uE94F\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE24D\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE753\u0000\u0000"+
-        "\u0000\uE35F\u0000\uE2FA\uF4CA\uEB67\u0000\u0000"+
-        "\u0000\uE3C7\uEFAE\u0000\uEF4D\u0000\u0000\uF854"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uEC5F\u0000"+
-        "\u0000\uF855\u0000\u0000\u0000\uF7B8\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE970\u0000\u0000"+
-        "\uF8B0\u0000\u0000\u0000\uE739\uEDDF\uF7A7\u0000"+
-        "\u0000\uF67E\u0000\uF65C\uEC9A\u0000\u0000\u0000"+
-        "\u0000\uF193\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE870\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF3D2\uE45C\uE2CB\u0000\u0000\uE04D\u0000\u0000"+
-        "\u0000\uE9BF\u0000\u0000\u0000\uF691\u0000\uEA9B"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF844\u0000\u0000"+
-        "\u0000\uE5AD\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF3E7"+
-        "\u0000\uEA4E\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE950\u0000\u0000\u0000\u0000\u0000\uE3C8\uE3C9"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF74E\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE0F6\u0000\u0000\u0000\u0000"+
-        "\uE59B\u0000\u0000\u0000\u0000\u0000\uF5E2\uEBD3"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE779\u0000\u0000\uF7A0\u0000\uE2CC\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF9A4\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE298\u0000\uF860"+
-        "\u0000\u0000\uE195\uEE4E\u0000\u0000\u0000\uF63E"+
-        "\u0000\u0000\uE5F0\u0000\u0000\uE3CA\u0000\u0000"+
-        "\u0000\uF94E\uE5F1\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE1E9\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uF845\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEC60\uF599\u0000\u0000\u0000"+
-        "\uE1D4\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEEA3\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uE8A5\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEC61\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6A2"+
-        "\u0000\u0000\uF6E3\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uF036\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE331\u0000\u0000\u0000"+
-        "\u0000\uE26A\uF8EB\uE8A6\uE8DE\uE775\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF070"+
-        "\u0000\u0000\u0000\u0000\uE73A\u0000\u0000\u0000"+
-        "\u0000\u0000\uEDE0\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE66B"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF2C6\u0000"+
-        "\u0000\uF77A\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED65"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE299\u0000\u0000\uEB68\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE6EF\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uF57D\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE1E6\u0000\u0000\u0000"+
-        "\uE196\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF5E3\u0000\u0000"+
-        "\uED5A\u0000\uE971\u0000\u0000\uF7C8\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF94F\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEF37\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE754\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE0BE"+
-        "\u0000\uE93E\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE6F7"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uF378\u0000\uE9C0"+
-        "\u0000\uE2CD\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uE995\uE7B0\u0000\uEE79\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000";
-
-    private final static String innerIndex6=
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uED4C\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF054\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\uED7C\u0000"+
-        "\uED75\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uF8F8\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE14B\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uED4D\u0000\u0000"+
-        "\uE1DC\uE7F7\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE9DF\u0000\u0000\u0000"+
-        "\u0000\u0000\uF1CE\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uE7D0\u0000\u0000\u0000\u0000\u0000\uEDA3"+
-        "\u0000\u0000\u0000\u0000\uF7CD\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE1AE\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uE2CE"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF63F\u0000\u0000\u0000\u0000\u0000"+
-        "\uF9D3\uF0ED\uE66C\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uEDA4\u0000\u0000\u0000\uE5B6\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE66D\u0000\u0000"+
-        "\u0000\uF7E9\u0000\u0000\u0000\uEEA4\u0000\uE673"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uE3CB\uE674\u0000\u0000\u0000\uE5F2"+
-        "\u0000\u0000\u0000\u0000\u0000\uEA9C\u0000\uE6F8"+
-        "\u0000\u0000\u0000\u0000\u0000\uE77A\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE2D5\uE79F\u0000\u0000"+
-        "\u0000\u0000\u0000\uE73B\u0000\u0000\uF9CB\u0000"+
-        "\u0000\u0000\u0000\uF96C\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uEB38\uE5F3\u0000"+
-        "\u0000\uF9D9\u0000\u0000\uE133\u0000\u0000\u0000"+
-        "\uE7F9\u0000\u0000\uE4EA\uF5F5\u0000\uF2C7\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE4DA\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE84D\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uEF38"+
-        "\uE93F\u0000\u0000\u0000\u0000\u0000\uF333\u0000"+
-        "\u0000\u0000\u0000\uE1D5\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uEB39\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\uEA3C\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\uF34A\uF241\u0000\u0000\uF242\u0000"+
-        "\u0000\u0000\uF65D\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uF262"+
-        "\u0000\uE656\u0000\u0000\u0000\u0000\u0000\uEB75"+
-        "\u0000\u0000\uF4BB\u0000\uEDE1\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\uED5B"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\uE6A3\u0000\u0000"+
-        "\uE8C2\u0000\u0000\u0000\u0000\uE0A0\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\uE2CF\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u8861\u8862\u8863\u8864\u8865\u8866\u8867\u8868"+
-        "\u8869\u886A\u886B\u886C\u886D\u886E\u886F\u8870"+
-        "\u8871\u8873\u8874\u8875\u8876\u8877\u8878\u8879"+
-        "\u887A\u887B\u887C\u887D\u8881\u8882\u8883\u8884"+
-        "\u8885\u8886\u8887\u8888\u8889\u888A\u888B\u888C"+
-        "\u888D\u888E\u888F\u8890\u8891\u8893\u8894\u8895"+
-        "\u8896\u8897\u8898\u8899\u889A\u889B\u889C\u889D"+
-        "\u88A1\u88A2\u88A3\u88A4\u88A5\u88A6\u88A7\u88A8"+
-        "\u88A9\u88AA\u88AB\u88AC\u88AD\u88AE\u88AF\u88B0"+
-        "\u88B1\u88B3\u88B4\u88B5\u88B6\u88B7\u88B8\u88B9"+
-        "\u88BA\u88BB\u88BC\u88BD\u88C1\u88C2\u88C3\u88C4"+
-        "\u88C5\u88C6\u88C7\u88C8\u88C9\u88CA\u88CB\u88CC"+
-        "\u88CD\u88CE\u88CF\u88D0\u88D1\u88D3\u88D4\u88D5"+
-        "\u88D6\u88D7\u88D8\u88D9\u88DA\u88DB\u88DC\u88DD"+
-        "\u88E1\u88E2\u88E3\u88E4\u88E5\u88E6\u88E7\u88E8"+
-        "\u88E9\u88EA\u88EB\u88EC\u88ED\u88EE\u88EF\u88F0"+
-        "\u88F1\u88F3\u88F4\u88F5\u88F6\u88F7\u88F8\u88F9"+
-        "\u88FA\u88FB\u88FC\u88FD\u8941\u8942\u8943\u8944"+
-        "\u8945\u8946\u8947\u8948\u8949\u894A\u894B\u894C"+
-        "\u894D\u894E\u894F\u8950\u8951\u8953\u8954\u8955"+
-        "\u8956\u8957\u8958\u8959\u895A\u895B\u895C\u895D"+
-        "\u8961\u8962\u8963\u8964\u8965\u8966\u8967\u8968"+
-        "\u8969\u896A\u896B\u896C\u896D\u896E\u896F\u8970"+
-        "\u8971\u8973\u8974\u8975\u8976\u8977\u8978\u8979"+
-        "\u897A\u897B\u897C\u897D\u8981\u8982\u8983\u8984"+
-        "\u8985\u8986\u8987\u8988\u8989\u898A\u898B\u898C"+
-        "\u898D\u898E\u898F\u8990\u8991\u8993\u8994\u8995"+
-        "\u8996\u8997\u8998\u8999\u899A\u899B\u899C\u899D"+
-        "\u89A1\u89A2\u89A3\u89A4\u89A5\u89A6\u89A7\u89A8"+
-        "\u89A9\u89AA\u89AB\u89AC\u89AD\u89AE\u89AF\u89B0"+
-        "\u89B1\u89B3\u89B4\u89B5\u89B6\u89B7\u89B8\u89B9"+
-        "\u89BA\u89BB\u89BC\u89BD\u89C1\u89C2\u89C3\u89C4"+
-        "\u89C5\u89C6\u89C7\u89C8\u89C9\u89CA\u89CB\u89CC"+
-        "\u89CD\u89CE\u89CF\u89D0\u89D1\u89D3\u89D4\u89D5"+
-        "\u89D6\u89D7\u89D8\u89D9\u89DA\u89DB\u89DC\u89DD"+
-        "\u89E1\u89E2\u89E3\u89E4\u89E5\u89E6\u89E7\u89E8"+
-        "\u89E9\u89EA\u89EB\u89EC\u89ED\u89EE\u89EF\u89F0"+
-        "\u89F1\u89F3\u89F4\u89F5\u89F6\u89F7\u89F8\u89F9"+
-        "\u89FA\u89FB\u89FC\u89FD\u8A41\u8A42\u8A43\u8A44"+
-        "\u8A45\u8A46\u8A47\u8A48\u8A49\u8A4A\u8A4B\u8A4C"+
-        "\u8A4D\u8A4E\u8A4F\u8A50\u8A51\u8A53\u8A54\u8A55"+
-        "\u8A56\u8A57\u8A58\u8A59\u8A5A\u8A5B\u8A5C\u8A5D"+
-        "\u8A61\u8A62\u8A63\u8A64\u8A65\u8A66\u8A67\u8A68"+
-        "\u8A69\u8A6A\u8A6B\u8A6C\u8A6D\u8A6E\u8A6F\u8A70"+
-        "\u8A71\u8A73\u8A74\u8A75\u8A76\u8A77\u8A78\u8A79"+
-        "\u8A7A\u8A7B\u8A7C\u8A7D\u8A81\u8A82\u8A83\u8A84"+
-        "\u8A85\u8A86\u8A87\u8A88\u8A89\u8A8A\u8A8B\u8A8C"+
-        "\u8A8D\u8A8E\u8A8F\u8A90\u8A91\u8A93\u8A94\u8A95"+
-        "\u8A96\u8A97\u8A98\u8A99\u8A9A\u8A9B\u8A9C\u8A9D"+
-        "\u8AA1\u8AA2\u8AA3\u8AA4\u8AA5\u8AA6\u8AA7\u8AA8"+
-        "\u8AA9\u8AAA\u8AAB\u8AAC\u8AAD\u8AAE\u8AAF\u8AB0"+
-        "\u8AB1\u8AB3\u8AB4\u8AB5\u8AB6\u8AB7\u8AB8\u8AB9"+
-        "\u8ABA\u8ABB\u8ABC\u8ABD\u8AC1\u8AC2\u8AC3\u8AC4"+
-        "\u8AC5\u8AC6\u8AC7\u8AC8\u8AC9\u8ACA\u8ACB\u8ACC"+
-        "\u8ACD\u8ACE\u8ACF\u8AD0\u8AD1\u8AD3\u8AD4\u8AD5"+
-        "\u8AD6\u8AD7\u8AD8\u8AD9\u8ADA\u8ADB\u8ADC\u8ADD"+
-        "\u8AE1\u8AE2\u8AE3\u8AE4\u8AE5\u8AE6\u8AE7\u8AE8"+
-        "\u8AE9\u8AEA\u8AEB\u8AEC\u8AED\u8AEE\u8AEF\u8AF0"+
-        "\u8AF1\u8AF3\u8AF4\u8AF5\u8AF6\u8AF7\u8AF8\u8AF9"+
-        "\u8AFA\u8AFB\u8AFC\u8AFD\u8B41\u8B42\u8B43\u8B44"+
-        "\u8B45\u8B46\u8B47\u8B48\u8B49\u8B4A\u8B4B\u8B4C"+
-        "\u8B4D\u8B4E\u8B4F\u8B50\u8B51\u8B53\u8B54\u8B55"+
-        "\u8B56\u8B57\u8B58\u8B59\u8B5A\u8B5B\u8B5C\u8B5D"+
-        "\u8B61\u8B62\u8B63\u8B64\u8B65\u8B66\u8B67\u8B68"+
-        "\u8B69\u8B6A\u8B6B\u8B6C\u8B6D\u8B6E\u8B6F\u8B70"+
-        "\u8B71\u8B73\u8B74\u8B75\u8B76\u8B77\u8B78\u8B79"+
-        "\u8B7A\u8B7B\u8B7C\u8B7D\u8B81\u8B82\u8B83\u8B84"+
-        "\u8B85\u8B86\u8B87\u8B88\u8B89\u8B8A\u8B8B\u8B8C"+
-        "\u8B8D\u8B8E\u8B8F\u8B90\u8B91\u8B93\u8B94\u8B95"+
-        "\u8B96\u8B97\u8B98\u8B99\u8B9A\u8B9B\u8B9C\u8B9D"+
-        "\u8BA1\u8BA2\u8BA3\u8BA4\u8BA5\u8BA6\u8BA7\u8BA8"+
-        "\u8BA9\u8BAA\u8BAB\u8BAC\u8BAD\u8BAE\u8BAF\u8BB0"+
-        "\u8BB1\u8BB3\u8BB4\u8BB5\u8BB6\u8BB7\u8BB8\u8BB9"+
-        "\u8BBA\u8BBB\u8BBC\u8BBD\u8C61\u8C62\u8C63\u8C64"+
-        "\u8C65\u8C66\u8C67\u8C68\u8C69\u8C6A\u8C6B\u8C6C"+
-        "\u8C6D\u8C6E\u8C6F\u8C70\u8C71\u8C73\u8C74\u8C75"+
-        "\u8C76\u8C77\u8C78\u8C79\u8C7A\u8C7B\u8C7C\u8C7D"+
-        "\u8C81\u8C82\u8C83\u8C84\u8C85\u8C86\u8C87\u8C88"+
-        "\u8C89\u8C8A\u8C8B\u8C8C\u8C8D\u8C8E\u8C8F\u8C90"+
-        "\u8C91\u8C93\u8C94\u8C95\u8C96\u8C97\u8C98\u8C99"+
-        "\u8C9A\u8C9B\u8C9C\u8C9D\u8CA1\u8CA2\u8CA3\u8CA4"+
-        "\u8CA5\u8CA6\u8CA7\u8CA8\u8CA9\u8CAA\u8CAB\u8CAC"+
-        "\u8CAD\u8CAE\u8CAF\u8CB0\u8CB1\u8CB3\u8CB4\u8CB5"+
-        "\u8CB6\u8CB7\u8CB8\u8CB9\u8CBA\u8CBB\u8CBC\u8CBD"+
-        "\u8CC1\u8CC2\u8CC3\u8CC4\u8CC5\u8CC6\u8CC7\u8CC8"+
-        "\u8CC9\u8CCA\u8CCB\u8CCC\u8CCD\u8CCE\u8CCF\u8CD0"+
-        "\u8CD1\u8CD3\u8CD4\u8CD5\u8CD6\u8CD7\u8CD8\u8CD9"+
-        "\u8CDA\u8CDB\u8CDC\u8CDD\u8CE1\u8CE2\u8CE3\u8CE4"+
-        "\u8CE5\u8CE6\u8CE7\u8CE8\u8CE9\u8CEA\u8CEB\u8CEC"+
-        "\u8CED\u8CEE\u8CEF\u8CF0\u8CF1\u8CF3\u8CF4\u8CF5"+
-        "\u8CF6\u8CF7\u8CF8\u8CF9\u8CFA\u8CFB\u8CFC\u8CFD"+
-        "\u8D41\u8D42\u8D43\u8D44\u8D45\u8D46\u8D47\u8D48"+
-        "\u8D49\u8D4A\u8D4B\u8D4C\u8D4D\u8D4E\u8D4F\u8D50"+
-        "\u8D51\u8D53\u8D54\u8D55\u8D56\u8D57\u8D58\u8D59"+
-        "\u8D5A\u8D5B\u8D5C\u8D5D\u8D61\u8D62\u8D63\u8D64"+
-        "\u8D65\u8D66\u8D67\u8D68\u8D69\u8D6A\u8D6B\u8D6C"+
-        "\u8D6D\u8D6E\u8D6F\u8D70\u8D71\u8D73\u8D74\u8D75"+
-        "\u8D76\u8D77\u8D78\u8D79\u8D7A\u8D7B\u8D7C\u8D7D"+
-        "\u8D81\u8D82\u8D83\u8D84\u8D85\u8D86\u8D87\u8D88"+
-        "\u8D89\u8D8A\u8D8B\u8D8C\u8D8D\u8D8E\u8D8F\u8D90"+
-        "\u8D91\u8D93\u8D94\u8D95\u8D96\u8D97\u8D98\u8D99"+
-        "\u8D9A\u8D9B\u8D9C\u8D9D\u8DA1\u8DA2\u8DA3\u8DA4"+
-        "\u8DA5\u8DA6\u8DA7\u8DA8\u8DA9\u8DAA\u8DAB\u8DAC"+
-        "\u8DAD\u8DAE\u8DAF\u8DB0\u8DB1\u8DB3\u8DB4\u8DB5"+
-        "\u8DB6\u8DB7\u8DB8\u8DB9\u8DBA\u8DBB\u8DBC\u8DBD"+
-        "\u8DC1\u8DC2\u8DC3\u8DC4\u8DC5\u8DC6\u8DC7\u8DC8"+
-        "\u8DC9\u8DCA\u8DCB\u8DCC\u8DCD\u8DCE\u8DCF\u8DD0"+
-        "\u8DD1\u8DD3\u8DD4\u8DD5\u8DD6\u8DD7\u8DD8\u8DD9"+
-        "\u8DDA\u8DDB\u8DDC\u8DDD\u8DE1\u8DE2\u8DE3\u8DE4"+
-        "\u8DE5\u8DE6\u8DE7\u8DE8\u8DE9\u8DEA\u8DEB\u8DEC"+
-        "\u8DED\u8DEE\u8DEF\u8DF0\u8DF1\u8DF3\u8DF4\u8DF5"+
-        "\u8DF6\u8DF7\u8DF8\u8DF9\u8DFA\u8DFB\u8DFC\u8DFD"+
-        "\u8E41\u8E42\u8E43\u8E44\u8E45\u8E46\u8E47\u8E48"+
-        "\u8E49\u8E4A\u8E4B\u8E4C\u8E4D\u8E4E\u8E4F\u8E50"+
-        "\u8E51\u8E53\u8E54\u8E55\u8E56\u8E57\u8E58\u8E59"+
-        "\u8E5A\u8E5B\u8E5C\u8E5D\u8E61\u8E62\u8E63\u8E64"+
-        "\u8E65\u8E66\u8E67\u8E68\u8E69\u8E6A\u8E6B\u8E6C"+
-        "\u8E6D\u8E6E\u8E6F\u8E70\u8E71\u8E73\u8E74\u8E75"+
-        "\u8E76\u8E77\u8E78\u8E79\u8E7A\u8E7B\u8E7C\u8E7D"+
-        "\u8E81\u8E82\u8E83\u8E84\u8E85\u8E86\u8E87\u8E88"+
-        "\u8E89\u8E8A\u8E8B\u8E8C\u8E8D\u8E8E\u8E8F\u8E90"+
-        "\u8E91\u8E93\u8E94\u8E95\u8E96\u8E97\u8E98\u8E99"+
-        "\u8E9A\u8E9B\u8E9C\u8E9D\u8EA1\u8EA2\u8EA3\u8EA4"+
-        "\u8EA5\u8EA6\u8EA7\u8EA8\u8EA9\u8EAA\u8EAB\u8EAC"+
-        "\u8EAD\u8EAE\u8EAF\u8EB0\u8EB1\u8EB3\u8EB4\u8EB5"+
-        "\u8EB6\u8EB7\u8EB8\u8EB9\u8EBA\u8EBB\u8EBC\u8EBD"+
-        "\u8EC1\u8EC2\u8EC3\u8EC4\u8EC5\u8EC6\u8EC7\u8EC8"+
-        "\u8EC9\u8ECA\u8ECB\u8ECC\u8ECD\u8ECE\u8ECF\u8ED0"+
-        "\u8ED1\u8ED3\u8ED4\u8ED5\u8ED6\u8ED7\u8ED8\u8ED9"+
-        "\u8EDA\u8EDB\u8EDC\u8EDD\u8EE1\u8EE2\u8EE3\u8EE4"+
-        "\u8EE5\u8EE6\u8EE7\u8EE8\u8EE9\u8EEA\u8EEB\u8EEC"+
-        "\u8EED\u8EEE\u8EEF\u8EF0\u8EF1\u8EF3\u8EF4\u8EF5"+
-        "\u8EF6\u8EF7\u8EF8\u8EF9\u8EFA\u8EFB\u8EFC\u8EFD"+
-        "\u8F41\u8F42\u8F43\u8F44\u8F45\u8F46\u8F47\u8F48"+
-        "\u8F49\u8F4A\u8F4B\u8F4C\u8F4D\u8F4E\u8F4F\u8F50"+
-        "\u8F51\u8F53\u8F54\u8F55\u8F56\u8F57\u8F58\u8F59"+
-        "\u8F5A\u8F5B\u8F5C\u8F5D\u8F61\u8F62\u8F63\u8F64"+
-        "\u8F65\u8F66\u8F67\u8F68\u8F69\u8F6A\u8F6B\u8F6C"+
-        "\u8F6D\u8F6E\u8F6F\u8F70\u8F71\u8F73\u8F74\u8F75"+
-        "\u8F76\u8F77\u8F78\u8F79\u8F7A\u8F7B\u8F7C\u8F7D"+
-        "\u8F81\u8F82\u8F83\u8F84\u8F85\u8F86\u8F87\u8F88"+
-        "\u8F89\u8F8A\u8F8B\u8F8C\u8F8D\u8F8E\u8F8F\u8F90"+
-        "\u8F91\u8F93\u8F94\u8F95\u8F96\u8F97\u8F98\u8F99"+
-        "\u8F9A\u8F9B\u8F9C\u8F9D\u8FA1\u8FA2\u8FA3\u8FA4"+
-        "\u8FA5\u8FA6\u8FA7\u8FA8\u8FA9\u8FAA\u8FAB\u8FAC"+
-        "\u8FAD\u8FAE\u8FAF\u8FB0\u8FB1\u8FB3\u8FB4\u8FB5"+
-        "\u8FB6\u8FB7\u8FB8\u8FB9\u8FBA\u8FBB\u8FBC\u8FBD"+
-        "\u9061\u9062\u9063\u9064\u9065\u9066\u9067\u9068"+
-        "\u9069\u906A\u906B\u906C\u906D\u906E\u906F\u9070"+
-        "\u9071\u9073\u9074\u9075\u9076\u9077\u9078\u9079"+
-        "\u907A\u907B\u907C\u907D\u9081\u9082\u9083\u9084"+
-        "\u9085\u9086\u9087\u9088\u9089\u908A\u908B\u908C"+
-        "\u908D\u908E\u908F\u9090\u9091\u9093\u9094\u9095"+
-        "\u9096\u9097\u9098\u9099\u909A\u909B\u909C\u909D"+
-        "\u90A1\u90A2\u90A3\u90A4\u90A5\u90A6\u90A7\u90A8"+
-        "\u90A9\u90AA\u90AB\u90AC\u90AD\u90AE\u90AF\u90B0"+
-        "\u90B1\u90B3\u90B4\u90B5\u90B6\u90B7\u90B8\u90B9"+
-        "\u90BA\u90BB\u90BC\u90BD\u90C1\u90C2\u90C3\u90C4"+
-        "\u90C5\u90C6\u90C7\u90C8\u90C9\u90CA\u90CB\u90CC"+
-        "\u90CD\u90CE\u90CF\u90D0\u90D1\u90D3\u90D4\u90D5"+
-        "\u90D6\u90D7\u90D8\u90D9\u90DA\u90DB\u90DC\u90DD"+
-        "\u90E1\u90E2\u90E3\u90E4\u90E5\u90E6\u90E7\u90E8"+
-        "\u90E9\u90EA\u90EB\u90EC\u90ED\u90EE\u90EF\u90F0"+
-        "\u90F1\u90F3\u90F4\u90F5\u90F6\u90F7\u90F8\u90F9"+
-        "\u90FA\u90FB\u90FC\u90FD\u9141\u9142\u9143\u9144"+
-        "\u9145\u9146\u9147\u9148\u9149\u914A\u914B\u914C"+
-        "\u914D\u914E\u914F\u9150\u9151\u9153\u9154\u9155"+
-        "\u9156\u9157\u9158\u9159\u915A\u915B\u915C\u915D"+
-        "\u9161\u9162\u9163\u9164\u9165\u9166\u9167\u9168"+
-        "\u9169\u916A\u916B\u916C\u916D\u916E\u916F\u9170"+
-        "\u9171\u9173\u9174\u9175\u9176\u9177\u9178\u9179"+
-        "\u917A\u917B\u917C\u917D\u9181\u9182\u9183\u9184"+
-        "\u9185\u9186\u9187\u9188\u9189\u918A\u918B\u918C"+
-        "\u918D\u918E\u918F\u9190\u9191\u9193\u9194\u9195"+
-        "\u9196\u9197\u9198\u9199\u919A\u919B\u919C\u919D"+
-        "\u91A1\u91A2\u91A3\u91A4\u91A5\u91A6\u91A7\u91A8"+
-        "\u91A9\u91AA\u91AB\u91AC\u91AD\u91AE\u91AF\u91B0"+
-        "\u91B1\u91B3\u91B4\u91B5\u91B6\u91B7\u91B8\u91B9"+
-        "\u91BA\u91BB\u91BC\u91BD\u91C1\u91C2\u91C3\u91C4"+
-        "\u91C5\u91C6\u91C7\u91C8\u91C9\u91CA\u91CB\u91CC"+
-        "\u91CD\u91CE\u91CF\u91D0\u91D1\u91D3\u91D4\u91D5"+
-        "\u91D6\u91D7\u91D8\u91D9\u91DA\u91DB\u91DC\u91DD"+
-        "\u91E1\u91E2\u91E3\u91E4\u91E5\u91E6\u91E7\u91E8"+
-        "\u91E9\u91EA\u91EB\u91EC\u91ED\u91EE\u91EF\u91F0"+
-        "\u91F1\u91F3\u91F4\u91F5\u91F6\u91F7\u91F8\u91F9"+
-        "\u91FA\u91FB\u91FC\u91FD\u9241\u9242\u9243\u9244"+
-        "\u9245\u9246\u9247\u9248\u9249\u924A\u924B\u924C"+
-        "\u924D\u924E\u924F\u9250\u9251\u9253\u9254\u9255"+
-        "\u9256\u9257\u9258\u9259\u925A\u925B\u925C\u925D"+
-        "\u9261\u9262\u9263\u9264\u9265\u9266\u9267\u9268"+
-        "\u9269\u926A\u926B\u926C\u926D\u926E\u926F\u9270"+
-        "\u9271\u9273\u9274\u9275\u9276\u9277\u9278\u9279"+
-        "\u927A\u927B\u927C\u927D\u9281\u9282\u9283\u9284"+
-        "\u9285\u9286\u9287\u9288\u9289\u928A\u928B\u928C"+
-        "\u928D\u928E\u928F\u9290\u9291\u9293\u9294\u9295"+
-        "\u9296\u9297\u9298\u9299\u929A\u929B\u929C\u929D"+
-        "\u92A1\u92A2\u92A3\u92A4\u92A5\u92A6\u92A7\u92A8"+
-        "\u92A9\u92AA\u92AB\u92AC\u92AD\u92AE\u92AF\u92B0"+
-        "\u92B1\u92B3\u92B4\u92B5\u92B6\u92B7\u92B8\u92B9"+
-        "\u92BA\u92BB\u92BC\u92BD\u92C1\u92C2\u92C3\u92C4"+
-        "\u92C5\u92C6\u92C7\u92C8\u92C9\u92CA\u92CB\u92CC"+
-        "\u92CD\u92CE\u92CF\u92D0\u92D1\u92D3\u92D4\u92D5"+
-        "\u92D6\u92D7\u92D8\u92D9\u92DA\u92DB\u92DC\u92DD"+
-        "\u92E1\u92E2\u92E3\u92E4\u92E5\u92E6\u92E7\u92E8"+
-        "\u92E9\u92EA\u92EB\u92EC\u92ED\u92EE\u92EF\u92F0"+
-        "\u92F1\u92F3\u92F4\u92F5\u92F6\u92F7\u92F8\u92F9"+
-        "\u92FA\u92FB\u92FC\u92FD\u9341\u9342\u9343\u9344"+
-        "\u9345\u9346\u9347\u9348\u9349\u934A\u934B\u934C"+
-        "\u934D\u934E\u934F\u9350\u9351\u9353\u9354\u9355"+
-        "\u9356\u9357\u9358\u9359\u935A\u935B\u935C\u935D"+
-        "\u9361\u9362\u9363\u9364\u9365\u9366\u9367\u9368"+
-        "\u9369\u936A\u936B\u936C\u936D\u936E\u936F\u9370"+
-        "\u9371\u9373\u9374\u9375\u9376\u9377\u9378\u9379"+
-        "\u937A\u937B\u937C\u937D\u9381\u9382\u9383\u9384"+
-        "\u9385\u9386\u9387\u9388\u9389\u938A\u938B\u938C"+
-        "\u938D\u938E\u938F\u9390\u9391\u9393\u9394\u9395"+
-        "\u9396\u9397\u9398\u9399\u939A\u939B\u939C\u939D"+
-        "\u93A1\u93A2\u93A3\u93A4\u93A5\u93A6\u93A7\u93A8"+
-        "\u93A9\u93AA\u93AB\u93AC\u93AD\u93AE\u93AF\u93B0"+
-        "\u93B1\u93B3\u93B4\u93B5\u93B6\u93B7\u93B8\u93B9"+
-        "\u93BA\u93BB\u93BC\u93BD\u9461\u9462\u9463\u9464"+
-        "\u9465\u9466\u9467\u9468\u9469\u946A\u946B\u946C"+
-        "\u946D\u946E\u946F\u9470\u9471\u9473\u9474\u9475"+
-        "\u9476\u9477\u9478\u9479\u947A\u947B\u947C\u947D"+
-        "\u9481\u9482\u9483\u9484\u9485\u9486\u9487\u9488"+
-        "\u9489\u948A\u948B\u948C\u948D\u948E\u948F\u9490"+
-        "\u9491\u9493\u9494\u9495\u9496\u9497\u9498\u9499"+
-        "\u949A\u949B\u949C\u949D\u94A1\u94A2\u94A3\u94A4"+
-        "\u94A5\u94A6\u94A7\u94A8\u94A9\u94AA\u94AB\u94AC"+
-        "\u94AD\u94AE\u94AF\u94B0\u94B1\u94B3\u94B4\u94B5"+
-        "\u94B6\u94B7\u94B8\u94B9\u94BA\u94BB\u94BC\u94BD"+
-        "\u94C1\u94C2\u94C3\u94C4\u94C5\u94C6\u94C7\u94C8"+
-        "\u94C9\u94CA\u94CB\u94CC\u94CD\u94CE\u94CF\u94D0"+
-        "\u94D1\u94D3\u94D4\u94D5\u94D6\u94D7\u94D8\u94D9"+
-        "\u94DA\u94DB\u94DC\u94DD\u94E1\u94E2\u94E3\u94E4"+
-        "\u94E5\u94E6\u94E7\u94E8\u94E9\u94EA\u94EB\u94EC"+
-        "\u94ED\u94EE\u94EF\u94F0\u94F1\u94F3\u94F4\u94F5"+
-        "\u94F6\u94F7\u94F8\u94F9\u94FA\u94FB\u94FC\u94FD"+
-        "\u9541\u9542\u9543\u9544\u9545\u9546\u9547\u9548"+
-        "\u9549\u954A\u954B\u954C\u954D\u954E\u954F\u9550"+
-        "\u9551\u9553\u9554\u9555\u9556\u9557\u9558\u9559"+
-        "\u955A\u955B\u955C\u955D\u9561\u9562\u9563\u9564"+
-        "\u9565\u9566\u9567\u9568\u9569\u956A\u956B\u956C"+
-        "\u956D\u956E\u956F\u9570\u9571\u9573\u9574\u9575"+
-        "\u9576\u9577\u9578\u9579\u957A\u957B\u957C\u957D"+
-        "\u9581\u9582\u9583\u9584\u9585\u9586\u9587\u9588"+
-        "\u9589\u958A\u958B\u958C\u958D\u958E\u958F\u9590"+
-        "\u9591\u9593\u9594\u9595\u9596\u9597\u9598\u9599"+
-        "\u959A\u959B\u959C\u959D\u95A1\u95A2\u95A3\u95A4"+
-        "\u95A5\u95A6\u95A7\u95A8\u95A9\u95AA\u95AB\u95AC"+
-        "\u95AD\u95AE\u95AF\u95B0\u95B1\u95B3\u95B4\u95B5"+
-        "\u95B6\u95B7\u95B8\u95B9\u95BA\u95BB\u95BC\u95BD"+
-        "\u95C1\u95C2\u95C3\u95C4\u95C5\u95C6\u95C7\u95C8"+
-        "\u95C9\u95CA\u95CB\u95CC\u95CD\u95CE\u95CF\u95D0"+
-        "\u95D1\u95D3\u95D4\u95D5\u95D6\u95D7\u95D8\u95D9"+
-        "\u95DA\u95DB\u95DC\u95DD\u95E1\u95E2\u95E3\u95E4"+
-        "\u95E5\u95E6\u95E7\u95E8\u95E9\u95EA\u95EB\u95EC"+
-        "\u95ED\u95EE\u95EF\u95F0\u95F1\u95F3\u95F4\u95F5"+
-        "\u95F6\u95F7\u95F8\u95F9\u95FA\u95FB\u95FC\u95FD"+
-        "\u9641\u9642\u9643\u9644\u9645\u9646\u9647\u9648"+
-        "\u9649\u964A\u964B\u964C\u964D\u964E\u964F\u9650"+
-        "\u9651\u9653\u9654\u9655\u9656\u9657\u9658\u9659"+
-        "\u965A\u965B\u965C\u965D\u9661\u9662\u9663\u9664"+
-        "\u9665\u9666\u9667\u9668\u9669\u966A\u966B\u966C"+
-        "\u966D\u966E\u966F\u9670\u9671\u9673\u9674\u9675"+
-        "\u9676\u9677\u9678\u9679\u967A\u967B\u967C\u967D"+
-        "\u9681\u9682\u9683\u9684\u9685\u9686\u9687\u9688"+
-        "\u9689\u968A\u968B\u968C\u968D\u968E\u968F\u9690"+
-        "\u9691\u9693\u9694\u9695\u9696\u9697\u9698\u9699"+
-        "\u969A\u969B\u969C\u969D\u96A1\u96A2\u96A3\u96A4"+
-        "\u96A5\u96A6\u96A7\u96A8\u96A9\u96AA\u96AB\u96AC"+
-        "\u96AD\u96AE\u96AF\u96B0\u96B1\u96B3\u96B4\u96B5"+
-        "\u96B6\u96B7\u96B8\u96B9\u96BA\u96BB\u96BC\u96BD"+
-        "\u96C1\u96C2\u96C3\u96C4\u96C5\u96C6\u96C7\u96C8"+
-        "\u96C9\u96CA\u96CB\u96CC\u96CD\u96CE\u96CF\u96D0"+
-        "\u96D1\u96D3\u96D4\u96D5\u96D6\u96D7\u96D8\u96D9"+
-        "\u96DA\u96DB\u96DC\u96DD\u96E1\u96E2\u96E3\u96E4"+
-        "\u96E5\u96E6\u96E7\u96E8\u96E9\u96EA\u96EB\u96EC"+
-        "\u96ED\u96EE\u96EF\u96F0\u96F1\u96F3\u96F4\u96F5"+
-        "\u96F6\u96F7\u96F8\u96F9\u96FA\u96FB\u96FC\u96FD"+
-        "\u9741\u9742\u9743\u9744\u9745\u9746\u9747\u9748"+
-        "\u9749\u974A\u974B\u974C\u974D\u974E\u974F\u9750"+
-        "\u9751\u9753\u9754\u9755\u9756\u9757\u9758\u9759"+
-        "\u975A\u975B\u975C\u975D\u9761\u9762\u9763\u9764"+
-        "\u9765\u9766\u9767\u9768\u9769\u976A\u976B\u976C"+
-        "\u976D\u976E\u976F\u9770\u9771\u9773\u9774\u9775"+
-        "\u9776\u9777\u9778\u9779\u977A\u977B\u977C\u977D"+
-        "\u9781\u9782\u9783\u9784\u9785\u9786\u9787\u9788"+
-        "\u9789\u978A\u978B\u978C\u978D\u978E\u978F\u9790"+
-        "\u9791\u9793\u9794\u9795\u9796\u9797\u9798\u9799"+
-        "\u979A\u979B\u979C\u979D\u97A1\u97A2\u97A3\u97A4"+
-        "\u97A5\u97A6\u97A7\u97A8\u97A9\u97AA\u97AB\u97AC"+
-        "\u97AD\u97AE\u97AF\u97B0\u97B1\u97B3\u97B4\u97B5"+
-        "\u97B6\u97B7\u97B8\u97B9\u97BA\u97BB\u97BC\u97BD"+
-        "\u9861\u9862\u9863\u9864\u9865\u9866\u9867\u9868"+
-        "\u9869\u986A\u986B\u986C\u986D\u986E\u986F\u9870"+
-        "\u9871\u9873\u9874\u9875\u9876\u9877\u9878\u9879"+
-        "\u987A\u987B\u987C\u987D\u9881\u9882\u9883\u9884"+
-        "\u9885\u9886\u9887\u9888\u9889\u988A\u988B\u988C"+
-        "\u988D\u988E\u988F\u9890\u9891\u9893\u9894\u9895"+
-        "\u9896\u9897\u9898\u9899\u989A\u989B\u989C\u989D"+
-        "\u98A1\u98A2\u98A3\u98A4\u98A5\u98A6\u98A7\u98A8"+
-        "\u98A9\u98AA\u98AB\u98AC\u98AD\u98AE\u98AF\u98B0"+
-        "\u98B1\u98B3\u98B4\u98B5\u98B6\u98B7\u98B8\u98B9"+
-        "\u98BA\u98BB\u98BC\u98BD\u98C1\u98C2\u98C3\u98C4"+
-        "\u98C5\u98C6\u98C7\u98C8\u98C9\u98CA\u98CB\u98CC"+
-        "\u98CD\u98CE\u98CF\u98D0\u98D1\u98D3\u98D4\u98D5"+
-        "\u98D6\u98D7\u98D8\u98D9\u98DA\u98DB\u98DC\u98DD"+
-        "\u98E1\u98E2\u98E3\u98E4\u98E5\u98E6\u98E7\u98E8"+
-        "\u98E9\u98EA\u98EB\u98EC\u98ED\u98EE\u98EF\u98F0"+
-        "\u98F1\u98F3\u98F4\u98F5\u98F6\u98F7\u98F8\u98F9"+
-        "\u98FA\u98FB\u98FC\u98FD\u9941\u9942\u9943\u9944"+
-        "\u9945\u9946\u9947\u9948\u9949\u994A\u994B\u994C"+
-        "\u994D\u994E\u994F\u9950\u9951\u9953\u9954\u9955"+
-        "\u9956\u9957\u9958\u9959\u995A\u995B\u995C\u995D"+
-        "\u9961\u9962\u9963\u9964\u9965\u9966\u9967\u9968"+
-        "\u9969\u996A\u996B\u996C\u996D\u996E\u996F\u9970"+
-        "\u9971\u9973\u9974\u9975\u9976\u9977\u9978\u9979"+
-        "\u997A\u997B\u997C\u997D\u9981\u9982\u9983\u9984"+
-        "\u9985\u9986\u9987\u9988\u9989\u998A\u998B\u998C"+
-        "\u998D\u998E\u998F\u9990\u9991\u9993\u9994\u9995"+
-        "\u9996\u9997\u9998\u9999\u999A\u999B\u999C\u999D"+
-        "\u99A1\u99A2\u99A3\u99A4\u99A5\u99A6\u99A7\u99A8"+
-        "\u99A9\u99AA\u99AB\u99AC\u99AD\u99AE\u99AF\u99B0"+
-        "\u99B1\u99B3\u99B4\u99B5\u99B6\u99B7\u99B8\u99B9"+
-        "\u99BA\u99BB\u99BC\u99BD\u99C1\u99C2\u99C3\u99C4"+
-        "\u99C5\u99C6\u99C7\u99C8\u99C9\u99CA\u99CB\u99CC"+
-        "\u99CD\u99CE\u99CF\u99D0\u99D1\u99D3\u99D4\u99D5"+
-        "\u99D6\u99D7\u99D8\u99D9\u99DA\u99DB\u99DC\u99DD"+
-        "\u99E1\u99E2\u99E3\u99E4\u99E5\u99E6\u99E7\u99E8"+
-        "\u99E9\u99EA\u99EB\u99EC\u99ED\u99EE\u99EF\u99F0"+
-        "\u99F1\u99F3\u99F4\u99F5\u99F6\u99F7\u99F8\u99F9"+
-        "\u99FA\u99FB\u99FC\u99FD\u9A41\u9A42\u9A43\u9A44"+
-        "\u9A45\u9A46\u9A47\u9A48\u9A49\u9A4A\u9A4B\u9A4C"+
-        "\u9A4D\u9A4E\u9A4F\u9A50\u9A51\u9A53\u9A54\u9A55"+
-        "\u9A56\u9A57\u9A58\u9A59\u9A5A\u9A5B\u9A5C\u9A5D"+
-        "\u9A61\u9A62\u9A63\u9A64\u9A65\u9A66\u9A67\u9A68"+
-        "\u9A69\u9A6A\u9A6B\u9A6C\u9A6D\u9A6E\u9A6F\u9A70"+
-        "\u9A71\u9A73\u9A74\u9A75\u9A76\u9A77\u9A78\u9A79"+
-        "\u9A7A\u9A7B\u9A7C\u9A7D\u9A81\u9A82\u9A83\u9A84"+
-        "\u9A85\u9A86\u9A87\u9A88\u9A89\u9A8A\u9A8B\u9A8C"+
-        "\u9A8D\u9A8E\u9A8F\u9A90\u9A91\u9A93\u9A94\u9A95"+
-        "\u9A96\u9A97\u9A98\u9A99\u9A9A\u9A9B\u9A9C\u9A9D"+
-        "\u9AA1\u9AA2\u9AA3\u9AA4\u9AA5\u9AA6\u9AA7\u9AA8"+
-        "\u9AA9\u9AAA\u9AAB\u9AAC\u9AAD\u9AAE\u9AAF\u9AB0"+
-        "\u9AB1\u9AB3\u9AB4\u9AB5\u9AB6\u9AB7\u9AB8\u9AB9"+
-        "\u9ABA\u9ABB\u9ABC\u9ABD\u9AC1\u9AC2\u9AC3\u9AC4"+
-        "\u9AC5\u9AC6\u9AC7\u9AC8\u9AC9\u9ACA\u9ACB\u9ACC"+
-        "\u9ACD\u9ACE\u9ACF\u9AD0\u9AD1\u9AD3\u9AD4\u9AD5"+
-        "\u9AD6\u9AD7\u9AD8\u9AD9\u9ADA\u9ADB\u9ADC\u9ADD"+
-        "\u9AE1\u9AE2\u9AE3\u9AE4\u9AE5\u9AE6\u9AE7\u9AE8"+
-        "\u9AE9\u9AEA\u9AEB\u9AEC\u9AED\u9AEE\u9AEF\u9AF0"+
-        "\u9AF1\u9AF3\u9AF4\u9AF5\u9AF6\u9AF7\u9AF8\u9AF9"+
-        "\u9AFA\u9AFB\u9AFC\u9AFD\u9B41\u9B42\u9B43\u9B44"+
-        "\u9B45\u9B46\u9B47\u9B48\u9B49\u9B4A\u9B4B\u9B4C"+
-        "\u9B4D\u9B4E\u9B4F\u9B50\u9B51\u9B53\u9B54\u9B55"+
-        "\u9B56\u9B57\u9B58\u9B59\u9B5A\u9B5B\u9B5C\u9B5D"+
-        "\u9B61\u9B62\u9B63\u9B64\u9B65\u9B66\u9B67\u9B68"+
-        "\u9B69\u9B6A\u9B6B\u9B6C\u9B6D\u9B6E\u9B6F\u9B70"+
-        "\u9B71\u9B73\u9B74\u9B75\u9B76\u9B77\u9B78\u9B79"+
-        "\u9B7A\u9B7B\u9B7C\u9B7D\u9B81\u9B82\u9B83\u9B84"+
-        "\u9B85\u9B86\u9B87\u9B88\u9B89\u9B8A\u9B8B\u9B8C"+
-        "\u9B8D\u9B8E\u9B8F\u9B90\u9B91\u9B93\u9B94\u9B95"+
-        "\u9B96\u9B97\u9B98\u9B99\u9B9A\u9B9B\u9B9C\u9B9D"+
-        "\u9BA1\u9BA2\u9BA3\u9BA4\u9BA5\u9BA6\u9BA7\u9BA8"+
-        "\u9BA9\u9BAA\u9BAB\u9BAC\u9BAD\u9BAE\u9BAF\u9BB0"+
-        "\u9BB1\u9BB3\u9BB4\u9BB5\u9BB6\u9BB7\u9BB8\u9BB9"+
-        "\u9BBA\u9BBB\u9BBC\u9BBD\u9C61\u9C62\u9C63\u9C64"+
-        "\u9C65\u9C66\u9C67\u9C68\u9C69\u9C6A\u9C6B\u9C6C"+
-        "\u9C6D\u9C6E\u9C6F\u9C70\u9C71\u9C73\u9C74\u9C75"+
-        "\u9C76\u9C77\u9C78\u9C79\u9C7A\u9C7B\u9C7C\u9C7D"+
-        "\u9C81\u9C82\u9C83\u9C84\u9C85\u9C86\u9C87\u9C88"+
-        "\u9C89\u9C8A\u9C8B\u9C8C\u9C8D\u9C8E\u9C8F\u9C90"+
-        "\u9C91\u9C93\u9C94\u9C95\u9C96\u9C97\u9C98\u9C99"+
-        "\u9C9A\u9C9B\u9C9C\u9C9D\u9CA1\u9CA2\u9CA3\u9CA4"+
-        "\u9CA5\u9CA6\u9CA7\u9CA8\u9CA9\u9CAA\u9CAB\u9CAC"+
-        "\u9CAD\u9CAE\u9CAF\u9CB0\u9CB1\u9CB3\u9CB4\u9CB5"+
-        "\u9CB6\u9CB7\u9CB8\u9CB9\u9CBA\u9CBB\u9CBC\u9CBD"+
-        "\u9CC1\u9CC2\u9CC3\u9CC4\u9CC5\u9CC6\u9CC7\u9CC8"+
-        "\u9CC9\u9CCA\u9CCB\u9CCC\u9CCD\u9CCE\u9CCF\u9CD0"+
-        "\u9CD1\u9CD3\u9CD4\u9CD5\u9CD6\u9CD7\u9CD8\u9CD9"+
-        "\u9CDA\u9CDB\u9CDC\u9CDD\u9CE1\u9CE2\u9CE3\u9CE4"+
-        "\u9CE5\u9CE6\u9CE7\u9CE8\u9CE9\u9CEA\u9CEB\u9CEC"+
-        "\u9CED\u9CEE\u9CEF\u9CF0\u9CF1\u9CF3\u9CF4\u9CF5"+
-        "\u9CF6\u9CF7\u9CF8\u9CF9\u9CFA\u9CFB\u9CFC\u9CFD"+
-        "\u9D41\u9D42\u9D43\u9D44\u9D45\u9D46\u9D47\u9D48"+
-        "\u9D49\u9D4A\u9D4B\u9D4C\u9D4D\u9D4E\u9D4F\u9D50"+
-        "\u9D51\u9D53\u9D54\u9D55\u9D56\u9D57\u9D58\u9D59"+
-        "\u9D5A\u9D5B\u9D5C\u9D5D\u9D61\u9D62\u9D63\u9D64"+
-        "\u9D65\u9D66\u9D67\u9D68\u9D69\u9D6A\u9D6B\u9D6C"+
-        "\u9D6D\u9D6E\u9D6F\u9D70\u9D71\u9D73\u9D74\u9D75"+
-        "\u9D76\u9D77\u9D78\u9D79\u9D7A\u9D7B\u9D7C\u9D7D"+
-        "\u9D81\u9D82\u9D83\u9D84\u9D85\u9D86\u9D87\u9D88"+
-        "\u9D89\u9D8A\u9D8B\u9D8C\u9D8D\u9D8E\u9D8F\u9D90"+
-        "\u9D91\u9D93\u9D94\u9D95\u9D96\u9D97\u9D98\u9D99"+
-        "\u9D9A\u9D9B\u9D9C\u9D9D\u9DA1\u9DA2\u9DA3\u9DA4"+
-        "\u9DA5\u9DA6\u9DA7\u9DA8\u9DA9\u9DAA\u9DAB\u9DAC"+
-        "\u9DAD\u9DAE\u9DAF\u9DB0\u9DB1\u9DB3\u9DB4\u9DB5"+
-        "\u9DB6\u9DB7\u9DB8\u9DB9\u9DBA\u9DBB\u9DBC\u9DBD"+
-        "\u9DC1\u9DC2\u9DC3\u9DC4\u9DC5\u9DC6\u9DC7\u9DC8"+
-        "\u9DC9\u9DCA\u9DCB\u9DCC\u9DCD\u9DCE\u9DCF\u9DD0"+
-        "\u9DD1\u9DD3\u9DD4\u9DD5\u9DD6\u9DD7\u9DD8\u9DD9"+
-        "\u9DDA\u9DDB\u9DDC\u9DDD\u9DE1\u9DE2\u9DE3\u9DE4"+
-        "\u9DE5\u9DE6\u9DE7\u9DE8\u9DE9\u9DEA\u9DEB\u9DEC"+
-        "\u9DED\u9DEE\u9DEF\u9DF0\u9DF1\u9DF3\u9DF4\u9DF5"+
-        "\u9DF6\u9DF7\u9DF8\u9DF9\u9DFA\u9DFB\u9DFC\u9DFD"+
-        "\u9E41\u9E42\u9E43\u9E44\u9E45\u9E46\u9E47\u9E48"+
-        "\u9E49\u9E4A\u9E4B\u9E4C\u9E4D\u9E4E\u9E4F\u9E50"+
-        "\u9E51\u9E53\u9E54\u9E55\u9E56\u9E57\u9E58\u9E59"+
-        "\u9E5A\u9E5B\u9E5C\u9E5D\u9E61\u9E62\u9E63\u9E64"+
-        "\u9E65\u9E66\u9E67\u9E68\u9E69\u9E6A\u9E6B\u9E6C"+
-        "\u9E6D\u9E6E\u9E6F\u9E70\u9E71\u9E73\u9E74\u9E75"+
-        "\u9E76\u9E77\u9E78\u9E79\u9E7A\u9E7B\u9E7C\u9E7D"+
-        "\u9E81\u9E82\u9E83\u9E84\u9E85\u9E86\u9E87\u9E88"+
-        "\u9E89\u9E8A\u9E8B\u9E8C\u9E8D\u9E8E\u9E8F\u9E90"+
-        "\u9E91\u9E93\u9E94\u9E95\u9E96\u9E97\u9E98\u9E99";
-
-    private final static String innerIndex7=
-        "\u9E9A\u9E9B\u9E9C\u9E9D\u9EA1\u9EA2\u9EA3\u9EA4"+
-        "\u9EA5\u9EA6\u9EA7\u9EA8\u9EA9\u9EAA\u9EAB\u9EAC"+
-        "\u9EAD\u9EAE\u9EAF\u9EB0\u9EB1\u9EB3\u9EB4\u9EB5"+
-        "\u9EB6\u9EB7\u9EB8\u9EB9\u9EBA\u9EBB\u9EBC\u9EBD"+
-        "\u9EC1\u9EC2\u9EC3\u9EC4\u9EC5\u9EC6\u9EC7\u9EC8"+
-        "\u9EC9\u9ECA\u9ECB\u9ECC\u9ECD\u9ECE\u9ECF\u9ED0"+
-        "\u9ED1\u9ED3\u9ED4\u9ED5\u9ED6\u9ED7\u9ED8\u9ED9"+
-        "\u9EDA\u9EDB\u9EDC\u9EDD\u9EE1\u9EE2\u9EE3\u9EE4"+
-        "\u9EE5\u9EE6\u9EE7\u9EE8\u9EE9\u9EEA\u9EEB\u9EEC"+
-        "\u9EED\u9EEE\u9EEF\u9EF0\u9EF1\u9EF3\u9EF4\u9EF5"+
-        "\u9EF6\u9EF7\u9EF8\u9EF9\u9EFA\u9EFB\u9EFC\u9EFD"+
-        "\u9F41\u9F42\u9F43\u9F44\u9F45\u9F46\u9F47\u9F48"+
-        "\u9F49\u9F4A\u9F4B\u9F4C\u9F4D\u9F4E\u9F4F\u9F50"+
-        "\u9F51\u9F53\u9F54\u9F55\u9F56\u9F57\u9F58\u9F59"+
-        "\u9F5A\u9F5B\u9F5C\u9F5D\u9F61\u9F62\u9F63\u9F64"+
-        "\u9F65\u9F66\u9F67\u9F68\u9F69\u9F6A\u9F6B\u9F6C"+
-        "\u9F6D\u9F6E\u9F6F\u9F70\u9F71\u9F73\u9F74\u9F75"+
-        "\u9F76\u9F77\u9F78\u9F79\u9F7A\u9F7B\u9F7C\u9F7D"+
-        "\u9F81\u9F82\u9F83\u9F84\u9F85\u9F86\u9F87\u9F88"+
-        "\u9F89\u9F8A\u9F8B\u9F8C\u9F8D\u9F8E\u9F8F\u9F90"+
-        "\u9F91\u9F93\u9F94\u9F95\u9F96\u9F97\u9F98\u9F99"+
-        "\u9F9A\u9F9B\u9F9C\u9F9D\u9FA1\u9FA2\u9FA3\u9FA4"+
-        "\u9FA5\u9FA6\u9FA7\u9FA8\u9FA9\u9FAA\u9FAB\u9FAC"+
-        "\u9FAD\u9FAE\u9FAF\u9FB0\u9FB1\u9FB3\u9FB4\u9FB5"+
-        "\u9FB6\u9FB7\u9FB8\u9FB9\u9FBA\u9FBB\u9FBC\u9FBD"+
-        "\uA061\uA062\uA063\uA064\uA065\uA066\uA067\uA068"+
-        "\uA069\uA06A\uA06B\uA06C\uA06D\uA06E\uA06F\uA070"+
-        "\uA071\uA073\uA074\uA075\uA076\uA077\uA078\uA079"+
-        "\uA07A\uA07B\uA07C\uA07D\uA081\uA082\uA083\uA084"+
-        "\uA085\uA086\uA087\uA088\uA089\uA08A\uA08B\uA08C"+
-        "\uA08D\uA08E\uA08F\uA090\uA091\uA093\uA094\uA095"+
-        "\uA096\uA097\uA098\uA099\uA09A\uA09B\uA09C\uA09D"+
-        "\uA0A1\uA0A2\uA0A3\uA0A4\uA0A5\uA0A6\uA0A7\uA0A8"+
-        "\uA0A9\uA0AA\uA0AB\uA0AC\uA0AD\uA0AE\uA0AF\uA0B0"+
-        "\uA0B1\uA0B3\uA0B4\uA0B5\uA0B6\uA0B7\uA0B8\uA0B9"+
-        "\uA0BA\uA0BB\uA0BC\uA0BD\uA0C1\uA0C2\uA0C3\uA0C4"+
-        "\uA0C5\uA0C6\uA0C7\uA0C8\uA0C9\uA0CA\uA0CB\uA0CC"+
-        "\uA0CD\uA0CE\uA0CF\uA0D0\uA0D1\uA0D3\uA0D4\uA0D5"+
-        "\uA0D6\uA0D7\uA0D8\uA0D9\uA0DA\uA0DB\uA0DC\uA0DD"+
-        "\uA0E1\uA0E2\uA0E3\uA0E4\uA0E5\uA0E6\uA0E7\uA0E8"+
-        "\uA0E9\uA0EA\uA0EB\uA0EC\uA0ED\uA0EE\uA0EF\uA0F0"+
-        "\uA0F1\uA0F3\uA0F4\uA0F5\uA0F6\uA0F7\uA0F8\uA0F9"+
-        "\uA0FA\uA0FB\uA0FC\uA0FD\uA141\uA142\uA143\uA144"+
-        "\uA145\uA146\uA147\uA148\uA149\uA14A\uA14B\uA14C"+
-        "\uA14D\uA14E\uA14F\uA150\uA151\uA153\uA154\uA155"+
-        "\uA156\uA157\uA158\uA159\uA15A\uA15B\uA15C\uA15D"+
-        "\uA161\uA162\uA163\uA164\uA165\uA166\uA167\uA168"+
-        "\uA169\uA16A\uA16B\uA16C\uA16D\uA16E\uA16F\uA170"+
-        "\uA171\uA173\uA174\uA175\uA176\uA177\uA178\uA179"+
-        "\uA17A\uA17B\uA17C\uA17D\uA181\uA182\uA183\uA184"+
-        "\uA185\uA186\uA187\uA188\uA189\uA18A\uA18B\uA18C"+
-        "\uA18D\uA18E\uA18F\uA190\uA191\uA193\uA194\uA195"+
-        "\uA196\uA197\uA198\uA199\uA19A\uA19B\uA19C\uA19D"+
-        "\uA1A1\uA1A2\uA1A3\uA1A4\uA1A5\uA1A6\uA1A7\uA1A8"+
-        "\uA1A9\uA1AA\uA1AB\uA1AC\uA1AD\uA1AE\uA1AF\uA1B0"+
-        "\uA1B1\uA1B3\uA1B4\uA1B5\uA1B6\uA1B7\uA1B8\uA1B9"+
-        "\uA1BA\uA1BB\uA1BC\uA1BD\uA1C1\uA1C2\uA1C3\uA1C4"+
-        "\uA1C5\uA1C6\uA1C7\uA1C8\uA1C9\uA1CA\uA1CB\uA1CC"+
-        "\uA1CD\uA1CE\uA1CF\uA1D0\uA1D1\uA1D3\uA1D4\uA1D5"+
-        "\uA1D6\uA1D7\uA1D8\uA1D9\uA1DA\uA1DB\uA1DC\uA1DD"+
-        "\uA1E1\uA1E2\uA1E3\uA1E4\uA1E5\uA1E6\uA1E7\uA1E8"+
-        "\uA1E9\uA1EA\uA1EB\uA1EC\uA1ED\uA1EE\uA1EF\uA1F0"+
-        "\uA1F1\uA1F3\uA1F4\uA1F5\uA1F6\uA1F7\uA1F8\uA1F9"+
-        "\uA1FA\uA1FB\uA1FC\uA1FD\uA241\uA242\uA243\uA244"+
-        "\uA245\uA246\uA247\uA248\uA249\uA24A\uA24B\uA24C"+
-        "\uA24D\uA24E\uA24F\uA250\uA251\uA253\uA254\uA255"+
-        "\uA256\uA257\uA258\uA259\uA25A\uA25B\uA25C\uA25D"+
-        "\uA261\uA262\uA263\uA264\uA265\uA266\uA267\uA268"+
-        "\uA269\uA26A\uA26B\uA26C\uA26D\uA26E\uA26F\uA270"+
-        "\uA271\uA273\uA274\uA275\uA276\uA277\uA278\uA279"+
-        "\uA27A\uA27B\uA27C\uA27D\uA281\uA282\uA283\uA284"+
-        "\uA285\uA286\uA287\uA288\uA289\uA28A\uA28B\uA28C"+
-        "\uA28D\uA28E\uA28F\uA290\uA291\uA293\uA294\uA295"+
-        "\uA296\uA297\uA298\uA299\uA29A\uA29B\uA29C\uA29D"+
-        "\uA2A1\uA2A2\uA2A3\uA2A4\uA2A5\uA2A6\uA2A7\uA2A8"+
-        "\uA2A9\uA2AA\uA2AB\uA2AC\uA2AD\uA2AE\uA2AF\uA2B0"+
-        "\uA2B1\uA2B3\uA2B4\uA2B5\uA2B6\uA2B7\uA2B8\uA2B9"+
-        "\uA2BA\uA2BB\uA2BC\uA2BD\uA2C1\uA2C2\uA2C3\uA2C4"+
-        "\uA2C5\uA2C6\uA2C7\uA2C8\uA2C9\uA2CA\uA2CB\uA2CC"+
-        "\uA2CD\uA2CE\uA2CF\uA2D0\uA2D1\uA2D3\uA2D4\uA2D5"+
-        "\uA2D6\uA2D7\uA2D8\uA2D9\uA2DA\uA2DB\uA2DC\uA2DD"+
-        "\uA2E1\uA2E2\uA2E3\uA2E4\uA2E5\uA2E6\uA2E7\uA2E8"+
-        "\uA2E9\uA2EA\uA2EB\uA2EC\uA2ED\uA2EE\uA2EF\uA2F0"+
-        "\uA2F1\uA2F3\uA2F4\uA2F5\uA2F6\uA2F7\uA2F8\uA2F9"+
-        "\uA2FA\uA2FB\uA2FC\uA2FD\uA341\uA342\uA343\uA344"+
-        "\uA345\uA346\uA347\uA348\uA349\uA34A\uA34B\uA34C"+
-        "\uA34D\uA34E\uA34F\uA350\uA351\uA353\uA354\uA355"+
-        "\uA356\uA357\uA358\uA359\uA35A\uA35B\uA35C\uA35D"+
-        "\uA361\uA362\uA363\uA364\uA365\uA366\uA367\uA368"+
-        "\uA369\uA36A\uA36B\uA36C\uA36D\uA36E\uA36F\uA370"+
-        "\uA371\uA373\uA374\uA375\uA376\uA377\uA378\uA379"+
-        "\uA37A\uA37B\uA37C\uA37D\uA381\uA382\uA383\uA384"+
-        "\uA385\uA386\uA387\uA388\uA389\uA38A\uA38B\uA38C"+
-        "\uA38D\uA38E\uA38F\uA390\uA391\uA393\uA394\uA395"+
-        "\uA396\uA397\uA398\uA399\uA39A\uA39B\uA39C\uA39D"+
-        "\uA3A1\uA3A2\uA3A3\uA3A4\uA3A5\uA3A6\uA3A7\uA3A8"+
-        "\uA3A9\uA3AA\uA3AB\uA3AC\uA3AD\uA3AE\uA3AF\uA3B0"+
-        "\uA3B1\uA3B3\uA3B4\uA3B5\uA3B6\uA3B7\uA3B8\uA3B9"+
-        "\uA3BA\uA3BB\uA3BC\uA3BD\uA461\uA462\uA463\uA464"+
-        "\uA465\uA466\uA467\uA468\uA469\uA46A\uA46B\uA46C"+
-        "\uA46D\uA46E\uA46F\uA470\uA471\uA473\uA474\uA475"+
-        "\uA476\uA477\uA478\uA479\uA47A\uA47B\uA47C\uA47D"+
-        "\uA481\uA482\uA483\uA484\uA485\uA486\uA487\uA488"+
-        "\uA489\uA48A\uA48B\uA48C\uA48D\uA48E\uA48F\uA490"+
-        "\uA491\uA493\uA494\uA495\uA496\uA497\uA498\uA499"+
-        "\uA49A\uA49B\uA49C\uA49D\uA4A1\uA4A2\uA4A3\uA4A4"+
-        "\uA4A5\uA4A6\uA4A7\uA4A8\uA4A9\uA4AA\uA4AB\uA4AC"+
-        "\uA4AD\uA4AE\uA4AF\uA4B0\uA4B1\uA4B3\uA4B4\uA4B5"+
-        "\uA4B6\uA4B7\uA4B8\uA4B9\uA4BA\uA4BB\uA4BC\uA4BD"+
-        "\uA4C1\uA4C2\uA4C3\uA4C4\uA4C5\uA4C6\uA4C7\uA4C8"+
-        "\uA4C9\uA4CA\uA4CB\uA4CC\uA4CD\uA4CE\uA4CF\uA4D0"+
-        "\uA4D1\uA4D3\uA4D4\uA4D5\uA4D6\uA4D7\uA4D8\uA4D9"+
-        "\uA4DA\uA4DB\uA4DC\uA4DD\uA4E1\uA4E2\uA4E3\uA4E4"+
-        "\uA4E5\uA4E6\uA4E7\uA4E8\uA4E9\uA4EA\uA4EB\uA4EC"+
-        "\uA4ED\uA4EE\uA4EF\uA4F0\uA4F1\uA4F3\uA4F4\uA4F5"+
-        "\uA4F6\uA4F7\uA4F8\uA4F9\uA4FA\uA4FB\uA4FC\uA4FD"+
-        "\uA541\uA542\uA543\uA544\uA545\uA546\uA547\uA548"+
-        "\uA549\uA54A\uA54B\uA54C\uA54D\uA54E\uA54F\uA550"+
-        "\uA551\uA553\uA554\uA555\uA556\uA557\uA558\uA559"+
-        "\uA55A\uA55B\uA55C\uA55D\uA561\uA562\uA563\uA564"+
-        "\uA565\uA566\uA567\uA568\uA569\uA56A\uA56B\uA56C"+
-        "\uA56D\uA56E\uA56F\uA570\uA571\uA573\uA574\uA575"+
-        "\uA576\uA577\uA578\uA579\uA57A\uA57B\uA57C\uA57D"+
-        "\uA581\uA582\uA583\uA584\uA585\uA586\uA587\uA588"+
-        "\uA589\uA58A\uA58B\uA58C\uA58D\uA58E\uA58F\uA590"+
-        "\uA591\uA593\uA594\uA595\uA596\uA597\uA598\uA599"+
-        "\uA59A\uA59B\uA59C\uA59D\uA5A1\uA5A2\uA5A3\uA5A4"+
-        "\uA5A5\uA5A6\uA5A7\uA5A8\uA5A9\uA5AA\uA5AB\uA5AC"+
-        "\uA5AD\uA5AE\uA5AF\uA5B0\uA5B1\uA5B3\uA5B4\uA5B5"+
-        "\uA5B6\uA5B7\uA5B8\uA5B9\uA5BA\uA5BB\uA5BC\uA5BD"+
-        "\uA5C1\uA5C2\uA5C3\uA5C4\uA5C5\uA5C6\uA5C7\uA5C8"+
-        "\uA5C9\uA5CA\uA5CB\uA5CC\uA5CD\uA5CE\uA5CF\uA5D0"+
-        "\uA5D1\uA5D3\uA5D4\uA5D5\uA5D6\uA5D7\uA5D8\uA5D9"+
-        "\uA5DA\uA5DB\uA5DC\uA5DD\uA5E1\uA5E2\uA5E3\uA5E4"+
-        "\uA5E5\uA5E6\uA5E7\uA5E8\uA5E9\uA5EA\uA5EB\uA5EC"+
-        "\uA5ED\uA5EE\uA5EF\uA5F0\uA5F1\uA5F3\uA5F4\uA5F5"+
-        "\uA5F6\uA5F7\uA5F8\uA5F9\uA5FA\uA5FB\uA5FC\uA5FD"+
-        "\uA641\uA642\uA643\uA644\uA645\uA646\uA647\uA648"+
-        "\uA649\uA64A\uA64B\uA64C\uA64D\uA64E\uA64F\uA650"+
-        "\uA651\uA653\uA654\uA655\uA656\uA657\uA658\uA659"+
-        "\uA65A\uA65B\uA65C\uA65D\uA661\uA662\uA663\uA664"+
-        "\uA665\uA666\uA667\uA668\uA669\uA66A\uA66B\uA66C"+
-        "\uA66D\uA66E\uA66F\uA670\uA671\uA673\uA674\uA675"+
-        "\uA676\uA677\uA678\uA679\uA67A\uA67B\uA67C\uA67D"+
-        "\uA681\uA682\uA683\uA684\uA685\uA686\uA687\uA688"+
-        "\uA689\uA68A\uA68B\uA68C\uA68D\uA68E\uA68F\uA690"+
-        "\uA691\uA693\uA694\uA695\uA696\uA697\uA698\uA699"+
-        "\uA69A\uA69B\uA69C\uA69D\uA6A1\uA6A2\uA6A3\uA6A4"+
-        "\uA6A5\uA6A6\uA6A7\uA6A8\uA6A9\uA6AA\uA6AB\uA6AC"+
-        "\uA6AD\uA6AE\uA6AF\uA6B0\uA6B1\uA6B3\uA6B4\uA6B5"+
-        "\uA6B6\uA6B7\uA6B8\uA6B9\uA6BA\uA6BB\uA6BC\uA6BD"+
-        "\uA6C1\uA6C2\uA6C3\uA6C4\uA6C5\uA6C6\uA6C7\uA6C8"+
-        "\uA6C9\uA6CA\uA6CB\uA6CC\uA6CD\uA6CE\uA6CF\uA6D0"+
-        "\uA6D1\uA6D3\uA6D4\uA6D5\uA6D6\uA6D7\uA6D8\uA6D9"+
-        "\uA6DA\uA6DB\uA6DC\uA6DD\uA6E1\uA6E2\uA6E3\uA6E4"+
-        "\uA6E5\uA6E6\uA6E7\uA6E8\uA6E9\uA6EA\uA6EB\uA6EC"+
-        "\uA6ED\uA6EE\uA6EF\uA6F0\uA6F1\uA6F3\uA6F4\uA6F5"+
-        "\uA6F6\uA6F7\uA6F8\uA6F9\uA6FA\uA6FB\uA6FC\uA6FD"+
-        "\uA741\uA742\uA743\uA744\uA745\uA746\uA747\uA748"+
-        "\uA749\uA74A\uA74B\uA74C\uA74D\uA74E\uA74F\uA750"+
-        "\uA751\uA753\uA754\uA755\uA756\uA757\uA758\uA759"+
-        "\uA75A\uA75B\uA75C\uA75D\uA761\uA762\uA763\uA764"+
-        "\uA765\uA766\uA767\uA768\uA769\uA76A\uA76B\uA76C"+
-        "\uA76D\uA76E\uA76F\uA770\uA771\uA773\uA774\uA775"+
-        "\uA776\uA777\uA778\uA779\uA77A\uA77B\uA77C\uA77D"+
-        "\uA781\uA782\uA783\uA784\uA785\uA786\uA787\uA788"+
-        "\uA789\uA78A\uA78B\uA78C\uA78D\uA78E\uA78F\uA790"+
-        "\uA791\uA793\uA794\uA795\uA796\uA797\uA798\uA799"+
-        "\uA79A\uA79B\uA79C\uA79D\uA7A1\uA7A2\uA7A3\uA7A4"+
-        "\uA7A5\uA7A6\uA7A7\uA7A8\uA7A9\uA7AA\uA7AB\uA7AC"+
-        "\uA7AD\uA7AE\uA7AF\uA7B0\uA7B1\uA7B3\uA7B4\uA7B5"+
-        "\uA7B6\uA7B7\uA7B8\uA7B9\uA7BA\uA7BB\uA7BC\uA7BD"+
-        "\uA861\uA862\uA863\uA864\uA865\uA866\uA867\uA868"+
-        "\uA869\uA86A\uA86B\uA86C\uA86D\uA86E\uA86F\uA870"+
-        "\uA871\uA873\uA874\uA875\uA876\uA877\uA878\uA879"+
-        "\uA87A\uA87B\uA87C\uA87D\uA881\uA882\uA883\uA884"+
-        "\uA885\uA886\uA887\uA888\uA889\uA88A\uA88B\uA88C"+
-        "\uA88D\uA88E\uA88F\uA890\uA891\uA893\uA894\uA895"+
-        "\uA896\uA897\uA898\uA899\uA89A\uA89B\uA89C\uA89D"+
-        "\uA8A1\uA8A2\uA8A3\uA8A4\uA8A5\uA8A6\uA8A7\uA8A8"+
-        "\uA8A9\uA8AA\uA8AB\uA8AC\uA8AD\uA8AE\uA8AF\uA8B0"+
-        "\uA8B1\uA8B3\uA8B4\uA8B5\uA8B6\uA8B7\uA8B8\uA8B9"+
-        "\uA8BA\uA8BB\uA8BC\uA8BD\uA8C1\uA8C2\uA8C3\uA8C4"+
-        "\uA8C5\uA8C6\uA8C7\uA8C8\uA8C9\uA8CA\uA8CB\uA8CC"+
-        "\uA8CD\uA8CE\uA8CF\uA8D0\uA8D1\uA8D3\uA8D4\uA8D5"+
-        "\uA8D6\uA8D7\uA8D8\uA8D9\uA8DA\uA8DB\uA8DC\uA8DD"+
-        "\uA8E1\uA8E2\uA8E3\uA8E4\uA8E5\uA8E6\uA8E7\uA8E8"+
-        "\uA8E9\uA8EA\uA8EB\uA8EC\uA8ED\uA8EE\uA8EF\uA8F0"+
-        "\uA8F1\uA8F3\uA8F4\uA8F5\uA8F6\uA8F7\uA8F8\uA8F9"+
-        "\uA8FA\uA8FB\uA8FC\uA8FD\uA941\uA942\uA943\uA944"+
-        "\uA945\uA946\uA947\uA948\uA949\uA94A\uA94B\uA94C"+
-        "\uA94D\uA94E\uA94F\uA950\uA951\uA953\uA954\uA955"+
-        "\uA956\uA957\uA958\uA959\uA95A\uA95B\uA95C\uA95D"+
-        "\uA961\uA962\uA963\uA964\uA965\uA966\uA967\uA968"+
-        "\uA969\uA96A\uA96B\uA96C\uA96D\uA96E\uA96F\uA970"+
-        "\uA971\uA973\uA974\uA975\uA976\uA977\uA978\uA979"+
-        "\uA97A\uA97B\uA97C\uA97D\uA981\uA982\uA983\uA984"+
-        "\uA985\uA986\uA987\uA988\uA989\uA98A\uA98B\uA98C"+
-        "\uA98D\uA98E\uA98F\uA990\uA991\uA993\uA994\uA995"+
-        "\uA996\uA997\uA998\uA999\uA99A\uA99B\uA99C\uA99D"+
-        "\uA9A1\uA9A2\uA9A3\uA9A4\uA9A5\uA9A6\uA9A7\uA9A8"+
-        "\uA9A9\uA9AA\uA9AB\uA9AC\uA9AD\uA9AE\uA9AF\uA9B0"+
-        "\uA9B1\uA9B3\uA9B4\uA9B5\uA9B6\uA9B7\uA9B8\uA9B9"+
-        "\uA9BA\uA9BB\uA9BC\uA9BD\uA9C1\uA9C2\uA9C3\uA9C4"+
-        "\uA9C5\uA9C6\uA9C7\uA9C8\uA9C9\uA9CA\uA9CB\uA9CC"+
-        "\uA9CD\uA9CE\uA9CF\uA9D0\uA9D1\uA9D3\uA9D4\uA9D5"+
-        "\uA9D6\uA9D7\uA9D8\uA9D9\uA9DA\uA9DB\uA9DC\uA9DD"+
-        "\uA9E1\uA9E2\uA9E3\uA9E4\uA9E5\uA9E6\uA9E7\uA9E8"+
-        "\uA9E9\uA9EA\uA9EB\uA9EC\uA9ED\uA9EE\uA9EF\uA9F0"+
-        "\uA9F1\uA9F3\uA9F4\uA9F5\uA9F6\uA9F7\uA9F8\uA9F9"+
-        "\uA9FA\uA9FB\uA9FC\uA9FD\uAA41\uAA42\uAA43\uAA44"+
-        "\uAA45\uAA46\uAA47\uAA48\uAA49\uAA4A\uAA4B\uAA4C"+
-        "\uAA4D\uAA4E\uAA4F\uAA50\uAA51\uAA53\uAA54\uAA55"+
-        "\uAA56\uAA57\uAA58\uAA59\uAA5A\uAA5B\uAA5C\uAA5D"+
-        "\uAA61\uAA62\uAA63\uAA64\uAA65\uAA66\uAA67\uAA68"+
-        "\uAA69\uAA6A\uAA6B\uAA6C\uAA6D\uAA6E\uAA6F\uAA70"+
-        "\uAA71\uAA73\uAA74\uAA75\uAA76\uAA77\uAA78\uAA79"+
-        "\uAA7A\uAA7B\uAA7C\uAA7D\uAA81\uAA82\uAA83\uAA84"+
-        "\uAA85\uAA86\uAA87\uAA88\uAA89\uAA8A\uAA8B\uAA8C"+
-        "\uAA8D\uAA8E\uAA8F\uAA90\uAA91\uAA93\uAA94\uAA95"+
-        "\uAA96\uAA97\uAA98\uAA99\uAA9A\uAA9B\uAA9C\uAA9D"+
-        "\uAAA1\uAAA2\uAAA3\uAAA4\uAAA5\uAAA6\uAAA7\uAAA8"+
-        "\uAAA9\uAAAA\uAAAB\uAAAC\uAAAD\uAAAE\uAAAF\uAAB0"+
-        "\uAAB1\uAAB3\uAAB4\uAAB5\uAAB6\uAAB7\uAAB8\uAAB9"+
-        "\uAABA\uAABB\uAABC\uAABD\uAAC1\uAAC2\uAAC3\uAAC4"+
-        "\uAAC5\uAAC6\uAAC7\uAAC8\uAAC9\uAACA\uAACB\uAACC"+
-        "\uAACD\uAACE\uAACF\uAAD0\uAAD1\uAAD3\uAAD4\uAAD5"+
-        "\uAAD6\uAAD7\uAAD8\uAAD9\uAADA\uAADB\uAADC\uAADD"+
-        "\uAAE1\uAAE2\uAAE3\uAAE4\uAAE5\uAAE6\uAAE7\uAAE8"+
-        "\uAAE9\uAAEA\uAAEB\uAAEC\uAAED\uAAEE\uAAEF\uAAF0"+
-        "\uAAF1\uAAF3\uAAF4\uAAF5\uAAF6\uAAF7\uAAF8\uAAF9"+
-        "\uAAFA\uAAFB\uAAFC\uAAFD\uAB41\uAB42\uAB43\uAB44"+
-        "\uAB45\uAB46\uAB47\uAB48\uAB49\uAB4A\uAB4B\uAB4C"+
-        "\uAB4D\uAB4E\uAB4F\uAB50\uAB51\uAB53\uAB54\uAB55"+
-        "\uAB56\uAB57\uAB58\uAB59\uAB5A\uAB5B\uAB5C\uAB5D"+
-        "\uAB61\uAB62\uAB63\uAB64\uAB65\uAB66\uAB67\uAB68"+
-        "\uAB69\uAB6A\uAB6B\uAB6C\uAB6D\uAB6E\uAB6F\uAB70"+
-        "\uAB71\uAB73\uAB74\uAB75\uAB76\uAB77\uAB78\uAB79"+
-        "\uAB7A\uAB7B\uAB7C\uAB7D\uAB81\uAB82\uAB83\uAB84"+
-        "\uAB85\uAB86\uAB87\uAB88\uAB89\uAB8A\uAB8B\uAB8C"+
-        "\uAB8D\uAB8E\uAB8F\uAB90\uAB91\uAB93\uAB94\uAB95"+
-        "\uAB96\uAB97\uAB98\uAB99\uAB9A\uAB9B\uAB9C\uAB9D"+
-        "\uABA1\uABA2\uABA3\uABA4\uABA5\uABA6\uABA7\uABA8"+
-        "\uABA9\uABAA\uABAB\uABAC\uABAD\uABAE\uABAF\uABB0"+
-        "\uABB1\uABB3\uABB4\uABB5\uABB6\uABB7\uABB8\uABB9"+
-        "\uABBA\uABBB\uABBC\uABBD\uAC61\uAC62\uAC63\uAC64"+
-        "\uAC65\uAC66\uAC67\uAC68\uAC69\uAC6A\uAC6B\uAC6C"+
-        "\uAC6D\uAC6E\uAC6F\uAC70\uAC71\uAC73\uAC74\uAC75"+
-        "\uAC76\uAC77\uAC78\uAC79\uAC7A\uAC7B\uAC7C\uAC7D"+
-        "\uAC81\uAC82\uAC83\uAC84\uAC85\uAC86\uAC87\uAC88"+
-        "\uAC89\uAC8A\uAC8B\uAC8C\uAC8D\uAC8E\uAC8F\uAC90"+
-        "\uAC91\uAC93\uAC94\uAC95\uAC96\uAC97\uAC98\uAC99"+
-        "\uAC9A\uAC9B\uAC9C\uAC9D\uACA1\uACA2\uACA3\uACA4"+
-        "\uACA5\uACA6\uACA7\uACA8\uACA9\uACAA\uACAB\uACAC"+
-        "\uACAD\uACAE\uACAF\uACB0\uACB1\uACB3\uACB4\uACB5"+
-        "\uACB6\uACB7\uACB8\uACB9\uACBA\uACBB\uACBC\uACBD"+
-        "\uACC1\uACC2\uACC3\uACC4\uACC5\uACC6\uACC7\uACC8"+
-        "\uACC9\uACCA\uACCB\uACCC\uACCD\uACCE\uACCF\uACD0"+
-        "\uACD1\uACD3\uACD4\uACD5\uACD6\uACD7\uACD8\uACD9"+
-        "\uACDA\uACDB\uACDC\uACDD\uACE1\uACE2\uACE3\uACE4"+
-        "\uACE5\uACE6\uACE7\uACE8\uACE9\uACEA\uACEB\uACEC"+
-        "\uACED\uACEE\uACEF\uACF0\uACF1\uACF3\uACF4\uACF5"+
-        "\uACF6\uACF7\uACF8\uACF9\uACFA\uACFB\uACFC\uACFD"+
-        "\uAD41\uAD42\uAD43\uAD44\uAD45\uAD46\uAD47\uAD48"+
-        "\uAD49\uAD4A\uAD4B\uAD4C\uAD4D\uAD4E\uAD4F\uAD50"+
-        "\uAD51\uAD53\uAD54\uAD55\uAD56\uAD57\uAD58\uAD59"+
-        "\uAD5A\uAD5B\uAD5C\uAD5D\uAD61\uAD62\uAD63\uAD64"+
-        "\uAD65\uAD66\uAD67\uAD68\uAD69\uAD6A\uAD6B\uAD6C"+
-        "\uAD6D\uAD6E\uAD6F\uAD70\uAD71\uAD73\uAD74\uAD75"+
-        "\uAD76\uAD77\uAD78\uAD79\uAD7A\uAD7B\uAD7C\uAD7D"+
-        "\uAD81\uAD82\uAD83\uAD84\uAD85\uAD86\uAD87\uAD88"+
-        "\uAD89\uAD8A\uAD8B\uAD8C\uAD8D\uAD8E\uAD8F\uAD90"+
-        "\uAD91\uAD93\uAD94\uAD95\uAD96\uAD97\uAD98\uAD99"+
-        "\uAD9A\uAD9B\uAD9C\uAD9D\uADA1\uADA2\uADA3\uADA4"+
-        "\uADA5\uADA6\uADA7\uADA8\uADA9\uADAA\uADAB\uADAC"+
-        "\uADAD\uADAE\uADAF\uADB0\uADB1\uADB3\uADB4\uADB5"+
-        "\uADB6\uADB7\uADB8\uADB9\uADBA\uADBB\uADBC\uADBD"+
-        "\uADC1\uADC2\uADC3\uADC4\uADC5\uADC6\uADC7\uADC8"+
-        "\uADC9\uADCA\uADCB\uADCC\uADCD\uADCE\uADCF\uADD0"+
-        "\uADD1\uADD3\uADD4\uADD5\uADD6\uADD7\uADD8\uADD9"+
-        "\uADDA\uADDB\uADDC\uADDD\uADE1\uADE2\uADE3\uADE4"+
-        "\uADE5\uADE6\uADE7\uADE8\uADE9\uADEA\uADEB\uADEC"+
-        "\uADED\uADEE\uADEF\uADF0\uADF1\uADF3\uADF4\uADF5"+
-        "\uADF6\uADF7\uADF8\uADF9\uADFA\uADFB\uADFC\uADFD"+
-        "\uAE41\uAE42\uAE43\uAE44\uAE45\uAE46\uAE47\uAE48"+
-        "\uAE49\uAE4A\uAE4B\uAE4C\uAE4D\uAE4E\uAE4F\uAE50"+
-        "\uAE51\uAE53\uAE54\uAE55\uAE56\uAE57\uAE58\uAE59"+
-        "\uAE5A\uAE5B\uAE5C\uAE5D\uAE61\uAE62\uAE63\uAE64"+
-        "\uAE65\uAE66\uAE67\uAE68\uAE69\uAE6A\uAE6B\uAE6C"+
-        "\uAE6D\uAE6E\uAE6F\uAE70\uAE71\uAE73\uAE74\uAE75"+
-        "\uAE76\uAE77\uAE78\uAE79\uAE7A\uAE7B\uAE7C\uAE7D"+
-        "\uAE81\uAE82\uAE83\uAE84\uAE85\uAE86\uAE87\uAE88"+
-        "\uAE89\uAE8A\uAE8B\uAE8C\uAE8D\uAE8E\uAE8F\uAE90"+
-        "\uAE91\uAE93\uAE94\uAE95\uAE96\uAE97\uAE98\uAE99"+
-        "\uAE9A\uAE9B\uAE9C\uAE9D\uAEA1\uAEA2\uAEA3\uAEA4"+
-        "\uAEA5\uAEA6\uAEA7\uAEA8\uAEA9\uAEAA\uAEAB\uAEAC"+
-        "\uAEAD\uAEAE\uAEAF\uAEB0\uAEB1\uAEB3\uAEB4\uAEB5"+
-        "\uAEB6\uAEB7\uAEB8\uAEB9\uAEBA\uAEBB\uAEBC\uAEBD"+
-        "\uAEC1\uAEC2\uAEC3\uAEC4\uAEC5\uAEC6\uAEC7\uAEC8"+
-        "\uAEC9\uAECA\uAECB\uAECC\uAECD\uAECE\uAECF\uAED0"+
-        "\uAED1\uAED3\uAED4\uAED5\uAED6\uAED7\uAED8\uAED9"+
-        "\uAEDA\uAEDB\uAEDC\uAEDD\uAEE1\uAEE2\uAEE3\uAEE4"+
-        "\uAEE5\uAEE6\uAEE7\uAEE8\uAEE9\uAEEA\uAEEB\uAEEC"+
-        "\uAEED\uAEEE\uAEEF\uAEF0\uAEF1\uAEF3\uAEF4\uAEF5"+
-        "\uAEF6\uAEF7\uAEF8\uAEF9\uAEFA\uAEFB\uAEFC\uAEFD"+
-        "\uAF41\uAF42\uAF43\uAF44\uAF45\uAF46\uAF47\uAF48"+
-        "\uAF49\uAF4A\uAF4B\uAF4C\uAF4D\uAF4E\uAF4F\uAF50"+
-        "\uAF51\uAF53\uAF54\uAF55\uAF56\uAF57\uAF58\uAF59"+
-        "\uAF5A\uAF5B\uAF5C\uAF5D\uAF61\uAF62\uAF63\uAF64"+
-        "\uAF65\uAF66\uAF67\uAF68\uAF69\uAF6A\uAF6B\uAF6C"+
-        "\uAF6D\uAF6E\uAF6F\uAF70\uAF71\uAF73\uAF74\uAF75"+
-        "\uAF76\uAF77\uAF78\uAF79\uAF7A\uAF7B\uAF7C\uAF7D"+
-        "\uAF81\uAF82\uAF83\uAF84\uAF85\uAF86\uAF87\uAF88"+
-        "\uAF89\uAF8A\uAF8B\uAF8C\uAF8D\uAF8E\uAF8F\uAF90"+
-        "\uAF91\uAF93\uAF94\uAF95\uAF96\uAF97\uAF98\uAF99"+
-        "\uAF9A\uAF9B\uAF9C\uAF9D\uAFA1\uAFA2\uAFA3\uAFA4"+
-        "\uAFA5\uAFA6\uAFA7\uAFA8\uAFA9\uAFAA\uAFAB\uAFAC"+
-        "\uAFAD\uAFAE\uAFAF\uAFB0\uAFB1\uAFB3\uAFB4\uAFB5"+
-        "\uAFB6\uAFB7\uAFB8\uAFB9\uAFBA\uAFBB\uAFBC\uAFBD"+
-        "\uB061\uB062\uB063\uB064\uB065\uB066\uB067\uB068"+
-        "\uB069\uB06A\uB06B\uB06C\uB06D\uB06E\uB06F\uB070"+
-        "\uB071\uB073\uB074\uB075\uB076\uB077\uB078\uB079"+
-        "\uB07A\uB07B\uB07C\uB07D\uB081\uB082\uB083\uB084"+
-        "\uB085\uB086\uB087\uB088\uB089\uB08A\uB08B\uB08C"+
-        "\uB08D\uB08E\uB08F\uB090\uB091\uB093\uB094\uB095"+
-        "\uB096\uB097\uB098\uB099\uB09A\uB09B\uB09C\uB09D"+
-        "\uB0A1\uB0A2\uB0A3\uB0A4\uB0A5\uB0A6\uB0A7\uB0A8"+
-        "\uB0A9\uB0AA\uB0AB\uB0AC\uB0AD\uB0AE\uB0AF\uB0B0"+
-        "\uB0B1\uB0B3\uB0B4\uB0B5\uB0B6\uB0B7\uB0B8\uB0B9"+
-        "\uB0BA\uB0BB\uB0BC\uB0BD\uB0C1\uB0C2\uB0C3\uB0C4"+
-        "\uB0C5\uB0C6\uB0C7\uB0C8\uB0C9\uB0CA\uB0CB\uB0CC"+
-        "\uB0CD\uB0CE\uB0CF\uB0D0\uB0D1\uB0D3\uB0D4\uB0D5"+
-        "\uB0D6\uB0D7\uB0D8\uB0D9\uB0DA\uB0DB\uB0DC\uB0DD"+
-        "\uB0E1\uB0E2\uB0E3\uB0E4\uB0E5\uB0E6\uB0E7\uB0E8"+
-        "\uB0E9\uB0EA\uB0EB\uB0EC\uB0ED\uB0EE\uB0EF\uB0F0"+
-        "\uB0F1\uB0F3\uB0F4\uB0F5\uB0F6\uB0F7\uB0F8\uB0F9"+
-        "\uB0FA\uB0FB\uB0FC\uB0FD\uB141\uB142\uB143\uB144"+
-        "\uB145\uB146\uB147\uB148\uB149\uB14A\uB14B\uB14C"+
-        "\uB14D\uB14E\uB14F\uB150\uB151\uB153\uB154\uB155"+
-        "\uB156\uB157\uB158\uB159\uB15A\uB15B\uB15C\uB15D"+
-        "\uB161\uB162\uB163\uB164\uB165\uB166\uB167\uB168"+
-        "\uB169\uB16A\uB16B\uB16C\uB16D\uB16E\uB16F\uB170"+
-        "\uB171\uB173\uB174\uB175\uB176\uB177\uB178\uB179"+
-        "\uB17A\uB17B\uB17C\uB17D\uB181\uB182\uB183\uB184"+
-        "\uB185\uB186\uB187\uB188\uB189\uB18A\uB18B\uB18C"+
-        "\uB18D\uB18E\uB18F\uB190\uB191\uB193\uB194\uB195"+
-        "\uB196\uB197\uB198\uB199\uB19A\uB19B\uB19C\uB19D"+
-        "\uB1A1\uB1A2\uB1A3\uB1A4\uB1A5\uB1A6\uB1A7\uB1A8"+
-        "\uB1A9\uB1AA\uB1AB\uB1AC\uB1AD\uB1AE\uB1AF\uB1B0"+
-        "\uB1B1\uB1B3\uB1B4\uB1B5\uB1B6\uB1B7\uB1B8\uB1B9"+
-        "\uB1BA\uB1BB\uB1BC\uB1BD\uB1C1\uB1C2\uB1C3\uB1C4"+
-        "\uB1C5\uB1C6\uB1C7\uB1C8\uB1C9\uB1CA\uB1CB\uB1CC"+
-        "\uB1CD\uB1CE\uB1CF\uB1D0\uB1D1\uB1D3\uB1D4\uB1D5"+
-        "\uB1D6\uB1D7\uB1D8\uB1D9\uB1DA\uB1DB\uB1DC\uB1DD"+
-        "\uB1E1\uB1E2\uB1E3\uB1E4\uB1E5\uB1E6\uB1E7\uB1E8"+
-        "\uB1E9\uB1EA\uB1EB\uB1EC\uB1ED\uB1EE\uB1EF\uB1F0"+
-        "\uB1F1\uB1F3\uB1F4\uB1F5\uB1F6\uB1F7\uB1F8\uB1F9"+
-        "\uB1FA\uB1FB\uB1FC\uB1FD\uB241\uB242\uB243\uB244"+
-        "\uB245\uB246\uB247\uB248\uB249\uB24A\uB24B\uB24C"+
-        "\uB24D\uB24E\uB24F\uB250\uB251\uB253\uB254\uB255"+
-        "\uB256\uB257\uB258\uB259\uB25A\uB25B\uB25C\uB25D"+
-        "\uB261\uB262\uB263\uB264\uB265\uB266\uB267\uB268"+
-        "\uB269\uB26A\uB26B\uB26C\uB26D\uB26E\uB26F\uB270"+
-        "\uB271\uB273\uB274\uB275\uB276\uB277\uB278\uB279"+
-        "\uB27A\uB27B\uB27C\uB27D\uB281\uB282\uB283\uB284"+
-        "\uB285\uB286\uB287\uB288\uB289\uB28A\uB28B\uB28C"+
-        "\uB28D\uB28E\uB28F\uB290\uB291\uB293\uB294\uB295"+
-        "\uB296\uB297\uB298\uB299\uB29A\uB29B\uB29C\uB29D"+
-        "\uB2A1\uB2A2\uB2A3\uB2A4\uB2A5\uB2A6\uB2A7\uB2A8"+
-        "\uB2A9\uB2AA\uB2AB\uB2AC\uB2AD\uB2AE\uB2AF\uB2B0"+
-        "\uB2B1\uB2B3\uB2B4\uB2B5\uB2B6\uB2B7\uB2B8\uB2B9"+
-        "\uB2BA\uB2BB\uB2BC\uB2BD\uB2C1\uB2C2\uB2C3\uB2C4"+
-        "\uB2C5\uB2C6\uB2C7\uB2C8\uB2C9\uB2CA\uB2CB\uB2CC"+
-        "\uB2CD\uB2CE\uB2CF\uB2D0\uB2D1\uB2D3\uB2D4\uB2D5"+
-        "\uB2D6\uB2D7\uB2D8\uB2D9\uB2DA\uB2DB\uB2DC\uB2DD"+
-        "\uB2E1\uB2E2\uB2E3\uB2E4\uB2E5\uB2E6\uB2E7\uB2E8"+
-        "\uB2E9\uB2EA\uB2EB\uB2EC\uB2ED\uB2EE\uB2EF\uB2F0"+
-        "\uB2F1\uB2F3\uB2F4\uB2F5\uB2F6\uB2F7\uB2F8\uB2F9"+
-        "\uB2FA\uB2FB\uB2FC\uB2FD\uB341\uB342\uB343\uB344"+
-        "\uB345\uB346\uB347\uB348\uB349\uB34A\uB34B\uB34C"+
-        "\uB34D\uB34E\uB34F\uB350\uB351\uB353\uB354\uB355"+
-        "\uB356\uB357\uB358\uB359\uB35A\uB35B\uB35C\uB35D"+
-        "\uB361\uB362\uB363\uB364\uB365\uB366\uB367\uB368"+
-        "\uB369\uB36A\uB36B\uB36C\uB36D\uB36E\uB36F\uB370"+
-        "\uB371\uB373\uB374\uB375\uB376\uB377\uB378\uB379"+
-        "\uB37A\uB37B\uB37C\uB37D\uB381\uB382\uB383\uB384"+
-        "\uB385\uB386\uB387\uB388\uB389\uB38A\uB38B\uB38C"+
-        "\uB38D\uB38E\uB38F\uB390\uB391\uB393\uB394\uB395"+
-        "\uB396\uB397\uB398\uB399\uB39A\uB39B\uB39C\uB39D"+
-        "\uB3A1\uB3A2\uB3A3\uB3A4\uB3A5\uB3A6\uB3A7\uB3A8"+
-        "\uB3A9\uB3AA\uB3AB\uB3AC\uB3AD\uB3AE\uB3AF\uB3B0"+
-        "\uB3B1\uB3B3\uB3B4\uB3B5\uB3B6\uB3B7\uB3B8\uB3B9"+
-        "\uB3BA\uB3BB\uB3BC\uB3BD\uB461\uB462\uB463\uB464"+
-        "\uB465\uB466\uB467\uB468\uB469\uB46A\uB46B\uB46C"+
-        "\uB46D\uB46E\uB46F\uB470\uB471\uB473\uB474\uB475"+
-        "\uB476\uB477\uB478\uB479\uB47A\uB47B\uB47C\uB47D"+
-        "\uB481\uB482\uB483\uB484\uB485\uB486\uB487\uB488"+
-        "\uB489\uB48A\uB48B\uB48C\uB48D\uB48E\uB48F\uB490"+
-        "\uB491\uB493\uB494\uB495\uB496\uB497\uB498\uB499"+
-        "\uB49A\uB49B\uB49C\uB49D\uB4A1\uB4A2\uB4A3\uB4A4"+
-        "\uB4A5\uB4A6\uB4A7\uB4A8\uB4A9\uB4AA\uB4AB\uB4AC"+
-        "\uB4AD\uB4AE\uB4AF\uB4B0\uB4B1\uB4B3\uB4B4\uB4B5"+
-        "\uB4B6\uB4B7\uB4B8\uB4B9\uB4BA\uB4BB\uB4BC\uB4BD"+
-        "\uB4C1\uB4C2\uB4C3\uB4C4\uB4C5\uB4C6\uB4C7\uB4C8"+
-        "\uB4C9\uB4CA\uB4CB\uB4CC\uB4CD\uB4CE\uB4CF\uB4D0"+
-        "\uB4D1\uB4D3\uB4D4\uB4D5\uB4D6\uB4D7\uB4D8\uB4D9"+
-        "\uB4DA\uB4DB\uB4DC\uB4DD\uB4E1\uB4E2\uB4E3\uB4E4"+
-        "\uB4E5\uB4E6\uB4E7\uB4E8\uB4E9\uB4EA\uB4EB\uB4EC"+
-        "\uB4ED\uB4EE\uB4EF\uB4F0\uB4F1\uB4F3\uB4F4\uB4F5"+
-        "\uB4F6\uB4F7\uB4F8\uB4F9\uB4FA\uB4FB\uB4FC\uB4FD"+
-        "\uB541\uB542\uB543\uB544\uB545\uB546\uB547\uB548"+
-        "\uB549\uB54A\uB54B\uB54C\uB54D\uB54E\uB54F\uB550"+
-        "\uB551\uB553\uB554\uB555\uB556\uB557\uB558\uB559"+
-        "\uB55A\uB55B\uB55C\uB55D\uB561\uB562\uB563\uB564"+
-        "\uB565\uB566\uB567\uB568\uB569\uB56A\uB56B\uB56C"+
-        "\uB56D\uB56E\uB56F\uB570\uB571\uB573\uB574\uB575"+
-        "\uB576\uB577\uB578\uB579\uB57A\uB57B\uB57C\uB57D"+
-        "\uB581\uB582\uB583\uB584\uB585\uB586\uB587\uB588"+
-        "\uB589\uB58A\uB58B\uB58C\uB58D\uB58E\uB58F\uB590"+
-        "\uB591\uB593\uB594\uB595\uB596\uB597\uB598\uB599"+
-        "\uB59A\uB59B\uB59C\uB59D\uB5A1\uB5A2\uB5A3\uB5A4"+
-        "\uB5A5\uB5A6\uB5A7\uB5A8\uB5A9\uB5AA\uB5AB\uB5AC"+
-        "\uB5AD\uB5AE\uB5AF\uB5B0\uB5B1\uB5B3\uB5B4\uB5B5"+
-        "\uB5B6\uB5B7\uB5B8\uB5B9\uB5BA\uB5BB\uB5BC\uB5BD"+
-        "\uB5C1\uB5C2\uB5C3\uB5C4\uB5C5\uB5C6\uB5C7\uB5C8"+
-        "\uB5C9\uB5CA\uB5CB\uB5CC\uB5CD\uB5CE\uB5CF\uB5D0"+
-        "\uB5D1\uB5D3\uB5D4\uB5D5\uB5D6\uB5D7\uB5D8\uB5D9"+
-        "\uB5DA\uB5DB\uB5DC\uB5DD\uB5E1\uB5E2\uB5E3\uB5E4"+
-        "\uB5E5\uB5E6\uB5E7\uB5E8\uB5E9\uB5EA\uB5EB\uB5EC"+
-        "\uB5ED\uB5EE\uB5EF\uB5F0\uB5F1\uB5F3\uB5F4\uB5F5"+
-        "\uB5F6\uB5F7\uB5F8\uB5F9\uB5FA\uB5FB\uB5FC\uB5FD"+
-        "\uB641\uB642\uB643\uB644\uB645\uB646\uB647\uB648"+
-        "\uB649\uB64A\uB64B\uB64C\uB64D\uB64E\uB64F\uB650"+
-        "\uB651\uB653\uB654\uB655\uB656\uB657\uB658\uB659"+
-        "\uB65A\uB65B\uB65C\uB65D\uB661\uB662\uB663\uB664"+
-        "\uB665\uB666\uB667\uB668\uB669\uB66A\uB66B\uB66C"+
-        "\uB66D\uB66E\uB66F\uB670\uB671\uB673\uB674\uB675"+
-        "\uB676\uB677\uB678\uB679\uB67A\uB67B\uB67C\uB67D"+
-        "\uB681\uB682\uB683\uB684\uB685\uB686\uB687\uB688"+
-        "\uB689\uB68A\uB68B\uB68C\uB68D\uB68E\uB68F\uB690"+
-        "\uB691\uB693\uB694\uB695\uB696\uB697\uB698\uB699"+
-        "\uB69A\uB69B\uB69C\uB69D\uB6A1\uB6A2\uB6A3\uB6A4"+
-        "\uB6A5\uB6A6\uB6A7\uB6A8\uB6A9\uB6AA\uB6AB\uB6AC"+
-        "\uB6AD\uB6AE\uB6AF\uB6B0\uB6B1\uB6B3\uB6B4\uB6B5"+
-        "\uB6B6\uB6B7\uB6B8\uB6B9\uB6BA\uB6BB\uB6BC\uB6BD"+
-        "\uB6C1\uB6C2\uB6C3\uB6C4\uB6C5\uB6C6\uB6C7\uB6C8"+
-        "\uB6C9\uB6CA\uB6CB\uB6CC\uB6CD\uB6CE\uB6CF\uB6D0"+
-        "\uB6D1\uB6D3\uB6D4\uB6D5\uB6D6\uB6D7\uB6D8\uB6D9"+
-        "\uB6DA\uB6DB\uB6DC\uB6DD\uB6E1\uB6E2\uB6E3\uB6E4"+
-        "\uB6E5\uB6E6\uB6E7\uB6E8\uB6E9\uB6EA\uB6EB\uB6EC"+
-        "\uB6ED\uB6EE\uB6EF\uB6F0\uB6F1\uB6F3\uB6F4\uB6F5"+
-        "\uB6F6\uB6F7\uB6F8\uB6F9\uB6FA\uB6FB\uB6FC\uB6FD"+
-        "\uB741\uB742\uB743\uB744\uB745\uB746\uB747\uB748"+
-        "\uB749\uB74A\uB74B\uB74C\uB74D\uB74E\uB74F\uB750"+
-        "\uB751\uB753\uB754\uB755\uB756\uB757\uB758\uB759"+
-        "\uB75A\uB75B\uB75C\uB75D\uB761\uB762\uB763\uB764"+
-        "\uB765\uB766\uB767\uB768\uB769\uB76A\uB76B\uB76C"+
-        "\uB76D\uB76E\uB76F\uB770\uB771\uB773\uB774\uB775"+
-        "\uB776\uB777\uB778\uB779\uB77A\uB77B\uB77C\uB77D"+
-        "\uB781\uB782\uB783\uB784\uB785\uB786\uB787\uB788"+
-        "\uB789\uB78A\uB78B\uB78C\uB78D\uB78E\uB78F\uB790"+
-        "\uB791\uB793\uB794\uB795\uB796\uB797\uB798\uB799"+
-        "\uB79A\uB79B\uB79C\uB79D\uB7A1\uB7A2\uB7A3\uB7A4"+
-        "\uB7A5\uB7A6\uB7A7\uB7A8\uB7A9\uB7AA\uB7AB\uB7AC"+
-        "\uB7AD\uB7AE\uB7AF\uB7B0\uB7B1\uB7B3\uB7B4\uB7B5"+
-        "\uB7B6\uB7B7\uB7B8\uB7B9\uB7BA\uB7BB\uB7BC\uB7BD"+
-        "\uB861\uB862\uB863\uB864\uB865\uB866\uB867\uB868"+
-        "\uB869\uB86A\uB86B\uB86C\uB86D\uB86E\uB86F\uB870"+
-        "\uB871\uB873\uB874\uB875\uB876\uB877\uB878\uB879"+
-        "\uB87A\uB87B\uB87C\uB87D\uB881\uB882\uB883\uB884"+
-        "\uB885\uB886\uB887\uB888\uB889\uB88A\uB88B\uB88C"+
-        "\uB88D\uB88E\uB88F\uB890\uB891\uB893\uB894\uB895"+
-        "\uB896\uB897\uB898\uB899\uB89A\uB89B\uB89C\uB89D"+
-        "\uB8A1\uB8A2\uB8A3\uB8A4\uB8A5\uB8A6\uB8A7\uB8A8"+
-        "\uB8A9\uB8AA\uB8AB\uB8AC\uB8AD\uB8AE\uB8AF\uB8B0"+
-        "\uB8B1\uB8B3\uB8B4\uB8B5\uB8B6\uB8B7\uB8B8\uB8B9"+
-        "\uB8BA\uB8BB\uB8BC\uB8BD\uB8C1\uB8C2\uB8C3\uB8C4"+
-        "\uB8C5\uB8C6\uB8C7\uB8C8\uB8C9\uB8CA\uB8CB\uB8CC"+
-        "\uB8CD\uB8CE\uB8CF\uB8D0\uB8D1\uB8D3\uB8D4\uB8D5"+
-        "\uB8D6\uB8D7\uB8D8\uB8D9\uB8DA\uB8DB\uB8DC\uB8DD"+
-        "\uB8E1\uB8E2\uB8E3\uB8E4\uB8E5\uB8E6\uB8E7\uB8E8"+
-        "\uB8E9\uB8EA\uB8EB\uB8EC\uB8ED\uB8EE\uB8EF\uB8F0"+
-        "\uB8F1\uB8F3\uB8F4\uB8F5\uB8F6\uB8F7\uB8F8\uB8F9"+
-        "\uB8FA\uB8FB\uB8FC\uB8FD\uB941\uB942\uB943\uB944"+
-        "\uB945\uB946\uB947\uB948\uB949\uB94A\uB94B\uB94C"+
-        "\uB94D\uB94E\uB94F\uB950\uB951\uB953\uB954\uB955"+
-        "\uB956\uB957\uB958\uB959\uB95A\uB95B\uB95C\uB95D"+
-        "\uB961\uB962\uB963\uB964\uB965\uB966\uB967\uB968"+
-        "\uB969\uB96A\uB96B\uB96C\uB96D\uB96E\uB96F\uB970"+
-        "\uB971\uB973\uB974\uB975\uB976\uB977\uB978\uB979"+
-        "\uB97A\uB97B\uB97C\uB97D\uB981\uB982\uB983\uB984"+
-        "\uB985\uB986\uB987\uB988\uB989\uB98A\uB98B\uB98C"+
-        "\uB98D\uB98E\uB98F\uB990\uB991\uB993\uB994\uB995"+
-        "\uB996\uB997\uB998\uB999\uB99A\uB99B\uB99C\uB99D"+
-        "\uB9A1\uB9A2\uB9A3\uB9A4\uB9A5\uB9A6\uB9A7\uB9A8"+
-        "\uB9A9\uB9AA\uB9AB\uB9AC\uB9AD\uB9AE\uB9AF\uB9B0"+
-        "\uB9B1\uB9B3\uB9B4\uB9B5\uB9B6\uB9B7\uB9B8\uB9B9"+
-        "\uB9BA\uB9BB\uB9BC\uB9BD\uB9C1\uB9C2\uB9C3\uB9C4"+
-        "\uB9C5\uB9C6\uB9C7\uB9C8\uB9C9\uB9CA\uB9CB\uB9CC"+
-        "\uB9CD\uB9CE\uB9CF\uB9D0\uB9D1\uB9D3\uB9D4\uB9D5"+
-        "\uB9D6\uB9D7\uB9D8\uB9D9\uB9DA\uB9DB\uB9DC\uB9DD"+
-        "\uB9E1\uB9E2\uB9E3\uB9E4\uB9E5\uB9E6\uB9E7\uB9E8"+
-        "\uB9E9\uB9EA\uB9EB\uB9EC\uB9ED\uB9EE\uB9EF\uB9F0"+
-        "\uB9F1\uB9F3\uB9F4\uB9F5\uB9F6\uB9F7\uB9F8\uB9F9"+
-        "\uB9FA\uB9FB\uB9FC\uB9FD\uBA41\uBA42\uBA43\uBA44"+
-        "\uBA45\uBA46\uBA47\uBA48\uBA49\uBA4A\uBA4B\uBA4C"+
-        "\uBA4D\uBA4E\uBA4F\uBA50\uBA51\uBA53\uBA54\uBA55"+
-        "\uBA56\uBA57\uBA58\uBA59\uBA5A\uBA5B\uBA5C\uBA5D"+
-        "\uBA61\uBA62\uBA63\uBA64\uBA65\uBA66\uBA67\uBA68"+
-        "\uBA69\uBA6A\uBA6B\uBA6C\uBA6D\uBA6E\uBA6F\uBA70"+
-        "\uBA71\uBA73\uBA74\uBA75\uBA76\uBA77\uBA78\uBA79"+
-        "\uBA7A\uBA7B\uBA7C\uBA7D\uBA81\uBA82\uBA83\uBA84";
-
-    private final static String innerIndex8=
-        "\uBA85\uBA86\uBA87\uBA88\uBA89\uBA8A\uBA8B\uBA8C"+
-        "\uBA8D\uBA8E\uBA8F\uBA90\uBA91\uBA93\uBA94\uBA95"+
-        "\uBA96\uBA97\uBA98\uBA99\uBA9A\uBA9B\uBA9C\uBA9D"+
-        "\uBAA1\uBAA2\uBAA3\uBAA4\uBAA5\uBAA6\uBAA7\uBAA8"+
-        "\uBAA9\uBAAA\uBAAB\uBAAC\uBAAD\uBAAE\uBAAF\uBAB0"+
-        "\uBAB1\uBAB3\uBAB4\uBAB5\uBAB6\uBAB7\uBAB8\uBAB9"+
-        "\uBABA\uBABB\uBABC\uBABD\uBAC1\uBAC2\uBAC3\uBAC4"+
-        "\uBAC5\uBAC6\uBAC7\uBAC8\uBAC9\uBACA\uBACB\uBACC"+
-        "\uBACD\uBACE\uBACF\uBAD0\uBAD1\uBAD3\uBAD4\uBAD5"+
-        "\uBAD6\uBAD7\uBAD8\uBAD9\uBADA\uBADB\uBADC\uBADD"+
-        "\uBAE1\uBAE2\uBAE3\uBAE4\uBAE5\uBAE6\uBAE7\uBAE8"+
-        "\uBAE9\uBAEA\uBAEB\uBAEC\uBAED\uBAEE\uBAEF\uBAF0"+
-        "\uBAF1\uBAF3\uBAF4\uBAF5\uBAF6\uBAF7\uBAF8\uBAF9"+
-        "\uBAFA\uBAFB\uBAFC\uBAFD\uBB41\uBB42\uBB43\uBB44"+
-        "\uBB45\uBB46\uBB47\uBB48\uBB49\uBB4A\uBB4B\uBB4C"+
-        "\uBB4D\uBB4E\uBB4F\uBB50\uBB51\uBB53\uBB54\uBB55"+
-        "\uBB56\uBB57\uBB58\uBB59\uBB5A\uBB5B\uBB5C\uBB5D"+
-        "\uBB61\uBB62\uBB63\uBB64\uBB65\uBB66\uBB67\uBB68"+
-        "\uBB69\uBB6A\uBB6B\uBB6C\uBB6D\uBB6E\uBB6F\uBB70"+
-        "\uBB71\uBB73\uBB74\uBB75\uBB76\uBB77\uBB78\uBB79"+
-        "\uBB7A\uBB7B\uBB7C\uBB7D\uBB81\uBB82\uBB83\uBB84"+
-        "\uBB85\uBB86\uBB87\uBB88\uBB89\uBB8A\uBB8B\uBB8C"+
-        "\uBB8D\uBB8E\uBB8F\uBB90\uBB91\uBB93\uBB94\uBB95"+
-        "\uBB96\uBB97\uBB98\uBB99\uBB9A\uBB9B\uBB9C\uBB9D"+
-        "\uBBA1\uBBA2\uBBA3\uBBA4\uBBA5\uBBA6\uBBA7\uBBA8"+
-        "\uBBA9\uBBAA\uBBAB\uBBAC\uBBAD\uBBAE\uBBAF\uBBB0"+
-        "\uBBB1\uBBB3\uBBB4\uBBB5\uBBB6\uBBB7\uBBB8\uBBB9"+
-        "\uBBBA\uBBBB\uBBBC\uBBBD\uBC61\uBC62\uBC63\uBC64"+
-        "\uBC65\uBC66\uBC67\uBC68\uBC69\uBC6A\uBC6B\uBC6C"+
-        "\uBC6D\uBC6E\uBC6F\uBC70\uBC71\uBC73\uBC74\uBC75"+
-        "\uBC76\uBC77\uBC78\uBC79\uBC7A\uBC7B\uBC7C\uBC7D"+
-        "\uBC81\uBC82\uBC83\uBC84\uBC85\uBC86\uBC87\uBC88"+
-        "\uBC89\uBC8A\uBC8B\uBC8C\uBC8D\uBC8E\uBC8F\uBC90"+
-        "\uBC91\uBC93\uBC94\uBC95\uBC96\uBC97\uBC98\uBC99"+
-        "\uBC9A\uBC9B\uBC9C\uBC9D\uBCA1\uBCA2\uBCA3\uBCA4"+
-        "\uBCA5\uBCA6\uBCA7\uBCA8\uBCA9\uBCAA\uBCAB\uBCAC"+
-        "\uBCAD\uBCAE\uBCAF\uBCB0\uBCB1\uBCB3\uBCB4\uBCB5"+
-        "\uBCB6\uBCB7\uBCB8\uBCB9\uBCBA\uBCBB\uBCBC\uBCBD"+
-        "\uBCC1\uBCC2\uBCC3\uBCC4\uBCC5\uBCC6\uBCC7\uBCC8"+
-        "\uBCC9\uBCCA\uBCCB\uBCCC\uBCCD\uBCCE\uBCCF\uBCD0"+
-        "\uBCD1\uBCD3\uBCD4\uBCD5\uBCD6\uBCD7\uBCD8\uBCD9"+
-        "\uBCDA\uBCDB\uBCDC\uBCDD\uBCE1\uBCE2\uBCE3\uBCE4"+
-        "\uBCE5\uBCE6\uBCE7\uBCE8\uBCE9\uBCEA\uBCEB\uBCEC"+
-        "\uBCED\uBCEE\uBCEF\uBCF0\uBCF1\uBCF3\uBCF4\uBCF5"+
-        "\uBCF6\uBCF7\uBCF8\uBCF9\uBCFA\uBCFB\uBCFC\uBCFD"+
-        "\uBD41\uBD42\uBD43\uBD44\uBD45\uBD46\uBD47\uBD48"+
-        "\uBD49\uBD4A\uBD4B\uBD4C\uBD4D\uBD4E\uBD4F\uBD50"+
-        "\uBD51\uBD53\uBD54\uBD55\uBD56\uBD57\uBD58\uBD59"+
-        "\uBD5A\uBD5B\uBD5C\uBD5D\uBD61\uBD62\uBD63\uBD64"+
-        "\uBD65\uBD66\uBD67\uBD68\uBD69\uBD6A\uBD6B\uBD6C"+
-        "\uBD6D\uBD6E\uBD6F\uBD70\uBD71\uBD73\uBD74\uBD75"+
-        "\uBD76\uBD77\uBD78\uBD79\uBD7A\uBD7B\uBD7C\uBD7D"+
-        "\uBD81\uBD82\uBD83\uBD84\uBD85\uBD86\uBD87\uBD88"+
-        "\uBD89\uBD8A\uBD8B\uBD8C\uBD8D\uBD8E\uBD8F\uBD90"+
-        "\uBD91\uBD93\uBD94\uBD95\uBD96\uBD97\uBD98\uBD99"+
-        "\uBD9A\uBD9B\uBD9C\uBD9D\uBDA1\uBDA2\uBDA3\uBDA4"+
-        "\uBDA5\uBDA6\uBDA7\uBDA8\uBDA9\uBDAA\uBDAB\uBDAC"+
-        "\uBDAD\uBDAE\uBDAF\uBDB0\uBDB1\uBDB3\uBDB4\uBDB5"+
-        "\uBDB6\uBDB7\uBDB8\uBDB9\uBDBA\uBDBB\uBDBC\uBDBD"+
-        "\uBDC1\uBDC2\uBDC3\uBDC4\uBDC5\uBDC6\uBDC7\uBDC8"+
-        "\uBDC9\uBDCA\uBDCB\uBDCC\uBDCD\uBDCE\uBDCF\uBDD0"+
-        "\uBDD1\uBDD3\uBDD4\uBDD5\uBDD6\uBDD7\uBDD8\uBDD9"+
-        "\uBDDA\uBDDB\uBDDC\uBDDD\uBDE1\uBDE2\uBDE3\uBDE4"+
-        "\uBDE5\uBDE6\uBDE7\uBDE8\uBDE9\uBDEA\uBDEB\uBDEC"+
-        "\uBDED\uBDEE\uBDEF\uBDF0\uBDF1\uBDF3\uBDF4\uBDF5"+
-        "\uBDF6\uBDF7\uBDF8\uBDF9\uBDFA\uBDFB\uBDFC\uBDFD"+
-        "\uBE41\uBE42\uBE43\uBE44\uBE45\uBE46\uBE47\uBE48"+
-        "\uBE49\uBE4A\uBE4B\uBE4C\uBE4D\uBE4E\uBE4F\uBE50"+
-        "\uBE51\uBE53\uBE54\uBE55\uBE56\uBE57\uBE58\uBE59"+
-        "\uBE5A\uBE5B\uBE5C\uBE5D\uBE61\uBE62\uBE63\uBE64"+
-        "\uBE65\uBE66\uBE67\uBE68\uBE69\uBE6A\uBE6B\uBE6C"+
-        "\uBE6D\uBE6E\uBE6F\uBE70\uBE71\uBE73\uBE74\uBE75"+
-        "\uBE76\uBE77\uBE78\uBE79\uBE7A\uBE7B\uBE7C\uBE7D"+
-        "\uBE81\uBE82\uBE83\uBE84\uBE85\uBE86\uBE87\uBE88"+
-        "\uBE89\uBE8A\uBE8B\uBE8C\uBE8D\uBE8E\uBE8F\uBE90"+
-        "\uBE91\uBE93\uBE94\uBE95\uBE96\uBE97\uBE98\uBE99"+
-        "\uBE9A\uBE9B\uBE9C\uBE9D\uBEA1\uBEA2\uBEA3\uBEA4"+
-        "\uBEA5\uBEA6\uBEA7\uBEA8\uBEA9\uBEAA\uBEAB\uBEAC"+
-        "\uBEAD\uBEAE\uBEAF\uBEB0\uBEB1\uBEB3\uBEB4\uBEB5"+
-        "\uBEB6\uBEB7\uBEB8\uBEB9\uBEBA\uBEBB\uBEBC\uBEBD"+
-        "\uBEC1\uBEC2\uBEC3\uBEC4\uBEC5\uBEC6\uBEC7\uBEC8"+
-        "\uBEC9\uBECA\uBECB\uBECC\uBECD\uBECE\uBECF\uBED0"+
-        "\uBED1\uBED3\uBED4\uBED5\uBED6\uBED7\uBED8\uBED9"+
-        "\uBEDA\uBEDB\uBEDC\uBEDD\uBEE1\uBEE2\uBEE3\uBEE4"+
-        "\uBEE5\uBEE6\uBEE7\uBEE8\uBEE9\uBEEA\uBEEB\uBEEC"+
-        "\uBEED\uBEEE\uBEEF\uBEF0\uBEF1\uBEF3\uBEF4\uBEF5"+
-        "\uBEF6\uBEF7\uBEF8\uBEF9\uBEFA\uBEFB\uBEFC\uBEFD"+
-        "\uBF41\uBF42\uBF43\uBF44\uBF45\uBF46\uBF47\uBF48"+
-        "\uBF49\uBF4A\uBF4B\uBF4C\uBF4D\uBF4E\uBF4F\uBF50"+
-        "\uBF51\uBF53\uBF54\uBF55\uBF56\uBF57\uBF58\uBF59"+
-        "\uBF5A\uBF5B\uBF5C\uBF5D\uBF61\uBF62\uBF63\uBF64"+
-        "\uBF65\uBF66\uBF67\uBF68\uBF69\uBF6A\uBF6B\uBF6C"+
-        "\uBF6D\uBF6E\uBF6F\uBF70\uBF71\uBF73\uBF74\uBF75"+
-        "\uBF76\uBF77\uBF78\uBF79\uBF7A\uBF7B\uBF7C\uBF7D"+
-        "\uBF81\uBF82\uBF83\uBF84\uBF85\uBF86\uBF87\uBF88"+
-        "\uBF89\uBF8A\uBF8B\uBF8C\uBF8D\uBF8E\uBF8F\uBF90"+
-        "\uBF91\uBF93\uBF94\uBF95\uBF96\uBF97\uBF98\uBF99"+
-        "\uBF9A\uBF9B\uBF9C\uBF9D\uBFA1\uBFA2\uBFA3\uBFA4"+
-        "\uBFA5\uBFA6\uBFA7\uBFA8\uBFA9\uBFAA\uBFAB\uBFAC"+
-        "\uBFAD\uBFAE\uBFAF\uBFB0\uBFB1\uBFB3\uBFB4\uBFB5"+
-        "\uBFB6\uBFB7\uBFB8\uBFB9\uBFBA\uBFBB\uBFBC\uBFBD"+
-        "\uC061\uC062\uC063\uC064\uC065\uC066\uC067\uC068"+
-        "\uC069\uC06A\uC06B\uC06C\uC06D\uC06E\uC06F\uC070"+
-        "\uC071\uC073\uC074\uC075\uC076\uC077\uC078\uC079"+
-        "\uC07A\uC07B\uC07C\uC07D\uC081\uC082\uC083\uC084"+
-        "\uC085\uC086\uC087\uC088\uC089\uC08A\uC08B\uC08C"+
-        "\uC08D\uC08E\uC08F\uC090\uC091\uC093\uC094\uC095"+
-        "\uC096\uC097\uC098\uC099\uC09A\uC09B\uC09C\uC09D"+
-        "\uC0A1\uC0A2\uC0A3\uC0A4\uC0A5\uC0A6\uC0A7\uC0A8"+
-        "\uC0A9\uC0AA\uC0AB\uC0AC\uC0AD\uC0AE\uC0AF\uC0B0"+
-        "\uC0B1\uC0B3\uC0B4\uC0B5\uC0B6\uC0B7\uC0B8\uC0B9"+
-        "\uC0BA\uC0BB\uC0BC\uC0BD\uC0C1\uC0C2\uC0C3\uC0C4"+
-        "\uC0C5\uC0C6\uC0C7\uC0C8\uC0C9\uC0CA\uC0CB\uC0CC"+
-        "\uC0CD\uC0CE\uC0CF\uC0D0\uC0D1\uC0D3\uC0D4\uC0D5"+
-        "\uC0D6\uC0D7\uC0D8\uC0D9\uC0DA\uC0DB\uC0DC\uC0DD"+
-        "\uC0E1\uC0E2\uC0E3\uC0E4\uC0E5\uC0E6\uC0E7\uC0E8"+
-        "\uC0E9\uC0EA\uC0EB\uC0EC\uC0ED\uC0EE\uC0EF\uC0F0"+
-        "\uC0F1\uC0F3\uC0F4\uC0F5\uC0F6\uC0F7\uC0F8\uC0F9"+
-        "\uC0FA\uC0FB\uC0FC\uC0FD\uC141\uC142\uC143\uC144"+
-        "\uC145\uC146\uC147\uC148\uC149\uC14A\uC14B\uC14C"+
-        "\uC14D\uC14E\uC14F\uC150\uC151\uC153\uC154\uC155"+
-        "\uC156\uC157\uC158\uC159\uC15A\uC15B\uC15C\uC15D"+
-        "\uC161\uC162\uC163\uC164\uC165\uC166\uC167\uC168"+
-        "\uC169\uC16A\uC16B\uC16C\uC16D\uC16E\uC16F\uC170"+
-        "\uC171\uC173\uC174\uC175\uC176\uC177\uC178\uC179"+
-        "\uC17A\uC17B\uC17C\uC17D\uC181\uC182\uC183\uC184"+
-        "\uC185\uC186\uC187\uC188\uC189\uC18A\uC18B\uC18C"+
-        "\uC18D\uC18E\uC18F\uC190\uC191\uC193\uC194\uC195"+
-        "\uC196\uC197\uC198\uC199\uC19A\uC19B\uC19C\uC19D"+
-        "\uC1A1\uC1A2\uC1A3\uC1A4\uC1A5\uC1A6\uC1A7\uC1A8"+
-        "\uC1A9\uC1AA\uC1AB\uC1AC\uC1AD\uC1AE\uC1AF\uC1B0"+
-        "\uC1B1\uC1B3\uC1B4\uC1B5\uC1B6\uC1B7\uC1B8\uC1B9"+
-        "\uC1BA\uC1BB\uC1BC\uC1BD\uC1C1\uC1C2\uC1C3\uC1C4"+
-        "\uC1C5\uC1C6\uC1C7\uC1C8\uC1C9\uC1CA\uC1CB\uC1CC"+
-        "\uC1CD\uC1CE\uC1CF\uC1D0\uC1D1\uC1D3\uC1D4\uC1D5"+
-        "\uC1D6\uC1D7\uC1D8\uC1D9\uC1DA\uC1DB\uC1DC\uC1DD"+
-        "\uC1E1\uC1E2\uC1E3\uC1E4\uC1E5\uC1E6\uC1E7\uC1E8"+
-        "\uC1E9\uC1EA\uC1EB\uC1EC\uC1ED\uC1EE\uC1EF\uC1F0"+
-        "\uC1F1\uC1F3\uC1F4\uC1F5\uC1F6\uC1F7\uC1F8\uC1F9"+
-        "\uC1FA\uC1FB\uC1FC\uC1FD\uC241\uC242\uC243\uC244"+
-        "\uC245\uC246\uC247\uC248\uC249\uC24A\uC24B\uC24C"+
-        "\uC24D\uC24E\uC24F\uC250\uC251\uC253\uC254\uC255"+
-        "\uC256\uC257\uC258\uC259\uC25A\uC25B\uC25C\uC25D"+
-        "\uC261\uC262\uC263\uC264\uC265\uC266\uC267\uC268"+
-        "\uC269\uC26A\uC26B\uC26C\uC26D\uC26E\uC26F\uC270"+
-        "\uC271\uC273\uC274\uC275\uC276\uC277\uC278\uC279"+
-        "\uC27A\uC27B\uC27C\uC27D\uC281\uC282\uC283\uC284"+
-        "\uC285\uC286\uC287\uC288\uC289\uC28A\uC28B\uC28C"+
-        "\uC28D\uC28E\uC28F\uC290\uC291\uC293\uC294\uC295"+
-        "\uC296\uC297\uC298\uC299\uC29A\uC29B\uC29C\uC29D"+
-        "\uC2A1\uC2A2\uC2A3\uC2A4\uC2A5\uC2A6\uC2A7\uC2A8"+
-        "\uC2A9\uC2AA\uC2AB\uC2AC\uC2AD\uC2AE\uC2AF\uC2B0"+
-        "\uC2B1\uC2B3\uC2B4\uC2B5\uC2B6\uC2B7\uC2B8\uC2B9"+
-        "\uC2BA\uC2BB\uC2BC\uC2BD\uC2C1\uC2C2\uC2C3\uC2C4"+
-        "\uC2C5\uC2C6\uC2C7\uC2C8\uC2C9\uC2CA\uC2CB\uC2CC"+
-        "\uC2CD\uC2CE\uC2CF\uC2D0\uC2D1\uC2D3\uC2D4\uC2D5"+
-        "\uC2D6\uC2D7\uC2D8\uC2D9\uC2DA\uC2DB\uC2DC\uC2DD"+
-        "\uC2E1\uC2E2\uC2E3\uC2E4\uC2E5\uC2E6\uC2E7\uC2E8"+
-        "\uC2E9\uC2EA\uC2EB\uC2EC\uC2ED\uC2EE\uC2EF\uC2F0"+
-        "\uC2F1\uC2F3\uC2F4\uC2F5\uC2F6\uC2F7\uC2F8\uC2F9"+
-        "\uC2FA\uC2FB\uC2FC\uC2FD\uC341\uC342\uC343\uC344"+
-        "\uC345\uC346\uC347\uC348\uC349\uC34A\uC34B\uC34C"+
-        "\uC34D\uC34E\uC34F\uC350\uC351\uC353\uC354\uC355"+
-        "\uC356\uC357\uC358\uC359\uC35A\uC35B\uC35C\uC35D"+
-        "\uC361\uC362\uC363\uC364\uC365\uC366\uC367\uC368"+
-        "\uC369\uC36A\uC36B\uC36C\uC36D\uC36E\uC36F\uC370"+
-        "\uC371\uC373\uC374\uC375\uC376\uC377\uC378\uC379"+
-        "\uC37A\uC37B\uC37C\uC37D\uC381\uC382\uC383\uC384"+
-        "\uC385\uC386\uC387\uC388\uC389\uC38A\uC38B\uC38C"+
-        "\uC38D\uC38E\uC38F\uC390\uC391\uC393\uC394\uC395"+
-        "\uC396\uC397\uC398\uC399\uC39A\uC39B\uC39C\uC39D"+
-        "\uC3A1\uC3A2\uC3A3\uC3A4\uC3A5\uC3A6\uC3A7\uC3A8"+
-        "\uC3A9\uC3AA\uC3AB\uC3AC\uC3AD\uC3AE\uC3AF\uC3B0"+
-        "\uC3B1\uC3B3\uC3B4\uC3B5\uC3B6\uC3B7\uC3B8\uC3B9"+
-        "\uC3BA\uC3BB\uC3BC\uC3BD\uC461\uC462\uC463\uC464"+
-        "\uC465\uC466\uC467\uC468\uC469\uC46A\uC46B\uC46C"+
-        "\uC46D\uC46E\uC46F\uC470\uC471\uC473\uC474\uC475"+
-        "\uC476\uC477\uC478\uC479\uC47A\uC47B\uC47C\uC47D"+
-        "\uC481\uC482\uC483\uC484\uC485\uC486\uC487\uC488"+
-        "\uC489\uC48A\uC48B\uC48C\uC48D\uC48E\uC48F\uC490"+
-        "\uC491\uC493\uC494\uC495\uC496\uC497\uC498\uC499"+
-        "\uC49A\uC49B\uC49C\uC49D\uC4A1\uC4A2\uC4A3\uC4A4"+
-        "\uC4A5\uC4A6\uC4A7\uC4A8\uC4A9\uC4AA\uC4AB\uC4AC"+
-        "\uC4AD\uC4AE\uC4AF\uC4B0\uC4B1\uC4B3\uC4B4\uC4B5"+
-        "\uC4B6\uC4B7\uC4B8\uC4B9\uC4BA\uC4BB\uC4BC\uC4BD"+
-        "\uC4C1\uC4C2\uC4C3\uC4C4\uC4C5\uC4C6\uC4C7\uC4C8"+
-        "\uC4C9\uC4CA\uC4CB\uC4CC\uC4CD\uC4CE\uC4CF\uC4D0"+
-        "\uC4D1\uC4D3\uC4D4\uC4D5\uC4D6\uC4D7\uC4D8\uC4D9"+
-        "\uC4DA\uC4DB\uC4DC\uC4DD\uC4E1\uC4E2\uC4E3\uC4E4"+
-        "\uC4E5\uC4E6\uC4E7\uC4E8\uC4E9\uC4EA\uC4EB\uC4EC"+
-        "\uC4ED\uC4EE\uC4EF\uC4F0\uC4F1\uC4F3\uC4F4\uC4F5"+
-        "\uC4F6\uC4F7\uC4F8\uC4F9\uC4FA\uC4FB\uC4FC\uC4FD"+
-        "\uC541\uC542\uC543\uC544\uC545\uC546\uC547\uC548"+
-        "\uC549\uC54A\uC54B\uC54C\uC54D\uC54E\uC54F\uC550"+
-        "\uC551\uC553\uC554\uC555\uC556\uC557\uC558\uC559"+
-        "\uC55A\uC55B\uC55C\uC55D\uC561\uC562\uC563\uC564"+
-        "\uC565\uC566\uC567\uC568\uC569\uC56A\uC56B\uC56C"+
-        "\uC56D\uC56E\uC56F\uC570\uC571\uC573\uC574\uC575"+
-        "\uC576\uC577\uC578\uC579\uC57A\uC57B\uC57C\uC57D"+
-        "\uC581\uC582\uC583\uC584\uC585\uC586\uC587\uC588"+
-        "\uC589\uC58A\uC58B\uC58C\uC58D\uC58E\uC58F\uC590"+
-        "\uC591\uC593\uC594\uC595\uC596\uC597\uC598\uC599"+
-        "\uC59A\uC59B\uC59C\uC59D\uC5A1\uC5A2\uC5A3\uC5A4"+
-        "\uC5A5\uC5A6\uC5A7\uC5A8\uC5A9\uC5AA\uC5AB\uC5AC"+
-        "\uC5AD\uC5AE\uC5AF\uC5B0\uC5B1\uC5B3\uC5B4\uC5B5"+
-        "\uC5B6\uC5B7\uC5B8\uC5B9\uC5BA\uC5BB\uC5BC\uC5BD"+
-        "\uC5C1\uC5C2\uC5C3\uC5C4\uC5C5\uC5C6\uC5C7\uC5C8"+
-        "\uC5C9\uC5CA\uC5CB\uC5CC\uC5CD\uC5CE\uC5CF\uC5D0"+
-        "\uC5D1\uC5D3\uC5D4\uC5D5\uC5D6\uC5D7\uC5D8\uC5D9"+
-        "\uC5DA\uC5DB\uC5DC\uC5DD\uC5E1\uC5E2\uC5E3\uC5E4"+
-        "\uC5E5\uC5E6\uC5E7\uC5E8\uC5E9\uC5EA\uC5EB\uC5EC"+
-        "\uC5ED\uC5EE\uC5EF\uC5F0\uC5F1\uC5F3\uC5F4\uC5F5"+
-        "\uC5F6\uC5F7\uC5F8\uC5F9\uC5FA\uC5FB\uC5FC\uC5FD"+
-        "\uC641\uC642\uC643\uC644\uC645\uC646\uC647\uC648"+
-        "\uC649\uC64A\uC64B\uC64C\uC64D\uC64E\uC64F\uC650"+
-        "\uC651\uC653\uC654\uC655\uC656\uC657\uC658\uC659"+
-        "\uC65A\uC65B\uC65C\uC65D\uC661\uC662\uC663\uC664"+
-        "\uC665\uC666\uC667\uC668\uC669\uC66A\uC66B\uC66C"+
-        "\uC66D\uC66E\uC66F\uC670\uC671\uC673\uC674\uC675"+
-        "\uC676\uC677\uC678\uC679\uC67A\uC67B\uC67C\uC67D"+
-        "\uC681\uC682\uC683\uC684\uC685\uC686\uC687\uC688"+
-        "\uC689\uC68A\uC68B\uC68C\uC68D\uC68E\uC68F\uC690"+
-        "\uC691\uC693\uC694\uC695\uC696\uC697\uC698\uC699"+
-        "\uC69A\uC69B\uC69C\uC69D\uC6A1\uC6A2\uC6A3\uC6A4"+
-        "\uC6A5\uC6A6\uC6A7\uC6A8\uC6A9\uC6AA\uC6AB\uC6AC"+
-        "\uC6AD\uC6AE\uC6AF\uC6B0\uC6B1\uC6B3\uC6B4\uC6B5"+
-        "\uC6B6\uC6B7\uC6B8\uC6B9\uC6BA\uC6BB\uC6BC\uC6BD"+
-        "\uC6C1\uC6C2\uC6C3\uC6C4\uC6C5\uC6C6\uC6C7\uC6C8"+
-        "\uC6C9\uC6CA\uC6CB\uC6CC\uC6CD\uC6CE\uC6CF\uC6D0"+
-        "\uC6D1\uC6D3\uC6D4\uC6D5\uC6D6\uC6D7\uC6D8\uC6D9"+
-        "\uC6DA\uC6DB\uC6DC\uC6DD\uC6E1\uC6E2\uC6E3\uC6E4"+
-        "\uC6E5\uC6E6\uC6E7\uC6E8\uC6E9\uC6EA\uC6EB\uC6EC"+
-        "\uC6ED\uC6EE\uC6EF\uC6F0\uC6F1\uC6F3\uC6F4\uC6F5"+
-        "\uC6F6\uC6F7\uC6F8\uC6F9\uC6FA\uC6FB\uC6FC\uC6FD"+
-        "\uC741\uC742\uC743\uC744\uC745\uC746\uC747\uC748"+
-        "\uC749\uC74A\uC74B\uC74C\uC74D\uC74E\uC74F\uC750"+
-        "\uC751\uC753\uC754\uC755\uC756\uC757\uC758\uC759"+
-        "\uC75A\uC75B\uC75C\uC75D\uC761\uC762\uC763\uC764"+
-        "\uC765\uC766\uC767\uC768\uC769\uC76A\uC76B\uC76C"+
-        "\uC76D\uC76E\uC76F\uC770\uC771\uC773\uC774\uC775"+
-        "\uC776\uC777\uC778\uC779\uC77A\uC77B\uC77C\uC77D"+
-        "\uC781\uC782\uC783\uC784\uC785\uC786\uC787\uC788"+
-        "\uC789\uC78A\uC78B\uC78C\uC78D\uC78E\uC78F\uC790"+
-        "\uC791\uC793\uC794\uC795\uC796\uC797\uC798\uC799"+
-        "\uC79A\uC79B\uC79C\uC79D\uC7A1\uC7A2\uC7A3\uC7A4"+
-        "\uC7A5\uC7A6\uC7A7\uC7A8\uC7A9\uC7AA\uC7AB\uC7AC"+
-        "\uC7AD\uC7AE\uC7AF\uC7B0\uC7B1\uC7B3\uC7B4\uC7B5"+
-        "\uC7B6\uC7B7\uC7B8\uC7B9\uC7BA\uC7BB\uC7BC\uC7BD"+
-        "\uC861\uC862\uC863\uC864\uC865\uC866\uC867\uC868"+
-        "\uC869\uC86A\uC86B\uC86C\uC86D\uC86E\uC86F\uC870"+
-        "\uC871\uC873\uC874\uC875\uC876\uC877\uC878\uC879"+
-        "\uC87A\uC87B\uC87C\uC87D\uC881\uC882\uC883\uC884"+
-        "\uC885\uC886\uC887\uC888\uC889\uC88A\uC88B\uC88C"+
-        "\uC88D\uC88E\uC88F\uC890\uC891\uC893\uC894\uC895"+
-        "\uC896\uC897\uC898\uC899\uC89A\uC89B\uC89C\uC89D"+
-        "\uC8A1\uC8A2\uC8A3\uC8A4\uC8A5\uC8A6\uC8A7\uC8A8"+
-        "\uC8A9\uC8AA\uC8AB\uC8AC\uC8AD\uC8AE\uC8AF\uC8B0"+
-        "\uC8B1\uC8B3\uC8B4\uC8B5\uC8B6\uC8B7\uC8B8\uC8B9"+
-        "\uC8BA\uC8BB\uC8BC\uC8BD\uC8C1\uC8C2\uC8C3\uC8C4"+
-        "\uC8C5\uC8C6\uC8C7\uC8C8\uC8C9\uC8CA\uC8CB\uC8CC"+
-        "\uC8CD\uC8CE\uC8CF\uC8D0\uC8D1\uC8D3\uC8D4\uC8D5"+
-        "\uC8D6\uC8D7\uC8D8\uC8D9\uC8DA\uC8DB\uC8DC\uC8DD"+
-        "\uC8E1\uC8E2\uC8E3\uC8E4\uC8E5\uC8E6\uC8E7\uC8E8"+
-        "\uC8E9\uC8EA\uC8EB\uC8EC\uC8ED\uC8EE\uC8EF\uC8F0"+
-        "\uC8F1\uC8F3\uC8F4\uC8F5\uC8F6\uC8F7\uC8F8\uC8F9"+
-        "\uC8FA\uC8FB\uC8FC\uC8FD\uC941\uC942\uC943\uC944"+
-        "\uC945\uC946\uC947\uC948\uC949\uC94A\uC94B\uC94C"+
-        "\uC94D\uC94E\uC94F\uC950\uC951\uC953\uC954\uC955"+
-        "\uC956\uC957\uC958\uC959\uC95A\uC95B\uC95C\uC95D"+
-        "\uC961\uC962\uC963\uC964\uC965\uC966\uC967\uC968"+
-        "\uC969\uC96A\uC96B\uC96C\uC96D\uC96E\uC96F\uC970"+
-        "\uC971\uC973\uC974\uC975\uC976\uC977\uC978\uC979"+
-        "\uC97A\uC97B\uC97C\uC97D\uC981\uC982\uC983\uC984"+
-        "\uC985\uC986\uC987\uC988\uC989\uC98A\uC98B\uC98C"+
-        "\uC98D\uC98E\uC98F\uC990\uC991\uC993\uC994\uC995"+
-        "\uC996\uC997\uC998\uC999\uC99A\uC99B\uC99C\uC99D"+
-        "\uC9A1\uC9A2\uC9A3\uC9A4\uC9A5\uC9A6\uC9A7\uC9A8"+
-        "\uC9A9\uC9AA\uC9AB\uC9AC\uC9AD\uC9AE\uC9AF\uC9B0"+
-        "\uC9B1\uC9B3\uC9B4\uC9B5\uC9B6\uC9B7\uC9B8\uC9B9"+
-        "\uC9BA\uC9BB\uC9BC\uC9BD\uC9C1\uC9C2\uC9C3\uC9C4"+
-        "\uC9C5\uC9C6\uC9C7\uC9C8\uC9C9\uC9CA\uC9CB\uC9CC"+
-        "\uC9CD\uC9CE\uC9CF\uC9D0\uC9D1\uC9D3\uC9D4\uC9D5"+
-        "\uC9D6\uC9D7\uC9D8\uC9D9\uC9DA\uC9DB\uC9DC\uC9DD"+
-        "\uC9E1\uC9E2\uC9E3\uC9E4\uC9E5\uC9E6\uC9E7\uC9E8"+
-        "\uC9E9\uC9EA\uC9EB\uC9EC\uC9ED\uC9EE\uC9EF\uC9F0"+
-        "\uC9F1\uC9F3\uC9F4\uC9F5\uC9F6\uC9F7\uC9F8\uC9F9"+
-        "\uC9FA\uC9FB\uC9FC\uC9FD\uCA41\uCA42\uCA43\uCA44"+
-        "\uCA45\uCA46\uCA47\uCA48\uCA49\uCA4A\uCA4B\uCA4C"+
-        "\uCA4D\uCA4E\uCA4F\uCA50\uCA51\uCA53\uCA54\uCA55"+
-        "\uCA56\uCA57\uCA58\uCA59\uCA5A\uCA5B\uCA5C\uCA5D"+
-        "\uCA61\uCA62\uCA63\uCA64\uCA65\uCA66\uCA67\uCA68"+
-        "\uCA69\uCA6A\uCA6B\uCA6C\uCA6D\uCA6E\uCA6F\uCA70"+
-        "\uCA71\uCA73\uCA74\uCA75\uCA76\uCA77\uCA78\uCA79"+
-        "\uCA7A\uCA7B\uCA7C\uCA7D\uCA81\uCA82\uCA83\uCA84"+
-        "\uCA85\uCA86\uCA87\uCA88\uCA89\uCA8A\uCA8B\uCA8C"+
-        "\uCA8D\uCA8E\uCA8F\uCA90\uCA91\uCA93\uCA94\uCA95"+
-        "\uCA96\uCA97\uCA98\uCA99\uCA9A\uCA9B\uCA9C\uCA9D"+
-        "\uCAA1\uCAA2\uCAA3\uCAA4\uCAA5\uCAA6\uCAA7\uCAA8"+
-        "\uCAA9\uCAAA\uCAAB\uCAAC\uCAAD\uCAAE\uCAAF\uCAB0"+
-        "\uCAB1\uCAB3\uCAB4\uCAB5\uCAB6\uCAB7\uCAB8\uCAB9"+
-        "\uCABA\uCABB\uCABC\uCABD\uCAC1\uCAC2\uCAC3\uCAC4"+
-        "\uCAC5\uCAC6\uCAC7\uCAC8\uCAC9\uCACA\uCACB\uCACC"+
-        "\uCACD\uCACE\uCACF\uCAD0\uCAD1\uCAD3\uCAD4\uCAD5"+
-        "\uCAD6\uCAD7\uCAD8\uCAD9\uCADA\uCADB\uCADC\uCADD"+
-        "\uCAE1\uCAE2\uCAE3\uCAE4\uCAE5\uCAE6\uCAE7\uCAE8"+
-        "\uCAE9\uCAEA\uCAEB\uCAEC\uCAED\uCAEE\uCAEF\uCAF0"+
-        "\uCAF1\uCAF3\uCAF4\uCAF5\uCAF6\uCAF7\uCAF8\uCAF9"+
-        "\uCAFA\uCAFB\uCAFC\uCAFD\uCB41\uCB42\uCB43\uCB44"+
-        "\uCB45\uCB46\uCB47\uCB48\uCB49\uCB4A\uCB4B\uCB4C"+
-        "\uCB4D\uCB4E\uCB4F\uCB50\uCB51\uCB53\uCB54\uCB55"+
-        "\uCB56\uCB57\uCB58\uCB59\uCB5A\uCB5B\uCB5C\uCB5D"+
-        "\uCB61\uCB62\uCB63\uCB64\uCB65\uCB66\uCB67\uCB68"+
-        "\uCB69\uCB6A\uCB6B\uCB6C\uCB6D\uCB6E\uCB6F\uCB70"+
-        "\uCB71\uCB73\uCB74\uCB75\uCB76\uCB77\uCB78\uCB79"+
-        "\uCB7A\uCB7B\uCB7C\uCB7D\uCB81\uCB82\uCB83\uCB84"+
-        "\uCB85\uCB86\uCB87\uCB88\uCB89\uCB8A\uCB8B\uCB8C"+
-        "\uCB8D\uCB8E\uCB8F\uCB90\uCB91\uCB93\uCB94\uCB95"+
-        "\uCB96\uCB97\uCB98\uCB99\uCB9A\uCB9B\uCB9C\uCB9D"+
-        "\uCBA1\uCBA2\uCBA3\uCBA4\uCBA5\uCBA6\uCBA7\uCBA8"+
-        "\uCBA9\uCBAA\uCBAB\uCBAC\uCBAD\uCBAE\uCBAF\uCBB0"+
-        "\uCBB1\uCBB3\uCBB4\uCBB5\uCBB6\uCBB7\uCBB8\uCBB9"+
-        "\uCBBA\uCBBB\uCBBC\uCBBD\uCC61\uCC62\uCC63\uCC64"+
-        "\uCC65\uCC66\uCC67\uCC68\uCC69\uCC6A\uCC6B\uCC6C"+
-        "\uCC6D\uCC6E\uCC6F\uCC70\uCC71\uCC73\uCC74\uCC75"+
-        "\uCC76\uCC77\uCC78\uCC79\uCC7A\uCC7B\uCC7C\uCC7D"+
-        "\uCC81\uCC82\uCC83\uCC84\uCC85\uCC86\uCC87\uCC88"+
-        "\uCC89\uCC8A\uCC8B\uCC8C\uCC8D\uCC8E\uCC8F\uCC90"+
-        "\uCC91\uCC93\uCC94\uCC95\uCC96\uCC97\uCC98\uCC99"+
-        "\uCC9A\uCC9B\uCC9C\uCC9D\uCCA1\uCCA2\uCCA3\uCCA4"+
-        "\uCCA5\uCCA6\uCCA7\uCCA8\uCCA9\uCCAA\uCCAB\uCCAC"+
-        "\uCCAD\uCCAE\uCCAF\uCCB0\uCCB1\uCCB3\uCCB4\uCCB5"+
-        "\uCCB6\uCCB7\uCCB8\uCCB9\uCCBA\uCCBB\uCCBC\uCCBD"+
-        "\uCCC1\uCCC2\uCCC3\uCCC4\uCCC5\uCCC6\uCCC7\uCCC8"+
-        "\uCCC9\uCCCA\uCCCB\uCCCC\uCCCD\uCCCE\uCCCF\uCCD0"+
-        "\uCCD1\uCCD3\uCCD4\uCCD5\uCCD6\uCCD7\uCCD8\uCCD9"+
-        "\uCCDA\uCCDB\uCCDC\uCCDD\uCCE1\uCCE2\uCCE3\uCCE4"+
-        "\uCCE5\uCCE6\uCCE7\uCCE8\uCCE9\uCCEA\uCCEB\uCCEC"+
-        "\uCCED\uCCEE\uCCEF\uCCF0\uCCF1\uCCF3\uCCF4\uCCF5"+
-        "\uCCF6\uCCF7\uCCF8\uCCF9\uCCFA\uCCFB\uCCFC\uCCFD"+
-        "\uCD41\uCD42\uCD43\uCD44\uCD45\uCD46\uCD47\uCD48"+
-        "\uCD49\uCD4A\uCD4B\uCD4C\uCD4D\uCD4E\uCD4F\uCD50"+
-        "\uCD51\uCD53\uCD54\uCD55\uCD56\uCD57\uCD58\uCD59"+
-        "\uCD5A\uCD5B\uCD5C\uCD5D\uCD61\uCD62\uCD63\uCD64"+
-        "\uCD65\uCD66\uCD67\uCD68\uCD69\uCD6A\uCD6B\uCD6C"+
-        "\uCD6D\uCD6E\uCD6F\uCD70\uCD71\uCD73\uCD74\uCD75"+
-        "\uCD76\uCD77\uCD78\uCD79\uCD7A\uCD7B\uCD7C\uCD7D"+
-        "\uCD81\uCD82\uCD83\uCD84\uCD85\uCD86\uCD87\uCD88"+
-        "\uCD89\uCD8A\uCD8B\uCD8C\uCD8D\uCD8E\uCD8F\uCD90"+
-        "\uCD91\uCD93\uCD94\uCD95\uCD96\uCD97\uCD98\uCD99"+
-        "\uCD9A\uCD9B\uCD9C\uCD9D\uCDA1\uCDA2\uCDA3\uCDA4"+
-        "\uCDA5\uCDA6\uCDA7\uCDA8\uCDA9\uCDAA\uCDAB\uCDAC"+
-        "\uCDAD\uCDAE\uCDAF\uCDB0\uCDB1\uCDB3\uCDB4\uCDB5"+
-        "\uCDB6\uCDB7\uCDB8\uCDB9\uCDBA\uCDBB\uCDBC\uCDBD"+
-        "\uCDC1\uCDC2\uCDC3\uCDC4\uCDC5\uCDC6\uCDC7\uCDC8"+
-        "\uCDC9\uCDCA\uCDCB\uCDCC\uCDCD\uCDCE\uCDCF\uCDD0"+
-        "\uCDD1\uCDD3\uCDD4\uCDD5\uCDD6\uCDD7\uCDD8\uCDD9"+
-        "\uCDDA\uCDDB\uCDDC\uCDDD\uCDE1\uCDE2\uCDE3\uCDE4"+
-        "\uCDE5\uCDE6\uCDE7\uCDE8\uCDE9\uCDEA\uCDEB\uCDEC"+
-        "\uCDED\uCDEE\uCDEF\uCDF0\uCDF1\uCDF3\uCDF4\uCDF5"+
-        "\uCDF6\uCDF7\uCDF8\uCDF9\uCDFA\uCDFB\uCDFC\uCDFD"+
-        "\uCE41\uCE42\uCE43\uCE44\uCE45\uCE46\uCE47\uCE48"+
-        "\uCE49\uCE4A\uCE4B\uCE4C\uCE4D\uCE4E\uCE4F\uCE50"+
-        "\uCE51\uCE53\uCE54\uCE55\uCE56\uCE57\uCE58\uCE59"+
-        "\uCE5A\uCE5B\uCE5C\uCE5D\uCE61\uCE62\uCE63\uCE64"+
-        "\uCE65\uCE66\uCE67\uCE68\uCE69\uCE6A\uCE6B\uCE6C"+
-        "\uCE6D\uCE6E\uCE6F\uCE70\uCE71\uCE73\uCE74\uCE75"+
-        "\uCE76\uCE77\uCE78\uCE79\uCE7A\uCE7B\uCE7C\uCE7D"+
-        "\uCE81\uCE82\uCE83\uCE84\uCE85\uCE86\uCE87\uCE88"+
-        "\uCE89\uCE8A\uCE8B\uCE8C\uCE8D\uCE8E\uCE8F\uCE90"+
-        "\uCE91\uCE93\uCE94\uCE95\uCE96\uCE97\uCE98\uCE99"+
-        "\uCE9A\uCE9B\uCE9C\uCE9D\uCEA1\uCEA2\uCEA3\uCEA4"+
-        "\uCEA5\uCEA6\uCEA7\uCEA8\uCEA9\uCEAA\uCEAB\uCEAC"+
-        "\uCEAD\uCEAE\uCEAF\uCEB0\uCEB1\uCEB3\uCEB4\uCEB5"+
-        "\uCEB6\uCEB7\uCEB8\uCEB9\uCEBA\uCEBB\uCEBC\uCEBD"+
-        "\uCEC1\uCEC2\uCEC3\uCEC4\uCEC5\uCEC6\uCEC7\uCEC8"+
-        "\uCEC9\uCECA\uCECB\uCECC\uCECD\uCECE\uCECF\uCED0"+
-        "\uCED1\uCED3\uCED4\uCED5\uCED6\uCED7\uCED8\uCED9"+
-        "\uCEDA\uCEDB\uCEDC\uCEDD\uCEE1\uCEE2\uCEE3\uCEE4"+
-        "\uCEE5\uCEE6\uCEE7\uCEE8\uCEE9\uCEEA\uCEEB\uCEEC"+
-        "\uCEED\uCEEE\uCEEF\uCEF0\uCEF1\uCEF3\uCEF4\uCEF5"+
-        "\uCEF6\uCEF7\uCEF8\uCEF9\uCEFA\uCEFB\uCEFC\uCEFD"+
-        "\uCF41\uCF42\uCF43\uCF44\uCF45\uCF46\uCF47\uCF48"+
-        "\uCF49\uCF4A\uCF4B\uCF4C\uCF4D\uCF4E\uCF4F\uCF50"+
-        "\uCF51\uCF53\uCF54\uCF55\uCF56\uCF57\uCF58\uCF59"+
-        "\uCF5A\uCF5B\uCF5C\uCF5D\uCF61\uCF62\uCF63\uCF64"+
-        "\uCF65\uCF66\uCF67\uCF68\uCF69\uCF6A\uCF6B\uCF6C"+
-        "\uCF6D\uCF6E\uCF6F\uCF70\uCF71\uCF73\uCF74\uCF75"+
-        "\uCF76\uCF77\uCF78\uCF79\uCF7A\uCF7B\uCF7C\uCF7D"+
-        "\uCF81\uCF82\uCF83\uCF84\uCF85\uCF86\uCF87\uCF88"+
-        "\uCF89\uCF8A\uCF8B\uCF8C\uCF8D\uCF8E\uCF8F\uCF90"+
-        "\uCF91\uCF93\uCF94\uCF95\uCF96\uCF97\uCF98\uCF99"+
-        "\uCF9A\uCF9B\uCF9C\uCF9D\uCFA1\uCFA2\uCFA3\uCFA4"+
-        "\uCFA5\uCFA6\uCFA7\uCFA8\uCFA9\uCFAA\uCFAB\uCFAC"+
-        "\uCFAD\uCFAE\uCFAF\uCFB0\uCFB1\uCFB3\uCFB4\uCFB5"+
-        "\uCFB6\uCFB7\uCFB8\uCFB9\uCFBA\uCFBB\uCFBC\uCFBD"+
-        "\uD061\uD062\uD063\uD064\uD065\uD066\uD067\uD068"+
-        "\uD069\uD06A\uD06B\uD06C\uD06D\uD06E\uD06F\uD070"+
-        "\uD071\uD073\uD074\uD075\uD076\uD077\uD078\uD079"+
-        "\uD07A\uD07B\uD07C\uD07D\uD081\uD082\uD083\uD084"+
-        "\uD085\uD086\uD087\uD088\uD089\uD08A\uD08B\uD08C"+
-        "\uD08D\uD08E\uD08F\uD090\uD091\uD093\uD094\uD095"+
-        "\uD096\uD097\uD098\uD099\uD09A\uD09B\uD09C\uD09D"+
-        "\uD0A1\uD0A2\uD0A3\uD0A4\uD0A5\uD0A6\uD0A7\uD0A8"+
-        "\uD0A9\uD0AA\uD0AB\uD0AC\uD0AD\uD0AE\uD0AF\uD0B0"+
-        "\uD0B1\uD0B3\uD0B4\uD0B5\uD0B6\uD0B7\uD0B8\uD0B9"+
-        "\uD0BA\uD0BB\uD0BC\uD0BD\uD0C1\uD0C2\uD0C3\uD0C4"+
-        "\uD0C5\uD0C6\uD0C7\uD0C8\uD0C9\uD0CA\uD0CB\uD0CC"+
-        "\uD0CD\uD0CE\uD0CF\uD0D0\uD0D1\uD0D3\uD0D4\uD0D5"+
-        "\uD0D6\uD0D7\uD0D8\uD0D9\uD0DA\uD0DB\uD0DC\uD0DD"+
-        "\uD0E1\uD0E2\uD0E3\uD0E4\uD0E5\uD0E6\uD0E7\uD0E8"+
-        "\uD0E9\uD0EA\uD0EB\uD0EC\uD0ED\uD0EE\uD0EF\uD0F0"+
-        "\uD0F1\uD0F3\uD0F4\uD0F5\uD0F6\uD0F7\uD0F8\uD0F9"+
-        "\uD0FA\uD0FB\uD0FC\uD0FD\uD141\uD142\uD143\uD144"+
-        "\uD145\uD146\uD147\uD148\uD149\uD14A\uD14B\uD14C"+
-        "\uD14D\uD14E\uD14F\uD150\uD151\uD153\uD154\uD155"+
-        "\uD156\uD157\uD158\uD159\uD15A\uD15B\uD15C\uD15D"+
-        "\uD161\uD162\uD163\uD164\uD165\uD166\uD167\uD168"+
-        "\uD169\uD16A\uD16B\uD16C\uD16D\uD16E\uD16F\uD170"+
-        "\uD171\uD173\uD174\uD175\uD176\uD177\uD178\uD179"+
-        "\uD17A\uD17B\uD17C\uD17D\uD181\uD182\uD183\uD184"+
-        "\uD185\uD186\uD187\uD188\uD189\uD18A\uD18B\uD18C"+
-        "\uD18D\uD18E\uD18F\uD190\uD191\uD193\uD194\uD195"+
-        "\uD196\uD197\uD198\uD199\uD19A\uD19B\uD19C\uD19D"+
-        "\uD1A1\uD1A2\uD1A3\uD1A4\uD1A5\uD1A6\uD1A7\uD1A8"+
-        "\uD1A9\uD1AA\uD1AB\uD1AC\uD1AD\uD1AE\uD1AF\uD1B0"+
-        "\uD1B1\uD1B3\uD1B4\uD1B5\uD1B6\uD1B7\uD1B8\uD1B9"+
-        "\uD1BA\uD1BB\uD1BC\uD1BD\uD1C1\uD1C2\uD1C3\uD1C4"+
-        "\uD1C5\uD1C6\uD1C7\uD1C8\uD1C9\uD1CA\uD1CB\uD1CC"+
-        "\uD1CD\uD1CE\uD1CF\uD1D0\uD1D1\uD1D3\uD1D4\uD1D5"+
-        "\uD1D6\uD1D7\uD1D8\uD1D9\uD1DA\uD1DB\uD1DC\uD1DD"+
-        "\uD1E1\uD1E2\uD1E3\uD1E4\uD1E5\uD1E6\uD1E7\uD1E8"+
-        "\uD1E9\uD1EA\uD1EB\uD1EC\uD1ED\uD1EE\uD1EF\uD1F0"+
-        "\uD1F1\uD1F3\uD1F4\uD1F5\uD1F6\uD1F7\uD1F8\uD1F9"+
-        "\uD1FA\uD1FB\uD1FC\uD1FD\uD241\uD242\uD243\uD244"+
-        "\uD245\uD246\uD247\uD248\uD249\uD24A\uD24B\uD24C"+
-        "\uD24D\uD24E\uD24F\uD250\uD251\uD253\uD254\uD255"+
-        "\uD256\uD257\uD258\uD259\uD25A\uD25B\uD25C\uD25D"+
-        "\uD261\uD262\uD263\uD264\uD265\uD266\uD267\uD268"+
-        "\uD269\uD26A\uD26B\uD26C\uD26D\uD26E\uD26F\uD270"+
-        "\uD271\uD273\uD274\uD275\uD276\uD277\uD278\uD279"+
-        "\uD27A\uD27B\uD27C\uD27D\uD281\uD282\uD283\uD284"+
-        "\uD285\uD286\uD287\uD288\uD289\uD28A\uD28B\uD28C"+
-        "\uD28D\uD28E\uD28F\uD290\uD291\uD293\uD294\uD295"+
-        "\uD296\uD297\uD298\uD299\uD29A\uD29B\uD29C\uD29D"+
-        "\uD2A1\uD2A2\uD2A3\uD2A4\uD2A5\uD2A6\uD2A7\uD2A8"+
-        "\uD2A9\uD2AA\uD2AB\uD2AC\uD2AD\uD2AE\uD2AF\uD2B0"+
-        "\uD2B1\uD2B3\uD2B4\uD2B5\uD2B6\uD2B7\uD2B8\uD2B9"+
-        "\uD2BA\uD2BB\uD2BC\uD2BD\uD2C1\uD2C2\uD2C3\uD2C4"+
-        "\uD2C5\uD2C6\uD2C7\uD2C8\uD2C9\uD2CA\uD2CB\uD2CC"+
-        "\uD2CD\uD2CE\uD2CF\uD2D0\uD2D1\uD2D3\uD2D4\uD2D5"+
-        "\uD2D6\uD2D7\uD2D8\uD2D9\uD2DA\uD2DB\uD2DC\uD2DD"+
-        "\uD2E1\uD2E2\uD2E3\uD2E4\uD2E5\uD2E6\uD2E7\uD2E8"+
-        "\uD2E9\uD2EA\uD2EB\uD2EC\uD2ED\uD2EE\uD2EF\uD2F0"+
-        "\uD2F1\uD2F3\uD2F4\uD2F5\uD2F6\uD2F7\uD2F8\uD2F9"+
-        "\uD2FA\uD2FB\uD2FC\uD2FD\uD341\uD342\uD343\uD344"+
-        "\uD345\uD346\uD347\uD348\uD349\uD34A\uD34B\uD34C"+
-        "\uD34D\uD34E\uD34F\uD350\uD351\uD353\uD354\uD355"+
-        "\uD356\uD357\uD358\uD359\uD35A\uD35B\uD35C\uD35D"+
-        "\uD361\uD362\uD363\uD364\uD365\uD366\uD367\uD368"+
-        "\uD369\uD36A\uD36B\uD36C\uD36D\uD36E\uD36F\uD370"+
-        "\uD371\uD373\uD374\uD375\uD376\uD377\uD378\uD379"+
-        "\uD37A\uD37B\uD37C\uD37D\uD381\uD382\uD383\uD384"+
-        "\uD385\uD386\uD387\uD388\uD389\uD38A\uD38B\uD38C"+
-        "\uD38D\uD38E\uD38F\uD390\uD391\uD393\uD394\uD395"+
-        "\uD396\uD397\uD398\uD399\uD39A\uD39B\uD39C\uD39D"+
-        "\uD3A1\uD3A2\uD3A3\uD3A4\uD3A5\uD3A6\uD3A7\uD3A8"+
-        "\uD3A9\uD3AA\uD3AB\uD3AC\uD3AD\uD3AE\uD3AF\uD3B0"+
-        "\uD3B1\uD3B3\uD3B4\uD3B5\uD3B6\uD3B7\uD3B8\uD3B9"+
-        "\uD3BA\uD3BB\uD3BC\uD3BD\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uE0D0\uE0D6\uE0E7\uE1CF\uE1E8\uE23D\uE2FB\uE332"+
-        "\uE348\uE360\uE36D\uE3D4\uE3D5\uE3D8\uE3DB\uE3DC"+
-        "\uE3DD\uE3DE\uE3DF\uE3E0\uE3E2\uE3E3\uE3E4\uE3E5"+
-        "\uE3E6\uE3E8\uE3E9\uE3EA\uE3EB\uE3ED\uE3EF\uE3F0"+
-        "\uE3F2\uE3F6\uE3FA\uE3FC\uE3FD\uE3FE\uE432\uE433"+
-        "\uE437\uE438\uE439\uE43A\uE43B\uE43D\uE442\uE44E"+
-        "\uE452\uE453\uE454\uE456\uE457\uE458\uE459\uE45A"+
-        "\uE45B\uE45D\uE45E\uE45F\uE460\uE461\uE462\uE463"+
-        "\uE464\uE465\uE466\uE467\uE469\uE46A\uE46E\uE46F"+
-        "\uE471\uE472\uE474\uE475\uE476\uE477\uE478\uE479"+
-        "\uE47A\uE47B\uE492\uE493\uE494\uE495\uE496\uE497"+
-        "\uE499\uE49A\uE576\uE59E\uE5A5\uE5AB\uE5AE\uE648"+
-        "\uE65D\uE6CB\uE6E4\uE8C5\uE8E4\uE935\uE9A5\uE9D5"+
-        "\uE9F4\uEA9E\uEAA0\uEAB3\uEAE1\uEAE8\uEB93\uEBAD"+
-        "\uEBED\uECF5\uED31\uED39\uEDAE\uEDB1\uEDB2\uEDB9"+
-        "\uEDBB\uEDBC\uEDC4\uEDCE\uEDD0\uEDD2\uEDD6\uEDFA"+
-        "\uEDFB\uEDFC\uEDFE\uEE31\uEE34\uEE37\uEE3D\uEE3F"+
-        "\uEE40\uEE41\uEE43\uEE47\uEE48\uEE4C\uEE54\uEE56"+
-        "\uEE57\uEE5A\uEE62\uEE66\uEE69\uEE6C\uEE6F\uEE71"+
-        "\uEE74\uEE75\uEE76\uEE78\uEE7A\uEE7B\uEE7C\uEE91"+
-        "\uEE93\uEE94\uEE97\uEE98\uEE99\uEE9B\uEEA1\uEEA6"+
-        "\uEEA9\uEEAA\uEEAC\uEEAD\uEEB0\uEEBF\uEEC1\uEEC6"+
-        "\uEEC7\uEECB\uEECD\uEECF\uEED0\uEED3\uEEDF\uEEE4"+
-        "\uEEE6\uEEF7\uEF77\uEF78\uEF92\uEF93\uEF99\uEF9B"+
-        "\uEF9D\uEFA0\uEFA7\uEFAC\uEFCC\uEFF7\uF051\uF075"+
-        "\uF096\uF099\uF09E\uF0A0\uF0A4\uF0A7\uF0A9\uF0AA"+
-        "\uF0BA\uF0BB\uF0BD\uF0C1\uF0C2\uF0C6\uF0C7\uF0CC"+
-        "\uF0CF\uF0D0\uF0D1\uF0D2\uF0D8\uF136\uF137\uF13A"+
-        "\uF13F\uF140\uF141\uF142\uF145\uF148\uF14A\uF150"+
-        "\uF151\uF155\uF156\uF159\uF15A\uF165\uF16D\uF16E"+
-        "\uF171\uF174\uF177\uF178\uF199\uF19A\uF19C\uF1A1"+
-        "\uF1A2\uF1A3\uF1EE\uF26B\uF44D\uF49C\uF4B1\uF537";
-
-    private final static String innerIndex9=
-        "\uF57E\uF696\uF698\uF6B8\uF6C8\uF6D3\uF76B\uF792"+
-        "\uF831\uF832\uF876\uF939\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\uDA31\uDA32\uDA33\uDA34\uDA35\uDA36\uDA37"+
-        "\uDA38\uDA39\uDA3A\uDA3B\uDA3C\uDA3D\uDA3E\uDA3F"+
-        "\uDA40\uDA41\uDA42\uDA43\uDA44\uDA45\uDA46\uDA47"+
-        "\uDA48\uDA49\uDA4A\uDA4B\uDA4C\uDA4D\uDA4E\uDA4F"+
-        "\uDA50\uDA51\uDA52\uDA53\uDA54\uDA55\uDA56\uDA57"+
-        "\uDA58\uDA59\uDA5A\uDA5B\uDA5C\uDA5D\uDA5E\uDA5F"+
-        "\uDA60\uDA61\uDA62\uDA63\uDA64\uDA65\uDA66\uDA67"+
-        "\uDA68\uDA69\uDA6A\uDA6B\uD93C\uDA6D\uDA6E\uDA6F"+
-        "\uDA70\uDA71\uDA72\uDA73\uDA74\uDA75\uDA76\uDA77"+
-        "\uDA78\uDA79\uDA7A\uDA7B\uDA7C\uDA7D\uDA7E\uDA91"+
-        "\uDA92\uDA93\uDA94\uDA95\uDA96\uDA97\uDA98\uDA99"+
-        "\uDA9A\uDA9B\uDA9C\uDA9D\uDA9E\uDA9F\uD9A6\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\uD95B\uD95C\uD9A0\uDAA0\u0000\uD95D\uDA6C\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"+
-        "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000";
-
-    private final static short index1[] = {
-        1, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18,
-        19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-        35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
-        51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
-        67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
-        83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 100, 101, 102,
-        103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
-        119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
-        135, 136, 137, 138, 139, 140, 141, 142, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 144, 0, 0, 0, 0, 145
-    };
-
-    String index2[] = {
-        innerIndex0,
-        innerIndex1,
-        innerIndex2,
-        innerIndex3,
-        innerIndex4,
-        innerIndex5,
-        innerIndex6,
-        innerIndex7,
-        innerIndex8,
-        innerIndex9
-    };
 }
--- a/jdk/src/share/classes/sun/net/httpserver/Request.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/net/httpserver/Request.java	Sat Apr 18 14:10:27 2009 -0700
@@ -52,6 +52,9 @@
         os = rawout;
         do {
             startLine = readLine();
+            if (startLine == null) {
+                return;
+            }
             /* skip blank lines */
         } while (startLine == null ? false : startLine.equals (""));
     }
--- a/jdk/src/share/classes/sun/net/httpserver/ServerImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/net/httpserver/ServerImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -433,6 +433,7 @@
                         rawin = sslStreams.getInputStream();
                         rawout = sslStreams.getOutputStream();
                         engine = sslStreams.getSSLEngine();
+                        connection.sslStreams = sslStreams;
                     } else {
                         rawin = new BufferedInputStream(
                             new Request.ReadStream (
@@ -442,6 +443,8 @@
                             ServerImpl.this, chan
                         );
                     }
+                    connection.raw = rawin;
+                    connection.rawout = rawout;
                 }
                 Request req = new Request (rawin, rawout);
                 requestLine = req.requestLine();
--- a/jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/AsynchronousFileChannelImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -113,16 +113,16 @@
         }
     }
 
-    final void invalidateAllLocks() {
+    final void invalidateAllLocks() throws IOException {
         if (fileLockTable != null) {
-            try {
-                fileLockTable.removeAll( new FileLockTable.Releaser() {
-                    public void release(FileLock fl) {
-                        ((FileLockImpl)fl).invalidate();
+            for (FileLock fl: fileLockTable.removeAll()) {
+                synchronized (fl) {
+                    if (fl.isValid()) {
+                        FileLockImpl fli = (FileLockImpl)fl;
+                        implRelease(fli);
+                        fli.invalidate();
                     }
-                });
-            } catch (IOException e) {
-                throw new AssertionError(e);
+                }
             }
         }
     }
@@ -158,7 +158,21 @@
     }
 
     /**
-     * Invoked by FileLockImpl to release lock acquired by this channel.
+     * Releases the given file lock.
+     */
+    protected abstract void implRelease(FileLockImpl fli) throws IOException;
+
+    /**
+     * Invoked by FileLockImpl to release the given file lock and remove it
+     * from the lock table.
      */
-    abstract void release(FileLockImpl fli) throws IOException;
+    final void release(FileLockImpl fli) throws IOException {
+        try {
+            begin();
+            implRelease(fli);
+            removeFromFileLockTable(fli);
+        } finally {
+            end();
+        }
+    }
 }
--- a/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/FileChannelImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -33,8 +33,6 @@
 import java.nio.channels.*;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Iterator;
-import java.lang.reflect.Field;
 import java.security.AccessController;
 import javax.management.ObjectName;
 import javax.management.MalformedObjectNameException;
@@ -95,14 +93,16 @@
     // -- Standard channel operations --
 
     protected void implCloseChannel() throws IOException {
-        // Invalidate and release any locks that we still hold
+        // Release and invalidate any locks that we still hold
         if (fileLockTable != null) {
-            fileLockTable.removeAll( new FileLockTable.Releaser() {
-                public void release(FileLock fl) throws IOException {
-                    ((FileLockImpl)fl).invalidate();
-                    nd.release(fd, fl.position(), fl.size());
+            for (FileLock fl: fileLockTable.removeAll()) {
+                synchronized (fl) {
+                    if (fl.isValid()) {
+                        nd.release(fd, fl.position(), fl.size());
+                        ((FileLockImpl)fl).invalidate();
+                    }
                 }
-            });
+            }
         }
 
         nd.preClose(fd);
@@ -912,32 +912,33 @@
         FileLockImpl fli = new FileLockImpl(this, position, size, shared);
         FileLockTable flt = fileLockTable();
         flt.add(fli);
-        boolean i = true;
+        boolean completed = false;
         int ti = -1;
         try {
             begin();
             ti = threads.add();
             if (!isOpen())
                 return null;
-            int result = nd.lock(fd, true, position, size, shared);
-            if (result == FileDispatcher.RET_EX_LOCK) {
-                assert shared;
-                FileLockImpl fli2 = new FileLockImpl(this, position, size,
-                                                     false);
-                flt.replace(fli, fli2);
-                return fli2;
+            int n;
+            do {
+                n = nd.lock(fd, true, position, size, shared);
+            } while ((n == FileDispatcher.INTERRUPTED) && isOpen());
+            if (isOpen()) {
+                if (n == FileDispatcher.RET_EX_LOCK) {
+                    assert shared;
+                    FileLockImpl fli2 = new FileLockImpl(this, position, size,
+                                                         false);
+                    flt.replace(fli, fli2);
+                    fli = fli2;
+                }
+                completed = true;
             }
-            if (result == FileDispatcher.INTERRUPTED || result == FileDispatcher.NO_LOCK) {
+        } finally {
+            if (!completed)
                 flt.remove(fli);
-                i = false;
-            }
-        } catch (IOException e) {
-            flt.remove(fli);
-            throw e;
-        } finally {
             threads.remove(ti);
             try {
-                end(i);
+                end(completed);
             } catch (ClosedByInterruptException e) {
                 throw new FileLockInterruptionException();
             }
@@ -985,7 +986,6 @@
     }
 
     void release(FileLockImpl fli) throws IOException {
-        ensureOpen();
         int ti = threads.add();
         try {
             ensureOpen();
@@ -1005,7 +1005,7 @@
      */
     private static class SimpleFileLockTable extends FileLockTable {
         // synchronize on list for access
-        private List<FileLock> lockList = new ArrayList<FileLock>(2);
+        private final List<FileLock> lockList = new ArrayList<FileLock>(2);
 
         public SimpleFileLockTable() {
         }
@@ -1034,14 +1034,11 @@
             }
         }
 
-        public void removeAll(Releaser releaser) throws IOException {
+        public List<FileLock> removeAll() {
             synchronized(lockList) {
-                Iterator<FileLock> i = lockList.iterator();
-                while (i.hasNext()) {
-                    FileLock fl = i.next();
-                    releaser.release(fl);
-                    i.remove();
-                }
+                List<FileLock> result = new ArrayList<FileLock>(lockList);
+                lockList.clear();
+                return result;
             }
         }
 
--- a/jdk/src/share/classes/sun/nio/ch/FileLockImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/FileLockImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -31,25 +31,24 @@
 public class FileLockImpl
     extends FileLock
 {
-    boolean valid;
+    private volatile boolean valid = true;
 
     FileLockImpl(FileChannel channel, long position, long size, boolean shared)
     {
         super(channel, position, size, shared);
-        this.valid = true;
     }
 
     FileLockImpl(AsynchronousFileChannel channel, long position, long size, boolean shared)
     {
         super(channel, position, size, shared);
-        this.valid = true;
     }
 
-    public synchronized boolean isValid() {
+    public boolean isValid() {
         return valid;
     }
 
-    synchronized void invalidate() {
+    void invalidate() {
+        assert Thread.holdsLock(this);
         valid = false;
     }
 
@@ -66,5 +65,4 @@
             valid = false;
         }
     }
-
 }
--- a/jdk/src/share/classes/sun/nio/ch/FileLockTable.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/FileLockTable.java	Sat Apr 18 14:10:27 2009 -0700
@@ -61,22 +61,11 @@
     public abstract void remove(FileLock fl);
 
     /**
-     * An implementation of this interface releases a given file lock.
-     * Used with removeAll.
+     * Removes all file locks from the table.
+     *
+     * @return  The list of file locks removed
      */
-    public abstract interface Releaser {
-        void release(FileLock fl) throws IOException;
-    }
-
-    /**
-     * Removes all file locks from the table.
-     * <p>
-     * The Releaser#release method is invoked for each file lock before
-     * it is removed.
-     *
-     * @throws IOException if the release method throws IOException
-     */
-    public abstract void removeAll(Releaser r) throws IOException;
+    public abstract List<FileLock> removeAll();
 
     /**
      * Replaces an existing file lock in the table.
@@ -195,7 +184,7 @@
                 FileLockReference ref = list.get(index);
                 FileLock lock = ref.get();
                 if (lock == fl) {
-                    assert (lock != null) && (lock.channel() == channel);
+                    assert (lock != null) && (lock.acquiredBy() == channel);
                     ref.clear();
                     list.remove(index);
                     break;
@@ -206,7 +195,8 @@
     }
 
     @Override
-    public void removeAll(Releaser releaser) throws IOException {
+    public List<FileLock> removeAll() {
+        List<FileLock> result = new ArrayList<FileLock>();
         List<FileLockReference> list = lockMap.get(fileKey);
         if (list != null) {
             synchronized (list) {
@@ -216,13 +206,13 @@
                     FileLock lock = ref.get();
 
                     // remove locks obtained by this channel
-                    if (lock != null && lock.channel() == channel) {
-                        // invoke the releaser to invalidate/release the lock
-                        releaser.release(lock);
-
+                    if (lock != null && lock.acquiredBy() == channel) {
                         // remove the lock from the list
                         ref.clear();
                         list.remove(index);
+
+                        // add to result
+                        result.add(lock);
                     } else {
                         index++;
                     }
@@ -232,6 +222,7 @@
                 removeKeyIfEmpty(fileKey, list);
             }
         }
+        return result;
     }
 
     @Override
--- a/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/nio/ch/SimpleAsynchronousFileChannelImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -97,6 +97,9 @@
             // then it will throw ClosedChannelException
         }
 
+        // Invalidate and release any locks that we still hold
+        invalidateAllLocks();
+
         // signal any threads blocked on this channel
         nd.preClose(fdObj);
         threads.signalAndWait();
@@ -109,9 +112,6 @@
             closeLock.writeLock().unlock();
         }
 
-        // Invalidate and release any locks that we still hold
-        invalidateAllLocks();
-
         // close file
         nd.close(fdObj);
 
@@ -226,11 +226,9 @@
                         do {
                             n = nd.lock(fdObj, true, position, size, shared);
                         } while ((n == FileDispatcher.INTERRUPTED) && isOpen());
-                        if (n == FileDispatcher.LOCKED) {
+                        if (n == FileDispatcher.LOCKED && isOpen()) {
                             result.setResult(fli);
                         } else {
-                            if (n != FileDispatcher.INTERRUPTED)
-                                throw new AssertionError();
                             throw new AsynchronousCloseException();
                         }
                     } catch (IOException x) {
@@ -279,16 +277,16 @@
             do {
                 n = nd.lock(fdObj, false, position, size, shared);
             } while ((n == FileDispatcher.INTERRUPTED) && isOpen());
-            if (n != FileDispatcher.LOCKED) {
-                if (n == FileDispatcher.NO_LOCK)
-                    return null;    // locked by someone else
-                if (n == FileDispatcher.INTERRUPTED)
-                    throw new AsynchronousCloseException();
-                // should not get here
-                throw new AssertionError();
+            if (n == FileDispatcher.LOCKED && isOpen()) {
+                gotLock = true;
+                return fli;    // lock acquired
             }
-            gotLock = true;
-            return fli;
+            if (n == FileDispatcher.NO_LOCK)
+                return null;    // locked by someone else
+            if (n == FileDispatcher.INTERRUPTED)
+                throw new AsynchronousCloseException();
+            // should not get here
+            throw new AssertionError();
         } finally {
             if (!gotLock)
                 removeFromFileLockTable(fli);
@@ -298,14 +296,8 @@
     }
 
     @Override
-    void release(FileLockImpl fli) throws IOException {
-        try {
-            begin();
-            nd.release(fdObj, fli.position(), fli.size());
-            removeFromFileLockTable(fli);
-        } finally {
-            end();
-        }
+    protected void implRelease(FileLockImpl fli) throws IOException {
+        nd.release(fdObj, fli.position(), fli.size());
     }
 
     @Override
--- a/jdk/src/share/classes/sun/security/krb5/Config.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/Config.java	Sat Apr 18 14:10:27 2009 -0700
@@ -736,6 +736,14 @@
         return name;
     }
 
+    private static String trimmed(String s) {
+        s = s.trim();
+        if (s.charAt(0) == '"' && s.charAt(s.length()-1) == '"' ||
+                s.charAt(0) == '\'' && s.charAt(s.length()-1) == '\'') {
+            s = s.substring(1, s.length()-1).trim();
+        }
+        return s;
+    }
     /**
      * Parses key-value pairs under a stanza name.
      */
@@ -747,7 +755,7 @@
             for (int j = 0; j < line.length(); j++) {
                 if (line.charAt(j) == '=') {
                     String key = (line.substring(0, j)).trim();
-                    String value = (line.substring(j + 1)).trim();
+                    String value = trimmed(line.substring(j + 1));
                     table.put(key, value);
                     break;
                 }
@@ -820,7 +828,7 @@
                     } else {
                         nameVector = table.get(key);
                     }
-                    nameVector.addElement((line.substring(j + 1)).trim());
+                    nameVector.addElement(trimmed(line.substring(j + 1)));
                     table.put(key, nameVector);
                     break;
                 }
@@ -1263,4 +1271,32 @@
         }
     }
 
+    @Override
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        toStringIndented("", stanzaTable, sb);
+        return sb.toString();
+    }
+    private static void toStringIndented(String prefix, Object obj,
+            StringBuffer sb) {
+        if (obj instanceof String) {
+            sb.append(prefix);
+            sb.append(obj);
+            sb.append('\n');
+        } else if (obj instanceof Hashtable) {
+            Hashtable tab = (Hashtable)obj;
+            for (Object o: tab.keySet()) {
+                sb.append(prefix);
+                sb.append(o);
+                sb.append(" = {\n");
+                toStringIndented(prefix + "    ", tab.get(o), sb);
+                sb.append(prefix + "}\n");
+            }
+        } else if (obj instanceof Vector) {
+            Vector v = (Vector)obj;
+            for (Object o: v.toArray()) {
+                toStringIndented(prefix + "    ", o, sb);
+            }
+        }
+    }
 }
--- a/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/KrbKdcReq.java	Sat Apr 18 14:10:27 2009 -0700
@@ -274,27 +274,31 @@
                                + ",Attempt =" + i
                                + ", #bytes=" + obuf.length);
                     }
-                    /*
-                     * Send the data to the kdc.
-                     */
+                    try {
+                        /*
+                         * Send the data to the kdc.
+                         */
 
                     kdcClient.send(obuf);
 
-                    /*
-                     * And get a response.
-                     */
-                    try {
-                        ibuf = kdcClient.receive();
-                        break;
-                    } catch (SocketTimeoutException se) {
-                        if (DEBUG) {
-                            System.out.println ("SocketTimeOutException with " +
-                                                "attempt: " + i);
+                        /*
+                         * And get a response.
+                         */
+                        try {
+                            ibuf = kdcClient.receive();
+                            break;
+                        } catch (SocketTimeoutException se) {
+                            if (DEBUG) {
+                                System.out.println ("SocketTimeOutException with " +
+                                                    "attempt: " + i);
+                            }
+                            if (i == DEFAULT_KDC_RETRY_LIMIT) {
+                                ibuf = null;
+                                throw se;
+                            }
                         }
-                        if (i == DEFAULT_KDC_RETRY_LIMIT) {
-                            ibuf = null;
-                            throw se;
-                        }
+                    } finally {
+                        kdcClient.close();
                     }
                 }
             }
--- a/jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/krb5/internal/UDPClient.java	Sat Apr 18 14:10:27 2009 -0700
@@ -93,4 +93,7 @@
         return data;
     }
 
+    public void close() {
+        dgSocket.close();
+    }
 }
--- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyPairGenerator.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,6 +38,8 @@
 import sun.security.pkcs11.wrapper.*;
 import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
 
+import sun.security.rsa.RSAKeyFactory;
+
 /**
  * KeyPairGenerator implementation class. This class currently supports
  * RSA, DSA, DH, and EC.
@@ -66,7 +68,7 @@
     private AlgorithmParameterSpec params;
 
     // for RSA, selected or default value of public exponent, always valid
-    private BigInteger rsaPublicExponent;
+    private BigInteger rsaPublicExponent = RSAKeyGenParameterSpec.F4;
 
     // SecureRandom instance, if specified in init
     private SecureRandom random;
@@ -88,19 +90,19 @@
     public void initialize(int keySize, SecureRandom random) {
         token.ensureValid();
         try {
-            checkKeySize(keySize);
+            checkKeySize(keySize, null);
         } catch (InvalidAlgorithmParameterException e) {
             throw new InvalidParameterException(e.getMessage());
         }
         this.keySize = keySize;
         this.params = null;
         this.random = random;
-        this.rsaPublicExponent = RSAKeyGenParameterSpec.F4;
         if (algorithm.equals("EC")) {
             params = P11ECKeyFactory.getECParameterSpec(keySize);
             if (params == null) {
-                throw new InvalidParameterException
-                ("No EC parameters available for key size " + keySize + " bits");
+                throw new InvalidParameterException(
+                    "No EC parameters available for key size "
+                    + keySize + " bits");
             }
         }
     }
@@ -115,8 +117,10 @@
                         ("DHParameterSpec required for Diffie-Hellman");
             }
             DHParameterSpec dhParams = (DHParameterSpec)params;
-            this.keySize = dhParams.getP().bitLength();
-            this.params = params;
+            int tmpKeySize = dhParams.getP().bitLength();
+            checkKeySize(tmpKeySize, dhParams);
+            this.keySize = tmpKeySize;
+            this.params = dhParams;
             // XXX sanity check params
         } else if (algorithm.equals("RSA")) {
             if (params instanceof RSAKeyGenParameterSpec == false) {
@@ -124,7 +128,9 @@
                         ("RSAKeyGenParameterSpec required for RSA");
             }
             RSAKeyGenParameterSpec rsaParams = (RSAKeyGenParameterSpec)params;
-            this.keySize = rsaParams.getKeysize();
+            int tmpKeySize = rsaParams.getKeysize();
+            checkKeySize(tmpKeySize, rsaParams);
+            this.keySize = tmpKeySize;
             this.params = null;
             this.rsaPublicExponent = rsaParams.getPublicExponent();
             // XXX sanity check params
@@ -134,13 +140,16 @@
                         ("DSAParameterSpec required for DSA");
             }
             DSAParameterSpec dsaParams = (DSAParameterSpec)params;
-            this.keySize = dsaParams.getP().bitLength();
-            this.params = params;
+            int tmpKeySize = dsaParams.getP().bitLength();
+            checkKeySize(tmpKeySize, dsaParams);
+            this.keySize = tmpKeySize;
+            this.params = dsaParams;
             // XXX sanity check params
         } else if (algorithm.equals("EC")) {
             ECParameterSpec ecParams;
             if (params instanceof ECParameterSpec) {
-                ecParams = P11ECKeyFactory.getECParameterSpec((ECParameterSpec)params);
+                ecParams = P11ECKeyFactory.getECParameterSpec(
+                    (ECParameterSpec)params);
                 if (ecParams == null) {
                     throw new InvalidAlgorithmParameterException
                         ("Unsupported curve: " + params);
@@ -156,16 +165,17 @@
                 throw new InvalidAlgorithmParameterException
                     ("ECParameterSpec or ECGenParameterSpec required for EC");
             }
-            this.keySize = ecParams.getCurve().getField().getFieldSize();
+            int tmpKeySize = ecParams.getCurve().getField().getFieldSize();
+            checkKeySize(tmpKeySize, ecParams);
+            this.keySize = tmpKeySize;
             this.params = ecParams;
         } else {
             throw new ProviderException("Unknown algorithm: " + algorithm);
         }
         this.random = random;
-        checkKeySize(keySize);
     }
 
-    private void checkKeySize(int keySize)
+    private void checkKeySize(int keySize, AlgorithmParameterSpec params)
             throws InvalidAlgorithmParameterException {
         if (algorithm.equals("EC")) {
             if (keySize < 112) {
@@ -178,13 +188,28 @@
                     ("Key size must be at most 2048 bit");
             }
             return;
+        } else if (algorithm.equals("RSA")) {
+            BigInteger tmpExponent = rsaPublicExponent;
+            if (params != null) {
+                // Already tested for instanceof RSAKeyGenParameterSpec above
+                tmpExponent =
+                    ((RSAKeyGenParameterSpec)params).getPublicExponent();
+            }
+            try {
+                // This provider supports 64K or less.
+                RSAKeyFactory.checkKeyLengths(keySize, tmpExponent,
+                    512, 64 * 1024);
+            } catch (InvalidKeyException e) {
+                throw new InvalidAlgorithmParameterException(e.getMessage());
+            }
+            return;
         }
+
         if (keySize < 512) {
             throw new InvalidAlgorithmParameterException
                 ("Key size must be at least 512 bit");
         }
-        if (algorithm.equals("RSA") ||
-                (algorithm.equals("DH") && (params != null))) {
+        if (algorithm.equals("DH") && (params != null)) {
             // sanity check, nobody really wants keys this large
             if (keySize > 64 * 1024) {
                 throw new InvalidAlgorithmParameterException
--- a/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11KeyStore.java	Sat Apr 18 14:10:27 2009 -0700
@@ -80,6 +80,8 @@
 import sun.security.pkcs11.wrapper.*;
 import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
 
+import sun.security.rsa.RSAKeyFactory;
+
 final class P11KeyStore extends KeyStoreSpi {
 
     private static final CK_ATTRIBUTE ATTR_CLASS_CERT =
@@ -1328,6 +1330,15 @@
             BigInteger modulus = attrs[0].getBigInteger();
             keyLength = modulus.bitLength();
 
+            // This check will combine our "don't care" values here
+            // with the system-wide min/max values.
+            try {
+                RSAKeyFactory.checkKeyLengths(keyLength, null,
+                    -1, Integer.MAX_VALUE);
+            } catch (InvalidKeyException e) {
+                throw new KeyStoreException(e.getMessage());
+            }
+
             return P11Key.privateKey(session,
                                 oHandle,
                                 keyType,
--- a/jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/P11RSAKeyFactory.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -35,6 +35,8 @@
 import sun.security.pkcs11.wrapper.*;
 import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
 
+import sun.security.rsa.RSAKeyFactory;
+
 /**
  * RSA KeyFactory implemenation.
  *
@@ -131,6 +133,9 @@
         } catch (PKCS11Exception e) {
             throw new InvalidKeySpecException
                 ("Could not create RSA public key", e);
+        } catch (InvalidKeyException e) {
+            throw new InvalidKeySpecException
+                ("Could not create RSA public key", e);
         }
     }
 
@@ -175,11 +180,15 @@
         } catch (PKCS11Exception e) {
             throw new InvalidKeySpecException
                 ("Could not create RSA private key", e);
+        } catch (InvalidKeyException e) {
+            throw new InvalidKeySpecException
+                ("Could not create RSA private key", e);
         }
     }
 
     private PublicKey generatePublic(BigInteger n, BigInteger e)
-            throws PKCS11Exception {
+            throws PKCS11Exception, InvalidKeyException {
+        RSAKeyFactory.checkKeyLengths(n.bitLength(), e, -1, 64 * 1024);
         CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] {
             new CK_ATTRIBUTE(CKA_CLASS, CKO_PUBLIC_KEY),
             new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA),
@@ -200,7 +209,8 @@
     }
 
     private PrivateKey generatePrivate(BigInteger n, BigInteger d)
-            throws PKCS11Exception {
+            throws PKCS11Exception, InvalidKeyException {
+        RSAKeyFactory.checkKeyLengths(n.bitLength(), null, -1, 64 * 1024);
         CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] {
             new CK_ATTRIBUTE(CKA_CLASS, CKO_PRIVATE_KEY),
             new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA),
@@ -222,7 +232,9 @@
 
     private PrivateKey generatePrivate(BigInteger n, BigInteger e,
             BigInteger d, BigInteger p, BigInteger q, BigInteger pe,
-            BigInteger qe, BigInteger coeff) throws PKCS11Exception {
+            BigInteger qe, BigInteger coeff) throws PKCS11Exception,
+            InvalidKeyException {
+        RSAKeyFactory.checkKeyLengths(n.bitLength(), e, -1, 64 * 1024);
         CK_ATTRIBUTE[] attributes = new CK_ATTRIBUTE[] {
             new CK_ATTRIBUTE(CKA_CLASS, CKO_PRIVATE_KEY),
             new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_RSA),
--- a/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/pkcs11/SunPKCS11.java	Sat Apr 18 14:10:27 2009 -0700
@@ -120,11 +120,13 @@
     }
 
     /**
-     * @deprecated use new SunPKCS11(String) or new SunPKCS11(InputStream) instead
+     * @deprecated use new SunPKCS11(String) or new SunPKCS11(InputStream)
+     *         instead
      */
     @Deprecated
     public SunPKCS11(String configName, InputStream configStream) {
-        super("SunPKCS11-" + Config.getConfig(configName, configStream).getName(),
+        super("SunPKCS11-" +
+            Config.getConfig(configName, configStream).getName(),
             1.7d, Config.getConfig(configName, configStream).getDescription());
         this.configName = configName;
         this.config = Config.removeConfig(configName);
@@ -153,7 +155,8 @@
         //
         // If we are in Secmod mode and configured to use either the
         // nssKeyStore or the nssTrustAnchors module, we automatically
-        // switch to using the NSS trust attributes for trusted certs (KeyStore).
+        // switch to using the NSS trust attributes for trusted certs
+        // (KeyStore).
         //
 
         if (useSecmod) {
@@ -168,33 +171,40 @@
                 if (secmod.isInitialized()) {
                     if (nssSecmodDirectory != null) {
                         String s = secmod.getConfigDir();
-                        if ((s != null) && (s.equals(nssSecmodDirectory) == false)) {
+                        if ((s != null) &&
+                                (s.equals(nssSecmodDirectory) == false)) {
                             throw new ProviderException("Secmod directory "
                                 + nssSecmodDirectory
-                                + " invalid, NSS already initialized with " + s);
+                                + " invalid, NSS already initialized with "
+                                + s);
                         }
                     }
                     if (nssLibraryDirectory != null) {
                         String s = secmod.getLibDir();
-                        if ((s != null) && (s.equals(nssLibraryDirectory) == false)) {
+                        if ((s != null) &&
+                                (s.equals(nssLibraryDirectory) == false)) {
                             throw new ProviderException("NSS library directory "
                                 + nssLibraryDirectory
-                                + " invalid, NSS already initialized with " + s);
+                                + " invalid, NSS already initialized with "
+                                + s);
                         }
                     }
                 } else {
                     if (nssDbMode != DbMode.NO_DB) {
                         if (nssSecmodDirectory == null) {
-                            throw new ProviderException("Secmod not initialized and "
-                                + "nssSecmodDirectory not specified");
+                            throw new ProviderException(
+                                "Secmod not initialized and "
+                                 + "nssSecmodDirectory not specified");
                         }
                     } else {
                         if (nssSecmodDirectory != null) {
-                            throw new ProviderException
-                            ("nssSecmodDirectory must not be specified in noDb mode");
+                            throw new ProviderException(
+                                "nssSecmodDirectory must not be "
+                                + "specified in noDb mode");
                         }
                     }
-                    secmod.initialize(nssDbMode, nssSecmodDirectory, nssLibraryDirectory);
+                    secmod.initialize(nssDbMode, nssSecmodDirectory,
+                        nssLibraryDirectory);
                 }
             } catch (IOException e) {
                 // XXX which exception to throw
@@ -211,7 +221,8 @@
                 if (nssModule != null) {
                     moduleName = "fips";
                 } else {
-                    moduleName = (nssDbMode == DbMode.NO_DB) ? "crypto" : "keystore";
+                    moduleName = (nssDbMode == DbMode.NO_DB) ?
+                        "crypto" : "keystore";
                 }
             }
             if (moduleName.equals("fips")) {
@@ -253,10 +264,12 @@
                         + ": only " + k + " external NSS modules available");
                 }
             } else {
-                throw new ProviderException("Unknown NSS module: " + moduleName);
+                throw new ProviderException(
+                    "Unknown NSS module: " + moduleName);
             }
             if (nssModule == null) {
-                throw new ProviderException("NSS module not available: " + moduleName);
+                throw new ProviderException(
+                    "NSS module not available: " + moduleName);
             }
             if (nssModule.hasInitializedProvider()) {
                 throw new ProviderException("Secmod module already configured");
@@ -296,8 +309,9 @@
             initArgs.flags = CKF_OS_LOCKING_OK;
             PKCS11 tmpPKCS11;
             try {
-                tmpPKCS11 = PKCS11.getInstance
-                    (library, functionList, initArgs, config.getOmitInitialize());
+                tmpPKCS11 = PKCS11.getInstance(
+                    library, functionList, initArgs,
+                    config.getOmitInitialize());
             } catch (PKCS11Exception e) {
                 if (debug != null) {
                     debug.println("Multi-threaded initialization failed: " + e);
@@ -312,8 +326,8 @@
                 } else {
                     initArgs.flags = 0;
                 }
-                tmpPKCS11 = PKCS11.getInstance
-                    (library, functionList, initArgs, config.getOmitInitialize());
+                tmpPKCS11 = PKCS11.getInstance(library,
+                    functionList, initArgs, config.getOmitInitialize());
             }
             p11 = tmpPKCS11;
 
@@ -336,8 +350,10 @@
                     System.out.println("Slots with tokens: " + toString(slots));
                 }
                 if (slotID < 0) {
-                    if ((slotListIndex < 0) || (slotListIndex >= slots.length)) {
-                        throw new ProviderException("slotListIndex is " + slotListIndex
+                    if ((slotListIndex < 0)
+                            || (slotListIndex >= slots.length)) {
+                        throw new ProviderException("slotListIndex is "
+                            + slotListIndex
                             + " but token only has " + slots.length + " slots");
                     }
                     slotID = slots[slotListIndex];
@@ -575,12 +591,15 @@
         d(KF, "DH",             P11DHKeyFactory,        s("DiffieHellman"),
                 m(CKM_DH_PKCS_KEY_PAIR_GEN, CKM_DH_PKCS_DERIVE));
         d(KF, "EC",             P11DHKeyFactory,
-                m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, CKM_ECDSA, CKM_ECDSA_SHA1));
+                m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE,
+                    CKM_ECDSA, CKM_ECDSA_SHA1));
 
         // AlgorithmParameters for EC.
         // Only needed until we have an EC implementation in the SUN provider.
-        d(AGP, "EC",            "sun.security.ec.ECParameters", s("1.2.840.10045.2.1"),
-                m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE, CKM_ECDSA, CKM_ECDSA_SHA1));
+        d(AGP, "EC",            "sun.security.ec.ECParameters",
+                                                s("1.2.840.10045.2.1"),
+                m(CKM_EC_KEY_PAIR_GEN, CKM_ECDH1_DERIVE,
+                    CKM_ECDSA, CKM_ECDSA_SHA1));
 
         d(KA, "DH",             P11KeyAgreement,        s("DiffieHellman"),
                 m(CKM_DH_PKCS_DERIVE));
@@ -654,12 +673,16 @@
         d(SIG, "SHA512withRSA", P11Signature,
                 m(CKM_SHA512_RSA_PKCS, CKM_RSA_PKCS, CKM_RSA_X_509));
 
-        d(KG, "SunTlsRsaPremasterSecret", "sun.security.pkcs11.P11TlsRsaPremasterSecretGenerator",
+        d(KG, "SunTlsRsaPremasterSecret",
+                    "sun.security.pkcs11.P11TlsRsaPremasterSecretGenerator",
                 m(CKM_SSL3_PRE_MASTER_KEY_GEN, CKM_TLS_PRE_MASTER_KEY_GEN));
-        d(KG, "SunTlsMasterSecret", "sun.security.pkcs11.P11TlsMasterSecretGenerator",
+        d(KG, "SunTlsMasterSecret",
+                    "sun.security.pkcs11.P11TlsMasterSecretGenerator",
                 m(CKM_SSL3_MASTER_KEY_DERIVE, CKM_TLS_MASTER_KEY_DERIVE,
-                    CKM_SSL3_MASTER_KEY_DERIVE_DH, CKM_TLS_MASTER_KEY_DERIVE_DH));
-        d(KG, "SunTlsKeyMaterial", "sun.security.pkcs11.P11TlsKeyMaterialGenerator",
+                    CKM_SSL3_MASTER_KEY_DERIVE_DH,
+                    CKM_TLS_MASTER_KEY_DERIVE_DH));
+        d(KG, "SunTlsKeyMaterial",
+                    "sun.security.pkcs11.P11TlsKeyMaterialGenerator",
                 m(CKM_SSL3_KEY_AND_MAC_DERIVE, CKM_TLS_KEY_AND_MAC_DERIVE));
         d(KG, "SunTlsPrf", "sun.security.pkcs11.P11TlsPrfGenerator",
                 m(CKM_TLS_PRF, CKM_NSS_TLS_PRF_GENERAL));
@@ -773,6 +796,13 @@
             System.out.println(token.tokenInfo);
         }
         long[] supportedMechanisms = p11.C_GetMechanismList(slotID);
+
+        // Create a map from the various Descriptors to the "most
+        // preferred" mechanism that was defined during the
+        // static initialization.  For example, DES/CBC/PKCS5Padding
+        // could be mapped to CKM_DES_CBC_PAD or CKM_DES_CBC.  Prefer
+        // the earliest entry.  When asked for "DES/CBC/PKCS5Padding", we
+        // return a CKM_DES_CBC_PAD.
         final Map<Descriptor,Integer> supportedAlgs =
                                         new HashMap<Descriptor,Integer>();
         for (int i = 0; i < supportedMechanisms.length; i++) {
@@ -807,6 +837,9 @@
                     supportedAlgs.put(d, integerMech);
                     continue;
                 }
+                // See if there is something "more preferred"
+                // than what we currently have in the supportedAlgs
+                // map.
                 int intOldMech = oldMech.intValue();
                 for (int j = 0; j < d.mechanisms.length; j++) {
                     int nextMech = d.mechanisms[j];
--- a/jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/rsa/RSAKeyFactory.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,8 @@
 import java.security.interfaces.*;
 import java.security.spec.*;
 
+import sun.security.action.GetPropertyAction;
+
 /**
  * KeyFactory for RSA keys. Keys must be instances of PublicKey or PrivateKey
  * and getAlgorithm() must return "RSA". For such keys, it supports conversion
@@ -68,6 +70,24 @@
     private final static Class<?> x509KeySpecClass  = X509EncodedKeySpec.class;
     private final static Class<?> pkcs8KeySpecClass = PKCS8EncodedKeySpec.class;
 
+    public final static int MIN_MODLEN = 512;
+    public final static int MAX_MODLEN = 16384;
+
+    /*
+     * If the modulus length is above this value, restrict the size of
+     * the exponent to something that can be reasonably computed.  We
+     * could simply hardcode the exp len to something like 64 bits, but
+     * this approach allows flexibility in case impls would like to use
+     * larger module and exponent values.
+     */
+    public final static int MAX_MODLEN_RESTRICT_EXP = 3072;
+    public final static int MAX_RESTRICTED_EXPLEN = 64;
+
+    private static final boolean restrictExpLen =
+        "true".equalsIgnoreCase(AccessController.doPrivileged(
+            new GetPropertyAction(
+                "sun.security.rsa.restrictRSAExponent", "true")));
+
     // instance used for static translateKey();
     private final static RSAKeyFactory INSTANCE = new RSAKeyFactory();
 
@@ -76,74 +96,79 @@
     }
 
     /**
-     * Static method to convert Key into a useable instance of
-     * RSAPublicKey or RSAPrivate(Crt)Key. Check the key and convert it
-     * to a SunRsaSign key if necessary. If the key is not an RSA key
-     * or cannot be used, throw an InvalidKeyException.
-     *
-     * The difference between this method and engineTranslateKey() is that
-     * we do not convert keys of other providers that are already an
-     * instance of RSAPublicKey or RSAPrivate(Crt)Key.
+     * Static method to convert Key into an instance of RSAPublicKeyImpl
+     * or RSAPrivate(Crt)KeyImpl. If the key is not an RSA key or cannot be
+     * used, throw an InvalidKeyException.
      *
      * Used by RSASignature and RSACipher.
      */
     public static RSAKey toRSAKey(Key key) throws InvalidKeyException {
-        if (key instanceof RSAKey) {
-            RSAKey rsaKey = (RSAKey)key;
-            checkKey(rsaKey);
-            return rsaKey;
+        if ((key instanceof RSAPrivateKeyImpl) ||
+            (key instanceof RSAPrivateCrtKeyImpl) ||
+            (key instanceof RSAPublicKeyImpl)) {
+            return (RSAKey)key;
         } else {
             return (RSAKey)INSTANCE.engineTranslateKey(key);
         }
     }
 
-    /**
-     * Check that the given RSA key is valid.
+    /*
+     * Single test entry point for all of the mechanisms in the SunRsaSign
+     * provider (RSA*KeyImpls).  All of the tests are the same.
+     *
+     * For compatibility, we round up to the nearest byte here:
+     * some Key impls might pass in a value within a byte of the
+     * real value.
      */
-    private static void checkKey(RSAKey key) throws InvalidKeyException {
-        // check for subinterfaces, omit additional checks for our keys
-        if (key instanceof RSAPublicKey) {
-            if (key instanceof RSAPublicKeyImpl) {
-                return;
-            }
-        } else if (key instanceof RSAPrivateKey) {
-            if ((key instanceof RSAPrivateCrtKeyImpl)
-                    || (key instanceof RSAPrivateKeyImpl)) {
-                return;
-            }
-        } else {
-            throw new InvalidKeyException("Neither a public nor a private key");
-        }
-        // RSAKey does not extend Key, so we need to do a cast
-        String keyAlg = ((Key)key).getAlgorithm();
-        if (keyAlg.equals("RSA") == false) {
-            throw new InvalidKeyException("Not an RSA key: " + keyAlg);
-        }
-        BigInteger modulus;
-        // some providers implement RSAKey for keys where the values are
-        // not accessible (although they should). Detect those here
-        // for a more graceful failure.
-        try {
-            modulus = key.getModulus();
-            if (modulus == null) {
-                throw new InvalidKeyException("Modulus is missing");
-            }
-        } catch (RuntimeException e) {
-            throw new InvalidKeyException(e);
-        }
-        checkKeyLength(modulus);
+    static void checkRSAProviderKeyLengths(int modulusLen, BigInteger exponent)
+            throws InvalidKeyException {
+        checkKeyLengths(((modulusLen + 7) & ~7), exponent,
+            RSAKeyFactory.MIN_MODLEN, Integer.MAX_VALUE);
     }
 
     /**
-     * Check the length of the modulus of an RSA key. We only support keys
-     * at least 505 bits long.
+     * Check the length of an RSA key modulus/exponent to make sure it
+     * is not too short or long.  Some impls have their own min and
+     * max key sizes that may or may not match with a system defined value.
+     *
+     * @param modulusLen the bit length of the RSA modulus.
+     * @param exponent the RSA exponent
+     * @param minModulusLen if > 0, check to see if modulusLen is at
+     *        least this long, otherwise unused.
+     * @param maxModulusLen caller will allow this max number of bits.
+     *        Allow the smaller of the system-defined maximum and this param.
+     *
+     * @throws InvalidKeyException if any of the values are unacceptable.
      */
-    static void checkKeyLength(BigInteger modulus) throws InvalidKeyException {
-        if (modulus.bitLength() < 505) {
-            // some providers may generate slightly shorter keys
-            // accept them if the encoding is at least 64 bytes long
-            throw new InvalidKeyException
-                ("RSA keys must be at least 512 bits long");
+     public static void checkKeyLengths(int modulusLen, BigInteger exponent,
+            int minModulusLen, int maxModulusLen) throws InvalidKeyException {
+
+        if ((minModulusLen > 0) && (modulusLen < (minModulusLen))) {
+            throw new InvalidKeyException( "RSA keys must be at least " +
+                minModulusLen + " bits long");
+        }
+
+        // Even though our policy file may allow this, we don't want
+        // either value (mod/exp) to be too big.
+
+        int maxLen = Math.min(maxModulusLen, MAX_MODLEN);
+
+        // If a RSAPrivateKey/RSAPublicKey, make sure the
+        // modulus len isn't too big.
+        if (modulusLen > maxLen) {
+            throw new InvalidKeyException(
+                "RSA keys must be no longer than " + maxLen + " bits");
+        }
+
+        // If a RSAPublicKey, make sure the exponent isn't too big.
+        if (restrictExpLen && (exponent != null) &&
+                (modulusLen > MAX_MODLEN_RESTRICT_EXP) &&
+                (exponent.bitLength() > MAX_RESTRICTED_EXPLEN)) {
+            throw new InvalidKeyException(
+                "RSA exponents can be no longer than " +
+                MAX_RESTRICTED_EXPLEN + " bits " +
+                " if modulus is greater than " +
+                MAX_MODLEN_RESTRICT_EXP + " bits");
         }
     }
 
--- a/jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/rsa/RSAKeyPairGenerator.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2004 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -47,7 +47,7 @@
     // public exponent to use
     private BigInteger publicExponent;
 
-    // size of the key to generate, >= 512
+    // size of the key to generate, >= RSAKeyFactory.MIN_MODLEN
     private int keySize;
 
     // PRNG to use
@@ -60,15 +60,16 @@
 
     // initialize the generator. See JCA doc
     public void initialize(int keySize, SecureRandom random) {
-        if (keySize < 512) {
-            throw new InvalidParameterException
-                ("Key size must be at least 512 bits");
+
+        // do not allow unreasonably small or large key sizes,
+        // probably user error
+        try {
+            RSAKeyFactory.checkKeyLengths(keySize, RSAKeyGenParameterSpec.F4,
+                512, 64 * 1024);
+        } catch (InvalidKeyException e) {
+            throw new InvalidParameterException(e.getMessage());
         }
-        if (keySize > 64 * 1024) {
-            // do not allow unreasonably large key sizes, probably user error
-            throw new InvalidParameterException
-                ("Key size must be 65536 bits or less");
-        }
+
         this.keySize = keySize;
         this.random = random;
         this.publicExponent = RSAKeyGenParameterSpec.F4;
@@ -77,35 +78,41 @@
     // second initialize method. See JCA doc.
     public void initialize(AlgorithmParameterSpec params, SecureRandom random)
             throws InvalidAlgorithmParameterException {
+
         if (params instanceof RSAKeyGenParameterSpec == false) {
             throw new InvalidAlgorithmParameterException
                 ("Params must be instance of RSAKeyGenParameterSpec");
         }
+
         RSAKeyGenParameterSpec rsaSpec = (RSAKeyGenParameterSpec)params;
-        keySize = rsaSpec.getKeysize();
-        publicExponent = rsaSpec.getPublicExponent();
-        this.random = random;
-        if (keySize < 512) {
-            throw new InvalidAlgorithmParameterException
-                ("Key size must be at least 512 bits");
-        }
-        if (keySize > 64 * 1024) {
-            // do not allow unreasonably large key sizes, probably user error
-            throw new InvalidAlgorithmParameterException
-                ("Key size must be 65536 bits or less");
-        }
-        if (publicExponent == null) {
-            publicExponent = RSAKeyGenParameterSpec.F4;
+        int tmpKeySize = rsaSpec.getKeysize();
+        BigInteger tmpPublicExponent = rsaSpec.getPublicExponent();
+
+        if (tmpPublicExponent == null) {
+            tmpPublicExponent = RSAKeyGenParameterSpec.F4;
         } else {
-            if (publicExponent.compareTo(RSAKeyGenParameterSpec.F0) < 0) {
+            if (tmpPublicExponent.compareTo(RSAKeyGenParameterSpec.F0) < 0) {
                 throw new InvalidAlgorithmParameterException
                         ("Public exponent must be 3 or larger");
             }
-            if (publicExponent.bitLength() > keySize) {
+            if (tmpPublicExponent.bitLength() > tmpKeySize) {
                 throw new InvalidAlgorithmParameterException
                         ("Public exponent must be smaller than key size");
             }
         }
+
+        // do not allow unreasonably large key sizes, probably user error
+        try {
+            RSAKeyFactory.checkKeyLengths(tmpKeySize, tmpPublicExponent,
+                512, 64 * 1024);
+        } catch (InvalidKeyException e) {
+            throw new InvalidAlgorithmParameterException(
+                "Invalid key sizes", e);
+        }
+
+        this.keySize = tmpKeySize;
+        this.publicExponent = tmpPublicExponent;
+        this.random = random;
     }
 
     // generate the keypair. See JCA doc
--- a/jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/rsa/RSAPrivateCrtKeyImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -89,7 +89,7 @@
      */
     RSAPrivateCrtKeyImpl(byte[] encoded) throws InvalidKeyException {
         decode(encoded);
-        RSAKeyFactory.checkKeyLength(n);
+        RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e);
     }
 
     /**
@@ -107,7 +107,8 @@
         this.pe = pe;
         this.qe = qe;
         this.coeff = coeff;
-        RSAKeyFactory.checkKeyLength(n);
+        RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e);
+
         // generate the encoding
         algid = rsaId;
         try {
--- a/jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/rsa/RSAPrivateKeyImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -61,7 +61,7 @@
     RSAPrivateKeyImpl(BigInteger n, BigInteger d) throws InvalidKeyException {
         this.n = n;
         this.d = d;
-        RSAKeyFactory.checkKeyLength(n);
+        RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), null);
         // generate the encoding
         algid = RSAPrivateCrtKeyImpl.rsaId;
         try {
--- a/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -56,10 +56,11 @@
      * Construct a key from its components. Used by the
      * RSAKeyFactory and the RSAKeyPairGenerator.
      */
-    public RSAPublicKeyImpl(BigInteger n, BigInteger e) throws InvalidKeyException {
+    public RSAPublicKeyImpl(BigInteger n, BigInteger e)
+            throws InvalidKeyException {
         this.n = n;
         this.e = e;
-        RSAKeyFactory.checkKeyLength(n);
+        RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e);
         // generate the encoding
         algid = RSAPrivateCrtKeyImpl.rsaId;
         try {
@@ -80,7 +81,7 @@
      */
     public RSAPublicKeyImpl(byte[] encoded) throws InvalidKeyException {
         decode(encoded);
-        RSAKeyFactory.checkKeyLength(n);
+        RSAKeyFactory.checkRSAProviderKeyLengths(n.bitLength(), e);
     }
 
     // see JCA doc
--- a/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/classes/sun/security/util/ObjectIdentifier.java	Sat Apr 18 14:10:27 2009 -0700
@@ -26,7 +26,8 @@
 package sun.security.util;
 
 import java.io.*;
-
+import java.math.BigInteger;
+import java.util.Arrays;
 
 /**
  * Represent an ISO Object Identifier.
@@ -44,105 +45,186 @@
  * hierarchy, and other organizations can easily acquire the ability
  * to assign such unique identifiers.
  *
- *
  * @author David Brownell
  * @author Amit Kapoor
  * @author Hemma Prafullchandra
  */
+
 final public
 class ObjectIdentifier implements Serializable
 {
-    /** use serialVersionUID from JDK 1.1. for interoperability */
+    /**
+     * We use the DER value (no tag, no length) as the internal format
+     * @serial
+     */
+    private byte[] encoding = null;
+
+    private transient volatile String stringForm;
+
+    /*
+     * IMPORTANT NOTES FOR CODE CHANGES (bug 4811968) IN JDK 1.7.0
+     * ===========================================================
+     *
+     * (Almost) serialization compatibility with old versions:
+     *
+     * serialVersionUID is unchanged. Old field "component" is changed to
+     * type Object so that "poison" (unknown object type for old versions)
+     * can be put inside if there are huge components that cannot be saved
+     * as integers.
+     *
+     * New version use the new filed "encoding" only.
+     *
+     * Below are all 4 cases in a serialization/deserialization process:
+     *
+     * 1. old -> old: Not covered here
+     * 2. old -> new: There's no "encoding" field, new readObject() reads
+     *    "components" and "componentLen" instead and inits correctly.
+     * 3. new -> new: "encoding" field exists, new readObject() uses it
+     *    (ignoring the other 2 fields) and inits correctly.
+     * 4. new -> old: old readObject() only recognizes "components" and
+     *    "componentLen" fields. If no huge components are involved, they
+     *    are serialized as legal values and old object can init correctly.
+     *    Otherwise, old object cannot recognize the form (component not int[])
+     *    and throw a ClassNotFoundException at deserialization time.
+     *
+     * Therfore, for the first 3 cases, exact compatibility is preserved. In
+     * the 4th case, non-huge OID is still supportable in old versions, while
+     * huge OID is not.
+     */
     private static final long serialVersionUID = 8697030238860181294L;
-    private static final int maxFirstComponent = 2;
-    private static final int maxSecondComponent = 39;
 
     /**
-     * Constructs an object identifier from a string.  This string
-     * should be of the form 1.23.34.45.56 etc.
+     * Changed to Object
+     * @serial
+     */
+    private Object      components   = null;          // path from root
+    /**
+     * @serial
+     */
+    private int         componentLen = -1;            // how much is used.
+
+    // Is the components field calculated?
+    transient private boolean   componentsCalculated = false;
+
+    private void readObject(ObjectInputStream is)
+            throws IOException, ClassNotFoundException {
+        is.defaultReadObject();
+
+        if (encoding == null) {  // from an old version
+            init((int[])components, componentLen);
+        }
+    }
+
+    private void writeObject(ObjectOutputStream os)
+            throws IOException {
+        if (!componentsCalculated) {
+            int[] comps = toIntArray();
+            if (comps != null) {    // every one understands this
+                components = comps;
+                componentLen = comps.length;
+            } else {
+                components = HugeOidNotSupportedByOldJDK.theOne;
+            }
+            componentsCalculated = true;
+        }
+        os.defaultWriteObject();
+    }
+
+    static class HugeOidNotSupportedByOldJDK implements Serializable {
+        private static final long serialVersionUID = 1L;
+        static HugeOidNotSupportedByOldJDK theOne = new HugeOidNotSupportedByOldJDK();
+    }
+
+    /**
+     * Constructs, from a string.  This string should be of the form 1.23.56.
+     * Validity check included.
      */
     public ObjectIdentifier (String oid) throws IOException
     {
         int ch = '.';
-        int     start = 0;
+        int start = 0;
         int end = 0;
 
-        // Calculate length of oid
-        componentLen = 0;
-        while ((end = oid.indexOf(ch,start)) != -1) {
-            start = end + 1;
-            componentLen += 1;
-        }
-        componentLen += 1;
-        components = new int[componentLen];
+        int pos = 0;
+        byte[] tmp = new byte[oid.length()];
+        int first = 0, second;
+        int count = 0;
+
+        try {
+            String comp = null;
+            do {
+                int length = 0; // length of one section
+                end = oid.indexOf(ch,start);
+                if (end == -1) {
+                    comp = oid.substring(start);
+                    length = oid.length() - start;
+                } else {
+                    comp = oid.substring(start,end);
+                    length = end - start;
+                }
 
-        start = 0;
-        int i = 0;
-        String comp = null;
-        try {
-            while ((end = oid.indexOf(ch,start)) != -1) {
-                comp = oid.substring(start,end);
-                components[i++] = Integer.valueOf(comp).intValue();
+                if (length > 9) {
+                    BigInteger bignum = new BigInteger(comp);
+                    if (count == 0) {
+                        checkFirstComponent(bignum);
+                        first = bignum.intValue();
+                    } else {
+                        if (count == 1) {
+                            checkSecondComponent(first, bignum);
+                            bignum = bignum.add(BigInteger.valueOf(40*first));
+                        } else {
+                            checkOtherComponent(count, bignum);
+                        }
+                        pos += pack7Oid(bignum, tmp, pos);
+                    }
+                } else {
+                    int num = Integer.parseInt(comp);
+                    if (count == 0) {
+                        checkFirstComponent(num);
+                        first = num;
+                    } else {
+                        if (count == 1) {
+                            checkSecondComponent(first, num);
+                            num += 40 * first;
+                        } else {
+                            checkOtherComponent(count, num);
+                        }
+                        pos += pack7Oid(num, tmp, pos);
+                    }
+                }
                 start = end + 1;
-            }
-            comp = oid.substring(start);
-            components[i] = Integer.valueOf(comp).intValue();
+                count++;
+            } while (end != -1);
+
+            checkCount(count);
+            encoding = new byte[pos];
+            System.arraycopy(tmp, 0, encoding, 0, pos);
+            this.stringForm = oid;
+        } catch (IOException ioe) { // already detected by checkXXX
+            throw ioe;
         } catch (Exception e) {
             throw new IOException("ObjectIdentifier() -- Invalid format: "
                     + e.toString(), e);
         }
-        checkValidOid(components, componentLen);
-        this.stringForm = oid;
     }
 
     /**
-     * Check if the values make a legal OID. There must be at least 2
-     * components and they must be all non-negative. The first component
-     * should be 0,1 or 2. When the first component is 0 or 1, the
-     * second component should be less than or equal to 39
-     *
-     * @param values the components that will make the OID
-     * @param len the number of components to check. Note that the allocation
-     *        size of <code>values</code> may be longer than <code>len</code>.
-     *        In this case, only the first <code>len</code> items are checked.
-     * @exception IOException if this is not a legal OID
-     */
-    private void checkValidOid(int[] values, int len) throws IOException {
-        if (values == null || len < 2) {
-            throw new IOException("ObjectIdentifier() -- " +
-                    "Must be at least two oid components ");
-        }
-
-        for (int i=0; i<len; i++) {
-            if (values[i] < 0) {
-                throw new IOException("ObjectIdentifier() -- " +
-                        "oid component #" + (i+1) + " must be non-negative ");
-            }
-        }
-
-        if (values[0] > maxFirstComponent) {
-            throw new IOException("ObjectIdentifier() -- " +
-                    "First oid component is invalid ");
-        }
-
-        if (values[0] < 2 && values[1] > maxSecondComponent) {
-            throw new IOException("ObjectIdentifier() -- " +
-                    "Second oid component is invalid ");
-        }
-    }
-    /**
-     * Constructs an object ID from an array of integers.  This
-     * is used to construct constant object IDs.
+     * Constructor, from an array of integers.
+     * Validity check included.
      */
     public ObjectIdentifier (int values []) throws IOException
     {
-        checkValidOid(values, values.length);
-        components = values.clone();
-        componentLen = values.length;
+        checkCount(values.length);
+        checkFirstComponent(values[0]);
+        checkSecondComponent(values[0], values[1]);
+        for (int i=2; i<values.length; i++)
+            checkOtherComponent(i, values[i]);
+        init(values, values.length);
     }
 
     /**
-     * Constructs an object ID from an ASN.1 encoded input stream.
+     * Constructor, from an ASN.1 encoded input stream.
+     * Validity check NOT included.
      * The encoding of the ID in the stream uses "DER", a BER/1 subset.
      * In this case, that means a triple { typeId, length, data }.
      *
@@ -152,8 +234,7 @@
      * @param in DER-encoded data holding an object ID
      * @exception IOException indicates a decoding error
      */
-    public ObjectIdentifier (DerInputStream in)
-        throws IOException
+    public ObjectIdentifier (DerInputStream in) throws IOException
     {
         byte    type_id;
         int     bufferEnd;
@@ -174,215 +255,67 @@
                 + " (tag = " +  type_id + ")"
                 );
 
-        bufferEnd = in.available () - in.getLength () - 1;
-        if (bufferEnd < 0)
-            throw new IOException (
-                "ObjectIdentifier() -- not enough data");
-
-        initFromEncoding (in, bufferEnd);
-    }
-
-    /*
-     * Build the OID from the rest of a DER input buffer; the tag
-     * and length have been removed/verified
-     */
-    ObjectIdentifier (DerInputBuffer buf) throws IOException
-    {
-        initFromEncoding (new DerInputStream (buf), 0);
-    }
-
-    /**
-     * Private constructor for use by newInternal(). Dummy argument
-     * to avoid clash with the public constructor.
-     */
-    private ObjectIdentifier(int[] components, boolean dummy) {
-        this.components = components;
-        this.componentLen = components.length;
-    }
-
-    /**
-     * Create a new ObjectIdentifier for internal use. The values are
-     * neither checked nor cloned.
-     */
-    public static ObjectIdentifier newInternal(int[] values) {
-        return new ObjectIdentifier(values, true);
+        encoding = new byte[in.getLength()];
+        in.getBytes(encoding);
+        check(encoding);
     }
 
     /*
-     * Helper function -- get the OID from a stream, after tag and
-     * length are verified.
+     * Constructor, from the rest of a DER input buffer;
+     * the tag and length have been removed/verified
+     * Validity check NOT included.
      */
-    private void initFromEncoding (DerInputStream in, int bufferEnd)
-        throws IOException
+    ObjectIdentifier (DerInputBuffer buf) throws IOException
     {
-
-        /*
-         * Now get the components ("sub IDs") one at a time.  We fill a
-         * temporary buffer, resizing it as needed.
-         */
-        int             component;
-        boolean         first_subid = true;
-
-        for (components = new int [allocationQuantum], componentLen = 0;
-                in.available () > bufferEnd;
-        ) {
-            component = getComponent (in);
-            if (component < 0) {
-                throw new IOException(
-                    "ObjectIdentifier() -- " +
-                    "component values must be nonnegative");
-            }
-            if (first_subid) {
-                int     X, Y;
+        DerInputStream in = new DerInputStream(buf);
+        encoding = new byte[in.available()];
+        in.getBytes(encoding);
+        check(encoding);
+    }
 
-                /*
-                 * NOTE:  the allocation quantum is large enough that we know
-                 * we don't have to reallocate here!
-                 */
-                if (component < 40)
-                    X = 0;
-                else if (component < 80)
-                    X = 1;
-                else
-                    X = 2;
-                Y = component - ( X * 40);
-                components [0] = X;
-                components [1] = Y;
-                componentLen = 2;
-
-                first_subid = false;
+    private void init(int[] components, int length) {
+        int pos = 0;
+        byte[] tmp = new byte[length*5+1];  // +1 for empty input
 
-            } else {
-
-                /*
-                 * Other components are encoded less exotically.  The only
-                 * potential trouble is the need to grow the array.
-                 */
-                if (componentLen >= components.length) {
-                    int         tmp_components [];
-
-                    tmp_components = new int [components.length
-                                        + allocationQuantum];
-                    System.arraycopy (components, 0, tmp_components, 0,
-                            components.length);
-                    components = tmp_components;
-                }
-                components [componentLen++] = component;
-            }
+        if (components[1] < Integer.MAX_VALUE - components[0]*40)
+            pos += pack7Oid(components[0]*40+components[1], tmp, pos);
+        else {
+            BigInteger big = BigInteger.valueOf(components[1]);
+            big = big.add(BigInteger.valueOf(components[0]*40));
+            pos += pack7Oid(big, tmp, pos);
         }
 
-        checkValidOid(components, componentLen);
+        for (int i=2; i<length; i++) {
+            pos += pack7Oid(components[i], tmp, pos);
+        }
+        encoding = new byte[pos];
+        System.arraycopy(tmp, 0, encoding, 0, pos);
+    }
 
-        /*
-         * Final sanity check -- if we didn't use exactly the number of bytes
-         * specified, something's quite wrong.
-         */
-        if (in.available () != bufferEnd) {
-            throw new IOException (
-                    "ObjectIdentifier() -- malformed input data");
+    /**
+     * This method is kept for compatibility reasons. The new implementation
+     * does the check and conversion. All around the JDK, the method is called
+     * in static blocks to initialize pre-defined ObjectIdentifieies. No
+     * obvious performance hurt will be made after this change.
+     *
+     * Old doc: Create a new ObjectIdentifier for internal use. The values are
+     * neither checked nor cloned.
+     */
+    public static ObjectIdentifier newInternal(int[] values) {
+        try {
+            return new ObjectIdentifier(values);
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+            // Should not happen, internal calls always uses legal values.
         }
     }
 
-
     /*
      * n.b. the only public interface is DerOutputStream.putOID()
      */
     void encode (DerOutputStream out) throws IOException
     {
-        DerOutputStream bytes = new DerOutputStream ();
-        int i;
-
-        // According to ISO X.660, when the 1st component is 0 or 1, the 2nd
-        // component is restricted to be less than or equal to 39, thus make
-        // it small enough to be encoded into one single byte.
-        if (components[0] < 2) {
-            bytes.write ((components [0] * 40) + components [1]);
-        } else {
-            putComponent(bytes, (components [0] * 40) + components [1]);
-        }
-        for (i = 2; i < componentLen; i++)
-            putComponent (bytes, components [i]);
-
-        /*
-         * Now that we've constructed the component, encode
-         * it in the stream we were given.
-         */
-        out.write (DerValue.tag_ObjectId, bytes);
-    }
-
-    /*
-     * Tricky OID component parsing technique ... note that one bit
-     * per octet is lost, this returns at most 28 bits of component.
-     * Also, notice this parses in big-endian format.
-     */
-    private static int getComponent (DerInputStream in)
-    throws IOException
-    {
-        int retval, i, tmp;
-
-        for (i = 0, retval = 0; i < 4; i++) {
-            retval <<= 7;
-            tmp = in.getByte ();
-            retval |= (tmp & 0x07f);
-            if ((tmp & 0x080) == 0)
-                return retval;
-        }
-
-        throw new IOException ("ObjectIdentifier() -- component value too big");
-    }
-
-    /*
-     * Reverse of the above routine.  Notice it needs to emit in
-     * big-endian form, so it buffers the output until it's ready.
-     * (Minimum length encoding is a DER requirement.)
-     */
-    private static void putComponent (DerOutputStream out, int val)
-    throws IOException
-    {
-        int     i;
-        // TODO: val must be <128*128*128*128 here, otherwise, 4 bytes is not
-        // enough to hold it. Will address this later.
-        byte    buf [] = new byte [4] ;
-
-        for (i = 0; i < 4; i++) {
-            buf [i] = (byte) (val & 0x07f);
-            val >>>= 7;
-            if (val == 0)
-                break;
-        }
-        for ( ; i > 0; --i)
-            out.write (buf [i] | 0x080);
-        out.write (buf [0]);
-    }
-
-    // XXX this API should probably facilitate the JDK sort utility
-
-    /**
-     * Compares this identifier with another, for sorting purposes.
-     * An identifier does not precede itself.
-     *
-     * @param other identifer that may precede this one.
-     * @return true iff <em>other</em> precedes this one
-     *          in a particular sorting order.
-     */
-    public boolean precedes (ObjectIdentifier other)
-    {
-        int             i;
-
-        // shorter IDs go first
-        if (other == this || componentLen < other.componentLen)
-            return false;
-        if (other.componentLen < componentLen)
-            return true;
-
-        // for each component, the lesser component goes first
-        for (i = 0; i < componentLen; i++) {
-            if (other.components [i] < components [i])
-                return true;
-        }
-
-        // identical IDs don't precede each other
-        return false;
+        out.write (DerValue.tag_ObjectId, encoding);
     }
 
     /**
@@ -398,6 +331,7 @@
      *
      * @return true iff the names are identical.
      */
+    @Override
     public boolean equals(Object obj) {
         if (this == obj) {
             return true;
@@ -406,23 +340,71 @@
             return false;
         }
         ObjectIdentifier other = (ObjectIdentifier)obj;
-        if (componentLen != other.componentLen) {
-            return false;
-        }
-        for (int i = 0; i < componentLen; i++) {
-            if (components[i] != other.components[i]) {
-                return false;
+        return Arrays.equals(encoding, other.encoding);
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.hashCode(encoding);
+    }
+
+    /**
+     * Private helper method for serialization. To be compatible with old
+     * versions of JDK.
+     * @return components in an int array, if all the components are less than
+     *         Integer.MAX_VALUE. Otherwise, null.
+     */
+    private int[] toIntArray() {
+        int length = encoding.length;
+        int[] result = new int[20];
+        int which = 0;
+        int fromPos = 0;
+        for (int i = 0; i < length; i++) {
+            if ((encoding[i] & 0x80) == 0) {
+                // one section [fromPos..i]
+                if (i - fromPos + 1 > 4) {
+                    BigInteger big = new BigInteger(pack(encoding, fromPos, i-fromPos+1, 7, 8));
+                    if (fromPos == 0) {
+                        result[which++] = 2;
+                        BigInteger second = big.subtract(BigInteger.valueOf(80));
+                        if (second.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) == 1) {
+                            return null;
+                        } else {
+                            result[which++] = second.intValue();
+                        }
+                    } else {
+                        if (big.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) == 1) {
+                            return null;
+                        } else {
+                            result[which++] = big.intValue();
+                        }
+                    }
+                } else {
+                    int retval = 0;
+                    for (int j = fromPos; j <= i; j++) {
+                        retval <<= 7;
+                        byte tmp = encoding[j];
+                        retval |= (tmp & 0x07f);
+                    }
+                    if (fromPos == 0) {
+                        if (retval < 80) {
+                            result[which++] = retval / 40;
+                            result[which++] = retval % 40;
+                        } else {
+                            result[which++] = 2;
+                            result[which++] = retval - 80;
+                        }
+                    } else {
+                        result[which++] = retval;
+                    }
+                }
+                fromPos = i+1;
+            }
+            if (which >= result.length) {
+                result = Arrays.copyOf(result, which + 10);
             }
         }
-        return true;
-    }
-
-    public int hashCode() {
-        int h = componentLen;
-        for (int i = 0; i < componentLen; i++) {
-            h += components[i] * 37;
-        }
-        return h;
+        return Arrays.copyOf(result, which);
     }
 
     /**
@@ -431,15 +413,52 @@
      * user-friendly descriptive strings, since those strings
      * will not be understood everywhere.
      */
+    @Override
     public String toString() {
         String s = stringForm;
         if (s == null) {
-            StringBuffer sb = new StringBuffer(componentLen * 4);
-            for (int i = 0; i < componentLen; i++) {
-                if (i != 0) {
-                    sb.append('.');
+            int length = encoding.length;
+            StringBuffer sb = new StringBuffer(length * 4);
+
+            int fromPos = 0;
+            for (int i = 0; i < length; i++) {
+                if ((encoding[i] & 0x80) == 0) {
+                    // one section [fromPos..i]
+                    if (fromPos != 0) {  // not the first segment
+                        sb.append('.');
+                    }
+                    if (i - fromPos + 1 > 4) { // maybe big integer
+                        BigInteger big = new BigInteger(pack(encoding, fromPos, i-fromPos+1, 7, 8));
+                        if (fromPos == 0) {
+                            // first section encoded with more than 4 bytes,
+                            // must be 2.something
+                            sb.append("2.");
+                            sb.append(big.subtract(BigInteger.valueOf(80)));
+                        } else {
+                            sb.append(big);
+                        }
+                    } else { // small integer
+                        int retval = 0;
+                        for (int j = fromPos; j <= i; j++) {
+                            retval <<= 7;
+                            byte tmp = encoding[j];
+                            retval |= (tmp & 0x07f);
+                        }
+                        if (fromPos == 0) {
+                            if (retval < 80) {
+                                sb.append(retval/40);
+                                sb.append('.');
+                                sb.append(retval%40);
+                            } else {
+                                sb.append("2.");
+                                sb.append(retval - 80);
+                            }
+                        } else {
+                            sb.append(retval);
+                        }
+                    }
+                    fromPos = i+1;
                 }
-                sb.append(components[i]);
             }
             s = sb.toString();
             stringForm = s;
@@ -447,15 +466,197 @@
         return s;
     }
 
-    /*
-     * To simplify, we assume no individual component of an object ID is
-     * larger than 32 bits.  Then we represent the path from the root as
-     * an array that's (usually) only filled at the beginning.
+    /**
+     * Repack all bits from input to output. On the both sides, only a portion
+     * (from the least significant bit) of the 8 bits in a byte is used. This
+     * number is defined as the number of useful bits (NUB) for the array. All the
+     * used bits from the input byte array and repacked into the output in the
+     * exactly same order. The output bits are aligned so that the final bit of
+     * the input (the least significant bit in the last byte), when repacked as
+     * the final bit of the output, is still at the least significant position.
+     * Zeroes will be padded on the left side of the first output byte if
+     * necessary. All unused bits in the output are also zeroed.
+     *
+     * For example: if the input is 01001100 with NUB 8, the output which
+     * has a NUB 6 will look like:
+     *      00000001 00001100
+     * The first 2 bits of the output bytes are unused bits. The other bits
+     * turn out to be 000001 001100. While the 8 bits on the right are from
+     * the input, the left 4 zeroes are padded to fill the 6 bits space.
+     *
+     * @param in        the input byte array
+     * @param ioffset   start point inside <code>in</code>
+     * @param ilength   number of bytes to repack
+     * @param iw        NUB for input
+     * @param ow        NUB for output
+     * @return          the repacked bytes
+     */
+    private static byte[] pack(byte[] in, int ioffset, int ilength, int iw, int ow) {
+        assert (iw > 0 && iw <= 8): "input NUB must be between 1 and 8";
+        assert (ow > 0 && ow <= 8): "output NUB must be between 1 and 8";
+
+        if (iw == ow) {
+            return in.clone();
+        }
+
+        int bits = ilength * iw;    // number of all used bits
+        byte[] out = new byte[(bits+ow-1)/ow];
+
+        // starting from the 0th bit in the input
+        int ipos = 0;
+
+        // the number of padding 0's needed in the output, skip them
+        int opos = (bits+ow-1)/ow*ow-bits;
+
+        while(ipos < bits) {
+            int count = iw - ipos%iw;   // unpacked bits in current input byte
+            if (count > ow - opos%ow) { // free space available in output byte
+                count = ow - opos%ow;   // choose the smaller number
+            }
+            // and move them!
+            out[opos/ow] |=                         // paste!
+                (((in[ioffset+ipos/iw]+256)         // locate the byte (+256 so that it's never negative)
+                    >> (iw-ipos%iw-count))          // move to the end of a byte
+                        & ((1 << (count))-1))       // zero out all other bits
+                            << (ow-opos%ow-count);  // move to the output position
+            ipos += count;  // advance
+            opos += count;  // advance
+        }
+        return out;
+    }
+
+    /**
+     * Repack from NUB 8 to a NUB 7 OID sub-identifier, remove all
+     * unnecessary 0 headings, set the first bit of all non-tail
+     * output bytes to 1 (as ITU-T Rec. X.690 8.19.2 says), and
+     * paste it into an existing byte array.
+     * @param out the existing array to be pasted into
+     * @param ooffset the starting position to paste
+     * @return the number of bytes pasted
+     */
+    private static int pack7Oid(byte[] in, int ioffset, int ilength, byte[] out, int ooffset) {
+        byte[] pack = pack(in, ioffset, ilength, 8, 7);
+        int firstNonZero = pack.length-1;   // paste at least one byte
+        for (int i=pack.length-2; i>=0; i--) {
+            if (pack[i] != 0) {
+                firstNonZero = i;
+            }
+            pack[i] |= 0x80;
+        }
+        System.arraycopy(pack, firstNonZero, out, ooffset, pack.length-firstNonZero);
+        return pack.length-firstNonZero;
+    }
+
+    /**
+     * Repack from NUB 7 to NUB 8, remove all unnecessary 0
+     * headings, and paste it into an existing byte array.
+     * @param out the existing array to be pasted into
+     * @param ooffset the starting position to paste
+     * @return the number of bytes pasted
      */
-    private int         components [];                  // path from root
-    private int         componentLen;                   // how much is used.
+    private static int pack8(byte[] in, int ioffset, int ilength, byte[] out, int ooffset) {
+        byte[] pack = pack(in, ioffset, ilength, 7, 8);
+        int firstNonZero = pack.length-1;   // paste at least one byte
+        for (int i=pack.length-2; i>=0; i--) {
+            if (pack[i] != 0) {
+                firstNonZero = i;
+            }
+        }
+        System.arraycopy(pack, firstNonZero, out, ooffset, pack.length-firstNonZero);
+        return pack.length-firstNonZero;
+    }
+
+    /**
+     * Pack the int into a OID sub-identifier DER encoding
+     */
+    private static int pack7Oid(int input, byte[] out, int ooffset) {
+        byte[] b = new byte[4];
+        b[0] = (byte)(input >> 24);
+        b[1] = (byte)(input >> 16);
+        b[2] = (byte)(input >> 8);
+        b[3] = (byte)(input);
+        return pack7Oid(b, 0, 4, out, ooffset);
+    }
+
+    /**
+     * Pack the BigInteger into a OID subidentifier DER encoding
+     */
+    private static int pack7Oid(BigInteger input, byte[] out, int ooffset) {
+        byte[] b = input.toByteArray();
+        return pack7Oid(b, 0, b.length, out, ooffset);
+    }
+
+    /**
+     * Private methods to check validity of OID. They must be --
+     * 1. at least 2 components
+     * 2. all components must be non-negative
+     * 3. the first must be 0, 1 or 2
+     * 4. if the first is 0 or 1, the second must be <40
+     */
 
-    private transient volatile String stringForm;
-
-    private static final int allocationQuantum = 5;     // >= 2
+    /**
+     * Check the DER encoding. Since DER encoding defines that the integer bits
+     * are unsigned, so there's no need to check the MSB.
+     */
+    private static void check(byte[] encoding) throws IOException {
+        int length = encoding.length;
+        if (length < 1 ||      // too short
+                (encoding[length - 1] & 0x80) != 0) {  // not ended
+            throw new IOException("ObjectIdentifier() -- " +
+                    "Invalid DER encoding, not ended");
+        }
+        for (int i=0; i<length; i++) {
+            // 0x80 at the beginning of a subidentifier
+            if (encoding[i] == (byte)0x80 &&
+                    (i==0 || (encoding[i-1] & 0x80) == 0)) {
+                throw new IOException("ObjectIdentifier() -- " +
+                        "Invalid DER encoding, useless extra octet detected");
+            }
+        }
+    }
+    private static void checkCount(int count) throws IOException {
+        if (count < 2) {
+            throw new IOException("ObjectIdentifier() -- " +
+                    "Must be at least two oid components ");
+        }
+    }
+    private static void checkFirstComponent(int first) throws IOException {
+        if (first < 0 || first > 2) {
+            throw new IOException("ObjectIdentifier() -- " +
+                    "First oid component is invalid ");
+        }
+    }
+    private static void checkFirstComponent(BigInteger first) throws IOException {
+        if (first.signum() == -1 ||
+                first.compareTo(BigInteger.valueOf(2)) == 1) {
+            throw new IOException("ObjectIdentifier() -- " +
+                    "First oid component is invalid ");
+        }
+    }
+    private static void checkSecondComponent(int first, int second) throws IOException {
+        if (second < 0 || first != 2 && second > 39) {
+            throw new IOException("ObjectIdentifier() -- " +
+                    "Second oid component is invalid ");
+        }
+    }
+    private static void checkSecondComponent(int first, BigInteger second) throws IOException {
+        if (second.signum() == -1 ||
+                first != 2 &&
+                second.compareTo(BigInteger.valueOf(39)) == 1) {
+            throw new IOException("ObjectIdentifier() -- " +
+                    "Second oid component is invalid ");
+        }
+    }
+    private static void checkOtherComponent(int i, int num) throws IOException {
+        if (num < 0) {
+            throw new IOException("ObjectIdentifier() -- " +
+                    "oid component #" + (i+1) + " must be non-negative ");
+        }
+    }
+    private static void checkOtherComponent(int i, BigInteger num) throws IOException {
+        if (num.signum() == -1) {
+            throw new IOException("ObjectIdentifier() -- " +
+                    "oid component #" + (i+1) + " must be non-negative ");
+        }
+    }
 }
--- a/jdk/src/share/lib/management/jmxremote.access	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/lib/management/jmxremote.access	Sat Apr 18 14:10:27 2009 -0700
@@ -8,7 +8,7 @@
 # passwords.  To be functional, a role must have an entry in
 # both the password and the access files.
 #
-# Default location of this file is $JRE/lib/management/jmxremote.access
+# The default location of this file is $JRE/lib/management/jmxremote.access
 # You can specify an alternate location by specifying a property in 
 # the management config file $JRE/lib/management/management.properties
 # (See that file for details)
@@ -16,7 +16,7 @@
 # The file format for password and access files is syntactically the same
 # as the Properties file format.  The syntax is described in the Javadoc
 # for java.util.Properties.load.
-# Typical access file has multiple  lines, where each line is blank,
+# A typical access file has multiple lines, where each line is blank,
 # a comment (like this one), or an access control entry.
 #
 # An access control entry consists of a role name, and an
@@ -29,10 +29,38 @@
 #                   role can read measurements but cannot perform any action
 #                   that changes the environment of the running program.
 #       "readwrite" grants access to read and write attributes of MBeans,
-#                   to invoke operations on them, and to create or remove them.
-#		    This access should be granted to only trusted clients, 
-#                   since they can potentially interfere with the smooth
-#		    operation of a running program 
+#                   to invoke operations on them, and optionally
+#                   to create or remove them. This access should be granted
+#                   only to trusted clients, since they can potentially
+#                   interfere with the smooth operation of a running program.
+#
+# The "readwrite" access level can optionally be followed by the "create" and/or
+# "unregister" keywords.  The "unregister" keyword grants access to unregister
+# (delete) MBeans.  The "create" keyword grants access to create MBeans of a
+# particular class or of any class matching a particular pattern.  Access
+# should only be granted to create MBeans of known and trusted classes.
+#
+# For example, the following entry would grant readwrite access
+# to "controlRole", as well as access to create MBeans of the class
+# javax.management.monitor.CounterMonitor and to unregister any MBean:
+#  controlRole readwrite \
+#              create javax.management.monitor.CounterMonitorMBean \
+#              unregister
+# or equivalently:
+#  controlRole readwrite unregister create javax.management.monitor.CounterMBean
+#
+# The following entry would grant readwrite access as well as access to create
+# MBeans of any class in the packages javax.management.monitor and
+# javax.management.timer:
+#  controlRole readwrite \
+#              create javax.management.monitor.*,javax.management.timer.* \
+#              unregister
+#
+# The \ character is defined in the Properties file syntax to allow continuation
+# lines as shown here.  A * in a class pattern matches a sequence of characters
+# other than dot (.), so javax.management.monitor.* matches
+# javax.management.monitor.CounterMonitor but not
+# javax.management.monitor.foo.Bar.
 #
 # A given role should have at most one entry in this file.  If a role
 # has no entry, it has no access.
@@ -42,7 +70,10 @@
 #
 # Default access control entries:
 # o The "monitorRole" role has readonly access.  
-# o The "controlRole" role has readwrite access.
+# o The "controlRole" role has readwrite access and can create the standard
+#   Timer and Monitor MBeans defined by the JMX API.
 
 monitorRole   readonly
-controlRole   readwrite
+controlRole   readwrite \
+              create javax.management.monitor.*,javax.management.timer.* \
+              unregister
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/bands.cpp	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -94,6 +94,7 @@
       assert(!valc->isMalloc);
     }
     xvs.init(u->rp, u->rplimit, valc);
+    CHECK;
     int X = xvs.getInt();
     if (valc->S() != 0) {
       assert(valc->min <= -256);
@@ -117,6 +118,7 @@
     byte XB_byte = (byte) XB;
     byte* XB_ptr = &XB_byte;
     cm.init(u->rp, u->rplimit, XB_ptr, 0, defc, length, null);
+    CHECK;
   } else {
     NOT_PRODUCT(byte* meta_rp0 = u->meta_rp);
     assert(u->meta_rp != null);
@@ -215,8 +217,19 @@
   if (length == 0)  return 0;
   if (total_memo > 0)  return total_memo-1;
   int total = getInt();
+  // overflow checks require that none of the addends are <0,
+  // and that the partial sums never overflow (wrap negative)
+  if (total < 0) {
+    abort("overflow detected");
+    return 0;
+  }
   for (int k = length-1; k > 0; k--) {
+    int prev_total = total;
     total += vs[0].getInt();
+    if (total < prev_total) {
+      abort("overflow detected");
+      return 0;
+    }
   }
   rewind();
   total_memo = total+1;
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/bytes.cpp	Sat Apr 18 14:10:27 2009 -0700
@@ -56,7 +56,7 @@
     return;
   }
   byte* oldptr = ptr;
-  ptr = (byte*)::realloc(ptr, len_+1);
+  ptr = (len_ >= PSIZE_MAX) ? null : (byte*)::realloc(ptr, len_+1);
   if (ptr != null)  {
     mtrace('r', oldptr, 0);
     mtrace('m', ptr, len_+1);
@@ -128,7 +128,7 @@
 // Make sure there are 'o' bytes beyond the fill pointer,
 // advance the fill pointer, and return the old fill pointer.
 byte* fillbytes::grow(size_t s) {
-  size_t nlen = b.len+s;
+  size_t nlen = add_size(b.len, s);
   if (nlen <= allocated) {
     b.len = nlen;
     return limit()-s;
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/coding.cpp	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2002-2009 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -814,6 +814,7 @@
     }
     band_rp = vs.rp;
   }
+  CHECK;
 
   // Get an accurate upper limit now.
   vs0.rplimit = band_rp;
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/defines.h	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2001-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2001-2009 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -47,11 +47,13 @@
 #define NOT_PRODUCT(xxx)
 #define assert(p)
 #define PRINTCR(args)
+#define VERSION_STRING "%s version %s\n"
 #else
 #define IF_PRODUCT(xxx)
 #define NOT_PRODUCT(xxx) xxx
 #define assert(p) ((p) || assert_failed(#p))
 #define PRINTCR(args)  u->verbose && u->printcr_if_verbose args
+#define VERSION_STRING "%s version non-product %s\n"
 extern "C" void breakpoint();
 extern int assert_failed(const char*);
 #define BREAK (breakpoint())
@@ -79,9 +81,9 @@
 
 #define lengthof(array) (sizeof(array)/sizeof(array[0]))
 
-#define NEW(T, n)    (T*) must_malloc((int)(sizeof(T)*(n)))
-#define U_NEW(T, n)  (T*) u->alloc(sizeof(T)*(n))
-#define T_NEW(T, n)  (T*) u->temp_alloc(sizeof(T)*(n))
+#define NEW(T, n)    (T*) must_malloc((int)(scale_size(n, sizeof(T))))
+#define U_NEW(T, n)  (T*) u->alloc(scale_size(n, sizeof(T)))
+#define T_NEW(T, n)  (T*) u->temp_alloc(scale_size(n, sizeof(T)))
 
 
 // bytes and byte arrays
@@ -153,6 +155,8 @@
 #define CHECK_NULL_(y,p)        _CHECK_DO((p)==null, return y)
 #define CHECK_NULL_0(p)         _CHECK_DO((p)==null, return 0)
 
+#define CHECK_COUNT(t)          if (t < 0){abort("bad value count");} CHECK
+
 #define STR_TRUE   "true"
 #define STR_FALSE  "false"
 
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/main.cpp	Sat Apr 18 14:10:27 2009 -0700
@@ -299,7 +299,7 @@
     case 'J':  argp += 1; break;  // skip ignored -Jxxx parameter
 
     case 'V':
-      fprintf(u.errstrm, "%s version %s\n", nbasename(argv[0]), sccsver);
+      fprintf(u.errstrm, VERSION_STRING, nbasename(argv[0]), sccsver);
       exit(0);
 
     case 'h':
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.cpp	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2001-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2001-2009 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -523,15 +523,39 @@
   enum {
     MAGIC_BYTES = 4,
     AH_LENGTH_0 = 3,  //minver, majver, options are outside of archive_size
+    AH_LENGTH_0_MAX = AH_LENGTH_0 + 1,  // options might have 2 bytes
     AH_LENGTH   = 26, //maximum archive header length (w/ all fields)
     // Length contributions from optional header fields:
     AH_FILE_HEADER_LEN = 5, // sizehi/lo/next/modtime/files
+    AH_ARCHIVE_SIZE_LEN = 2, // sizehi/lo only; part of AH_FILE_HEADER_LEN
     AH_CP_NUMBER_LEN = 4,  // int/float/long/double
     AH_SPECIAL_FORMAT_LEN = 2, // layouts/band-headers
     AH_LENGTH_MIN = AH_LENGTH
         -(AH_FILE_HEADER_LEN+AH_SPECIAL_FORMAT_LEN+AH_CP_NUMBER_LEN),
+    ARCHIVE_SIZE_MIN = AH_LENGTH_MIN - (AH_LENGTH_0 + AH_ARCHIVE_SIZE_LEN),
     FIRST_READ  = MAGIC_BYTES + AH_LENGTH_MIN
   };
+
+  assert(AH_LENGTH_MIN    == 15); // # of UNSIGNED5 fields required after archive_magic
+  assert(ARCHIVE_SIZE_MIN == 10); // # of UNSIGNED5 fields required after archive_size
+  // An absolute minimum null archive is magic[4], {minver,majver,options}[3],
+  // archive_size[0], cp_counts[8], class_counts[4], for a total of 19 bytes.
+  // (Note that archive_size is optional; it may be 0..10 bytes in length.)
+  // The first read must capture everything up through the options field.
+  // This happens to work even if {minver,majver,options} is a pathological
+  // 15 bytes long.  Legal pack files limit those three fields to 1+1+2 bytes.
+  assert(FIRST_READ >= MAGIC_BYTES + AH_LENGTH_0 * B_MAX);
+
+  // Up through archive_size, the largest possible archive header is
+  // magic[4], {minver,majver,options}[4], archive_size[10].
+  // (Note only the low 12 bits of options are allowed to be non-zero.)
+  // In order to parse archive_size, we need at least this many bytes
+  // in the first read.  Of course, if archive_size_hi is more than
+  // a byte, we probably will fail to allocate the buffer, since it
+  // will be many gigabytes long.  This is a practical, not an
+  // architectural limit to Pack200 archive sizes.
+  assert(FIRST_READ >= MAGIC_BYTES + AH_LENGTH_0_MAX + 2*B_MAX);
+
   bool foreign_buf = (read_input_fn == null);
   byte initbuf[(int)FIRST_READ + (int)C_SLOP + 200];  // 200 is for JAR I/O
   if (foreign_buf) {
@@ -547,7 +571,7 @@
     // There is no way to tell the caller that we used only part of them.
     // Therefore, the caller must use only a bare minimum of read-ahead.
     if (inbytes.len > FIRST_READ) {
-      abort("too much pushback");
+      abort("too much read-ahead");
       return;
     }
     input.set(initbuf, sizeof(initbuf));
@@ -557,7 +581,7 @@
     rplimit += inbytes.len;
     bytes_read += inbytes.len;
   }
-  // Read only 19 bytes, which is certain to contain #archive_size fields,
+  // Read only 19 bytes, which is certain to contain #archive_options fields,
   // but is certain not to overflow past the archive_header.
   input.b.len = FIRST_READ;
   if (!ensure_input(FIRST_READ))
@@ -629,26 +653,25 @@
 #undef ORBIT
   if ((archive_options & ~OPTION_LIMIT) != 0) {
     fprintf(errstrm, "Warning: Illegal archive options 0x%x\n",
-            archive_options);
-    // Do not abort.  If the format really changes, version numbers will bump.
-    //abort("illegal archive options");
+        archive_options);
+    abort("illegal archive options");
+    return;
   }
 
   if ((archive_options & AO_HAVE_FILE_HEADERS) != 0) {
     uint hi = hdr.getInt();
     uint lo = hdr.getInt();
-    archive_size = band::makeLong(hi, lo);
+    julong x = band::makeLong(hi, lo);
+    archive_size = (size_t) x;
+    if (archive_size != x) {
+      // Silly size specified; force overflow.
+      archive_size = PSIZE_MAX+1;
+    }
     hdrVals += 2;
   } else {
     hdrValsSkipped += 2;
   }
 
-  if (archive_size != (size_t)archive_size) {
-    // Silly size specified.
-    abort("archive too large");
-    return;
-  }
-
   // Now we can size the whole archive.
   // Read everything else into a mega-buffer.
   rp = hdr.rp;
@@ -662,9 +685,18 @@
       abort("EOF reading fixed input buffer");
       return;
     }
-  } else if (archive_size > 0) {
-    input.set(U_NEW(byte, (size_t)(header_size_0 + archive_size + C_SLOP)),
-              (size_t) header_size_0 + (size_t)archive_size);
+  } else if (archive_size != 0) {
+    if (archive_size < ARCHIVE_SIZE_MIN) {
+      abort("impossible archive size");  // bad input data
+      return;
+    }
+    if (archive_size < header_size_1) {
+      abort("too much read-ahead");  // somehow we pre-fetched too much?
+      return;
+    }
+    input.set(U_NEW(byte, add_size(header_size_0, archive_size, C_SLOP)),
+              (size_t) header_size_0 + archive_size);
+    CHECK;
     assert(input.limit()[0] == 0);
     // Move all the bytes we read initially into the real buffer.
     input.b.copyFrom(initbuf, header_size);
@@ -673,17 +705,17 @@
   } else {
     // It's more complicated and painful.
     // A zero archive_size means that we must read until EOF.
-    assert(archive_size == 0);
     input.init(CHUNK*2);
     CHECK;
     input.b.len = input.allocated;
     rp = rplimit = input.base();
     // Set up input buffer as if we already read the header:
     input.b.copyFrom(initbuf, header_size);
+    CHECK;
     rplimit += header_size;
     while (ensure_input(input.limit() - rp)) {
       size_t dataSoFar = input_remaining();
-      size_t nextSize = dataSoFar + CHUNK;
+      size_t nextSize = add_size(dataSoFar, CHUNK);
       input.ensureSize(nextSize);
       CHECK;
       input.b.len = input.allocated;
@@ -715,8 +747,10 @@
 
   if ((archive_options & AO_HAVE_FILE_HEADERS) != 0) {
     archive_next_count = hdr.getInt();
+    CHECK_COUNT(archive_next_count);
     archive_modtime = hdr.getInt();
     file_count = hdr.getInt();
+    CHECK_COUNT(file_count);
     hdrVals += 3;
   } else {
     hdrValsSkipped += 3;
@@ -724,7 +758,9 @@
 
   if ((archive_options & AO_HAVE_SPECIAL_FORMATS) != 0) {
     band_headers_size = hdr.getInt();
+    CHECK_COUNT(band_headers_size);
     attr_definition_count = hdr.getInt();
+    CHECK_COUNT(attr_definition_count);
     hdrVals += 2;
   } else {
     hdrValsSkipped += 2;
@@ -744,13 +780,16 @@
       }
     }
     cp_counts[k] = hdr.getInt();
+    CHECK_COUNT(cp_counts[k]);
     hdrVals += 1;
   }
 
   ic_count = hdr.getInt();
+  CHECK_COUNT(ic_count);
   default_class_minver = hdr.getInt();
   default_class_majver = hdr.getInt();
   class_count = hdr.getInt();
+  CHECK_COUNT(class_count);
   hdrVals += 4;
 
   // done with archive_header
@@ -807,7 +846,6 @@
   bytes::of(band_headers.limit(), C_SLOP).clear(_meta_error);
 }
 
-
 void unpacker::finish() {
   if (verbose >= 1) {
     fprintf(errstrm,
@@ -973,12 +1011,12 @@
   // First band:  Read lengths of shared prefixes.
   if (len > PREFIX_SKIP_2)
     cp_Utf8_prefix.readData(len - PREFIX_SKIP_2);
-  NOT_PRODUCT(else cp_Utf8_prefix.readData(0));  // for asserts
+    NOT_PRODUCT(else cp_Utf8_prefix.readData(0));  // for asserts
 
   // Second band:  Read lengths of unshared suffixes:
   if (len > SUFFIX_SKIP_1)
     cp_Utf8_suffix.readData(len - SUFFIX_SKIP_1);
-  NOT_PRODUCT(else cp_Utf8_suffix.readData(0));  // for asserts
+    NOT_PRODUCT(else cp_Utf8_suffix.readData(0));  // for asserts
 
   bytes* allsuffixes = T_NEW(bytes, len);
   CHECK;
@@ -2117,6 +2155,7 @@
 
   field_descr.readData(field_count);
   read_attrs(ATTR_CONTEXT_FIELD, field_count);
+  CHECK;
 
   method_descr.readData(method_count);
   read_attrs(ATTR_CONTEXT_METHOD, method_count);
@@ -2124,6 +2163,7 @@
   CHECK;
 
   read_attrs(ATTR_CONTEXT_CLASS, class_count);
+  CHECK;
 
   read_code_headers();
 
@@ -2150,10 +2190,12 @@
   assert(endsWith(xxx_flags_hi.name, "_flags_hi"));
   if (haveLongFlags)
     xxx_flags_hi.readData(obj_count);
+  CHECK;
 
   band& xxx_flags_lo = ad.xxx_flags_lo();
   assert(endsWith(xxx_flags_lo.name, "_flags_lo"));
   xxx_flags_lo.readData(obj_count);
+  CHECK;
 
   // pre-scan flags, counting occurrences of each index bit
   julong indexMask = ad.flagIndexMask();  // which flag bits are index bits?
@@ -2176,11 +2218,13 @@
   assert(endsWith(xxx_attr_count.name, "_attr_count"));
   // There is one count element for each 1<<16 bit set in flags:
   xxx_attr_count.readData(ad.predefCount(X_ATTR_OVERFLOW));
+  CHECK;
 
   band& xxx_attr_indexes = ad.xxx_attr_indexes();
   assert(endsWith(xxx_attr_indexes.name, "_attr_indexes"));
   int overflowIndexCount = xxx_attr_count.getIntTotal();
   xxx_attr_indexes.readData(overflowIndexCount);
+  CHECK;
   // pre-scan attr indexes, counting occurrences of each value
   for (i = 0; i < overflowIndexCount; i++) {
     idx = xxx_attr_indexes.getInt();
@@ -2211,6 +2255,7 @@
     }
   }
   ad.xxx_attr_calls().readData(backwardCounts);
+  CHECK;
 
   // Read built-in bands.
   // Mostly, these are hand-coded equivalents to readBandData().
@@ -2219,42 +2264,53 @@
 
     count = ad.predefCount(CLASS_ATTR_SourceFile);
     class_SourceFile_RUN.readData(count);
+    CHECK;
 
     count = ad.predefCount(CLASS_ATTR_EnclosingMethod);
     class_EnclosingMethod_RC.readData(count);
     class_EnclosingMethod_RDN.readData(count);
+    CHECK;
 
     count = ad.predefCount(X_ATTR_Signature);
     class_Signature_RS.readData(count);
+    CHECK;
 
     ad.readBandData(X_ATTR_RuntimeVisibleAnnotations);
     ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations);
 
     count = ad.predefCount(CLASS_ATTR_InnerClasses);
     class_InnerClasses_N.readData(count);
+    CHECK;
+
     count = class_InnerClasses_N.getIntTotal();
     class_InnerClasses_RC.readData(count);
     class_InnerClasses_F.readData(count);
+    CHECK;
     // Drop remaining columns wherever flags are zero:
     count -= class_InnerClasses_F.getIntCount(0);
     class_InnerClasses_outer_RCN.readData(count);
     class_InnerClasses_name_RUN.readData(count);
+    CHECK;
 
     count = ad.predefCount(CLASS_ATTR_ClassFile_version);
     class_ClassFile_version_minor_H.readData(count);
     class_ClassFile_version_major_H.readData(count);
+    CHECK;
     break;
 
   case ATTR_CONTEXT_FIELD:
 
     count = ad.predefCount(FIELD_ATTR_ConstantValue);
     field_ConstantValue_KQ.readData(count);
+    CHECK;
 
     count = ad.predefCount(X_ATTR_Signature);
     field_Signature_RS.readData(count);
+    CHECK;
 
     ad.readBandData(X_ATTR_RuntimeVisibleAnnotations);
     ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations);
+    CHECK;
     break;
 
   case ATTR_CONTEXT_METHOD:
@@ -2266,15 +2322,18 @@
     method_Exceptions_N.readData(count);
     count = method_Exceptions_N.getIntTotal();
     method_Exceptions_RC.readData(count);
+    CHECK;
 
     count = ad.predefCount(X_ATTR_Signature);
     method_Signature_RS.readData(count);
+    CHECK;
 
     ad.readBandData(X_ATTR_RuntimeVisibleAnnotations);
     ad.readBandData(X_ATTR_RuntimeInvisibleAnnotations);
     ad.readBandData(METHOD_ATTR_RuntimeVisibleParameterAnnotations);
     ad.readBandData(METHOD_ATTR_RuntimeInvisibleParameterAnnotations);
     ad.readBandData(METHOD_ATTR_AnnotationDefault);
+    CHECK;
     break;
 
   case ATTR_CONTEXT_CODE:
@@ -2286,8 +2345,10 @@
       return;
     }
     code_StackMapTable_N.readData(count);
+    CHECK;
     count = code_StackMapTable_N.getIntTotal();
     code_StackMapTable_frame_T.readData(count);
+    CHECK;
     // the rest of it depends in a complicated way on frame tags
     {
       int fat_frame_count = 0;
@@ -2321,18 +2382,23 @@
       // deal completely with fat frames:
       offset_count += fat_frame_count;
       code_StackMapTable_local_N.readData(fat_frame_count);
+      CHECK;
       type_count += code_StackMapTable_local_N.getIntTotal();
       code_StackMapTable_stack_N.readData(fat_frame_count);
       type_count += code_StackMapTable_stack_N.getIntTotal();
+      CHECK;
       // read the rest:
       code_StackMapTable_offset.readData(offset_count);
       code_StackMapTable_T.readData(type_count);
+      CHECK;
       // (7) [RCH]
       count = code_StackMapTable_T.getIntCount(7);
       code_StackMapTable_RC.readData(count);
+      CHECK;
       // (8) [PH]
       count = code_StackMapTable_T.getIntCount(8);
       code_StackMapTable_P.readData(count);
+      CHECK;
     }
 
     count = ad.predefCount(CODE_ATTR_LineNumberTable);
@@ -2654,6 +2720,7 @@
   code_max_na_locals.readData();
   code_handler_count.readData();
   totalHandlerCount += code_handler_count.getIntTotal();
+  CHECK;
 
   // Read handler specifications.
   // Cf. PackageReader.readCodeHandlers.
@@ -2661,8 +2728,10 @@
   code_handler_end_PO.readData(totalHandlerCount);
   code_handler_catch_PO.readData(totalHandlerCount);
   code_handler_class_RCN.readData(totalHandlerCount);
+  CHECK;
 
   read_attrs(ATTR_CONTEXT_CODE, totalFlagsCount);
+  CHECK;
 }
 
 static inline bool is_in_range(uint n, uint min, uint max) {
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/unpack.h	Sat Apr 18 14:10:27 2009 -0700
@@ -204,7 +204,7 @@
 
   // archive header fields
   int      magic, minver, majver;
-  julong   archive_size;
+  size_t   archive_size;
   int      archive_next_count, archive_options, archive_modtime;
   int      band_headers_size;
   int      file_count, attr_definition_count, ic_count, class_count;
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/utils.cpp	Sat Apr 18 14:10:27 2009 -0700
@@ -46,14 +46,13 @@
 
 #include "unpack.h"
 
-void* must_malloc(int size) {
-  int msize = size;
-  assert(size >= 0);
+void* must_malloc(size_t size) {
+  size_t msize = size;
   #ifdef USE_MTRACE
-  if (msize < sizeof(int))
+  if (msize >= 0 && msize < sizeof(int))
     msize = sizeof(int);  // see 0xbaadf00d below
   #endif
-  void* ptr = malloc(msize);
+  void* ptr = (msize > PSIZE_MAX) ? null : malloc(msize);
   if (ptr != null) {
     memset(ptr, 0, size);
   } else {
--- a/jdk/src/share/native/com/sun/java/util/jar/pack/utils.h	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/com/sun/java/util/jar/pack/utils.h	Sat Apr 18 14:10:27 2009 -0700
@@ -25,13 +25,31 @@
 
 //Definitions of our util functions
 
-void* must_malloc(int size);
+void* must_malloc(size_t size);
 #ifndef USE_MTRACE
 #define mtrace(c, ptr, size)
 #else
 void mtrace(char c, void* ptr, size_t size);
 #endif
 
+// overflow management
+#define OVERFLOW ((size_t)-1)
+#define PSIZE_MAX (OVERFLOW/2)  /* normal size limit */
+
+inline size_t scale_size(size_t size, size_t scale) {
+  return (size > PSIZE_MAX / scale) ? OVERFLOW : size * scale;
+}
+
+inline size_t add_size(size_t size1, size_t size2) {
+  return ((size1 | size2 | (size1 + size2)) > PSIZE_MAX)
+    ? OVERFLOW
+    : size1 + size2;
+}
+
+inline size_t add_size(size_t size1, size_t size2, int size3) {
+  return add_size(add_size(size1, size2), size3);
+}
+
 // These may be expensive, because they have to go via Java TSD,
 // if the optional u argument is missing.
 struct unpacker;
--- a/jdk/src/share/native/java/util/zip/ZipEntry.c	Thu Apr 16 11:22:52 2009 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/*
- * Copyright 1998 Sun Microsystems, Inc.  All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-/*
- * Native method support for java.util.zip.ZipEntry
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "jlong.h"
-#include "jvm.h"
-#include "jni.h"
-#include "jni_util.h"
-#include "zip_util.h"
-
-#include "java_util_zip_ZipEntry.h"
-
-#define DEFLATED 8
-#define STORED 0
-
-static jfieldID nameID;
-static jfieldID timeID;
-static jfieldID crcID;
-static jfieldID sizeID;
-static jfieldID csizeID;
-static jfieldID methodID;
-static jfieldID extraID;
-static jfieldID commentID;
-
-JNIEXPORT void JNICALL
-Java_java_util_zip_ZipEntry_initIDs(JNIEnv *env, jclass cls)
-{
-    nameID = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;");
-    timeID = (*env)->GetFieldID(env, cls, "time", "J");
-    crcID = (*env)->GetFieldID(env, cls, "crc", "J");
-    sizeID = (*env)->GetFieldID(env, cls, "size", "J");
-    csizeID = (*env)->GetFieldID(env, cls, "csize", "J");
-    methodID = (*env)->GetFieldID(env, cls, "method", "I");
-    extraID = (*env)->GetFieldID(env, cls, "extra", "[B");
-    commentID = (*env)->GetFieldID(env, cls, "comment", "Ljava/lang/String;");
-}
-
-JNIEXPORT void JNICALL
-Java_java_util_zip_ZipEntry_initFields(JNIEnv *env, jobject obj, jlong zentry)
-{
-    jzentry *ze = jlong_to_ptr(zentry);
-    jstring name = (*env)->GetObjectField(env, obj, nameID);
-
-    if (name == 0) {
-        name = (*env)->NewStringUTF(env, ze->name);
-        if (name == 0) {
-            return;
-        }
-        (*env)->SetObjectField(env, obj, nameID, name);
-    }
-    (*env)->SetLongField(env, obj, timeID, (jlong)ze->time & 0xffffffffUL);
-    (*env)->SetLongField(env, obj, crcID, (jlong)ze->crc & 0xffffffffUL);
-    (*env)->SetLongField(env, obj, sizeID, (jlong)ze->size);
-    if (ze->csize == 0) {
-        (*env)->SetLongField(env, obj, csizeID, (jlong)ze->size);
-        (*env)->SetIntField(env, obj, methodID, STORED);
-    } else {
-        (*env)->SetLongField(env, obj, csizeID, (jlong)ze->csize);
-        (*env)->SetIntField(env, obj, methodID, DEFLATED);
-    }
-    if (ze->extra != 0) {
-        unsigned char *bp = (unsigned char *)&ze->extra[0];
-        jsize len = (bp[0] | (bp[1] << 8));
-        jbyteArray extra = (*env)->NewByteArray(env, len);
-        if (extra == 0) {
-            return;
-        }
-        (*env)->SetByteArrayRegion(env, extra, 0, len, &ze->extra[2]);
-        (*env)->SetObjectField(env, obj, extraID, extra);
-    }
-    if (ze->comment != 0) {
-        jstring comment = (*env)->NewStringUTF(env, ze->comment);
-        if (comment == 0) {
-            return;
-        }
-        (*env)->SetObjectField(env, obj, commentID, comment);
-    }
-}
--- a/jdk/src/share/native/java/util/zip/ZipFile.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/java/util/zip/ZipFile.c	Sat Apr 18 14:10:27 2009 -0700
@@ -141,12 +141,11 @@
 
 JNIEXPORT jlong JNICALL
 Java_java_util_zip_ZipFile_getEntry(JNIEnv *env, jclass cls, jlong zfile,
-                                    jstring name, jboolean addSlash)
+                                    jbyteArray name, jboolean addSlash)
 {
 #define MAXNAME 1024
     jzfile *zip = jlong_to_ptr(zfile);
-    jsize slen = (*env)->GetStringLength(env, name);
-    jsize ulen = (*env)->GetStringUTFLength(env, name);
+    jsize ulen = (*env)->GetArrayLength(env, name);
     char buf[MAXNAME+2], *path;
     jzentry *ze;
 
@@ -159,7 +158,7 @@
     } else {
         path = buf;
     }
-    (*env)->GetStringUTFRegion(env, name, 0, slen, path);
+    (*env)->GetByteArrayRegion(env, name, 0, ulen, (jbyte *)path);
     path[ulen] = '\0';
     if (addSlash == JNI_FALSE) {
         ze = ZIP_GetEntry(zip, path, 0);
@@ -186,32 +185,85 @@
                                         jint n)
 {
     jzentry *ze = ZIP_GetNextEntry(jlong_to_ptr(zfile), n);
-
     return ptr_to_jlong(ze);
 }
 
 JNIEXPORT jint JNICALL
-Java_java_util_zip_ZipFile_getMethod(JNIEnv *env, jclass cls, jlong zentry)
+Java_java_util_zip_ZipFile_getEntryMethod(JNIEnv *env, jclass cls, jlong zentry)
 {
     jzentry *ze = jlong_to_ptr(zentry);
-
     return ze->csize != 0 ? DEFLATED : STORED;
 }
 
-JNIEXPORT jlong JNICALL
-Java_java_util_zip_ZipFile_getCSize(JNIEnv *env, jclass cls, jlong zentry)
+JNIEXPORT jint JNICALL
+Java_java_util_zip_ZipFile_getEntryFlag(JNIEnv *env, jclass cls, jlong zentry)
 {
     jzentry *ze = jlong_to_ptr(zentry);
+    return ze->flag;
+}
 
+JNIEXPORT jlong JNICALL
+Java_java_util_zip_ZipFile_getEntryCSize(JNIEnv *env, jclass cls, jlong zentry)
+{
+    jzentry *ze = jlong_to_ptr(zentry);
     return ze->csize != 0 ? ze->csize : ze->size;
 }
 
 JNIEXPORT jlong JNICALL
-Java_java_util_zip_ZipFile_getSize(JNIEnv *env, jclass cls, jlong zentry)
+Java_java_util_zip_ZipFile_getEntrySize(JNIEnv *env, jclass cls, jlong zentry)
+{
+    jzentry *ze = jlong_to_ptr(zentry);
+    return ze->size;
+}
+
+JNIEXPORT jlong JNICALL
+Java_java_util_zip_ZipFile_getEntryTime(JNIEnv *env, jclass cls, jlong zentry)
+{
+    jzentry *ze = jlong_to_ptr(zentry);
+    return (jlong)ze->time & 0xffffffffUL;
+}
+
+JNIEXPORT jlong JNICALL
+Java_java_util_zip_ZipFile_getEntryCrc(JNIEnv *env, jclass cls, jlong zentry)
+{
+    jzentry *ze = jlong_to_ptr(zentry);
+    return (jlong)ze->crc & 0xffffffffUL;
+}
+
+JNIEXPORT jbyteArray JNICALL
+Java_java_util_zip_ZipFile_getEntryBytes(JNIEnv *env, jclass cls, jlong zentry, jint type)
 {
     jzentry *ze = jlong_to_ptr(zentry);
-
-    return ze->size;
+    int len = 0;
+    jbyteArray jba = NULL;
+    switch (type) {
+    case java_util_zip_ZipFile_JZENTRY_NAME:
+        if (ze->name != 0) {
+            len = (int)strlen(ze->name);
+            if (len == 0 || (jba = (*env)->NewByteArray(env, len)) == NULL)
+                break;
+            (*env)->SetByteArrayRegion(env, jba, 0, len, (jbyte *)ze->name);
+        }
+        break;
+    case java_util_zip_ZipFile_JZENTRY_EXTRA:
+        if (ze->extra != 0) {
+            unsigned char *bp = (unsigned char *)&ze->extra[0];
+            len = (bp[0] | (bp[1] << 8));
+            if (len <= 0 || (jba = (*env)->NewByteArray(env, len)) == NULL)
+                break;
+            (*env)->SetByteArrayRegion(env, jba, 0, len, &ze->extra[2]);
+        }
+        break;
+    case java_util_zip_ZipFile_JZENTRY_COMMENT:
+        if (ze->comment != 0) {
+            len = (int)strlen(ze->comment);
+            if (len == 0 || (jba = (*env)->NewByteArray(env, len)) == NULL)
+                break;
+            (*env)->SetByteArrayRegion(env, jba, 0, len, (jbyte*)ze->comment);
+        }
+        break;
+    }
+    return jba;
 }
 
 JNIEXPORT jint JNICALL
--- a/jdk/src/share/native/java/util/zip/zip_util.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/java/util/zip/zip_util.c	Sat Apr 18 14:10:27 2009 -0700
@@ -512,7 +512,6 @@
 
     /* Clear previous zip error */
     zip->msg = NULL;
-
     /* Get position of END header */
     if ((endpos = findEND(zip, endbuf)) == -1)
         return -1; /* no END header or system error */
@@ -520,7 +519,6 @@
     if (endpos == 0) return 0;  /* only END header present */
 
     freeCEN(zip);
-
    /* Get position and length of central directory */
     cenlen = ENDSIZ(endbuf);
     cenoff = ENDOFF(endbuf);
@@ -935,6 +933,7 @@
     ze->crc   = CENCRC(cen);
     locoff    = CENOFF(cen);
     ze->pos   = -(zip->locpos + locoff);
+    ze->flag  = CENFLG(cen);
 
     if ((ze->name = malloc(nlen + 1)) == NULL) goto Catch;
     memcpy(ze->name, cen + CENHDR, nlen);
--- a/jdk/src/share/native/java/util/zip/zip_util.h	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/java/util/zip/zip_util.h	Sat Apr 18 14:10:27 2009 -0700
@@ -168,6 +168,7 @@
     char *comment;        /* optional zip file comment */
     jbyte *extra;         /* optional extra data */
     jlong pos;            /* position of LOC header or entry data */
+    jint flag;            /* general purpose flag */
 } jzentry;
 
 /*
--- a/jdk/src/share/native/sun/awt/giflib/dgif_lib.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/sun/awt/giflib/dgif_lib.c	Sat Apr 18 14:10:27 2009 -0700
@@ -722,6 +722,10 @@
     GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private;
 
     READ(GifFile, &CodeSize, 1);    /* Read Code size from file. */
+    if (CodeSize >= 12) {
+        /* Invalid initial code size: report failure */
+        return GIF_ERROR;
+    }
     BitsPerPixel = CodeSize;
 
     Private->Buf[0] = 0;    /* Input Buffer empty. */
@@ -964,10 +968,13 @@
 
     /* If code cannot fit into RunningBits bits, must raise its size. Note
      * however that codes above 4095 are used for special signaling.  */
-    if (++Private->RunningCode > Private->MaxCode1 &&
-        Private->RunningBits < LZ_BITS) {
-        Private->MaxCode1 <<= 1;
-        Private->RunningBits++;
+    if (++Private->RunningCode > Private->MaxCode1) {
+        if (Private->RunningBits < LZ_BITS) {
+            Private->MaxCode1 <<= 1;
+            Private->RunningBits++;
+        } else {
+            Private->RunningCode = Private->MaxCode1;
+        }
     }
     return GIF_OK;
 }
--- a/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/sun/awt/image/gif/gifdecoder.c	Sat Apr 18 14:10:27 2009 -0700
@@ -191,6 +191,11 @@
     int passht = passinc;
     int len;
 
+    /* We have verified the initial code size on the java layer.
+     * Here we just check bounds for particular indexes. */
+    if (freeCode >= 4096 || maxCode >= 4096) {
+        return 0;
+    }
     if (blockh == 0 || raslineh == 0
         || prefixh == 0 || suffixh == 0
         || outCodeh == 0)
--- a/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c	Sat Apr 18 14:10:27 2009 -0700
@@ -216,6 +216,16 @@
 
 #endif /* ! DEBUG */
 
+static int
+getMlibEdgeHint(jint edgeHint) {
+    switch (edgeHint) {
+    case java_awt_image_ConvolveOp_EDGE_NO_OP:
+        return MLIB_EDGE_DST_COPY_SRC;
+    case java_awt_image_ConvolveOp_EDGE_ZERO_FILL:
+    default:
+        return MLIB_EDGE_DST_FILL_ZERO;
+    }
+}
 
 /***************************************************************************
  *                          External Functions                             *
@@ -400,22 +410,10 @@
         }
     }
 
-    if (edgeHint == java_awt_image_ConvolveOp_EDGE_NO_OP) {
-        int kw2 = kwidth>>1;
-        int kh2 = kheight>>1;
-        int bsize = mlib_ImageGetChannels(src)*
-            (mlib_ImageGetType(src) == MLIB_BYTE ? 1 : 2);
-
-        void *dstDataP = mlib_ImageGetData(dst);
-        void *srcDataP = mlib_ImageGetData(src);
-        /* REMIND: Copy a smaller area */
-        memcpy(dstDataP, srcDataP, dst->width*dst->height*bsize);
-    }
-
     cmask = (1<<src->channels)-1;
     status = (*sMlibFns[MLIB_CONVMxN].fptr)(dst, src, kdata, w, h,
                                (w-1)/2, (h-1)/2, scale, cmask,
-                               MLIB_EDGE_DST_NO_WRITE);
+                               getMlibEdgeHint(edgeHint));
 
     if (status != MLIB_SUCCESS) {
         printMedialibError(status);
@@ -660,22 +658,10 @@
         }
     }
 
-    if (edgeHint == java_awt_image_ConvolveOp_EDGE_NO_OP) {
-        int kw2 = kwidth>>1;
-        int kh2 = kheight>>1;
-        int bsize = mlib_ImageGetChannels(src)*
-            (mlib_ImageGetType(src) == MLIB_BYTE ? 1 : 2);
-
-        void *dstDataP = mlib_ImageGetData(dst);
-        void *srcDataP = mlib_ImageGetData(src);
-        /* REMIND: Copy a smaller area */
-        memcpy(dstDataP, srcDataP, dst->width*dst->height*bsize);
-    }
-
     cmask = (1<<src->channels)-1;
     status = (*sMlibFns[MLIB_CONVMxN].fptr)(dst, src, kdata, w, h,
                                (w-1)/2, (h-1)/2, scale, cmask,
-                               MLIB_EDGE_DST_NO_WRITE);
+                               getMlibEdgeHint(edgeHint));
 
     if (status != MLIB_SUCCESS) {
         printMedialibError(status);
--- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gfx_impl.h	Sat Apr 18 14:10:27 2009 -0700
@@ -31,7 +31,7 @@
 /* here come some very simple macros */
 
 /* advance a pointer p by sizeof(type)*n bytes */
-#define INCPN(type,p,n) ((p) = (type*)(p)+n)
+#define INCPN(type,p,n) ((p) = (type*)(p)+(n))
 
 /* advance a pointer by sizeof(type) */
 #define INCP(type,p) INCPN(type,(p),1)
--- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_gif.c	Sat Apr 18 14:10:27 2009 -0700
@@ -62,6 +62,15 @@
     return rc;
 }
 
+/* These macro help to ensure that we only take part of frame that fits into
+   logical screen. */
+
+/* Ensure that p belongs to [pmin, pmax) interval. Returns fixed point (if fix is needed) */
+#define FIX_POINT(p, pmin, pmax) ( ((p) < (pmin)) ? (pmin) : (((p) > (pmax)) ? (pmax) : (p)))
+/* Ensures that line starting at point p does not exceed boundary pmax.
+   Returns fixed length (if fix is needed) */
+#define FIX_LENGTH(p, len, pmax) ( ((p) + (len)) > (pmax) ? ((pmax) - (p)) : (len))
+
 int
 SplashDecodeGif(Splash * splash, GifFileType * gif)
 {
@@ -70,6 +79,7 @@
     byte_t *pBitmapBits, *pOldBitmapBits;
     int i, j;
     int imageIndex;
+    int cx, cy, cw, ch; /* clamped coordinates */
     const int interlacedOffset[] = { 0, 4, 2, 1, 0 };   /* The way Interlaced image should. */
     const int interlacedJumps[] = { 8, 8, 4, 2, 1 };    /* be read - offsets and jumps... */
 
@@ -79,14 +89,31 @@
 
     SplashCleanup(splash);
 
+    if (!SAFE_TO_ALLOC(gif->SWidth, splash->imageFormat.depthBytes)) {
+        return 0;
+    }
     stride = gif->SWidth * splash->imageFormat.depthBytes;
     if (splash->byteAlignment > 1)
         stride =
             (stride + splash->byteAlignment - 1) & ~(splash->byteAlignment - 1);
 
+    if (!SAFE_TO_ALLOC(gif->SHeight, stride)) {
+        return 0;
+    }
+
+    if (!SAFE_TO_ALLOC(gif->ImageCount, sizeof(SplashImage*))) {
+        return 0;
+    }
     bufferSize = stride * gif->SHeight;
     pBitmapBits = (byte_t *) malloc(bufferSize);
+    if (!pBitmapBits) {
+        return 0;
+    }
     pOldBitmapBits = (byte_t *) malloc(bufferSize);
+    if (!pOldBitmapBits) {
+        free(pBitmapBits);
+        return 0;
+    }
     memset(pBitmapBits, 0, bufferSize);
 
     splash->width = gif->SWidth;
@@ -94,6 +121,11 @@
     splash->frameCount = gif->ImageCount;
     splash->frames = (SplashImage *)
         malloc(sizeof(SplashImage) * gif->ImageCount);
+    if (!splash->frames) {
+      free(pBitmapBits);
+      free(pOldBitmapBits);
+      return 0;
+    }
     memset(splash->frames, 0, sizeof(SplashImage) * gif->ImageCount);
     splash->loopCount = 1;
 
@@ -109,6 +141,11 @@
         int colorCount = 0;
         rgbquad_t colorMapBuf[SPLASH_COLOR_MAP_SIZE];
 
+        cx = FIX_POINT(desc->Left, 0, gif->SWidth);
+        cy = FIX_POINT(desc->Top, 0, gif->SHeight);
+        cw = FIX_LENGTH(desc->Left, desc->Width, gif->SWidth);
+        ch = FIX_LENGTH(desc->Top, desc->Height, gif->SHeight);
+
         if (colorMap) {
             if (colorMap->ColorCount <= SPLASH_COLOR_MAP_SIZE) {
                 colorCount = colorMap->ColorCount;
@@ -195,13 +232,22 @@
             for (; pass < npass; ++pass) {
                 int jump = interlacedJumps[pass];
                 int ofs = interlacedOffset[pass];
-                int numLines = (desc->Height + jump - 1 - ofs) / jump;
+                /* Number of source lines for current pass */
+                int numPassLines = (desc->Height + jump - ofs - 1) / jump;
+                /* Number of lines that fits to dest buffer */
+                int numLines = (ch + jump - ofs - 1) / jump;
 
                 initRect(&srcRect, 0, 0, desc->Width, numLines, 1,
                     desc->Width, pSrc, &srcFormat);
-                initRect(&dstRect, desc->Left, desc->Top + ofs, desc->Width,
-                    numLines, jump, stride, pBitmapBits, &splash->imageFormat);
-                pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST);
+
+                if (numLines > 0) {
+                    initRect(&dstRect, cx, cy + ofs, cw,
+                             numLines , jump, stride, pBitmapBits, &splash->imageFormat);
+
+                    pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST);
+                }
+                // skip extra source data
+                pSrc += (numPassLines - numLines) * srcRect.stride;
             }
         }
 
@@ -209,6 +255,12 @@
 
         splash->frames[imageIndex].bitmapBits =
             (rgbquad_t *) malloc(bufferSize);
+        if (!splash->frames[imageIndex].bitmapBits) {
+            free(pBitmapBits);
+            free(pOldBitmapBits);
+            /* Assuming that callee will take care of splash frames we have already allocated */
+            return 0;
+        }
         memcpy(splash->frames[imageIndex].bitmapBits, pBitmapBits, bufferSize);
 
         SplashInitFrameShape(splash, imageIndex);
@@ -224,27 +276,29 @@
             {
                 ImageRect dstRect;
                 rgbquad_t fillColor = 0;                        // 0 is transparent
-                if (transparentColor < 0) {
+
+                if (transparentColor > 0) {
                     fillColor= MAKE_QUAD_GIF(
                         colorMap->Colors[gif->SBackGroundColor], 0xff);
                 }
-                initRect(&dstRect, desc->Left, desc->Top,
-                    desc->Width, desc->Height, 1, stride,
-                    pBitmapBits, &splash->imageFormat);
+                initRect(&dstRect,
+                         cx, cy, cw, ch,
+                         1, stride,
+                         pBitmapBits, &splash->imageFormat);
                 fillRect(fillColor, &dstRect);
             }
             break;
         case GIF_DISPOSE_RESTORE:
             {
-
-                int lineSize = desc->Width * splash->imageFormat.depthBytes;
-
-                for (j = 0; j < desc->Height; j++) {
-                    int lineIndex = stride * (j + desc->Top) +
-                        desc->Left * splash->imageFormat.depthBytes;
-
-                    memcpy(pBitmapBits + lineIndex, pOldBitmapBits + lineIndex,
-                        lineSize);
+                int lineSize = cw * splash->imageFormat.depthBytes;
+                if (lineSize > 0) {
+                    int lineOffset = cx * splash->imageFormat.depthBytes;
+                    int lineIndex = cy * stride + lineOffset;
+                    for (j=0; j<ch; j++) {
+                        memcpy(pBitmapBits + lineIndex, pOldBitmapBits + lineIndex,
+                               lineSize);
+                        lineIndex += stride;
+                    }
                 }
             }
             break;
--- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_impl.h	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_impl.h	Sat Apr 18 14:10:27 2009 -0700
@@ -155,6 +155,10 @@
 
 void SplashInitFrameShape(Splash * splash, int imageIndex);
 
+#define SAFE_TO_ALLOC(c, sz)                                               \
+    (((c) > 0) && ((sz) > 0) &&                                            \
+     ((0xffffffffu / ((unsigned int)(c))) > (unsigned int)(sz)))
+
 #define dbgprintf printf
 
 #endif
--- a/jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/share/native/sun/awt/splashscreen/splashscreen_png.c	Sat Apr 18 14:10:27 2009 -0700
@@ -103,9 +103,17 @@
 
     rowbytes = png_get_rowbytes(png_ptr, info_ptr);
 
+    if (!SAFE_TO_ALLOC(rowbytes, height)) {
+        goto done;
+    }
+
     if ((image_data = (unsigned char *) malloc(rowbytes * height)) == NULL) {
         goto done;
     }
+
+    if (!SAFE_TO_ALLOC(height, sizeof(png_bytep))) {
+        goto done;
+    }
     if ((row_pointers = (png_bytepp) malloc(height * sizeof(png_bytep)))
             == NULL) {
         goto done;
@@ -121,13 +129,28 @@
     splash->width = width;
     splash->height = height;
 
+    if (!SAFE_TO_ALLOC(splash->width, splash->imageFormat.depthBytes)) {
+        goto done;
+    }
     stride = splash->width * splash->imageFormat.depthBytes;
 
+    if (!SAFE_TO_ALLOC(splash->height, stride)) {
+        goto done;
+    }
     splash->frameCount = 1;
     splash->frames = (SplashImage *)
         malloc(sizeof(SplashImage) * splash->frameCount);
+
+    if (splash->frames == NULL) {
+        goto done;
+    }
+
     splash->loopCount = 1;
     splash->frames[0].bitmapBits = malloc(stride * splash->height);
+    if (splash->frames[0].bitmapBits == NULL) {
+        free(splash->frames);
+        goto done;
+    }
     splash->frames[0].delay = 0;
 
     /* FIXME: sort out the real format */
--- a/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/windows/classes/sun/nio/ch/WindowsAsynchronousFileChannelImpl.java	Sat Apr 18 14:10:27 2009 -0700
@@ -354,16 +354,9 @@
         }
     }
 
-    // invoke by FileFileImpl to release lock
     @Override
-    void release(FileLockImpl fli) throws IOException {
-        try {
-            begin();
-            nd.release(fdObj, fli.position(), fli.size());
-            removeFromFileLockTable(fli);
-        } finally {
-            end();
-        }
+    protected void implRelease(FileLockImpl fli) throws IOException {
+        nd.release(fdObj, fli.position(), fli.size());
     }
 
     /**
--- a/jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/windows/classes/sun/security/mscapi/RSAKeyPairGenerator.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,7 @@
 import java.security.spec.RSAKeyGenParameterSpec;
 
 import sun.security.jca.JCAUtil;
+import sun.security.rsa.RSAKeyFactory;
 
 /**
  * RSA keypair generator.
@@ -43,8 +44,8 @@
 public final class RSAKeyPairGenerator extends KeyPairGeneratorSpi {
 
     // Supported by Microsoft Base, Strong and Enhanced Cryptographic Providers
-    private static final int KEY_SIZE_MIN = 512; // disallow MSCAPI min. of 384
-    private static final int KEY_SIZE_MAX = 16384;
+    static final int KEY_SIZE_MIN = 512; // disallow MSCAPI min. of 384
+    static final int KEY_SIZE_MAX = 16384;
     private static final int KEY_SIZE_DEFAULT = 1024;
 
     // size of the key to generate, KEY_SIZE_MIN <= keySize <= KEY_SIZE_MAX
@@ -59,7 +60,14 @@
     // random is always ignored
     public void initialize(int keySize, SecureRandom random) {
 
-        checkKeySize(keySize);
+        try {
+            RSAKeyFactory.checkKeyLengths(keySize, null,
+                KEY_SIZE_MIN, KEY_SIZE_MAX);
+        } catch (InvalidKeyException e) {
+            throw new InvalidParameterException(e.getMessage());
+        }
+
+        this.keySize = keySize;
     }
 
     // second initialize method. See JCA doc
@@ -67,21 +75,31 @@
     public void initialize(AlgorithmParameterSpec params, SecureRandom random)
             throws InvalidAlgorithmParameterException {
 
+        int tmpSize;
         if (params == null) {
-            checkKeySize(KEY_SIZE_DEFAULT);
-
+            tmpSize = KEY_SIZE_DEFAULT;
         } else if (params instanceof RSAKeyGenParameterSpec) {
 
             if (((RSAKeyGenParameterSpec) params).getPublicExponent() != null) {
                 throw new InvalidAlgorithmParameterException
                     ("Exponent parameter is not supported");
             }
-            checkKeySize(((RSAKeyGenParameterSpec) params).getKeysize());
+            tmpSize = ((RSAKeyGenParameterSpec) params).getKeysize();
 
         } else {
             throw new InvalidAlgorithmParameterException
                 ("Params must be an instance of RSAKeyGenParameterSpec");
         }
+
+        try {
+            RSAKeyFactory.checkKeyLengths(tmpSize, null,
+                KEY_SIZE_MIN, KEY_SIZE_MAX);
+        } catch (InvalidKeyException e) {
+            throw new InvalidAlgorithmParameterException(
+                "Invalid Key sizes", e);
+        }
+
+        this.keySize = tmpSize;
     }
 
     // generate the keypair. See JCA doc
@@ -95,18 +113,6 @@
         return new KeyPair(keys.getPublic(), keys.getPrivate());
     }
 
-    private void checkKeySize(int keySize) throws InvalidParameterException {
-        if (keySize < KEY_SIZE_MIN) {
-            throw new InvalidParameterException
-                ("Key size must be at least " + KEY_SIZE_MIN + " bits");
-        }
-        if (keySize > KEY_SIZE_MAX) {
-            throw new InvalidParameterException
-                ("Key size must be " + KEY_SIZE_MAX + " bits or less");
-        }
-        this.keySize = keySize;
-    }
-
     private static native RSAKeyPair generateRSAKeyPair(int keySize,
         String keyContainerName);
 }
--- a/jdk/src/windows/classes/sun/security/mscapi/RSASignature.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/windows/classes/sun/security/mscapi/RSASignature.java	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -38,6 +38,9 @@
 import java.security.Signature;
 import java.security.SignatureSpi;
 import java.security.SignatureException;
+import java.math.BigInteger;
+
+import sun.security.rsa.RSAKeyFactory;
 
 /**
  * RSA signature implementation. Supports RSA signing using PKCS#1 v1.5 padding.
@@ -124,7 +127,16 @@
 
             // convert key to MSCAPI format
 
-            byte[] modulusBytes = rsaKey.getModulus().toByteArray();
+            BigInteger modulus = rsaKey.getModulus();
+            BigInteger exponent =  rsaKey.getPublicExponent();
+
+            // Check against the local and global values to make sure
+            // the sizes are ok.  Round up to the nearest byte.
+            RSAKeyFactory.checkKeyLengths(((modulus.bitLength() + 7) & ~7),
+                exponent, -1, RSAKeyPairGenerator.KEY_SIZE_MAX);
+
+            byte[] modulusBytes = modulus.toByteArray();
+            byte[] exponentBytes = exponent.toByteArray();
 
             // Adjust key length due to sign bit
             int keyBitLength = (modulusBytes[0] == 0)
@@ -132,8 +144,7 @@
                 : modulusBytes.length * 8;
 
             byte[] keyBlob = generatePublicKeyBlob(
-                keyBitLength, modulusBytes,
-                rsaKey.getPublicExponent().toByteArray());
+                keyBitLength, modulusBytes, exponentBytes);
 
             publicKey = importPublicKey(keyBlob, keyBitLength);
 
@@ -166,12 +177,11 @@
         }
         privateKey = (sun.security.mscapi.RSAPrivateKey) key;
 
-        // Determine byte length from bit length
-        int keySize = (privateKey.bitLength() + 7) >> 3;
-
-        if (keySize < 64)
-            throw new InvalidKeyException(
-                "RSA keys must be at least 512 bits long");
+        // Check against the local and global values to make sure
+        // the sizes are ok.  Round up to nearest byte.
+        RSAKeyFactory.checkKeyLengths(((privateKey.bitLength() + 7) & ~7),
+            null, RSAKeyPairGenerator.KEY_SIZE_MIN,
+            RSAKeyPairGenerator.KEY_SIZE_MAX);
 
         if (needsReset) {
             messageDigest.reset();
--- a/jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/windows/native/sun/nio/ch/FileDispatcherImpl.c	Sat Apr 18 14:10:27 2009 -0700
@@ -414,7 +414,7 @@
     o.Offset = lowPos;
     o.OffsetHigh = highPos;
     result = UnlockFileEx(h, 0, lowNumBytes, highNumBytes, &o);
-    if (result == 0) {
+    if (result == 0 && GetLastError() != ERROR_NOT_LOCKED) {
         JNU_ThrowIOExceptionWithLastError(env, "Release failed");
     }
 }
--- a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c	Sat Apr 18 14:10:27 2009 -0700
@@ -1,5 +1,5 @@
 /*
- * Portions Copyright 2000-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * Portions Copyright 2000-2009 Sun Microsystems, Inc.  All Rights Reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -73,6 +73,7 @@
  * Function prototypes for internal routines
  *
  */
+BOOL native_debug = 0;
 
 BOOL PackageConnectLookup(PHANDLE,PULONG);
 
@@ -113,208 +114,221 @@
 
     jclass cls;
     JNIEnv *env;
+    jfieldID fldDEBUG;
 
     if ((*jvm)->GetEnv(jvm, (void **)&env, JNI_VERSION_1_2)) {
         return JNI_EVERSION; /* JNI version not supported */
     }
 
+    cls = (*env)->FindClass(env,"sun/security/krb5/internal/Krb5");
+    if (cls == NULL) {
+        printf("LSA: Couldn't find Krb5\n");
+        return JNI_ERR;
+    }
+    fldDEBUG = (*env)->GetStaticFieldID(env, cls, "DEBUG", "Z");
+    if (fldDEBUG == NULL) {
+        printf("LSA: Krb5 has no DEBUG field\n");
+        return JNI_ERR;
+    }
+    native_debug = (*env)->GetStaticBooleanField(env, cls, fldDEBUG);
+
     cls = (*env)->FindClass(env,"sun/security/krb5/internal/Ticket");
 
     if (cls == NULL) {
-        printf("Couldn't find Ticket\n");
+        printf("LSA: Couldn't find Ticket\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found Ticket\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found Ticket\n");
+    }
 
     ticketClass = (*env)->NewWeakGlobalRef(env,cls);
     if (ticketClass == NULL) {
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Made NewWeakGlobalRef\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Made NewWeakGlobalRef\n");
+    }
 
     cls = (*env)->FindClass(env, "sun/security/krb5/PrincipalName");
 
     if (cls == NULL) {
-        printf("Couldn't find PrincipalName\n");
+        printf("LSA: Couldn't find PrincipalName\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found PrincipalName\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found PrincipalName\n");
+    }
 
     principalNameClass = (*env)->NewWeakGlobalRef(env,cls);
     if (principalNameClass == NULL) {
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Made NewWeakGlobalRef\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Made NewWeakGlobalRef\n");
+    }
 
     cls = (*env)->FindClass(env,"sun/security/util/DerValue");
 
     if (cls == NULL) {
-        printf("Couldn't find DerValue\n");
+        printf("LSA: Couldn't find DerValue\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found DerValue\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found DerValue\n");
+    }
 
     derValueClass = (*env)->NewWeakGlobalRef(env,cls);
     if (derValueClass == NULL) {
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Made NewWeakGlobalRef\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Made NewWeakGlobalRef\n");
+    }
 
     cls = (*env)->FindClass(env,"sun/security/krb5/EncryptionKey");
 
     if (cls == NULL) {
-        printf("Couldn't find EncryptionKey\n");
+        printf("LSA: Couldn't find EncryptionKey\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found EncryptionKey\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found EncryptionKey\n");
+    }
 
     encryptionKeyClass = (*env)->NewWeakGlobalRef(env,cls);
     if (encryptionKeyClass == NULL) {
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Made NewWeakGlobalRef\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Made NewWeakGlobalRef\n");
+    }
 
     cls = (*env)->FindClass(env,"sun/security/krb5/internal/TicketFlags");
 
     if (cls == NULL) {
-        printf("Couldn't find TicketFlags\n");
+        printf("LSA: Couldn't find TicketFlags\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found TicketFlags\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found TicketFlags\n");
+    }
 
     ticketFlagsClass = (*env)->NewWeakGlobalRef(env,cls);
     if (ticketFlagsClass == NULL) {
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Made NewWeakGlobalRef\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Made NewWeakGlobalRef\n");
+    }
 
     cls = (*env)->FindClass(env,"sun/security/krb5/internal/KerberosTime");
 
     if (cls == NULL) {
-        printf("Couldn't find KerberosTime\n");
+        printf("LSA: Couldn't find KerberosTime\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found KerberosTime\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found KerberosTime\n");
+    }
 
     kerberosTimeClass = (*env)->NewWeakGlobalRef(env,cls);
     if (kerberosTimeClass == NULL) {
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Made NewWeakGlobalRef\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Made NewWeakGlobalRef\n");
+    }
 
     cls = (*env)->FindClass(env,"java/lang/String");
 
     if (cls == NULL) {
-        printf("Couldn't find String\n");
+        printf("LSA: Couldn't find String\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found String\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found String\n");
+    }
 
     javaLangStringClass = (*env)->NewWeakGlobalRef(env,cls);
     if (javaLangStringClass == NULL) {
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Made NewWeakGlobalRef\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Made NewWeakGlobalRef\n");
+    }
 
     derValueConstructor = (*env)->GetMethodID(env, derValueClass,
                                             "<init>", "([B)V");
     if (derValueConstructor == 0) {
-        printf("Couldn't find DerValue constructor\n");
+        printf("LSA: Couldn't find DerValue constructor\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found DerValue constructor\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found DerValue constructor\n");
+    }
 
     ticketConstructor = (*env)->GetMethodID(env, ticketClass,
                             "<init>", "(Lsun/security/util/DerValue;)V");
     if (ticketConstructor == 0) {
-        printf("Couldn't find Ticket constructor\n");
+        printf("LSA: Couldn't find Ticket constructor\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found Ticket constructor\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found Ticket constructor\n");
+    }
 
     principalNameConstructor = (*env)->GetMethodID(env, principalNameClass,
                                     "<init>", "([Ljava/lang/String;)V");
     if (principalNameConstructor == 0) {
-        printf("Couldn't find PrincipalName constructor\n");
+        printf("LSA: Couldn't find PrincipalName constructor\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found PrincipalName constructor\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found PrincipalName constructor\n");
+    }
 
     encryptionKeyConstructor = (*env)->GetMethodID(env, encryptionKeyClass,
                                             "<init>", "(I[B)V");
     if (encryptionKeyConstructor == 0) {
-        printf("Couldn't find EncryptionKey constructor\n");
+        printf("LSA: Couldn't find EncryptionKey constructor\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found EncryptionKey constructor\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found EncryptionKey constructor\n");
+    }
 
     ticketFlagsConstructor = (*env)->GetMethodID(env, ticketFlagsClass,
                                             "<init>", "(I[B)V");
     if (ticketFlagsConstructor == 0) {
-        printf("Couldn't find TicketFlags constructor\n");
+        printf("LSA: Couldn't find TicketFlags constructor\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found TicketFlags constructor\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found TicketFlags constructor\n");
+    }
 
     kerberosTimeConstructor = (*env)->GetMethodID(env, kerberosTimeClass,
                                     "<init>", "(Ljava/lang/String;)V");
     if (kerberosTimeConstructor == 0) {
-        printf("Couldn't find KerberosTime constructor\n");
+        printf("LSA: Couldn't find KerberosTime constructor\n");
         return JNI_ERR;
     }
-    #ifdef DEBUG
-    printf("Found KerberosTime constructor\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Found KerberosTime constructor\n");
+    }
 
     // load the setRealm method in PrincipalName
     setRealmMethod = (*env)->GetMethodID(env, principalNameClass,
                                     "setRealm", "(Ljava/lang/String;)V");
     if (setRealmMethod == 0) {
-        printf("Couldn't find setRealm in PrincipalName\n");
+        printf("LSA: Couldn't find setRealm in PrincipalName\n");
         return JNI_ERR;
     }
 
-    #ifdef DEBUG
-    printf("Finished OnLoad processing\n");
-    #endif /* DEBUG */
+    if (native_debug) {
+        printf("LSA: Finished OnLoad processing\n");
+    }
 
     return JNI_VERSION_1_2;
 }
@@ -389,16 +403,25 @@
 
         if (krbcredsConstructor == 0) {
             krbcredsConstructor = (*env)->GetMethodID(env, krbcredsClass, "<init>",
-                    "(Lsun/security/krb5/internal/Ticket;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/EncryptionKey;Lsun/security/krb5/internal/TicketFlags;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/HostAddresses;)V");
+                    "(Lsun/security/krb5/internal/Ticket;"
+                    "Lsun/security/krb5/PrincipalName;"
+                    "Lsun/security/krb5/PrincipalName;"
+                    "Lsun/security/krb5/EncryptionKey;"
+                    "Lsun/security/krb5/internal/TicketFlags;"
+                    "Lsun/security/krb5/internal/KerberosTime;"
+                    "Lsun/security/krb5/internal/KerberosTime;"
+                    "Lsun/security/krb5/internal/KerberosTime;"
+                    "Lsun/security/krb5/internal/KerberosTime;"
+                    "Lsun/security/krb5/internal/HostAddresses;)V");
             if (krbcredsConstructor == 0) {
-                printf("Couldn't find sun.security.krb5.Credentials constructor\n");
+                printf("LSA: Couldn't find sun.security.krb5.Credentials constructor\n");
                 break;
             }
         }
 
-        #ifdef DEBUG
-        printf("Found KrbCreds constructor\n");
-        #endif
+        if (native_debug) {
+            printf("LSA: Found KrbCreds constructor\n");
+        }
 
         //
         // Get the logon handle and package ID from the
@@ -407,9 +430,9 @@
         if (!PackageConnectLookup(&LogonHandle, &PackageId))
             break;
 
-        #ifdef DEBUG
-        printf("Got handle to Kerberos package\n");
-        #endif /* DEBUG */
+        if (native_debug) {
+            printf("LSA: Got handle to Kerberos package\n");
+        }
 
         // Get the MS TGT from cache
         CacheRequest.MessageType = KerbRetrieveTicketMessage;
@@ -426,9 +449,9 @@
                         &SubStatus
                         );
 
-        #ifdef DEBUG
-        printf("Response size is %d\n", rspSize);
-        #endif
+        if (native_debug) {
+            printf("LSA: Response size is %d\n", rspSize);
+        }
 
         if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) {
             if (!LSA_SUCCESS(Status)) {
@@ -467,9 +490,9 @@
         }
 
         if (ignore_cache) {
-            #ifdef DEBUG
-            printf("MS TGT in cache is invalid/not supported; request new ticket\n");
-            #endif /* DEBUG */
+            if (native_debug) {
+                printf("LSA: MS TGT in cache is invalid/not supported; request new ticket\n");
+            }
 
             // use domain to request Ticket
             Status = ConstructTicketRequest(msticket->TargetDomainName,
@@ -493,9 +516,9 @@
                         &SubStatus
                         );
 
-            #ifdef DEBUG
-            printf("Response size is %d\n", responseSize);
-            #endif /* DEBUG */
+            if (native_debug) {
+                printf("LSA: Response size is %d\n", responseSize);
+            }
 
             if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) {
                 if (!LSA_SUCCESS(Status)) {
@@ -788,7 +811,9 @@
     static WCHAR szMsgBuf[MAX_MSG_SIZE];
     DWORD dwRes;
 
-    printf("Error calling function %s: %lu\n", szAPI, dwError);
+    if (native_debug) {
+        printf("LSA: Error calling function %s: %lu\n", szAPI, dwError);
+    }
 
     dwRes = FormatMessage (
             FORMAT_MESSAGE_FROM_SYSTEM,
@@ -798,11 +823,13 @@
             szMsgBuf,
             MAX_MSG_SIZE,
             NULL);
-    if (0 == dwRes) {
-        printf("FormatMessage failed with %d\n", GetLastError());
-        // ExitProcess(EXIT_FAILURE);
-    } else {
-        printf("%S",szMsgBuf);
+    if (native_debug) {
+        if (0 == dwRes) {
+            printf("LSA: FormatMessage failed with %d\n", GetLastError());
+            // ExitProcess(EXIT_FAILURE);
+        } else {
+            printf("LSA: %S",szMsgBuf);
+        }
     }
 }
 
@@ -896,17 +923,19 @@
             ((domainName.Length)*sizeof(WCHAR) + sizeof(UNICODE_NULL)));
     wcsncpy(realm, domainName.Buffer, domainName.Length/sizeof(WCHAR));
 
-    #ifdef DEBUG
-    printf("Principal domain is %S\n", realm);
-    printf("Name type is %x\n", principalName->NameType);
-    printf("Name count is %x\n", principalName->NameCount);
-    #endif
+    if (native_debug) {
+        printf("LSA: Principal domain is %S\n", realm);
+        printf("LSA: Name type is %x\n", principalName->NameType);
+        printf("LSA: Name count is %x\n", principalName->NameCount);
+    }
 
     nameCount = principalName->NameCount;
     stringArray = (*env)->NewObjectArray(env, nameCount,
                             javaLangStringClass, NULL);
     if (stringArray == NULL) {
-        printf("Can't allocate String array for Principal\n");
+        if (native_debug) {
+            printf("LSA: Can't allocate String array for Principal\n");
+        }
         LocalFree(realm);
         return principal;
     }
@@ -941,6 +970,17 @@
     // First, need to build a byte array
     jbyteArray ary;
     jobject encryptionKey = NULL;
+    unsigned int i;
+
+    for (i=0; i<cryptoKey->Length; i++) {
+        if (cryptoKey->Value[i]) break;
+    }
+    if (i == cryptoKey->Length) {
+        if (native_debug) {
+            printf("LSA: Session key all zero. Stop.\n");
+        }
+        return NULL;
+    }
 
     ary = (*env)->NewByteArray(env,cryptoKey->Length);
     (*env)->SetByteArrayRegion(env, ary, (jsize) 0, cryptoKey->Length,
@@ -1005,9 +1045,9 @@
                 hour,
                 minute,
                 second );
-        #ifdef DEBUG
-        printf("%S\n", (wchar_t *)timeString);
-        #endif /* DEBUG */
+        if (native_debug) {
+            printf("LSA: %S\n", (wchar_t *)timeString);
+        }
         stringTime = (*env)->NewString(env, timeString,
                 (sizeof(timeString)/sizeof(WCHAR))-1);
         if (stringTime != NULL) { // everything's OK so far
Binary file jdk/test/java/awt/FontClass/CreateFont/A.ttf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/FontClass/CreateFont/BigFont.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.io.*;
+import java.net.*;
+
+public class BigFont extends Applet {
+
+   static private class SizedInputStream extends InputStream {
+
+       int size;
+       int cnt = 0;
+
+       SizedInputStream(int size) {
+           this.size = size;
+       }
+
+       public int read() {
+           if (cnt < size) {
+              cnt++;
+              return 0;
+           } else {
+              return -1;
+           }
+       }
+
+       public int getCurrentSize() {
+           return cnt;
+       }
+   }
+
+    String id;
+    String fileName;
+
+    public void init() {
+        id = getParameter("number");
+        fileName = getParameter("font");
+
+        System.out.println("Applet " + id + " "+
+                           Thread.currentThread().getThreadGroup());
+        // Larger than size for a single font.
+        int fontSize = 64 * 1000 * 1000;
+        SizedInputStream sis = new SizedInputStream(fontSize);
+        try {
+             Font font = Font.createFont(Font.TRUETYPE_FONT, sis);
+        } catch (Throwable t) {
+            if (t instanceof FontFormatException ||
+                fontSize <= sis.getCurrentSize())
+            {
+                System.out.println(sis.getCurrentSize());
+                System.out.println(t);
+                throw new RuntimeException("Allowed file to be too large.");
+            }
+        }
+        // The following part of the test was verified manually but
+        // is impractical to enable  because it requires a fairly large
+        // valid font to be part of the test, and we can't easily include
+        // that, nor dependably reference one from the applet environment.
+        /*
+        if (fileName == null) {
+            return;
+        }
+        int size = getFileSize(fileName);
+        if (size == 0) {
+            return;
+        }
+        int fontCnt = 1000 * 1000 * 1000 / size;
+        loadMany(size, fontCnt, fileName);
+        System.gc(); System.gc();
+        fontCnt = fontCnt / 2;
+        System.out.println("Applet " + id + " load more.");
+        loadMany(size, fontCnt, fileName);
+        */
+        System.out.println("Applet " + id + " finished.");
+    }
+
+    int getFileSize(String fileName) {
+        try {
+            URL url = new URL(getCodeBase(), fileName);
+            InputStream inStream = url.openStream();
+            BufferedInputStream fontStream = new BufferedInputStream(inStream);
+            int size = 0;
+            while (fontStream.read() != -1) {
+                size++;
+            }
+            fontStream.close();
+            return size;
+        } catch (IOException e) {
+            return 0;
+        }
+
+    }
+    void loadMany(int oneFont, int fontCnt, String fileName) {
+        System.out.println("fontcnt= " + fontCnt);
+        Font[] fonts = new Font[fontCnt];
+        int totalSize = 0;
+        boolean gotException = false;
+        for (int i=0; i<fontCnt; i++) {
+            try {
+                URL url = new URL(getCodeBase(), fileName);
+                InputStream inStream = url.openStream();
+                BufferedInputStream fontStream =
+                    new BufferedInputStream(inStream);
+                fonts[i] = Font.createFont(Font.TRUETYPE_FONT, fontStream);
+                totalSize += oneFont;
+                fontStream.close();
+            } catch (Throwable t) {
+                gotException = true;
+                System.out.println("Applet " + id + " " + t);
+            }
+        }
+        if (!gotException) {
+          throw new RuntimeException("No expected exception");
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/FontClass/CreateFont/DeleteFont.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2004-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.io.*;
+import java.awt.*;
+
+public class DeleteFont {
+
+    public static void main(String args[]) throws Exception {
+
+        String font = "A.ttf";
+        String sep = System.getProperty("file.separator");
+        String testSrc = System.getenv("TESTSRC");
+        if (testSrc != null) {
+            font = testSrc + sep + font;
+        }
+        System.out.println("Using font file: " + font);
+        FileInputStream fis = new FileInputStream(font);
+        Font f = Font.createFont(Font.TRUETYPE_FONT, fis);
+        f.toString();
+        f.deriveFont(Font.BOLD);
+        f.canDisplay('X');
+
+       InputStream in = new InputStream() {
+            public int read() {
+                throw new RuntimeException();
+            }
+        };
+        boolean gotException = false;
+        try {
+           Font.createFont(java.awt.Font.TRUETYPE_FONT, in);
+        } catch (IOException e) {
+            gotException = true;
+        }
+        if (!gotException) {
+            throw new RuntimeException("No expected IOException");
+        }
+        badRead(-2, Font.TRUETYPE_FONT);
+        badRead(8193, Font.TRUETYPE_FONT);
+
+        badRead(-2, Font.TYPE1_FONT);
+        badRead(8193, Font.TYPE1_FONT);
+
+        // Make sure GC has a chance to clean up before we exit.
+        System.gc(); System.gc();
+    }
+
+    static void badRead(final int retval, int fontType) {
+        int num = 2;
+        byte[] buff = new byte[16*8192]; // Multiple of 8192 is important.
+        for (int ct=0; ct<num; ++ct) {
+            try {
+                Font.createFont(
+                    fontType,
+                    new ByteArrayInputStream(buff) {
+                        @Override
+                        public int read(byte[] buff, int off, int len) {
+                            int read = super.read(buff, off, len);
+                            return read<0 ? retval : read;
+                        }
+                    }
+                );
+            } catch (Throwable exc) {
+                //exc.printStackTrace();
+            }
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/FontClass/CreateFont/DeleteFont.sh	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,66 @@
+# Copyright 2004-2008 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+
+# @test
+# @bug 6189812 6380357 6632886
+# @summary Verify that temporary font files are deleted on exit.
+
+if [ -z "${TESTSRC}" ]; then
+  echo "TESTSRC undefined: defaulting to ."
+  TESTSRC=.
+fi
+
+if [ -z "${TESTCLASSES}" ]; then
+  echo "TESTCLASSES undefined: defaulting to ."
+  TESTCLASSES=.
+fi
+
+if [ -z "${TESTJAVA}" ]; then
+  echo "TESTJAVA undefined: can't continue."
+  exit 1
+fi
+
+echo "TESTJAVA=${TESTJAVA}"
+echo "TESTSRC=${TESTSRC}"
+echo "TESTCLASSES=${TESTCLASSES}"
+cd ${TESTSRC}
+${TESTJAVA}/bin/javac -d ${TESTCLASSES} DeleteFont.java
+
+cd ${TESTCLASSES}
+
+numfiles0=`ls ${TESTCLASSES} | wc -l`
+${TESTJAVA}/bin/java -Djava.io.tmpdir=${TESTCLASSES} DeleteFont
+
+if [ $? -ne 0 ]
+    then
+      echo "Test fails: exception thrown!"
+      exit 1
+fi
+
+numfiles1=`ls ${TESTCLASSES} | wc -l`
+
+if [ $numfiles0 -ne $numfiles1 ]
+    then
+      echo "Test fails: tmp file exists!"
+      ls ${TESTCLASSES}
+      exit 1
+fi
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/FontClass/CreateFont/bigfont.html	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,48 @@
+<!--
+
+ Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+ This code is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License version 2 only, as
+ published by the Free Software Foundation.
+
+ This code is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ version 2 for more details (a copy is included in the LICENSE file that
+ accompanied this code).
+
+ You should have received a copy of the GNU General Public License version
+ 2 along with this work; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ CA 95054 USA or visit www.sun.com if you need additional information or
+ have any questions.
+
+  @test
+  @bug 6522586
+  @run applet bigfont.html
+  @summary Enforce limits on font creation
+
+-->
+
+<html>
+  <head>
+      <title>Test Font Creation Limits</title>
+  </head>
+  <body>
+<hr>
+<APPLET CODE = BigFont.class WIDTH = 100 HEIGHT = 100 >
+<param name="number" value="1">
+<param name="font" value="A.ttf">
+</APPLET>
+<APPLET CODE = BigFont.class WIDTH = 100 HEIGHT = 100>
+<param name="number" value="2">
+<param name="font" value="A.ttf">
+</APPLET>
+<hr>
+  </body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/FontClass/CreateFont/fileaccess/FontFile.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6652929
+ * @summary verify handling of File.getPath()
+ */
+
+import java.awt.*;
+import java.io.*;
+
+public class FontFile {
+    public static void main(String[] args) throws Exception {
+        String sep = System.getProperty("file.separator");
+        String fname = ".." + sep + "A.ttf";
+        String dir = System.getProperty("test.src");
+        if (dir != null) {
+            fname = dir + sep + fname;
+        }
+        final String name = fname;
+        System.out.println("Will try to access " + name);
+        if (!(new File(name)).canRead()) {
+           System.out.println("File not available : can't run test");
+           return;
+        }
+        System.out.println("File is available. Verify no access under SM");
+
+        System.setSecurityManager(new SecurityManager());
+
+
+        // Check cannot read file.
+        try {
+            new FileInputStream(name);
+            throw new Error("Something wrong with test environment");
+        } catch (SecurityException exc) {
+            // Good.
+        }
+
+        try {
+            Font font = Font.createFont(Font.TRUETYPE_FONT,
+            new File("nosuchfile") {
+                    private boolean read;
+                    @Override public String getPath() {
+                        if (read) {
+                            return name;
+                        } else {
+                            read = true;
+                            return "somefile";
+                        }
+                    }
+                    @Override public boolean canRead() {
+                        return true;
+                    }
+               }
+            );
+          System.err.println(font.getFontName());
+          throw new RuntimeException("No expected exception");
+        }  catch (IOException e) {
+          System.err.println("Test passed.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug     6726779
+ * @summary Test verifies that ConvolveOp with the EDGE_NO_OP edge condition
+ *          does not cause JVM crash if size of source raster elements is
+ *          greather than size of the destination raster element.
+ *
+ * @run     main EdgeNoOpCrash
+ */
+import java.awt.Point;
+import java.awt.image.ConvolveOp;
+import java.awt.image.DataBuffer;
+import java.awt.image.ImagingOpException;
+import java.awt.image.Kernel;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
+import java.util.Arrays;
+
+public class EdgeNoOpCrash {
+    private static final int w = 3000;
+    private static final int h = 200;
+
+    public static void main(String[] args) {
+        crashTest();
+    }
+
+    private static void crashTest() {
+        Raster src = createSrcRaster();
+        WritableRaster dst = createDstRaster();
+        ConvolveOp op = createConvolveOp(ConvolveOp.EDGE_NO_OP);
+        try {
+            op.filter(src, dst);
+        } catch (ImagingOpException e) {
+            /*
+             * The test pair of source and destination rasters
+             * may cause failure of the medialib convolution routine,
+             * so this exception is expected.
+             *
+             * The JVM crash is the only manifestation of this
+             * test failure.
+             */
+        }
+        System.out.println("Test PASSED.");
+    }
+
+    private static Raster createSrcRaster() {
+        WritableRaster r = Raster.createInterleavedRaster(DataBuffer.TYPE_USHORT,
+                w, h, 4, new Point(0, 0));
+
+        return r;
+    }
+
+    private static WritableRaster createDstRaster() {
+        WritableRaster r = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE,
+                w, h, 4, new Point(0, 0));
+
+        return r;
+    }
+
+    private static ConvolveOp createConvolveOp(int edgeHint) {
+        final int kw = 3;
+        final int kh = 3;
+        float[] kdata = new float[kw * kh];
+        float v = 1f / kdata.length;
+        Arrays.fill(kdata, v);
+
+        Kernel k = new Kernel(kw, kh, kdata);
+        ConvolveOp op = new ConvolveOp(k, edgeHint, null);
+
+        return op;
+    }
+}
\ No newline at end of file
--- a/jdk/test/java/nio/Buffer/Basic-X.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/Basic-X.java	Sat Apr 18 14:10:27 2009 -0700
@@ -365,8 +365,11 @@
 
         b.position(2);
         ck(b, b.charAt(1), 'd');
-        CharBuffer c = (CharBuffer)b.subSequence(1, 4);
-        ck(b, b.subSequence(1, 4).toString().equals("def"));
+        CharBuffer c = b.subSequence(1, 4);
+        ck(c, c.capacity(), b.capacity());
+        ck(c, c.position(), b.position()+1);
+        ck(c, c.limit(), b.position()+4);
+        ck(c, b.subSequence(1, 4).toString().equals("def"));
 
         // 4938424
         b.position(4);
@@ -722,6 +725,8 @@
         ck(b, start, b.position());
         ck(b, end, b.limit());
         ck(b, s.length(), b.capacity());
+        b.position(6);
+        ck(b, b.subSequence(0,3).toString().equals("ghi"));
 
         // The index, relative to the position, must be non-negative and
         // smaller than remaining().
--- a/jdk/test/java/nio/Buffer/Basic.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/Basic.java	Sat Apr 18 14:10:27 2009 -0700
@@ -25,7 +25,7 @@
  * @summary Unit test for buffers
  * @bug 4413135 4414911 4416536 4416562 4418782 4471053 4472779 4490253 4523725
  *      4526177 4463011 4660660 4661219 4663521 4782970 4804304 4938424 6231529
- *      6221101 6234263 6535542 6591971 6593946
+ *      6221101 6234263 6535542 6591971 6593946 6795561
  * @author Mark Reinhold
  */
 
--- a/jdk/test/java/nio/Buffer/BasicByte.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/BasicByte.java	Sat Apr 18 14:10:27 2009 -0700
@@ -375,6 +375,9 @@
 
 
 
+
+
+
         // Compact
 
         relPut(b);
@@ -786,6 +789,8 @@
 
 
 
+
+
     public static void test(final byte [] ba) {
         int offset = 47;
         int length = 900;
--- a/jdk/test/java/nio/Buffer/BasicChar.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/BasicChar.java	Sat Apr 18 14:10:27 2009 -0700
@@ -365,8 +365,11 @@
 
         b.position(2);
         ck(b, b.charAt(1), 'd');
-        CharBuffer c = (CharBuffer)b.subSequence(1, 4);
-        ck(b, b.subSequence(1, 4).toString().equals("def"));
+        CharBuffer c = b.subSequence(1, 4);
+        ck(c, c.capacity(), b.capacity());
+        ck(c, c.position(), b.position()+1);
+        ck(c, c.limit(), b.position()+4);
+        ck(c, b.subSequence(1, 4).toString().equals("def"));
 
         // 4938424
         b.position(4);
@@ -722,6 +725,8 @@
         ck(b, start, b.position());
         ck(b, end, b.limit());
         ck(b, s.length(), b.capacity());
+        b.position(6);
+        ck(b, b.subSequence(0,3).toString().equals("ghi"));
 
         // The index, relative to the position, must be non-negative and
         // smaller than remaining().
--- a/jdk/test/java/nio/Buffer/BasicDouble.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/BasicDouble.java	Sat Apr 18 14:10:27 2009 -0700
@@ -375,6 +375,9 @@
 
 
 
+
+
+
         // Compact
 
         relPut(b);
@@ -786,6 +789,8 @@
 
 
 
+
+
     public static void test(final double [] ba) {
         int offset = 47;
         int length = 900;
--- a/jdk/test/java/nio/Buffer/BasicFloat.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/BasicFloat.java	Sat Apr 18 14:10:27 2009 -0700
@@ -375,6 +375,9 @@
 
 
 
+
+
+
         // Compact
 
         relPut(b);
@@ -786,6 +789,8 @@
 
 
 
+
+
     public static void test(final float [] ba) {
         int offset = 47;
         int length = 900;
--- a/jdk/test/java/nio/Buffer/BasicInt.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/BasicInt.java	Sat Apr 18 14:10:27 2009 -0700
@@ -375,6 +375,9 @@
 
 
 
+
+
+
         // Compact
 
         relPut(b);
@@ -786,6 +789,8 @@
 
 
 
+
+
     public static void test(final int [] ba) {
         int offset = 47;
         int length = 900;
--- a/jdk/test/java/nio/Buffer/BasicLong.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/BasicLong.java	Sat Apr 18 14:10:27 2009 -0700
@@ -375,6 +375,9 @@
 
 
 
+
+
+
         // Compact
 
         relPut(b);
@@ -786,6 +789,8 @@
 
 
 
+
+
     public static void test(final long [] ba) {
         int offset = 47;
         int length = 900;
--- a/jdk/test/java/nio/Buffer/BasicShort.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/Buffer/BasicShort.java	Sat Apr 18 14:10:27 2009 -0700
@@ -375,6 +375,9 @@
 
 
 
+
+
+
         // Compact
 
         relPut(b);
@@ -786,6 +789,8 @@
 
 
 
+
+
     public static void test(final short [] ba) {
         int offset = 47;
         int length = 900;
--- a/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/channels/AsynchronousFileChannel/Basic.java	Sat Apr 18 14:10:27 2009 -0700
@@ -22,7 +22,7 @@
  */
 
 /* @test
- * @bug 4607272
+ * @bug 4607272 6822643
  * @summary Unit test for AsynchronousFileChannel
  */
 
@@ -51,7 +51,6 @@
         // run tests
         testUsingCompletionHandlers(ch);
         testUsingWaitOnResult(ch);
-        testLocking(ch);
         testInterruptHandlerThread(ch);
 
         // close channel and invoke test that expects channel to be closed
@@ -59,6 +58,7 @@
         testClosedChannel(ch);
 
         // these tests open the file themselves
+        testLocking(blah.toPath());
         testCustomThreadPool(blah.toPath());
         testAsynchronousClose(blah.toPath());
         testCancel(blah.toPath());
@@ -160,47 +160,54 @@
     }
 
     // exercise lock methods
-    static void testLocking(AsynchronousFileChannel ch)
-        throws IOException
-    {
+    static void testLocking(Path file) throws IOException {
         System.out.println("testLocking");
 
-        // test 1 - acquire lock and check that tryLock throws
-        // OverlappingFileLockException
+        AsynchronousFileChannel ch = AsynchronousFileChannel
+            .open(file, READ, WRITE);
         FileLock fl;
         try {
-            fl = ch.lock().get();
-        } catch (ExecutionException x) {
-            throw new RuntimeException(x);
-        } catch (InterruptedException x) {
-            throw new RuntimeException("Should not be interrupted");
-        }
-        if (!fl.acquiredBy().equals(ch))
-            throw new RuntimeException("FileLock#acquiredBy returned incorrect channel");
-        try {
-            ch.tryLock();
-            throw new RuntimeException("OverlappingFileLockException expected");
-        } catch (OverlappingFileLockException x) {
-        }
-        fl.release();
+            // test 1 - acquire lock and check that tryLock throws
+            // OverlappingFileLockException
+            try {
+                fl = ch.lock().get();
+            } catch (ExecutionException x) {
+                throw new RuntimeException(x);
+            } catch (InterruptedException x) {
+                throw new RuntimeException("Should not be interrupted");
+            }
+            if (!fl.acquiredBy().equals(ch))
+                throw new RuntimeException("FileLock#acquiredBy returned incorrect channel");
+            try {
+                ch.tryLock();
+                throw new RuntimeException("OverlappingFileLockException expected");
+            } catch (OverlappingFileLockException x) {
+            }
+            fl.release();
 
-        // test 2 - acquire try and check that lock throws OverlappingFileLockException
-        fl = ch.tryLock();
-        if (fl == null)
-            throw new RuntimeException("Unable to acquire lock");
-        try {
-            ch.lock(null, new CompletionHandler<FileLock,Void> () {
-                public void completed(FileLock result, Void att) {
-                }
-                public void failed(Throwable exc, Void att) {
-                }
-                public void cancelled(Void att) {
-                }
-            });
-            throw new RuntimeException("OverlappingFileLockException expected");
-        } catch (OverlappingFileLockException x) {
+            // test 2 - acquire try and check that lock throws OverlappingFileLockException
+            fl = ch.tryLock();
+            if (fl == null)
+                throw new RuntimeException("Unable to acquire lock");
+            try {
+                ch.lock(null, new CompletionHandler<FileLock,Void> () {
+                    public void completed(FileLock result, Void att) {
+                    }
+                    public void failed(Throwable exc, Void att) {
+                    }
+                    public void cancelled(Void att) {
+                    }
+                });
+                throw new RuntimeException("OverlappingFileLockException expected");
+            } catch (OverlappingFileLockException x) {
+            }
+        } finally {
+            ch.close();
         }
-        fl.release();
+
+        // test 3 - channel is closed so FileLock should no longer be valid
+        if (fl.isValid())
+            throw new RuntimeException("FileLock expected to be invalid");
     }
 
     // interrupt should not close channel
--- a/jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/nio/channels/AsynchronousFileChannel/Lock.java	Sat Apr 18 14:10:27 2009 -0700
@@ -23,7 +23,7 @@
 
 
 /* @test
- * @bug 4607272
+ * @bug 4607272 6814948
  * @summary Unit test for AsynchronousFileChannel#lock method
  */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6543863
+ * @summary Try to cause a deadlock between (Asynchronous)FileChannel.close
+ *   and FileLock.release
+ */
+
+import java.io.*;
+import java.nio.file.Path;
+import static java.nio.file.StandardOpenOption.*;
+import java.nio.channels.*;
+import java.util.concurrent.*;
+
+public class ReleaseOnCloseDeadlock {
+    private static final int LOCK_COUNT = 1024;
+
+    public static void main(String[] args) throws IOException {
+        File blah = File.createTempFile("blah", null);
+        blah.deleteOnExit();
+        for (int i=0; i<100; i++) {
+            test(blah.toPath());
+        }
+    }
+
+    static void test(Path file) throws IOException {
+        FileLock[] locks = new FileLock[LOCK_COUNT];
+
+        FileChannel fc = FileChannel.open(file, READ, WRITE);
+        for (int i=0; i<LOCK_COUNT; i++) {
+            locks[i] = fc.lock(i, 1, true);
+        }
+        tryToDeadlock(fc, locks);
+
+        AsynchronousFileChannel ch = AsynchronousFileChannel.open(file, READ, WRITE);
+        for (int i=0; i<LOCK_COUNT; i++) {
+            try {
+                locks[i] = ch.lock(i, 1, true, null, null).get();
+            } catch (InterruptedException x) {
+                throw new RuntimeException(x);
+            } catch (ExecutionException x) {
+                throw new RuntimeException(x);
+            }
+        }
+        tryToDeadlock(ch, locks);
+    }
+
+    static void tryToDeadlock(final Channel channel, FileLock[] locks)
+        throws IOException
+    {
+        // start thread to close the file (and invalidate the locks)
+        Thread closer = new Thread(
+            new Runnable() {
+                public void run() {
+                    try {
+                        channel.close();
+                    } catch (IOException ignore) {
+                        ignore.printStackTrace();
+                    }
+                }});
+        closer.start();
+
+        // release the locks explicitly
+        for (int i=0; i<locks.length; i++) {
+            try {
+                locks[i].release();
+            } catch (ClosedChannelException ignore) { }
+        }
+
+        // we are done when closer has terminated
+        while (closer.isAlive()) {
+            try {
+                closer.join();
+            } catch (InterruptedException ignore) { }
+        }
+    }
+}
--- a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.java	Sat Apr 18 14:10:27 2009 -0700
@@ -56,7 +56,7 @@
                         e.printStackTrace();
                     }
                 }
-            }
+            };
 
         Thread thread1 = new Thread(readObjectRunnable, "Read Object");
         Thread thread2 = new Thread(xmlRunnable, "XML");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/zip/ZipCoding.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 4244499 4532049 4700978 4820807 4980042
+ * @summary Test ZipInputStream, ZipOutputStream and ZipFile with non-UTF8 encoding
+ */
+
+import java.io.*;
+import java.nio.charset.*;
+import java.util.*;
+import java.util.zip.*;
+
+public class ZipCoding {
+
+    public static void main(String[] args) throws Exception {
+
+        test("MS932",
+             "\u4e00\u4e01", "\uff67\uff68\uff69\uff6a\uff6b\uff6c");
+
+        test("ibm437",
+             "\u00e4\u00fc", "German Umlaut \u00fc in comment");
+
+        test("utf-8",
+             "\u4e00\u4e01", "\uff67\uff68\uff69\uff6a\uff6b\uff6c");
+
+        test("utf-8",
+             "\u00e4\u00fc", "German Umlaut \u00fc in comment");
+
+        test("utf-8",
+             "Surrogate\ud801\udc01", "Surrogates \ud800\udc00 in comment");
+
+    }
+
+    static void testZipInputStream(InputStream is, Charset cs,
+                                   String name, String comment, byte[] bb)
+        throws Exception
+    {
+        ZipInputStream zis = new ZipInputStream(is, cs);
+        ZipEntry e = zis.getNextEntry();
+        if (e == null || ! name.equals(e.getName()))
+            throw new RuntimeException("ZipIS name doesn't match!");
+        byte[] bBuf = new byte[bb.length << 1];
+        int n = zis.read(bBuf, 0, bBuf.length);
+        if (n != bb.length ||
+            !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) {
+            throw new RuntimeException("ZipIS content doesn't match!");
+        }
+        zis.close();
+    }
+
+    static void testZipFile(File f, Charset cs,
+                            String name, String comment, byte[] bb)
+        throws Exception
+    {
+        ZipFile zf = new ZipFile(f, cs);
+        Enumeration<? extends ZipEntry> zes = zf.entries();
+        ZipEntry e = (ZipEntry)zes.nextElement();
+        if (! name.equals(e.getName()) ||
+            ! comment.equals(e.getComment()))
+            throw new RuntimeException("ZipFile: name/comment doesn't match!");
+        InputStream is = zf.getInputStream(e);
+        if (is == null)
+            throw new RuntimeException("ZipFile: getIS failed!");
+        byte[] bBuf = new byte[bb.length << 1];
+        int n = 0;
+        int nn =0;
+        while ((nn = is.read(bBuf, n, bBuf.length-n)) != -1) {
+            n += nn;
+        }
+        if (n != bb.length ||
+            !Arrays.equals(bb, Arrays.copyOf(bBuf, n))) {
+            throw new RuntimeException("ZipFile content doesn't match!");
+        }
+        zf.close();
+    }
+
+    static void test(String csn, String name, String comment)
+        throws Exception
+    {
+        byte[] bb = "This is the conent of the zipfile".getBytes("ISO-8859-1");
+        Charset cs = Charset.forName(csn);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ZipOutputStream zos = new ZipOutputStream(baos, cs);
+
+        ZipEntry e = new ZipEntry(name);
+        e.setComment(comment);
+        zos.putNextEntry(e);
+        zos.write(bb, 0, bb.length);
+        zos.closeEntry();
+        zos.close();
+        ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray());
+        testZipInputStream(bis, cs, name, comment, bb);
+
+        if ("utf-8".equals(csn)) {
+            // EFS should be set
+            bis.reset();
+            testZipInputStream(bis, Charset.forName("MS932"), name, comment, bb);
+        }
+
+        File f = new File(new File(System.getProperty("test.dir", ".")),
+                          "zfcoding.zip");
+        FileOutputStream fos = new FileOutputStream(f);
+        baos.writeTo(fos);
+        fos.close();
+        testZipFile(f, cs, name, comment, bb);
+        if ("utf-8".equals(csn)) {
+            testZipFile(f, Charset.forName("MS932"), name, comment, bb);
+        }
+        f.delete();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/zip/zip.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,743 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+import java.io.*;
+import java.nio.charset.Charset;
+import java.util.*;
+import java.util.zip.*;
+import java.text.MessageFormat;
+
+/**
+ * A stripped-down version of Jar tool with a "-encoding" option to
+ * support non-UTF8 encoidng for entry name and comment.
+ */
+public class zip {
+    String program;
+    PrintStream out, err;
+    String fname;
+    String zname = "";
+    String[] files;
+    Charset cs = Charset.forName("UTF-8");
+
+    Map<String, File> entryMap = new HashMap<String, File>();
+    Set<File> entries = new LinkedHashSet<File>();
+    List<String> paths = new ArrayList<String>();
+
+    CRC32 crc32 = new CRC32();
+    /*
+     * cflag: create
+     * uflag: update
+     * xflag: xtract
+     * tflag: table
+     * vflag: verbose
+     * flag0: no zip compression (store only)
+     */
+    boolean cflag, uflag, xflag, tflag, vflag, flag0;
+
+    private static ResourceBundle rsrc;
+    static {
+        try {
+            // just use the jar message
+            rsrc = ResourceBundle.getBundle("sun.tools.jar.resources.jar");
+        } catch (MissingResourceException e) {
+            throw new Error("Fatal: Resource for jar is missing");
+        }
+    }
+
+    public zip(PrintStream out, PrintStream err, String program) {
+        this.out = out;
+        this.err = err;
+        this.program = program;
+    }
+
+    private boolean ok;
+
+    public synchronized boolean run(String args[]) {
+        ok = true;
+        if (!parseArgs(args)) {
+            return false;
+        }
+        try {
+            if (cflag || uflag) {
+                if (fname != null) {
+                    zname = fname.replace(File.separatorChar, '/');
+                    if (zname.startsWith("./")) {
+                        zname = zname.substring(2);
+                    }
+                }
+            }
+            if (cflag) {
+                OutputStream out;
+                if (fname != null) {
+                    out = new FileOutputStream(fname);
+                } else {
+                    out = new FileOutputStream(FileDescriptor.out);
+                    if (vflag) {
+                         vflag = false;
+                    }
+                }
+                expand(null, files, false);
+                create(new BufferedOutputStream(out, 4096));
+                out.close();
+            } else if (uflag) {
+                File inputFile = null, tmpFile = null;
+                FileInputStream in;
+                FileOutputStream out;
+                if (fname != null) {
+                    inputFile = new File(fname);
+                    String path = inputFile.getParent();
+                    tmpFile = File.createTempFile("tmp", null,
+                              new File((path == null) ? "." : path));
+                    in = new FileInputStream(inputFile);
+                    out = new FileOutputStream(tmpFile);
+                } else {
+                    in = new FileInputStream(FileDescriptor.in);
+                    out = new FileOutputStream(FileDescriptor.out);
+                    vflag = false;
+                }
+                expand(null, files, true);
+                boolean updateOk = update(in, new BufferedOutputStream(out));
+                if (ok) {
+                    ok = updateOk;
+                }
+                in.close();
+                out.close();
+                if (fname != null) {
+                    inputFile.delete();
+                    if (!tmpFile.renameTo(inputFile)) {
+                        tmpFile.delete();
+                        throw new IOException(getMsg("error.write.file"));
+                    }
+                    tmpFile.delete();
+                }
+            } else if (tflag) {
+                replaceFSC(files);
+                if (fname != null) {
+                    list(fname, files);
+                } else {
+                    InputStream in = new FileInputStream(FileDescriptor.in);
+                    try{
+                        list(new BufferedInputStream(in), files);
+                    } finally {
+                        in.close();
+                    }
+                }
+            } else if (xflag) {
+                replaceFSC(files);
+                if (fname != null && files != null) {
+                    extract(fname, files);
+                } else {
+                    InputStream in = (fname == null)
+                        ? new FileInputStream(FileDescriptor.in)
+                        : new FileInputStream(fname);
+                    try {
+                        extract(new BufferedInputStream(in), files);
+                    } finally {
+                        in.close();
+                    }
+                }
+            }
+        } catch (IOException e) {
+            fatalError(e);
+            ok = false;
+        } catch (Error ee) {
+            ee.printStackTrace();
+            ok = false;
+        } catch (Throwable t) {
+            t.printStackTrace();
+            ok = false;
+        }
+        out.flush();
+        err.flush();
+        return ok;
+    }
+
+
+    boolean parseArgs(String args[]) {
+        try {
+            args = parse(args);
+        } catch (FileNotFoundException e) {
+            fatalError(formatMsg("error.cant.open", e.getMessage()));
+            return false;
+        } catch (IOException e) {
+            fatalError(e);
+            return false;
+        }
+        int count = 1;
+        try {
+            String flags = args[0];
+            if (flags.startsWith("-")) {
+                flags = flags.substring(1);
+            }
+            for (int i = 0; i < flags.length(); i++) {
+                switch (flags.charAt(i)) {
+                case 'c':
+                    if (xflag || tflag || uflag) {
+                        usageError();
+                        return false;
+                    }
+                    cflag = true;
+                    break;
+                case 'u':
+                    if (cflag || xflag || tflag) {
+                        usageError();
+                        return false;
+                    }
+                    uflag = true;
+                    break;
+                case 'x':
+                    if (cflag || uflag || tflag) {
+                        usageError();
+                        return false;
+                    }
+                    xflag = true;
+                    break;
+                case 't':
+                    if (cflag || uflag || xflag) {
+                        usageError();
+                        return false;
+                    }
+                    tflag = true;
+                    break;
+                case 'v':
+                    vflag = true;
+                    break;
+                case 'f':
+                    fname = args[count++];
+                    break;
+                case '0':
+                    flag0 = true;
+                    break;
+                default:
+                    error(formatMsg("error.illegal.option",
+                                String.valueOf(flags.charAt(i))));
+                    usageError();
+                    return false;
+                }
+            }
+        } catch (ArrayIndexOutOfBoundsException e) {
+            usageError();
+            return false;
+        }
+        if (!cflag && !tflag && !xflag && !uflag) {
+            error(getMsg("error.bad.option"));
+            usageError();
+            return false;
+        }
+        /* parse file arguments */
+        int n = args.length - count;
+        if (n > 0) {
+            int k = 0;
+            String[] nameBuf = new String[n];
+            try {
+                for (int i = count; i < args.length; i++) {
+                    if (args[i].equals("-encoding")) {
+                        cs = Charset.forName(args[++i]);
+                    } else if (args[i].equals("-C")) {
+                        /* change the directory */
+                        String dir = args[++i];
+                        dir = (dir.endsWith(File.separator) ?
+                               dir : (dir + File.separator));
+                        dir = dir.replace(File.separatorChar, '/');
+                        while (dir.indexOf("//") > -1) {
+                            dir = dir.replace("//", "/");
+                        }
+                        paths.add(dir.replace(File.separatorChar, '/'));
+                        nameBuf[k++] = dir + args[++i];
+                    } else {
+                        nameBuf[k++] = args[i];
+                    }
+                }
+            } catch (ArrayIndexOutOfBoundsException e) {
+                e.printStackTrace();
+                usageError();
+                return false;
+            }
+            if (k != 0) {
+                files = new String[k];
+                System.arraycopy(nameBuf, 0, files, 0, k);
+            }
+        } else if (cflag || uflag) {
+            error(getMsg("error.bad.uflag"));
+            usageError();
+            return false;
+        }
+        return true;
+    }
+
+    void expand(File dir, String[] files, boolean isUpdate) {
+        if (files == null) {
+            return;
+        }
+        for (int i = 0; i < files.length; i++) {
+            File f;
+            if (dir == null) {
+                f = new File(files[i]);
+            } else {
+                f = new File(dir, files[i]);
+            }
+            if (f.isFile()) {
+                if (entries.add(f)) {
+                    if (isUpdate)
+                        entryMap.put(entryName(f.getPath()), f);
+                }
+            } else if (f.isDirectory()) {
+                if (entries.add(f)) {
+                    if (isUpdate) {
+                        String dirPath = f.getPath();
+                        dirPath = (dirPath.endsWith(File.separator)) ? dirPath :
+                            (dirPath + File.separator);
+                        entryMap.put(entryName(dirPath), f);
+                    }
+                    expand(f, f.list(), isUpdate);
+                }
+            } else {
+                error(formatMsg("error.nosuch.fileordir", String.valueOf(f)));
+                ok = false;
+            }
+        }
+    }
+
+    void create(OutputStream out) throws IOException
+    {
+        ZipOutputStream zos = new ZipOutputStream(out, cs);
+        if (flag0) {
+            zos.setMethod(ZipOutputStream.STORED);
+        }
+        for (File file: entries) {
+            addFile(zos, file);
+        }
+        zos.close();
+    }
+
+    boolean update(InputStream in, OutputStream out) throws IOException
+    {
+        ZipInputStream zis = new ZipInputStream(in, cs);
+        ZipOutputStream zos = new ZipOutputStream(out, cs);
+        ZipEntry e = null;
+        byte[] buf = new byte[1024];
+        int n = 0;
+        boolean updateOk = true;
+
+        // put the old entries first, replace if necessary
+        while ((e = zis.getNextEntry()) != null) {
+            String name = e.getName();
+            if (!entryMap.containsKey(name)) { // copy the old stuff
+                // do our own compression
+                ZipEntry e2 = new ZipEntry(name);
+                e2.setMethod(e.getMethod());
+                e2.setTime(e.getTime());
+                e2.setComment(e.getComment());
+                e2.setExtra(e.getExtra());
+                if (e.getMethod() == ZipEntry.STORED) {
+                    e2.setSize(e.getSize());
+                    e2.setCrc(e.getCrc());
+                }
+                zos.putNextEntry(e2);
+                while ((n = zis.read(buf, 0, buf.length)) != -1) {
+                    zos.write(buf, 0, n);
+                }
+            } else { // replace with the new files
+                File f = entryMap.get(name);
+                addFile(zos, f);
+                entryMap.remove(name);
+                entries.remove(f);
+            }
+        }
+
+        // add the remaining new files
+        for (File f: entries) {
+            addFile(zos, f);
+        }
+        zis.close();
+        zos.close();
+        return updateOk;
+    }
+
+    private String entryName(String name) {
+        name = name.replace(File.separatorChar, '/');
+        String matchPath = "";
+        for (String path : paths) {
+            if (name.startsWith(path) && (path.length() > matchPath.length())) {
+                matchPath = path;
+            }
+        }
+        name = name.substring(matchPath.length());
+
+        if (name.startsWith("/")) {
+            name = name.substring(1);
+        } else if (name.startsWith("./")) {
+            name = name.substring(2);
+        }
+        return name;
+    }
+
+    void addFile(ZipOutputStream zos, File file) throws IOException {
+        String name = file.getPath();
+        boolean isDir = file.isDirectory();
+        if (isDir) {
+            name = name.endsWith(File.separator) ? name :
+                (name + File.separator);
+        }
+        name = entryName(name);
+
+        if (name.equals("") || name.equals(".") || name.equals(zname)) {
+            return;
+        }
+
+        long size = isDir ? 0 : file.length();
+
+        if (vflag) {
+            out.print(formatMsg("out.adding", name));
+        }
+        ZipEntry e = new ZipEntry(name);
+        e.setTime(file.lastModified());
+        if (size == 0) {
+            e.setMethod(ZipEntry.STORED);
+            e.setSize(0);
+            e.setCrc(0);
+        } else if (flag0) {
+            e.setSize(size);
+            e.setMethod(ZipEntry.STORED);
+            crc32File(e, file);
+        }
+        zos.putNextEntry(e);
+        if (!isDir) {
+            byte[] buf = new byte[8192];
+            int len;
+            InputStream is = new BufferedInputStream(new FileInputStream(file));
+            while ((len = is.read(buf, 0, buf.length)) != -1) {
+                zos.write(buf, 0, len);
+            }
+            is.close();
+        }
+        zos.closeEntry();
+        /* report how much compression occurred. */
+        if (vflag) {
+            size = e.getSize();
+            long csize = e.getCompressedSize();
+            out.print(formatMsg2("out.size", String.valueOf(size),
+                        String.valueOf(csize)));
+            if (e.getMethod() == ZipEntry.DEFLATED) {
+                long ratio = 0;
+                if (size != 0) {
+                    ratio = ((size - csize) * 100) / size;
+                }
+                output(formatMsg("out.deflated", String.valueOf(ratio)));
+            } else {
+                output(getMsg("out.stored"));
+            }
+        }
+    }
+
+    private void crc32File(ZipEntry e, File f) throws IOException {
+        InputStream is = new BufferedInputStream(new FileInputStream(f));
+        byte[] buf = new byte[8192];
+        crc32.reset();
+        int r = 0;
+        int nread = 0;
+        long len = f.length();
+        while ((r = is.read(buf)) != -1) {
+            nread += r;
+            crc32.update(buf, 0, r);
+        }
+        is.close();
+        if (nread != (int) len) {
+            throw new ZipException(formatMsg(
+                        "error.incorrect.length", f.getPath()));
+        }
+        e.setCrc(crc32.getValue());
+    }
+
+    void replaceFSC(String files[]) {
+        if (files != null) {
+            for (String file : files) {
+                file = file.replace(File.separatorChar, '/');
+            }
+        }
+    }
+
+    Set<ZipEntry> newDirSet() {
+        return new HashSet<ZipEntry>() {
+            public boolean add(ZipEntry e) {
+                return (e == null || super.add(e));
+            }};
+    }
+
+    void updateLastModifiedTime(Set<ZipEntry> zes) throws IOException {
+        for (ZipEntry ze : zes) {
+            long lastModified = ze.getTime();
+            if (lastModified != -1) {
+                File f = new File(ze.getName().replace('/', File.separatorChar));
+                f.setLastModified(lastModified);
+            }
+        }
+    }
+
+    void extract(InputStream in, String files[]) throws IOException {
+        ZipInputStream zis = new ZipInputStream(in, cs);
+        ZipEntry e;
+        Set<ZipEntry> dirs = newDirSet();
+        while ((e = zis.getNextEntry()) != null) {
+            if (files == null) {
+                dirs.add(extractFile(zis, e));
+            } else {
+                String name = e.getName();
+                for (String file : files) {
+                    if (name.startsWith(file)) {
+                        dirs.add(extractFile(zis, e));
+                        break;
+                    }
+                }
+            }
+        }
+        updateLastModifiedTime(dirs);
+    }
+
+    void extract(String fname, String files[]) throws IOException {
+        ZipFile zf = new ZipFile(fname, cs);
+        Set<ZipEntry> dirs = newDirSet();
+        Enumeration<? extends ZipEntry> zes = zf.entries();
+        while (zes.hasMoreElements()) {
+            ZipEntry e = zes.nextElement();
+            InputStream is;
+            if (files == null) {
+                dirs.add(extractFile(zf.getInputStream(e), e));
+            } else {
+                String name = e.getName();
+                for (String file : files) {
+                    if (name.startsWith(file)) {
+                        dirs.add(extractFile(zf.getInputStream(e), e));
+                        break;
+                    }
+                }
+            }
+        }
+        zf.close();
+        updateLastModifiedTime(dirs);
+    }
+
+    ZipEntry extractFile(InputStream is, ZipEntry e) throws IOException {
+        ZipEntry rc = null;
+        String name = e.getName();
+        File f = new File(e.getName().replace('/', File.separatorChar));
+        if (e.isDirectory()) {
+            if (f.exists()) {
+                if (!f.isDirectory()) {
+                    throw new IOException(formatMsg("error.create.dir",
+                        f.getPath()));
+                }
+            } else {
+                if (!f.mkdirs()) {
+                    throw new IOException(formatMsg("error.create.dir",
+                        f.getPath()));
+                } else {
+                    rc = e;
+                }
+            }
+            if (vflag) {
+                output(formatMsg("out.create", name));
+            }
+        } else {
+            if (f.getParent() != null) {
+                File d = new File(f.getParent());
+                if (!d.exists() && !d.mkdirs() || !d.isDirectory()) {
+                    throw new IOException(formatMsg(
+                        "error.create.dir", d.getPath()));
+                }
+            }
+            OutputStream os = new FileOutputStream(f);
+            byte[] b = new byte[8192];
+            int len;
+            try {
+                while ((len = is.read(b, 0, b.length)) != -1) {
+                    os.write(b, 0, len);
+                }
+            } finally {
+                if (is instanceof ZipInputStream)
+                    ((ZipInputStream)is).closeEntry();
+                else
+                    is.close();
+                os.close();
+            }
+            if (vflag) {
+                if (e.getMethod() == ZipEntry.DEFLATED) {
+                    output(formatMsg("out.inflated", name));
+                } else {
+                    output(formatMsg("out.extracted", name));
+                }
+            }
+        }
+        long lastModified = e.getTime();
+        if (lastModified != -1) {
+            f.setLastModified(lastModified);
+        }
+        return rc;
+    }
+
+    void list(InputStream in, String files[]) throws IOException {
+        ZipInputStream zis = new ZipInputStream(in, cs);
+        ZipEntry e;
+        while ((e = zis.getNextEntry()) != null) {
+            zis.closeEntry();
+            printEntry(e, files);
+        }
+    }
+
+    void list(String fname, String files[]) throws IOException {
+        ZipFile zf = new ZipFile(fname, cs);
+        Enumeration<? extends ZipEntry> zes = zf.entries();
+        while (zes.hasMoreElements()) {
+            printEntry(zes.nextElement(), files);
+        }
+        zf.close();
+    }
+
+    void printEntry(ZipEntry e, String[] files) throws IOException {
+        if (files == null) {
+            printEntry(e);
+        } else {
+            String name = e.getName();
+            for (String file : files) {
+                if (name.startsWith(file)) {
+                    printEntry(e);
+                    return;
+                }
+            }
+        }
+    }
+
+    void printEntry(ZipEntry e) throws IOException {
+        if (vflag) {
+            StringBuilder sb = new StringBuilder();
+            String s = Long.toString(e.getSize());
+            for (int i = 6 - s.length(); i > 0; --i) {
+                sb.append(' ');
+            }
+            sb.append(s).append(' ').append(new Date(e.getTime()).toString());
+            sb.append(' ').append(e.getName());
+            output(sb.toString());
+        } else {
+            output(e.getName());
+        }
+    }
+
+    void usageError() {
+        error(
+        "Usage: zip {ctxu}[vf0] [zip-file] [-encoding encname][-C dir] files ...\n" +
+        "Options:\n" +
+        "   -c  create new archive\n" +
+        "   -t  list table of contents for archive\n" +
+        "   -x  extract named (or all) files from archive\n" +
+        "   -u  update existing archive\n" +
+        "   -v  generate verbose output on standard output\n" +
+        "   -f  specify archive file name\n" +
+        "   -0  store only; use no ZIP compression\n" +
+        "   -C  change to the specified directory and include the following file\n" +
+        "If any file is a directory then it is processed recursively.\n");
+    }
+
+    void fatalError(Exception e) {
+        e.printStackTrace();
+    }
+
+
+    void fatalError(String s) {
+        error(program + ": " + s);
+    }
+
+
+    protected void output(String s) {
+        out.println(s);
+    }
+
+    protected void error(String s) {
+        err.println(s);
+    }
+
+    private String getMsg(String key) {
+        try {
+            return (rsrc.getString(key));
+        } catch (MissingResourceException e) {
+            throw new Error("Error in message file");
+        }
+    }
+
+    private String formatMsg(String key, String arg) {
+        String msg = getMsg(key);
+        String[] args = new String[1];
+        args[0] = arg;
+        return MessageFormat.format(msg, (Object[]) args);
+    }
+
+    private String formatMsg2(String key, String arg, String arg1) {
+        String msg = getMsg(key);
+        String[] args = new String[2];
+        args[0] = arg;
+        args[1] = arg1;
+        return MessageFormat.format(msg, (Object[]) args);
+    }
+
+    public static String[] parse(String[] args) throws IOException
+    {
+        ArrayList<String> newArgs = new ArrayList<String>(args.length);
+        for (int i = 0; i < args.length; i++) {
+            String arg = args[i];
+            if (arg.length() > 1 && arg.charAt(0) == '@') {
+                arg = arg.substring(1);
+                if (arg.charAt(0) == '@') {
+                    newArgs.add(arg);
+                } else {
+                    loadCmdFile(arg, newArgs);
+                }
+            } else {
+                newArgs.add(arg);
+            }
+        }
+        return newArgs.toArray(new String[newArgs.size()]);
+    }
+
+    private static void loadCmdFile(String name, List<String> args) throws IOException
+    {
+        Reader r = new BufferedReader(new FileReader(name));
+        StreamTokenizer st = new StreamTokenizer(r);
+        st.resetSyntax();
+        st.wordChars(' ', 255);
+        st.whitespaceChars(0, ' ');
+        st.commentChar('#');
+        st.quoteChar('"');
+        st.quoteChar('\'');
+        while (st.nextToken() != st.TT_EOF) {
+            args.add(st.sval);
+        }
+        r.close();
+    }
+
+    public static void main(String args[]) {
+        zip z = new zip(System.out, System.err, "zip");
+        System.exit(z.run(args) ? 0 : 1);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/print/attribute/MediaMappingsTest.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6652463
+ * @summary Verify media size-> media mappings can't be altered
+ * @run main MediaMappingsTest
+*/
+
+import javax.print.attribute.standard.MediaSize;
+import javax.print.attribute.standard.MediaSizeName;
+
+public class MediaMappingsTest {
+
+    public static void main(String args[]) {
+        MediaSize sizeA = MediaSize.getMediaSizeForName(MediaSizeName.A);
+        new MediaSize(1.0f, 2.0f, MediaSize.MM, MediaSizeName.A);
+        if (!sizeA.equals(MediaSize.getMediaSizeForName(MediaSizeName.A))) {
+             throw new RuntimeException("mapping changed");
+        }
+        MediaSize sizeB = MediaSize.getMediaSizeForName(MediaSizeName.B);
+        new MediaSize(1, 2, MediaSize.MM, MediaSizeName.B);
+        if (!sizeB.equals(MediaSize.getMediaSizeForName(MediaSizeName.B))) {
+             throw new RuntimeException("mapping changed");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/ConfigWithQuotations.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+/*
+ * @test
+ * @bug 6714845
+ * @summary Quotes in Kerberos configuration file are included in the values
+ */
+
+import sun.security.krb5.Config;
+
+public class ConfigWithQuotations {
+    public static void main(String[] args) throws Exception {
+        // This config file is generated using Kerberos.app on a Mac
+        System.setProperty("java.security.krb5.conf",
+                System.getProperty("test.src", ".") +"/edu.mit.Kerberos");
+        Config config = Config.getInstance();
+
+        System.out.println(config);
+
+        if (!config.getDefaultRealm().equals("MAC.LOCAL")) {
+            throw new Exception("Realm error");
+        }
+        if (!config.getKDCList("MAC.LOCAL").equals("kdc.mac.local:88")) {
+            throw new Exception("KDC error");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/krb5/edu.mit.Kerberos	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,15 @@
+[domain_realm]
+
+[libdefaults]
+	default_realm = "MAC.LOCAL"
+	dns_fallback = "no"
+
+[logging]
+	admin_server = "FILE:/var/log/krb5kdc/kadmin.log"
+	kdc = "FILE:/var/log/krb5kdc/kdc.log"
+
+[realms]
+	MAC.LOCAL = {
+		kdc = "kdc.mac.local:88"
+	}
+
--- a/jdk/test/sun/security/util/Oid/OidFormat.java	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/sun/security/util/Oid/OidFormat.java	Sat Apr 18 14:10:27 2009 -0700
@@ -63,9 +63,22 @@
             "1.2.3", "1.2.3445",
             "1.3.6.1.4.1.42.2.17",
             // 4811968: ASN.1 cannot handle huge OID components
-            //"2.16.764.1.3101555394.1.0.100.2.1",
-            //"1.2.2147483647.4",
-            //"1.2.268435456.4",
+            "2.16.764.1.3101555394.1.0.100.2.1",
+            "2.2726957624935694386592435",  // as huge as possible
+            "1.2.777777777777777777",
+            "1.2.888888888888888888.111111111111111.2222222222222.33333333333333333.44444444444444",
+            "1.2." +
+                "1111111111111111111111111111111111111111111111111111111111111." +
+                "2222222222222222222222222222222222222222222222222222222222222222." +
+                "333333333333333333333333333333333333333333333333333333333333333." +
+                "4444444444444444444444444444444444444444444444444444444." +
+                "55555555555555555555555555555555555555555555555555555555555555555555555." +
+                "666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666." +
+                "77777777777777777777777777777777777777777777777777777777777777777777777777." +
+                "8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888." +
+                "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999",
+            "1.2.2147483647.4",
+            "1.2.268435456.4",
         };
 
         for (String s: goodOids) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/util/Oid/S11N.sh	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,164 @@
+#
+# Copyright 2004-2005 Sun Microsystems, Inc.  All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+#
+# @test
+# @bug 4811968
+# @summary Serialization compatibility with old versions
+# @author Weijun Wang
+#
+# set a few environment variables so that the shell-script can run stand-alone
+# in the source directory
+
+if [ "${TESTSRC}" = "" ] ; then
+  TESTSRC="."
+fi
+if [ "${TESTCLASSES}" = "" ] ; then
+  TESTCLASSES="."
+fi
+if [ "${TESTJAVA}" = "" ] ; then
+  echo "TESTJAVA not set.  Test cannot execute."
+  echo "FAILED!!!"
+  exit 1
+fi
+
+# set platform-dependent variables
+PF=""
+
+OS=`uname -s`
+case "$OS" in
+  SunOS )
+    FS="/"
+    ARCH=`isainfo`
+    case "$ARCH" in
+      sparc* )
+        PF="solaris-sparc"
+        ;;
+      i[3-6]86 )
+        PF="solaris-i586"
+        ;;
+      amd64* )
+        PF="solaris-amd64"
+        ;;
+      * )
+        echo "Unsupported System: Solaris ${ARCH}"
+        exit 0;
+        ;;
+    esac
+    ;;
+  Linux )
+    ARCH=`uname -m`
+    FS="/"
+    case "$ARCH" in
+      i[3-6]86 )
+        PF="linux-i586"
+        ;;
+      amd64* )
+        PF="linux-amd64"
+        ;;
+      * )
+        echo "Unsupported System: Linux ${ARCH}"
+        exit 0;
+        ;;
+    esac
+    ;;
+  Windows* )
+    FS="\\"
+    PF="windows-i586"
+
+    # 'uname -m' does not give us enough information -
+    #  should rely on $PROCESSOR_IDENTIFIER (as is done in Defs-windows.gmk),
+    #  but JTREG does not pass this env variable when executing a shell script.
+    #
+    #  execute test program - rely on it to exit if platform unsupported
+
+    ;;
+  * )
+    echo "Unsupported System: ${OS}"
+    exit 0;
+    ;;
+esac
+
+# the test code
+
+${TESTJAVA}${FS}bin${FS}javac -source 1.3 -target 1.3 -d . ${TESTSRC}${FS}SerialTest.java || exit 10
+
+OLDJAVA="
+    /java/re/j2se/1.6.0/latest/binaries/${PF}
+    /java/re/j2se/1.5.0/latest/binaries/${PF}
+    /java/re/j2se/1.4.2/latest/binaries/${PF}
+"
+
+SMALL="
+    0.0
+    1.1
+    2.2
+    1.2.3456
+    1.2.2147483647.4
+    1.2.268435456.4
+"
+
+HUGE="
+    2.16.764.1.3101555394.1.0.100.2.1
+    1.2.2147483648.4
+    2.3.4444444444444444444444
+    1.2.888888888888888888.111111111111111.2222222222222.33333333333333333.44444444444444
+"
+
+for oid in ${SMALL}; do
+    echo ${oid}
+    # new ->
+    ${TESTJAVA}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial || exit 1
+    # -> new
+    ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 2
+    for oldj in ${OLDJAVA}; do
+        if [ -d ${oldj} ]; then
+            echo ${oldj}
+            # -> old
+            ${oldj}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 3
+            # old ->
+            ${oldj}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial.old || exit 4
+            # -> new
+            ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial.old || exit 5
+        fi
+    done
+done
+
+for oid in ${HUGE}; do
+    echo ${oid}
+    # new ->
+    ${TESTJAVA}${FS}bin${FS}java SerialTest out ${oid} > tmp.oid.serial || exit 1
+    # -> new
+    ${TESTJAVA}${FS}bin${FS}java SerialTest in ${oid} < tmp.oid.serial || exit 2
+    for oldj in ${OLDJAVA}; do
+        if [ -d ${oldj} ]; then
+            echo ${oldj}
+            # -> old
+            ${oldj}${FS}bin${FS}java SerialTest badin < tmp.oid.serial || exit 3
+        fi
+    done
+done
+
+rm -f tmp.oid.serial
+rm -f tmp.oid.serial.old
+rm -f SerialTest.class
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/util/Oid/SerialTest.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2004 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * read S11.sh
+ */
+import java.io.*;
+import sun.security.util.*;
+
+/**
+ * Test OID serialization between versions
+ *
+ * java SerialTest out oid  // write a OID into System.out
+ * java SerialTest in oid   // read from System.in and compare it with oid
+ * java SerialTest badin    // make sure *cannot* read from System.in
+ */
+class SerialTest {
+    public static void main(String[] args) throws Exception {
+        if (args[0].equals("out"))
+            out(args[1]);
+        else if (args[0].equals("in"))
+            in(args[1]);
+        else
+            badin();
+    }
+
+    static void in(String oid) throws Exception {
+        ObjectIdentifier o = (ObjectIdentifier) (new ObjectInputStream(System.in).readObject());
+        if (!o.toString().equals(oid))
+            throw new Exception("Read Fail " + o + ", not " + oid);
+    }
+
+    static void badin() throws Exception {
+        boolean pass = true;
+        try {
+            new ObjectInputStream(System.in).readObject();
+        } catch (Exception e) {
+            pass = false;
+        }
+        if (pass) throw new Exception("Should fail but not");
+    }
+
+    static void out(String oid) throws Exception {
+        new ObjectOutputStream(System.out).writeObject(new ObjectIdentifier(oid));
+    }
+}
--- a/jdk/test/tools/launcher/MultipleJRE.sh	Thu Apr 16 11:22:52 2009 -0700
+++ b/jdk/test/tools/launcher/MultipleJRE.sh	Sat Apr 18 14:10:27 2009 -0700
@@ -1,14 +1,14 @@
 # @test MultipleJRE.sh
-# @bug 4811102 4953711 4955505 4956301 4991229 4998210 5018605 6387069
+# @bug 4811102 4953711 4955505 4956301 4991229 4998210 5018605 6387069 6733959
 # @build PrintVersion
 # @build UglyPrintVersion
+# @build ZipMeUp
 # @run shell MultipleJRE.sh
 # @summary Verify Multiple JRE version support
 # @author Joseph E. Kowalski
 
-
 #
-# Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
+# Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 #
 # This code is free software; you can redistribute it and/or modify it
@@ -49,11 +49,26 @@
   exit 1
 fi
 
+JAVAEXE="$TESTJAVA/bin/java"
 JAVA="$TESTJAVA/bin/java -classpath $TESTCLASSES"
 JAR="$TESTJAVA/bin/jar"
 OS=`uname -s`;
 
 #
+# Tests whether we are on windows (true) or not.
+#
+IsWindows() {
+    case "$OS" in
+        Windows* | CYGWIN* )
+            printf "true"
+	;;
+	* )
+            printf "false"
+	;;
+    esac
+}
+
+#
 # Shell routine to test for the proper rejection of syntactically incorrect
 # version specifications.
 #
@@ -139,7 +154,6 @@
 	    $PACKAGE/UglyPrintVersion.class
 }
 
-
 #
 # Constructs a jar file with a fair number of "zip directory" entries and
 # the MANIFEST.MF entry at or near the end of that directory to validate
@@ -262,6 +276,29 @@
 	fi
 }
 
+# Tests very long Main-Class attribute in the jar
+TestLongMainClass() {
+    JVER=$1
+    if [ "$JVER" = "mklink" ]; then
+        JVER=XX
+        JDKXX=jdk/j2re$JVER
+        rm -rf jdk
+        mkdir jdk
+        ln -s $TESTJAVA $JDKXX
+        JAVA_VERSION_PATH="`pwd`/jdk"
+        export JAVA_VERSION_PATH
+    fi
+    $JAVAEXE -cp $TESTCLASSES ZipMeUp UglyBetty.jar 4097 
+    message="`$JAVAEXE -version:$JVER -jar UglyBetty.jar 2>&1`"
+    echo $message | grep "Error: main-class: attribute exceeds system limits" > /dev/null 2>&1
+    if [ $? -ne 0 ]; then
+        printf "Long manifest test did not get expected error"
+        exit 1
+    fi
+    unset JAVA_VERSION_PATH
+    rm -rf jdk
+}
+
 #
 # Main test sequence starts here
 #
@@ -280,14 +317,11 @@
 LaunchVM "" "${RELEASE}"
 CreateJar "" "0"
 LaunchVM "" "${RELEASE}"
-case "$OS" in
-	Windows* | CYGWIN* )
-		MAXIMUM_PATH=255;
-	;;
-	*)
-		MAXIMUM_PATH=1024;
-	;;
-esac
+if [ `IsWindows` = "true" ]; then
+    MAXIMUM_PATH=255;
+else
+    MAXIMUM_PATH=1024;
+fi
 
 PATH_LENGTH=`printf "%s" "$UGLYCLASS" | wc -c`
 if [ ${PATH_LENGTH} -lt ${MAXIMUM_PATH} ]; then
@@ -346,7 +380,6 @@
 	LaunchVM "" "${RELEASE}"
 fi
 
-
 #
 # Throw some syntactically challenged (illegal) version specifiers at
 # the interface.  Failure (of the launcher) is success for the test.
@@ -357,15 +390,28 @@
 TestSyntax "1.2+.3"				# Embedded modifier
 TestSyntax "1.2.4+&1.2*&1++"			# Long and invalid
 
+# On windows we see if there is another jre installed, usually
+# there is, then we test using that, otherwise links are created
+# to get through to SelectVersion.
+if [ `IsWindows` = "false" ]; then
+   TestLongMainClass "mklink"
+else
+    $JAVAEXE -version:1.0+
+    if [ $? -eq 0 ]; then
+        TestLongMainClass "1.0+"
+    else
+        printf  "Warning: TestLongMainClass skipped as there is no"
+	printf  "viable MJRE installed.\n"
+    fi
+fi
+
 #
 # Because scribbling in the registry can be rather destructive, only a
 # subset of the tests are run on Windows.
 #
-case "$OS" in
-	Windows* | CYGWIN* )
-		exit 0;
-	;;
-esac
+if [ `IsWindows` = "true" ]; then
+    exit 0;
+fi
 
 #
 # Additional version specifiers containing spaces.  (Sigh, unable to
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/ZipMeUp.java	Sat Apr 18 14:10:27 2009 -0700
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * A simple class to create our erring Jar with a very long Main-Class
+ * attribute in the manifest.
+ */
+import java.io.ByteArrayOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.zip.CRC32;
+import java.util.zip.CheckedOutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+public class ZipMeUp {
+
+    static final CRC32 crc = new CRC32();
+
+    private static String SOME_KLASS = ".Some";
+
+    static byte[] getManifestAsBytes(int nchars) throws IOException {
+        crc.reset();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        CheckedOutputStream cos = new CheckedOutputStream(baos, crc);
+        PrintStream ps = new PrintStream(cos);
+        ps.println("Manifest-Version: 1.0");
+        ps.print("Main-Class: ");
+        for (int i = 0 ; i < nchars - SOME_KLASS.length() ; i++) {
+            ps.print(i%10);
+        }
+        ps.println(SOME_KLASS);
+        cos.flush();
+        cos.close();
+        ps.close();
+        return baos.toByteArray();
+    }
+
+    /**
+     * The arguments are: filename_to_create length
+     * @param args
+     * @throws java.lang.Exception
+     */
+    public static void main(String...args) throws Exception  {
+        FileOutputStream fos = new FileOutputStream(args[0]);
+        ZipOutputStream zos = new ZipOutputStream(fos);
+        byte[] manifest = getManifestAsBytes(Integer.parseInt(args[1]));
+        ZipEntry ze = new ZipEntry("META-INF/MANIFEST.MF");
+        ze.setMethod(ZipEntry.STORED);
+        ze.setSize(manifest.length);
+        ze.setCompressedSize(manifest.length);
+        ze.setCrc(crc.getValue());
+        ze.setTime(System.currentTimeMillis());
+        zos.putNextEntry(ze);
+        zos.write(manifest);
+        zos.flush();
+
+        // add a zero length class
+        ze = new ZipEntry(SOME_KLASS + ".class");
+        ze.setMethod(ZipEntry.STORED);
+        ze.setSize(0);
+        ze.setCompressedSize(0);
+        ze.setCrc(0);
+        ze.setTime(System.currentTimeMillis());
+        zos.putNextEntry(ze);
+        zos.flush();
+        zos.closeEntry();
+        zos.close();
+        System.exit(0);
+    }
+}