Merge jdk7-b31
authorduke
Wed, 05 Jul 2017 16:39:00 +0200
changeset 817 cd8b8f500fac
parent 816 ef16801b95b1 (diff)
parent 738 7c47c40d4bd5 (current diff)
child 818 86cb4a10400f
child 819 1196fff6b3f6
child 820 23747d00a7cd
child 822 da48912b8dd7
child 823 9a5271881bc0
child 827 eac567273f17
child 835 97ebcc0694cb
child 847 530bfef1ed6f
child 851 9ab23b73f1b9
child 853 ebccb17151f8
child 855 a89e8027a876
child 857 3f759e873b58
child 858 3081a24a8223
child 875 c879050e4c17
child 917 75261da60fff
child 953 202a1f972a92
child 966 9373f9953a5e
Merge
--- a/.hgtags-top-repo	Wed Jul 05 16:38:26 2017 +0200
+++ b/.hgtags-top-repo	Wed Jul 05 16:39:00 2017 +0200
@@ -4,3 +4,4 @@
 11b4dc9f2be3523ef989a0db8459eb56b3045c3a jdk7-b27
 56652b46f328937f6b9b5130f1e4cd80f48868ef jdk7-b28
 31e08f70e88d77c2053f91c21b49a04296bdc59a jdk7-b29
+2dab2f712e1832c92acfa63ec0337048b9422c20 jdk7-b30
--- a/corba/.hgtags	Wed Jul 05 16:38:26 2017 +0200
+++ b/corba/.hgtags	Wed Jul 05 16:39:00 2017 +0200
@@ -4,3 +4,4 @@
 e84e9018bebbf3e5bafc5706e7882a15cb1c7d99 jdk7-b27
 27509b7d21ed783b3f6eb7b7612781c675a30c2f jdk7-b28
 8b71960f79ce0a6fb8ddfeec03f03d400a361747 jdk7-b29
+c0252adbb2abbfdd6c35595429ac6fbdd98e20ac jdk7-b30
--- a/hotspot/.hgignore	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/.hgignore	Wed Jul 05 16:39:00 2017 +0200
@@ -2,3 +2,6 @@
 ^dist/
 ^nbproject/private/
 ^src/share/tools/hsdis/bin/
+^src/share/tools/IdealGraphVisualizer/[a-zA-Z0-9]*/build/
+^src/share/tools/IdealGraphVisualizer/build/
+^src/share/tools/IdealGraphVisualizer/dist/
--- a/hotspot/.hgtags	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/.hgtags	Wed Jul 05 16:39:00 2017 +0200
@@ -4,3 +4,4 @@
 e3d2692f8442e2d951166dc9bd9a330684754438 jdk7-b27
 c14dab40ed9bf45ad21150bd70c9c80cdf655415 jdk7-b28
 4f91c08b3e4498213a9c5a24898f7d9c38cf86fb jdk7-b29
+d1605aabd0a15ecf93787c47de63073c33fba52d jdk7-b30
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java	Wed Jul 05 16:39:00 2017 +0200
@@ -316,6 +316,14 @@
     iterateLiveRegions(liveRegions, visitor, null);
   }
 
+  public boolean isValidMethod(OopHandle handle) {
+    OopHandle klass = Oop.getKlassForOopHandle(handle);
+    if (klass != null && klass.equals(methodKlassHandle)) {
+      return true;
+    }
+    return false;
+  }
+
   // Creates an instance from the Oop hierarchy based based on the handle
   public Oop newOop(OopHandle handle) {
     // The only known way to detect the right type of an oop is
@@ -375,8 +383,10 @@
       }
     }
 
-    System.err.println("Unknown oop at " + handle);
-    System.err.println("Oop's klass is " + klass);
+    if (DEBUG) {
+      System.err.println("Unknown oop at " + handle);
+      System.err.println("Oop's klass is " + klass);
+    }
 
     throw new UnknownOopException();
   }
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java	Wed Jul 05 16:39:00 2017 +0200
@@ -215,11 +215,11 @@
     if (f == null) return null;
     boolean imprecise = true;
     if (f.isInterpretedFrame() && !f.isInterpretedFrameValid()) {
-      if (DEBUG) {
-        System.out.println("Correcting for invalid interpreter frame");
-      }
-      f = f.sender(regMap);
-      imprecise = false;
+       if (DEBUG) {
+         System.out.println("Correcting for invalid interpreter frame");
+       }
+       f = f.sender(regMap);
+       imprecise = false;
     }
     VFrame vf = VFrame.newVFrame(f, regMap, this, true, imprecise);
     if (vf == null) {
@@ -228,10 +228,7 @@
       }
       return null;
     }
-    if (vf.isJavaFrame()) {
-      return (JavaVFrame) vf;
-    }
-    return (JavaVFrame) vf.javaSender();
+    return vf.isJavaFrame() ? (JavaVFrame)vf : vf.javaSender();
   }
 
   /** In this system, a JavaThread is the top-level factory for a
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java	Wed Jul 05 16:39:00 2017 +0200
@@ -121,6 +121,13 @@
   }
 
   public Frame getCurrentFrameGuess(JavaThread thread, Address addr) {
+
+    // If java stack is walkable then both last_Java_sp and last_Java_pc are
+    // non null and we can start stack walk from this frame.
+    if (thread.getLastJavaSP() != null && thread.getLastJavaPC() != null) {
+      return new SPARCFrame(SPARCFrame.biasSP(thread.getLastJavaSP()), thread.getLastJavaPC());
+    }
+
     ThreadProxy t = getThreadProxy(addr);
     SPARCThreadContext context = (SPARCThreadContext) t.getContext();
     // For now, let's see what happens if we do a similar thing to
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java	Wed Jul 05 16:39:00 2017 +0200
@@ -422,6 +422,13 @@
     if (getFP().addOffsetTo(INTERPRETER_FRAME_VM_LOCAL_WORDS * VM.getVM().getAddressSize()).lessThan(getSP())) {
       return false;
     }
+
+    OopHandle methodHandle = addressOfInterpreterFrameMethod().getOopHandleAt(0);
+
+    if (VM.getVM().getObjectHeap().isValidMethod(methodHandle) == false) {
+      return false;
+    }
+
     // These are hacks to keep us out of trouble.
     // The problem with these is that they mask other problems
     if (getFP().lessThanOrEqual(getSP())) {        // this attempts to deal with unsigned comparison above
@@ -433,9 +440,18 @@
     // FIXME: this is not atomic with respect to GC and is unsuitable
     // for use in a non-debugging, or reflective, system. Need to
     // figure out how to express this.
-    if (addressOfInterpreterFrameBCX().getAddressAt(0) == null) {
-      return false; // BCP not yet set up
+    Address bcx =  addressOfInterpreterFrameBCX().getAddressAt(0);
+
+    Method method;
+    try {
+       method = (Method) VM.getVM().getObjectHeap().newOop(methodHandle);
+    } catch (UnknownOopException ex) {
+       return false;
     }
+    int  bci = bcpToBci(bcx, method);
+    //validate bci
+    if (bci < 0) return false;
+
     return true;
   }
 
@@ -471,7 +487,7 @@
     // will update it accordingly
     map.setIncludeArgumentOops(false);
 
-    if (cb == null && isEntryFrame()) {
+    if (isEntryFrame()) {
       return senderForEntryFrame(map);
     }
 
@@ -539,7 +555,6 @@
         int SP_OFFSET_IN_GREGSET = 17;
         raw_sp = fp.getAddressAt(VM.getVM().getAddressSize() * SP_OFFSET_IN_GREGSET);
         Address pc = fp.getAddressAt(VM.getVM().getAddressSize() * PC_OFFSET_IN_GREGSET);
-        // System.out.println("  next frame's SP: " + sp + " PC: " + pc);
         return new SPARCFrame(raw_sp, pc);
       }
     }
@@ -562,10 +577,8 @@
       // sender's _interpreter_sp_adjustment field.
       if (VM.getVM().getInterpreter().contains(pc)) {
         isInterpreted = true;
-        if (VM.getVM().isClientCompiler()) {
-          map.makeIntegerRegsUnsaved();
-          map.shiftWindow(sp, youngerSP);
-        }
+        map.makeIntegerRegsUnsaved();
+        map.shiftWindow(sp, youngerSP);
       } else {
         // Find a CodeBlob containing this frame's pc or elide the lookup and use the
         // supplied blob which is already known to be associated with this frame.
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java	Wed Jul 05 16:39:00 2017 +0200
@@ -87,12 +87,13 @@
                while (f != null) {
                   ClosestSymbol sym = f.closestSymbolToPC();
                   Address pc = f.pc();
+                  out.print(pc + "\t");
                   if (sym != null) {
                      String name = sym.getName();
                      if (cdbgCanDemangle) {
                         name = cdbg.demangle(name);
                      }
-                     out.print(pc + "\t" + name);
+                     out.print(name);
                      long diff = sym.getOffset();
                      if (diff != 0L) {
                         out.print(" + 0x" + Long.toHexString(diff));
@@ -120,7 +121,6 @@
                            // look for known code blobs
                            CodeCache c = VM.getVM().getCodeCache();
                            if (c.contains(pc)) {
-                              out.print(pc + "\t");
                               CodeBlob cb = c.findBlobUnsafe(pc);
                               if (cb.isNMethod()) {
                                  names = getJavaNames(th, f.localVariableBase());
@@ -144,18 +144,18 @@
                                  out.println("<Unknown code blob>");
                               }
                            } else {
-                              printUnknown(out,pc);
+                              printUnknown(out);
                            }
                         }
                         // print java frames, if any
                         if (names != null && names.length != 0) {
                            // print java frame(s)
                            for (int i = 0; i < names.length; i++) {
-                               out.println(pc + "\t" + names[i]);
+                               out.println(names[i]);
                            }
                         }
                      } else {
-                        printUnknown(out,pc);
+                        printUnknown(out);
                      }
                   }
                   f = f.sender();
@@ -220,8 +220,8 @@
       }
    }
 
-   private void printUnknown(PrintStream out, Address pc) {
-      out.println(pc + "\t????????");
+   private void printUnknown(PrintStream out) {
+      out.println("\t????????");
    }
 
    private String[] getJavaNames(ThreadProxy th, Address fp) {
--- a/hotspot/make/defs.make	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/defs.make	Wed Jul 05 16:39:00 2017 +0200
@@ -228,6 +228,7 @@
 
 # Required make macro settings for all platforms
 MAKE_ARGS += JAVA_HOME=$(ABS_BOOTDIR)
+MAKE_ARGS += OUTPUTDIR=$(ABS_OUTPUTDIR)
 MAKE_ARGS += GAMMADIR=$(ABS_GAMMADIR)
 MAKE_ARGS += MAKE_VERBOSE=$(MAKE_VERBOSE)
 MAKE_ARGS += HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION)
--- a/hotspot/make/hotspot_version	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/hotspot_version	Wed Jul 05 16:39:00 2017 +0200
@@ -33,9 +33,9 @@
 # Don't put quotes (fail windows build).
 HOTSPOT_VM_COPYRIGHT=Copyright 2008
 
-HS_MAJOR_VER=13
+HS_MAJOR_VER=14
 HS_MINOR_VER=0
-HS_BUILD_NUMBER=02
+HS_BUILD_NUMBER=01
 
 JDK_MAJOR_VER=1
 JDK_MINOR_VER=7
Binary file hotspot/make/linux/Queens.class has changed
--- a/hotspot/make/linux/makefiles/buildtree.make	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/linux/makefiles/buildtree.make	Wed Jul 05 16:39:00 2017 +0200
@@ -328,18 +328,19 @@
 WRONG_DATA_MODE_MSG = \
 	echo "JAVA_HOME must point to $(DATA_MODE)bit JDK."
 
-test_gamma:  $(BUILDTREE_MAKE)
+test_gamma:  $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java
 	@echo Creating $@ ...
 	$(QUIETLY) ( \
 	echo '#!/bin/sh'; \
 	$(BUILDTREE_COMMENT); \
 	echo '. ./env.sh'; \
 	echo "if [ -z \$$JAVA_HOME ]; then { $(NO_JAVA_HOME_MSG); exit 0; }; fi"; \
-	echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>1 > /dev/null"; \
+	echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>&1 > /dev/null"; \
 	echo "then"; \
 	echo "  $(WRONG_DATA_MODE_MSG); exit 0;"; \
 	echo "fi"; \
-	echo 'CLASSPATH="$(GAMMADIR)/make/$(OS_FAMILY):$$CLASSPATH"'; \
+	echo "rm -f Queens.class"; \
+	echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \
 	echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \
 	echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \
 	) > $@
--- a/hotspot/make/linux/makefiles/gcc.make	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/linux/makefiles/gcc.make	Wed Jul 05 16:39:00 2017 +0200
@@ -50,14 +50,7 @@
 
 VM_PICFLAG/LIBJVM = $(PICFLAG)
 VM_PICFLAG/AOUT   =
-
-ifneq ($(BUILDARCH), i486)
 VM_PICFLAG        = $(VM_PICFLAG/$(LINK_INTO))
-else
-# PIC has significant overhead on x86, build nonpic VM for now.
-# Link JVM at a "good" base location to avoid unnecessary .text patching.
-JVM_BASE_ADDR     = 0x06000000
-endif
 
 CFLAGS += $(VM_PICFLAG)
 CFLAGS += -fno-rtti
@@ -91,8 +84,17 @@
 
 # Compiler warnings are treated as errors
 WARNINGS_ARE_ERRORS = -Werror
+
 # Except for a few acceptable ones
+# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
+# conversions which might affect the values. To avoid that, we need to turn
+# it off explicitly. 
+ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
+ACCEPTABLE_WARNINGS = -Wpointer-arith -Wsign-compare
+else
 ACCEPTABLE_WARNINGS = -Wpointer-arith -Wconversion -Wsign-compare
+endif
+
 CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(ACCEPTABLE_WARNINGS)
 # Special cases
 CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@)) 
--- a/hotspot/make/linux/makefiles/mapfile-vers-debug	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/linux/makefiles/mapfile-vers-debug	Wed Jul 05 16:39:00 2017 +0200
@@ -89,6 +89,7 @@
                 JVM_FillInStackTrace;
                 JVM_FindClassFromClass;
                 JVM_FindClassFromClassLoader;
+                JVM_FindClassFromBootLoader;
                 JVM_FindLibraryEntry;
                 JVM_FindLoadedClass;
                 JVM_FindPrimitiveClass;
--- a/hotspot/make/linux/makefiles/mapfile-vers-product	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/linux/makefiles/mapfile-vers-product	Wed Jul 05 16:39:00 2017 +0200
@@ -89,6 +89,7 @@
                 JVM_FillInStackTrace;
                 JVM_FindClassFromClass;
                 JVM_FindClassFromClassLoader;
+                JVM_FindClassFromBootLoader;
                 JVM_FindLibraryEntry;
                 JVM_FindLoadedClass;
                 JVM_FindPrimitiveClass;
--- a/hotspot/make/linux/makefiles/rules.make	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/linux/makefiles/rules.make	Wed Jul 05 16:39:00 2017 +0200
@@ -133,10 +133,25 @@
 COMPILE_DONE    = && { echo Done with $<; }
 endif
 
+# Include $(NONPIC_OBJ_FILES) definition
+ifndef LP64
+include $(GAMMADIR)/make/pic.make
+endif
+
+# The non-PIC object files are only generated for 32 bit platforms.
+ifdef LP64
 %.o: %.cpp
 	@echo Compiling $<
 	$(QUIETLY) $(REMOVE_TARGET)
 	$(QUIETLY) $(COMPILE.CC) -o $@ $< $(COMPILE_DONE)
+else
+%.o: %.cpp
+	@echo Compiling $<
+	$(QUIETLY) $(REMOVE_TARGET)
+	$(QUIETLY) $(if $(findstring $@, $(NONPIC_OBJ_FILES)), \
+	   $(subst $(VM_PICFLAG), ,$(COMPILE.CC)) -o $@ $< $(COMPILE_DONE), \
+	   $(COMPILE.CC) -o $@ $< $(COMPILE_DONE))
+endif
 
 %.o: %.s
 	@echo Assembling $<
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/make/pic.make	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,41 @@
+#
+# Copyright 2006-2007 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 list of object files built without the platform specific PIC flags, e.g.
+# -fPIC on linux. Performance measurements show that by compiling GC related 
+# code, we could significantly reduce the GC pause time on 32 bit Linux/Unix
+# platforms. See 6454213 for more details.
+include $(GAMMADIR)/make/scm.make
+
+ifneq ($(OSNAME), windows)
+  ifndef LP64
+    NONPIC_DIRS  = memory oops gc_implementation gc_interface 
+    NONPIC_DIRS  := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
+    # Look for source files under NONPIC_DIRS
+    NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\
+                      $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \
+		      -name '*.cpp' -print))
+    NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES)))
+  endif
+endif
Binary file hotspot/make/solaris/Queens.class has changed
--- a/hotspot/make/solaris/makefiles/buildtree.make	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/buildtree.make	Wed Jul 05 16:39:00 2017 +0200
@@ -340,7 +340,7 @@
 WRONG_DATA_MODE_MSG = \
 	echo "JAVA_HOME must point to $(DATA_MODE)bit JDK."
 
-test_gamma:  $(BUILDTREE_MAKE)
+test_gamma:  $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java
 	@echo Creating $@ ...
 	$(QUIETLY) ( \
 	echo '#!/bin/ksh'; \
@@ -351,7 +351,8 @@
 	echo "then"; \
 	echo "  $(WRONG_DATA_MODE_MSG); exit 0;"; \
 	echo "fi"; \
-	echo 'CLASSPATH="$(GAMMADIR)/make/$(OS_FAMILY):$$CLASSPATH"'; \
+	echo "rm -f Queens.class"; \
+	echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \
 	echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \
 	echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \
 	) > $@
--- a/hotspot/make/solaris/makefiles/jvmg.make	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/jvmg.make	Wed Jul 05 16:39:00 2017 +0200
@@ -30,7 +30,7 @@
 
 ifeq ("${Platform_compiler}", "sparcWorks")
 
-ifeq ($(COMPILER_REV),5.8))
+ifeq ($(COMPILER_REV),5.8)
   # SS11 SEGV when compiling with -g and -xarch=v8, using different backend
   DEBUG_CFLAGS/compileBroker.o = $(DEBUG_CFLAGS) -xO0
   DEBUG_CFLAGS/jvmtiTagMap.o   = $(DEBUG_CFLAGS) -xO0
--- a/hotspot/make/solaris/makefiles/mapfile-vers	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/mapfile-vers	Wed Jul 05 16:39:00 2017 +0200
@@ -89,6 +89,7 @@
 		JVM_FillInStackTrace;
 		JVM_FindClassFromClass;
 		JVM_FindClassFromClassLoader;
+		JVM_FindClassFromBootLoader;
 		JVM_FindLibraryEntry;
 		JVM_FindLoadedClass;
 		JVM_FindPrimitiveClass;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER1_i486	Wed Jul 05 16:39:00 2017 +0200
@@ -2175,6 +2175,7 @@
 text: .text%jni_GetStringUTFRegion: jni.o;
 text: .text%__1cQjava_lang_StringOas_utf8_string6FpnHoopDesc_ii_pc_;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%JVM_IsInterface;
 text: .text%JVM_GetClassDeclaredConstructors;
 text: .text%__1cNmethodOopDescOis_initializer6kM_i_;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc	Wed Jul 05 16:39:00 2017 +0200
@@ -1500,6 +1500,7 @@
 text: .text%jni_GetStringUTFRegion: jni.o;
 text: .text%__1cQjava_lang_StringOas_utf8_string6FpnHoopDesc_ii_pc_;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%JVM_IsInterface;
 text: .text%JVM_GetClassDeclaredConstructors;
 text: .text%__1cNmethodOopDescOis_initializer6kM_i_;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64	Wed Jul 05 16:39:00 2017 +0200
@@ -4339,6 +4339,7 @@
 text: .text%__1cFParseLarray_store6MnJBasicType__v_;
 text: .text%__1cOmangle_name_on6FpnMoutputStream_pnNsymbolOopDesc_ii_v_: nativeLookup.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cZCallInterpreterDirectNodeSalignment_required6kM_i_;
 text: .text%__1cZCallInterpreterDirectNodePoper_input_base6kM_I_;
 text: .text%__1cZCallInterpreterDirectNodeEemit6kMrnKCodeBuffer_pnNPhaseRegAlloc__v_;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_i486	Wed Jul 05 16:39:00 2017 +0200
@@ -4755,6 +4755,7 @@
 text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_;
 text: .text%__1cNTemplateTableDdef6FnJBytecodesECode_inITosState_3pFi_vi_v_;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cPshrI_eReg_1NodeEsize6kMpnNPhaseRegAlloc__I_;
 text: .text%__1cHi2bNodeMideal_Opcode6kM_i_: ad_i486_misc.o;
 text: .text%__1cMmatch_option6FpknMJavaVMOption_pkcp4_i_: arguments.o;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc	Wed Jul 05 16:39:00 2017 +0200
@@ -3713,6 +3713,7 @@
 text: .text%__1cITemplateIgenerate6MpnZInterpreterMacroAssembler__v_;
 text: .text%__1cQregI_to_stkINodeHis_Copy6kM_I_: ad_sparc_misc.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%signalHandler;
 text: .text%__1cTtypeArrayKlassKlassIoop_size6kMpnHoopDesc__i_: typeArrayKlassKlass.o;
 text: .text%JVM_handle_solaris_signal;
--- a/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9	Wed Jul 05 16:39:00 2017 +0200
@@ -3735,6 +3735,7 @@
 text: .text%__1cQjava_lang_ThreadRget_thread_status6FpnHoopDesc__n0AMThreadStatus__;
 text: .text%__1cIMulINodeGadd_id6kM_pknEType__: classes.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cHTypePtrFempty6kM_i_;
 text: .text%__1cQaddP_reg_regNodeEsize6kMpnNPhaseRegAlloc__I_;
 text: .text%__1cbFunnecessary_membar_volatileNodePoper_input_base6kM_I_: ad_sparc_misc.o;
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_amd64	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_amd64	Wed Jul 05 16:39:00 2017 +0200
@@ -4339,6 +4339,7 @@
 text: .text%__1cFParseLarray_store6MnJBasicType__v_;
 text: .text%__1cOmangle_name_on6FpnMoutputStream_pnNsymbolOopDesc_ii_v_: nativeLookup.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cZCallInterpreterDirectNodeSalignment_required6kM_i_;
 text: .text%__1cZCallInterpreterDirectNodePoper_input_base6kM_I_;
 text: .text%__1cZCallInterpreterDirectNodeEemit6kMrnKCodeBuffer_pnNPhaseRegAlloc__v_;
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_i486	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_i486	Wed Jul 05 16:39:00 2017 +0200
@@ -4755,6 +4755,7 @@
 text: .text%__1cITemplateKinitialize6MinITosState_1pFi_vi_v_;
 text: .text%__1cNTemplateTableDdef6FnJBytecodesECode_inITosState_3pFi_vi_v_;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%__1cPshrI_eReg_1NodeEsize6kMpnNPhaseRegAlloc__I_;
 text: .text%__1cHi2bNodeMideal_Opcode6kM_i_: ad_i486_misc.o;
 text: .text%__1cMmatch_option6FpknMJavaVMOption_pkcp4_i_: arguments.o;
--- a/hotspot/make/solaris/makefiles/reorder_TIERED_sparc	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/reorder_TIERED_sparc	Wed Jul 05 16:39:00 2017 +0200
@@ -3713,6 +3713,7 @@
 text: .text%__1cITemplateIgenerate6MpnZInterpreterMacroAssembler__v_;
 text: .text%__1cQregI_to_stkINodeHis_Copy6kM_I_: ad_sparc_misc.o;
 text: .text%JVM_FindClassFromClassLoader;
+text: .text%JVM_FindClassFromBootLoader;
 text: .text%signalHandler;
 text: .text%__1cTtypeArrayKlassKlassIoop_size6kMpnHoopDesc__i_: typeArrayKlassKlass.o;
 text: .text%JVM_handle_solaris_signal;
--- a/hotspot/make/solaris/makefiles/rules.make	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/solaris/makefiles/rules.make	Wed Jul 05 16:39:00 2017 +0200
@@ -133,19 +133,10 @@
 COMPILE_DONE    = && { echo Done with $<; }
 endif
 
-# A list of directories under which all source code are built without -KPIC/-Kpic
-# flag. Performance measurements show that compiling GC related code will
-# dramatically reduce the gc pause time. See bug 6454213 for more details.
-
-include $(GAMMADIR)/make/scm.make
-
-NONPIC_DIRS  = memory oops gc_implementation gc_interface 
-NONPIC_DIRS  := $(foreach dir,$(NONPIC_DIRS), $(GAMMADIR)/src/share/vm/$(dir))
-# Look for source code under NONPIC_DIRS
-NONPIC_FILES := $(foreach dir,$(NONPIC_DIRS),\
-                 $(shell find $(dir) \( $(SCM_DIRS) \) -prune -o \
-		  -name '*.cpp' -print))
-NONPIC_OBJ_FILES := $(notdir $(subst .cpp,.o,$(NONPIC_FILES)))
+# Include NONPIC_OBJ_FILES definition
+ifndef LP64
+include $(GAMMADIR)/make/pic.make
+endif
 
 # Sun compiler for 64 bit Solaris does not support building non-PIC object files.
 ifdef LP64
--- a/hotspot/make/windows/makefiles/vm.make	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/make/windows/makefiles/vm.make	Wed Jul 05 16:39:00 2017 +0200
@@ -88,13 +88,20 @@
 !endif
 !endif
 
-LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000  \
-  /export:JNI_GetDefaultJavaVMInitArgs /export:JNI_CreateJavaVM    \
-  /export:JNI_GetCreatedJavaVMs /export:jio_snprintf               \
-  /export:jio_printf /export:jio_fprintf                           \
-  /export:jio_vfprintf /export:jio_vsnprintf $(AGCT_EXPORT)        \
-  /export:JVM_GetVersionInfo \
-  /export:JVM_GetThreadStateNames /export:JVM_GetThreadStateValues \
+LINK_FLAGS=$(LINK_FLAGS) $(STACK_SIZE) /subsystem:windows /dll /base:0x8000000 \
+  /export:JNI_GetDefaultJavaVMInitArgs       \
+  /export:JNI_CreateJavaVM                   \
+  /export:JVM_FindClassFromBootLoader        \
+  /export:JNI_GetCreatedJavaVMs              \
+  /export:jio_snprintf                       \
+  /export:jio_printf                         \
+  /export:jio_fprintf                        \
+  /export:jio_vfprintf                       \
+  /export:jio_vsnprintf                      \
+  $(AGCT_EXPORT)                             \
+  /export:JVM_GetVersionInfo                 \
+  /export:JVM_GetThreadStateNames            \
+  /export:JVM_GetThreadStateValues           \
   /export:JVM_InitAgentProperties
 
 CPP_INCLUDE_DIRS=\
--- a/hotspot/src/cpu/sparc/vm/sparc.ad	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad	Wed Jul 05 16:39:00 2017 +0200
@@ -5955,7 +5955,7 @@
 
 // Convert oop pointer into compressed form
 instruct encodeHeapOop(iRegN dst, iRegP src) %{
-  predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull);
+  predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
   match(Set dst (EncodeP src));
   format %{ "encode_heap_oop $src, $dst" %}
   ins_encode %{
@@ -5965,7 +5965,7 @@
 %}
 
 instruct encodeHeapOop_not_null(iRegN dst, iRegP src) %{
-  predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull);
+  predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
   match(Set dst (EncodeP src));
   format %{ "encode_heap_oop_not_null $src, $dst" %}
   ins_encode %{
--- a/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -307,6 +307,10 @@
       // Use it on new AMD cpus starting from Opteron.
       UseAddressNop = true;
     }
+    if( supports_sse2() && FLAG_IS_DEFAULT(UseNewLongLShift) ) {
+      // Use it on new AMD cpus starting from Opteron.
+      UseNewLongLShift = true;
+    }
     if( FLAG_IS_DEFAULT(UseXmmLoadAndClearUpper) ) {
       if( supports_sse4a() ) {
         UseXmmLoadAndClearUpper = true; // use movsd only on '10h' Opteron
--- a/hotspot/src/cpu/x86/vm/x86_32.ad	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad	Wed Jul 05 16:39:00 2017 +0200
@@ -4754,6 +4754,33 @@
   interface(CONST_INTER);
 %}
 
+operand immI_1() %{
+  predicate( n->get_int() == 1 );
+  match(ConI);
+
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+operand immI_2() %{
+  predicate( n->get_int() == 2 );
+  match(ConI);
+
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
+operand immI_3() %{
+  predicate( n->get_int() == 3 );
+  match(ConI);
+
+  op_cost(0);
+  format %{ %}
+  interface(CONST_INTER);
+%}
+
 // Pointer Immediate
 operand immP() %{
   match(ConP);
@@ -8943,6 +8970,63 @@
   ins_pipe( ialu_reg_long_mem );
 %}
 
+// Shift Left Long by 1
+instruct shlL_eReg_1(eRegL dst, immI_1 cnt, eFlagsReg cr) %{
+  predicate(UseNewLongLShift);
+  match(Set dst (LShiftL dst cnt));
+  effect(KILL cr);
+  ins_cost(100);
+  format %{ "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi" %}
+  ins_encode %{
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+  %}
+  ins_pipe( ialu_reg_long );
+%}
+
+// Shift Left Long by 2
+instruct shlL_eReg_2(eRegL dst, immI_2 cnt, eFlagsReg cr) %{
+  predicate(UseNewLongLShift);
+  match(Set dst (LShiftL dst cnt));
+  effect(KILL cr);
+  ins_cost(100);
+  format %{ "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi\n\t" 
+            "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi" %}
+  ins_encode %{
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+  %}
+  ins_pipe( ialu_reg_long );
+%}
+
+// Shift Left Long by 3
+instruct shlL_eReg_3(eRegL dst, immI_3 cnt, eFlagsReg cr) %{
+  predicate(UseNewLongLShift);
+  match(Set dst (LShiftL dst cnt));
+  effect(KILL cr);
+  ins_cost(100);
+  format %{ "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi\n\t" 
+            "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi\n\t" 
+            "ADD    $dst.lo,$dst.lo\n\t"
+            "ADC    $dst.hi,$dst.hi" %}
+  ins_encode %{
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+    __ addl($dst$$Register,$dst$$Register);
+    __ adcl(HIGH_FROM_LOW($dst$$Register),HIGH_FROM_LOW($dst$$Register));
+  %}
+  ins_pipe( ialu_reg_long );
+%}
+
 // Shift Left Long by 1-31
 instruct shlL_eReg_1_31(eRegL dst, immI_1_31 cnt, eFlagsReg cr) %{
   match(Set dst (LShiftL dst cnt));
--- a/hotspot/src/cpu/x86/vm/x86_64.ad	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad	Wed Jul 05 16:39:00 2017 +0200
@@ -7060,7 +7060,7 @@
 
 // Convert oop pointer into compressed form
 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
-  predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() != TypePtr::NotNull);
+  predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
   match(Set dst (EncodeP src));
   effect(KILL cr);
   format %{ "encode_heap_oop $dst,$src" %}
@@ -7076,7 +7076,7 @@
 %}
 
 instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
-  predicate(n->bottom_type()->is_narrowoop()->make_oopptr()->ptr() == TypePtr::NotNull);
+  predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
   match(Set dst (EncodeP src));
   effect(KILL cr);
   format %{ "encode_heap_oop_not_null $dst,$src" %}
--- a/hotspot/src/os/linux/vm/hpi_linux.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/os/linux/vm/hpi_linux.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -70,6 +70,10 @@
   RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, (unsigned int) flags));
 }
 
+inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+  return send(fd, buf, nBytes, flags);
+}
+
 inline int hpi::timeout(int fd, long timeout) {
   julong prevtime,newtime;
   struct timeval t;
--- a/hotspot/src/os/linux/vm/jvm_linux.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/os/linux/vm/jvm_linux.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -132,7 +132,7 @@
 */
 
 struct siglabel {
-  char *name;
+  const char *name;
   int   number;
 };
 
--- a/hotspot/src/os/linux/vm/os_linux.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/os/linux/vm/os_linux.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -75,8 +75,8 @@
 bool os::Linux::_is_floating_stack = false;
 bool os::Linux::_is_NPTL = false;
 bool os::Linux::_supports_fast_thread_cpu_time = false;
-char * os::Linux::_glibc_version = NULL;
-char * os::Linux::_libpthread_version = NULL;
+const char * os::Linux::_glibc_version = NULL;
+const char * os::Linux::_libpthread_version = NULL;
 
 static jlong initial_time_count=0;
 
@@ -213,9 +213,9 @@
 // the system call returns 1.  This causes the VM to act as if it is
 // a single processor and elide locking (see is_MP() call).
 static bool unsafe_chroot_detected = false;
-static char *unstable_chroot_error = "/proc file system not found.\n"
-              "Java may be unstable running multithreaded in a chroot "
-              "environment on Linux when /proc filesystem is not mounted.";
+static const char *unstable_chroot_error = "/proc file system not found.\n"
+                     "Java may be unstable running multithreaded in a chroot "
+                     "environment on Linux when /proc filesystem is not mounted.";
 
 void os::Linux::initialize_system_info() {
   _processor_count = sysconf(_SC_NPROCESSORS_CONF);
@@ -544,26 +544,23 @@
   if (n > 0) {
      char *str = (char *)malloc(n);
      confstr(_CS_GNU_LIBPTHREAD_VERSION, str, n);
-
      // Vanilla RH-9 (glibc 2.3.2) has a bug that confstr() always tells
      // us "NPTL-0.29" even we are running with LinuxThreads. Check if this
-     // is the case:
+     // is the case. LinuxThreads has a hard limit on max number of threads.
+     // So sysconf(_SC_THREAD_THREADS_MAX) will return a positive value.
+     // On the other hand, NPTL does not have such a limit, sysconf()
+     // will return -1 and errno is not changed. Check if it is really NPTL.
      if (strcmp(os::Linux::glibc_version(), "glibc 2.3.2") == 0 &&
-         strstr(str, "NPTL")) {
-        // LinuxThreads has a hard limit on max number of threads. So
-        // sysconf(_SC_THREAD_THREADS_MAX) will return a positive value.
-        // On the other hand, NPTL does not have such a limit, sysconf()
-        // will return -1 and errno is not changed. Check if it is really
-        // NPTL:
-        if (sysconf(_SC_THREAD_THREADS_MAX) > 0) {
-           free(str);
-           str = "linuxthreads";
-        }
+         strstr(str, "NPTL") &&
+         sysconf(_SC_THREAD_THREADS_MAX) > 0) {
+       free(str);
+       os::Linux::set_libpthread_version("linuxthreads");
+     } else {
+       os::Linux::set_libpthread_version(str);
      }
-     os::Linux::set_libpthread_version(str);
   } else {
-     // glibc before 2.3.2 only has LinuxThreads.
-     os::Linux::set_libpthread_version("linuxthreads");
+    // glibc before 2.3.2 only has LinuxThreads.
+    os::Linux::set_libpthread_version("linuxthreads");
   }
 
   if (strstr(libpthread_version(), "NPTL")) {
@@ -4632,11 +4629,7 @@
 // Unlike system(), this function can be called from signal handler. It
 // doesn't block SIGINT et al.
 int os::fork_and_exec(char* cmd) {
-  char * argv[4];
-  argv[0] = "sh";
-  argv[1] = "-c";
-  argv[2] = cmd;
-  argv[3] = NULL;
+  const char * argv[4] = {"sh", "-c", cmd, NULL};
 
   // fork() in LinuxThreads/NPTL is not async-safe. It needs to run
   // pthread_atfork handlers and reset pthread library. All we need is a
@@ -4661,7 +4654,7 @@
     // IA64 should use normal execve() from glibc to match the glibc fork()
     // above.
     NOT_IA64(syscall(__NR_execve, "/bin/sh", argv, environ);)
-    IA64_ONLY(execve("/bin/sh", argv, environ);)
+    IA64_ONLY(execve("/bin/sh", (char* const*)argv, environ);)
 
     // execve failed
     _exit(-1);
--- a/hotspot/src/os/linux/vm/os_linux.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/os/linux/vm/os_linux.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -52,8 +52,8 @@
   static address   _initial_thread_stack_bottom;
   static uintptr_t _initial_thread_stack_size;
 
-  static char *_glibc_version;
-  static char *_libpthread_version;
+  static const char *_glibc_version;
+  static const char *_libpthread_version;
 
   static bool _is_floating_stack;
   static bool _is_NPTL;
@@ -72,8 +72,8 @@
   static julong physical_memory() { return _physical_memory; }
   static void initialize_system_info();
 
-  static void set_glibc_version(char *s)      { _glibc_version = s; }
-  static void set_libpthread_version(char *s) { _libpthread_version = s; }
+  static void set_glibc_version(const char *s)      { _glibc_version = s; }
+  static void set_libpthread_version(const char *s) { _libpthread_version = s; }
 
   static bool supports_variable_stack_size();
 
@@ -134,8 +134,8 @@
   static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
 
   // GNU libc and libpthread version strings
-  static char *glibc_version()                { return _glibc_version; }
-  static char *libpthread_version()           { return _libpthread_version; }
+  static const char *glibc_version()          { return _glibc_version; }
+  static const char *libpthread_version()     { return _libpthread_version; }
 
   // NPTL or LinuxThreads?
   static bool is_LinuxThreads()               { return !_is_NPTL; }
--- a/hotspot/src/os/solaris/vm/hpi_solaris.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/os/solaris/vm/hpi_solaris.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -71,6 +71,10 @@
   INTERRUPTIBLE_RETURN_INT(::send(fd, buf, nBytes, flags), os::Solaris::clear_interrupted);
 }
 
+inline int    hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+  RESTARTABLE_RETURN_INT(::send(fd, buf, nBytes, flags));
+}
+
 // As both poll and select can be interrupted by signals, we have to be
 // prepared to restart the system call after updating the timeout, unless
 // a poll() is done with timeout == -1, in which case we repeat with this
--- a/hotspot/src/os/windows/vm/hpi_windows.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/os/windows/vm/hpi_windows.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -102,6 +102,10 @@
          fd, buf, nBytes, flags),
         (fd, buf, nBytes, flags));
 
+inline int hpi::raw_send(int fd, char *buf, int nBytes, int flags) {
+  return send(fd, buf, nBytes, flags);
+}
+
 HPIDECL(timeout, "timeout", _socket, Timeout, int, "%d",
         (int fd, long timeout),
         ("fd = %d, timeout = %ld", fd, timeout),
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.svg" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.svg.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.svg
+OpenIDE-Module-Layer: com/sun/hotspot/igv/svg/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/svg/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.svg-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=ebcf0422
+build.xml.script.CRC32=d7a2678d
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=ebcf0422
+nbproject/build-impl.xml.script.CRC32=57997f94
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.svg</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages>
+                <package>com.sun.hotspot.igv.svg</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.svg;
+
+import java.awt.Graphics2D;
+import java.io.Writer;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import org.w3c.dom.DOMImplementation;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BatikSVG {
+
+    private static Constructor SVGGraphics2DConstructor;
+    private static Method Method_stream;
+    private static Method Method_createDefault;
+    private static Method Method_getDOMImplementation;
+    private static Method Method_setEmbeddedFontsOn;
+
+    public static Graphics2D createGraphicsObject() {
+        try {
+            if (SVGGraphics2DConstructor == null) {
+                ClassLoader cl = BatikSVG.class.getClassLoader();
+                Class Class_GenericDOMImplementation = cl.loadClass("org.apache.batik.dom.GenericDOMImplementation");
+                Class Class_SVGGeneratorContext = cl.loadClass("org.apache.batik.svggen.SVGGeneratorContext");
+                Class Class_SVGGraphics2D = cl.loadClass("org.apache.batik.svggen.SVGGraphics2D");
+                Method_getDOMImplementation = Class_GenericDOMImplementation.getDeclaredMethod("getDOMImplementation", new Class[0]);
+                Method_createDefault = Class_SVGGeneratorContext.getDeclaredMethod("createDefault", new Class[]{org.w3c.dom.Document.class});
+                Method_setEmbeddedFontsOn = Class_SVGGeneratorContext.getDeclaredMethod("setEmbeddedFontsOn", new Class[]{boolean.class});
+                Method_stream = Class_SVGGraphics2D.getDeclaredMethod("stream", Writer.class, boolean.class);
+                SVGGraphics2DConstructor = Class_SVGGraphics2D.getConstructor(Class_SVGGeneratorContext, boolean.class);
+            }
+            DOMImplementation dom = (DOMImplementation) Method_getDOMImplementation.invoke(null);
+            org.w3c.dom.Document document = dom.createDocument("http://www.w3.org/2000/svg", "svg", null);
+            Object ctx = Method_createDefault.invoke(null, document);
+            Method_setEmbeddedFontsOn.invoke(ctx, true);
+            Graphics2D svgGenerator = (Graphics2D) SVGGraphics2DConstructor.newInstance(ctx, true);
+            return svgGenerator;
+        } catch (ClassNotFoundException e) {
+            return null;
+        } catch (NoSuchMethodException e) {
+            return null;
+        } catch (IllegalAccessException e) {
+            return null;
+        } catch (InvocationTargetException e) {
+            return null;
+        } catch (InstantiationException e) {
+            return null;
+        }
+    }
+
+    public static void printToStream(Graphics2D svgGenerator, Writer stream, boolean useCSS) {
+        try {
+            Method_stream.invoke(svgGenerator, stream, useCSS);
+        } catch (IllegalAccessException e) {
+            assert false;
+        } catch (InvocationTargetException e) {
+            assert false;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=BatikSVGProxy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.bytecodes" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.bytecodes.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.bytecodes
+OpenIDE-Module-Layer: com/sun/hotspot/igv/bytecodes/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/bytecodes/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.bytecodes-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=1dee290d
+build.xml.script.CRC32=d594034f
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=1dee290d
+nbproject/build-impl.xml.script.CRC32=b4dab126
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.bytecodes</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.jdesktop.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.4</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.explorer</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+CTL_BytecodeViewAction=Open BytecodeView Window
+CTL_BytecodeViewTopComponent=BytecodeView Window
+CTL_SelectBytecodesAction=Select nodes
+HINT_BytecodeViewTopComponent=This is a BytecodeView window
+OpenIDE-Module-Name=Bytecodes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,100 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.StringPropertyMatcher;
+import java.awt.Image;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.Action;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BytecodeNode extends AbstractNode {
+
+    private Set<InputNode> nodes;
+
+    public BytecodeNode(InputBytecode bytecode, InputGraph graph, String bciValue) {
+
+        super(Children.LEAF);
+        this.setDisplayName(bytecode.getBci() + " " + bytecode.getName());
+
+        bciValue = bytecode.getBci() + " " + bciValue;
+        bciValue = bciValue.trim();
+
+        Properties.PropertySelector<InputNode> selector = new Properties.PropertySelector<InputNode>(graph.getNodes());
+        StringPropertyMatcher matcher = new StringPropertyMatcher("bci", bciValue);
+        List<InputNode> nodeList = selector.selectMultiple(matcher);
+        if (nodeList.size() > 0) {
+            nodes = new HashSet<InputNode>();
+            for (InputNode n : nodeList) {
+                nodes.add(n);
+            }
+            this.setDisplayName(this.getDisplayName() + " (" + nodes.size() + " nodes)");
+        }
+    }
+
+    @Override
+    public Image getIcon(int i) {
+        if (nodes != null) {
+            return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/link.gif");
+        } else {
+            return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/bytecode.gif");
+        }
+    }
+
+    @Override
+    public Image getOpenedIcon(int i) {
+        return getIcon(i);
+    }
+
+    @Override
+    public Action[] getActions(boolean b) {
+        return new Action[]{(Action) SelectBytecodesAction.findObject(SelectBytecodesAction.class, true)};
+    }
+
+    @Override
+    public Action getPreferredAction() {
+        return (Action) SelectBytecodesAction.findObject(SelectBytecodesAction.class, true);
+    }
+
+    @Override
+    public <T extends Node.Cookie> T getCookie(Class<T> aClass) {
+        if (aClass == SelectBytecodesCookie.class && nodes != null) {
+            return (T) (new SelectBytecodesCookie(nodes));
+        }
+        return super.getCookie(aClass);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+public class BytecodeViewAction extends AbstractAction {
+
+    public BytecodeViewAction() {
+        super(NbBundle.getMessage(BytecodeViewAction.class, "CTL_BytecodeViewAction"));
+    }
+
+    public void actionPerformed(ActionEvent evt) {
+        TopComponent win = BytecodeViewTopComponent.findInstance();
+        win.open();
+        win.requestActive();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.form	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+</Form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,172 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import java.awt.BorderLayout;
+import java.io.Serializable;
+import org.openide.ErrorManager;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.explorer.view.BeanTreeView;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+final class BytecodeViewTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener {
+
+    private static BytecodeViewTopComponent instance;
+    private static final String PREFERRED_ID = "BytecodeViewTopComponent";
+    private ExplorerManager manager;
+    private BeanTreeView treeView;
+    private Lookup.Result result = null;
+    private MethodNode rootNode;
+
+    private BytecodeViewTopComponent() {
+        initComponents();
+        setName(NbBundle.getMessage(BytecodeViewTopComponent.class, "CTL_BytecodeViewTopComponent"));
+        setToolTipText(NbBundle.getMessage(BytecodeViewTopComponent.class, "HINT_BytecodeViewTopComponent"));
+
+        manager = new ExplorerManager();
+        rootNode = new MethodNode(null, null, "");
+        manager.setRootContext(rootNode);
+
+        setLayout(new BorderLayout());
+
+        treeView = new BeanTreeView();
+        treeView.setRootVisible(false);
+        this.add(BorderLayout.CENTER, treeView);
+        associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(0, 400, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(0, 300, Short.MAX_VALUE)
+        );
+    }// </editor-fold>//GEN-END:initComponents
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    // End of variables declaration//GEN-END:variables
+    /**
+     * Gets default instance. Do not use directly: reserved for *.settings files only,
+     * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+     * To obtain the singleton instance, use {@link findInstance}.
+     */
+    public static synchronized BytecodeViewTopComponent getDefault() {
+        if (instance == null) {
+            instance = new BytecodeViewTopComponent();
+        }
+        return instance;
+    }
+
+    /**
+     * Obtain the BytecodeViewTopComponent instance. Never call {@link #getDefault} directly!
+     */
+    public static synchronized BytecodeViewTopComponent findInstance() {
+        TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (win == null) {
+            ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find BytecodeView component. It will not be located properly in the window system.");
+            return getDefault();
+        }
+        if (win instanceof BytecodeViewTopComponent) {
+            return (BytecodeViewTopComponent) win;
+        }
+        ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+        return getDefault();
+    }
+
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_ALWAYS;
+    }
+
+    @Override
+    public void componentOpened() {
+        Lookup.Template tpl = new Lookup.Template(Object.class);
+        result = Utilities.actionsGlobalContext().lookup(tpl);
+        result.addLookupListener(this);
+    }
+
+    @Override
+    public void componentClosed() {
+        result.removeLookupListener(this);
+        result = null;
+    }
+
+    @Override
+    public Object writeReplace() {
+        return new ResolvableHelper();
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    public ExplorerManager getExplorerManager() {
+        return manager;
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+        if (p != null) {
+            InputGraph graph = p.getGraph();
+            if (graph != null) {
+                Group g = graph.getGroup();
+                rootNode.update(graph, g.getMethod());
+            }
+        }
+    }
+
+    final static class ResolvableHelper implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        public Object readResolve() {
+            return BytecodeViewTopComponent.getDefault();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+    <module name="com.sun.hotspot.igv.bytecodes" spec="1.0"/>
+    <instanceof class="org.openide.windows.TopComponent"/>
+    <instanceof class="com.sun.hotspot.igv.bytecodes.BytecodeViewTopComponent"/>
+    <instance class="com.sun.hotspot.igv.bytecodes.BytecodeViewTopComponent" method="getDefault"/>
+</settings>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+    <module name="com.sun.hotspot.igv.bytecodes" spec="1.0"/>
+    <tc-id id="BytecodeViewTopComponent"/>
+    <state opened="true"/>
+</tc-ref>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,102 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import java.awt.Image;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MethodNode extends AbstractNode {
+
+    private static class MethodNodeChildren extends Children.Keys {
+
+        private InputMethod method;
+        private InputGraph graph;
+        private String bciString;
+
+        public MethodNodeChildren(InputMethod method, InputGraph graph, String bciString) {
+            this.method = method;
+            this.bciString = bciString;
+            this.graph = graph;
+        }
+
+        protected Node[] createNodes(Object object) {
+            assert object instanceof InputBytecode;
+            InputBytecode bc = (InputBytecode) object;
+            if (bc.getInlined() == null) {
+                return new Node[]{new BytecodeNode(bc, graph, bciString)};
+            } else {
+                return new Node[]{new BytecodeNode(bc, graph, bciString), new MethodNode(bc.getInlined(), graph, bc.getBci() + " " + bciString)};
+            }
+        }
+
+        @Override
+        public void addNotify() {
+            if (method != null) {
+                setKeys(method.getBytecodes());
+            }
+        }
+
+        public void setMethod(InputMethod method, InputGraph graph) {
+            this.method = method;
+            this.graph = graph;
+            addNotify();
+        }
+    }
+
+    /** Creates a new instance of MethodNode */
+    public MethodNode(InputMethod method, InputGraph graph, String bciString) {
+        super((method != null && method.getBytecodes().size() == 0) ? Children.LEAF : new MethodNodeChildren(method, graph, bciString));
+        if (method != null) {
+            this.setDisplayName(method.getName());
+        }
+    }
+
+    @Override
+    public Image getIcon(int i) {
+        return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/method.gif");
+    }
+
+    @Override
+    public Image getOpenedIcon(int i) {
+        return getIcon(i);
+    }
+
+    public void update(InputGraph graph, InputMethod method) {
+        ((MethodNodeChildren) this.getChildren()).setMethod(method, graph);
+        if (method != null) {
+            this.setDisplayName(method.getName());
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SelectBytecodesAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        SelectBytecodesCookie c = activatedNodes[0].getCookie(SelectBytecodesCookie.class);
+        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+        if (p != null) {
+            p.setSelectedNodes(c.getNodes());
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_EXACTLY_ONE;
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SelectBytecodesAction.class, "CTL_SelectBytecodesAction");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            SelectBytecodesCookie.class
+        };
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+        putValue("noIconInMenu", Boolean.TRUE);
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.bytecodes;
+
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Collections;
+import java.util.Set;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SelectBytecodesCookie implements Node.Cookie {
+
+    private Set<InputNode> nodes;
+
+    /** Creates a new instance of SelectBytecodesCookie */
+    public SelectBytecodesCookie(Set<InputNode> nodes) {
+        this.nodes = nodes;
+    }
+
+    public Set<InputNode> getNodes() {
+        return Collections.unmodifiableSet(nodes);
+    }
+}
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Actions">
+        <folder name="Edit">
+            <file name="com-sun-hotspot-igv-bytecodes-SelectBytecodesAction.instance"/>
+        </folder>
+        <folder name="Window">
+            <file name="com-sun-hotspot-igv-bytecodes-BytecodeViewAction.instance"/>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="Window">
+            <file name="BytecodeViewAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-bytecodes-BytecodeViewAction.instance"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Windows2">
+        <folder name="Components">
+            <file name="BytecodeViewTopComponent.settings" url="BytecodeViewTopComponentSettings.xml"/>
+        </folder>
+        <folder name="Modes">
+            <folder name="customRightTopMode">
+                <file name="BytecodeViewTopComponent.wstcref" url="BytecodeViewTopComponentWstcref.xml"/>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.controlflow" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.controlflow.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.controlflow
+OpenIDE-Module-Layer: com/sun/hotspot/igv/controlflow/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/controlflow/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.controlflow-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=b524efb3
+build.xml.script.CRC32=79a27be9
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=b524efb3
+nbproject/build-impl.xml.script.CRC32=582bdab7
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.controlflow</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.jdesktop.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.4</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.visual</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>2.9</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlockEdge;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockConnectionWidget extends ConnectionWidget implements Link {
+
+    private BlockWidget from;
+    private BlockWidget to;
+    private Port inputSlot;
+    private Port outputSlot;
+    private List<Point> points;
+    private InputBlockEdge edge;
+
+    public BlockConnectionWidget(ControlFlowScene scene, InputBlockEdge edge) {
+        super(scene);
+
+        this.edge = edge;
+        this.from = (BlockWidget) scene.findWidget(edge.getFrom());
+        this.to = (BlockWidget) scene.findWidget(edge.getTo());
+        inputSlot = to.getInputSlot();
+        outputSlot = from.getOutputSlot();
+        points = new ArrayList<Point>();
+    }
+
+    public InputBlockEdge getEdge() {
+        return edge;
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.points = p;
+    }
+
+    @Override
+    public List<Point> getControlPoints() {
+        return points;
+    }
+
+    @Override
+    public String toString() {
+        return "Connection[ " + from.toString() + " - " + to.toString() + "]";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,160 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Point;
+import org.netbeans.api.visual.border.BorderFactory;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.LabelWidget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockWidget extends LabelWidget implements Vertex {
+
+    public static final Dimension SIZE = new Dimension(20, 20);
+    private InputBlock block;
+    private Port inputSlot;
+    private Port outputSlot;
+    private Cluster cluster;
+    private boolean root;
+    private static final Font font = new Font(Font.SERIF, Font.PLAIN, 12);
+    private static final Font boldFont = font.deriveFont(Font.BOLD);
+    public static final Color NORMAL_FOREGROUND_COLOR = Color.BLACK;
+    public static final Color HOVER_FOREGROUND_COLOR = Color.BLUE;
+
+    /** Creates a new instance of BlockWidget */
+    public BlockWidget(ControlFlowScene scene, InputBlock block) {
+        super(scene);
+        this.block = block;
+        this.setLabel(block.getName());
+        this.setForeground(NORMAL_FOREGROUND_COLOR);
+        this.setBorder(BorderFactory.createLineBorder(1, NORMAL_FOREGROUND_COLOR));
+        this.setMinimumSize(SIZE);
+        this.setMaximumSize(SIZE);
+
+        this.setFont(font);
+
+        final BlockWidget widget = this;
+        inputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point((int) (SIZE.getWidth() / 2), (int) (SIZE.getHeight() / 2));
+            }
+
+            public Vertex getVertex() {
+                return widget;
+            }
+        };
+
+        outputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point((int) (SIZE.getWidth() / 2), (int) (SIZE.getHeight() / 2));
+            }
+
+            public Vertex getVertex() {
+                return widget;
+            }
+        };
+    }
+
+    public Port getInputSlot() {
+        return inputSlot;
+    }
+
+    public Port getOutputSlot() {
+        return outputSlot;
+    }
+
+    public InputBlock getBlock() {
+        return block;
+    }
+
+    public Dimension getSize() {
+        return SIZE;
+    }
+
+    public void setPosition(Point p) {
+        this.setPreferredLocation(p);
+    }
+
+    @Override
+    public String toString() {
+        return block.getName();
+    }
+
+    public Point getPosition() {
+        return this.getPreferredLocation();
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public boolean isRoot() {
+        return root;
+    }
+
+    public void setCluster(Cluster c) {
+        cluster = c;
+    }
+
+    public void setRoot(boolean b) {
+        root = b;
+    }
+
+    public int compareTo(Vertex o) {
+        return toString().compareTo(o.toString());
+    }
+
+    @Override
+    protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+        super.notifyStateChanged(previousState, state);
+
+        if (previousState.isHovered() != state.isHovered()) {
+            if (state.isHovered()) {
+                this.setBorder(BorderFactory.createLineBorder(1, HOVER_FOREGROUND_COLOR));
+            } else {
+                this.setBorder(BorderFactory.createLineBorder(1, NORMAL_FOREGROUND_COLOR));
+            }
+        }
+
+        if (previousState.isSelected() != state.isSelected()) {
+            if (state.isSelected()) {
+                this.setFont(boldFont);
+            } else {
+                this.setFont(font);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,4 @@
+CTL_ControlFlowAction=Open ControlFlow Window
+CTL_ControlFlowTopComponent=ControlFlow Window
+HINT_ControlFlowTopComponent=This is a ControlFlow window
+OpenIDE-Module-Name=ControlFlow
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ControlFlowAction extends AbstractAction {
+
+    public ControlFlowAction() {
+        super(NbBundle.getMessage(ControlFlowAction.class, "CTL_ControlFlowAction"));
+    }
+
+    public void actionPerformed(ActionEvent evt) {
+        TopComponent win = ControlFlowTopComponent.findInstance();
+        win.open();
+        win.requestActive();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,296 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputBlockEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.data.InputNode;
+import java.awt.Color;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+import javax.swing.BorderFactory;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.MoveProvider;
+import org.netbeans.api.visual.action.RectangularSelectDecorator;
+import org.netbeans.api.visual.action.RectangularSelectProvider;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.anchor.AnchorFactory;
+import org.netbeans.api.visual.anchor.AnchorShape;
+import com.sun.hotspot.igv.controlflow.HierarchicalGraphLayout;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.router.RouterFactory;
+import org.netbeans.api.visual.widget.LayerWidget;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.graph.GraphScene;
+import org.netbeans.api.visual.graph.layout.GraphLayout;
+import org.netbeans.api.visual.layout.SceneLayout;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ControlFlowScene extends GraphScene<InputBlock, InputBlockEdge> implements SelectProvider, MoveProvider, RectangularSelectDecorator, RectangularSelectProvider {
+
+    private Set<BlockWidget> selection;
+    private Hashtable<InputBlock, BlockWidget> blockMap;
+    private InputGraph oldGraph;
+    private LayerWidget edgeLayer;
+    private LayerWidget mainLayer;
+    private LayerWidget selectLayer;
+    private WidgetAction hoverAction = this.createWidgetHoverAction();
+    private WidgetAction selectAction = ActionFactory.createSelectAction(this);
+    private WidgetAction moveAction = ActionFactory.createMoveAction(null, this);
+
+    public ControlFlowScene() {
+        selection = new HashSet<BlockWidget>();
+
+        this.getInputBindings().setZoomActionModifiers(0);
+        this.setLayout(LayoutFactory.createAbsoluteLayout());
+
+        mainLayer = new LayerWidget(this);
+        this.addChild(mainLayer);
+
+        edgeLayer = new LayerWidget(this);
+        this.addChild(edgeLayer);
+
+        selectLayer = new LayerWidget(this);
+        this.addChild(selectLayer);
+
+        this.getActions().addAction(hoverAction);
+        this.getActions().addAction(selectAction);
+        this.getActions().addAction(ActionFactory.createRectangularSelectAction(this, selectLayer, this));
+        this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1));
+    }
+
+    public void setGraph(InputGraph g) {
+        if (g == oldGraph) {
+            return;
+        }
+        oldGraph = g;
+
+        ArrayList<InputBlock> blocks = new ArrayList<InputBlock>(this.getNodes());
+        for (InputBlock b : blocks) {
+            removeNode(b);
+        }
+
+        ArrayList<InputBlockEdge> edges = new ArrayList<InputBlockEdge>(this.getEdges());
+        for (InputBlockEdge e : edges) {
+            removeEdge(e);
+        }
+
+        for (InputBlock b : g.getBlocks()) {
+            addNode(b);
+        }
+
+        for (InputBlock b : g.getBlocks()) {
+            for (InputBlockEdge e : b.getOutputs()) {
+                addEdge(e);
+                assert g.getBlocks().contains(e.getFrom());
+                assert g.getBlocks().contains(e.getTo());
+                this.setEdgeSource(e, e.getFrom());
+                this.setEdgeTarget(e, e.getTo());
+            }
+        }
+
+        GraphLayout layout = new HierarchicalGraphLayout();//GridGraphLayout();
+        SceneLayout sceneLayout = LayoutFactory.createSceneGraphLayout(this, layout);
+        sceneLayout.invokeLayout();
+
+        this.validate();
+    }
+
+    public BlockWidget getBlockWidget(InputBlock b) {
+        return blockMap.get(b);
+    }
+
+    public void clearSelection() {
+        for (BlockWidget w : selection) {
+            w.setState(w.getState().deriveSelected(false));
+        }
+        selection.clear();
+        selectionChanged();
+    }
+
+    public void selectionChanged() {
+        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+        if (p != null) {
+            Set<InputNode> inputNodes = new HashSet<InputNode>();
+            for (BlockWidget w : selection) {
+                inputNodes.addAll(w.getBlock().getNodes());
+            }
+            p.setSelectedNodes(inputNodes);
+        }
+    }
+
+    public void addToSelection(BlockWidget widget) {
+        widget.setState(widget.getState().deriveSelected(true));
+        selection.add(widget);
+        selectionChanged();
+    }
+
+    public void removeFromSelection(BlockWidget widget) {
+        widget.setState(widget.getState().deriveSelected(false));
+        selection.remove(widget);
+        selectionChanged();
+    }
+
+    public boolean isAimingAllowed(Widget widget, Point point, boolean b) {
+        return false;
+    }
+
+    public boolean isSelectionAllowed(Widget widget, Point point, boolean b) {
+        return true;
+    }
+
+    public void select(Widget widget, Point point, boolean change) {
+        if (widget == this) {
+            clearSelection();
+        } else {
+
+            assert widget instanceof BlockWidget;
+            BlockWidget bw = (BlockWidget) widget;
+            if (change) {
+                if (selection.contains(bw)) {
+                    removeFromSelection(bw);
+                } else {
+                    addToSelection(bw);
+                }
+            } else {
+                if (!selection.contains(bw)) {
+                    clearSelection();
+                    addToSelection(bw);
+                }
+            }
+        }
+    }
+
+    public void movementStarted(Widget widget) {
+    }
+
+    public void movementFinished(Widget widget) {
+    }
+
+    public Point getOriginalLocation(Widget widget) {
+        return widget.getPreferredLocation();
+    }
+
+    public void setNewLocation(Widget widget, Point location) {
+        Point originalLocation = getOriginalLocation(widget);
+        int xOffset = location.x - originalLocation.x;
+        int yOffset = location.y - originalLocation.y;
+        for (Widget w : this.selection) {
+            Point p = new Point(w.getPreferredLocation());
+            p.translate(xOffset, yOffset);
+            w.setPreferredLocation(p);
+        }
+
+    }
+
+    public Widget createSelectionWidget() {
+        Widget widget = new Widget(this);
+        widget.setOpaque(false);
+        widget.setBorder(BorderFactory.createLineBorder(Color.black, 2));
+        widget.setForeground(Color.red);
+        return widget;
+    }
+
+    public void performSelection(Rectangle rectangle) {
+
+        if (rectangle.width < 0) {
+            rectangle.x += rectangle.width;
+            rectangle.width *= -1;
+        }
+
+        if (rectangle.height < 0) {
+            rectangle.y += rectangle.height;
+            rectangle.height *= -1;
+        }
+
+        boolean changed = false;
+        for (InputBlock b : this.getNodes()) {
+            BlockWidget w = (BlockWidget) findWidget(b);
+            Rectangle r = new Rectangle(w.getBounds());
+            r.setLocation(w.getLocation());
+            if (r.intersects(rectangle)) {
+                if (!selection.contains(w)) {
+                    changed = true;
+                    selection.add(w);
+                    w.setState(w.getState().deriveSelected(true));
+                }
+            } else {
+                if (selection.contains(w)) {
+                    changed = true;
+                    selection.remove(w);
+                    w.setState(w.getState().deriveSelected(false));
+                }
+            }
+        }
+
+        if (changed) {
+            selectionChanged();
+        }
+
+    }
+
+    protected Widget attachNodeWidget(InputBlock node) {
+        BlockWidget w = new BlockWidget(this, node);
+        mainLayer.addChild(w);
+        w.getActions().addAction(hoverAction);
+        w.getActions().addAction(selectAction);
+        w.getActions().addAction(moveAction);
+        return w;
+    }
+
+    protected Widget attachEdgeWidget(InputBlockEdge edge) {
+        ConnectionWidget w = new BlockConnectionWidget(this, edge);
+        w.setRouter(RouterFactory.createDirectRouter());
+        w.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED);
+        edgeLayer.addChild(w);
+        return w;
+    }
+
+    protected void attachEdgeSourceAnchor(InputBlockEdge edge, InputBlock oldSourceNode, InputBlock sourceNode) {
+        Widget w = this.findWidget(edge);
+        assert w instanceof ConnectionWidget;
+        ConnectionWidget cw = (ConnectionWidget) w;
+        cw.setSourceAnchor(AnchorFactory.createRectangularAnchor(findWidget(sourceNode)));
+
+    }
+
+    protected void attachEdgeTargetAnchor(InputBlockEdge edge, InputBlock oldTargetNode, InputBlock targetNode) {
+        Widget w = this.findWidget(edge);
+        assert w instanceof ConnectionWidget;
+        ConnectionWidget cw = (ConnectionWidget) w;
+        cw.setTargetAnchor(AnchorFactory.createRectangularAnchor(findWidget(targetNode)));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.form	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+</Form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,179 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import java.awt.BorderLayout;
+import java.io.Serializable;
+import javax.swing.JScrollPane;
+import org.openide.ErrorManager;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ControlFlowTopComponent extends TopComponent implements LookupListener {
+
+    private static ControlFlowTopComponent instance;
+    private Lookup.Result result = null;
+    private static final String PREFERRED_ID = "ControlFlowTopComponent";
+    private ControlFlowScene scene;
+
+    private ControlFlowTopComponent() {
+        initComponents();
+        setName(NbBundle.getMessage(ControlFlowTopComponent.class, "CTL_ControlFlowTopComponent"));
+        setToolTipText(NbBundle.getMessage(ControlFlowTopComponent.class, "HINT_ControlFlowTopComponent"));
+
+        scene = new ControlFlowScene();
+        this.setLayout(new BorderLayout());
+        this.associateLookup(scene.getLookup());
+
+
+        JScrollPane panel = new JScrollPane(scene.createView());
+        this.add(panel, BorderLayout.CENTER);
+    }
+
+    @Override
+    public void requestFocus() {
+        super.requestFocus();
+        scene.getView().requestFocus();
+    }
+
+    @Override
+    public boolean requestFocusInWindow() {
+        super.requestFocusInWindow();
+        return scene.getView().requestFocusInWindow();
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(0, 400, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(0, 300, Short.MAX_VALUE)
+        );
+    }// </editor-fold>//GEN-END:initComponents
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    // End of variables declaration//GEN-END:variables
+    /**
+     * Gets default instance. Do not use directly: reserved for *.settings files only,
+     * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+     * To obtain the singleton instance, use {@link findInstance}.
+     */
+    public static synchronized ControlFlowTopComponent getDefault() {
+        if (instance == null) {
+            instance = new ControlFlowTopComponent();
+        }
+        return instance;
+    }
+
+    /**
+     * Obtain the ControlFlowTopComponent instance. Never call {@link #getDefault} directly!
+     */
+    public static synchronized ControlFlowTopComponent findInstance() {
+        TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (win == null) {
+            ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find ControlFlow component. It will not be located properly in the window system.");
+            return getDefault();
+        }
+        if (win instanceof ControlFlowTopComponent) {
+            return (ControlFlowTopComponent) win;
+        }
+        ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+        return getDefault();
+    }
+
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_ALWAYS;
+    }
+
+    @Override
+    public void componentOpened() {
+        Lookup.Template tpl = new Lookup.Template(Object.class);
+        result = Utilities.actionsGlobalContext().lookup(tpl);
+        result.addLookupListener(this);
+    }
+
+    @Override
+    public void componentClosed() {
+        result.removeLookupListener(this);
+        result = null;
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+
+        InputGraphProvider p = Lookup.getDefault().lookup(InputGraphProvider.class);
+        if (p != null) {
+            InputGraph g = p.getGraph();
+            if (g != null) {
+                scene.setGraph(g);
+            }
+        }
+    }
+
+    @Override
+    public Object writeReplace() {
+        return new ResolvableHelper();
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    @Override
+    public void requestActive() {
+        scene.getView().requestFocusInWindow();
+        super.requestActive();
+    }
+
+    final static class ResolvableHelper implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        public Object readResolve() {
+            return ControlFlowTopComponent.getDefault();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+    <module name="com.sun.hotspot.igv.controlflow" spec="1.0"/>
+    <instanceof class="org.openide.windows.TopComponent"/>
+    <instanceof class="com.sun.hotspot.igv.controlflow.ControlFlowTopComponent"/>
+    <instance class="com.sun.hotspot.igv.controlflow.ControlFlowTopComponent" method="getDefault"/>
+</settings>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+    <module name="com.sun.hotspot.igv.controlflow" spec="1.0"/>
+    <tc-id id="ControlFlowTopComponent"/>
+    <state opened="true"/>
+</tc-ref>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,167 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.controlflow;
+
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalLayoutManager;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.netbeans.api.visual.graph.layout.GraphLayout;
+import org.netbeans.api.visual.graph.layout.UniversalGraph;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalGraphLayout<N, E> extends GraphLayout<N, E> {
+
+    public HierarchicalGraphLayout() {
+    }
+
+    private class LinkWrapper implements Link {
+
+        private VertexWrapper from;
+        private VertexWrapper to;
+
+        public LinkWrapper(VertexWrapper from, VertexWrapper to) {
+            this.from = from;
+            this.to = to;
+        }
+
+        public Port getFrom() {
+            return from.getSlot();
+        }
+
+        public Port getTo() {
+            return to.getSlot();
+        }
+
+        public List<Point> getControlPoints() {
+            return new ArrayList<Point>();
+        }
+
+        public void setControlPoints(List<Point> list) {
+        // Do nothing for now
+        }
+    }
+
+    private class VertexWrapper implements Vertex {
+
+        private N node;
+        private UniversalGraph<N, E> graph;
+        private Port slot;
+        private Point position;
+
+        public VertexWrapper(N node, UniversalGraph<N, E> graph) {
+            this.node = node;
+            this.graph = graph;
+            final VertexWrapper vertex = this;
+            this.slot = new Port() {
+
+                public Vertex getVertex() {
+                    return vertex;
+                }
+
+                public Point getRelativePosition() {
+                    return new Point((int) (vertex.getSize().getWidth() / 2), (int) (vertex.getSize().getHeight() / 2));
+                }
+            };
+
+            Widget w = graph.getScene().findWidget(node);
+            this.position = w.getPreferredLocation();
+        }
+
+        public Cluster getCluster() {
+            return null;
+        }
+
+        public Dimension getSize() {
+            Widget w = graph.getScene().findWidget(node);
+            return w.getBounds().getSize();
+        }
+
+        public Point getPosition() {
+            return position;
+        }
+
+        public void setPosition(Point p) {
+            HierarchicalGraphLayout.this.setResolvedNodeLocation(graph, node, p);
+            position = p;
+        }
+
+        public boolean isRoot() {
+            return false;
+        }
+
+        public int compareTo(Vertex o) {
+            VertexWrapper vw = (VertexWrapper) o;
+            return node.toString().compareTo(vw.node.toString());
+        }
+
+        public Port getSlot() {
+            return slot;
+        }
+    }
+
+    protected void performGraphLayout(UniversalGraph<N, E> graph) {
+
+        Set<LinkWrapper> links = new HashSet<LinkWrapper>();
+        Set<VertexWrapper> vertices = new HashSet<VertexWrapper>();
+        Map<N, VertexWrapper> vertexMap = new HashMap<N, VertexWrapper>();
+
+        for (N node : graph.getNodes()) {
+            VertexWrapper v = new VertexWrapper(node, graph);
+            vertexMap.put(node, v);
+            vertices.add(v);
+        }
+
+        for (E edge : graph.getEdges()) {
+            N source = graph.getEdgeSource(edge);
+            N target = graph.getEdgeTarget(edge);
+            LinkWrapper l = new LinkWrapper(vertexMap.get(source), vertexMap.get(target));
+            links.add(l);
+        }
+
+        HierarchicalLayoutManager m = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.NONE);
+
+        LayoutGraph layoutGraph = new LayoutGraph(links, vertices);
+        m.doLayout(layoutGraph);
+    }
+
+    protected void performNodesLayout(UniversalGraph<N, E> graph, Collection<N> nodes) {
+        throw new UnsupportedOperationException();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Actions">
+        <folder name="Window">
+            <file name="com-sun-hotspot-igv-controlflow-ControlFlowAction.instance"/>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="Window">
+            <file name="ControlFlowAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-controlflow-ControlFlowAction.instance"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Windows2">
+        <folder name="Components">
+            <file name="ControlFlowTopComponent.settings" url="ControlFlowTopComponentSettings.xml"/>
+        </folder>
+        <folder name="Modes">
+            <folder name="customRightTopMode">
+                <file name="ControlFlowTopComponent.wstcref" url="ControlFlowTopComponentWstcref.xml"/>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.coordinator" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.coordinator.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.coordinator
+OpenIDE-Module-Layer: com/sun/hotspot/igv/coordinator/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/coordinator/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.coordinator-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=077de97c
+build.xml.script.CRC32=d29d586c
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=077de97c
+nbproject/build-impl.xml.script.CRC32=03daa42d
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.coordinator</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.progress</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.10.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.actions</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.6.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.explorer</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.3</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.loaders</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+com.sun.hotspot.igv.coordinator.StandardGroupOrganizer
+com.sun.hotspot.igv.coordinator.GraphCountGroupOrganizer
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+
+AdvancedOption_DisplayName_Coordinator=Settings
+AdvancedOption_Tooltip_Coordinator=Visualization Tool Settings
+CTL_OutlineTopComponent=Outline Window
+CTL_SomeAction=test
+HINT_OutlineTopComponent=This is a Outline window
+OpenIDE-Module-Name=Coordinator
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.RemoveCookie;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.Pair;
+import java.awt.Image;
+import java.util.ArrayList;
+import java.util.List;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FolderNode extends AbstractNode {
+
+    private GroupOrganizer organizer;
+    private InstanceContent content;
+    private List<Pair<String, List<Group>>> structure;
+    private List<String> subFolders;
+    private FolderChildren children;
+
+    private static class FolderChildren extends Children.Keys {
+
+        private FolderNode parent;
+
+        public void setParent(FolderNode parent) {
+            this.parent = parent;
+        }
+
+        @Override
+        protected Node[] createNodes(Object arg0) {
+
+            Pair<String, List<Group>> p = (Pair<String, List<Group>>) arg0;
+            if (p.getLeft().length() == 0) {
+
+                List<Node> curNodes = new ArrayList<Node>();
+                for (Group g : p.getRight()) {
+                    for (InputGraph graph : g.getGraphs()) {
+                        curNodes.add(new GraphNode(graph));
+                    }
+                }
+
+                Node[] result = new Node[curNodes.size()];
+                for (int i = 0; i < curNodes.size(); i++) {
+                    result[i] = curNodes.get(i);
+                }
+                return result;
+
+            } else {
+                return new Node[]{new FolderNode(p.getLeft(), parent.organizer, parent.subFolders, p.getRight())};
+            }
+        }
+
+        @Override
+        public void addNotify() {
+            this.setKeys(parent.structure);
+
+        }
+    }
+
+    protected InstanceContent getContent() {
+        return content;
+    }
+
+    @Override
+    public Image getIcon(int i) {
+        return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/folder.gif");
+    }
+
+    protected FolderNode(String name, GroupOrganizer organizer, List<String> subFolders, List<Group> groups) {
+        this(name, organizer, subFolders, groups, new FolderChildren(), new InstanceContent());
+    }
+
+    private FolderNode(String name, GroupOrganizer organizer, List<String> oldSubFolders, final List<Group> groups, FolderChildren children, InstanceContent content) {
+        super(children, new AbstractLookup(content));
+        children.setParent(this);
+        this.content = content;
+        this.children = children;
+        content.add(new RemoveCookie() {
+
+            public void remove() {
+                for (Group g : groups) {
+                    if (g.getDocument() != null) {
+                        g.getDocument().removeGroup(g);
+                    }
+                }
+            }
+        });
+        init(name, organizer, oldSubFolders, groups);
+    }
+
+    public void init(String name, GroupOrganizer organizer, List<String> oldSubFolders, List<Group> groups) {
+        this.setDisplayName(name);
+        this.organizer = organizer;
+        this.subFolders = new ArrayList<String>(oldSubFolders);
+        if (name.length() > 0) {
+            this.subFolders.add(name);
+        }
+        structure = organizer.organize(subFolders, groups);
+        assert structure != null;
+        children.addNotify();
+    }
+
+    @Override
+    public Image getOpenedIcon(int i) {
+        return getIcon(i);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,81 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.Pair;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphCountGroupOrganizer implements GroupOrganizer {
+
+    public String getName() {
+        return "Graph count structure";
+    }
+
+    public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+        List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+        if (subFolders.size() == 0) {
+            Map<Integer, List<Group>> map = new HashMap<Integer, List<Group>>();
+            for (Group g : groups) {
+                Integer cur = g.getGraphs().size();
+                if (!map.containsKey(cur)) {
+                    map.put(cur, new ArrayList<Group>());
+                }
+                map.get(cur).add(g);
+            }
+
+            SortedSet<Integer> keys = new TreeSet<Integer>(map.keySet());
+            for (Integer i : keys) {
+                result.add(new Pair<String, List<Group>>("Graph count " + i, map.get(i)));
+            }
+
+        } else if (subFolders.size() == 1) {
+            for (Group g : groups) {
+                List<Group> children = new ArrayList<Group>();
+                children.add(g);
+                Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+                p.setLeft(g.getName());
+                p.setRight(children);
+                result.add(p);
+            }
+        } else if (subFolders.size() == 2) {
+            result.add(new Pair<String, List<Group>>("", groups));
+        }
+
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,130 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.DiffGraphAction;
+import com.sun.hotspot.igv.coordinator.actions.DiffGraphCookie;
+import com.sun.hotspot.igv.coordinator.actions.RemoveCookie;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import java.awt.Image;
+import javax.swing.Action;
+import org.openide.actions.OpenAction;
+import org.openide.cookies.OpenCookie;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+import org.openide.util.Lookup;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphNode extends AbstractNode {
+
+    private InputGraph graph;
+
+    /** Creates a new instance of GraphNode */
+    public GraphNode(InputGraph graph) {
+        this(graph, new InstanceContent());
+    }
+
+    private GraphNode(final InputGraph graph, InstanceContent content) {
+        super(Children.LEAF, new AbstractLookup(content));
+        this.graph = graph;
+        this.setDisplayName(graph.getName());
+        content.add(graph);
+
+        final GraphViewer viewer = Lookup.getDefault().lookup(GraphViewer.class);
+
+        if (viewer != null) {
+            // Action for opening the graph
+            content.add(new OpenCookie() {
+
+                public void open() {
+                    viewer.view(graph);
+                }
+            });
+        }
+
+        // Action for removing a graph
+        content.add(new RemoveCookie() {
+
+            public void remove() {
+                graph.getGroup().removeGraph(graph);
+            }
+        });
+    }
+
+    @Override
+    protected Sheet createSheet() {
+        Sheet s = super.createSheet();
+        PropertiesSheet.initializeSheet(graph.getProperties(), s);
+        return s;
+    }
+
+    @Override
+    public Image getIcon(int i) {
+        return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/graph.gif");
+    }
+
+    @Override
+    public Image getOpenedIcon(int i) {
+        return getIcon(i);
+    }
+
+    @Override
+    public <T extends Node.Cookie> T getCookie(Class<T> aClass) {
+        if (aClass == DiffGraphCookie.class) {
+            InputGraphProvider graphProvider = Utilities.actionsGlobalContext().lookup(InputGraphProvider.class);
+
+            InputGraph graphA = null;
+            if (graphProvider != null) {
+                graphA = graphProvider.getGraph();
+            }
+
+            if (graphA != null && !graphA.isDifferenceGraph()) {
+                return (T) new DiffGraphCookie(graphA, graph);
+            }
+        }
+
+        return super.getCookie(aClass);
+    }
+
+    @Override
+    public Action[] getActions(boolean b) {
+        return new Action[]{(Action) DiffGraphAction.findObject(DiffGraphAction.class, true), (Action) OpenAction.findObject(OpenAction.class, true)};
+    }
+
+    @Override
+    public Action getPreferredAction() {
+        return (Action) OpenAction.findObject(OpenAction.class, true);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.form	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel2">
+      <Constraints>
+        <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+          <BorderConstraints direction="Center"/>
+        </Constraint>
+      </Constraints>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+      <SubComponents>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <AuxValues>
+            <AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new BeanTreeView();"/>
+          </AuxValues>
+          <Constraints>
+            <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+              <BorderConstraints direction="Center"/>
+            </Constraint>
+          </Constraints>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+        </Container>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,271 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.coordinator.actions.ImportAction;
+import com.sun.hotspot.igv.coordinator.actions.RemoveAction;
+import com.sun.hotspot.igv.coordinator.actions.RemoveAllAction;
+import com.sun.hotspot.igv.coordinator.actions.SaveAllAction;
+import com.sun.hotspot.igv.coordinator.actions.SaveAsAction;
+import com.sun.hotspot.igv.coordinator.actions.StructuredViewAction;
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.services.GroupReceiver;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.ErrorManager;
+import org.openide.awt.Toolbar;
+import org.openide.awt.ToolbarPool;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.explorer.view.BeanTreeView;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.NodeAction;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class OutlineTopComponent extends TopComponent implements ExplorerManager.Provider, LookupListener {
+
+    public static OutlineTopComponent instance;
+    public static final String PREFERRED_ID = "OutlineTopComponent";
+    private ExplorerManager manager;
+    private GraphDocument document;
+    private FolderNode root;
+    private GroupOrganizer organizer;
+
+    private OutlineTopComponent() {
+        initComponents();
+
+        setName(NbBundle.getMessage(OutlineTopComponent.class, "CTL_OutlineTopComponent"));
+        setToolTipText(NbBundle.getMessage(OutlineTopComponent.class, "HINT_OutlineTopComponent"));
+
+        document = new GraphDocument();
+        initListView();
+        initToolbar();
+        initReceivers();
+    }
+
+    private void initListView() {
+        manager = new ExplorerManager();
+        organizer = new StandardGroupOrganizer();
+        root = new FolderNode("", organizer, new ArrayList<String>(), document.getGroups());
+        manager.setRootContext(root);
+        ((BeanTreeView) this.jScrollPane1).setRootVisible(false);
+
+        document.getChangedEvent().addListener(new ChangedListener<GraphDocument>() {
+
+            public void changed(GraphDocument document) {
+                updateStructure();
+            }
+        });
+
+        associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+    }
+
+    private void initToolbar() {
+
+        Toolbar toolbar = new Toolbar();
+        Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+        toolbar.setBorder(b);
+        this.add(toolbar, BorderLayout.NORTH);
+
+        toolbar.add(ImportAction.get(ImportAction.class));
+        toolbar.add(((NodeAction) RemoveAction.get(RemoveAction.class)).createContextAwareInstance(this.getLookup()));
+        toolbar.add(RemoveAllAction.get(RemoveAllAction.class));
+
+        toolbar.add(((NodeAction) SaveAsAction.get(SaveAsAction.class)).createContextAwareInstance(this.getLookup()));
+        toolbar.add(SaveAllAction.get(SaveAllAction.class));
+
+        toolbar.add(StructuredViewAction.get(StructuredViewAction.class).getToolbarPresenter());
+
+        for (Toolbar tb : ToolbarPool.getDefault().getToolbars()) {
+            tb.setVisible(false);
+        }
+
+        initOrganizers();
+    }
+
+    public void setOrganizer(GroupOrganizer organizer) {
+        this.organizer = organizer;
+        updateStructure();
+    }
+
+    private void initOrganizers() {
+
+    }
+
+    private void initReceivers() {
+
+        final GroupCallback callback = new GroupCallback() {
+
+            public void started(Group g) {
+                getDocument().addGroup(g);
+            }
+        };
+
+        Collection<? extends GroupReceiver> receivers = Lookup.getDefault().lookupAll(GroupReceiver.class);
+        if (receivers.size() > 0) {
+            JPanel panel = new JPanel();
+            panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+
+            for (GroupReceiver r : receivers) {
+                Component c = r.init(callback);
+                panel.add(c);
+            }
+
+            jPanel2.add(panel, BorderLayout.PAGE_START);
+        }
+    }
+
+    private void updateStructure() {
+        root.init("", organizer, new ArrayList<String>(), document.getGroups());
+    }
+
+    public void clear() {
+        document.clear();
+    }
+
+    public ExplorerManager getExplorerManager() {
+        return manager;
+    }
+
+    public GraphDocument getDocument() {
+        return document;
+    }
+
+    /**
+     * Gets default instance. Do not use directly: reserved for *.settings files only,
+     * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+     * To obtain the singleton instance, use {@link findInstance}.
+     */
+    public static synchronized OutlineTopComponent getDefault() {
+        if (instance == null) {
+            instance = new OutlineTopComponent();
+        }
+        return instance;
+    }
+
+    /**
+     * Obtain the OutlineTopComponent instance. Never call {@link #getDefault} directly!
+     */
+    public static synchronized OutlineTopComponent findInstance() {
+        TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (win == null) {
+            ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Outline component. It will not be located properly in the window system.");
+            return getDefault();
+        }
+        if (win instanceof OutlineTopComponent) {
+            return (OutlineTopComponent) win;
+        }
+        ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+        return getDefault();
+    }
+
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_ALWAYS;
+    }
+
+    @Override
+    public void componentOpened() {
+        this.requestActive();
+    }
+
+    @Override
+    public void componentClosed() {
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+    }
+
+    @Override
+    public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {
+        // Not called when user starts application for the first time
+        super.readExternal(objectInput);
+        ((BeanTreeView) this.jScrollPane1).setRootVisible(false);
+    }
+
+    @Override
+    public void writeExternal(ObjectOutput objectOutput) throws IOException {
+        super.writeExternal(objectOutput);
+    }
+
+    static final class ResolvableHelper implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        public Object readResolve() {
+            return OutlineTopComponent.getDefault();
+        }
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanel2 = new javax.swing.JPanel();
+        jScrollPane1 = new BeanTreeView();
+
+        setLayout(new java.awt.BorderLayout());
+
+        jPanel2.setLayout(new java.awt.BorderLayout());
+        jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER);
+
+        add(jPanel2, java.awt.BorderLayout.CENTER);
+    }// </editor-fold>//GEN-END:initComponents
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JPanel jPanel2;
+    private javax.swing.JScrollPane jScrollPane1;
+    // End of variables declaration//GEN-END:variables
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+    <module name="com.sun.hotspot.igv.coordinator" spec="1.0"/>
+    <instanceof class="at.openide.windows.TopComponent"/>
+    <instanceof class="com.sun.hotspot.igv.coordinator.OutlineTopComponent"/>
+    <instance class="com.sun.hotspot.igv.coordinator.OutlineTopComponent" method="getDefault"/>
+</settings>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+    <module name="com.sun.hotspot.igv.coordinator" spec="1.0"/>
+    <tc-id id="OutlineTopComponent"/>
+    <state opened="true"/>
+</tc-ref>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configuration PUBLIC "-//NetBeans IDE//DTD toolbar//EN" "http://www.netbeans.org/dtds/toolbar.dtd">
+<Configuration>
+    <Row>
+        <Toolbar name="Edit" position="1" visible="false"/>
+        <Toolbar name="File" position="1" visible="false" />
+        <Toolbar name="Memory" position="1" visible="false" />
+    </Row>
+    <Row>
+        <Toolbar name="WorkspaceSwitcher" />
+        <Toolbar name="StatusLine" />
+    </Row>
+</Configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,62 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.coordinator;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class StandardGroupOrganizer implements GroupOrganizer {
+
+    public String getName() {
+        return "-- None --";
+    }
+
+    public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+        List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+        if (groups.size() == 1 && subFolders.size() > 0) {
+            result.add(new Pair<String, List<Group>>("", groups));
+        } else {
+            for (Group g : groups) {
+                List<Group> children = new ArrayList<Group>();
+                children.add(g);
+                Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+                p.setLeft(g.getName());
+                p.setRight(children);
+                result.add(p);
+            }
+        }
+
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,18 @@
+CTL_EditFilterAction=Edit...
+CTL_ImportAction=Open...
+CTL_OpenGraphAction=View graph
+CTL_DiffGraphAction=Difference to current graph
+CTL_RemoveAction=Remove methods
+CTL_ApplyFilterAction=Apply
+CTL_FilterAction=Open Filter Window
+CTL_AppliedFilterAction=Open AppliedFilter Window
+CTL_OutlineAction=Open Outline Window
+CTL_MoveFilterUpAction=Move upwards
+CTL_MoveFilterDownAction=Move downwards
+CTL_RemoveFilterAction=Remove
+CTL_RemoveFilterSettingsAction=Remove filter setting
+CTL_SaveAsAction=Save selected methods...
+CTL_SaveAllAction=Save all...
+CTL_SaveFilterSettingsAction=Save filter settings...
+CTL_PropertiesAction=Open Properties Window
+CTL_NewFilterAction=New filter...
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class DiffGraphAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        DiffGraphCookie c = activatedNodes[0].getCookie(DiffGraphCookie.class);
+        c.openDiff();
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_EXACTLY_ONE;
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(DiffGraphAction.class, "CTL_DiffGraphAction");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            DiffGraphCookie.class
+        };
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/diff.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.difference.Difference;
+import org.openide.nodes.Node;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiffGraphCookie implements Node.Cookie {
+
+    private InputGraph a;
+    private InputGraph b;
+
+    public DiffGraphCookie(InputGraph a, InputGraph b) {
+        this.a = a;
+        this.b = b;
+    }
+
+    public void openDiff() {
+
+        final GraphViewer viewer = Lookup.getDefault().lookup(GraphViewer.class);
+
+        if(viewer != null) {
+            InputGraph diffGraph = Difference.createDiffGraph(a, b);
+            viewer.view(diffGraph);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,175 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.serialization.Parser;
+import com.sun.hotspot.igv.settings.Settings;
+import com.sun.hotspot.igv.data.serialization.XMLParser;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import javax.swing.Action;
+import javax.swing.JFileChooser;
+import javax.swing.KeyStroke;
+import javax.swing.filechooser.FileFilter;
+import org.netbeans.api.progress.ProgressHandle;
+import org.netbeans.api.progress.ProgressHandleFactory;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.RequestProcessor;
+import org.openide.util.actions.CallableSystemAction;
+import org.openide.xml.XMLUtil;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ImportAction extends CallableSystemAction {
+
+    public static FileFilter getFileFilter() {
+        return new FileFilter() {
+
+            public boolean accept(File f) {
+                return f.getName().toLowerCase().endsWith(".xml") || f.isDirectory();
+            }
+
+            public String getDescription() {
+                return "XML files (*.xml)";
+            }
+        };
+    }
+
+    public void performAction() {
+
+        JFileChooser fc = new JFileChooser();
+        fc.setFileFilter(ImportAction.getFileFilter());
+        fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+        if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
+            File file = fc.getSelectedFile();
+
+            File dir = file;
+            if (!dir.isDirectory()) {
+                dir = dir.getParentFile();
+            }
+
+            Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+
+            try {
+                final XMLReader reader = XMLUtil.createXMLReader();
+                final FileInputStream inputStream = new FileInputStream(file);
+                final InputSource is = new InputSource(inputStream);
+
+                final ProgressHandle handle = ProgressHandleFactory.createHandle("Opening file " + file.getName());
+                final int basis = 1000;
+                handle.start(basis);
+                final int start = inputStream.available();
+
+                final XMLParser.ParseMonitor parseMonitor = new XMLParser.ParseMonitor() {
+
+                    public void setProgress(double d) {
+                        try {
+                            int curAvailable = inputStream.available();
+                            int prog = (int) (basis * (double) (start - curAvailable) / (double) start);
+                            handle.progress(prog);
+                        } catch (IOException ex) {
+                        }
+                    }
+
+                    public void setState(String state) {
+                        setProgress(0.0);
+                        handle.progress(state);
+                    }
+                };
+                final Parser parser = new Parser();
+                final OutlineTopComponent component = OutlineTopComponent.findInstance();
+
+                component.requestActive();
+
+                RequestProcessor.getDefault().post(new Runnable() {
+
+                    public void run() {
+                        GraphDocument document = null;
+                        try {
+                            document = parser.parse(reader, is, parseMonitor);
+                            parseMonitor.setState("Finishing");
+                            component.getDocument().addGraphDocument(document);
+                        } catch (SAXException ex) {
+                            String s = "Exception during parsing the XML file, could not load document!";
+                            if (ex instanceof XMLParser.MissingAttributeException) {
+                                XMLParser.MissingAttributeException e = (XMLParser.MissingAttributeException) ex;
+                                s += "\nMissing attribute \"" + e.getAttributeName() + "\"";
+                            }
+                            ex.printStackTrace();
+                            NotifyDescriptor d = new NotifyDescriptor.Message(s, NotifyDescriptor.ERROR_MESSAGE);
+                            DialogDisplayer.getDefault().notify(d);
+                        }
+                        handle.finish();
+                    }
+                });
+
+            } catch (SAXException ex) {
+                ex.printStackTrace();
+            } catch (FileNotFoundException ex) {
+                ex.printStackTrace();
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(ImportAction.class, "CTL_ImportAction");
+    }
+
+    public ImportAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Open an XML graph document");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/import.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.*;
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutlineAction extends AbstractAction {
+
+    public OutlineAction() {
+        super(NbBundle.getMessage(OutlineAction.class, "CTL_OutlineAction"));
+    }
+
+    public void actionPerformed(ActionEvent evt) {
+        TopComponent win = OutlineTopComponent.findInstance();
+        win.open();
+        win.requestActive();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.NodeAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveAction extends NodeAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        for (Node n : activatedNodes) {
+            RemoveCookie removeCookie = n.getCookie(RemoveCookie.class);
+            if (removeCookie != null) {
+                removeCookie.remove();
+            }
+        }
+    }
+
+    public RemoveAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Remove");
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(RemoveAction.class, "CTL_RemoveAction");
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/remove.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    protected boolean enable(Node[] nodes) {
+        return nodes.length > 0;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveAllAction extends CallableSystemAction {
+
+
+    public String getName() {
+        return NbBundle.getMessage(RemoveAllAction.class, "CTL_ImportAction");
+    }
+
+    public RemoveAllAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Remove all methods");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT, InputEvent.CTRL_MASK));
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/removeall.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    public void performAction() {
+        OutlineTopComponent.findInstance().clear();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.coordinator.actions;
+
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface RemoveCookie extends Node.Cookie {
+        void remove();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,69 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveAllAction extends CallableSystemAction {
+
+    public void performAction() {
+        final OutlineTopComponent component = OutlineTopComponent.findInstance();
+        SaveAsAction.save(component.getDocument());
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SaveAllAction.class, "CTL_SaveAllAction");
+    }
+
+    public SaveAllAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Save all methods to XML file");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/saveall.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,122 @@
+/*
+ * 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.
+ *
+ */
+
+package com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.serialization.Printer;
+import com.sun.hotspot.igv.settings.Settings;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import javax.swing.JFileChooser;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+import org.openide.util.actions.NodeAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveAsAction extends NodeAction {
+
+    protected void performAction(Node[] activatedNodes) {
+
+        GraphDocument doc = new GraphDocument();
+        for (Node n : activatedNodes) {
+            Group group = n.getLookup().lookup(Group.class);
+            doc.addGroup(group);
+        }
+
+        save(doc);
+    }
+
+    public static void save(GraphDocument doc) {
+        JFileChooser fc = new JFileChooser();
+        fc.setFileFilter(ImportAction.getFileFilter());
+        fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+        if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+            File file = fc.getSelectedFile();
+            if (!file.getName().contains(".")) {
+                file = new File(file.getAbsolutePath() + ".xml");
+            }
+
+            File dir = file;
+            if (!dir.isDirectory()) {
+                dir = dir.getParentFile();
+            }
+            Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+            try {
+                Writer writer = new OutputStreamWriter(new FileOutputStream(file));
+                Printer p = new Printer();
+                p.export(writer, doc);
+                writer.close();
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+
+            }
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_SOME;
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SaveAsAction.class, "CTL_SaveAsAction");
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/coordinator/images/save.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    protected boolean enable(Node[] nodes) {
+
+        int cnt = 0;
+        for (Node n : nodes) {
+            cnt += n.getLookup().lookupAll(Group.class).size();
+        }
+
+        return cnt > 0;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,180 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.coordinator.actions;
+
+import com.sun.hotspot.igv.coordinator.OutlineTopComponent;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import java.awt.Component;
+import java.awt.Image;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.swing.Action;
+import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.openide.awt.DropDownButtonFactory;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+public class StructuredViewAction extends CallableSystemAction {
+
+    private static JButton dropDownButton;
+    private static ButtonGroup buttonGroup;
+    private static JPopupMenu popup;
+    private MyMenuItemListener menuItemListener;
+    private Map<JMenuItem, GroupOrganizer> map;
+
+    public StructuredViewAction() {
+
+        putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks");
+    }
+
+    @Override
+    public Component getToolbarPresenter() {
+
+        Image iconImage = Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/structure.gif");
+        ImageIcon icon = new ImageIcon(iconImage);
+
+        popup = new JPopupMenu();
+
+        menuItemListener = new MyMenuItemListener();
+
+        buttonGroup = new ButtonGroup();
+
+        Collection<? extends GroupOrganizer> organizersCollection = Lookup.getDefault().lookupAll(GroupOrganizer.class);
+
+        List<GroupOrganizer> organizers = new ArrayList<GroupOrganizer>(organizersCollection);
+        Collections.sort(organizers, new Comparator<GroupOrganizer>() {
+            public int compare(GroupOrganizer a, GroupOrganizer b) {
+                return a.getName().compareTo(b.getName());
+            }
+        });
+
+        map = new HashMap<JMenuItem, GroupOrganizer>();
+
+        boolean first = true;
+        for(GroupOrganizer organizer : organizers) {
+            JCheckBoxMenuItem item = new JCheckBoxMenuItem(organizer.getName());
+            map.put(item, organizer);
+            item.addActionListener(menuItemListener);
+            buttonGroup.add(item);
+            popup.add(item);
+            if(first) {
+                item.setSelected(true);
+                first = false;
+            }
+        }
+
+        dropDownButton = DropDownButtonFactory.createDropDownButton(
+                new ImageIcon(
+                new BufferedImage(32, 32, BufferedImage.TYPE_BYTE_GRAY)),
+                popup);
+
+        dropDownButton.setIcon(icon);
+
+        dropDownButton.setToolTipText("Insert Layer Registration");
+
+        dropDownButton.addItemListener(new ItemListener() {
+
+            public void itemStateChanged(ItemEvent e) {
+                int state = e.getStateChange();
+                if (state == ItemEvent.SELECTED) {
+                    performAction();
+                }
+            }
+        });
+
+        dropDownButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                performAction();
+            }
+        });
+
+        popup.addPopupMenuListener(new PopupMenuListener() {
+
+            public void popupMenuCanceled(PopupMenuEvent e) {
+                dropDownButton.setSelected(false);
+            }
+
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                dropDownButton.setSelected(false);
+            }
+
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                dropDownButton.setSelected(true);
+            }
+        });
+
+        return dropDownButton;
+
+    }
+
+    private class MyMenuItemListener implements ActionListener {
+
+        public void actionPerformed(ActionEvent ev) {
+            JMenuItem item = (JMenuItem) ev.getSource();
+            GroupOrganizer organizer = map.get(item);
+            assert organizer != null : "Organizer must exist!";
+            OutlineTopComponent.findInstance().setOrganizer(organizer);
+        }
+    }
+
+
+    @Override
+    public void performAction() {
+        popup.show(dropDownButton, 0, dropDownButton.getHeight());
+    }
+
+    public String getName() {
+        return "Structured View";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mode version="2.1">
+    <name unique="customLeft" />
+    <kind type="view" />
+    <state type="joined" />
+    <constraints>
+        <path orientation="horizontal" number="0" weight="0.779245283018868"/>
+        <path orientation="vertical" number="0" weight="0.7511825922421949"/>
+        <path orientation="horizontal" number="0" weight="0.5"/>
+        <path orientation="vertical" number="20" weight="0.7"/>
+        <path orientation="horizontal" number="40" weight="0.55"/>
+        <path orientation="horizontal" number="0" weight="0.2711864406779661"/>
+    </constraints>
+    <bounds x="0" y="0" width="0" height="0" />
+    <frame state="0"/>
+    <active-tc id="OutlineTopComponent"/>
+    <empty-behavior permanent="false"/>
+</mode>
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <attr name="Actions\Edit\com-sun-hotspot-igv-bytecodes-SelectBytecodesAction.instance\position" intvalue="200"/>
+    <attr name="Actions\Edit\org-netbeans-core-ui-sysopen-SystemOpenAction.instance\position" intvalue="100"/>
+    <attr name="Actions\Edit\org-openide-actions-CopyAction.instance\position" intvalue="1300"/>
+    <attr name="Actions\Edit\org-openide-actions-CutAction.instance\position" intvalue="1400"/>
+    <attr name="Actions\Edit\org-openide-actions-DeleteAction.instance\position" intvalue="1500"/>
+    <attr name="Actions\Edit\org-openide-actions-FindAction.instance\position" intvalue="1600"/>
+    <attr name="Actions\Edit\org-openide-actions-GotoAction.instance\position" intvalue="1700"/>
+    <attr name="Actions\Edit\org-openide-actions-PasteAction.instance\position" intvalue="1800"/>
+    <attr name="Actions\Edit\org-openide-actions-RedoAction.instance\position" intvalue="1900"/>
+    <attr name="Actions\Edit\org-openide-actions-ReplaceAction.instance\position" intvalue="2000"/>
+    <attr name="Actions\Edit\org-openide-actions-UndoAction.instance\position" intvalue="2100"/>
+
+    <folder name="Actions">
+        <folder name="File">
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveAsAction.instance">
+                <attr name="position" intvalue="700"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveAllAction.instance">
+                <attr name="position" intvalue="800"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-ImportAction.instance">
+                <attr name="position" intvalue="1000"/>
+            </file>
+        </folder>
+        <folder name="Edit">
+
+            <file name="com-sun-hotspot-igv-coordinator-actions-RemoveAction.instance">
+                <attr name="position" intvalue="1200"/>
+            </file>
+        </folder>
+        <folder name="Window">
+            <file name="com-sun-hotspot-igv-coordinator-actions-OutlineAction.instance"/>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="File">
+            <file name="com-sun-hotspot-igv-coordinator-actions-ImportAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-ImportAction.instance"/>
+                <attr name="position" intvalue="100"/>
+            </file>
+            <file name="MySeparator2.instance">
+                <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
+                <attr name="position" intvalue="300"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveAsAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-SaveAsAction.instance"/>
+                <attr name="position" intvalue="300"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveAllAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-coordinator-actions-SaveAllAction.instance"/>
+                <attr name="position" intvalue="400"/>
+            </file>
+            <file name="MySeparator3.instance">
+                <attr name="instanceClass" stringvalue="javax.swing.JSeparator"/>
+                <attr name="position" intvalue="500"/>
+            </file>
+
+            <file name="org-netbeans-modules-openfile-OpenFileAction.instance_hidden"/>
+            <file name="org-openide-actions-PageSetupAction.instance_hidden"/>
+            <file name="org-openide-actions-PrintAction.instance_hidden"/>
+            <file name="org-openide-actions-SaveAction.instance_hidden"/>
+            <file name="org-openide-actions-SaveAllAction.instance_hidden"/>
+            <file name="org-openide-actions-SaveAsAction.shadow_hidden"/>
+        </folder>
+        <folder name="Edit">
+            <file name="com-sun-hotspot-igv-coordinator-actions-SaveFilterSettingsAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Edit/com-sun-hotspot-igv-coordinator-actions-SaveFilterSettingsAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-coordinator-actions-RemoveAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Edit/com-sun-hotspot-igv-coordinator-actions-RemoveAction.instance"/>
+            </file>
+            <file name="org-netbeans-core-actions-JumpNextAction.shadow_hidden"/>
+            <file name="org-netbeans-core-actions-JumpPrevAction.shadow_hidden"/>
+            <file name="org-openide-actions-CutAction.instance_hidden"/>
+            <file name="org-openide-actions-CopyAction.instance_hidden"/>
+            <file name="org-openide-actions-PasteAction.instance_hidden"/>
+            <file name="org-openide-actions-DeleteAction.instance_hidden"/>
+            <file name="org-openide-actions-FindAction.instance_hidden"/>
+            <file name="org-openide-actions-ReplaceAction.instance_hidden"/>
+            <file name="org-openide-actions-JumpNextAction.shadow_hidden"/>
+            <file name="org-openide-actions-JumpPrevAction.shadow_hidden"/>
+        </folder>
+        <file name="GoTo_hidden"/>
+        <folder name="View">
+            <file name="Separator1.instance_hidden"/>
+            <file name="Separator2.instance_hidden"/>
+            <file name="org-netbeans-core-actions-HTMLViewAction.instance_hidden"/>
+            <file name="org-netbeans-core-actions-LogAction.instance_hidden"/>
+            <file name="org-netbeans-core-windows-actions-ToolbarsListAction.instance_hidden"/>
+        </folder>
+        <folder name="Window">
+            <file name="OutlineAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-coordinator-actions-OutlineAction.instance"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Toolbars">
+        <file name="Standard.xml" url="StandardConfiguration.xml"/>
+    </folder>
+    <folder name="Windows2">
+        <folder name="Components">
+            <file name="OutlineTopComponent.settings" url="OutlineTopComponentSettings.xml"/>
+        </folder>
+        <folder name="Modes">
+            <file name="customLeft.wsmode" url="customLeftWsmode.xml"/>
+            <folder name="customLeft">
+                <file name="OutlineTopComponent.wstcref" url="OutlineTopComponentWstcref.xml"/>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.data" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.data.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.data
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/data/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.data-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=a403efd8
+build.xml.script.CRC32=b87f73ba
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=a403efd8
+nbproject/build-impl.xml.script.CRC32=cc649146
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages>
+                <package>com.sun.hotspot.igv.data</package>
+                <package>com.sun.hotspot.igv.data.serialization</package>
+                <package>com.sun.hotspot.igv.data.services</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Data
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ChangedEvent<T> extends Event<ChangedListener<T>> {
+
+    private T object;
+
+    public ChangedEvent() {
+    }
+
+    public ChangedEvent(T object) {
+        this.object = object;
+    }
+
+    protected void fire(ChangedListener<T> l) {
+        l.changed(object);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ChangedEventProvider<T> {
+
+    public ChangedEvent<T> getChangedEvent();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ChangedListener<T> {
+
+    public void changed(T source);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class Event<L> {
+
+    private List<L> listener;
+
+    public Event() {
+        listener = new ArrayList<L>();
+    }
+
+    public void addListener(L l) {
+        listener.add(l);
+    }
+
+    public void removeListener(L l) {
+        listener.remove(l);
+    }
+
+    public void fire() {
+        List<L> tmpList = new ArrayList<L>(listener);
+        for (L l : tmpList) {
+            fire(l);
+        }
+    }
+
+    protected abstract void fire(L l);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphDocument extends Properties.Object implements ChangedEventProvider<GraphDocument> {
+
+    private List<Group> groups;
+    private ChangedEvent<GraphDocument> changedEvent;
+
+    public GraphDocument() {
+        groups = new ArrayList<Group>();
+        changedEvent = new ChangedEvent<GraphDocument>(this);
+    }
+
+    public void clear() {
+        groups.clear();
+        getChangedEvent().fire();
+    }
+
+    public ChangedEvent<GraphDocument> getChangedEvent() {
+        return changedEvent;
+    }
+
+    public List<Group> getGroups() {
+        return Collections.unmodifiableList(groups);
+    }
+
+    public void addGroup(Group group) {
+        group.setDocument(this);
+        groups.add(group);
+        getChangedEvent().fire();
+    }
+
+    public void removeGroup(Group group) {
+        if (groups.contains(group)) {
+            group.setDocument(null);
+            groups.remove(group);
+            getChangedEvent().fire();
+        }
+    }
+
+    public void addGraphDocument(GraphDocument document) {
+        for (Group g : document.groups) {
+            this.addGroup(g);
+        }
+        document.clear();
+        getChangedEvent().fire();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append("GraphDocument: " + getProperties().toString() + " \n\n");
+        for (Group g : getGroups()) {
+            sb.append(g.toString());
+            sb.append("\n\n");
+        }
+
+        return sb.toString();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,141 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.Properties;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Group extends Properties.Object implements ChangedEventProvider<Group> {
+
+    private List<InputGraph> graphs;
+    private transient ChangedEvent<Group> changedEvent;
+    private GraphDocument document;
+    private InputMethod method;
+    private String assembly;
+
+    public Group() {
+        graphs = new ArrayList<InputGraph>();
+        init();
+    }
+
+    private void init() {
+        changedEvent = new ChangedEvent<Group>(this);
+    }
+
+    public void fireChangedEvent() {
+        changedEvent.fire();
+    }
+
+    public void setAssembly(String s) {
+        this.assembly = s;
+    }
+
+    public String getAssembly() {
+        return assembly;
+    }
+
+    public void setMethod(InputMethod method) {
+        this.method = method;
+    }
+
+    public InputMethod getMethod() {
+        return method;
+    }
+
+    void setDocument(GraphDocument document) {
+        this.document = document;
+    }
+
+    public GraphDocument getDocument() {
+        return document;
+    }
+
+    public ChangedEvent<Group> getChangedEvent() {
+        return changedEvent;
+    }
+
+    public List<InputGraph> getGraphs() {
+        return Collections.unmodifiableList(graphs);
+    }
+
+    public void addGraph(InputGraph g) {
+        assert g != null;
+        assert !graphs.contains(g);
+        graphs.add(g);
+        changedEvent.fire();
+    }
+
+    public void removeGraph(InputGraph g) {
+        int index = graphs.indexOf(g);
+        if (index != -1) {
+            graphs.remove(g);
+            changedEvent.fire();
+        }
+    }
+
+    public Set<Integer> getAllNodes() {
+        Set<Integer> result = new HashSet<Integer>();
+        for (InputGraph g : graphs) {
+            Set<Integer> ids = g.getNodesAsSet();
+            result.addAll(g.getNodesAsSet());
+            for (Integer i : ids) {
+                result.add(-i);
+            }
+        }
+        return result;
+    }
+
+    public InputGraph getLastAdded() {
+        if (graphs.size() == 0) {
+            return null;
+        }
+        return graphs.get(graphs.size() - 1);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Group " + getProperties().toString() + "\n");
+        for (InputGraph g : graphs) {
+            sb.append(g.toString());
+            sb.append("\n");
+        }
+        return sb.toString();
+    }
+
+    public String getName() {
+        return getProperties().get("name");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,140 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBlock {
+
+    private List<InputNode> nodes;
+    private List<String> successorNames;
+    private String name;
+    private InputGraph graph;
+    private Rectangle bounds;
+    private Set<InputBlock> successors;
+    private Set<InputBlock> predecessors;
+    private Set<InputBlockEdge> inputs;
+    private Set<InputBlockEdge> outputs;
+
+    public InputBlock(InputGraph graph, String name) {
+        this.graph = graph;
+        this.name = name;
+        nodes = new ArrayList<InputNode>();
+        successorNames = new ArrayList<String>();
+        successors = new HashSet<InputBlock>();
+        predecessors = new HashSet<InputBlock>();
+        inputs = new HashSet<InputBlockEdge>();
+        outputs = new HashSet<InputBlockEdge>();
+    }
+
+    public void removeSuccessor(InputBlock b) {
+        if (successors.contains(b)) {
+            successors.remove(b);
+            b.predecessors.remove(this);
+            InputBlockEdge e = new InputBlockEdge(this, b);
+            assert outputs.contains(e);
+            outputs.remove(e);
+            assert b.inputs.contains(e);
+            b.inputs.remove(e);
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String s) {
+        name = s;
+    }
+
+    public List<InputNode> getNodes() {
+        return Collections.unmodifiableList(nodes);
+    }
+
+    public void addNode(int id) {
+        InputNode n = graph.getNode(id);
+        assert n != null;
+        graph.setBlock(n, this);
+        addNode(graph.getNode(id));
+    }
+
+    public void addNode(InputNode node) {
+        assert !nodes.contains(node);
+        nodes.add(node);
+    }
+
+    public Set<InputBlock> getPredecessors() {
+        return Collections.unmodifiableSet(predecessors);
+    }
+
+    public Set<InputBlock> getSuccessors() {
+        return Collections.unmodifiableSet(successors);
+    }
+
+    public Set<InputBlockEdge> getInputs() {
+        return Collections.unmodifiableSet(inputs);
+    }
+
+    public Set<InputBlockEdge> getOutputs() {
+        return Collections.unmodifiableSet(outputs);
+    }
+
+    // resolveBlockLinks must be called afterwards
+    public void addSuccessor(String name) {
+        successorNames.add(name);
+    }
+
+    public void resolveBlockLinks() {
+        for (String s : successorNames) {
+            InputBlock b = graph.getBlock(s);
+            addSuccessor(b);
+        }
+
+        successorNames.clear();
+    }
+
+    public void addSuccessor(InputBlock b) {
+        if (!successors.contains(b)) {
+            successors.add(b);
+            b.predecessors.add(this);
+            InputBlockEdge e = new InputBlockEdge(this, b);
+            outputs.add(e);
+            b.inputs.add(e);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return this.getName();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBlockEdge {
+
+    private InputBlock from;
+    private InputBlock to;
+
+    public InputBlockEdge(InputBlock from, InputBlock to) {
+        assert from != null;
+        assert to != null;
+        this.from = from;
+        this.to = to;
+    }
+
+    public InputBlock getFrom() {
+        return from;
+    }
+
+    public InputBlock getTo() {
+        return to;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof InputBlockEdge && obj != null) {
+            InputBlockEdge e = (InputBlockEdge) obj;
+            return e.from.equals(from) && e.to.equals(to);
+        }
+        return super.equals(obj);
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = from.hashCode();
+        hash = 59 * hash + to.hashCode();
+        return hash;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputBytecode {
+
+    private int bci;
+    private String name;
+    private InputMethod inlined;
+
+    public InputBytecode(int bci, String name) {
+        this.bci = bci;
+        this.name = name;
+    }
+
+    public InputMethod getInlined() {
+        return inlined;
+    }
+
+    public void setInlined(InputMethod inlined) {
+        this.inlined = inlined;
+    }
+
+    public int getBci() {
+        return bci;
+    }
+
+    public String getName() {
+        return name;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputEdge {
+
+    public enum State {
+
+        SAME,
+        NEW,
+        DELETED
+    }
+    private char toIndex;
+    private int from;
+    private int to;
+    private State state;
+
+    public InputEdge(char toIndex, int from, int to) {
+        this.toIndex = toIndex;
+        this.from = from;
+        this.to = to;
+        this.state = State.SAME;
+    }
+
+    public State getState() {
+        return state;
+    }
+
+    public void setState(State x) {
+        this.state = x;
+    }
+
+    public char getToIndex() {
+        return toIndex;
+    }
+
+    public String getName() {
+        return "in" + toIndex;
+    }
+
+    public int getFrom() {
+        return from;
+    }
+
+    public int getTo() {
+        return to;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == null || !(o instanceof InputEdge)) {
+            return false;
+        }
+        InputEdge conn2 = (InputEdge) o;
+        return conn2.toIndex == toIndex && conn2.from == from && conn2.to == to;
+    }
+
+    @Override
+    public String toString() {
+        return "Edge from " + from + " to " + to + "(" + (int) toIndex + ") ";
+    }
+
+    @Override
+    public int hashCode() {
+        return (from << 20 | to << 8 | toIndex);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,249 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.Properties;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputGraph extends Properties.Object {
+
+    private Map<Integer, InputNode> nodes;
+    private Set<InputEdge> edges;
+    private Group parent;
+    private Map<String, InputBlock> blocks;
+    private Map<Integer, InputBlock> nodeToBlock;
+    private boolean isDifferenceGraph;
+
+    public InputGraph(Group parent) {
+        this(parent, null);
+    }
+
+    public InputGraph(Group parent, InputGraph last) {
+        this(parent, last, "");
+    }
+
+    private void clearBlocks() {
+        blocks.clear();
+        nodeToBlock.clear();
+    }
+
+    public InputGraph(Group parent, InputGraph last, String name) {
+        this.parent = parent;
+        setName(name);
+        nodes = new Hashtable<Integer, InputNode>();
+        edges = new HashSet<InputEdge>();
+        blocks = new Hashtable<String, InputBlock>();
+        nodeToBlock = new Hashtable<Integer, InputBlock>();
+        if (last != null) {
+
+            for (InputNode n : last.getNodes()) {
+                addNode(n);
+            }
+
+            for (InputEdge c : last.getEdges()) {
+                addEdge(c);
+            }
+        }
+    }
+
+    public void schedule(Collection<InputBlock> newBlocks) {
+        clearBlocks();
+        InputBlock noBlock = new InputBlock(this, "no block");
+        Set<InputNode> scheduledNodes = new HashSet<InputNode>();
+
+        for (InputBlock b : newBlocks) {
+            for (InputNode n : b.getNodes()) {
+                assert !scheduledNodes.contains(n);
+                scheduledNodes.add(n);
+            }
+        }
+
+        for (InputNode n : this.getNodes()) {
+            assert nodes.get(n.getId()) == n;
+            if (!scheduledNodes.contains(n)) {
+                noBlock.addNode(n.getId());
+            }
+        }
+
+        if (noBlock.getNodes().size() != 0) {
+            newBlocks.add(noBlock);
+        }
+        for (InputBlock b : newBlocks) {
+            addBlock(b);
+        }
+
+        for (InputNode n : this.getNodes()) {
+            assert this.getBlock(n) != null;
+        }
+    }
+
+    public void setBlock(InputNode node, InputBlock block) {
+        nodeToBlock.put(node.getId(), block);
+    }
+
+    public InputBlock getBlock(int nodeId) {
+        return nodeToBlock.get(nodeId);
+    }
+
+    public InputBlock getBlock(InputNode node) {
+        return getBlock(node.getId());
+    }
+
+    public InputGraph getNext() {
+        List<InputGraph> list = parent.getGraphs();
+        if (!list.contains(this)) {
+            return null;
+        }
+        int index = list.indexOf(this);
+        if (index == list.size() - 1) {
+            return null;
+        } else {
+            return list.get(index + 1);
+        }
+    }
+
+    public InputGraph getPrev() {
+        List<InputGraph> list = parent.getGraphs();
+        if (!list.contains(this)) {
+            return null;
+        }
+        int index = list.indexOf(this);
+        if (index == 0) {
+            return null;
+        } else {
+            return list.get(index - 1);
+        }
+    }
+
+    public String getName() {
+        return getProperties().get("name");
+    }
+
+    public String getAbsoluteName() {
+        String result = getName();
+        if (this.parent != null) {
+            result = parent.getName() + ": " + result;
+        }
+        return result;
+    }
+
+    public Collection<InputNode> getNodes() {
+        return Collections.unmodifiableCollection(nodes.values());
+    }
+
+    public Set<Integer> getNodesAsSet() {
+        return Collections.unmodifiableSet(nodes.keySet());
+    }
+
+    public Collection<InputBlock> getBlocks() {
+        return Collections.unmodifiableCollection(blocks.values());
+    }
+
+    public void addNode(InputNode node) {
+        nodes.put(node.getId(), node);
+    }
+
+    public InputNode getNode(int id) {
+        return nodes.get(id);
+    }
+
+    public InputNode removeNode(int index) {
+        return nodes.remove(index);
+    }
+
+    public Set<InputEdge> getEdges() {
+        return Collections.unmodifiableSet(edges);
+    }
+
+    public void removeEdge(InputEdge c) {
+        assert edges.contains(c);
+        edges.remove(c);
+        assert !edges.contains(c);
+    }
+
+    public void addEdge(InputEdge c) {
+        assert !edges.contains(c);
+        edges.add(c);
+        assert edges.contains(c);
+    }
+
+    public Group getGroup() {
+        return parent;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Graph " + getName() + " " + getProperties().toString() + "\n");
+        for (InputNode n : nodes.values()) {
+            sb.append(n.toString());
+            sb.append("\n");
+        }
+
+        for (InputEdge c : edges) {
+            sb.append(c.toString());
+            sb.append("\n");
+        }
+        return sb.toString();
+    }
+
+    public void addBlock(InputBlock b) {
+        blocks.put(b.getName(), b);
+        for (InputNode n : b.getNodes()) {
+            this.nodeToBlock.put(n.getId(), b);
+        }
+    }
+
+    public void resolveBlockLinks() {
+        for (InputBlock b : blocks.values()) {
+            b.resolveBlockLinks();
+        }
+    }
+
+    public void setName(String s) {
+        getProperties().setProperty("name", s);
+    }
+
+    public InputBlock getBlock(String s) {
+        return blocks.get(s);
+    }
+
+    public boolean isDifferenceGraph() {
+        return this.isDifferenceGraph;
+    }
+
+    public void setIsDifferenceGraph(boolean b) {
+        isDifferenceGraph = b;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,127 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import com.sun.hotspot.igv.data.Properties;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputMethod extends Properties.Object {
+
+    private String name;
+    private int bci;
+    private String shortName;
+    private List<InputMethod> inlined;
+    private InputMethod parentMethod;
+    private Group group;
+    private List<InputBytecode> bytecodes;
+
+    /** Creates a new instance of InputMethod */
+    public InputMethod(Group parent, String name, String shortName, int bci) {
+        this.group = parent;
+        this.name = name;
+        this.bci = bci;
+        this.shortName = shortName;
+        inlined = new ArrayList<InputMethod>();
+        bytecodes = new ArrayList<InputBytecode>();
+    }
+
+    public List<InputBytecode> getBytecodes() {
+        return Collections.unmodifiableList(bytecodes);
+    }
+
+    public List<InputMethod> getInlined() {
+        return Collections.unmodifiableList(inlined);
+    }
+
+    public void addInlined(InputMethod m) {
+
+        // assert bci unique
+        for (InputMethod m2 : inlined) {
+            assert m2.getBci() != m.getBci();
+        }
+
+        inlined.add(m);
+        assert m.parentMethod == null;
+        m.parentMethod = this;
+
+        for (InputBytecode bc : bytecodes) {
+            if (bc.getBci() == m.getBci()) {
+                bc.setInlined(m);
+            }
+        }
+    }
+
+    public Group getGroup() {
+        return group;
+    }
+
+    public String getShortName() {
+        return shortName;
+    }
+
+    public void setBytecodes(String text) {
+
+        String[] strings = text.split("\n");
+        int oldNumber = -1;
+        for (String s : strings) {
+
+            if (s.length() > 0 && Character.isDigit(s.charAt(0))) {
+                s = s.trim();
+                int spaceIndex = s.indexOf(' ');
+                String numberString = s.substring(0, spaceIndex);
+                String tmpName = s.substring(spaceIndex + 1, s.length());
+
+                int number = -1;
+                number = Integer.parseInt(numberString);
+
+                // assert correct order of bytecodes
+                assert number > oldNumber;
+
+                InputBytecode bc = new InputBytecode(number, tmpName);
+                bytecodes.add(bc);
+
+                for (InputMethod m : inlined) {
+                    if (m.getBci() == number) {
+                        bc.setInlined(m);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getBci() {
+        return bci;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputNode extends Properties.Object {
+
+    private int id;
+
+    public InputNode(InputNode n) {
+        super(n);
+        setId(n.id);
+    }
+
+    public InputNode(int id) {
+        setId(id);
+    }
+
+    public void setId(int id) {
+        this.id = id;
+        getProperties().setProperty("id", "" + id);
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof InputNode)) {
+            return false;
+        }
+        InputNode n = (InputNode) o;
+        if (n.id != id) {
+            return false;
+        }
+        return getProperties().equals(n.getProperties());
+    }
+
+    @Override
+    public int hashCode() {
+        return id;
+    }
+
+    @Override
+    public String toString() {
+        return "Node " + id + " " + getProperties().toString();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,72 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Pair<L, R> {
+
+    private L l;
+    private R r;
+
+    public Pair() {
+    }
+
+    public Pair(L l, R r) {
+        this.l = l;
+        this.r = r;
+    }
+
+    public L getLeft() {
+        return l;
+    }
+
+    public void setLeft(L l) {
+        this.l = l;
+    }
+
+    public R getRight() {
+        return r;
+    }
+
+    public void setRight(R r) {
+        this.r = r;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof Pair)) {
+            return false;
+        }
+        Pair obj = (Pair) o;
+        return l.equals(obj.l) && r.equals(obj.r);
+    }
+
+    @Override
+    public int hashCode() {
+        return l.hashCode() * 71 + r.hashCode();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,288 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Properties implements Serializable {
+
+    public static final long serialVersionUID = 1L;
+    private Map<String, Property> map;
+
+    public Properties() {
+        map = new HashMap<String, Property>(5);
+    }
+
+    @Override
+    public boolean equals(java.lang.Object o) {
+        if (!(o instanceof Properties)) {
+            return false;
+        }
+
+        Properties p = (Properties) o;
+
+        if (getProperties().size() != p.getProperties().size()) {
+            return false;
+        }
+        for (Property prop : getProperties()) {
+            String value = p.get(prop.getName());
+            if (value == null || !value.equals(prop.getValue())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 5;
+        hash = 83 * hash + (this.map != null ? this.map.hashCode() : 0);
+        return hash;
+    }
+
+    public Properties(String name, String value) {
+        this();
+        this.add(new Property(name, value));
+    }
+
+    public Properties(String name, String value, String name1, String value1) {
+        this(name, value);
+        this.add(new Property(name1, value1));
+    }
+
+    public Properties(String name, String value, String name1, String value1, String name2, String value2) {
+        this(name, value, name1, value1);
+        this.add(new Property(name2, value2));
+    }
+
+    public Properties(Properties p) {
+        map = new HashMap<String, Property>(p.map);
+    }
+
+    public static class Object implements Provider {
+
+        private Properties properties;
+
+        public Object() {
+            properties = new Properties();
+        }
+
+        public Object(Properties.Object object) {
+            properties = new Properties(object.getProperties());
+        }
+
+        public Properties getProperties() {
+            return properties;
+        }
+    }
+
+    public interface PropertyMatcher {
+
+        String getName();
+
+        boolean match(String value);
+    }
+
+    public static class InvertPropertyMatcher implements PropertyMatcher {
+
+        private PropertyMatcher matcher;
+
+        public InvertPropertyMatcher(PropertyMatcher matcher) {
+            this.matcher = matcher;
+        }
+
+        public String getName() {
+            return matcher.getName();
+        }
+
+        public boolean match(String p) {
+            return !matcher.match(p);
+        }
+    }
+
+    public static class StringPropertyMatcher implements PropertyMatcher {
+
+        private String name;
+        private String value;
+
+        public StringPropertyMatcher(String name, String value) {
+            this.name = name;
+            this.value = value;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public boolean match(String p) {
+            return p.equals(value);
+        }
+    }
+
+    public static class RegexpPropertyMatcher implements PropertyMatcher {
+
+        private String name;
+        private Pattern valuePattern;
+
+        public RegexpPropertyMatcher(String name, String value) {
+            this.name = name;
+            valuePattern = Pattern.compile(value);
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public boolean match(String p) {
+            Matcher m = valuePattern.matcher(p);
+            return m.matches();
+        }
+    }
+
+    public Property selectSingle(PropertyMatcher matcher) {
+
+        Property p = this.map.get(matcher.getName());
+        if (p == null) {
+            return null;
+        }
+        if (matcher.match(p.getValue())) {
+            return p;
+        } else {
+            return null;
+        }
+    }
+
+    public interface Provider {
+
+        public Properties getProperties();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[");
+        for (Property p : map.values()) {
+            sb.append(p.toString());
+        }
+        return sb.append("]").toString();
+    }
+
+    public static class PropertySelector<T extends Properties.Provider> {
+
+        private Collection<T> objects;
+
+        public PropertySelector(Collection<T> objects) {
+            this.objects = objects;
+        }
+
+        public T selectSingle(final String name, final String value) {
+            return selectSingle(new StringPropertyMatcher(name, value));
+        }
+
+        public T selectSingle(PropertyMatcher matcher) {
+
+            for (T t : objects) {
+                Property p = t.getProperties().selectSingle(matcher);
+                if (p != null) {
+                    return t;
+                }
+            }
+
+            return null;
+        }
+
+        public List<T> selectMultiple(final String name, final String value) {
+            return selectMultiple(new StringPropertyMatcher(name, value));
+        }
+
+        public List<T> selectMultiple(PropertyMatcher matcher) {
+            List<T> result = new ArrayList<T>();
+            for (T t : objects) {
+                Property p = t.getProperties().selectSingle(matcher);
+                if (p != null) {
+                    result.add(t);
+                }
+            }
+            return result;
+        }
+    }
+
+    public String get(String key) {
+        Property p = map.get(key);
+        if (p == null) {
+            return null;
+        } else {
+            return p.getValue();
+        }
+    }
+
+    public String getProperty(String string) {
+        return get(string);
+    }
+
+    public Property setProperty(String name, String value) {
+
+        if (value == null) {
+            // remove this property
+            return map.remove(name);
+        } else {
+            Property p = map.get(name);
+            if (p == null) {
+                p = new Property(name, value);
+                map.put(name, p);
+            } else {
+                p.setValue(value);
+            }
+            return p;
+        }
+    }
+
+    public Collection<Property> getProperties() {
+        return Collections.unmodifiableCollection(map.values());
+    }
+
+    public void add(Properties properties) {
+        for (Property p : properties.getProperties()) {
+            add(p);
+        }
+    }
+
+    public void add(Property property) {
+        assert property.getName() != null;
+        assert property.getValue() != null;
+        map.put(property.getName(), property);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Property implements Serializable {
+
+    public static final long serialVersionUID = 1L;
+    private String name;
+    private String value;
+
+    public Property() {
+        this(null, null);
+    }
+
+    public Property(Property p) {
+        this(p.getName(), p.getValue());
+    }
+
+    public Property(String name) {
+        this(name, null);
+    }
+
+    public Property(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setName(String s) {
+        this.name = s;
+    }
+
+    public void setValue(String s) {
+        this.value = s;
+    }
+
+    @Override
+    public String toString() {
+        return name + " = " + value + "; ";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,422 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.serialization.XMLParser.ElementHandler;
+import com.sun.hotspot.igv.data.serialization.XMLParser.HandoverElementHandler;
+import com.sun.hotspot.igv.data.serialization.XMLParser.ParseMonitor;
+import com.sun.hotspot.igv.data.serialization.XMLParser.TopElementHandler;
+import java.io.IOException;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Parser {
+
+    public static final String INDENT = "  ";
+    public static final String TOP_ELEMENT = "graphDocument";
+    public static final String GROUP_ELEMENT = "group";
+    public static final String GRAPH_ELEMENT = "graph";
+    public static final String ROOT_ELEMENT = "graphDocument";
+    public static final String PROPERTIES_ELEMENT = "properties";
+    public static final String EDGES_ELEMENT = "edges";
+    public static final String PROPERTY_ELEMENT = "p";
+    public static final String EDGE_ELEMENT = "edge";
+    public static final String NODE_ELEMENT = "node";
+    public static final String NODES_ELEMENT = "nodes";
+    public static final String REMOVE_EDGE_ELEMENT = "removeEdge";
+    public static final String REMOVE_NODE_ELEMENT = "removeNode";
+    public static final String METHOD_NAME_PROPERTY = "name";
+    public static final String METHOD_IS_PUBLIC_PROPERTY = "public";
+    public static final String METHOD_IS_STATIC_PROPERTY = "static";
+    public static final String TRUE_VALUE = "true";
+    public static final String NODE_NAME_PROPERTY = "name";
+    public static final String EDGE_NAME_PROPERTY = "name";
+    public static final String NODE_ID_PROPERTY = "id";
+    public static final String FROM_PROPERTY = "from";
+    public static final String TO_PROPERTY = "to";
+    public static final String PROPERTY_NAME_PROPERTY = "name";
+    public static final String GRAPH_NAME_PROPERTY = "name";
+    public static final String TO_INDEX_PROPERTY = "index";
+    public static final String METHOD_ELEMENT = "method";
+    public static final String INLINE_ELEMENT = "inline";
+    public static final String BYTECODES_ELEMENT = "bytecodes";
+    public static final String METHOD_BCI_PROPERTY = "bci";
+    public static final String METHOD_SHORT_NAME_PROPERTY = "shortName";
+    public static final String CONTROL_FLOW_ELEMENT = "controlFlow";
+    public static final String BLOCK_NAME_PROPERTY = "name";
+    public static final String BLOCK_ELEMENT = "block";
+    public static final String SUCCESSORS_ELEMENT = "successors";
+    public static final String SUCCESSOR_ELEMENT = "successor";
+    public static final String ASSEMBLY_ELEMENT = "assembly";
+    public static final String DIFFERENCE_PROPERTY = "difference";
+    private TopElementHandler xmlDocument = new TopElementHandler();
+    private boolean difference;
+    private GroupCallback groupCallback;
+    // <graphDocument>
+    private ElementHandler<GraphDocument, Object> topHandler = new ElementHandler<GraphDocument, Object>(TOP_ELEMENT) {
+
+        @Override
+        protected GraphDocument start() throws SAXException {
+            return new GraphDocument();
+        }
+    };
+    // <group>
+    private ElementHandler<Group, GraphDocument> groupHandler = new XMLParser.ElementHandler<Group, GraphDocument>(GROUP_ELEMENT) {
+
+        @Override
+        protected Group start() throws SAXException {
+            Group group = new Group();
+            Parser.this.difference = false;
+            String differenceProperty = this.readAttribute(DIFFERENCE_PROPERTY);
+            if (differenceProperty != null && (differenceProperty.equals("1") || differenceProperty.equals("true"))) {
+                Parser.this.difference = true;
+            }
+
+            ParseMonitor monitor = getMonitor();
+            if (monitor != null) {
+                monitor.setState(group.getName());
+            }
+
+            return group;
+        }
+
+        @Override
+        protected void end(String text) throws SAXException {
+            if (groupCallback == null) {
+                getParentObject().addGroup(getObject());
+            }
+        }
+    };
+    private HandoverElementHandler<Group> assemblyHandler = new XMLParser.HandoverElementHandler<Group>(ASSEMBLY_ELEMENT, true) {
+
+        @Override
+        protected void end(String text) throws SAXException {
+            getParentObject().setAssembly(text);
+        }
+    };
+    // <method>
+    private ElementHandler<InputMethod, Group> methodHandler = new XMLParser.ElementHandler<InputMethod, Group>(METHOD_ELEMENT) {
+
+        @Override
+        protected InputMethod start() throws SAXException {
+
+            InputMethod method = parseMethod(this, getParentObject());
+            getParentObject().setMethod(method);
+            return method;
+        }
+    };
+
+    private InputMethod parseMethod(XMLParser.ElementHandler handler, Group group) throws SAXException {
+        String s = handler.readRequiredAttribute(METHOD_BCI_PROPERTY);
+        int bci = 0;
+        try {
+            bci = Integer.parseInt(s);
+        } catch (NumberFormatException e) {
+            throw new SAXException(e);
+        }
+        InputMethod method = new InputMethod(group, handler.readRequiredAttribute(METHOD_NAME_PROPERTY), handler.readRequiredAttribute(METHOD_SHORT_NAME_PROPERTY), bci);
+        return method;
+    }
+    // <bytecodes>
+    private HandoverElementHandler<InputMethod> bytecodesHandler = new XMLParser.HandoverElementHandler<InputMethod>(BYTECODES_ELEMENT, true) {
+
+        @Override
+        protected void end(String text) throws SAXException {
+            getParentObject().setBytecodes(text);
+        }
+    };
+    // <inlined>
+    private HandoverElementHandler<InputMethod> inlinedHandler = new XMLParser.HandoverElementHandler<InputMethod>(INLINE_ELEMENT);
+    // <inlined><method>
+    private ElementHandler<InputMethod, InputMethod> inlinedMethodHandler = new XMLParser.ElementHandler<InputMethod, InputMethod>(METHOD_ELEMENT) {
+
+        @Override
+        protected InputMethod start() throws SAXException {
+            InputMethod method = parseMethod(this, getParentObject().getGroup());
+            getParentObject().addInlined(method);
+            return method;
+        }
+    };
+    // <graph>
+    private ElementHandler<InputGraph, Group> graphHandler = new XMLParser.ElementHandler<InputGraph, Group>(GRAPH_ELEMENT) {
+
+        private InputGraph graph;
+
+        @Override
+        protected InputGraph start() throws SAXException {
+
+            String name = readAttribute(GRAPH_NAME_PROPERTY);
+            InputGraph previous = getParentObject().getLastAdded();
+            if (!difference) {
+                previous = null;
+            }
+            InputGraph curGraph = new InputGraph(getParentObject(), previous, name);
+            getParentObject().addGraph(curGraph);
+            this.graph = curGraph;
+            return curGraph;
+        }
+
+        @Override
+        protected void end(String text) throws SAXException {
+            graph.resolveBlockLinks();
+        }
+    };
+    // <nodes>
+    private HandoverElementHandler<InputGraph> nodesHandler = new HandoverElementHandler<InputGraph>(NODES_ELEMENT);
+    // <controlFlow>
+    private HandoverElementHandler<InputGraph> controlFlowHandler = new HandoverElementHandler<InputGraph>(CONTROL_FLOW_ELEMENT);
+    // <block>
+    private ElementHandler<InputBlock, InputGraph> blockHandler = new ElementHandler<InputBlock, InputGraph>(BLOCK_ELEMENT) {
+
+        @Override
+        protected InputBlock start() throws SAXException {
+            InputGraph graph = getParentObject();
+            String name = readRequiredAttribute(BLOCK_NAME_PROPERTY);
+            InputBlock b = new InputBlock(getParentObject(), name);
+            graph.addBlock(b);
+            return b;
+        }
+    };
+    // <nodes>
+    private HandoverElementHandler<InputBlock> blockNodesHandler = new HandoverElementHandler<InputBlock>(NODES_ELEMENT);
+    // <node>
+    private ElementHandler<InputBlock, InputBlock> blockNodeHandler = new ElementHandler<InputBlock, InputBlock>(NODE_ELEMENT) {
+
+        @Override
+        protected InputBlock start() throws SAXException {
+            String s = readRequiredAttribute(NODE_ID_PROPERTY);
+
+            int id = 0;
+            try {
+                id = Integer.parseInt(s);
+            } catch (NumberFormatException e) {
+                throw new SAXException(e);
+            }
+            getParentObject().addNode(id);
+            return getParentObject();
+        }
+    };
+    // <successors>
+    private HandoverElementHandler<InputBlock> successorsHandler = new HandoverElementHandler<InputBlock>(SUCCESSORS_ELEMENT);
+    // <successor>
+    private ElementHandler<InputBlock, InputBlock> successorHandler = new ElementHandler<InputBlock, InputBlock>(SUCCESSOR_ELEMENT) {
+
+        @Override
+        protected InputBlock start() throws SAXException {
+            String name = readRequiredAttribute(BLOCK_NAME_PROPERTY);
+            getParentObject().addSuccessor(name);
+            return getParentObject();
+        }
+    };
+    // <node>
+    private ElementHandler<InputNode, InputGraph> nodeHandler = new ElementHandler<InputNode, InputGraph>(NODE_ELEMENT) {
+
+        @Override
+        protected InputNode start() throws SAXException {
+            String s = readRequiredAttribute(NODE_ID_PROPERTY);
+            int id = 0;
+            try {
+                id = Integer.parseInt(s);
+            } catch (NumberFormatException e) {
+                throw new SAXException(e);
+            }
+            InputNode node = new InputNode(id);
+            getParentObject().addNode(node);
+            return node;
+        }
+    };
+    // <removeNode>
+    private ElementHandler<InputNode, InputGraph> removeNodeHandler = new ElementHandler<InputNode, InputGraph>(REMOVE_NODE_ELEMENT) {
+
+        @Override
+        protected InputNode start() throws SAXException {
+            String s = readRequiredAttribute(NODE_ID_PROPERTY);
+            int id = 0;
+            try {
+                id = Integer.parseInt(s);
+            } catch (NumberFormatException e) {
+                throw new SAXException(e);
+            }
+            return getParentObject().removeNode(id);
+        }
+    };
+    // <graph>
+    private HandoverElementHandler<InputGraph> edgesHandler = new HandoverElementHandler<InputGraph>(EDGES_ELEMENT);
+
+    // Local class for edge elements
+    private static class EdgeElementHandler extends ElementHandler<InputEdge, InputGraph> {
+
+        public EdgeElementHandler(String name) {
+            super(name);
+        }
+
+        @Override
+        protected InputEdge start() throws SAXException {
+            int toIndex = 0;
+            int from = -1;
+            int to = -1;
+
+            try {
+                String toIndexString = readAttribute(TO_INDEX_PROPERTY);
+                if (toIndexString != null) {
+                    toIndex = Integer.parseInt(toIndexString);
+                }
+
+                from = Integer.parseInt(readRequiredAttribute(FROM_PROPERTY));
+                to = Integer.parseInt(readRequiredAttribute(TO_PROPERTY));
+            } catch (NumberFormatException e) {
+                throw new SAXException(e);
+            }
+
+
+            InputEdge conn = new InputEdge((char) toIndex, from, to);
+            return start(conn);
+        }
+
+        protected InputEdge start(InputEdge conn) throws SAXException {
+            return conn;
+        }
+    }
+    // <edge>
+    private EdgeElementHandler edgeHandler = new EdgeElementHandler(EDGE_ELEMENT) {
+
+        @Override
+        protected InputEdge start(InputEdge conn) throws SAXException {
+            getParentObject().addEdge(conn);
+            return conn;
+        }
+    };
+    // <removeEdge>
+    private EdgeElementHandler removeEdgeHandler = new EdgeElementHandler(REMOVE_EDGE_ELEMENT) {
+
+        @Override
+        protected InputEdge start(InputEdge conn) throws SAXException {
+            getParentObject().removeEdge(conn);
+            return conn;
+        }
+    };
+    // <properties>
+    private HandoverElementHandler<Properties.Provider> propertiesHandler = new HandoverElementHandler<Properties.Provider>(PROPERTIES_ELEMENT);
+    // <properties>
+    private HandoverElementHandler<Group> groupPropertiesHandler = new HandoverElementHandler<Group>(PROPERTIES_ELEMENT) {
+
+        @Override
+        public void end(String text) throws SAXException {
+            if (groupCallback != null) {
+                groupCallback.started(getParentObject());
+            }
+        }
+    };
+    // <property>
+    private ElementHandler<Property, Properties.Provider> propertyHandler = new XMLParser.ElementHandler<Property, Properties.Provider>(PROPERTY_ELEMENT, true) {
+
+        @Override
+        public Property start() throws SAXException {
+            String value = "";
+            String name = readRequiredAttribute(PROPERTY_NAME_PROPERTY).intern();
+            return getParentObject().getProperties().setProperty(name, value);
+        }
+
+        @Override
+        public void end(String text) {
+            getObject().setValue(text.trim().intern());
+        }
+    };
+
+    public Parser() {
+        this(null);
+    }
+
+    public Parser(GroupCallback groupCallback) {
+
+        this.groupCallback = groupCallback;
+
+        // Initialize dependencies
+        xmlDocument.addChild(topHandler);
+        topHandler.addChild(groupHandler);
+
+        groupHandler.addChild(methodHandler);
+        groupHandler.addChild(assemblyHandler);
+        groupHandler.addChild(graphHandler);
+
+        methodHandler.addChild(inlinedHandler);
+        methodHandler.addChild(bytecodesHandler);
+
+        inlinedHandler.addChild(inlinedMethodHandler);
+        inlinedMethodHandler.addChild(bytecodesHandler);
+        inlinedMethodHandler.addChild(inlinedHandler);
+
+        graphHandler.addChild(nodesHandler);
+        graphHandler.addChild(edgesHandler);
+        graphHandler.addChild(controlFlowHandler);
+
+        controlFlowHandler.addChild(blockHandler);
+
+        blockHandler.addChild(successorsHandler);
+        successorsHandler.addChild(successorHandler);
+        blockHandler.addChild(blockNodesHandler);
+        blockNodesHandler.addChild(blockNodeHandler);
+
+        nodesHandler.addChild(nodeHandler);
+        nodesHandler.addChild(removeNodeHandler);
+        edgesHandler.addChild(edgeHandler);
+        edgesHandler.addChild(removeEdgeHandler);
+
+        methodHandler.addChild(propertiesHandler);
+        inlinedMethodHandler.addChild(propertiesHandler);
+        topHandler.addChild(propertiesHandler);
+        groupHandler.addChild(groupPropertiesHandler);
+        graphHandler.addChild(propertiesHandler);
+        nodeHandler.addChild(propertiesHandler);
+        propertiesHandler.addChild(propertyHandler);
+        groupPropertiesHandler.addChild(propertyHandler);
+    }
+
+    // Returns a new GraphDocument object deserialized from an XML input source.
+    public GraphDocument parse(XMLReader reader, InputSource source, XMLParser.ParseMonitor monitor) throws SAXException {
+        reader.setContentHandler(new XMLParser(xmlDocument, monitor));
+        try {
+            reader.parse(source);
+        } catch (IOException ex) {
+            throw new SAXException(ex);
+        }
+
+        return topHandler.getObject();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,217 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.GraphDocument;
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputBytecode;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputMethod;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Printer {
+
+    public void export(Writer writer, GraphDocument document) {
+
+        XMLWriter xmlWriter = new XMLWriter(writer);
+
+        try {
+            export(xmlWriter, document);
+        } catch (IOException ex) {
+        }
+    }
+
+    private void export(XMLWriter xmlWriter, GraphDocument document) throws IOException {
+        xmlWriter.startTag(Parser.ROOT_ELEMENT);
+        xmlWriter.writeProperties(document.getProperties());
+        for (Group g : document.getGroups()) {
+            export(xmlWriter, g);
+        }
+
+        xmlWriter.endTag();
+        xmlWriter.flush();
+    }
+
+    private void export(XMLWriter writer, Group g) throws IOException {
+        Properties attributes = new Properties();
+        attributes.add(new Property("difference", Boolean.toString(true)));
+        writer.startTag(Parser.GROUP_ELEMENT, attributes);
+        writer.writeProperties(g.getProperties());
+
+        if (g.getMethod() != null) {
+            export(writer, g.getMethod());
+        }
+
+        InputGraph previous = null;
+        for (InputGraph graph : g.getGraphs()) {
+            export(writer, graph, previous, true);
+            previous = graph;
+        }
+
+        writer.endTag();
+    }
+
+    public void export(XMLWriter writer, InputGraph graph, InputGraph previous, boolean difference) throws IOException {
+
+        writer.startTag(Parser.GRAPH_ELEMENT);
+        writer.writeProperties(graph.getProperties());
+        writer.startTag(Parser.NODES_ELEMENT);
+
+        Set<InputNode> removed = new HashSet<InputNode>();
+        Set<InputNode> equal = new HashSet<InputNode>();
+
+        if (previous != null) {
+            for (InputNode n : previous.getNodes()) {
+                int id = n.getId();
+                InputNode n2 = graph.getNode(id);
+                if (n2 == null) {
+                    removed.add(n);
+                } else if (n.equals(n2)) {
+                    equal.add(n);
+                }
+            }
+        }
+
+        if (difference) {
+            for (InputNode n : removed) {
+                writer.simpleTag(Parser.REMOVE_NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, Integer.toString(n.getId())));
+            }
+        }
+
+        for (InputNode n : graph.getNodes()) {
+            if (!difference || !equal.contains(n)) {
+                writer.startTag(Parser.NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, Integer.toString(n.getId())));
+                writer.writeProperties(n.getProperties());
+                writer.endTag();
+            }
+        }
+
+        writer.endTag();
+
+        writer.startTag(Parser.EDGES_ELEMENT);
+        Set<InputEdge> removedEdges = new HashSet<InputEdge>();
+        Set<InputEdge> equalEdges = new HashSet<InputEdge>();
+
+        if (previous != null) {
+            for (InputEdge e : previous.getEdges()) {
+                if (graph.getEdges().contains(e)) {
+                    equalEdges.add(e);
+                } else {
+                    removedEdges.add(e);
+                }
+            }
+        }
+
+        if (difference) {
+            for (InputEdge e : removedEdges) {
+                writer.simpleTag(Parser.REMOVE_EDGE_ELEMENT, createProperties(e));
+            }
+        }
+
+        for (InputEdge e : graph.getEdges()) {
+            if (!difference || !equalEdges.contains(e)) {
+                if (!equalEdges.contains(e)) {
+                    writer.simpleTag(Parser.EDGE_ELEMENT, createProperties(e));
+                }
+            }
+        }
+
+        writer.endTag();
+
+        writer.startTag(Parser.CONTROL_FLOW_ELEMENT);
+        for (InputBlock b : graph.getBlocks()) {
+
+            writer.startTag(Parser.BLOCK_ELEMENT, new Properties(Parser.BLOCK_NAME_PROPERTY, b.getName()));
+
+            writer.startTag(Parser.SUCCESSORS_ELEMENT);
+            for (InputBlock s : b.getSuccessors()) {
+                writer.simpleTag(Parser.SUCCESSOR_ELEMENT, new Properties(Parser.BLOCK_NAME_PROPERTY, s.getName()));
+            }
+            writer.endTag();
+
+            writer.startTag(Parser.NODES_ELEMENT);
+            for (InputNode n : b.getNodes()) {
+                writer.simpleTag(Parser.NODE_ELEMENT, new Properties(Parser.NODE_ID_PROPERTY, n.getId() + ""));
+            }
+            writer.endTag();
+
+            writer.endTag();
+
+        }
+
+        writer.endTag();
+        writer.endTag();
+    }
+
+    private void export(XMLWriter w, InputMethod method) throws IOException {
+
+        w.startTag(Parser.METHOD_ELEMENT, new Properties(Parser.METHOD_BCI_PROPERTY, method.getBci() + "", Parser.METHOD_NAME_PROPERTY, method.getName(), Parser.METHOD_SHORT_NAME_PROPERTY, method.getShortName()));
+
+        w.writeProperties(method.getProperties());
+
+        if (method.getInlined().size() > 0) {
+            w.startTag(Parser.INLINE_ELEMENT);
+            for (InputMethod m : method.getInlined()) {
+                export(w, m);
+            }
+            w.endTag();
+        }
+
+        w.startTag(Parser.BYTECODES_ELEMENT);
+
+        StringBuilder b = new StringBuilder();
+        b.append("<![CDATA[\n");
+        for (InputBytecode code : method.getBytecodes()) {
+            b.append(code.getBci());
+            b.append(" ");
+            b.append(code.getName());
+            b.append("\n");
+
+        }
+        b.append("]]>");
+        w.write(b.toString());
+        w.endTag();
+        w.endTag();
+    }
+
+    private Properties createProperties(InputEdge edge) {
+        Properties p = new Properties();
+        p.setProperty(Parser.TO_INDEX_PROPERTY, Integer.toString(edge.getToIndex()));
+        p.setProperty(Parser.TO_PROPERTY, Integer.toString(edge.getTo()));
+        p.setProperty(Parser.FROM_PROPERTY, Integer.toString(edge.getFrom()));
+        return p;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,254 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.Property;
+import com.sun.hotspot.igv.data.Properties;
+import java.util.Hashtable;
+import java.util.Stack;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class XMLParser implements ContentHandler {
+
+    public static interface ParseMonitor {
+
+        public void setProgress(double d);
+
+        public void setState(String state);
+    }
+
+    public static class MissingAttributeException extends SAXException {
+
+        private String name;
+
+        public MissingAttributeException(String name) {
+            super("Missing attribute \"" + name + "\"");
+            this.name = name;
+        }
+
+        public String getAttributeName() {
+            return this.getMessage();
+        }
+    }
+
+    public static class HandoverElementHandler<P> extends ElementHandler<P, P> {
+
+        @Override
+        protected P start() throws SAXException {
+            return getParentObject();
+        }
+
+        public HandoverElementHandler(String name) {
+            super(name);
+        }
+
+        public HandoverElementHandler(String name, boolean needsText) {
+            super(name, needsText);
+        }
+    }
+
+    public static class TopElementHandler<P> extends ElementHandler<P, Object> {
+
+        public TopElementHandler() {
+            super(null);
+        }
+    }
+
+    public static class ElementHandler<T, P> {
+
+        private String name;
+        private T object;
+        private Attributes attr;
+        private StringBuilder currentText;
+        private ParseMonitor monitor;
+        private Hashtable<String, ElementHandler<?, ? super T>> hashtable;
+        private boolean needsText;
+        private ElementHandler<P, ?> parentElement;
+
+        public ElementHandler(String name) {
+            this(name, false);
+        }
+
+        public ElementHandler<P, ?> getParentElement() {
+            return parentElement;
+        }
+
+        public P getParentObject() {
+            return getParentElement().getObject();
+        }
+
+        protected boolean needsText() {
+            return needsText;
+        }
+
+        public ElementHandler(String name, boolean needsText) {
+            this.hashtable = new Hashtable<String, ElementHandler<?, ? super T>>();
+            this.name = name;
+            this.needsText = needsText;
+        }
+
+        public ParseMonitor getMonitor() {
+            return monitor;
+        }
+
+        public ElementHandler<?, ? super T> getChild(String name) {
+            return hashtable.get(name);
+        }
+
+        public void addChild(ElementHandler<?, ? super T> handler) {
+            assert handler != null;
+            hashtable.put(handler.getName(), handler);
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public T getObject() {
+            return object;
+        }
+
+        public String readAttribute(String name) {
+            return attr.getValue(name);
+        }
+
+        public String readRequiredAttribute(String name) throws SAXException {
+            String s = readAttribute(name);
+            if (s == null) {
+                throw new MissingAttributeException(name);
+            }
+            return s;
+        }
+
+        public void processAttributesAsProperties(Properties p) {
+            int length = attr.getLength();
+            for (int i = 0; i < length; i++) {
+                String val = attr.getValue(i).intern();
+                String localName = attr.getLocalName(i).intern();
+                p.add(new Property(val, localName));
+            }
+        }
+
+        public void startElement(ElementHandler<P, ?> parentElement, Attributes attr, ParseMonitor monitor) throws SAXException {
+            this.currentText = new StringBuilder();
+            this.attr = attr;
+            this.monitor = monitor;
+            this.parentElement = parentElement;
+            object = start();
+        }
+
+        protected T start() throws SAXException {
+            return null;
+        }
+
+        protected void end(String text) throws SAXException {
+
+        }
+
+        public void endElement() throws SAXException {
+            end(currentText.toString());
+        }
+
+        protected void text(char[] c, int start, int length) {
+            assert currentText != null;
+            currentText.append(c, start, length);
+        }
+    }
+    private Stack<ElementHandler> stack;
+    private ParseMonitor monitor;
+
+    public XMLParser(TopElementHandler rootHandler, ParseMonitor monitor) {
+        this.stack = new Stack<ElementHandler>();
+        this.monitor = monitor;
+        this.stack.push(rootHandler);
+    }
+
+    public void setDocumentLocator(Locator locator) {
+        if (monitor != null) {
+            monitor.setState("Starting parsing");
+        }
+    }
+
+    public void startDocument() throws SAXException {
+    }
+
+    public void endDocument() throws SAXException {
+    }
+
+    public void startPrefixMapping(String prefix, String uri) throws SAXException {
+    }
+
+    public void endPrefixMapping(String prefix) throws SAXException {
+    }
+
+    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+
+        assert !stack.isEmpty();
+        ElementHandler parent = stack.peek();
+        if (parent != null) {
+            ElementHandler child = parent.getChild(qName);
+            if (child != null) {
+                child.startElement(parent, atts, monitor);
+                stack.push(child);
+                return;
+            }
+        }
+
+        stack.push(null);
+    }
+
+    public void endElement(String uri, String localName, String qName) throws SAXException {
+        ElementHandler handler = stack.pop();
+        if (handler != null) {
+            handler.endElement();
+        }
+    }
+
+    public void characters(char[] ch, int start, int length) throws SAXException {
+
+        assert !stack.isEmpty();
+
+
+        ElementHandler top = stack.peek();
+        if (top != null && top.needsText()) {
+            top.text(ch, start, length);
+        }
+    }
+
+    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+    }
+
+    public void processingInstruction(String target, String data) throws SAXException {
+    }
+
+    public void skippedEntity(String name) throws SAXException {
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,128 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.data.serialization;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Stack;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class XMLWriter extends Writer {
+
+    private Writer inner;
+    private Stack<String> elementStack;
+
+    public XMLWriter(Writer inner) {
+        this.inner = inner;
+        elementStack = new Stack<String>();
+    }
+
+    @Override
+    public void write(char[] arr) throws IOException {
+        write(arr, 0, arr.length);
+    }
+
+    public void write(char[] cbuf, int off, int len) throws IOException {
+        for (int i = off; i < off + len; i++) {
+            char c = cbuf[i];
+            if (c == '>') {
+                inner.write("&gt;");
+            } else if (c == '<') {
+                inner.write("&lt;");
+            } else if (c == '&') {
+                inner.write("&amp;");
+            } else {
+                inner.write(c);
+            }
+        }
+    }
+
+    public void flush() throws IOException {
+        inner.flush();
+    }
+
+    public void close() throws IOException {
+        inner.close();
+    }
+
+    public void endTag() throws IOException {
+        inner.write("</" + elementStack.pop() + ">\n");
+    }
+
+    public void startTag(String name) throws IOException {
+        inner.write("<" + name + ">\n");
+        elementStack.push(name);
+    }
+
+    public void simpleTag(String name) throws IOException {
+        inner.write("<" + name + "/>\n");
+    }
+
+    public void startTag(String name, Properties attributes) throws IOException {
+        inner.write("<" + name);
+        elementStack.push(name);
+
+        for (Property p : attributes.getProperties()) {
+            inner.write(" " + p.getName() + "=\"");
+            write(p.getValue().toCharArray());
+            inner.write("\"");
+        }
+
+        inner.write(">\n");
+    }
+
+    public void simpleTag(String name, Properties attributes) throws IOException {
+        inner.write("<" + name);
+
+        for (Property p : attributes.getProperties()) {
+            inner.write(" " + p.getName() + "=\"");
+            write(p.getValue().toCharArray());
+            inner.write("\"");
+        }
+
+        inner.write("/>\n");
+    }
+
+    public void writeProperties(Properties props) throws IOException {
+        if (props.getProperties().size() == 0) {
+            return;
+        }
+
+        startTag(Parser.PROPERTIES_ELEMENT);
+
+        for (Property p : props.getProperties()) {
+            startTag(Parser.PROPERTY_ELEMENT, new Properties(Parser.PROPERTY_NAME_PROPERTY, p.getName()));
+            this.write(p.getValue().toCharArray());
+            endTag();
+        }
+
+        endTag();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputGraph;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GraphViewer {
+
+    public void view(InputGraph graph);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.Group;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupCallback {
+
+    public void started(Group g);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupOrganizer {
+
+    public String getName();
+
+    public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.data.services;
+
+import java.awt.Component;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface GroupReceiver {
+
+    public Component init(GroupCallback callback);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface InputGraphProvider {
+
+    InputGraph getGraph();
+
+    void setSelectedNodes(Set<InputNode> nodes);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.data.services;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputGraph;
+import java.util.Collection;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Scheduler {
+
+    public Collection<InputBlock> schedule(InputGraph graph);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.difference" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.difference.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.difference
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/difference/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.difference-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=1657ecfe
+build.xml.script.CRC32=03909051
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=1657ecfe
+nbproject/build-impl.xml.script.CRC32=2208e770
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.difference</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Difference
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,320 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.difference;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Property;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Difference {
+
+    public static final String PROPERTY_STATE = "state";
+    public static final String VALUE_NEW = "new";
+    public static final String VALUE_CHANGED = "changed";
+    public static final String VALUE_SAME = "same";
+    public static final String VALUE_DELETED = "deleted";
+    public static final String OLD_PREFIX = "OLD_";
+    public static final String MAIN_PROPERTY = "name";
+    public static final double LIMIT = 100.0;
+    public static final String[] IGNORE_PROPERTIES = new String[]{"idx", "debug_idx"};
+
+    public static InputGraph createDiffGraph(InputGraph a, InputGraph b) {
+        if (a.getGroup() == b.getGroup()) {
+            return createDiffSameGroup(a, b);
+        } else {
+            return createDiff(a, b);
+        }
+    }
+
+    private static InputGraph createDiffSameGroup(InputGraph a, InputGraph b) {
+        Map<Integer, InputNode> keyMapB = new HashMap<Integer, InputNode>();
+        for (InputNode n : b.getNodes()) {
+            Integer key = n.getId();
+            assert !keyMapB.containsKey(key);
+            keyMapB.put(key, n);
+        }
+
+        Set<Pair> pairs = new HashSet<Pair>();
+
+        for (InputNode n : a.getNodes()) {
+            Integer key = n.getId();
+
+
+            if (keyMapB.containsKey(key)) {
+                InputNode nB = keyMapB.get(key);
+                pairs.add(new Pair(n, nB));
+            }
+        }
+
+        return createDiff(a, b, pairs);
+    }
+
+    private static InputGraph createDiff(InputGraph a, InputGraph b, Set<Pair> pairs) {
+        Group g = new Group();
+        g.setMethod(a.getGroup().getMethod());
+        g.setAssembly(a.getGroup().getAssembly());
+        g.getProperties().setProperty("name", "Difference");
+        InputGraph graph = new InputGraph(g, null);
+        graph.setName(a.getName() + ", " + b.getName());
+        graph.setIsDifferenceGraph(true);
+
+        Set<InputNode> nodesA = new HashSet<InputNode>(a.getNodes());
+        Set<InputNode> nodesB = new HashSet<InputNode>(b.getNodes());
+
+        Map<InputNode, InputNode> inputNodeMap = new HashMap<InputNode, InputNode>();
+        for (Pair p : pairs) {
+            InputNode n = p.getN1();
+            assert nodesA.contains(n);
+            InputNode nB = p.getN2();
+            assert nodesB.contains(nB);
+
+            nodesA.remove(n);
+            nodesB.remove(nB);
+            InputNode n2 = new InputNode(n);
+            inputNodeMap.put(n, n2);
+            inputNodeMap.put(nB, n2);
+            graph.addNode(n2);
+            markAsChanged(n2, n, nB);
+        }
+
+        for (InputNode n : nodesA) {
+            InputNode n2 = new InputNode(n);
+            graph.addNode(n2);
+            markAsNew(n2);
+            inputNodeMap.put(n, n2);
+        }
+
+        for (InputNode n : nodesB) {
+            InputNode n2 = new InputNode(n);
+            n2.setId(-n2.getId());
+            graph.addNode(n2);
+            markAsDeleted(n2);
+            inputNodeMap.put(n, n2);
+        }
+
+        Set<InputEdge> edgesA = a.getEdges();
+        Set<InputEdge> edgesB = b.getEdges();
+
+        Set<InputEdge> newEdges = new HashSet<InputEdge>();
+
+        for (InputEdge e : edgesA) {
+            int from = e.getFrom();
+            int to = e.getTo();
+            InputNode nodeFrom = inputNodeMap.get(a.getNode(from));
+            InputNode nodeTo = inputNodeMap.get(a.getNode(to));
+            char index = e.getToIndex();
+
+            InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId());
+            if (!newEdges.contains(newEdge)) {
+                markAsNew(newEdge);
+                newEdges.add(newEdge);
+                graph.addEdge(newEdge);
+            }
+        }
+
+        for (InputEdge e : edgesB) {
+            int from = e.getFrom();
+            int to = e.getTo();
+            InputNode nodeFrom = inputNodeMap.get(b.getNode(from));
+            InputNode nodeTo = inputNodeMap.get(b.getNode(to));
+            char index = e.getToIndex();
+
+            InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId());
+            if (!newEdges.contains(newEdge)) {
+                markAsDeleted(newEdge);
+                newEdges.add(newEdge);
+                graph.addEdge(newEdge);
+            } else {
+                newEdges.remove(newEdge);
+                graph.removeEdge(newEdge);
+                markAsSame(newEdge);
+                newEdges.add(newEdge);
+                graph.addEdge(newEdge);
+            }
+        }
+
+        g.addGraph(graph);
+        return graph;
+    }
+
+    private static class Pair {
+
+        private InputNode n1;
+        private InputNode n2;
+
+        public Pair(InputNode n1, InputNode n2) {
+            this.n1 = n1;
+            this.n2 = n2;
+        }
+
+        public double getValue() {
+
+            double result = 0.0;
+            for (Property p : n1.getProperties().getProperties()) {
+                double faktor = 1.0;
+                for (String forbidden : IGNORE_PROPERTIES) {
+                    if (p.getName().equals(forbidden)) {
+                        faktor = 0.1;
+                        break;
+                    }
+                }
+                String p2 = n2.getProperties().get(p.getName());
+                result += evaluate(p.getValue(), p2) * faktor;
+            }
+
+            return result;
+        }
+
+        private double evaluate(String p, String p2) {
+            if (p2 == null) {
+                return 1.0;
+            }
+            if (p.equals(p2)) {
+                return 0.0;
+            } else {
+                return (double) (Math.abs(p.length() - p2.length())) / p.length() + 0.5;
+            }
+        }
+
+        public InputNode getN1() {
+            return n1;
+        }
+
+        public InputNode getN2() {
+            return n2;
+        }
+    }
+
+    private static InputGraph createDiff(InputGraph a, InputGraph b) {
+
+        Set<InputNode> matched = new HashSet<InputNode>();
+
+        Set<Pair> pairs = new HashSet<Pair>();
+        for (InputNode n : a.getNodes()) {
+            String s = n.getProperties().get(MAIN_PROPERTY);
+            if (s == null) {
+                s = "";
+            }
+            for (InputNode n2 : b.getNodes()) {
+                String s2 = n2.getProperties().get(MAIN_PROPERTY);
+                if (s2 == null) {
+                    s2 = "";
+                }
+
+                if (s.equals(s2)) {
+                    Pair p = new Pair(n, n2);
+                    pairs.add(p);
+                }
+            }
+        }
+
+        Set<Pair> selectedPairs = new HashSet<Pair>();
+        while (pairs.size() > 0) {
+
+            double min = Double.MAX_VALUE;
+            Pair minPair = null;
+            for (Pair p : pairs) {
+                double cur = p.getValue();
+                if (cur < min) {
+                    minPair = p;
+                    min = cur;
+                }
+            }
+
+            if (min > LIMIT) {
+                break;
+            } else {
+                selectedPairs.add(minPair);
+
+                Set<Pair> toRemove = new HashSet<Pair>();
+                for (Pair p : pairs) {
+                    if (p.getN1() == minPair.getN1() || p.getN2() == minPair.getN2()) {
+                        toRemove.add(p);
+                    }
+                }
+                pairs.removeAll(toRemove);
+            }
+        }
+
+        return createDiff(a, b, selectedPairs);
+    }
+
+    private static void markAsNew(InputEdge e) {
+        e.setState(InputEdge.State.NEW);
+    }
+
+    private static void markAsDeleted(InputEdge e) {
+        e.setState(InputEdge.State.DELETED);
+
+    }
+
+    private static void markAsSame(InputEdge e) {
+        e.setState(InputEdge.State.SAME);
+    }
+
+    private static void markAsChanged(InputNode n, InputNode firstNode, InputNode otherNode) {
+
+        boolean difference = false;
+        for (Property p : otherNode.getProperties().getProperties()) {
+            String s = firstNode.getProperties().getProperty(p.getName());
+            if (!p.getValue().equals(s)) {
+                difference = true;
+                n.getProperties().add(new Property(OLD_PREFIX + p.getName(), p.getValue()));
+            }
+        }
+
+        for (Property p : firstNode.getProperties().getProperties()) {
+            String s = otherNode.getProperties().getProperty(p.getName());
+            if (s == null && p.getValue().length() > 0) {
+                difference = true;
+                n.getProperties().add(new Property(OLD_PREFIX + p.getName(), ""));
+            }
+        }
+
+        if (difference) {
+            n.getProperties().add(new Property(PROPERTY_STATE, VALUE_CHANGED));
+        } else {
+            n.getProperties().add(new Property(PROPERTY_STATE, VALUE_SAME));
+        }
+    }
+
+    private static void markAsDeleted(InputNode n) {
+        n.getProperties().add(new Property(PROPERTY_STATE, VALUE_DELETED));
+    }
+
+    private static void markAsNew(InputNode n) {
+        n.getProperties().add(new Property(PROPERTY_STATE, VALUE_NEW));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.filter" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.filter.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.filter
+OpenIDE-Module-Layer: com/sun/hotspot/igv/filter/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/filter/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.filter-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=7c032ebf
+build.xml.script.CRC32=3b022a25
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=7c032ebf
+nbproject/build-impl.xml.script.CRC32=26513f91
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.jdesktop.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.4.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.3</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.filter</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.filter.JavaSE6ScriptEngine
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.Properties;
+import org.openide.cookies.OpenCookie;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class AbstractFilter implements Filter {
+
+    private ChangedEvent<Filter> changedEvent;
+    private Properties properties;
+
+    public AbstractFilter() {
+        changedEvent = new ChangedEvent<Filter>(this);
+        properties = new Properties();
+    }
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public OpenCookie getEditor() {
+        return null;
+    }
+
+    public ChangedEvent<Filter> getChangedEvent() {
+        return changedEvent;
+    }
+
+    protected void fireChangedEvent() {
+        changedEvent.fire();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,11 @@
+OpenIDE-Module-Name=Filter
+
+jLabel1.text=Name\:
+jLabel2.text=Source\:
+
+nameTextField.text=
+
+jButton1.text=OK
+jButton2.text=Cancel
+
+title=Edit Filter Dialog
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,138 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Connection.ConnectionStyle;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ColorFilter extends AbstractFilter {
+
+    private List<ColorRule> colorRules;
+    private String name;
+
+    public ColorFilter(String name) {
+        this.name = name;
+        colorRules = new ArrayList<ColorRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+        for (ColorRule rule : colorRules) {
+            if (rule.getSelector() != null) {
+                List<Figure> figures = rule.getSelector().selected(diagram);
+                for (Figure f : figures) {
+                    applyRule(rule, f);
+                    if (rule.getColor() != null) {
+                        f.setColor(rule.getColor());
+                    }
+                }
+            } else {
+                for (Figure f : diagram.getFigures()) {
+                    applyRule(rule, f);
+                }
+            }
+        }
+    }
+
+    private void applyRule(ColorRule rule, Figure f) {
+        if (rule.getColor() != null) {
+            f.setColor(rule.getColor());
+        }
+        Color color = rule.getLineColor();
+        ConnectionStyle style = rule.getLineStyle();
+
+        for (OutputSlot s : f.getOutputSlots()) {
+            for (Connection c : s.getConnections()) {
+                if (color != null) {
+                    c.setColor(color);
+                }
+
+                if (style != null) {
+                    c.setStyle(style);
+                }
+            }
+        }
+    }
+
+    public void addRule(ColorRule r) {
+        colorRules.add(r);
+    }
+
+    public static class ColorRule {
+
+        private Color color;
+        private Color lineColor;
+        private Connection.ConnectionStyle lineStyle;
+        private Selector selector;
+
+        public ColorRule(Selector selector, Color c) {
+            this(selector, c, null, null);
+        }
+
+        public ColorRule(Selector selector, Color c, Color lineColor, Connection.ConnectionStyle lineStyle) {
+            this.selector = selector;
+            this.color = c;
+            this.lineColor = lineColor;
+            this.lineStyle = lineStyle;
+
+        }
+
+        public ColorRule(Color c) {
+            this(null, c);
+        }
+
+        public Color getColor() {
+            return color;
+        }
+
+        public Selector getSelector() {
+            return selector;
+        }
+
+        public Color getLineColor() {
+            return lineColor;
+        }
+
+        public Connection.ConnectionStyle getLineStyle() {
+            return lineStyle;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,194 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CombineFilter extends AbstractFilter {
+
+    private List<CombineRule> rules;
+    private String name;
+
+    public CombineFilter(String name) {
+        this.name = name;
+        rules = new ArrayList<CombineRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+        for (CombineRule r : rules) {
+
+            List<Figure> list = selector.selectMultiple(r.getFirstMatcher());
+            Set<Figure> figuresToRemove = new HashSet<Figure>();
+            for (Figure f : list) {
+
+                List<Figure> successors = new ArrayList<Figure>(f.getSuccessors());
+                if (r.isReversed()) {
+                    if (successors.size() == 1) {
+                        Figure succ = successors.get(0);
+                        InputSlot slot = null;
+
+                        for (InputSlot s : succ.getInputSlots()) {
+                            for (Connection c : s.getConnections()) {
+                                if (c.getOutputSlot().getFigure() == f) {
+                                    slot = s;
+                                }
+                            }
+                        }
+
+                        assert slot != null;
+                        slot.setName(f.getProperties().get("dump_spec"));
+                        if (f.getProperties().get("short_name") != null) {
+                            slot.setShortName(f.getProperties().get("short_name"));
+                        } else {
+                            String s = f.getProperties().get("dump_spec");
+                            if (s != null && s.length() <= 5) {
+                                slot.setShortName(s);
+                            }
+
+                        }
+
+                        for (InputSlot s : f.getInputSlots()) {
+                            for (Connection c : s.getConnections()) {
+                                Connection newConn = diagram.createConnection(slot, c.getOutputSlot());
+                                newConn.setColor(c.getColor());
+                                newConn.setStyle(c.getStyle());
+                            }
+                        }
+
+                        figuresToRemove.add(f);
+                    }
+                } else {
+
+                    for (Figure succ : successors) {
+                        if (succ.getPredecessors().size() == 1) {
+                            if (succ.getProperties().selectSingle(r.getSecondMatcher()) != null && succ.getOutputSlots().size() == 1) {
+
+
+                                OutputSlot oldSlot = null;
+                                for (OutputSlot s : f.getOutputSlots()) {
+                                    for (Connection c : s.getConnections()) {
+                                        if (c.getInputSlot().getFigure() == succ) {
+                                            oldSlot = s;
+                                        }
+                                    }
+                                }
+
+                                assert oldSlot != null;
+
+                                OutputSlot nextSlot = succ.getOutputSlots().get(0);
+                                int pos = 0;
+                                if (succ.getProperties().get("con") != null) {
+                                    pos = Integer.parseInt(succ.getProperties().get("con"));
+                                }
+                                OutputSlot slot = f.createOutputSlot(pos);
+                                slot.setName(succ.getProperties().get("dump_spec"));
+                                if (succ.getProperties().get("short_name") != null) {
+                                    slot.setShortName(succ.getProperties().get("short_name"));
+                                } else {
+                                    String s = succ.getProperties().get("dump_spec");
+                                    if (s != null && s.length() <= 2) {
+                                        slot.setShortName(s);
+                                    } else {
+                                        String tmpName = succ.getProperties().get("name");
+                                        if (tmpName != null && tmpName.length() > 0) {
+                                            slot.setShortName(tmpName.substring(0, 1));
+                                        }
+                                    }
+                                }
+                                for (Connection c : nextSlot.getConnections()) {
+                                    Connection newConn = diagram.createConnection(c.getInputSlot(), slot);
+                                    newConn.setColor(c.getColor());
+                                    newConn.setStyle(c.getStyle());
+                                }
+
+
+                                figuresToRemove.add(succ);
+
+                                if (oldSlot.getConnections().size() == 0) {
+                                    f.removeSlot(oldSlot);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            diagram.removeAllFigures(figuresToRemove);
+        }
+    }
+
+    public void addRule(CombineRule combineRule) {
+        rules.add(combineRule);
+    }
+
+    public static class CombineRule {
+
+        private PropertyMatcher first;
+        private PropertyMatcher second;
+        private boolean reversed;
+
+        public CombineRule(PropertyMatcher first, PropertyMatcher second) {
+            this(first, second, false);
+
+        }
+
+        public CombineRule(PropertyMatcher first, PropertyMatcher second, boolean reversed) {
+            this.first = first;
+            this.second = second;
+            this.reversed = reversed;
+        }
+
+        public boolean isReversed() {
+            return reversed;
+        }
+
+        public PropertyMatcher getFirstMatcher() {
+            return first;
+        }
+
+        public PropertyMatcher getSecondMatcher() {
+            return second;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,106 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ConnectionFilter extends AbstractFilter {
+
+    private List<ConnectionStyleRule> connectionStyleRules;
+    private String name;
+
+    public ConnectionFilter(String name) {
+        this.name = name;
+        connectionStyleRules = new ArrayList<ConnectionStyleRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(diagram.getFigures());
+        for (ConnectionStyleRule rule : connectionStyleRules) {
+            List<Figure> figures = null;
+            if (rule.getSelector() != null) {
+                figures = rule.getSelector().selected(diagram);
+            } else {
+                figures = diagram.getFigures();
+            }
+
+            for (Figure f : figures) {
+                for (OutputSlot os : f.getOutputSlots()) {
+                    for (Connection c : os.getConnections()) {
+                        if (figures.contains(c.getInputSlot().getFigure())) {
+                            c.setStyle(rule.getLineStyle());
+                            c.setColor(rule.getLineColor());
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public void addRule(ConnectionStyleRule r) {
+        connectionStyleRules.add(r);
+    }
+
+    public static class ConnectionStyleRule {
+
+        private Color lineColor;
+        private Connection.ConnectionStyle lineStyle;
+        private Selector selector;
+
+        public ConnectionStyleRule(Selector selector, Color lineColor, Connection.ConnectionStyle lineStyle) {
+            this.selector = selector;
+            this.lineColor = lineColor;
+            this.lineStyle = lineStyle;
+        }
+
+        public Selector getSelector() {
+            return selector;
+        }
+
+        public Color getLineColor() {
+            return lineColor;
+        }
+
+        public Connection.ConnectionStyle getLineStyle() {
+            return lineStyle;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,159 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.Property;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.cookies.OpenCookie;
+import org.openide.filesystems.Repository;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.FileObject;
+import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CustomFilter extends AbstractFilter {
+
+    public static final String JAVASCRIPT_HELPER_ID = "JavaScriptHelper";
+    private static ScriptEngineAbstraction engine;
+    private String code;
+    private String name;
+
+    public CustomFilter(String name, String code) {
+        this.name = name;
+        this.code = code;
+        getProperties().add(new Property("name", name));
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setName(String s) {
+        name = s;
+        fireChangedEvent();
+    }
+
+    public void setCode(String s) {
+        code = s;
+        fireChangedEvent();
+    }
+
+    @Override
+    public OpenCookie getEditor() {
+        return new OpenCookie() {
+
+            public void open() {
+                openInEditor();
+            }
+        };
+    }
+
+    public boolean openInEditor() {
+        EditFilterDialog dialog = new EditFilterDialog(CustomFilter.this);
+        dialog.setVisible(true);
+        return dialog.wasAccepted();
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+
+    public static ScriptEngineAbstraction getEngine() {
+        if (engine == null) {
+
+            ScriptEngineAbstraction chosen = null;
+            try {
+                Collection<? extends ScriptEngineAbstraction> list = Lookup.getDefault().lookupAll(ScriptEngineAbstraction.class);
+                for (ScriptEngineAbstraction s : list) {
+                    if (s.initialize(getJsHelperText())) {
+                        if (chosen == null || !(chosen instanceof JavaSE6ScriptEngine)) {
+                            chosen = s;
+                        }
+                    }
+                }
+            } catch (NoClassDefFoundError ncdfe) {
+                Logger.getLogger("global").log(Level.SEVERE, null, ncdfe);
+            }
+
+            if (chosen == null) {
+                NotifyDescriptor message = new NotifyDescriptor.Message("Could not find a scripting engine. Please make sure that the Rhino scripting engine is available. Otherwise filter cannot be used.", NotifyDescriptor.ERROR_MESSAGE);
+                DialogDisplayer.getDefault().notifyLater(message);
+                chosen = new NullScriptEngine();
+            }
+
+            engine = chosen;
+        }
+
+        return engine;
+    }
+
+    private static String getJsHelperText() {
+        InputStream is = null;
+        StringBuilder sb = new StringBuilder("importPackage(Packages.com.sun.hotspot.igv.filter);importPackage(Packages.com.sun.hotspot.igv.graph);importPackage(Packages.com.sun.hotspot.igv.data);importPackage(Packages.com.sun.hotspot.igv.util);importPackage(java.awt);");
+        try {
+            FileSystem fs = Repository.getDefault().getDefaultFileSystem();
+            FileObject fo = fs.getRoot().getFileObject(JAVASCRIPT_HELPER_ID);
+            is = fo.getInputStream();
+            BufferedReader r = new BufferedReader(new InputStreamReader(is));
+            String s;
+            while ((s = r.readLine()) != null) {
+                sb.append(s);
+                sb.append("\n");
+            }
+
+        } catch (IOException ex) {
+            Logger.getLogger("global").log(Level.SEVERE, null, ex);
+        } finally {
+            try {
+                is.close();
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+        return sb.toString();
+    }
+
+    public void apply(Diagram d) {
+        getEngine().execute(d, code);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.form	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.4" maxVersion="1.4" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="2"/>
+    <Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+      <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+    </Property>
+    <Property name="resizable" type="boolean" value="false"/>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="1" attributes="0">
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="sourceLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+                          <Component id="nameLabel" alignment="0" min="-2" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace min="-2" pref="25" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="jScrollPane1" pref="695" max="32767" attributes="1"/>
+                          <Component id="nameTextField" alignment="0" pref="695" max="32767" attributes="1"/>
+                      </Group>
+                  </Group>
+                  <Group type="102" alignment="1" attributes="0">
+                      <Component id="okButton" min="-2" pref="76" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="cancelButton" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="nameLabel" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="nameTextField" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Component id="sourceLabel" min="-2" max="-2" attributes="0"/>
+                  <Component id="jScrollPane1" min="-2" pref="337" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace pref="16" max="32767" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="cancelButton" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="okButton" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTextArea" name="sourceTextArea">
+          <Properties>
+            <Property name="columns" type="int" value="20"/>
+            <Property name="rows" type="int" value="5"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JTextField" name="nameTextField">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/coordinator/Bundle.properties" key="nameTextField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="nameLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="sourceLabel">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JButton" name="okButton">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonClicked,okButtonClicked"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="cancelButton">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="at/ssw/graphanalyzer/filter/Bundle.properties" key="jButton2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelButtonClicked"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,161 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.filter;
+
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EditFilterDialog extends javax.swing.JDialog {
+
+    private CustomFilter customFilter;
+    private boolean accepted;
+
+    /** Creates new form EditFilterDialog */
+    public EditFilterDialog(CustomFilter customFilter) {
+        super(WindowManager.getDefault().getMainWindow(), true);
+        this.customFilter = customFilter;
+        initComponents();
+
+        sourceTextArea.setText(customFilter.getCode());
+        nameTextField.setText(customFilter.getName());
+    }
+
+    public boolean wasAccepted() {
+        return accepted;
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jScrollPane1 = new javax.swing.JScrollPane();
+        sourceTextArea = new javax.swing.JTextArea();
+        nameTextField = new javax.swing.JTextField();
+        nameLabel = new javax.swing.JLabel();
+        sourceLabel = new javax.swing.JLabel();
+        okButton = new javax.swing.JButton();
+        cancelButton = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+        setTitle(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "title")); // NOI18N
+        setResizable(false);
+
+        sourceTextArea.setColumns(20);
+        sourceTextArea.setRows(5);
+        jScrollPane1.setViewportView(sourceTextArea);
+
+        nameTextField.setText("null");
+
+        nameLabel.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jLabel1.text")); // NOI18N
+
+        sourceLabel.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jLabel2.text")); // NOI18N
+
+        okButton.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jButton1.text")); // NOI18N
+        okButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                cancelButtonClicked(evt);
+                okButtonClicked(evt);
+            }
+        });
+
+        cancelButton.setText(org.openide.util.NbBundle.getMessage(EditFilterDialog.class, "jButton2.text")); // NOI18N
+        cancelButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                cancelButtonClicked(evt);
+            }
+        });
+
+        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(layout.createSequentialGroup()
+                .addContainerGap()
+                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
+                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                            .add(sourceLabel)
+                            .add(nameLabel))
+                        .add(25, 25, 25)
+                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                            .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE)
+                            .add(nameTextField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 695, Short.MAX_VALUE)))
+                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
+                        .add(okButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 76, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
+                        .add(cancelButton)))
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(layout.createSequentialGroup()
+                .addContainerGap()
+                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+                    .add(nameLabel)
+                    .add(nameTextField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
+                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(sourceLabel)
+                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 337, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 16, Short.MAX_VALUE)
+                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+                    .add(cancelButton)
+                    .add(okButton))
+                .addContainerGap())
+        );
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+private void okButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonClicked
+        this.customFilter.setName(this.nameTextField.getText());
+        this.customFilter.setCode(this.sourceTextArea.getText());
+        accepted = true;
+        setVisible(false);
+}//GEN-LAST:event_okButtonClicked
+
+private void cancelButtonClicked(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonClicked
+        setVisible(false);
+}//GEN-LAST:event_cancelButtonClicked
+
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton cancelButton;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JLabel nameLabel;
+    private javax.swing.JTextField nameTextField;
+    private javax.swing.JButton okButton;
+    private javax.swing.JLabel sourceLabel;
+    private javax.swing.JTextArea sourceTextArea;
+    // End of variables declaration//GEN-END:variables
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.graph.Diagram;
+import org.openide.cookies.OpenCookie;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Filter extends Properties.Provider, ChangedEventProvider<Filter> {
+
+    public String getName();
+
+    public void apply(Diagram d);
+
+    OpenCookie getEditor();
+
+    ChangedEvent<Filter> getChangedEvent();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,155 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterChain implements ChangedEventProvider<FilterChain> {
+
+    private List<Filter> filters;
+    private transient ChangedEvent<FilterChain> changedEvent;
+    private boolean fireEvents;
+
+    public FilterChain() {
+        filters = new ArrayList<Filter>();
+        changedEvent = new ChangedEvent<FilterChain>(this);
+        this.fireEvents = true;
+    }
+
+    public FilterChain(FilterChain f) {
+        this.filters = new ArrayList<Filter>(f.filters);
+        changedEvent = new ChangedEvent<FilterChain>(this);
+        this.fireEvents = true;
+    }
+
+    public ChangedEvent<FilterChain> getChangedEvent() {
+        return changedEvent;
+    }
+
+    public Filter getFilterAt(int index) {
+        assert index >= 0 && index < filters.size();
+        return filters.get(index);
+    }
+
+    public void apply(Diagram d) {
+        for (Filter f : filters) {
+            f.apply(d);
+        }
+    }
+
+    public void apply(Diagram d, FilterChain sequence) {
+        List<Filter> applied = new ArrayList<Filter>();
+        for (Filter f : sequence.getFilters()) {
+            if (filters.contains(f)) {
+                f.apply(d);
+                applied.add(f);
+            }
+        }
+
+
+        for (Filter f : filters) {
+            if (!applied.contains(f)) {
+                f.apply(d);
+            }
+        }
+    }
+
+    public void beginAtomic() {
+        this.fireEvents = false;
+    }
+
+    public void endAtomic() {
+        this.fireEvents = true;
+        changedEvent.fire();
+    }
+
+    public void addFilter(Filter filter) {
+        assert filter != null;
+        filters.add(filter);
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public void addFilterSameSequence(Filter filter) {
+        assert filter != null;
+        filters.add(filter);
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public boolean containsFilter(Filter filter) {
+        return filters.contains(filter);
+    }
+
+    public void removeFilter(Filter filter) {
+        assert filters.contains(filter);
+        filters.remove(filter);
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public void moveFilterUp(Filter filter) {
+        assert filters.contains(filter);
+        int index = filters.indexOf(filter);
+        if (index != 0) {
+            filters.remove(index);
+            filters.add(index - 1, filter);
+        }
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public void moveFilterDown(Filter filter) {
+        assert filters.contains(filter);
+        int index = filters.indexOf(filter);
+        if (index != filters.size() - 1) {
+            filters.remove(index);
+            filters.add(index + 1, filter);
+        }
+        if (fireEvents) {
+            changedEvent.fire();
+        }
+    }
+
+    public List<Filter> getFilters() {
+        return Collections.unmodifiableList(filters);
+    }
+
+    public void clear() {
+        filters.clear();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface FilterChainProvider {
+
+    public FilterChain getFilterChain();
+
+    public FilterChain getSequence();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterSetting {
+
+    private Set<Filter> filters;
+    private String name;
+
+    public FilterSetting() {
+        this(null);
+    }
+
+    public FilterSetting(String name) {
+        this.name = name;
+        filters = new HashSet<Filter>();
+    }
+
+    public Set<Filter> getFilters() {
+        return Collections.unmodifiableSet(filters);
+    }
+
+    public void addFilter(Filter f) {
+        assert !filters.contains(f);
+        filters.add(f);
+    }
+
+    public void removeFilter(Filter f) {
+        assert filters.contains(f);
+        filters.remove(f);
+    }
+
+    public boolean containsFilter(Filter f) {
+        return filters.contains(f);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public int getFilterCount() {
+        return filters.size();
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import org.openide.util.Exceptions;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class JavaSE6ScriptEngine implements ScriptEngineAbstraction {
+
+    private ScriptEngine engine;
+    private Bindings bindings;
+
+    public boolean initialize(String jsHelperText) {
+        try {
+            ScriptEngineManager sem = new ScriptEngineManager();
+            ScriptEngine e = sem.getEngineByName("ECMAScript");
+            engine = e;
+            e.eval(jsHelperText);
+            Bindings b = e.getContext().getBindings(ScriptContext.ENGINE_SCOPE);
+            b.put("IO", System.out);
+            bindings = b;
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public void execute(Diagram d, String code) {
+        try {
+            Bindings b = bindings;
+            b.put("graph", d);
+            engine.eval(code, b);
+        } catch (ScriptException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class NullScriptEngine implements ScriptEngineAbstraction {
+
+    public boolean initialize(String jsHelperText) {
+        return true;
+    }
+
+    public void execute(Diagram d, String code) {
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,132 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import com.sun.hotspot.igv.data.Properties;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveFilter extends AbstractFilter {
+
+    private List<RemoveRule> rules;
+    private String name;
+
+    public RemoveFilter(String name) {
+        this.name = name;
+        rules = new ArrayList<RemoveRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        for (RemoveRule r : rules) {
+
+            List<Figure> list = r.getSelector().selected(diagram);
+            Set<Figure> figuresToRemove = new HashSet<Figure>();
+
+            List<Figure> protectedFigures = null;
+            if (r.getRemoveAllWithoutPredecessor()) {
+                protectedFigures = diagram.getRootFigures();
+            }
+
+            for (Figure f : list) {
+                if (r.getRemoveOnlyInputs()) {
+                    List<InputSlot> inputSlots = new ArrayList<InputSlot>();
+                    for (InputSlot is : f.getInputSlots()) {
+                        inputSlots.add(is);
+                    }
+                    for (InputSlot is : inputSlots) {
+                        f.removeSlot(is);
+                    }
+
+                    f.createInputSlot();
+                } else {
+                    figuresToRemove.add(f);
+                }
+            }
+
+            if (r.getRemoveAllWithoutPredecessor()) {
+                boolean progress = true;
+                while (progress) {
+                    List<Figure> rootFigures = diagram.getRootFigures();
+                    progress = false;
+                    for (Figure f : rootFigures) {
+                        if (!protectedFigures.contains(f)) {
+                            figuresToRemove.add(f);
+                            progress = true;
+                        }
+                    }
+                }
+            }
+
+            diagram.removeAllFigures(figuresToRemove);
+        }
+    }
+
+    public void addRule(RemoveRule rule) {
+        rules.add(rule);
+    }
+
+    public static class RemoveRule {
+
+        private Selector selector;
+        private boolean removeAllWithoutPredecessor;
+        private boolean removeOnlyInputs;
+
+        public RemoveRule(Selector selector, boolean b) {
+            this(selector, b, false);
+        }
+
+        public RemoveRule(Selector selector, boolean removeAllWithoutPredecessor, boolean removeOnlyInputs) {
+            this.selector = selector;
+            this.removeOnlyInputs = removeOnlyInputs;
+            this.removeAllWithoutPredecessor = removeAllWithoutPredecessor;
+        }
+
+        public Selector getSelector() {
+            return selector;
+        }
+
+        public boolean getRemoveOnlyInputs() {
+            return removeOnlyInputs;
+        }
+
+        public boolean getRemoveAllWithoutPredecessor() {
+            return removeAllWithoutPredecessor;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,143 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveInputsFilter extends AbstractFilter {
+
+    private List<RemoveInputsRule> rules;
+    private String name;
+
+    public RemoveInputsFilter(String name) {
+        this.name = name;
+        rules = new ArrayList<RemoveInputsRule>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram diagram) {
+
+        for (RemoveInputsRule r : rules) {
+
+            List<Figure> list = r.getSelector().selected(diagram);
+            for (Figure f : list) {
+                int z = 0;
+                List<InputSlot> last = new ArrayList<InputSlot>();
+                for (InputSlot is : f.getInputSlots()) {
+                    if (z >= r.getStartingIndex() && z <= r.getEndIndex() && is.getConnections().size() > 0) {
+                        StringBuilder sb = new StringBuilder();
+                        List<Connection> conns = is.getConnections();
+                        for (int i = 0; i < conns.size(); i++) {
+                            Connection c = conns.get(i);
+                            OutputSlot os = c.getOutputSlot();
+                            Figure pred = os.getFigure();
+                            if (i != 0) {
+                                sb.append("<BR>");
+                            }
+                            sb.append(pred.getLines()[0]);
+                        }
+                        is.removeAllConnections();
+                        is.setShortName("X");
+                        is.setName(sb.toString());
+                        last.add(is);
+                    } else {
+                        last.clear();
+                    }
+                    z++;
+                }
+
+                if (last.size() > 3) {
+                    InputSlot first = last.get(0);
+                    first.setShortName("XX");
+
+                    StringBuilder sb = new StringBuilder();
+                    for (int i = 0; i < last.size(); i++) {
+                        InputSlot is2 = last.get(i);
+                        if (i != 0) {
+                            sb.append("<BR>");
+                        }
+                        sb.append(is2.getName());
+                    }
+
+                    first.setName(sb.toString());
+
+                    for (int i = 1; i < last.size(); i++) {
+                        f.removeSlot(last.get(i));
+                    }
+                }
+            }
+        }
+    }
+
+    public void addRule(RemoveInputsRule rule) {
+        rules.add(rule);
+    }
+
+    public static class RemoveInputsRule {
+
+        private Selector selector;
+        private int startingIndex;
+        private int endIndex;
+
+        public RemoveInputsRule(Selector selector) {
+            this(selector, 0);
+        }
+
+        public RemoveInputsRule(Selector selector, int startIndex) {
+            this(selector, startIndex, Integer.MAX_VALUE);
+        }
+
+        public RemoveInputsRule(Selector selector, int startIndex, int endIndex) {
+            this.startingIndex = startIndex;
+            this.endIndex = endIndex;
+            this.selector = selector;
+        }
+
+        public int getStartingIndex() {
+            return startingIndex;
+        }
+
+        public int getEndIndex() {
+            return endIndex;
+        }
+
+        public Selector getSelector() {
+            return selector;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RemoveSelfLoopsFilter extends AbstractFilter {
+
+    private String name;
+
+    /** Creates a new instance of RemoveSelfLoops */
+    public RemoveSelfLoopsFilter(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram d) {
+
+        for (Figure f : d.getFigures()) {
+
+            for (InputSlot is : f.getInputSlots()) {
+
+                List<Connection> toRemove = new ArrayList<Connection>();
+                for (Connection c : is.getConnections()) {
+
+                    if (c.getOutputSlot().getFigure() == f) {
+                        toRemove.add(c);
+                    }
+                }
+
+                for (Connection c : toRemove) {
+
+                    c.remove();
+
+                    OutputSlot os = c.getOutputSlot();
+                    if (os.getConnections().size() == 0) {
+                        f.removeSlot(os);
+                    }
+
+                    c.getInputSlot().setShortName("O");
+                    c.getInputSlot().setName("Self Loop");
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Diagram;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ScriptEngineAbstraction {
+
+    public boolean initialize(String jsHelperText);
+
+    public void execute(Diagram d, String code);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filter;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Selector;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SplitFilter extends AbstractFilter {
+
+    private String name;
+    private Selector selector;
+
+    public SplitFilter(String name, Selector selector) {
+        this.name = name;
+        this.selector = selector;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void apply(Diagram d) {
+        List<Figure> list = selector.selected(d);
+
+        for (Figure f : list) {
+            for (OutputSlot os : f.getOutputSlots()) {
+                for (Connection c : os.getConnections()) {
+                    InputSlot is = c.getInputSlot();
+                    is.setName(f.getProperties().getProperty("dump_spec"));
+                    String s = f.getProperties().getProperty("short_name");
+                    if (s != null) {
+                        is.setShortName(s);
+                    }
+                }
+            }
+
+            d.removeFigure(f);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ *
+ */
+
+ /**
+ *
+ * @author Thomas Wuerthinger
+ */
+
+function colorize(property, regexp, color) {
+    var f = new ColorFilter("");
+    f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), color));
+    f.apply(graph);
+}
+
+function remove(property, regexp) {
+    var f = new RemoveFilter("");
+    f.addRule(new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), false, false));
+    f.apply(graph);
+}
+
+function split(property, regexp) {
+    var f = new SplitFilter("", new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)));
+    f.apply(graph);
+}
+
+function removeInputs(property, regexp, from, to) {
+    var f = new RemoveInputsFilter("");
+    if(from == undefined && to == undefined) {
+        f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp))));
+    } else if(to == undefined) {
+        f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), from));
+    } else {
+        f.addRule(new RemoveInputsFilter.RemoveInputsRule(new MatcherSelector(new Properties.RegexpPropertyMatcher(property, regexp)), from, to));
+    }
+    f.apply(graph);
+}
+
+var black = Color.black;
+var blue = Color.blue;
+var cyan = Color.cyan;
+var darkGray = Color.darkGray;
+var gray = Color.gray;
+var green = Color.green;
+var lightGray = Color.lightGray;
+var magenta = Color.magenta;
+var orange = Color.orange;
+var pink = Color.pink
+var red = Color.red;
+var yellow = Color.yellow;
+var white = Color.white;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+        <file name="JavaScriptHelper" url="helper.js"/>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.filterwindow" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.filterwindow.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.filterwindow
+OpenIDE-Module-Layer: com/sun/hotspot/igv/filterwindow/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/filterwindow/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.filterwindow-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=401b2654
+build.xml.script.CRC32=9c158403
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=401b2654
+nbproject/build-impl.xml.script.CRC32=19fb08e0
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.filterwindow</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.actions</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.6.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.explorer</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.12.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.3.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.loaders</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.7.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.10.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.18.1</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.filterwindow.FilterChainProviderImplementation
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,3 @@
+OpenIDE-Module-Name=FilterWindow
+CTL_FilterTopComponent=Filter Window
+HINT_FilterTopComponent=This is a Filter window
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import javax.swing.JList;
+import org.openide.explorer.view.ListView;
+import org.openide.explorer.view.NodeListModel;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckListView extends ListView {
+
+    @Override
+    public void showSelection(int[] indices) {
+        super.showSelection(indices);
+    }
+
+    @Override
+    protected NodeListModel createModel() {
+        return new CheckNodeListModel();
+    }
+
+    @Override
+    protected JList createList() {
+        JList tmpList = super.createList();
+        tmpList.setCellRenderer(new CheckRenderer(tmpList));
+        return tmpList;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.data.ChangedEvent;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckNode extends AbstractNode {
+
+    private ChangedEvent<CheckNode> selectionChangedEvent;
+    public boolean selected;
+    public boolean enabled;
+
+    public CheckNode(Children c, Lookup lookup) {
+        super(c, lookup);
+        selectionChangedEvent = new ChangedEvent<CheckNode>(this);
+        selected = false;
+        enabled = true;
+    }
+
+    public ChangedEvent<CheckNode> getSelectionChangedEvent() {
+        return selectionChangedEvent;
+    }
+
+    public boolean isSelected() {
+        return selected;
+    }
+
+    public void setSelected(boolean b) {
+        if (b != selected) {
+            selected = b;
+            selectionChangedEvent.fire();
+        }
+    }
+
+    public void setEnabled(boolean b) {
+        enabled = b;
+    }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import org.openide.explorer.view.NodeListModel;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class CheckNodeListModel extends NodeListModel {
+
+    private Node rootNode;
+
+    @Override
+    public void setNode(Node rootNode) {
+        this.rootNode = rootNode;
+        super.setNode(rootNode);
+    }
+
+    public CheckNode getCheckNodeAt(int index) {
+        return (CheckNode) rootNode.getChildren().getNodes()[index];
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,88 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import javax.swing.JCheckBox;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+
+/**
+ * @author Thomas Wuerthinger
+ */
+public class CheckRenderer extends JCheckBox implements ListCellRenderer {
+
+    private JList list;
+    private Color startBackground;
+
+    public CheckRenderer(final JList list) {
+        this.list = list;
+        list.addMouseListener(
+                new MouseAdapter() {
+
+                    @Override
+                    public void mouseClicked(MouseEvent e) {
+                        int index = list.locationToIndex(e.getPoint());
+                        Point p2 = list.indexToLocation(index);
+                        Rectangle r = new Rectangle(p2.x, p2.y, getPreferredSize().height, getPreferredSize().height);
+                        if (r.contains(e.getPoint())) {
+                            CheckNode node = ((CheckNodeListModel) list.getModel()).getCheckNodeAt(index);
+                            node.setSelected(!node.isSelected());
+                            list.repaint();
+                            e.consume();
+                        }
+                    }
+                });
+
+        this.setPreferredSize(new Dimension(getPreferredSize().width, getPreferredSize().height - 5));
+        startBackground = this.getBackground();
+    }
+
+    public Component getListCellRendererComponent(final JList list, Object value, final int index, boolean isSelected, boolean cellHasFocus) {
+        setText(value.toString());
+        CheckNode node = ((CheckNodeListModel) list.getModel()).getCheckNodeAt(index);
+        this.setSelected(node.isSelected());
+        this.setEnabled(list.isEnabled());
+
+        if (isSelected && list.hasFocus()) {
+            this.setBackground(list.getSelectionBackground());
+            this.setForeground(list.getSelectionForeground());
+        } else if (isSelected) {
+            assert !list.hasFocus();
+            this.setBackground(startBackground);
+            this.setForeground(list.getForeground());
+
+        } else {
+            this.setBackground(list.getBackground());
+            this.setForeground(list.getForeground());
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.filter.FilterChainProvider;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterChainProviderImplementation implements FilterChainProvider {
+
+    public FilterChain getFilterChain() {
+        return FilterTopComponent.findInstance().getFilterChain();
+    }
+
+    public FilterChain getSequence() {
+        return FilterTopComponent.findInstance().getSequence();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,112 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterDownAction;
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterUpAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterAction;
+import com.sun.hotspot.igv.filter.Filter;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import javax.swing.Action;
+import org.openide.actions.OpenAction;
+import org.openide.nodes.Children;
+import org.openide.nodes.Sheet;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.Utilities;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterNode extends CheckNode implements LookupListener, ChangedListener<FilterTopComponent> {
+
+    private Filter filter;
+    private Lookup.Result result;
+
+    public FilterNode(Filter filter) {
+        this(filter, new InstanceContent());
+    }
+
+    private FilterNode(Filter filter, InstanceContent content) {
+        super(Children.LEAF, new AbstractLookup(content));
+        content.add(filter);
+
+        content.add(filter.getEditor());
+        this.filter = filter;
+        filter.getChangedEvent().addListener(new ChangedListener<Filter>() {
+
+            public void changed(Filter source) {
+                update();
+            }
+        });
+
+        update();
+
+        Lookup.Template<FilterChain> tpl = new Lookup.Template<FilterChain>(FilterChain.class);
+        result = Utilities.actionsGlobalContext().lookup(tpl);
+        result.addLookupListener(this);
+
+        FilterTopComponent.findInstance().getFilterSettingsChangedEvent().addListener(this);
+        resultChanged(null);
+    }
+
+    private void update() {
+        this.setDisplayName(filter.getName());
+    }
+
+    public Filter getFilter() {
+        return filter;
+    }
+
+    @Override
+    protected Sheet createSheet() {
+        Sheet s = super.createSheet();
+        PropertiesSheet.initializeSheet(getFilter().getProperties(), s);
+        return s;
+    }
+
+    @Override
+    public Action[] getActions(boolean b) {
+        return new Action[]{(Action) OpenAction.findObject(OpenAction.class, true), (Action) MoveFilterUpAction.findObject(MoveFilterUpAction.class, true), (Action) MoveFilterDownAction.findObject(MoveFilterDownAction.class, true), (Action) RemoveFilterAction.findObject(RemoveFilterAction.class, true)};
+    }
+
+    @Override
+    public Action getPreferredAction() {
+        return OpenAction.get(OpenAction.class).createContextAwareInstance(Utilities.actionsGlobalContext());
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+        changed(FilterTopComponent.findInstance());
+    }
+
+    public void changed(FilterTopComponent source) {
+        setSelected(source.getFilterChain().containsFilter(filter));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.form	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+</Form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,689 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow;
+
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterDownAction;
+import com.sun.hotspot.igv.filterwindow.actions.MoveFilterUpAction;
+import com.sun.hotspot.igv.filterwindow.actions.NewFilterAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterAction;
+import com.sun.hotspot.igv.filterwindow.actions.RemoveFilterSettingsAction;
+import com.sun.hotspot.igv.filterwindow.actions.SaveFilterSettingsAction;
+import com.sun.hotspot.igv.filter.CustomFilter;
+import com.sun.hotspot.igv.filter.Filter;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.filter.FilterSetting;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.data.ChangedListener;
+import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Serializable;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.JComboBox;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.DialogDisplayer;
+import org.openide.ErrorManager;
+import org.openide.NotifyDescriptor;
+import org.openide.awt.ToolbarPool;
+import org.openide.explorer.ExplorerManager;
+import org.openide.explorer.ExplorerUtils;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.util.Exceptions;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.awt.Toolbar;
+import org.openide.filesystems.FileLock;
+import org.openide.util.actions.SystemAction;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+import org.openide.filesystems.Repository;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.FileObject;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class FilterTopComponent extends TopComponent implements LookupListener, ExplorerManager.Provider {
+
+    private static FilterTopComponent instance;
+    public static final String FOLDER_ID = "Filters";
+    public static final String AFTER_ID = "after";
+    public static final String ENABLED_ID = "enabled";
+    public static final String PREFERRED_ID = "FilterTopComponent";
+    private CheckListView view;
+    private ExplorerManager manager;
+    private FilterChain filterChain;
+    private FilterChain sequence;
+    private Lookup.Result result;
+    private JComboBox comboBox;
+    private List<FilterSetting> filterSettings;
+    private FilterSetting customFilterSetting = new FilterSetting("-- Custom --");
+    private ChangedEvent<FilterTopComponent> filterSettingsChangedEvent;
+    private ActionListener comboBoxActionListener = new ActionListener() {
+
+        public void actionPerformed(ActionEvent e) {
+            comboBoxSelectionChanged();
+        }
+    };
+
+    public ChangedEvent<FilterTopComponent> getFilterSettingsChangedEvent() {
+        return filterSettingsChangedEvent;
+    }
+
+    public FilterChain getSequence() {
+        return sequence;
+    }
+
+    public void updateSelection() {
+        Node[] nodes = this.getExplorerManager().getSelectedNodes();
+        int[] arr = new int[nodes.length];
+        for (int i = 0; i < nodes.length; i++) {
+            int index = sequence.getFilters().indexOf(((FilterNode) nodes[i]).getFilter());
+            arr[i] = index;
+        }
+        view.showSelection(arr);
+    }
+
+    private void comboBoxSelectionChanged() {
+
+        Object o = comboBox.getSelectedItem();
+        if (o == null) {
+            return;
+        }
+        assert o instanceof FilterSetting;
+        FilterSetting s = (FilterSetting) o;
+
+        if (s != customFilterSetting) {
+            FilterChain chain = getFilterChain();
+            chain.beginAtomic();
+            List<Filter> toRemove = new ArrayList<Filter>();
+            for (Filter f : chain.getFilters()) {
+                if (!s.containsFilter(f)) {
+                    toRemove.add(f);
+                }
+            }
+            for (Filter f : toRemove) {
+                chain.removeFilter(f);
+            }
+
+            for (Filter f : s.getFilters()) {
+                if (!chain.containsFilter(f)) {
+                    chain.addFilter(f);
+                }
+            }
+
+            chain.endAtomic();
+            filterSettingsChangedEvent.fire();
+        } else {
+            this.updateComboBoxSelection();
+        }
+
+        SystemAction.get(RemoveFilterSettingsAction.class).setEnabled(comboBox.getSelectedItem() != this.customFilterSetting);
+        SystemAction.get(SaveFilterSettingsAction.class).setEnabled(comboBox.getSelectedItem() == this.customFilterSetting);
+    }
+
+    private void updateComboBox() {
+        comboBox.removeAllItems();
+        comboBox.addItem(customFilterSetting);
+        for (FilterSetting s : filterSettings) {
+            comboBox.addItem(s);
+        }
+
+        this.updateComboBoxSelection();
+    }
+
+    public void addFilterSetting() {
+        NotifyDescriptor.InputLine l = new NotifyDescriptor.InputLine("Enter a name:", "Filter");
+        if (DialogDisplayer.getDefault().notify(l) == NotifyDescriptor.OK_OPTION) {
+            String name = l.getInputText();
+
+            FilterSetting toRemove = null;
+            for (FilterSetting s : filterSettings) {
+                if (s.getName().equals(name)) {
+                    NotifyDescriptor.Confirmation conf = new NotifyDescriptor.Confirmation("Filter \"" + name + "\" already exists, to you want to overwrite?", "Filter");
+                    if (DialogDisplayer.getDefault().notify(conf) == NotifyDescriptor.YES_OPTION) {
+                        toRemove = s;
+                        break;
+                    } else {
+                        return;
+                    }
+                }
+            }
+
+            if (toRemove != null) {
+                filterSettings.remove(toRemove);
+            }
+            FilterSetting setting = createFilterSetting(name);
+            filterSettings.add(setting);
+
+            // Sort alphabetically
+            Collections.sort(filterSettings, new Comparator<FilterSetting>() {
+
+                public int compare(FilterSetting o1, FilterSetting o2) {
+                    return o1.getName().compareTo(o2.getName());
+                }
+            });
+
+            updateComboBox();
+        }
+    }
+
+    public boolean canRemoveFilterSetting() {
+        return comboBox.getSelectedItem() != customFilterSetting;
+    }
+
+    public void removeFilterSetting() {
+        if (canRemoveFilterSetting()) {
+            Object o = comboBox.getSelectedItem();
+            assert o instanceof FilterSetting;
+            FilterSetting f = (FilterSetting) o;
+            assert f != customFilterSetting;
+            assert filterSettings.contains(f);
+            NotifyDescriptor.Confirmation l = new NotifyDescriptor.Confirmation("Do you really want to remove filter \"" + f + "\"?", "Filter");
+            if (DialogDisplayer.getDefault().notify(l) == NotifyDescriptor.YES_OPTION) {
+                filterSettings.remove(f);
+                updateComboBox();
+            }
+        }
+    }
+
+    private FilterSetting createFilterSetting(String name) {
+        FilterSetting s = new FilterSetting(name);
+        FilterChain chain = this.getFilterChain();
+        for (Filter f : chain.getFilters()) {
+            s.addFilter(f);
+        }
+        return s;
+    }
+
+    private void updateComboBoxSelection() {
+        List<Filter> filters = this.getFilterChain().getFilters();
+        boolean found = false;
+        for (FilterSetting s : filterSettings) {
+            if (s.getFilterCount() == filters.size()) {
+                boolean ok = true;
+                for (Filter f : filters) {
+                    if (!s.containsFilter(f)) {
+                        ok = false;
+                    }
+                }
+
+                if (ok) {
+                    if (comboBox.getSelectedItem() != s) {
+                        comboBox.setSelectedItem(s);
+                    }
+                    found = true;
+                    break;
+                }
+            }
+        }
+
+        if (!found && comboBox.getSelectedItem() != customFilterSetting) {
+            comboBox.setSelectedItem(customFilterSetting);
+        }
+    }
+
+    private class FilterChildren extends Children.Keys implements ChangedListener<CheckNode> {
+
+        //private Node[] oldSelection;
+        //private ArrayList<Node> newSelection;
+        private HashMap<Object, Node> nodeHash = new HashMap<Object, Node>();
+
+        protected Node[] createNodes(Object object) {
+            if (nodeHash.containsKey(object)) {
+                return new Node[]{nodeHash.get(object)};
+            }
+
+            assert object instanceof Filter;
+            Filter filter = (Filter) object;
+            com.sun.hotspot.igv.filterwindow.FilterNode node = new com.sun.hotspot.igv.filterwindow.FilterNode(filter);
+            node.getSelectionChangedEvent().addListener(this);
+            nodeHash.put(object, node);
+            return new Node[]{node};
+        }
+
+        public FilterChildren() {
+            sequence.getChangedEvent().addListener(new ChangedListener<FilterChain>() {
+
+                public void changed(FilterChain source) {
+                    addNotify();
+                }
+            });
+
+            setBefore(false);
+        }
+
+        protected void addNotify() {
+            setKeys(sequence.getFilters());
+            updateSelection();
+        }
+
+        public void changed(CheckNode source) {
+            FilterNode node = (FilterNode) source;
+            Filter f = node.getFilter();
+            FilterChain chain = getFilterChain();
+            if (node.isSelected()) {
+                if (!chain.containsFilter(f)) {
+                    chain.addFilter(f);
+                }
+            } else {
+                if (chain.containsFilter(f)) {
+                    chain.removeFilter(f);
+                }
+            }
+            view.revalidate();
+            view.repaint();
+            updateComboBoxSelection();
+        }
+    }
+
+    public FilterChain getFilterChain() {
+        return filterChain;/*
+    EditorTopComponent tc = EditorTopComponent.getActive();
+    if (tc == null) {
+    return filterChain;
+    }
+    return tc.getFilterChain();*/
+    }
+
+    private FilterTopComponent() {
+        filterSettingsChangedEvent = new ChangedEvent<FilterTopComponent>(this);
+        initComponents();
+        setName(NbBundle.getMessage(FilterTopComponent.class, "CTL_FilterTopComponent"));
+        setToolTipText(NbBundle.getMessage(FilterTopComponent.class, "HINT_FilterTopComponent"));
+        //        setIcon(Utilities.loadImage(ICON_PATH, true));
+
+        sequence = new FilterChain();
+        filterChain = new FilterChain();
+        initFilters();
+        manager = new ExplorerManager();
+        manager.setRootContext(new AbstractNode(new FilterChildren()));
+        associateLookup(ExplorerUtils.createLookup(manager, getActionMap()));
+        view = new CheckListView();
+
+        ToolbarPool.getDefault().setPreferredIconSize(16);
+        Toolbar toolBar = new Toolbar();
+        Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+        toolBar.setBorder(b);
+        comboBox = new JComboBox();
+        toolBar.add(comboBox);
+        this.add(toolBar, BorderLayout.NORTH);
+        toolBar.add(SaveFilterSettingsAction.get(SaveFilterSettingsAction.class));
+        toolBar.add(RemoveFilterSettingsAction.get(RemoveFilterSettingsAction.class));
+        toolBar.addSeparator();
+        toolBar.add(MoveFilterUpAction.get(MoveFilterUpAction.class).createContextAwareInstance(this.getLookup()));
+        toolBar.add(MoveFilterDownAction.get(MoveFilterDownAction.class).createContextAwareInstance(this.getLookup()));
+        toolBar.add(RemoveFilterAction.get(RemoveFilterAction.class).createContextAwareInstance(this.getLookup()));
+        toolBar.add(NewFilterAction.get(NewFilterAction.class));
+        this.add(view, BorderLayout.CENTER);
+
+        filterSettings = new ArrayList<FilterSetting>();
+        updateComboBox();
+
+        comboBox.addActionListener(comboBoxActionListener);
+        setChain(filterChain);
+    }
+
+    public void newFilter() {
+        CustomFilter cf = new CustomFilter("My custom filter", "");
+        if (cf.openInEditor()) {
+            sequence.addFilter(cf);
+            FileObject fo = getFileObject(cf);
+            FilterChangedListener listener = new FilterChangedListener(fo, cf);
+            listener.changed(cf);
+            cf.getChangedEvent().addListener(listener);
+        }
+    }
+
+    public void removeFilter(Filter f) {
+        com.sun.hotspot.igv.filter.CustomFilter cf = (com.sun.hotspot.igv.filter.CustomFilter) f;
+
+        sequence.removeFilter(cf);
+        try {
+            getFileObject(cf).delete();
+        } catch (IOException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+
+    }
+
+    private static class FilterChangedListener implements ChangedListener<Filter> {
+
+        private FileObject fileObject;
+        private CustomFilter filter;
+
+        public FilterChangedListener(FileObject fo, CustomFilter cf) {
+            fileObject = fo;
+            filter = cf;
+        }
+
+        public void changed(Filter source) {
+            try {
+                if (!fileObject.getName().equals(filter.getName())) {
+                    FileLock lock = fileObject.lock();
+                    fileObject.move(lock, fileObject.getParent(), filter.getName(), "");
+                    lock.releaseLock();
+                    FileObject newFileObject = fileObject.getParent().getFileObject(filter.getName());
+                    fileObject = newFileObject;
+
+                }
+
+                FileLock lock = fileObject.lock();
+                OutputStream os = fileObject.getOutputStream(lock);
+                Writer w = new OutputStreamWriter(os);
+                String s = filter.getCode();
+                w.write(s);
+                w.close();
+                lock.releaseLock();
+
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+    }
+
+    public void initFilters() {
+
+        FileSystem fs = Repository.getDefault().getDefaultFileSystem();
+        FileObject folder = fs.getRoot().getFileObject(FOLDER_ID);
+        FileObject[] children = folder.getChildren();
+
+        List<CustomFilter> customFilters = new ArrayList<CustomFilter>();
+        HashMap<CustomFilter, String> afterMap = new HashMap<CustomFilter, String>();
+        Set<CustomFilter> enabledSet = new HashSet<CustomFilter>();
+        HashMap<String, CustomFilter> map = new HashMap<String, CustomFilter>();
+
+        for (final FileObject fo : children) {
+            InputStream is = null;
+
+            String code = "";
+            FileLock lock = null;
+            try {
+                lock = fo.lock();
+                is = fo.getInputStream();
+                BufferedReader r = new BufferedReader(new InputStreamReader(is));
+                String s;
+                StringBuffer sb = new StringBuffer();
+                while ((s = r.readLine()) != null) {
+                    sb.append(s);
+                    sb.append("\n");
+                }
+                code = sb.toString();
+
+            } catch (FileNotFoundException ex) {
+                Exceptions.printStackTrace(ex);
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            } finally {
+                try {
+                    is.close();
+                } catch (IOException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+                lock.releaseLock();
+            }
+
+            String displayName = fo.getName();
+
+
+            final CustomFilter cf = new CustomFilter(displayName, code);
+            map.put(displayName, cf);
+
+            String after = (String) fo.getAttribute(AFTER_ID);
+            afterMap.put(cf, after);
+
+            Boolean enabled = (Boolean) fo.getAttribute(ENABLED_ID);
+            if (enabled != null && (boolean) enabled) {
+                enabledSet.add(cf);
+            }
+
+            cf.getChangedEvent().addListener(new FilterChangedListener(fo, cf));
+
+            customFilters.add(cf);
+        }
+
+        for (int j = 0; j < customFilters.size(); j++) {
+            for (int i = 0; i < customFilters.size(); i++) {
+                List<CustomFilter> copiedList = new ArrayList<CustomFilter>(customFilters);
+                for (CustomFilter cf : copiedList) {
+
+                    String after = afterMap.get(cf);
+
+                    if (map.containsKey(after)) {
+                        CustomFilter afterCf = map.get(after);
+                        int index = customFilters.indexOf(afterCf);
+                        int currentIndex = customFilters.indexOf(cf);
+
+                        if (currentIndex < index) {
+                            customFilters.remove(currentIndex);
+                            customFilters.add(index, cf);
+                        }
+                    }
+                }
+            }
+        }
+
+        for (CustomFilter cf : customFilters) {
+            sequence.addFilter(cf);
+            if (enabledSet.contains(cf)) {
+                filterChain.addFilter(cf);
+            }
+        }
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        setLayout(new java.awt.BorderLayout());
+
+    }// </editor-fold>//GEN-END:initComponents
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    // End of variables declaration//GEN-END:variables
+    /**
+     * Gets default instance. Do not use directly: reserved for *.settings files only,
+     * i.e. deserialization routines; otherwise you could get a non-deserialized instance.
+     * To obtain the singleton instance, use {@link findInstance}.
+     */
+    public static synchronized FilterTopComponent getDefault() {
+        if (instance == null) {
+            instance = new FilterTopComponent();
+        }
+        return instance;
+    }
+
+    /**
+     * Obtain the FilterTopComponent instance. Never call {@link #getDefault} directly!
+     */
+    public static synchronized FilterTopComponent findInstance() {
+        TopComponent win = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (win == null) {
+            ErrorManager.getDefault().log(ErrorManager.WARNING, "Cannot find Filter component. It will not be located properly in the window system.");
+            return getDefault();
+        }
+        if (win instanceof FilterTopComponent) {
+            return (FilterTopComponent) win;
+        }
+        ErrorManager.getDefault().log(ErrorManager.WARNING, "There seem to be multiple components with the '" + PREFERRED_ID + "' ID. That is a potential source of errors and unexpected behavior.");
+        return getDefault();
+    }
+
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_ALWAYS;
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    @Override
+    public ExplorerManager getExplorerManager() {
+        return manager;
+    }
+
+    @Override
+    public void componentOpened() {
+        Lookup.Template<FilterChain> tpl = new Lookup.Template<FilterChain>(FilterChain.class);
+        result = Utilities.actionsGlobalContext().lookup(tpl);
+        result.addLookupListener(this);
+    }
+
+    @Override
+    public void componentClosed() {
+        result.removeLookupListener(this);
+        result = null;
+    }
+
+    public void resultChanged(LookupEvent lookupEvent) {
+        setChain(Utilities.actionsGlobalContext().lookup(FilterChain.class));
+    /*
+    EditorTopComponent tc = EditorTopComponent.getActive();
+    if (tc != null) {
+    setChain(tc.getFilterChain());
+    }*/
+    }
+
+    public void setChain(FilterChain chain) {
+        updateComboBoxSelection();
+    }
+
+    private FileObject getFileObject(CustomFilter cf) {
+        FileObject fo = Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID + "/" + cf.getName());
+        if (fo == null) {
+            try {
+                fo = org.openide.filesystems.Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID).createData(cf.getName());
+            } catch (IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+        return fo;
+    }
+
+    @Override
+    public void writeExternal(ObjectOutput out) throws IOException {
+        super.writeExternal(out);
+
+        out.writeInt(filterSettings.size());
+        for (FilterSetting f : filterSettings) {
+            out.writeUTF(f.getName());
+
+            out.writeInt(f.getFilterCount());
+            for (Filter filter : f.getFilters()) {
+                CustomFilter cf = (CustomFilter) filter;
+                out.writeUTF(cf.getName());
+            }
+        }
+
+        CustomFilter prev = null;
+        for (Filter f : this.sequence.getFilters()) {
+            CustomFilter cf = (CustomFilter) f;
+            FileObject fo = getFileObject(cf);
+            if (getFilterChain().containsFilter(cf)) {
+                fo.setAttribute(ENABLED_ID, true);
+            } else {
+                fo.setAttribute(ENABLED_ID, false);
+            }
+
+            if (prev == null) {
+                fo.setAttribute(AFTER_ID, null);
+            } else {
+                fo.setAttribute(AFTER_ID, prev.getName());
+            }
+
+            prev = cf;
+        }
+    }
+
+    public CustomFilter findFilter(String name) {
+        for (Filter f : sequence.getFilters()) {
+
+            CustomFilter cf = (CustomFilter) f;
+            if (cf.getName().equals(name)) {
+                return cf;
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        super.readExternal(in);
+
+        int filterSettingsCount = in.readInt();
+        for (int i = 0; i < filterSettingsCount; i++) {
+            String name = in.readUTF();
+            FilterSetting s = new FilterSetting(name);
+            int filterCount = in.readInt();
+            for (int j = 0; j < filterCount; j++) {
+                String filterName = in.readUTF();
+                CustomFilter filter = findFilter(filterName);
+                if (filter != null) {
+                    s.addFilter(filter);
+                }
+            }
+
+            filterSettings.add(s);
+        }
+        updateComboBox();
+    }
+
+    final static class ResolvableHelper implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        public Object readResolve() {
+            return FilterTopComponent.getDefault();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+    <module name="com.sun.hotspot.igv.filterwindow" spec="1.0"/>
+    <instanceof class="org.openide.windows.TopComponent"/>
+    <instanceof class="com.sun.hotspot.igv.filterwindow.FilterTopComponent"/>
+    <instance class="com.sun.hotspot.igv.filterwindow.FilterTopComponent" method="getDefault"/>
+</settings>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tc-ref PUBLIC "-//NetBeans//DTD Top Component in Mode Properties 2.0//EN" "http://www.netbeans.org/dtds/tc-ref2_0.dtd">
+<tc-ref version="2.0" >
+    <module name="com.sun.hotspot.igv.filterwindow" spec="1.0"/>
+    <tc-id id="FilterTopComponent"/>
+    <state opened="true"/>
+</tc-ref>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,10 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+CTL_FilterAction=Open Filter Window
+CTL_MoveFilterDownAction=Move downwards
+CTL_MoveFilterUpAction=Move upwards
+CTL_NewFilterAction=New filter...
+CTL_RemoveFilterAction=Remove
+CTL_RemoveFilterSettingsAction=Remove filter setting
+CTL_SaveFilterSettingsAction=Save filter settings...
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.*;
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FilterAction extends AbstractAction {
+
+    public FilterAction() {
+        super(NbBundle.getMessage(FilterAction.class, "CTL_FilterAction"));
+    }
+
+    public void actionPerformed(ActionEvent evt) {
+        TopComponent win = FilterTopComponent.findInstance();
+        win.open();
+        win.requestActive();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class MoveFilterDownAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        for (Node n : activatedNodes) {
+            Filter c = n.getLookup().lookup(Filter.class);
+            FilterTopComponent.findInstance().getSequence().moveFilterDown(c);
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_EXACTLY_ONE;
+    }
+
+    public MoveFilterDownAction() {
+
+        putValue(Action.SHORT_DESCRIPTION, "Move filter downwards");
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(MoveFilterUpAction.class, "CTL_MoveFilterDownAction");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            Filter.class
+        };
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/down.gif";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+        putValue("noIconInMenu", Boolean.TRUE);
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class MoveFilterUpAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        for (Node n : activatedNodes) {
+            Filter c = n.getLookup().lookup(Filter.class);
+            FilterTopComponent.findInstance().getSequence().moveFilterUp(c);
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_EXACTLY_ONE;
+    }
+
+    public MoveFilterUpAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Move filter upwards");
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(MoveFilterUpAction.class, "CTL_MoveFilterUpAction");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            Filter.class
+        };
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/up.gif";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+        putValue("noIconInMenu", Boolean.TRUE);
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NewFilterAction extends CallableSystemAction {
+
+    public NewFilterAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Create new filter");
+    }
+
+    public void performAction() {
+        FilterTopComponent.findInstance().newFilter();
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SaveFilterSettingsAction.class, "CTL_NewFilterAction");
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/plus.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,99 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import com.sun.hotspot.igv.filter.Filter;
+import javax.swing.Action;
+import javax.swing.JOptionPane;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CookieAction;
+import org.openide.windows.WindowManager;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveFilterAction extends CookieAction {
+
+    protected void performAction(Node[] activatedNodes) {
+        Object[] options = {"Yes",
+            "No",
+            "Cancel"
+        };
+        int n = JOptionPane.showOptionDialog(WindowManager.getDefault().getMainWindow(),
+                "Do you really want to delete " + activatedNodes.length + " filter/s?", "Delete?",
+                JOptionPane.YES_NO_CANCEL_OPTION,
+                JOptionPane.QUESTION_MESSAGE,
+                null,
+                options,
+                options[2]);
+
+        if (n == JOptionPane.YES_OPTION) {
+            for (int i = 0; i < activatedNodes.length; i++) {
+                FilterTopComponent.findInstance().removeFilter(activatedNodes[i].getLookup().lookup(Filter.class));
+            }
+        }
+    }
+
+    protected int mode() {
+        return CookieAction.MODE_ALL;
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(RemoveFilterAction.class, "CTL_RemoveFilterAction");
+    }
+
+    public RemoveFilterAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Remove filter");
+    }
+
+    protected Class[] cookieClasses() {
+        return new Class[]{
+            Filter.class
+        };
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+        putValue("noIconInMenu", Boolean.TRUE);
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/minus.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class RemoveFilterSettingsAction extends CallableSystemAction {
+
+    public void performAction() {
+        FilterTopComponent.findInstance().removeFilterSetting();
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(RemoveFilterSettingsAction.class, "CTL_RemoveFilterSettingsAction");
+    }
+
+    public RemoveFilterSettingsAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Remove filter profile");
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/delete.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.filterwindow.actions;
+
+import com.sun.hotspot.igv.filterwindow.FilterTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class SaveFilterSettingsAction extends CallableSystemAction {
+
+    public void performAction() {
+        FilterTopComponent.findInstance().addFilterSetting();
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(SaveFilterSettingsAction.class, "CTL_SaveFilterSettingsAction");
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public SaveFilterSettingsAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Create new filter profile");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/filterwindow/images/add.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mode version="2.1">
+    <name unique="customRightTopMode" />
+    <kind type="view" />
+    <state type="joined" />
+    <constraints>
+        <path orientation="horizontal" number="45" weight="0.21761006289308177"/>
+        <path orientation="vertical" number="0" weight="0.2510122989593188"/>
+    </constraints>
+    <bounds x="0" y="0" width="0" height="0" />
+    <frame state="0"/>
+    <active-tc id="FilterTopComponent"/>
+    <empty-behavior permanent="false"/>
+</mode>
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Edit">
+        <file name="com-sun-hotspot-igv-filterwindow-actions-MoveFilterDownAction.instance">
+            <attr name="position" intvalue="300"/>
+        </file>
+        <file name="com-sun-hotspot-igv-filterwindow-actions-MoveFilterUpAction.instance">
+            <attr name="position" intvalue="400"/>
+        </file>
+        <file name="com-sun-hotspot-igv-filterwindow-actions-RemoveFilterAction.instance">
+            <attr name="position" intvalue="500"/>
+        </file>
+        <file name="com-sun-hotspot-igv-filterwindow-actions-RemoveFilterSettingsAction.instance">
+            <attr name="position" intvalue="600"/>
+        </file>
+        <file name="com-sun-hotspot-igv-filterwindow-actions-SaveFilterSettingsAction.instance">
+            <attr name="position" intvalue="900"/>
+        </file>
+    </folder>
+    <folder name="Window">
+        <file name="com-sun-hotspot-igv-coordinator-actions-FilterAction.instance"/>
+    </folder>
+    <folder name="Menu">
+        <folder name="Window">
+            <file name="FilterAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-filterwindow-actions-FilterAction.instance"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Windows2">
+        <folder name="Components">
+            <file name="FilterTopComponent.settings" url="FilterTopComponentSettings.xml"/>
+        </folder>
+        <folder name="Modes">
+            <file name="customRightTopMode.wsmode" url="customRightTopWsmode.xml"/>
+            <folder name="customRightTopMode">
+                <file name="FilterTopComponent.wstcref" url="FilterTopComponentWstcref.xml"/>
+            </folder>
+        </folder>
+    </folder>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.graph" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.graph.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.graph
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/graph/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.graph-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=b2bc2f02
+build.xml.script.CRC32=486d5dab
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=b2bc2f02
+nbproject/build-impl.xml.script.CRC32=17fa0f49
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.graph</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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.
+ *
+ * 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 com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class AndSelector implements Selector {
+
+    private Selector selector1;
+    private Selector selector2;
+
+    public AndSelector(Selector s1, Selector s2) {
+        this.selector1 = s1;
+        this.selector2 = s2;
+    }
+
+    public List<Figure> selected(Diagram d) {
+        List<Figure> l1 = selector1.selected(d);
+        List<Figure> l2 = selector2.selected(d);
+        List<Figure> result = new ArrayList<Figure>();
+        for (Figure f : l2) {
+            if (l1.contains(f)) {
+                result.add(f);
+            }
+        }
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.layout.Cluster;
+import java.awt.Rectangle;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Block implements Cluster {
+
+    private InputBlock inputBlock;
+    private Rectangle bounds;
+    private Diagram diagram;
+
+    public Block(InputBlock inputBlock, Diagram diagram) {
+        this.inputBlock = inputBlock;
+        this.diagram = diagram;
+    }
+
+    public Cluster getOuter() {
+        return null;
+    }
+
+    public InputBlock getInputBlock() {
+        return inputBlock;
+    }
+
+    public Set<? extends Cluster> getSuccessors() {
+        Set<Block> succs = new HashSet<Block>();
+        for (InputBlock b : inputBlock.getSuccessors()) {
+            succs.add(diagram.getBlock(b));
+        }
+        return succs;
+    }
+
+    public Set<? extends Cluster> getPredecessors() {
+        Set<Block> succs = new HashSet<Block>();
+        for (InputBlock b : inputBlock.getPredecessors()) {
+            succs.add(diagram.getBlock(b));
+        }
+        return succs;
+    }
+
+    public void setBounds(Rectangle r) {
+        this.bounds = r;
+    }
+
+    public Rectangle getBounds() {
+        return bounds;
+    }
+
+    public int compareTo(Cluster o) {
+        return toString().compareTo(o.toString());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Graph
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,123 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Color;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Connection implements Source.Provider, Link {
+
+    public enum ConnectionStyle {
+
+        NORMAL,
+        DASHED,
+        BOLD
+    }
+    private InputSlot inputSlot;
+    private OutputSlot outputSlot;
+    private Source source;
+    private Color color;
+    private ConnectionStyle style;
+    private List<Point> controlPoints;
+
+    protected Connection(InputSlot inputSlot, OutputSlot outputSlot) {
+        this.inputSlot = inputSlot;
+        this.outputSlot = outputSlot;
+        this.inputSlot.connections.add(this);
+        this.outputSlot.connections.add(this);
+        controlPoints = new ArrayList<Point>();
+        Figure sourceFigure = this.outputSlot.getFigure();
+        Figure destFigure = this.inputSlot.getFigure();
+        sourceFigure.addSuccessor(destFigure);
+        destFigure.addPredecessor(sourceFigure);
+        source = new Source();
+
+        this.color = Color.BLACK;
+        this.style = ConnectionStyle.NORMAL;
+    }
+
+    public InputSlot getInputSlot() {
+        return inputSlot;
+    }
+
+    public OutputSlot getOutputSlot() {
+        return outputSlot;
+    }
+
+    public Color getColor() {
+        return color;
+    }
+
+    public ConnectionStyle getStyle() {
+        return style;
+    }
+
+    public void setColor(Color c) {
+        color = c;
+    }
+
+    public void setStyle(ConnectionStyle s) {
+        style = s;
+    }
+
+    public Source getSource() {
+        return source;
+    }
+
+    public void remove() {
+        inputSlot.getFigure().removePredecessor(outputSlot.getFigure());
+        inputSlot.connections.remove(this);
+        outputSlot.getFigure().removeSuccessor(inputSlot.getFigure());
+        outputSlot.connections.remove(this);
+    }
+
+    @Override
+    public String toString() {
+        return "Connection(" + getFrom().getVertex() + " to " + getTo().getVertex() + ")";
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public List<Point> getControlPoints() {
+        return controlPoints;
+    }
+
+    public void setControlPoints(List<Point> list) {
+        controlPoints = list;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,294 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Font;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Diagram {
+
+    private List<Figure> figures;
+    private Map<InputBlock, Block> blocks;
+    private InputGraph graph;
+    private int curId;
+    private String nodeText;
+    private Font font;
+
+    public Font getFont() {
+        return font;
+    }
+
+    private Diagram() {
+        figures = new ArrayList<Figure>();
+        blocks = new HashMap<InputBlock, Block>();
+        this.nodeText = "";
+        this.font = new Font("Serif", Font.PLAIN, 14);
+    }
+
+    public Block getBlock(InputBlock b) {
+        return blocks.get(b);
+    }
+
+    public String getNodeText() {
+        return nodeText;
+    }
+
+    public void schedule(Collection<InputBlock> newBlocks) {
+        graph.schedule(newBlocks);
+        updateBlocks();
+    }
+
+    private void updateBlocks() {
+        blocks.clear();
+        for (InputBlock b : graph.getBlocks()) {
+            Block curBlock = new Block(b, this);
+            blocks.put(b, curBlock);
+        }
+    }
+
+    public Diagram getNext() {
+        return Diagram.createDiagram(graph.getNext(), nodeText);
+    }
+
+    public Collection<Block> getBlocks() {
+        return Collections.unmodifiableCollection(blocks.values());
+    }
+
+    public Diagram getPrev() {
+        return Diagram.createDiagram(graph.getPrev(), nodeText);
+    }
+
+    public List<Figure> getFigures() {
+        return Collections.unmodifiableList(figures);
+    }
+
+    public Figure createFigure() {
+        Figure f = new Figure(this, curId);
+        curId++;
+        this.figures.add(f);
+        return f;
+    }
+
+    public Connection createConnection(InputSlot inputSlot, OutputSlot outputSlot) {
+        assert inputSlot.getFigure().getDiagram() == this;
+        assert outputSlot.getFigure().getDiagram() == this;
+        return new Connection(inputSlot, outputSlot);
+    }
+
+    public static Diagram createDiagram(InputGraph graph, String nodeText) {
+        if (graph == null) {
+            return null;
+        }
+
+        Diagram d = new Diagram();
+        d.graph = graph;
+        d.nodeText = nodeText;
+
+        d.updateBlocks();
+
+        Collection<InputNode> nodes = graph.getNodes();
+        Hashtable<Integer, Figure> figureHash = new Hashtable<Integer, Figure>();
+        for (InputNode n : nodes) {
+            Figure f = d.createFigure();
+            f.getSource().addSourceNode(n);
+            f.getProperties().add(n.getProperties());
+            figureHash.put(n.getId(), f);
+        }
+
+        for (InputEdge e : graph.getEdges()) {
+
+            int from = e.getFrom();
+            int to = e.getTo();
+            Figure fromFigure = figureHash.get(from);
+            Figure toFigure = figureHash.get(to);
+            assert fromFigure != null && toFigure != null;
+
+            int toIndex = e.getToIndex();
+
+            while (fromFigure.getOutputSlots().size() <= 0) {
+                fromFigure.createOutputSlot();
+            }
+
+            OutputSlot outputSlot = fromFigure.getOutputSlots().get(0);
+
+            while (toFigure.getInputSlots().size() <= toIndex) {
+                toFigure.createInputSlot();
+            }
+
+            InputSlot inputSlot = toFigure.getInputSlots().get(toIndex);
+
+            Connection c = d.createConnection(inputSlot, outputSlot);
+
+            if (e.getState() == InputEdge.State.NEW) {
+                c.setStyle(Connection.ConnectionStyle.BOLD);
+            } else if (e.getState() == InputEdge.State.DELETED) {
+                c.setStyle(Connection.ConnectionStyle.DASHED);
+            }
+        }
+
+
+        return d;
+    }
+
+    public void removeAllFigures(Set<Figure> figuresToRemove) {
+        for (Figure f : figuresToRemove) {
+            freeFigure(f);
+        }
+
+        ArrayList<Figure> newFigures = new ArrayList<Figure>();
+        for (Figure f : this.figures) {
+            if (!figuresToRemove.contains(f)) {
+                newFigures.add(f);
+            }
+        }
+        figures = newFigures;
+    }
+
+    private void freeFigure(Figure succ) {
+
+        List<InputSlot> inputSlots = new ArrayList<InputSlot>(succ.getInputSlots());
+        for (InputSlot s : inputSlots) {
+            succ.removeInputSlot(s);
+        }
+
+        List<OutputSlot> outputSlots = new ArrayList<OutputSlot>(succ.getOutputSlots());
+        for (OutputSlot s : outputSlots) {
+            succ.removeOutputSlot(s);
+        }
+
+        assert succ.getInputSlots().size() == 0;
+        assert succ.getOutputSlots().size() == 0;
+        assert succ.getPredecessors().size() == 0;
+        assert succ.getSuccessors().size() == 0;
+
+    }
+
+    public void removeFigure(Figure succ) {
+
+        assert this.figures.contains(succ);
+        freeFigure(succ);
+        this.figures.remove(succ);
+    }
+
+    public String getName() {
+        return graph.getName();
+    }
+
+    public InputGraph getGraph() {
+        return graph;
+    }
+
+    public Set<Connection> getConnections() {
+
+        Set<Connection> connections = new HashSet<Connection>();
+        for (Figure f : figures) {
+
+            for (InputSlot s : f.getInputSlots()) {
+                connections.addAll(s.getConnections());
+            }
+        }
+
+        return connections;
+    }
+
+    public Figure getRootFigure() {
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(figures);
+        Figure root = selector.selectSingle("name", "Root");
+        if (root == null) {
+            root = selector.selectSingle("name", "Start");
+        }
+        if (root == null) {
+            List<Figure> rootFigures = getRootFigures();
+            if (rootFigures.size() > 0) {
+                root = rootFigures.get(0);
+            } else if (figures.size() > 0) {
+                root = figures.get(0);
+            }
+        }
+
+        return root;
+    }
+
+    public void printStatistics() {
+        System.out.println("=============================================================");
+        System.out.println("Diagram statistics");
+
+        List<Figure> tmpFigures = getFigures();
+        Set<Connection> connections = getConnections();
+
+        System.out.println("Number of figures: " + tmpFigures.size());
+        System.out.println("Number of connections: " + connections.size());
+
+        List<Figure> figuresSorted = new ArrayList<Figure>(tmpFigures);
+        Collections.sort(figuresSorted, new Comparator<Figure>() {
+
+            public int compare(Figure a, Figure b) {
+                return b.getPredecessors().size() + b.getSuccessors().size() - a.getPredecessors().size() - a.getSuccessors().size();
+            }
+        });
+
+        final int COUNT = 10;
+        int z = 0;
+        for (Figure f : figuresSorted) {
+
+            z++;
+            int sum = f.getPredecessors().size() + f.getSuccessors().size();
+            System.out.println("#" + z + ": " + f + ", predCount=" + f.getPredecessors().size() + " succCount=" + f.getSuccessors().size());
+            if (sum < COUNT) {
+                break;
+            }
+
+        }
+
+        System.out.println("=============================================================");
+    }
+
+    public List<Figure> getRootFigures() {
+        ArrayList<Figure> rootFigures = new ArrayList<Figure>();
+        for (Figure f : figures) {
+            if (f.getPredecessors().size() == 0) {
+                rootFigures.add(f);
+            }
+        }
+        return rootFigures;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,328 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Vertex;
+import com.sun.hotspot.igv.data.Properties;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Figure extends Properties.Object implements Source.Provider, Vertex {
+
+    public static final int INSET = 6;
+    public static final int SLOT_WIDTH = 10;
+    public static final int SLOT_START = 3;
+    public static final boolean VERTICAL_LAYOUT = true;
+    protected List<InputSlot> inputSlots;
+    protected List<OutputSlot> outputSlots;
+    private Source source;
+    private Diagram diagram;
+    private Point position;
+    private List<Figure> predecessors;
+    private List<Figure> successors;
+    private Color color;
+    private int id;
+    private String idString;
+    private String[] lines;
+    private int heightCash = -1;
+    private int widthCash = -1;
+
+    public int getHeight() {
+        if (heightCash == -1) {
+            BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
+            Graphics g = image.getGraphics();
+            g.setFont(diagram.getFont());
+            FontMetrics metrics = g.getFontMetrics();
+            String nodeText = diagram.getNodeText();
+            heightCash = nodeText.split("\n").length * metrics.getHeight() + INSET;
+        }
+        return heightCash;
+    }
+
+    public int getWidth() {
+        if (widthCash == -1) {
+            int max = 0;
+            BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
+            Graphics g = image.getGraphics();
+            g.setFont(diagram.getFont());
+            FontMetrics metrics = g.getFontMetrics();
+            for (String s : lines) {
+                int cur = metrics.stringWidth(s);
+                if (cur > max) {
+                    max = cur;
+                }
+            }
+            widthCash = max + INSET;
+        }
+        return widthCash;
+    }
+
+    protected Figure(Diagram diagram, int id) {
+        this.diagram = diagram;
+        this.source = new Source();
+        inputSlots = new ArrayList<InputSlot>(5);
+        outputSlots = new ArrayList<OutputSlot>(1);
+        predecessors = new ArrayList<Figure>(6);
+        successors = new ArrayList<Figure>(6);
+        this.id = id;
+        idString = Integer.toString(id);
+
+        this.position = new Point(0, 0);
+        this.color = Color.WHITE;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setColor(Color color) {
+        this.color = color;
+    }
+
+    public Color getColor() {
+        return color;
+    }
+
+    public List<Figure> getPredecessors() {
+        return Collections.unmodifiableList(predecessors);
+    }
+
+    public Set<Figure> getPredecessorSet() {
+        Set<Figure> result = new HashSet<Figure>();
+        for (Figure f : getPredecessors()) {
+            result.add(f);
+        }
+        return Collections.unmodifiableSet(result);
+    }
+
+    public Set<Figure> getSuccessorSet() {
+        Set<Figure> result = new HashSet<Figure>();
+        for (Figure f : getSuccessors()) {
+            result.add(f);
+        }
+        return Collections.unmodifiableSet(result);
+    }
+
+    public List<Figure> getSuccessors() {
+        return Collections.unmodifiableList(successors);
+    }
+
+    protected void addPredecessor(Figure f) {
+        this.predecessors.add(f);
+    }
+
+    protected void addSuccessor(Figure f) {
+        this.successors.add(f);
+    }
+
+    protected void removePredecessor(Figure f) {
+        assert predecessors.contains(f);
+        predecessors.remove(f);
+    }
+
+    protected void removeSuccessor(Figure f) {
+        assert successors.contains(f);
+        successors.remove(f);
+    }
+
+    public void setPosition(Point p) {
+        this.position = p;
+    }
+
+    public Point getPosition() {
+        return position;
+    }
+
+    public Diagram getDiagram() {
+        return diagram;
+    }
+
+    public Source getSource() {
+        return source;
+    }
+
+    public InputSlot createInputSlot() {
+        InputSlot slot = new InputSlot(this, -1);
+        inputSlots.add(slot);
+        return slot;
+    }
+
+    public InputSlot createInputSlot(int index) {
+        InputSlot slot = new InputSlot(this, index);
+        inputSlots.add(slot);
+        Collections.sort(inputSlots, Slot.slotIndexComparator);
+        return slot;
+    }
+
+    public void removeSlot(Slot s) {
+
+        assert inputSlots.contains(s) || outputSlots.contains(s);
+
+        List<Connection> connections = new ArrayList<Connection>(s.getConnections());
+        for (Connection c : connections) {
+            c.remove();
+        }
+
+        if (inputSlots.contains(s)) {
+            inputSlots.remove(s);
+        } else if (outputSlots.contains(s)) {
+            outputSlots.remove(s);
+        }
+    }
+
+    public OutputSlot createOutputSlot() {
+        OutputSlot slot = new OutputSlot(this, -1);
+        outputSlots.add(slot);
+        return slot;
+    }
+
+    public OutputSlot createOutputSlot(int index) {
+        OutputSlot slot = new OutputSlot(this, index);
+        outputSlots.add(slot);
+        Collections.sort(outputSlots, Slot.slotIndexComparator);
+        return slot;
+    }
+
+    public List<InputSlot> getInputSlots() {
+        return Collections.unmodifiableList(inputSlots);
+    }
+
+    public List<OutputSlot> getOutputSlots() {
+        return Collections.unmodifiableList(outputSlots);
+    }
+
+    void removeInputSlot(InputSlot s) {
+        s.removeAllConnections();
+        inputSlots.remove(s);
+    }
+
+    void removeOutputSlot(OutputSlot s) {
+        s.removeAllConnections();
+        outputSlots.remove(s);
+    }
+
+    public String[] getLines() {
+        if (lines == null) {
+            updateLines();
+        }
+        return lines;
+    }
+
+    public void updateLines() {
+        String[] strings = diagram.getNodeText().split("\n");
+        String[] result = new String[strings.length];
+
+        for (int i = 0; i < strings.length; i++) {
+            result[i] = resolveString(strings[i]);
+        }
+
+        lines = result;
+    }
+
+    private String resolveString(String string) {
+
+        StringBuilder sb = new StringBuilder();
+        boolean inBrackets = false;
+        StringBuilder curIdent = new StringBuilder();
+
+        for (int i = 0; i < string.length(); i++) {
+            char c = string.charAt(i);
+            if (inBrackets) {
+                if (c == ']') {
+                    String value = getProperties().get(curIdent.toString());
+                    if (value == null) {
+                        value = "";
+                    }
+                    sb.append(value);
+                    inBrackets = false;
+                } else {
+                    curIdent.append(c);
+                }
+            } else {
+                if (c == '[') {
+                    inBrackets = true;
+                    curIdent = new StringBuilder();
+                } else {
+                    sb.append(c);
+                }
+            }
+        }
+
+        return sb.toString();
+    }
+
+    public Dimension getSize() {
+        if (VERTICAL_LAYOUT) {
+            int width = Math.max(getWidth(), Figure.SLOT_WIDTH * (Math.max(inputSlots.size(), outputSlots.size()) + 1));
+            int height = getHeight() + 2 * Figure.SLOT_WIDTH;
+            return new Dimension(width, height);
+        } else {
+            int width = getWidth() + 2 * Figure.SLOT_WIDTH;
+            int height = Figure.SLOT_WIDTH * (Math.max(inputSlots.size(), outputSlots.size()) + 1);
+            return new Dimension(width, height);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return idString;
+    }
+
+    public Cluster getCluster() {
+        if (getSource().getSourceNodes().size() == 0) {
+            assert false : "Should never reach here, every figure must have at least one source node!";
+            return null;
+        } else {
+            Cluster result = diagram.getBlock(diagram.getGraph().getBlock(getSource().getSourceNodes().get(0)));
+            assert result != null;
+            return result;
+        }
+    }
+
+    public boolean isRoot() {
+        if (source.getSourceNodes().size() > 0 && source.getSourceNodes().get(0).getProperties().get("name").equals("Root")) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public int compareTo(Vertex f) {
+        return toString().compareTo(f.toString());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputSlot extends Slot {
+
+    protected InputSlot(Figure figure, int wantedIndex) {
+        super(figure, wantedIndex);
+    }
+
+    public int getPosition() {
+        return getFigure().getInputSlots().indexOf(this);
+    }
+
+    public void setPosition(int position) {
+        List<InputSlot> inputSlots = getFigure().inputSlots;
+        InputSlot s = inputSlots.remove(position);
+        inputSlots.add(position, s);
+    }
+
+    public Point getRelativePosition() {
+        return new Point(getFigure().getWidth() * (getPosition() + 1) / (getFigure().getInputSlots().size() + 1), Figure.SLOT_WIDTH - Figure.SLOT_START);
+    }
+
+    @Override
+    public String toString() {
+        return "InputSlot[figure=" + this.getFigure().toString() + ", position=" + getPosition() + "]";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InvertSelector implements Selector {
+
+    private Selector selector;
+
+    public InvertSelector(Selector selector) {
+        this.selector = selector;
+    }
+
+    public List<Figure> selected(Diagram d) {
+
+        List<Figure> result = new ArrayList<Figure>();
+        List<Figure> otherResult = selector.selected(d);
+        for (Figure f : d.getFigures()) {
+            if (!otherResult.contains(f)) {
+                result.add(f);
+            }
+        }
+
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MatcherSelector implements Selector {
+
+    private PropertyMatcher matcher;
+
+    public MatcherSelector(PropertyMatcher matcher) {
+        this.matcher = matcher;
+    }
+
+    public List<Figure> selected(Diagram d) {
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(d.getFigures());
+        List<Figure> list = selector.selectMultiple(matcher);
+        return list;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OrSelector implements Selector {
+
+    private Selector selector1;
+    private Selector selector2;
+
+    /** Creates a new instance of OrSelector */
+    public OrSelector(Selector s1, Selector s2) {
+        this.selector1 = s1;
+        this.selector2 = s2;
+    }
+
+    public List<Figure> selected(Diagram d) {
+
+        List<Figure> l1 = selector1.selected(d);
+        List<Figure> l2 = selector2.selected(d);
+
+        for (Figure f : l2) {
+            if (!l1.contains(f)) {
+                l1.add(f);
+            }
+        }
+
+        return l1;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutputSlot extends Slot {
+
+    protected OutputSlot(Figure figure, int wantedIndex) {
+        super(figure, wantedIndex);
+    }
+
+    public int getPosition() {
+        return getFigure().getOutputSlots().indexOf(this);
+    }
+
+    public void setPosition(int position) {
+        OutputSlot s = getFigure().outputSlots.remove(position);
+        getFigure().outputSlots.add(position, s);
+    }
+
+    public Point getRelativePosition() {
+        return new Point(getFigure().getWidth() * (getPosition() + 1) / (getFigure().getOutputSlots().size() + 1), getFigure().getSize().height - Figure.SLOT_WIDTH + Figure.SLOT_START);
+    }
+
+    @Override
+    public String toString() {
+        return "OutputSlot[figure=" + this.getFigure().toString() + ", position=" + getPosition() + "]";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PredecessorSelector implements Selector {
+
+    private Selector innerSelector;
+
+    public PredecessorSelector(Selector innerSelector) {
+        this.innerSelector = innerSelector;
+    }
+
+    public List<Figure> selected(Diagram d) {
+        List<Figure> inner = innerSelector.selected(d);
+        List<Figure> result = new ArrayList<Figure>();
+        for (Figure f : d.getFigures()) {
+            boolean saved = false;
+            for (Figure f2 : f.getSuccessors()) {
+                if (inner.contains(f2)) {
+                    saved = true;
+                }
+            }
+
+            if (saved) {
+                result.add(f);
+            }
+        }
+
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Selector {
+
+    List<Figure> selected(Diagram d);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,125 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Comparator;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class Slot implements Port, Source.Provider {
+
+    private int wantedIndex;
+    private String name;
+    private String shortName; // 1 - 2 characters
+    private Source source;
+    protected List<Connection> connections;
+    private Figure figure;
+
+    protected Slot(Figure figure, int wantedIndex) {
+        this.figure = figure;
+        connections = new ArrayList<Connection>(2);
+        source = new Source();
+        this.wantedIndex = wantedIndex;
+        name = "";
+        shortName = "";
+        assert figure != null;
+    }
+    public static final Comparator<Slot> slotIndexComparator = new Comparator<Slot>() {
+
+        public int compare(Slot o1, Slot o2) {
+            return o1.wantedIndex - o2.wantedIndex;
+        }
+    };
+    public static final Comparator<Slot> slotFigureComparator = new Comparator<Slot>() {
+
+        public int compare(Slot o1, Slot o2) {
+            return o1.figure.getId() - o2.figure.getId();
+        }
+    };
+
+    public int getWantedIndex() {
+        return wantedIndex;
+    }
+
+    public Source getSource() {
+        return source;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setShortName(String s) {
+        assert s != null;
+        assert s.length() <= 2;
+        this.shortName = s;
+
+    }
+
+    public String getShortName() {
+        return shortName;
+    }
+
+    public boolean getShowName() {
+        return getShortName() != null && getShortName().length() > 0;
+    }
+
+    public void setName(String s) {
+        if (s == null) {
+            s = "";
+        }
+        this.name = s;
+    }
+
+    public Figure getFigure() {
+        assert figure != null;
+        return figure;
+    }
+
+    public List<Connection> getConnections() {
+        return Collections.unmodifiableList(connections);
+    }
+
+    public void removeAllConnections() {
+        List<Connection> connectionsCopy = new ArrayList<Connection>(this.connections);
+        for (Connection c : connectionsCopy) {
+            c.remove();
+        }
+    }
+
+    public Vertex getVertex() {
+        return figure;
+    }
+
+    public abstract int getPosition();
+
+    public abstract void setPosition(int position);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,100 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Source {
+
+    private List<InputNode> sourceNodes;
+    private Set<Integer> set;
+
+    public Source() {
+        sourceNodes = new ArrayList<InputNode>(1);
+    }
+
+    public List<InputNode> getSourceNodes() {
+        return Collections.unmodifiableList(sourceNodes);
+    }
+
+    public Set<Integer> getSourceNodesAsSet() {
+        if (set == null) {
+            set = new HashSet<Integer>();
+            for (InputNode n : sourceNodes) {
+                int id = n.getId();
+                //if(id < 0) id = -id;
+                set.add(id);
+            }
+        }
+        return set;
+    }
+
+    public void addSourceNode(InputNode n) {
+        sourceNodes.add(n);
+        set = null;
+    }
+
+    public void removeSourceNode(InputNode n) {
+        sourceNodes.remove(n);
+        set = null;
+    }
+
+    public interface Provider {
+
+        public Source getSource();
+    }
+
+    public void setSourceNodes(List<InputNode> sourceNodes) {
+        this.sourceNodes = sourceNodes;
+        set = null;
+    }
+
+    public void addSourceNodes(Source s) {
+        for (InputNode n : s.getSourceNodes()) {
+            sourceNodes.add(n);
+        }
+        set = null;
+    }
+
+    public boolean isInBlock(InputGraph g, InputBlock blockNode) {
+
+        for (InputNode n : this.getSourceNodes()) {
+            if (g.getBlock(n) == blockNode) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SuccessorSelector implements Selector {
+
+    private Selector innerSelector;
+
+    public SuccessorSelector(Selector innerSelector) {
+        this.innerSelector = innerSelector;
+    }
+
+    public List<Figure> selected(Diagram d) {
+        List<Figure> inner = innerSelector.selected(d);
+        List<Figure> result = new ArrayList<Figure>();
+        for (Figure f : d.getFigures()) {
+            boolean saved = false;
+            for (Figure f2 : f.getPredecessors()) {
+                if (inner.contains(f2)) {
+                    saved = true;
+                }
+            }
+
+            if (saved) {
+                result.add(f);
+            }
+        }
+
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.hierarchicallayout" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.hierarchicallayout.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.hierarchicallayout
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/hierarchicallayout/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.hierarchicallayout-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=de087df9
+build.xml.script.CRC32=98977c36
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=de087df9
+nbproject/build-impl.xml.script.CRC32=0d734625
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.hierarchicallayout</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=HierarchicalLayout
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,63 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterEdge implements Link {
+
+    private ClusterNode from;
+    private ClusterNode to;
+    private List<Point> points;
+
+    public ClusterEdge(ClusterNode from, ClusterNode to) {
+        assert from != null;
+        assert to != null;
+        this.from = from;
+        this.to = to;
+    }
+
+    public Port getTo() {
+        return to.getInputSlot();
+    }
+
+    public Port getFrom() {
+        return from.getInputSlot();
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.points = p;
+    }
+
+    public List<Point> getControlPoints() {
+        return points;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterIngoingConnection implements Link {
+
+    private List<Point> controlPoints;
+    private ClusterInputSlotNode inputSlotNode;
+    private Link connection;
+    private Port inputSlot;
+    private Port outputSlot;
+
+    public ClusterIngoingConnection(ClusterInputSlotNode inputSlotNode, Link c) {
+        this.inputSlotNode = inputSlotNode;
+        this.connection = c;
+        this.controlPoints = new ArrayList<Point>();
+
+        inputSlot = c.getTo();
+        outputSlot = inputSlotNode.getOutputSlot();
+    }
+
+    public Link getConnection() {
+        return connection;
+    }
+
+    public ClusterInputSlotNode getInputSlotNode() {
+        return inputSlotNode;
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.controlPoints = p;
+    }
+
+    public List<Point> getControlPoints() {
+        return controlPoints;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,145 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterInputSlotNode implements Vertex {
+
+    private final int SIZE = 0;
+    private Point position;
+    private Port inputSlot;
+    private Port outputSlot;
+    private ClusterNode blockNode;
+    private InterClusterConnection interBlockConnection;
+    private Cluster cluster;
+    private ClusterIngoingConnection conn;
+
+    public void setIngoingConnection(ClusterIngoingConnection c) {
+        conn = c;
+    }
+
+    public ClusterIngoingConnection getIngoingConnection() {
+        return conn;
+    }
+    private String id;
+
+    @Override
+    public String toString() {
+        return id;
+    }
+
+    public ClusterInputSlotNode(ClusterNode n, String id) {
+        this.blockNode = n;
+        this.id = id;
+
+        n.addSubNode(this);
+
+        final Vertex thisNode = this;
+        final ClusterNode thisBlockNode = blockNode;
+
+        outputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point(0, 0);
+            }
+
+            public Vertex getVertex() {
+                return thisNode;
+            }
+
+            @Override
+            public String toString() {
+                return "OutPort of " + thisNode.toString();
+            }
+        };
+
+        inputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                Point p = new Point(thisNode.getPosition());
+                p.x += ClusterNode.BORDER;
+                p.y = 0;
+                return p;
+            }
+
+            public Vertex getVertex() {
+                return thisBlockNode;
+            }
+
+            @Override
+            public String toString() {
+                return "InPort of " + thisNode.toString();
+            }
+        };
+    }
+
+    public Port getInputSlot() {
+        return inputSlot;
+    }
+
+    public InterClusterConnection getInterBlockConnection() {
+        return interBlockConnection;
+    }
+
+    public Port getOutputSlot() {
+        return outputSlot;
+    }
+
+    public Dimension getSize() {
+        return new Dimension(SIZE, SIZE);
+    }
+
+    public void setPosition(Point p) {
+        this.position = p;
+    }
+
+    public Point getPosition() {
+        return position;
+    }
+
+    public void setInterBlockConnection(InterClusterConnection interBlockConnection) {
+        this.interBlockConnection = interBlockConnection;
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public boolean isRoot() {
+        return true;
+    }
+
+    public int compareTo(Vertex o) {
+        return toString().compareTo(o.toString());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,233 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterNode implements Vertex {
+
+    private Cluster cluster;
+    private Port inputSlot;
+    private Port outputSlot;
+    private Set<Vertex> subNodes;
+    private Dimension size;
+    private Point position;
+    private Set<Link> subEdges;
+    private boolean dirty;
+    private boolean root;
+    private String name;
+    public static final int BORDER = 20;
+
+    public ClusterNode(Cluster cluster, String name) {
+        this.subNodes = new HashSet<Vertex>();
+        this.subEdges = new HashSet<Link>();
+        this.cluster = cluster;
+        position = new Point(0, 0);
+        this.name = name;
+    }
+
+    public void addSubNode(Vertex v) {
+        subNodes.add(v);
+    }
+
+    public void addSubEdge(Link l) {
+        subEdges.add(l);
+    }
+
+    public Set<Link> getSubEdges() {
+        return Collections.unmodifiableSet(subEdges);
+    }
+
+    public void updateSize() {
+
+
+        calculateSize();
+
+        final ClusterNode widget = this;
+        inputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point(size.width / 2, 0);
+            }
+
+            public Vertex getVertex() {
+                return widget;
+            }
+        };
+
+        outputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point(size.width / 2, size.height);
+            }
+
+            public Vertex getVertex() {
+                return widget;
+            }
+        };
+    }
+
+    private void calculateSize() {
+
+        if (subNodes.size() == 0) {
+            size = new Dimension(0, 0);
+        }
+
+        int minX = Integer.MAX_VALUE;
+        int maxX = Integer.MIN_VALUE;
+        int minY = Integer.MAX_VALUE;
+        int maxY = Integer.MIN_VALUE;
+
+
+        for (Vertex n : subNodes) {
+            Point p = n.getPosition();
+            minX = Math.min(minX, p.x);
+            minY = Math.min(minY, p.y);
+            maxX = Math.max(maxX, p.x + n.getSize().width);
+            maxY = Math.max(maxY, p.y + n.getSize().height);
+        }
+
+        for (Link l : subEdges) {
+            List<Point> points = l.getControlPoints();
+            for (Point p : points) {
+                if (p != null) {
+                    minX = Math.min(minX, p.x);
+                    maxX = Math.max(maxX, p.x);
+                    minY = Math.min(minY, p.y);
+                    maxY = Math.max(maxY, p.y);
+                }
+            }
+        }
+
+        size = new Dimension(maxX - minX, maxY - minY);
+
+        // Normalize coordinates
+        for (Vertex n : subNodes) {
+            n.setPosition(new Point(n.getPosition().x - minX, n.getPosition().y - minY));
+        }
+
+        for (Link l : subEdges) {
+            List<Point> points = new ArrayList<Point>(l.getControlPoints());
+            for (Point p : points) {
+                p.x -= minX;
+                p.y -= minY;
+            }
+            l.setControlPoints(points);
+
+        }
+
+        size.width += 2 * BORDER;
+        size.height += 2 * BORDER;
+    }
+
+    public Port getInputSlot() {
+        return inputSlot;
+
+    }
+
+    public Port getOutputSlot() {
+        return outputSlot;
+    }
+
+    public Dimension getSize() {
+        return size;
+    }
+
+    public Point getPosition() {
+        return position;
+    }
+
+    public void setPosition(Point pos) {
+
+        this.position = pos;
+        for (Vertex n : subNodes) {
+            Point cur = new Point(n.getPosition());
+            cur.translate(pos.x + BORDER, pos.y + BORDER);
+            n.setPosition(cur);
+        }
+
+        for (Link e : subEdges) {
+            List<Point> arr = e.getControlPoints();
+            ArrayList<Point> newArr = new ArrayList<Point>();
+            for (Point p : arr) {
+                if (p != null) {
+                    Point p2 = new Point(p);
+                    p2.translate(pos.x + BORDER, pos.y + BORDER);
+                    newArr.add(p2);
+                } else {
+                    newArr.add(null);
+                }
+            }
+
+            e.setControlPoints(newArr);
+        }
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public void setCluster(Cluster c) {
+        cluster = c;
+    }
+
+    public void setDirty(boolean b) {
+        dirty = b;
+    }
+
+    public void setRoot(boolean b) {
+        root = b;
+    }
+
+    public boolean isRoot() {
+        return root;
+    }
+
+    public int compareTo(Vertex o) {
+        return toString().compareTo(o.toString());
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+
+    public Set<? extends Vertex> getSubNodes() {
+        return subNodes;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterOutgoingConnection implements Link {
+
+    private List<Point> intermediatePoints;
+    private ClusterOutputSlotNode outputSlotNode;
+    private Link connection;
+    private Port inputSlot;
+    private Port outputSlot;
+
+    public ClusterOutgoingConnection(ClusterOutputSlotNode outputSlotNode, Link c) {
+        this.outputSlotNode = outputSlotNode;
+        this.connection = c;
+        this.intermediatePoints = new ArrayList<Point>();
+
+        outputSlot = c.getFrom();
+        inputSlot = outputSlotNode.getInputSlot();
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.intermediatePoints = p;
+    }
+
+    public List<Point> getControlPoints() {
+        return intermediatePoints;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,145 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ClusterOutputSlotNode implements Vertex {
+
+    private final int SIZE = 0;
+    private Point position;
+    private Port inputSlot;
+    private Port outputSlot;
+    private ClusterNode blockNode;
+    private boolean root;
+    private Cluster cluster;
+    private ClusterOutgoingConnection conn;
+    private String id;
+
+    public void setOutgoingConnection(ClusterOutgoingConnection c) {
+        this.conn = c;
+    }
+
+    public ClusterOutgoingConnection getOutgoingConnection() {
+        return conn;
+    }
+
+    @Override
+    public String toString() {
+        return id;
+    }
+
+    public ClusterOutputSlotNode(ClusterNode n, String id) {
+        this.blockNode = n;
+        this.id = id;
+
+        n.addSubNode(this);
+
+        final Vertex thisNode = this;
+        final ClusterNode thisBlockNode = blockNode;
+
+        inputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                return new Point(0, 0);
+            }
+
+            public Vertex getVertex() {
+                return thisNode;
+            }
+
+            @Override
+            public String toString() {
+                return "InPort of " + thisNode.toString();
+            }
+        };
+
+        outputSlot = new Port() {
+
+            public Point getRelativePosition() {
+                Point p = new Point(thisNode.getPosition());
+                p.x += ClusterNode.BORDER;
+                p.y = thisBlockNode.getSize().height;
+                return p;
+            }
+
+            public Vertex getVertex() {
+                return thisBlockNode;
+            }
+
+            @Override
+            public String toString() {
+                return "OutPort of " + thisNode.toString();
+            }
+        };
+    }
+
+    public Dimension getSize() {
+        return new Dimension(SIZE, SIZE);
+    }
+
+    public void setPosition(Point p) {
+        this.position = p;
+    }
+
+    public Point getPosition() {
+        return position;
+    }
+
+    public Port getInputSlot() {
+        return inputSlot;
+    }
+
+    public Port getOutputSlot() {
+        return outputSlot;
+    }
+
+    public void setCluster(Cluster c) {
+        cluster = c;
+    }
+
+    public void setRoot(boolean b) {
+        root = b;
+    }
+
+    public Cluster getCluster() {
+        return cluster;
+    }
+
+    public boolean isRoot() {
+        return root;
+    }
+
+    public int compareTo(Vertex o) {
+        return toString().compareTo(o.toString());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Edge<N, E> {
+
+    private E data;
+    private Node<N, E> source;
+    private Node<N, E> dest;
+
+    protected Edge(Graph<N, E> graph, Node<N, E> source, Node<N, E> dest, E data) {
+        setData(data);
+        this.source = source;
+        this.dest = dest;
+        assert source != null;
+        assert dest != null;
+        assert source.getGraph() == dest.getGraph();
+        assert source.getGraph() != null;
+        assert dest.getGraph() != null;
+    }
+
+    public Node<N, E> getSource() {
+        return source;
+    }
+
+    public Node<N, E> getDest() {
+        return dest;
+    }
+
+    public E getData() {
+        return data;
+    }
+
+    public void setData(E e) {
+        data = e;
+    }
+
+    public void remove() {
+        source.getGraph().removeEdge(this, null);
+    }
+
+    public boolean isSelfLoop() {
+        return source == dest;
+    }
+
+    public void reverse() {
+
+        // Remove from current source / dest
+        source.removeOutEdge(this);
+        dest.removeInEdge(this);
+
+        Node<N, E> tmp = source;
+        source = dest;
+        dest = tmp;
+
+        // Add to new source / dest
+        source.addOutEdge(this);
+        dest.addInEdge(this);
+    }
+
+    public String toString() {
+        return "Edge (" + source + " -- " + dest + "): " + data;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,298 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Graph<N, E> {
+
+    private Hashtable<Object, Node<N, E>> nodes;
+    private Hashtable<Object, Edge<N, E>> edges;
+    private List<Node<N, E>> nodeList;
+
+    public Graph() {
+        nodes = new Hashtable<Object, Node<N, E>>();
+        edges = new Hashtable<Object, Edge<N, E>>();
+        nodeList = new ArrayList<Node<N, E>>();
+    }
+
+    public Node<N, E> createNode(N data, Object key) {
+        Node<N, E> n = new Node<N, E>(this, data);
+        assert key == null || !nodes.containsKey(key);
+        if (key != null) {
+            nodes.put(key, n);
+        }
+        nodeList.add(n);
+        return n;
+    }
+
+    public Edge<N, E> createEdge(Node<N, E> source, Node<N, E> dest, E data, Object key) {
+        Edge<N, E> e = new Edge<N, E>(this, source, dest, data);
+        source.addOutEdge(e);
+        dest.addInEdge(e);
+        if (key != null) {
+            edges.put(key, e);
+        }
+        return e;
+    }
+
+    public Node<N, E> getNode(Object key) {
+        return nodes.get(key);
+    }
+
+    public Edge<N, E> getEdge(Object key) {
+        return edges.get(key);
+    }
+
+    public Collection<Edge<N, E>> getEdges() {
+        return Collections.unmodifiableCollection(edges.values());
+    }
+
+    public Collection<Node<N, E>> getNodes() {
+        return Collections.unmodifiableList(nodeList);
+    }
+
+    public void removeEdge(Edge<N, E> e, Object key) {
+        assert key == null || edges.containsKey(key);
+        if (key != null) {
+            edges.remove(key);
+        }
+        e.getSource().removeOutEdge(e);
+        e.getDest().removeInEdge(e);
+    }
+
+    public class DFSTraversalVisitor {
+
+        public void visitNode(Node<N, E> n) {
+        }
+
+        public boolean visitEdge(Edge<N, E> e, boolean backEdge) {
+            return true;
+        }
+    }
+
+    public class BFSTraversalVisitor {
+
+        public void visitNode(Node<N, E> n, int depth) {
+        }
+    }
+
+    public List<Node<N, E>> getNodesWithInDegree(int x) {
+        return getNodesWithInDegree(x, true);
+    }
+
+    public List<Node<N, E>> getNodesWithInDegree(int x, boolean countSelfLoops) {
+
+        List<Node<N, E>> result = new ArrayList<Node<N, E>>();
+        for (Node<N, E> n : getNodes()) {
+            if (n.getInDegree(countSelfLoops) == x) {
+                result.add(n);
+            }
+        }
+
+        return result;
+
+    }
+
+    private void markReachable(Node<N, E> startingNode) {
+        ArrayList<Node<N, E>> arr = new ArrayList<Node<N, E>>();
+        arr.add(startingNode);
+        for (Node<N, E> n : getNodes()) {
+            n.setReachable(false);
+        }
+        traverseDFS(arr, new DFSTraversalVisitor() {
+
+            @Override
+            public void visitNode(Node<N, E> n) {
+                n.setReachable(true);
+            }
+        });
+    }
+
+    public void traverseBFS(Node<N, E> startingNode, BFSTraversalVisitor tv, boolean longestPath) {
+
+        if (longestPath) {
+            markReachable(startingNode);
+        }
+
+        for (Node<N, E> n : getNodes()) {
+            n.setVisited(false);
+            n.setActive(false);
+        }
+
+        Queue<Node<N, E>> queue = new LinkedList<Node<N, E>>();
+        queue.add(startingNode);
+        startingNode.setVisited(true);
+        int layer = 0;
+        Node<N, E> lastOfLayer = startingNode;
+        Node<N, E> lastAdded = null;
+
+        while (!queue.isEmpty()) {
+
+            Node<N, E> current = queue.poll();
+            tv.visitNode(current, layer);
+            current.setActive(false);
+
+
+            for (Edge<N, E> e : current.getOutEdges()) {
+                if (!e.getDest().isVisited()) {
+
+                    boolean allow = true;
+                    if (longestPath) {
+                        for (Node<N, E> pred : e.getDest().getPredecessors()) {
+                            if ((!pred.isVisited() || pred.isActive()) && pred.isReachable()) {
+                                allow = false;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (allow) {
+                        queue.offer(e.getDest());
+                        lastAdded = e.getDest();
+                        e.getDest().setVisited(true);
+                        e.getDest().setActive(true);
+                    }
+                }
+            }
+
+            if (current == lastOfLayer && !queue.isEmpty()) {
+                lastOfLayer = lastAdded;
+                layer++;
+            }
+        }
+    }
+
+    public void traverseDFS(DFSTraversalVisitor tv) {
+        traverseDFS(getNodes(), tv);
+    }
+
+    public void traverseDFS(Collection<Node<N, E>> startingNodes, DFSTraversalVisitor tv) {
+
+        for (Node<N, E> n : getNodes()) {
+            n.setVisited(false);
+            n.setActive(false);
+        }
+
+        boolean result = false;
+        for (Node<N, E> n : startingNodes) {
+            traverse(tv, n);
+        }
+    }
+
+    private void traverse(DFSTraversalVisitor tv, Node<N, E> n) {
+
+        if (!n.isVisited()) {
+            n.setVisited(true);
+            n.setActive(true);
+            tv.visitNode(n);
+
+            for (Edge<N, E> e : n.getOutEdges()) {
+
+                Node<N, E> next = e.getDest();
+                if (next.isActive()) {
+                    tv.visitEdge(e, true);
+                } else {
+                    if (tv.visitEdge(e, false)) {
+                        traverse(tv, next);
+                    }
+                }
+            }
+
+            n.setActive(false);
+        }
+
+    }
+
+    public boolean hasCycles() {
+
+        for (Node<N, E> n : getNodes()) {
+            n.setVisited(false);
+            n.setActive(false);
+        }
+
+        boolean result = false;
+        for (Node<N, E> n : getNodes()) {
+            result |= checkCycles(n);
+            if (result) {
+                break;
+            }
+        }
+        return result;
+    }
+
+    private boolean checkCycles(Node<N, E> n) {
+
+        if (n.isActive()) {
+            return true;
+        }
+
+        if (!n.isVisited()) {
+
+            n.setVisited(true);
+            n.setActive(true);
+
+            for (Node<N, E> succ : n.getSuccessors()) {
+                if (checkCycles(succ)) {
+                    return true;
+                }
+            }
+
+            n.setActive(false);
+
+        }
+
+        return false;
+    }
+
+    @Override
+    public String toString() {
+
+        StringBuilder s = new StringBuilder();
+        s.append("Nodes: ");
+        for (Node<N, E> n : getNodes()) {
+            s.append(n.toString());
+            s.append("\n");
+        }
+
+        s.append("Edges: ");
+
+        for (Edge<N, E> e : getEdges()) {
+            s.append(e.toString());
+            s.append("\n");
+        }
+
+        return s.toString();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,247 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Set;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.TreeSet;
+import com.sun.hotspot.igv.layout.Cluster;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalClusterLayoutManager implements LayoutManager {
+
+    private OldHierarchicalLayoutManager.Combine combine;
+    private LayoutManager subManager = new OldHierarchicalLayoutManager(combine);
+    private LayoutManager manager = new OldHierarchicalLayoutManager(combine, 150);
+    private static final boolean TRACE = false;
+
+    public HierarchicalClusterLayoutManager(OldHierarchicalLayoutManager.Combine combine) {
+        this.combine = combine;
+    }
+
+    public void doLayout(LayoutGraph graph) {
+        doLayout(graph, new HashSet<Vertex>(), new HashSet<Vertex>(), new HashSet<Link>());
+    }
+
+    public void setSubManager(LayoutManager manager) {
+        this.subManager = manager;
+    }
+
+    public void setManager(LayoutManager manager) {
+        this.manager = manager;
+    }
+
+    public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks) {
+
+        assert graph.verify();
+
+        Hashtable<Cluster, List<Vertex>> lists = new Hashtable<Cluster, List<Vertex>>();
+        Hashtable<Cluster, List<Link>> listsConnection = new Hashtable<Cluster, List<Link>>();
+        Hashtable<Cluster, Hashtable<Port, ClusterInputSlotNode>> clusterInputSlotHash = new Hashtable<Cluster, Hashtable<Port, ClusterInputSlotNode>>();
+        Hashtable<Cluster, Hashtable<Port, ClusterOutputSlotNode>> clusterOutputSlotHash = new Hashtable<Cluster, Hashtable<Port, ClusterOutputSlotNode>>();
+
+        Hashtable<Cluster, ClusterNode> clusterNodes = new Hashtable<Cluster, ClusterNode>();
+        Hashtable<Cluster, Set<ClusterInputSlotNode>> clusterInputSlotSet = new Hashtable<Cluster, Set<ClusterInputSlotNode>>();
+        Hashtable<Cluster, Set<ClusterOutputSlotNode>> clusterOutputSlotSet = new Hashtable<Cluster, Set<ClusterOutputSlotNode>>();
+        Set<Link> clusterEdges = new HashSet<Link>();
+        Set<Link> interClusterEdges = new HashSet<Link>();
+        Hashtable<Link, ClusterOutgoingConnection> linkClusterOutgoingConnection = new Hashtable<Link, ClusterOutgoingConnection>();
+        Hashtable<Link, InterClusterConnection> linkInterClusterConnection = new Hashtable<Link, InterClusterConnection>();
+        Hashtable<Link, ClusterIngoingConnection> linkClusterIngoingConnection = new Hashtable<Link, ClusterIngoingConnection>();
+        Set<ClusterNode> clusterNodeSet = new HashSet<ClusterNode>();
+
+        Set<Cluster> cluster = graph.getClusters();
+        int z = 0;
+        for (Cluster c : cluster) {
+            lists.put(c, new ArrayList<Vertex>());
+            listsConnection.put(c, new ArrayList<Link>());
+            clusterInputSlotHash.put(c, new Hashtable<Port, ClusterInputSlotNode>());
+            clusterOutputSlotHash.put(c, new Hashtable<Port, ClusterOutputSlotNode>());
+            clusterOutputSlotSet.put(c, new TreeSet<ClusterOutputSlotNode>());
+            clusterInputSlotSet.put(c, new TreeSet<ClusterInputSlotNode>());
+            ClusterNode cn = new ClusterNode(c, "" + z);
+            clusterNodes.put(c, cn);
+            clusterNodeSet.add(cn);
+            z++;
+        }
+
+        // Add cluster edges
+        for (Cluster c : cluster) {
+
+            ClusterNode start = clusterNodes.get(c);
+
+            for (Cluster succ : c.getSuccessors()) {
+                ClusterNode end = clusterNodes.get(succ);
+                if (end != null && start != end) {
+                    ClusterEdge e = new ClusterEdge(start, end);
+                    clusterEdges.add(e);
+                    interClusterEdges.add(e);
+                }
+            }
+        }
+
+        for (Vertex v : graph.getVertices()) {
+            Cluster c = v.getCluster();
+            assert c != null;
+            clusterNodes.get(c).addSubNode(v);
+        }
+
+        for (Link l : graph.getLinks()) {
+
+            Port fromPort = l.getFrom();
+            Port toPort = l.getTo();
+            Vertex fromVertex = fromPort.getVertex();
+            Vertex toVertex = toPort.getVertex();
+            Cluster fromCluster = fromVertex.getCluster();
+            Cluster toCluster = toVertex.getCluster();
+
+            Port samePort = null;
+            if (combine == OldHierarchicalLayoutManager.Combine.SAME_INPUTS) {
+                samePort = toPort;
+            } else if (combine == OldHierarchicalLayoutManager.Combine.SAME_OUTPUTS) {
+                samePort = fromPort;
+            }
+
+            assert listsConnection.containsKey(fromCluster);
+            assert listsConnection.containsKey(toCluster);
+
+            if (fromCluster == toCluster) {
+                listsConnection.get(fromCluster).add(l);
+                clusterNodes.get(fromCluster).addSubEdge(l);
+            } else {
+                ClusterInputSlotNode inputSlotNode = null;
+                ClusterOutputSlotNode outputSlotNode = null;
+
+                if (samePort != null) {
+                    outputSlotNode = clusterOutputSlotHash.get(fromCluster).get(samePort);
+                    inputSlotNode = clusterInputSlotHash.get(toCluster).get(samePort);
+                }
+
+                if (outputSlotNode == null) {
+                    outputSlotNode = new ClusterOutputSlotNode(clusterNodes.get(fromCluster), "Out " + fromCluster.toString() + " " + samePort.toString());
+                    clusterOutputSlotSet.get(fromCluster).add(outputSlotNode);
+                    ClusterOutgoingConnection conn = new ClusterOutgoingConnection(outputSlotNode, l);
+                    outputSlotNode.setOutgoingConnection(conn);
+                    clusterNodes.get(fromCluster).addSubEdge(conn);
+                    if (samePort != null) {
+                        clusterOutputSlotHash.get(fromCluster).put(samePort, outputSlotNode);
+                    }
+
+                    linkClusterOutgoingConnection.put(l, conn);
+                } else {
+                    linkClusterOutgoingConnection.put(l, outputSlotNode.getOutgoingConnection());
+                }
+
+                if (inputSlotNode == null) {
+                    inputSlotNode = new ClusterInputSlotNode(clusterNodes.get(toCluster), "In " + toCluster.toString() + " " + samePort.toString());
+                    clusterInputSlotSet.get(toCluster).add(inputSlotNode);
+                }
+
+                ClusterIngoingConnection conn = new ClusterIngoingConnection(inputSlotNode, l);
+                inputSlotNode.setIngoingConnection(conn);
+                clusterNodes.get(toCluster).addSubEdge(conn);
+                if (samePort != null) {
+                    clusterInputSlotHash.get(toCluster).put(samePort, inputSlotNode);
+                }
+
+                linkClusterIngoingConnection.put(l, conn);
+
+
+                InterClusterConnection interConn = new InterClusterConnection(outputSlotNode, inputSlotNode);
+                linkInterClusterConnection.put(l, interConn);
+                clusterEdges.add(interConn);
+            }
+        }
+
+        Timing t = null;
+
+        if (TRACE) {
+            new Timing("Child timing");
+            t.start();
+        }
+
+        for (Cluster c : cluster) {
+            ClusterNode n = clusterNodes.get(c);
+            subManager.doLayout(new LayoutGraph(n.getSubEdges(), n.getSubNodes()), clusterInputSlotSet.get(c), clusterOutputSlotSet.get(c), new HashSet<Link>());
+            n.updateSize();
+        }
+
+        Set<Vertex> roots = new LayoutGraph(interClusterEdges).findRootVertices();
+        for (Vertex v : roots) {
+            assert v instanceof ClusterNode;
+            ((ClusterNode) v).setRoot(true);
+        }
+
+        manager.doLayout(new LayoutGraph(clusterEdges, clusterNodeSet), new HashSet<Vertex>(), new HashSet<Vertex>(), interClusterEdges);
+
+        for (Cluster c : cluster) {
+            ClusterNode n = clusterNodes.get(c);
+            c.setBounds(new Rectangle(n.getPosition(), n.getSize()));
+        }
+
+        // TODO: handle case where blocks are not fully connected
+
+        if (TRACE) {
+            t.stop();
+            t.print();
+        }
+
+        for (Link l : graph.getLinks()) {
+
+            if (linkInterClusterConnection.containsKey(l)) {
+                ClusterOutgoingConnection conn1 = linkClusterOutgoingConnection.get(l);
+                InterClusterConnection conn2 = linkInterClusterConnection.get(l);
+                ClusterIngoingConnection conn3 = linkClusterIngoingConnection.get(l);
+
+                assert conn1 != null;
+                assert conn2 != null;
+                assert conn3 != null;
+
+                List<Point> points = new ArrayList<Point>();
+
+                points.addAll(conn1.getControlPoints());
+                points.addAll(conn2.getControlPoints());
+                points.addAll(conn3.getControlPoints());
+
+                l.setControlPoints(points);
+            }
+        }
+    }
+
+    public void doRouting(LayoutGraph graph) {
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2110 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Vertex;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.Stack;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class HierarchicalLayoutManager implements LayoutManager {
+
+    public static final boolean TRACE = false;
+    public static final boolean CHECK = false;
+    public static final int SWEEP_ITERATIONS = 1;
+    public static final int CROSSING_ITERATIONS = 2;
+    public static final int DUMMY_HEIGHT = 1;
+    public static final int DUMMY_WIDTH = 1;
+    public static final int X_OFFSET = 9;
+    public static final int LAYER_OFFSET = 30;
+    public static final int MAX_LAYER_LENGTH = -1;
+    public static final int MIN_LAYER_DIFFERENCE = 1;
+
+    public enum Combine {
+
+        NONE,
+        SAME_INPUTS,
+        SAME_OUTPUTS
+    }
+    // Options
+    private Combine combine;
+    private int dummyWidth;
+    private int dummyHeight;
+    private int xOffset;
+    private int layerOffset;
+    private int maxLayerLength;
+    private int minLayerDifference;
+    // Algorithm global datastructures
+    private Set<Link> reversedLinks;
+    private List<LayoutNode> nodes;
+    private HashMap<Vertex, LayoutNode> vertexToLayoutNode;
+    private HashMap<Link, List<Point>> reversedLinkStartPoints;
+    private HashMap<Link, List<Point>> reversedLinkEndPoints;
+    private HashMap<LayoutEdge, LayoutEdge> bottomEdgeHash;
+    private HashMap<Link, List<Point>> splitStartPoints;
+    private HashMap<Link, List<Point>> splitEndPoints;
+    private LayoutGraph graph;
+    private List<LayoutNode>[] layers;
+    private int layerCount;
+    private Set<? extends Vertex> firstLayerHint;
+    private Set<? extends Vertex> lastLayerHint;
+    private Set<? extends Link> importantLinks;
+    private Set<Link> linksToFollow;
+
+    private class LayoutNode {
+
+        public int x;
+        public int y;
+        public int width;
+        public int height;
+        public int layer = -1;
+        public int xOffset;
+        public int yOffset;
+        public int bottomYOffset;
+        public Vertex vertex; // Only used for non-dummy nodes, otherwise null
+        public List<LayoutEdge> preds = new ArrayList<LayoutEdge>();
+        public List<LayoutEdge> succs = new ArrayList<LayoutEdge>();
+        public HashMap<Integer, Integer> outOffsets = new HashMap<Integer, Integer>();
+        public HashMap<Integer, Integer> inOffsets = new HashMap<Integer, Integer>();
+        public int pos = -1; // Position within layer
+        public int crossingNumber;
+
+        @Override
+        public String toString() {
+            return "Node " + vertex;
+        }
+    }
+
+    private class LayoutEdge {
+
+        public LayoutNode from;
+        public LayoutNode to;
+        public int relativeFrom;
+        public int relativeTo;
+        public Link link;
+    }
+
+    private abstract class AlgorithmPart {
+
+        public void start() {
+            if (CHECK) {
+                preCheck();
+            }
+
+            long start = 0;
+            if (TRACE) {
+                System.out.println("##################################################");
+                System.out.println("Starting part " + this.getClass().getName());
+                start = System.currentTimeMillis();
+            }
+            run();
+            if (TRACE) {
+                System.out.println("Timing for " + this.getClass().getName() + " is " + (System.currentTimeMillis() - start));
+                printStatistics();
+            }
+
+            if (CHECK) {
+                postCheck();
+            }
+        }
+
+        protected abstract void run();
+
+        protected void printStatistics() {
+        }
+
+        protected void postCheck() {
+        }
+
+        protected void preCheck() {
+        }
+    }
+
+    public HierarchicalLayoutManager() {
+        this(Combine.NONE);
+    }
+
+    public HierarchicalLayoutManager(Combine b) {
+        this.combine = b;
+        this.dummyWidth = DUMMY_WIDTH;
+        this.dummyHeight = DUMMY_HEIGHT;
+        this.xOffset = X_OFFSET;
+        this.layerOffset = LAYER_OFFSET;
+        this.maxLayerLength = MAX_LAYER_LENGTH;
+        this.minLayerDifference = MIN_LAYER_DIFFERENCE;
+        this.linksToFollow = new HashSet<Link>();
+    }
+
+    public int getMaxLayerLength() {
+        return maxLayerLength;
+    }
+
+    public void setMaxLayerLength(int v) {
+        maxLayerLength = v;
+    }
+
+    public void setMinLayerDifference(int v) {
+        minLayerDifference = v;
+    }
+
+    public void doLayout(LayoutGraph graph) {
+        doLayout(graph, new HashSet<Vertex>(), new HashSet<Vertex>(), new HashSet<Link>());
+
+    }
+
+    public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks) {
+
+        this.importantLinks = importantLinks;
+        this.graph = graph;
+        this.firstLayerHint = firstLayerHint;
+        this.lastLayerHint = lastLayerHint;
+
+        vertexToLayoutNode = new HashMap<Vertex, LayoutNode>();
+        reversedLinks = new HashSet<Link>();
+        reversedLinkStartPoints = new HashMap<Link, List<Point>>();
+        reversedLinkEndPoints = new HashMap<Link, List<Point>>();
+        bottomEdgeHash = new HashMap<LayoutEdge, LayoutEdge>();
+        nodes = new ArrayList<LayoutNode>();
+        splitStartPoints = new HashMap<Link, List<Point>>();
+        splitEndPoints = new HashMap<Link, List<Point>>();
+
+        // #############################################################
+        // Step 1: Build up data structure
+        new BuildDatastructure().start();
+
+        // #############################################################
+        // STEP 2: Reverse edges, handle backedges
+        new ReverseEdges().start();
+
+        for (LayoutNode n : nodes) {
+            ArrayList<LayoutEdge> tmpArr = new ArrayList<LayoutEdge>();
+            for (LayoutEdge e : n.succs) {
+                if (importantLinks.contains(e.link)) {
+                    tmpArr.add(e);
+                }
+            }
+
+            for (LayoutEdge e : tmpArr) {
+                //System.out.println("Removed " + e);
+                e.from.succs.remove(e);
+                e.to.preds.remove(e);
+            }
+        }
+
+        // #############################################################
+        // STEP 3: Assign layers
+        new AssignLayers().start();
+
+        // #############################################################
+        // STEP 4: Create dummy nodes
+        new CreateDummyNodes().start();
+
+        // #############################################################
+        // STEP 5: Crossing Reduction
+        new CrossingReduction().start();
+
+        // #############################################################
+        // STEP 7: Assign X coordinates
+        //new AssignXCoordinates().start();
+        new AssignXCoordinates2().start();
+
+        // #############################################################
+        // STEP 6: Assign Y coordinates
+        new AssignYCoordinates().start();
+
+        // #############################################################
+        // STEP 8: Write back to interface
+        new WriteResult().start();
+    }
+
+    private class WriteResult extends AlgorithmPart {
+
+        private int pointCount;
+
+        protected void run() {
+
+            HashMap<Vertex, Point> vertexPositions = new HashMap<Vertex, Point>();
+            HashMap<Link, List<Point>> linkPositions = new HashMap<Link, List<Point>>();
+            for (Vertex v : graph.getVertices()) {
+                LayoutNode n = vertexToLayoutNode.get(v);
+                assert !vertexPositions.containsKey(v);
+                vertexPositions.put(v, new Point(n.x + n.xOffset, n.y + n.yOffset));
+            }
+
+            for (LayoutNode n : nodes) {
+
+                for (LayoutEdge e : n.preds) {
+                    if (e.link != null) {
+                        ArrayList<Point> points = new ArrayList<Point>();
+
+                        Point p = new Point(e.to.x + e.relativeTo, e.to.y + e.to.yOffset);
+                        points.add(p);
+                        if (e.to.inOffsets.containsKey(e.relativeTo)) {
+                            points.add(new Point(p.x, p.y + e.to.inOffsets.get(e.relativeTo)));
+                        }
+
+                        LayoutNode cur = e.from;
+                        LayoutNode other = e.to;
+                        LayoutEdge curEdge = e;
+                        while (cur.vertex == null && cur.preds.size() != 0) {
+                            if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+                                points.remove(points.size() - 1);
+                            }
+                            points.add(new Point(cur.x + cur.width / 2, cur.y + cur.height));
+                            if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+                                points.remove(points.size() - 1);
+                            }
+                            points.add(new Point(cur.x + cur.width / 2, cur.y));
+                            assert cur.preds.size() == 1;
+                            curEdge = cur.preds.get(0);
+                            cur = curEdge.from;
+                        }
+
+                        p = new Point(cur.x + curEdge.relativeFrom, cur.y + cur.height - cur.bottomYOffset);
+                        if (curEdge.from.outOffsets.containsKey(curEdge.relativeFrom)) {
+                            points.add(new Point(p.x, p.y + curEdge.from.outOffsets.get(curEdge.relativeFrom)));
+                        }
+                        points.add(p);
+
+                        Collections.reverse(points);
+
+
+
+                        if (cur.vertex == null && cur.preds.size() == 0) {
+
+                            if (reversedLinkEndPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+                                    points.add(new Point(p1.x + e.to.x, p1.y + e.to.y));
+                                }
+                            }
+
+                            if (splitStartPoints.containsKey(e.link)) {
+                                points.add(0, null);
+                                points.addAll(0, splitStartPoints.get(e.link));
+
+                                //checkPoints(points);
+                                if (reversedLinks.contains(e.link)) {
+                                    Collections.reverse(points);
+                                }
+                                assert !linkPositions.containsKey(e.link);
+                                linkPositions.put(e.link, points);
+                            } else {
+                                splitEndPoints.put(e.link, points);
+                            }
+
+                        } else {
+                            if (reversedLinks.contains(e.link)) {
+                                Collections.reverse(points);
+                            }
+                            if (reversedLinkStartPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+                                    points.add(new Point(p1.x + cur.x, p1.y + cur.y));
+                                }
+                            }
+
+                            if (reversedLinkEndPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+                                    points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+                                }
+                            }
+
+                            assert !linkPositions.containsKey(e.link);
+                            linkPositions.put(e.link, points);
+                        }
+                        pointCount += points.size();
+
+                        // No longer needed!
+                        e.link = null;
+                    }
+                }
+
+                for (LayoutEdge e : n.succs) {
+                    if (e.link != null) {
+                        ArrayList<Point> points = new ArrayList<Point>();
+                        Point p = new Point(e.from.x + e.relativeFrom, e.from.y + e.from.height - e.from.bottomYOffset);
+                        points.add(p);
+                        if (e.from.outOffsets.containsKey(e.relativeFrom)) {
+                            points.add(new Point(p.x, p.y + e.from.outOffsets.get(e.relativeFrom)));
+                        }
+
+                        LayoutNode cur = e.to;
+                        LayoutNode other = e.from;
+                        LayoutEdge curEdge = e;
+                        while (cur.vertex == null && cur.succs.size() != 0) {
+                            if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+                                points.remove(points.size() - 1);
+                            }
+                            points.add(new Point(cur.x + cur.width / 2, cur.y));
+                            if (points.size() > 1 && points.get(points.size() - 1).x == cur.x + cur.width / 2 && points.get(points.size() - 2).x == cur.x + cur.width / 2) {
+                                points.remove(points.size() - 1);
+                            }
+                            points.add(new Point(cur.x + cur.width / 2, cur.y + cur.height));
+                            if (cur.succs.size() == 0) {
+                                break;
+                            }
+                            assert cur.succs.size() == 1;
+                            curEdge = cur.succs.get(0);
+                            cur = curEdge.to;
+                        }
+
+
+                        p = new Point(cur.x + curEdge.relativeTo, cur.y + cur.yOffset);
+                        points.add(p);
+                        if (curEdge.to.inOffsets.containsKey(curEdge.relativeTo)) {
+                            points.add(new Point(p.x, p.y + curEdge.to.inOffsets.get(curEdge.relativeTo)));
+                        }
+
+
+                        if (cur.succs.size() == 0 && cur.vertex == null) {
+                            if (reversedLinkStartPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+                                    points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+                                }
+                            }
+
+                            if (splitEndPoints.containsKey(e.link)) {
+                                points.add(null);
+                                points.addAll(splitEndPoints.get(e.link));
+
+                                //checkPoints(points);
+                                if (reversedLinks.contains(e.link)) {
+                                    Collections.reverse(points);
+                                }
+                                assert !linkPositions.containsKey(e.link);
+                                linkPositions.put(e.link, points);
+                            } else {
+                                splitStartPoints.put(e.link, points);
+                            }
+                        } else {
+
+                            if (reversedLinkStartPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkStartPoints.get(e.link)) {
+                                    points.add(0, new Point(p1.x + other.x, p1.y + other.y));
+                                }
+                            }
+                            if (reversedLinkEndPoints.containsKey(e.link)) {
+                                for (Point p1 : reversedLinkEndPoints.get(e.link)) {
+                                    points.add(new Point(p1.x + cur.x, p1.y + cur.y));
+                                }
+                            }
+                            if (reversedLinks.contains(e.link)) {
+                                Collections.reverse(points);
+                            }
+                            //checkPoints(points);
+                            assert !linkPositions.containsKey(e.link);
+                            linkPositions.put(e.link, points);
+                        }
+
+                        pointCount += points.size();
+                        e.link = null;
+                    }
+                }
+            }
+
+            int minX = Integer.MAX_VALUE;
+            int minY = Integer.MAX_VALUE;
+            for (Vertex v : vertexPositions.keySet()) {
+                Point p = vertexPositions.get(v);
+                minX = Math.min(minX, p.x);
+                minY = Math.min(minY, p.y);
+            }
+
+            for (Link l : linkPositions.keySet()) {
+                List<Point> points = linkPositions.get(l);
+                for (Point p : points) {
+                    if (p != null) {
+                        minX = Math.min(minX, p.x);
+                        minY = Math.min(minY, p.y);
+                    }
+                }
+
+            }
+
+            for (Vertex v : vertexPositions.keySet()) {
+                Point p = vertexPositions.get(v);
+                p.x -= minX;
+                p.y -= minY;
+                v.setPosition(p);
+            }
+
+            for (Link l : linkPositions.keySet()) {
+                List<Point> points = linkPositions.get(l);
+                for (Point p : points) {
+                    if (p != null) {
+                        p.x -= minX;
+                        p.y -= minY;
+                    }
+                }
+                l.setControlPoints(points);
+
+            }
+        }
+
+        @Override
+        protected void printStatistics() {
+            System.out.println("Number of nodes: " + nodes.size());
+            int edgeCount = 0;
+            for (LayoutNode n : nodes) {
+                edgeCount += n.succs.size();
+            }
+            System.out.println("Number of edges: " + edgeCount);
+            System.out.println("Number of points: " + pointCount);
+        }
+    }
+
+    private static class Segment {
+
+        public float d;
+        public int orderNumber = -1;
+        public ArrayList<LayoutNode> nodes = new ArrayList<LayoutNode>();
+        public HashSet<Segment> succs = new HashSet<Segment>();
+        public HashSet<Segment> preds = new HashSet<Segment>();
+        public Region region;
+    }
+    private static final Comparator<Segment> segmentComparator = new Comparator<Segment>() {
+
+        public int compare(Segment s1, Segment s2) {
+            return s1.orderNumber - s2.orderNumber;
+        }
+    };
+
+    private static class Region {
+
+        public float d;
+        public int minOrderNumber;
+        public SortedSet<Segment> segments = new TreeSet<Segment>(segmentComparator);
+        public HashSet<Region> succs = new HashSet<Region>(4);
+        public HashSet<Region> preds = new HashSet<Region>(4);
+    }
+    private static final Comparator<Region> regionComparator = new Comparator<Region>() {
+
+        public int compare(Region r1, Region r2) {
+            return r1.minOrderNumber - r2.minOrderNumber;
+        }
+    };
+    private static final Comparator<LayoutNode> nodePositionComparator = new Comparator<LayoutNode>() {
+
+        public int compare(LayoutNode n1, LayoutNode n2) {
+            return n1.pos - n2.pos;
+        }
+    };
+    private static final Comparator<LayoutNode> nodeProcessingDownComparator = new Comparator<LayoutNode>() {
+
+        public int compare(LayoutNode n1, LayoutNode n2) {
+            if (n1.vertex == null) {
+                return -1;
+            }
+            if (n2.vertex == null) {
+                return 1;
+            }
+            return n1.preds.size() - n2.preds.size();
+        }
+    };
+    private static final Comparator<LayoutNode> nodeProcessingUpComparator = new Comparator<LayoutNode>() {
+
+        public int compare(LayoutNode n1, LayoutNode n2) {
+            if (n1.vertex == null) {
+                return -1;
+            }
+            if (n2.vertex == null) {
+                return 1;
+            }
+            return n1.succs.size() - n2.succs.size();
+        }
+    };
+
+    private class AssignXCoordinates2 extends AlgorithmPart {
+
+        private ArrayList<Integer>[] space;
+        private ArrayList<LayoutNode>[] downProcessingOrder;
+        private ArrayList<LayoutNode>[] upProcessingOrder;
+
+        private void initialPositions() {
+            for (LayoutNode n : nodes) {
+                n.x = space[n.layer].get(n.pos);
+            }
+        }
+
+        protected void run() {
+
+            space = new ArrayList[layers.length];
+            downProcessingOrder = new ArrayList[layers.length];
+            upProcessingOrder = new ArrayList[layers.length];
+
+            for (int i = 0; i < layers.length; i++) {
+                space[i] = new ArrayList<Integer>();
+                downProcessingOrder[i] = new ArrayList<LayoutNode>();
+                upProcessingOrder[i] = new ArrayList<LayoutNode>();
+
+                int curX = 0;
+                for (LayoutNode n : layers[i]) {
+                    space[i].add(curX);
+                    curX += n.width + xOffset;
+                    downProcessingOrder[i].add(n);
+                    upProcessingOrder[i].add(n);
+                }
+
+                Collections.sort(downProcessingOrder[i], nodeProcessingDownComparator);
+                Collections.sort(upProcessingOrder[i], nodeProcessingUpComparator);
+            }
+
+            initialPositions();
+            for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+                sweepDown();
+                sweepUp();
+            }
+
+            for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+                doubleSweep();
+            }
+        }
+
+        private int calculateOptimalDown(LayoutNode n) {
+
+            List<Integer> values = new ArrayList<Integer>();
+            if (n.preds.size() == 0) {
+                return n.x;
+            }
+            for (LayoutEdge e : n.preds) {
+                int cur = e.from.x + e.relativeFrom - e.relativeTo;
+                values.add(cur);
+            }
+            return median(values);
+        }
+
+        private int calculateOptimalBoth(LayoutNode n) {
+
+            List<Integer> values = new ArrayList<Integer>();
+            if (n.preds.size() == 0 + n.succs.size()) {
+                return n.x;
+            }
+            for (LayoutEdge e : n.preds) {
+                int cur = e.from.x + e.relativeFrom - e.relativeTo;
+                values.add(cur);
+            }
+
+            for (LayoutEdge e : n.succs) {
+                int cur = e.to.x + e.relativeTo - e.relativeFrom;
+                values.add(cur);
+            }
+
+            return median(values);
+        }
+
+        private int calculateOptimalUp(LayoutNode n) {
+
+            //List<Integer> values = new ArrayList<Integer>();
+            int size = n.succs.size();
+            if (size == 0) {
+                return n.x;
+            } else {
+                int result = 0;
+                for (LayoutEdge e : n.succs) {
+                    int cur = e.to.x + e.relativeTo - e.relativeFrom;
+                    result += cur;
+                }
+                return result / size; //median(values);
+            }
+        }
+
+        private int median(List<Integer> values) {
+            Collections.sort(values);
+            if (values.size() % 2 == 0) {
+                return (values.get(values.size() / 2 - 1) + values.get(values.size() / 2)) / 2;
+            } else {
+                return values.get(values.size() / 2);
+            }
+        }
+
+        private void sweepUp() {
+            for (int i = layers.length - 1; i >= 0; i--) {
+                NodeRow r = new NodeRow(space[i]);
+                for (LayoutNode n : upProcessingOrder[i]) {
+                    int optimal = calculateOptimalUp(n);
+                    r.insert(n, optimal);
+                }
+            }
+        /*
+        for(int i=0; i<layers.length; i++) {
+        NodeRow r = new NodeRow(space[i]);
+        for(LayoutNode n : upProcessingOrder[i]) {
+        int optimal = calculateOptimalUp(n);
+        r.insert(n, optimal);
+        }
+        }*/
+        }
+
+        private void doubleSweep() {
+            for (int i = layers.length - 2; i >= 0; i--) {
+                NodeRow r = new NodeRow(space[i]);
+                for (LayoutNode n : upProcessingOrder[i]) {
+                    int optimal = calculateOptimalBoth(n);
+                    r.insert(n, optimal);
+                }
+            }
+        }
+
+        private void sweepDown() {
+            for (int i = 1; i < layers.length; i++) {
+                NodeRow r = new NodeRow(space[i]);
+                for (LayoutNode n : downProcessingOrder[i]) {
+                    int optimal = calculateOptimalDown(n);
+                    r.insert(n, optimal);
+                }
+            }
+        }
+    }
+
+    private static class NodeRow {
+
+        private TreeSet<LayoutNode> treeSet;
+        private ArrayList<Integer> space;
+
+        public NodeRow(ArrayList<Integer> space) {
+            treeSet = new TreeSet<LayoutNode>(nodePositionComparator);
+            this.space = space;
+        }
+
+        public int offset(LayoutNode n1, LayoutNode n2) {
+            int v1 = space.get(n1.pos) + n1.width;
+            int v2 = space.get(n2.pos);
+            return v2 - v1;
+        }
+
+        public void insert(LayoutNode n, int pos) {
+
+            SortedSet<LayoutNode> headSet = treeSet.headSet(n);
+
+            LayoutNode leftNeighbor = null;
+            int minX = Integer.MIN_VALUE;
+            if (!headSet.isEmpty()) {
+                leftNeighbor = headSet.last();
+                minX = leftNeighbor.x + leftNeighbor.width + offset(leftNeighbor, n);
+            }
+
+            if (pos < minX) {
+                n.x = minX;
+            } else {
+
+                LayoutNode rightNeighbor = null;
+                SortedSet<LayoutNode> tailSet = treeSet.tailSet(n);
+                int maxX = Integer.MAX_VALUE;
+                if (!tailSet.isEmpty()) {
+                    rightNeighbor = tailSet.first();
+                    maxX = rightNeighbor.x - offset(n, rightNeighbor) - n.width;
+                }
+
+                if (pos > maxX) {
+                    n.x = maxX;
+                } else {
+                    n.x = pos;
+                }
+
+                assert minX <= maxX;
+            }
+
+            treeSet.add(n);
+        }
+    }
+
+    private class AssignXCoordinates extends AlgorithmPart {
+
+        HashMap<LayoutNode, Segment> hashMap = new HashMap<LayoutNode, Segment>();
+        ArrayList<Segment> segments = new ArrayList<Segment>();
+
+        private void generateSegments() {
+
+            for (int i = 0; i < layerCount; i++) {
+                for (LayoutNode n : layers[i]) {
+                    if (!hashMap.containsKey(n)) {
+                        Segment s = new Segment();
+                        segments.add(s);
+                        LayoutNode curNode = n;
+
+                        int maxLength = 0;
+                        while (curNode.succs.size() == 1 && curNode.preds.size() == 1) {
+                            s.nodes.add(curNode);
+                            assert !hashMap.containsKey(curNode);
+                            hashMap.put(curNode, s);
+                            curNode = curNode.succs.get(0).to;
+                            maxLength++;
+                        //if(maxLength > 10) break;
+                        }
+
+                        if (s.nodes.size() > 0 && curNode.preds.size() == 1 && curNode.vertex == null) {
+                            s.nodes.add(curNode);
+                            assert !hashMap.containsKey(curNode);
+                            hashMap.put(curNode, s);
+                        }
+
+                        if (s.nodes.size() == 0) {
+                            // Simple segment with a single node
+                            s.nodes.add(n);
+                            hashMap.put(n, s);
+                        }
+                    }
+                }
+            }
+        }
+
+        private void addEdges() {
+
+            for (int i = 0; i < layerCount; i++) {
+                LayoutNode prev = null;
+                for (LayoutNode n : layers[i]) {
+
+                    if (prev != null) {
+                        Segment s1 = hashMap.get(prev);
+                        Segment s2 = hashMap.get(n);
+
+                        if (s1 != s2) {
+                            s1.succs.add(s2);
+                            s2.preds.add(s1);
+                        }
+                    }
+                    prev = n;
+
+                }
+            }
+        }
+
+        private void topologicalSorting() {
+
+            Queue<Segment> queue = new LinkedList<Segment>();
+
+            int index = 0;
+            ArrayList<Segment> newList = new ArrayList<Segment>();
+            for (Segment s : segments) {
+                if (s.preds.size() == 0) {
+                    s.orderNumber = index;
+                    newList.add(s);
+                    index++;
+                    queue.add(s);
+                }
+            }
+
+            while (!queue.isEmpty()) {
+                Segment s = queue.remove();
+
+                for (Segment succ : s.succs) {
+                    succ.preds.remove(s);
+                    if (succ.preds.size() == 0) {
+                        queue.add(succ);
+                        succ.orderNumber = index;
+                        newList.add(succ);
+                        index++;
+                    }
+                }
+            }
+
+            segments = newList;
+        }
+
+        private void initialPositions() {
+
+            int[] minPos = new int[layers.length];
+
+            for (Segment s : segments) {
+                int max = 0;
+                for (LayoutNode n : s.nodes) {
+                    int x = minPos[n.layer];
+                    if (x > max) {
+                        max = x;
+                    }
+                }
+
+                for (LayoutNode n : s.nodes) {
+                    minPos[n.layer] = max + n.width + xOffset;
+                    n.x = max;
+                }
+            }
+        }
+
+        private int predSum(LayoutNode n) {
+            int sum = 0;
+            for (LayoutEdge e : n.preds) {
+                assert e.to == n;
+                //sum += (e.from.x + e.relativeFrom + (int)hashMap.get(e.from).d) - (e.to.x + e.relativeTo + (int)hashMap.get(e.to).d);
+                sum += (e.from.x + e.relativeFrom) - (e.to.x + e.relativeTo);
+            }
+
+            return sum;
+        }
+
+        private int succSum(LayoutNode n) {
+            int sum = 0;
+            for (LayoutEdge e : n.succs) {
+
+                assert e.from == n;
+                sum += (e.to.x + e.relativeTo) - (e.from.x + e.relativeFrom);
+            //sum += (e.to.x + e.relativeTo + (int)hashMap.get(e.to).d) - (e.from.x + e.relativeFrom + (int)hashMap.get(e.from).d);
+            }
+
+            return sum;
+
+        }
+
+        private void downValues() {
+
+            for (Segment s : segments) {
+                downValues(s);
+
+            }
+
+        }
+
+        private void downValues(Segment s) {
+            LayoutNode n = s.nodes.get(0); // Only first node needed, all other have same coordinate
+
+            if (n.preds.size() == 0) {
+                // Value is 0.0;
+                if (n.succs.size() == 0) {
+                    s.d = 0.0f;
+                } else {
+                    s.d = (((float) succSum(n) / (float) n.succs.size())) / 2;
+                }
+            } else {
+                s.d = (float) predSum(n) / (float) n.preds.size();
+            }
+        }
+
+        private void upValues() {
+            for (Segment s : segments) {
+                upValues(s);
+            }
+        }
+
+        private void upValues(Segment s) {
+            LayoutNode n = s.nodes.get(0); // Only first node needed, all other have same coordinate
+
+            if (n.succs.size() == 0) {
+                // Value is 0.0;
+                if (n.preds.size() == 0) {
+                    s.d = 0.0f;
+                } else {
+                    s.d = (float) predSum(n) / (float) n.preds.size();
+                }
+            } else {
+                s.d = ((float) succSum(n) / (float) n.succs.size()) / 2;
+            }
+        }
+
+        private void sweep(boolean down) {
+
+            if (down) {
+                downValues();
+            } else {
+                upValues();
+            }
+
+            SortedSet<Region> regions = new TreeSet<Region>(regionComparator);
+            for (Segment s : segments) {
+                s.region = new Region();
+                s.region.minOrderNumber = s.orderNumber;
+                s.region.segments.add(s);
+                s.region.d = s.d;
+                regions.add(s.region);
+            }
+
+            for (Segment s : segments) {
+                for (LayoutNode n : s.nodes) {
+                    if (n.pos != 0) {
+                        LayoutNode prevNode = layers[n.layer].get(n.pos - 1);
+                        if (prevNode.x + prevNode.width + xOffset == n.x) {
+                            Segment other = hashMap.get(prevNode);
+                            Region r1 = s.region;
+                            Region r2 = other.region;
+                            // They are close together
+                            if (r1 != r2 && r2.d >= r1.d) {
+
+                                if (r2.segments.size() < r1.segments.size()) {
+
+                                    r1.d = (r1.d * r1.segments.size() + r2.d * r2.segments.size()) / (r1.segments.size() + r2.segments.size());
+
+                                    for (Segment tempS : r2.segments) {
+                                        r1.segments.add(tempS);
+                                        tempS.region = r1;
+                                        r1.minOrderNumber = Math.min(r1.minOrderNumber, tempS.orderNumber);
+                                    }
+
+                                    regions.remove(r2);
+                                } else {
+
+                                    r2.d = (r1.d * r1.segments.size() + r2.d * r2.segments.size()) / (r1.segments.size() + r2.segments.size());
+
+                                    for (Segment tempS : r1.segments) {
+                                        r2.segments.add(tempS);
+                                        tempS.region = r2;
+                                        r2.minOrderNumber = Math.min(r2.minOrderNumber, tempS.orderNumber);
+                                    }
+
+                                    regions.remove(r1);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+
+
+            ArrayList<Region> reversedRegions = new ArrayList<Region>();
+            for (Region r : regions) {
+                if (r.d < 0) {
+                    processRegion(r, down);
+                } else {
+                    reversedRegions.add(0, r);
+                }
+            }
+
+            for (Region r : reversedRegions) {
+                processRegion(r, down);
+            }
+
+        }
+
+        private void processRegion(Region r, boolean down) {
+
+            // Do not move
+            if ((int) r.d == 0) {
+                return;
+            }
+
+            ArrayList<Segment> arr = new ArrayList<Segment>();
+            for (Segment s : r.segments) {
+                arr.add(s);
+            }
+
+            if (r.d > 0) {
+                Collections.reverse(arr);
+            }
+
+            for (Segment s : arr) {
+
+
+                int min = (int) r.d;
+                if (min < 0) {
+                    min = -min;
+                }
+
+                for (LayoutNode n : s.nodes) {
+
+                    int layer = n.layer;
+                    int pos = n.pos;
+
+
+                    if (r.d > 0) {
+
+                        if (pos != layers[layer].size() - 1) {
+
+                            int off = layers[layer].get(pos + 1).x - n.x - xOffset - n.width;
+                            assert off >= 0;
+                            if (off < min) {
+                                min = off;
+                            }
+                        }
+
+                    } else {
+
+                        if (pos != 0) {
+
+                            int off = n.x - xOffset - layers[layer].get(pos - 1).x - layers[layer].get(pos - 1).width;
+                            assert off >= 0;
+                            if (off < min) {
+                                min = off;
+                            }
+                        }
+                    }
+                }
+
+                assert min >= 0;
+                if (min != 0) {
+                    for (LayoutNode n : s.nodes) {
+                        if (r.d > 0) {
+                            n.x += min;
+                        } else {
+                            n.x -= min;
+                        }
+
+                    }
+                }
+            }
+        }
+
+        protected void run() {
+
+            generateSegments();
+            addEdges();
+            topologicalSorting();
+            initialPositions();
+            for (int i = 0; i < SWEEP_ITERATIONS; i++) {
+
+                sweep(true);
+                sweep(true);
+                sweep(false);
+                sweep(false);
+            }
+
+            sweep(true);
+            sweep(true);
+        }
+    }
+    private static Comparator<LayoutNode> crossingNodeComparator = new Comparator<LayoutNode>() {
+
+        public int compare(LayoutNode n1, LayoutNode n2) {
+            return n1.crossingNumber - n2.crossingNumber;
+        }
+    };
+
+    private class CrossingReduction extends AlgorithmPart {
+
+        @Override
+        public void preCheck() {
+            for (LayoutNode n : nodes) {
+                assert n.layer < layerCount;
+            }
+        }
+
+        protected void run() {
+
+            layers = new List[layerCount];
+
+            for (int i = 0; i < layerCount; i++) {
+                layers[i] = new ArrayList<LayoutNode>();
+            }
+
+
+            // Generate initial ordering
+            HashSet<LayoutNode> visited = new HashSet<LayoutNode>();
+            for (LayoutNode n : nodes) {
+                if (n.layer == 0) {
+                    layers[0].add(n);
+                    visited.add(n);
+                } else if (n.preds.size() == 0) {
+                    layers[n.layer].add(n);
+                    visited.add(n);
+                }
+            }
+
+            for (int i = 0; i < layers.length - 1; i++) {
+                for (LayoutNode n : layers[i]) {
+                    for (LayoutEdge e : n.succs) {
+                        if (!visited.contains(e.to)) {
+                            visited.add(e.to);
+                            layers[i + 1].add(e.to);
+                        }
+                    }
+                }
+            }
+
+
+            updatePositions();
+
+            initX();
+
+            // Optimize
+            for (int i = 0; i < CROSSING_ITERATIONS; i++) {
+                downSweep();
+                upSweep();
+            }
+
+        /*for(int i=0; i<CROSSING_ITERATIONS; i++) {
+        doubleSweep();
+        }*/
+        }
+
+        private void initX() {
+
+            for (int i = 0; i < layers.length; i++) {
+                updateXOfLayer(i);
+            }
+        }
+
+        private void updateXOfLayer(int index) {
+            int x = 0;
+
+            for (LayoutNode n : layers[index]) {
+                n.x = x;
+                x += n.width + X_OFFSET;
+            }
+        }
+
+        private void updatePositions() {
+
+            for (int i = 0; i < layers.length; i++) {
+                int z = 0;
+                for (LayoutNode n : layers[i]) {
+                    n.pos = z;
+                    z++;
+                }
+            }
+        }
+
+        private void downSweep() {
+
+            // Downsweep
+            for (int i = 1; i < layerCount; i++) {
+
+                for (LayoutNode n : layers[i]) {
+                    n.crossingNumber = 0;
+                }
+
+                for (LayoutNode n : layers[i]) {
+
+                    int sum = 0;
+                    for (LayoutEdge e : n.preds) {
+                        int cur = e.from.x + e.relativeFrom;
+
+                        /*pos;
+                        if(e.from.width != 0 && e.relativeFrom != 0) {
+                        cur += (float)e.relativeFrom / (float)(e.from.width);
+                        }*/
+
+                        sum += cur;
+                    }
+
+                    if (n.preds.size() > 0) {
+                        sum /= n.preds.size();
+                        n.crossingNumber = sum;
+                    //if(n.vertex == null) n.crossingNumber += layers[i].size();
+                    }
+                }
+
+
+                updateCrossingNumbers(i, true);
+                Collections.sort(layers[i], crossingNodeComparator);
+                updateXOfLayer(i);
+
+                int z = 0;
+                for (LayoutNode n : layers[i]) {
+                    n.pos = z;
+                    z++;
+                }
+            }
+        }
+
+        private void updateCrossingNumbers(int index, boolean down) {
+            for (int i = 0; i < layers[index].size(); i++) {
+                LayoutNode n = layers[index].get(i);
+                LayoutNode prev = null;
+                if (i > 0) {
+                    prev = layers[index].get(i - 1);
+                }
+                LayoutNode next = null;
+                if (i < layers[index].size() - 1) {
+                    next = layers[index].get(i + 1);
+                }
+
+                boolean cond = (n.succs.size() == 0);
+                if (down) {
+                    cond = (n.preds.size() == 0);
+                }
+
+                if (cond) {
+
+                    if (prev != null && next != null) {
+                        n.crossingNumber = (prev.crossingNumber + next.crossingNumber) / 2;
+                    } else if (prev != null) {
+                        n.crossingNumber = prev.crossingNumber;
+                    } else if (next != null) {
+                        n.crossingNumber = next.crossingNumber;
+                    }
+                }
+            }
+        }
+        /*
+        private void doubleSweep() {
+        // Downsweep
+        for(int i=0; i<layerCount*2; i++) {
+        int index = i;
+        if(index >= layerCount) {
+        index = 2*layerCount - i - 1;
+        }
+        for(LayoutNode n : layers[index]) {
+        float sum = 0.0f;
+        for(LayoutEdge e : n.preds) {
+        float cur = e.from.pos;
+        if(e.from.width != 0 && e.relativeFrom != 0) {
+        cur += (float)e.relativeFrom / (float)(e.from.width);
+        }
+        sum += cur;
+        }
+        for(LayoutEdge e : n.succs) {
+        float cur = e.to.pos;
+        if(e.to.width != 0 && e.relativeTo != 0) {
+        cur += (float)e.relativeTo / (float)(e.to.width);
+        }
+        sum += cur;
+        }
+        if(n.preds.size() + n.succs.size() > 0) {
+        sum /= n.preds.size() + n.succs.size();
+        n.crossingNumber = sum;
+        }
+        }
+        Collections.sort(layers[index], crossingNodeComparator);
+        updateXOfLayer(index);
+        int z = 0;
+        for(LayoutNode n : layers[index]) {
+        n.pos = z;
+        z++;
+        }
+        }
+        }*/
+
+        private void upSweep() {
+            // Upsweep
+            for (int i = layerCount - 2; i >= 0; i--) {
+
+                for (LayoutNode n : layers[i]) {
+                    n.crossingNumber = 0;
+                }
+
+                for (LayoutNode n : layers[i]) {
+
+                    int sum = 0;
+                    for (LayoutEdge e : n.succs) {
+                        int cur = e.to.x + e.relativeTo;//pos;
+                                                /*
+                        if(e.to.width != 0 && e.relativeTo != 0) {
+                        cur += (float)e.relativeTo / (float)(e.to.width);
+                        }*/
+
+                        sum += cur;
+                    }
+
+                    if (n.succs.size() > 0) {
+                        sum /= n.succs.size();
+                        n.crossingNumber = sum;
+                    //if(n.vertex == null) n.crossingNumber += layers[i].size();
+                    }
+
+                }
+
+                updateCrossingNumbers(i, false);
+                Collections.sort(layers[i], crossingNodeComparator);
+                updateXOfLayer(i);
+
+                int z = 0;
+                for (LayoutNode n : layers[i]) {
+                    n.pos = z;
+                    z++;
+                }
+            }
+        }
+
+        private int evaluate() {
+            // TODO: Implement efficient evaluate / crossing min
+            return 0;
+        }
+
+        @Override
+        public void postCheck() {
+
+            HashSet<LayoutNode> visited = new HashSet<LayoutNode>();
+            for (int i = 0; i < layers.length; i++) {
+                for (LayoutNode n : layers[i]) {
+                    assert !visited.contains(n);
+                    assert n.layer == i;
+                    visited.add(n);
+                }
+            }
+
+        }
+    }
+
+    private class AssignYCoordinates extends AlgorithmPart {
+
+        protected void run() {
+            int curY = 0;
+            //maxLayerHeight = new int[layers.length];
+            for (int i = 0; i < layers.length; i++) {
+                int maxHeight = 0;
+                int baseLine = 0;
+                int bottomBaseLine = 0;
+                for (LayoutNode n : layers[i]) {
+                    maxHeight = Math.max(maxHeight, n.height - n.yOffset - n.bottomYOffset);
+                    baseLine = Math.max(baseLine, n.yOffset);
+                    bottomBaseLine = Math.max(bottomBaseLine, n.bottomYOffset);
+                }
+
+                int maxXOffset = 0;
+                for (LayoutNode n : layers[i]) {
+                    if (n.vertex == null) {
+                        // Dummy node
+                        n.y = curY;
+                        n.height = maxHeight + baseLine + bottomBaseLine;
+
+                    } else {
+                        n.y = curY + baseLine + (maxHeight - (n.height - n.yOffset - n.bottomYOffset)) / 2 - n.yOffset;
+                    }
+
+                    for (LayoutEdge e : n.succs) {
+                        int curXOffset = Math.abs(n.x - e.to.x);
+                        maxXOffset = Math.max(curXOffset, maxXOffset);
+                    }
+                }
+
+                //maxLayerHeight[i] = maxHeight + baseLine + bottomBaseLine;
+
+                curY += maxHeight + baseLine + bottomBaseLine;
+                curY += layerOffset + (int) Math.sqrt(maxXOffset);
+            }
+        }
+    }
+
+    private class CreateDummyNodes extends AlgorithmPart {
+
+        private int oldNodeCount;
+
+        @Override
+        protected void preCheck() {
+            for (LayoutNode n : nodes) {
+                for (LayoutEdge e : n.succs) {
+                    assert e.from != null;
+                    assert e.from == n;
+                    assert e.from.layer < e.to.layer;
+                }
+
+                for (LayoutEdge e : n.preds) {
+                    assert e.to != null;
+                    assert e.to == n;
+                }
+            }
+        }
+
+        protected void run() {
+            oldNodeCount = nodes.size();
+
+
+            if (combine == Combine.SAME_OUTPUTS) {
+
+                Comparator<LayoutEdge> comparator = new Comparator<LayoutEdge>() {
+
+                    public int compare(LayoutEdge e1, LayoutEdge e2) {
+                        return e1.to.layer - e2.to.layer;
+                    }
+                };
+                HashMap<Integer, List<LayoutEdge>> portHash = new HashMap<Integer, List<LayoutEdge>>();
+                ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+                for (LayoutNode n : currentNodes) {
+                    portHash.clear();
+
+                    ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(n.succs);
+                    HashMap<Integer, LayoutNode> topNodeHash = new HashMap<Integer, LayoutNode>();
+                    HashMap<Integer, HashMap<Integer, LayoutNode>> bottomNodeHash = new HashMap<Integer, HashMap<Integer, LayoutNode>>();
+                    for (LayoutEdge e : succs) {
+                        assert e.from.layer < e.to.layer;
+                        if (e.from.layer != e.to.layer - 1) {
+                            if (maxLayerLength != -1 && e.to.layer - e.from.layer > maxLayerLength/* && e.to.preds.size() > 1 && e.from.succs.size() > 1*/) {
+                                assert maxLayerLength > 2;
+                                e.to.preds.remove(e);
+                                e.from.succs.remove(e);
+
+                                LayoutEdge topEdge = null;
+
+                                if (combine == Combine.SAME_OUTPUTS && topNodeHash.containsKey(e.relativeFrom)) {
+                                    LayoutNode topNode = topNodeHash.get(e.relativeFrom);
+                                    topEdge = new LayoutEdge();
+                                    topEdge.relativeFrom = e.relativeFrom;
+                                    topEdge.from = e.from;
+                                    topEdge.relativeTo = topNode.width / 2;
+                                    topEdge.to = topNode;
+                                    topEdge.link = e.link;
+                                    e.from.succs.add(topEdge);
+                                    topNode.preds.add(topEdge);
+                                } else {
+
+                                    LayoutNode topNode = new LayoutNode();
+                                    topNode.layer = e.from.layer + 1;
+                                    topNode.width = DUMMY_WIDTH;
+                                    topNode.height = DUMMY_HEIGHT;
+                                    nodes.add(topNode);
+                                    topEdge = new LayoutEdge();
+                                    topEdge.relativeFrom = e.relativeFrom;
+                                    topEdge.from = e.from;
+                                    topEdge.relativeTo = topNode.width / 2;
+                                    topEdge.to = topNode;
+                                    topEdge.link = e.link;
+                                    e.from.succs.add(topEdge);
+                                    topNode.preds.add(topEdge);
+                                    topNodeHash.put(e.relativeFrom, topNode);
+                                    bottomNodeHash.put(e.relativeFrom, new HashMap<Integer, LayoutNode>());
+                                }
+
+                                HashMap<Integer, LayoutNode> hash = bottomNodeHash.get(e.relativeFrom);
+
+                                LayoutNode bottomNode = null;
+                                if (hash.containsKey(e.to.layer)) {
+                                    bottomNode = hash.get(e.to.layer);
+                                } else {
+
+                                    bottomNode = new LayoutNode();
+                                    bottomNode.layer = e.to.layer - 1;
+                                    bottomNode.width = DUMMY_WIDTH;
+                                    bottomNode.height = DUMMY_HEIGHT;
+                                    nodes.add(bottomNode);
+                                    hash.put(e.to.layer, bottomNode);
+                                }
+
+                                LayoutEdge bottomEdge = new LayoutEdge();
+                                bottomEdge.relativeTo = e.relativeTo;
+                                bottomEdge.to = e.to;
+                                bottomEdge.relativeFrom = bottomNode.width / 2;
+                                bottomEdge.from = bottomNode;
+                                bottomEdge.link = e.link;
+                                e.to.preds.add(bottomEdge);
+                                bottomEdgeHash.put(topEdge, bottomEdge);
+                                bottomNode.succs.add(bottomEdge);
+
+                            } else {
+                                Integer i = e.relativeFrom;
+                                if (!portHash.containsKey(i)) {
+                                    portHash.put(i, new ArrayList<LayoutEdge>());
+                                }
+
+                                if (n.vertex.toString().equals("1012 CastPP")) {
+                                    int x = 0;
+                                }
+
+                                portHash.get(i).add(e);
+                            }
+                        }
+                    }
+
+                    succs = new ArrayList<LayoutEdge>(n.succs);
+                    for (LayoutEdge e : succs) {
+
+                        Integer i = e.relativeFrom;
+                        if (portHash.containsKey(i)) {
+
+                            List<LayoutEdge> list = portHash.get(i);
+                            Collections.sort(list, comparator);
+
+                            if (list.size() == 1) {
+                                processSingleEdge(list.get(0));
+                            } else {
+
+                                int maxLayer = list.get(0).to.layer;
+                                for (LayoutEdge curEdge : list) {
+                                    maxLayer = Math.max(maxLayer, curEdge.to.layer);
+                                }
+
+
+                                int cnt = maxLayer - n.layer - 1;
+                                LayoutEdge[] edges = new LayoutEdge[cnt];
+                                LayoutNode[] nodes = new LayoutNode[cnt];
+                                edges[0] = new LayoutEdge();
+                                edges[0].from = n;
+                                edges[0].relativeFrom = i;
+                                n.succs.add(edges[0]);
+
+                                nodes[0] = new LayoutNode();
+                                nodes[0].width = dummyWidth;
+                                nodes[0].height = dummyHeight;
+                                nodes[0].layer = n.layer + 1;
+                                nodes[0].preds.add(edges[0]);
+                                edges[0].to = nodes[0];
+                                edges[0].relativeTo = nodes[0].width / 2;
+                                for (int j = 1; j < cnt; j++) {
+                                    edges[j] = new LayoutEdge();
+                                    edges[j].from = nodes[j - 1];
+                                    edges[j].relativeFrom = nodes[j - 1].width / 2;
+                                    nodes[j - 1].succs.add(edges[j]);
+                                    nodes[j] = new LayoutNode();
+                                    nodes[j].width = dummyWidth;
+                                    nodes[j].height = dummyHeight;
+                                    nodes[j].layer = n.layer + j + 1;
+                                    nodes[j].preds.add(edges[j]);
+                                    edges[j].to = nodes[j];
+                                    edges[j].relativeTo = nodes[j].width / 2;
+                                }
+
+                                for (LayoutEdge curEdge : list) {
+                                    assert curEdge.to.layer - n.layer - 2 >= 0;
+                                    assert curEdge.to.layer - n.layer - 2 < cnt;
+                                    LayoutNode anchor = nodes[curEdge.to.layer - n.layer - 2];
+                                    anchor.succs.add(curEdge);
+                                    curEdge.from = anchor;
+                                    curEdge.relativeFrom = anchor.width / 2;
+                                    n.succs.remove(curEdge);
+                                }
+
+                            }
+
+                            portHash.remove(i);
+                        }
+                    }
+                }
+            } else if (combine == Combine.SAME_INPUTS) {
+                throw new UnsupportedOperationException("Currently not supported");
+            } else {
+                ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+                for (LayoutNode n : currentNodes) {
+                    for (LayoutEdge e : n.succs) {
+                        processSingleEdge(e);
+                    }
+                }
+            }
+        }
+
+        private void processSingleEdge(LayoutEdge e) {
+            LayoutNode n = e.from;
+            if (e.to.layer > n.layer + 1) {
+                LayoutEdge last = e;
+                for (int i = n.layer + 1; i < last.to.layer; i++) {
+                    last = addBetween(last, i);
+                }
+            }
+        }
+
+        private LayoutEdge addBetween(LayoutEdge e, int layer) {
+            LayoutNode n = new LayoutNode();
+            n.width = dummyWidth;
+            n.height = dummyHeight;
+            n.layer = layer;
+            n.preds.add(e);
+            nodes.add(n);
+            LayoutEdge result = new LayoutEdge();
+            n.succs.add(result);
+            result.from = n;
+            result.relativeFrom = n.width / 2;
+            result.to = e.to;
+            result.relativeTo = e.relativeTo;
+            e.relativeTo = n.width / 2;
+            e.to.preds.remove(e);
+            e.to.preds.add(result);
+            e.to = n;
+            return result;
+        }
+
+        @Override
+        public void printStatistics() {
+            System.out.println("Dummy nodes created: " + (nodes.size() - oldNodeCount));
+        }
+
+        @Override
+        public void postCheck() {
+            ArrayList<LayoutNode> currentNodes = new ArrayList<LayoutNode>(nodes);
+            for (LayoutNode n : currentNodes) {
+                for (LayoutEdge e : n.succs) {
+                    assert e.from.layer == e.to.layer - 1;
+                }
+            }
+
+            for (int i = 0; i < layers.length; i++) {
+                assert layers[i].size() > 0;
+                for (LayoutNode n : layers[i]) {
+                    assert n.layer == i;
+                }
+            }
+        }
+    }
+
+    private class AssignLayers extends AlgorithmPart {
+
+        @Override
+        public void preCheck() {
+            for (LayoutNode n : nodes) {
+                assert n.layer == -1;
+            }
+        }
+
+        protected void run() {
+            HashSet<LayoutNode> set = new HashSet<LayoutNode>();
+            for (LayoutNode n : nodes) {
+                if (n.preds.size() == 0) {
+                    set.add(n);
+                    n.layer = 0;
+                }
+            }
+
+            int z = minLayerDifference;
+            HashSet<LayoutNode> newSet = new HashSet<LayoutNode>();
+            HashSet<LayoutNode> failed = new HashSet<LayoutNode>();
+            while (!set.isEmpty()) {
+
+                newSet.clear();
+                failed.clear();
+
+                for (LayoutNode n : set) {
+
+                    for (LayoutEdge se : n.succs) {
+                        LayoutNode s = se.to;
+                        if (!newSet.contains(s) && !failed.contains(s)) {
+                            boolean ok = true;
+                            for (LayoutEdge pe : s.preds) {
+                                LayoutNode p = pe.from;
+                                if (p.layer == -1) {
+                                    ok = false;
+                                    break;
+                                }
+                            }
+
+                            if (ok) {
+                                newSet.add(s);
+                            } else {
+                                failed.add(s);
+                            }
+                        }
+                    }
+
+                }
+
+                for (LayoutNode n : newSet) {
+                    n.layer = z;
+                }
+
+                // Swap sets
+                HashSet<LayoutNode> tmp = set;
+                set = newSet;
+                newSet = tmp;
+                z += minLayerDifference;
+            }
+
+            optimize(set);
+
+            layerCount = z - minLayerDifference;
+
+            for (Vertex v : lastLayerHint) {
+
+                LayoutNode n = vertexToLayoutNode.get(v);
+                assert n.succs.size() == 0;
+                n.layer = layerCount - 1;
+            }
+
+            for (Vertex v : firstLayerHint) {
+                LayoutNode n = vertexToLayoutNode.get(v);
+                assert n.preds.size() == 0;
+                assert n.layer == 0;
+            }
+        }
+
+        public void optimize(HashSet<LayoutNode> set) {
+
+            for (LayoutNode n : set) {
+                if (n.preds.size() == 0 && n.succs.size() > 0) {
+                    int minLayer = n.succs.get(0).to.layer;
+                    for (LayoutEdge e : n.succs) {
+                        minLayer = Math.min(minLayer, e.to.layer);
+                    }
+
+                    n.layer = minLayer - 1;
+                }
+            }
+
+        }
+
+        @Override
+        public void postCheck() {
+            for (LayoutNode n : nodes) {
+                assert n.layer >= 0;
+                assert n.layer < layerCount;
+                for (LayoutEdge e : n.succs) {
+                    assert e.from.layer < e.to.layer;
+                }
+            }
+        }
+    }
+
+    private class ReverseEdges extends AlgorithmPart {
+
+        private HashSet<LayoutNode> visited;
+        private HashSet<LayoutNode> active;
+
+        protected void run() {
+
+            // Remove self-edges, TODO: Special treatment
+            for (LayoutNode node : nodes) {
+                ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(node.succs);
+                for (LayoutEdge e : succs) {
+                    assert e.from == node;
+                    if (e.to == node) {
+                        node.succs.remove(e);
+                        node.preds.remove(e);
+                    }
+                }
+            }
+
+            // Reverse inputs of roots
+            for (LayoutNode node : nodes) {
+                if (node.vertex.isRoot()) {
+                    boolean ok = true;
+                    for (LayoutEdge e : node.preds) {
+                        if (e.from.vertex.isRoot()) {
+                            ok = false;
+                            break;
+                        }
+                    }
+                    if (ok) {
+                        reverseAllInputs(node);
+                    }
+                }
+            }
+
+
+            // Start DFS and reverse back edges
+            visited = new HashSet<LayoutNode>();
+            active = new HashSet<LayoutNode>();
+            for (LayoutNode node : nodes) {
+                DFS(node);
+            }
+
+
+            for (LayoutNode node : nodes) {
+
+                SortedSet<Integer> reversedDown = new TreeSet<Integer>();
+
+                for (LayoutEdge e : node.succs) {
+                    if (reversedLinks.contains(e.link)) {
+                        reversedDown.add(e.relativeFrom);
+                    }
+                }
+
+
+                SortedSet<Integer> reversedUp = null;
+                if (reversedDown.size() == 0) {
+                    reversedUp = new TreeSet<Integer>(Collections.reverseOrder());
+                } else {
+                    reversedUp = new TreeSet<Integer>();
+                }
+
+                for (LayoutEdge e : node.preds) {
+                    if (reversedLinks.contains(e.link)) {
+                        reversedUp.add(e.relativeTo);
+                    }
+                }
+
+                final int offset = X_OFFSET + DUMMY_WIDTH;
+
+                int curX = 0;
+                int curWidth = node.width + reversedDown.size() * offset;
+                for (int pos : reversedDown) {
+                    ArrayList<LayoutEdge> reversedSuccs = new ArrayList<LayoutEdge>();
+                    for (LayoutEdge e : node.succs) {
+                        if (e.relativeFrom == pos && reversedLinks.contains(e.link)) {
+                            reversedSuccs.add(e);
+                            e.relativeFrom = curWidth;
+                        }
+                    }
+
+                    ArrayList<Point> startPoints = new ArrayList<Point>();
+                    startPoints.add(new Point(curWidth, curX));
+                    startPoints.add(new Point(pos, curX));
+                    startPoints.add(new Point(pos, reversedDown.size() * offset));
+                    for (LayoutEdge e : reversedSuccs) {
+                        reversedLinkStartPoints.put(e.link, startPoints);
+                    }
+
+                    node.inOffsets.put(pos, -curX);
+                    curX += offset;
+                    node.height += offset;
+                    node.yOffset += offset;
+                    curWidth -= offset;
+                }
+                node.width += reversedDown.size() * offset;
+
+                if (reversedDown.size() == 0) {
+                    curX = offset;
+                } else {
+                    curX = -offset;
+                }
+
+                curX = 0;
+                int minX = 0;
+                if (reversedDown.size() != 0) {
+                    minX = -offset * reversedUp.size();
+                }
+
+                int oldNodeHeight = node.height;
+                for (int pos : reversedUp) {
+                    ArrayList<LayoutEdge> reversedPreds = new ArrayList<LayoutEdge>();
+                    for (LayoutEdge e : node.preds) {
+                        if (e.relativeTo == pos && reversedLinks.contains(e.link)) {
+                            if (reversedDown.size() == 0) {
+                                e.relativeTo = node.width + offset;
+                            } else {
+                                e.relativeTo = curX - offset;
+                            }
+
+                            reversedPreds.add(e);
+                        }
+                    }
+                    node.height += offset;
+                    ArrayList<Point> endPoints = new ArrayList<Point>();
+
+                    if (reversedDown.size() == 0) {
+
+                        curX += offset;
+                        node.width += offset;
+                        endPoints.add(new Point(node.width, node.height));
+
+                    } else {
+                        curX -= offset;
+                        node.width += offset;
+                        endPoints.add(new Point(curX, node.height));
+                    }
+
+                    node.outOffsets.put(pos - minX, curX);
+                    curX += offset;
+                    node.bottomYOffset += offset;
+
+
+                    endPoints.add(new Point(pos, node.height));
+                    endPoints.add(new Point(pos, oldNodeHeight));
+                    for (LayoutEdge e : reversedPreds) {
+                        reversedLinkEndPoints.put(e.link, endPoints);
+                    }
+                }
+
+
+                if (minX < 0) {
+                    for (LayoutEdge e : node.preds) {
+                        e.relativeTo -= minX;
+                    }
+
+                    for (LayoutEdge e : node.succs) {
+                        e.relativeFrom -= minX;
+                    }
+
+                    node.xOffset = -minX;
+                    node.width += -minX;
+                }
+            }
+
+        }
+
+        private void DFS(LayoutNode startNode) {
+            if (visited.contains(startNode)) {
+                return;
+            }
+
+            Stack<LayoutNode> stack = new Stack<LayoutNode>();
+            stack.push(startNode);
+
+            while (!stack.empty()) {
+                LayoutNode node = stack.pop();
+
+                if (visited.contains(node)) {
+                    // Node no longer active
+                    active.remove(node);
+                    continue;
+                }
+
+                // Repush immediately to know when no longer active
+                stack.push(node);
+                visited.add(node);
+                active.add(node);
+
+                ArrayList<LayoutEdge> succs = new ArrayList<LayoutEdge>(node.succs);
+                for (LayoutEdge e : succs) {
+                    if (active.contains(e.to)) {
+                        assert visited.contains(e.to);
+                        // Encountered back edge
+                        reverseEdge(e);
+                    } else if (!visited.contains(e.to) && (linksToFollow.size() == 0 || linksToFollow.contains(e.link))) {
+                        stack.push(e.to);
+                    }
+                }
+            }
+        }
+
+        private void reverseAllInputs(LayoutNode node) {
+            for (LayoutEdge e : node.preds) {
+                assert !reversedLinks.contains(e.link);
+                reversedLinks.add(e.link);
+                node.succs.add(e);
+                e.from.preds.add(e);
+                e.from.succs.remove(e);
+                int oldRelativeFrom = e.relativeFrom;
+                int oldRelativeTo = e.relativeTo;
+                e.to = e.from;
+                e.from = node;
+                e.relativeFrom = oldRelativeTo;
+                e.relativeTo = oldRelativeFrom;
+            }
+            node.preds.clear();
+        }
+
+        private void reverseEdge(LayoutEdge e) {
+            assert !reversedLinks.contains(e.link);
+            reversedLinks.add(e.link);
+
+            LayoutNode oldFrom = e.from;
+            LayoutNode oldTo = e.to;
+            int oldRelativeFrom = e.relativeFrom;
+            int oldRelativeTo = e.relativeTo;
+
+            e.from = oldTo;
+            e.to = oldFrom;
+            e.relativeFrom = oldRelativeTo;
+            e.relativeTo = oldRelativeFrom;
+
+            oldFrom.succs.remove(e);
+            oldFrom.preds.add(e);
+            oldTo.preds.remove(e);
+            oldTo.succs.add(e);
+        }
+
+        @Override
+        public void postCheck() {
+
+            for (LayoutNode n : nodes) {
+
+                HashSet<LayoutNode> curVisited = new HashSet<LayoutNode>();
+                Queue<LayoutNode> queue = new LinkedList<LayoutNode>();
+                for (LayoutEdge e : n.succs) {
+                    LayoutNode s = e.to;
+                    queue.add(s);
+                    curVisited.add(s);
+                }
+
+                while (!queue.isEmpty()) {
+                    LayoutNode curNode = queue.remove();
+
+                    for (LayoutEdge e : curNode.succs) {
+                        assert e.to != n;
+                        if (!curVisited.contains(e.to)) {
+                            queue.add(e.to);
+                            curVisited.add(e.to);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    private Comparator<Link> linkComparator = new Comparator<Link>() {
+
+        public int compare(Link l1, Link l2) {
+
+            int result = l1.getFrom().getVertex().compareTo(l2.getFrom().getVertex());
+            if (result != 0) {
+                return result;
+            }
+            result = l1.getTo().getVertex().compareTo(l2.getTo().getVertex());
+            if (result != 0) {
+                return result;
+            }
+            result = l1.getFrom().getRelativePosition().x - l2.getFrom().getRelativePosition().x;
+            if (result != 0) {
+                return result;
+            }
+            result = l1.getTo().getRelativePosition().x - l2.getTo().getRelativePosition().x;
+            return result;
+        }
+    };
+
+    private class BuildDatastructure extends AlgorithmPart {
+
+        protected void run() {
+            // Set up nodes
+            List<Vertex> vertices = new ArrayList<Vertex>(graph.getVertices());
+            Collections.sort(vertices);
+
+            for (Vertex v : vertices) {
+                LayoutNode node = new LayoutNode();
+                Dimension size = v.getSize();
+                node.width = (int) size.getWidth();
+                node.height = (int) size.getHeight();
+                node.vertex = v;
+                nodes.add(node);
+                vertexToLayoutNode.put(v, node);
+            }
+
+            // Set up edges
+            List<Link> links = new ArrayList<Link>(graph.getLinks());
+            Collections.sort(links, linkComparator);
+            for (Link l : links) {
+                LayoutEdge edge = new LayoutEdge();
+                assert vertexToLayoutNode.containsKey(l.getFrom().getVertex());
+                assert vertexToLayoutNode.containsKey(l.getTo().getVertex());
+                edge.from = vertexToLayoutNode.get(l.getFrom().getVertex());
+                edge.to = vertexToLayoutNode.get(l.getTo().getVertex());
+                edge.relativeFrom = l.getFrom().getRelativePosition().x;
+                edge.relativeTo = l.getTo().getRelativePosition().x;
+                edge.link = l;
+                edge.from.succs.add(edge);
+                edge.to.preds.add(edge);
+            //assert edge.from != edge.to; // No self-loops allowed
+            }
+
+            for (Link l : importantLinks) {
+                if (!vertexToLayoutNode.containsKey(l.getFrom().getVertex()) ||
+                        vertexToLayoutNode.containsKey(l.getTo().getVertex())) {
+                    continue;
+                }
+                LayoutNode from = vertexToLayoutNode.get(l.getFrom().getVertex());
+                LayoutNode to = vertexToLayoutNode.get(l.getTo().getVertex());
+                for (LayoutEdge e : from.succs) {
+                    if (e.to == to) {
+                        linksToFollow.add(e.link);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void postCheck() {
+
+            assert vertexToLayoutNode.keySet().size() == nodes.size();
+            assert nodes.size() == graph.getVertices().size();
+
+            for (Vertex v : graph.getVertices()) {
+
+                LayoutNode node = vertexToLayoutNode.get(v);
+                assert node != null;
+
+                for (LayoutEdge e : node.succs) {
+                    assert e.from == node;
+                }
+
+                for (LayoutEdge e : node.preds) {
+                    assert e.to == node;
+                }
+
+            }
+        }
+    }
+
+    public void doRouting(LayoutGraph graph) {
+    // Do nothing for now
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InterClusterConnection implements Link {
+
+    private Port inputSlot;
+    private Port outputSlot;
+    private List<Point> intermediatePoints;
+    private ClusterInputSlotNode inputSlotNode;
+    private ClusterOutputSlotNode outputSlotNode;
+
+    public InterClusterConnection(ClusterOutputSlotNode outputSlotNode, ClusterInputSlotNode inputSlotNode) {
+        this.outputSlotNode = outputSlotNode;
+        this.inputSlotNode = inputSlotNode;
+        this.inputSlot = inputSlotNode.getInputSlot();
+        this.outputSlot = outputSlotNode.getOutputSlot();
+        intermediatePoints = new ArrayList<Point>();
+    }
+
+    public ClusterOutputSlotNode getOutputSlotNode() {
+        return outputSlotNode;
+    }
+
+    public Port getTo() {
+        return inputSlot;
+    }
+
+    public Port getFrom() {
+        return outputSlot;
+    }
+
+    public void setControlPoints(List<Point> p) {
+        this.intermediatePoints = p;
+    }
+
+    public List<Point> getControlPoints() {
+        return intermediatePoints;
+    }
+
+    @Override
+    public String toString() {
+        return "InterClusterConnection[from=" + getFrom() + ", to=" + getTo() + "]";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,161 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Node<N, E> {
+
+    private N data;
+    private List<Edge<N, E>> inEdges;
+    private List<Edge<N, E>> outEdges;
+    private boolean visited;
+    private boolean active;
+    private boolean reachable;
+    private Graph<N, E> graph;
+
+    protected boolean isVisited() {
+        return visited;
+    }
+
+    protected void setVisited(boolean b) {
+        visited = b;
+    }
+
+    protected boolean isReachable() {
+        return reachable;
+    }
+
+    protected void setReachable(boolean b) {
+        reachable = b;
+    }
+
+    protected boolean isActive() {
+        return active;
+    }
+
+    protected void setActive(boolean b) {
+        active = b;
+    }
+
+    public int getInDegree() {
+        return getInDegree(true);
+    }
+
+    public int getInDegree(boolean countSelfLoops) {
+        if (countSelfLoops) {
+            return inEdges.size();
+        } else {
+            int cnt = 0;
+            for (Edge<N, E> e : inEdges) {
+                if (e.getSource() != this) {
+                    cnt++;
+                }
+            }
+            return cnt;
+        }
+    }
+
+    public int getOutDegree() {
+        return outEdges.size();
+    }
+
+    protected Node(Graph<N, E> graph, N data) {
+        setData(data);
+        this.graph = graph;
+        inEdges = new ArrayList<Edge<N, E>>();
+        outEdges = new ArrayList<Edge<N, E>>();
+    }
+
+    protected void addInEdge(Edge<N, E> e) {
+        inEdges.add(e);
+    }
+
+    public Graph<N, E> getGraph() {
+        return graph;
+    }
+
+    protected void addOutEdge(Edge<N, E> e) {
+        outEdges.add(e);
+    }
+
+    protected void removeInEdge(Edge<N, E> e) {
+        //assert inEdges.contains(e);
+        inEdges.remove(e);
+    }
+
+    protected void removeOutEdge(Edge<N, E> e) {
+        //assert outEdges.contains(e);
+        outEdges.remove(e);
+    }
+
+    public List<Edge<N, E>> getInEdges() {
+        return Collections.unmodifiableList(inEdges);
+    }
+
+    public List<Edge<N, E>> getOutEdges() {
+        return Collections.unmodifiableList(outEdges);
+    }
+
+    public List<Node<N, E>> getSuccessors() {
+        ArrayList<Node<N, E>> succ = new ArrayList<Node<N, E>>();
+        for (Edge<N, E> e : getOutEdges()) {
+            Node<N, E> n = e.getDest();
+            if (!succ.contains(n)) {
+                succ.add(n);
+            }
+        }
+        return succ;
+    }
+
+    public List<Node<N, E>> getPredecessors() {
+        ArrayList<Node<N, E>> pred = new ArrayList<Node<N, E>>();
+        for (Edge<N, E> e : getInEdges()) {
+            Node<N, E> n = e.getSource();
+            if (!pred.contains(n)) {
+                pred.add(n);
+            }
+        }
+        return pred;
+    }
+
+    public N getData() {
+        return data;
+    }
+
+    public void setData(N d) {
+        data = d;
+    }
+
+    @Override
+    public String toString() {
+        return "Node: " + data;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1222 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.layout.LayoutManager;
+import com.sun.hotspot.igv.layout.Link;
+import com.sun.hotspot.igv.layout.Port;
+import com.sun.hotspot.igv.layout.Vertex;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OldHierarchicalLayoutManager implements LayoutManager {
+
+    public static final int DUMMY_WIDTH = 0;
+    public static final int DUMMY_HEIGHT = 0;
+    public static final int LAYER_OFFSET = 50;
+    public static final int OFFSET = 8;
+    public static final boolean VERTICAL_LAYOUT = true;
+    public static final boolean ASSERT = false;
+    public static final boolean TRACE = false;
+    public static final Timing initTiming = new Timing("init");
+    public static final Timing removeCyclesTiming = new Timing("removeCycles");
+    public static final Timing reversedEdgesTiming = new Timing("reversedEdges");
+    public static final Timing assignLayersTiming = new Timing("assignLayers");
+    public static final Timing dummyNodesTiming = new Timing("dummyNodes");
+    public static final Timing crossingReductionTiming = new Timing("crossingReduction");
+    public static final Timing assignCoordinatesTiming = new Timing("assignCoordinates");
+    public static final Timing assignRealTiming = new Timing("assignReal");
+    public static final Timing rootVertexTiming = new Timing("rootVertex");
+    public static final Timing createEdgesTiming = new Timing("createEdges");
+    public static final Timing optimizeMedianTiming = new Timing("optimizeMedian");
+    private Combine combine;
+
+    public enum Combine {
+
+        NONE,
+        SAME_INPUTS,
+        SAME_OUTPUTS
+    }
+
+    private class NodeData {
+
+        private Map<Port, Integer> reversePositions;
+        private Vertex node;
+        private Link edge;
+        private int layer;
+        private int x;
+        private int y;
+        private int width;
+
+        public NodeData(Vertex node) {
+            reversePositions = new HashMap<Port, Integer>();
+            layer = -1;
+            this.node = node;
+            assert node != null;
+
+            if (VERTICAL_LAYOUT) {
+                width = node.getSize().width;
+            } else {
+                width = node.getSize().height;
+            }
+        }
+
+        public NodeData(Link edge) {
+            layer = -1;
+            this.edge = edge;
+            assert edge != null;
+
+            if (VERTICAL_LAYOUT) {
+                width = DUMMY_WIDTH;
+            } else {
+                width = DUMMY_HEIGHT;
+            }
+        }
+
+        public Vertex getNode() {
+            return node;
+        }
+
+        public Link getEdge() {
+            return edge;
+        }
+
+        public int getCoordinate() {
+            return x;
+        }
+
+        public void setCoordinate(int x) {
+            this.x = x;
+        }
+
+        public int getX() {
+            if (VERTICAL_LAYOUT) {
+                return x;
+            } else {
+                return y;
+            }
+        }
+
+        public int getY() {
+            if (VERTICAL_LAYOUT) {
+                return y;
+            } else {
+                return x;
+            }
+        }
+
+        public void setLayerCoordinate(int y) {
+            this.y = y;
+        }
+
+        public void setLayer(int x) {
+            layer = x;
+        }
+
+        public int getLayer() {
+            return layer;
+        }
+
+        public boolean isDummy() {
+            return edge != null;
+        }
+
+        public int getWidth() {
+            return width;
+        }
+
+        public void addReversedStartEdge(Edge<NodeData, EdgeData> e) {
+            assert e.getData().isReversed();
+            Port port = e.getData().getEdge().getTo();
+            int pos = addReversedPort(port);
+            Point start = e.getData().getRelativeStart();
+            e.getData().addStartPoint(start);
+            int yCoord = node.getSize().height + width - node.getSize().width;
+            e.getData().addStartPoint(new Point(start.x, yCoord));
+            e.getData().addStartPoint(new Point(pos, yCoord));
+            e.getData().setRelativeStart(new Point(pos, 0));
+        }
+
+        private int addReversedPort(Port p) {
+            if (reversePositions.containsKey(p)) {
+                return reversePositions.get(p);
+            } else {
+                width += OFFSET;
+                reversePositions.put(p, width);
+                return width;
+            }
+        }
+
+        public void addReversedEndEdge(Edge<NodeData, EdgeData> e) {
+            assert e.getData().isReversed();
+            int pos = addReversedPort(e.getData().getEdge().getFrom());
+            Point end = e.getData().getRelativeEnd();
+            e.getData().setRelativeEnd(new Point(pos, node.getSize().height));
+            int yCoord = 0 - width + node.getSize().width;
+            e.getData().addEndPoint(new Point(pos, yCoord));
+            e.getData().addEndPoint(new Point(end.x, yCoord));
+            e.getData().addEndPoint(end);
+        }
+
+        public int getHeight() {
+            if (isDummy()) {
+                if (VERTICAL_LAYOUT) {
+                    return DUMMY_HEIGHT;
+                } else {
+                    return DUMMY_WIDTH;
+                }
+
+            } else {
+                if (VERTICAL_LAYOUT) {
+                    return node.getSize().height;
+                } else {
+                    return node.getSize().width;
+                }
+            }
+        }
+
+        @Override
+        public String toString() {
+            if (isDummy()) {
+                return edge.toString() + "(layer=" + layer + ")";
+            } else {
+                return node.toString() + "(layer=" + layer + ")";
+            }
+        }
+    }
+
+    private class EdgeData {
+
+        private Point relativeEnd;
+        private Point relativeStart;
+        private List<Point> startPoints;
+        private List<Point> endPoints;
+        private boolean important;
+        private boolean reversed;
+        private Link edge;
+
+        public EdgeData(Link edge) {
+            this(edge, false);
+        }
+
+        public EdgeData(Link edge, boolean rev) {
+            this.edge = edge;
+            reversed = rev;
+            relativeStart = edge.getFrom().getRelativePosition();
+            relativeEnd = edge.getTo().getRelativePosition();
+            assert relativeStart.x >= 0 && relativeStart.x <= edge.getFrom().getVertex().getSize().width;
+            assert relativeStart.y >= 0 && relativeStart.y <= edge.getFrom().getVertex().getSize().height;
+            assert relativeEnd.x >= 0 && relativeEnd.x <= edge.getTo().getVertex().getSize().width;
+            assert relativeEnd.y >= 0 && relativeEnd.y <= edge.getTo().getVertex().getSize().height;
+            startPoints = new ArrayList<Point>();
+            endPoints = new ArrayList<Point>();
+            this.important = true;
+        }
+
+        public boolean isImportant() {
+            return important;
+        }
+
+        public void setImportant(boolean b) {
+            this.important = b;
+        }
+
+        public List<Point> getStartPoints() {
+            return startPoints;
+        }
+
+        public List<Point> getEndPoints() {
+            return endPoints;
+        }
+
+        public List<Point> getAbsoluteEndPoints() {
+            if (endPoints.size() == 0) {
+                return endPoints;
+            }
+
+            List<Point> result = new ArrayList<Point>();
+            Point point = edge.getTo().getVertex().getPosition();
+            for (Point p : endPoints) {
+                Point p2 = new Point(p.x + point.x, p.y + point.y);
+                result.add(p2);
+            }
+
+            return result;
+        }
+
+        public List<Point> getAbsoluteStartPoints() {
+            if (startPoints.size() == 0) {
+                return startPoints;
+            }
+
+            List<Point> result = new ArrayList<Point>();
+            Point point = edge.getFrom().getVertex().getPosition();
+            for (Point p : startPoints) {
+                Point p2 = new Point(p.x + point.x, p.y + point.y);
+                result.add(p2);
+            }
+
+            return result;
+        }
+
+        public void addEndPoint(Point p) {
+            endPoints.add(p);
+        }
+
+        public void addStartPoint(Point p) {
+            startPoints.add(p);
+        }
+
+        public Link getEdge() {
+            return edge;
+        }
+
+        public void setRelativeEnd(Point p) {
+            relativeEnd = p;
+        }
+
+        public void setRelativeStart(Point p) {
+            relativeStart = p;
+        }
+
+        public Point getRelativeEnd() {
+            return relativeEnd;
+        }
+
+        public Point getRelativeStart() {
+            return relativeStart;
+        }
+
+        public boolean isReversed() {
+            return reversed;
+        }
+
+        public void setReversed(boolean b) {
+            reversed = b;
+        }
+
+        @Override
+        public String toString() {
+            return "EdgeData[reversed=" + reversed + "]";
+        }
+    }
+    private Graph<NodeData, EdgeData> graph;
+    private Map<Vertex, Node<NodeData, EdgeData>> nodeMap;
+    private int layerOffset;
+
+    /** Creates a new instance of HierarchicalPositionManager */
+    public OldHierarchicalLayoutManager(Combine combine) {
+        this(combine, LAYER_OFFSET);
+    }
+
+    public OldHierarchicalLayoutManager(Combine combine, int layerOffset) {
+        this.combine = combine;
+        this.layerOffset = layerOffset;
+    }
+
+    public void doRouting(LayoutGraph graph) {
+    }
+
+    //public void setPositions(PositionedNode rootNode, List<? extends PositionedNode> nodes, List<? extends PositionedEdge> edges) {
+    public void doLayout(LayoutGraph layoutGraph) {
+        doLayout(layoutGraph, new HashSet<Vertex>(), new HashSet<Vertex>());
+    }
+
+    public void doLayout(LayoutGraph layoutGraph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint) {
+        doLayout(layoutGraph, firstLayerHint, lastLayerHint, new HashSet<Link>());
+    }
+
+    public void doLayout(LayoutGraph layoutGraph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinksHint) {
+
+        if (TRACE) {
+            System.out.println("HierarchicalPositionManager.doLayout called");
+            System.out.println("Vertex count = " + layoutGraph.getVertices().size() + " Link count = " + layoutGraph.getLinks().size());
+        }
+
+        // Nothing to do => quit immediately
+        if (layoutGraph.getVertices().size() == 0) {
+            return;
+        }
+
+        initTiming.start();
+
+        // Mapping vertex to Node in graph
+        nodeMap = new HashMap<Vertex, Node<NodeData, EdgeData>>();
+
+        graph = new Graph<NodeData, EdgeData>();
+
+        Set<Node<NodeData, EdgeData>> rootNodes = new HashSet<Node<NodeData, EdgeData>>();
+        Set<Vertex> startRootVertices = new HashSet<Vertex>();
+
+        for (Vertex v : layoutGraph.getVertices()) {
+            if (v.isRoot()) {
+                startRootVertices.add(v);
+            }
+        }
+
+        rootVertexTiming.start();
+        Set<Vertex> rootVertices = layoutGraph.findRootVertices(startRootVertices);
+        rootVertexTiming.stop();
+
+
+        for (Vertex node : layoutGraph.getVertices()) {
+
+            NodeData data = new NodeData(node);
+            Node<NodeData, EdgeData> n = graph.createNode(data, node);
+            nodeMap.put(node, n);
+
+            if (rootVertices.contains(node)) {
+                rootNodes.add(n);
+            }
+        }
+
+        Set<? extends Link> links = layoutGraph.getLinks();
+        Link[] linkArr = new Link[links.size()];
+        links.toArray(linkArr);
+
+        List<Link> linkList = new ArrayList<Link>();
+        for (Link l : linkArr) {
+            linkList.add(l);
+        }
+
+        createEdgesTiming.start();
+        Collections.sort(linkList, new Comparator<Link>() {
+
+            public int compare(Link o1, Link o2) {
+                int result = o1.getFrom().getVertex().compareTo(o2.getFrom().getVertex());
+                if (result == 0) {
+                    return o1.getTo().getVertex().compareTo(o2.getTo().getVertex());
+                } else {
+                    return result;
+                }
+            }
+        });
+
+        for (Link edge : linkList) {
+            EdgeData data = new EdgeData(edge);
+            graph.createEdge(graph.getNode(edge.getFrom().getVertex()), graph.getNode(edge.getTo().getVertex()), data, data);
+            if (importantLinksHint.size() > 0 && !importantLinksHint.contains(edge)) {
+                data.setImportant(false);
+            }
+        }
+        createEdgesTiming.stop();
+
+        initTiming.stop();
+
+        removeCyclesTiming.start();
+
+        // STEP 1: Remove cycles!
+        removeCycles(rootNodes);
+        if (ASSERT) {
+            assert checkRemoveCycles();
+        }
+
+        removeCyclesTiming.stop();
+
+        reversedEdgesTiming.start();
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getOutEdges());
+            Collections.sort(edges, new Comparator<Edge<NodeData, EdgeData>>() {
+
+                public int compare(Edge<NodeData, EdgeData> o1, Edge<NodeData, EdgeData> o2) {
+                    return o2.getData().getRelativeEnd().x - o1.getData().getRelativeEnd().x;
+                }
+            });
+
+
+            for (Edge<NodeData, EdgeData> e : edges) {
+
+                if (e.getData().isReversed()) {
+                    e.getSource().getData().addReversedEndEdge(e);
+                }
+            }
+        }
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getInEdges());
+            Collections.sort(edges, new Comparator<Edge<NodeData, EdgeData>>() {
+
+                public int compare(Edge<NodeData, EdgeData> o1, Edge<NodeData, EdgeData> o2) {
+                    return o2.getData().getRelativeStart().x - o1.getData().getRelativeStart().x;
+                }
+            });
+
+
+            for (Edge<NodeData, EdgeData> e : edges) {
+                if (e.getData().isReversed()) {
+                    e.getDest().getData().addReversedStartEdge(e);
+                }
+            }
+        }
+
+        reversedEdgesTiming.stop();
+
+        assignLayersTiming.start();
+        // STEP 2: Assign layers!
+        int maxLayer = assignLayers(rootNodes, firstLayerHint, lastLayerHint);
+        if (ASSERT) {
+            assert checkAssignLayers();
+        }
+
+        // Put into layer array
+        //int maxLayer = 0;
+        //for(Node<NodeData, EdgeData> n : graph.getNodes()) {
+        //    maxLayer = Math.max(maxLayer, n.getData().getLayer());
+        //}
+
+
+        ArrayList<Node<NodeData, EdgeData>> layers[] = new ArrayList[maxLayer + 1];
+        int layerSizes[] = new int[maxLayer + 1];
+        for (int i = 0; i < maxLayer + 1; i++) {
+            layers[i] = new ArrayList<Node<NodeData, EdgeData>>();
+        }
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            int curLayer = n.getData().getLayer();
+            layers[curLayer].add(n);
+        }
+
+        assignLayersTiming.stop();
+
+        // STEP 3: Insert dummy nodes!
+        dummyNodesTiming.start();
+        insertDummyNodes(layers);
+        if (ASSERT) {
+            assert checkDummyNodes();
+        }
+        dummyNodesTiming.stop();
+
+        crossingReductionTiming.start();
+        // STEP 4: Assign Y coordinates
+        assignLayerCoordinates(layers, layerSizes);
+
+        // STEP 5: Crossing reduction
+        crossingReduction(layers);
+        crossingReductionTiming.stop();
+
+        // STEP 6: Assign Y coordinates
+        assignCoordinatesTiming.start();
+        assignCoordinates(layers);
+        assignCoordinatesTiming.stop();
+
+        assignRealTiming.start();
+
+        // Assign coordinates of nodes to real objects
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            if (!n.getData().isDummy()) {
+
+                Vertex node = n.getData().getNode();
+                node.setPosition(new Point(n.getData().getX(), n.getData().getY()));
+            }
+        }
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            if (!n.getData().isDummy()) {
+
+                Vertex node = n.getData().getNode();
+
+                List<Edge<NodeData, EdgeData>> outEdges = n.getOutEdges();
+                for (Edge<NodeData, EdgeData> e : outEdges) {
+                    Node<NodeData, EdgeData> succ = e.getDest();
+                    if (succ.getData().isDummy()) {
+                        //PositionedEdge edge = succ.getData().getEdge();
+                        List<Point> points = new ArrayList<Point>();
+                        assignToRealObjects(layerSizes, succ, points);
+                    } else {
+                        List<Point> points = new ArrayList<Point>();
+
+                        EdgeData otherEdgeData = e.getData();
+                        points.addAll(otherEdgeData.getAbsoluteStartPoints());
+                        Link otherEdge = otherEdgeData.getEdge();
+                        Point relFrom = new Point(otherEdgeData.getRelativeStart());
+                        Point from = otherEdge.getFrom().getVertex().getPosition();
+                        relFrom.move(relFrom.x + from.x, relFrom.y + from.y);
+                        points.add(relFrom);
+
+                        Point relTo = new Point(otherEdgeData.getRelativeEnd());
+                        Point to = otherEdge.getTo().getVertex().getPosition();
+                        relTo.move(relTo.x + to.x, relTo.y + to.y);
+                        assert from != null;
+                        assert to != null;
+                        points.add(relTo);
+                        points.addAll(otherEdgeData.getAbsoluteEndPoints());
+                        e.getData().getEdge().setControlPoints(points);
+                    }
+                }
+            }
+        }
+
+        assignRealTiming.stop();
+
+        initTiming.print();
+        removeCyclesTiming.print();
+        reversedEdgesTiming.print();
+        assignLayersTiming.print();
+        dummyNodesTiming.print();
+        crossingReductionTiming.print();
+        assignCoordinatesTiming.print();
+        assignRealTiming.print();
+        rootVertexTiming.print();
+        createEdgesTiming.print();
+        optimizeMedianTiming.print();
+    }
+
+    public boolean onOneLine(Point p1, Point p2, Point p3) {
+        int xoff1 = p1.x - p2.x;
+        int yoff1 = p1.y - p2.y;
+        int xoff2 = p3.x - p2.x;
+        int yoff2 = p3.y - p2.x;
+
+        return (xoff1 * yoff2 - yoff1 * xoff2 == 0);
+    }
+
+    private void assignToRealObjects(int layerSizes[], Node<NodeData, EdgeData> cur, List<Point> points) {
+        assert cur.getData().isDummy();
+
+        ArrayList<Point> otherPoints = new ArrayList<Point>(points);
+
+        int size = layerSizes[cur.getData().getLayer()];
+        otherPoints.add(new Point(cur.getData().getX(), cur.getData().getY() - size / 2));
+        if (otherPoints.size() >= 3 && onOneLine(otherPoints.get(otherPoints.size() - 1), otherPoints.get(otherPoints.size() - 2), otherPoints.get(otherPoints.size() - 3))) {
+            otherPoints.remove(otherPoints.size() - 2);
+        }
+        otherPoints.add(new Point(cur.getData().getX(), cur.getData().getY() + size / 2));
+        if (otherPoints.size() >= 3 && onOneLine(otherPoints.get(otherPoints.size() - 1), otherPoints.get(otherPoints.size() - 2), otherPoints.get(otherPoints.size() - 3))) {
+            otherPoints.remove(otherPoints.size() - 2);
+        }
+
+        for (int i = 0; i < cur.getOutEdges().size(); i++) {
+            Node<NodeData, EdgeData> otherSucc = cur.getOutEdges().get(i).getDest();
+
+            if (otherSucc.getData().isDummy()) {
+                assignToRealObjects(layerSizes, otherSucc, otherPoints);
+            } else {
+                EdgeData otherEdgeData = cur.getOutEdges().get(i).getData();
+                Link otherEdge = otherEdgeData.getEdge();
+
+                List<Point> middlePoints = new ArrayList<Point>(otherPoints);
+                if (cur.getOutEdges().get(i).getData().isReversed()) {
+                    Collections.reverse(middlePoints);
+                }
+
+                ArrayList<Point> copy = new ArrayList<Point>();
+                Point relFrom = new Point(otherEdgeData.getRelativeStart());
+                Point from = otherEdge.getFrom().getVertex().getPosition();
+                //int moveUp = (size - otherEdge.getFrom().getVertex().getSize().height) / 2;
+                relFrom.move(relFrom.x + from.x, relFrom.y + from.y);
+                copy.addAll(otherEdgeData.getAbsoluteStartPoints());
+                copy.add(relFrom);
+                copy.addAll(middlePoints);
+
+                Point relTo = new Point(otherEdgeData.getRelativeEnd());
+                Point to = otherEdge.getTo().getVertex().getPosition();
+                relTo.move(relTo.x + to.x, relTo.y + to.y);
+                copy.add(relTo);
+
+                copy.addAll(otherEdgeData.getAbsoluteEndPoints());
+
+
+                otherEdge.setControlPoints(copy);
+            }
+        }
+    }
+
+    private boolean checkDummyNodes() {
+        for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+            if (e.getSource().getData().getLayer() != e.getDest().getData().getLayer() - 1) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private void insertDummyNodes(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+        int sum = 0;
+        List<Node<NodeData, EdgeData>> nodes = new ArrayList<Node<NodeData, EdgeData>>(graph.getNodes());
+        int edgeCount = 0;
+        int innerMostLoop = 0;
+
+        for (Node<NodeData, EdgeData> n : nodes) {
+            List<Edge<NodeData, EdgeData>> edges = new ArrayList<Edge<NodeData, EdgeData>>(n.getOutEdges());
+            for (Edge<NodeData, EdgeData> e : edges) {
+
+                edgeCount++;
+                Link edge = e.getData().getEdge();
+                Node<NodeData, EdgeData> destNode = e.getDest();
+                Node<NodeData, EdgeData> lastNode = n;
+                Edge<NodeData, EdgeData> lastEdge = e;
+
+                boolean searchForNode = (combine != Combine.NONE);
+                for (int i = n.getData().getLayer() + 1; i < destNode.getData().getLayer(); i++) {
+
+                    Node<NodeData, EdgeData> foundNode = null;
+                    if (searchForNode) {
+                        for (Node<NodeData, EdgeData> sameLayerNode : layers[i]) {
+                            innerMostLoop++;
+
+                            if (combine == Combine.SAME_OUTPUTS) {
+                                if (sameLayerNode.getData().isDummy() && sameLayerNode.getData().getEdge().getFrom() == edge.getFrom()) {
+                                    foundNode = sameLayerNode;
+                                    break;
+                                }
+                            } else if (combine == Combine.SAME_INPUTS) {
+                                if (sameLayerNode.getData().isDummy() && sameLayerNode.getData().getEdge().getTo() == edge.getTo()) {
+                                    foundNode = sameLayerNode;
+                                    break;
+                                }
+                            }
+                        }
+                    }
+
+                    if (foundNode == null) {
+                        searchForNode = false;
+                        NodeData intermediateData = new NodeData(edge);
+                        Node<NodeData, EdgeData> curNode = graph.createNode(intermediateData, null);
+                        curNode.getData().setLayer(i);
+                        layers[i].add(0, curNode);
+                        sum++;
+                        lastEdge.remove();
+                        graph.createEdge(lastNode, curNode, e.getData(), null);
+                        assert lastNode.getData().getLayer() == curNode.getData().getLayer() - 1;
+                        lastEdge = graph.createEdge(curNode, destNode, e.getData(), null);
+                        lastNode = curNode;
+                    } else {
+                        lastEdge.remove();
+                        lastEdge = graph.createEdge(foundNode, destNode, e.getData(), null);
+                        lastNode = foundNode;
+                    }
+
+                }
+            }
+        }
+
+        if (TRACE) {
+            System.out.println("Number of edges: " + edgeCount);
+        }
+        if (TRACE) {
+            System.out.println("Dummy nodes inserted: " + sum);
+        }
+    }
+
+    private void assignLayerCoordinates(ArrayList<Node<NodeData, EdgeData>> layers[], int layerSizes[]) {
+        int cur = 0;
+        for (int i = 0; i < layers.length; i++) {
+            int maxHeight = 0;
+            for (Node<NodeData, EdgeData> n : layers[i]) {
+                maxHeight = Math.max(maxHeight, n.getData().getHeight());
+            }
+
+            layerSizes[i] = maxHeight;
+            for (Node<NodeData, EdgeData> n : layers[i]) {
+                int curCoordinate = cur + (maxHeight - n.getData().getHeight()) / 2;
+                n.getData().setLayerCoordinate(curCoordinate);
+            }
+            cur += maxHeight + layerOffset;
+
+        }
+    }
+
+    private void assignCoordinates(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+        // TODO: change this
+        for (int i = 0; i < layers.length; i++) {
+            ArrayList<Node<NodeData, EdgeData>> curArray = layers[i];
+            int curY = 0;
+            for (Node<NodeData, EdgeData> n : curArray) {
+
+                n.getData().setCoordinate(curY);
+                if (!n.getData().isDummy()) {
+                    curY += n.getData().getWidth();
+                }
+                curY += OFFSET;
+
+            }
+        }
+
+        int curSol = evaluateSolution();
+        if (TRACE) {
+            System.out.println("First coordinate solution found: " + curSol);
+        }
+
+        // Sort to correct order
+        for (int i = 0; i < layers.length; i++) {
+            Collections.sort(layers[i], new Comparator<Node<NodeData, EdgeData>>() {
+
+                public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+                    if (o2.getData().isDummy()) {
+                        return 1;
+                    } else if (o1.getData().isDummy()) {
+                        return -1;
+                    }
+                    return o2.getInEdges().size() + o2.getOutEdges().size() - o1.getInEdges().size() - o1.getOutEdges().size();
+                }
+            });
+        }
+
+
+        optimizeMedianTiming.start();
+        for (int i = 0; i < 2; i++) {
+            optimizeMedian(layers);
+            curSol = evaluateSolution();
+            if (TRACE) {
+                System.out.println("Current coordinate solution found: " + curSol);
+            }
+        }
+        optimizeMedianTiming.stop();
+        normalizeCoordinate();
+
+    }
+
+    private void normalizeCoordinate() {
+
+        int min = Integer.MAX_VALUE;
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            min = Math.min(min, n.getData().getCoordinate());
+        }
+
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            n.getData().setCoordinate(n.getData().getCoordinate() - min);
+        }
+
+    }
+
+    private void optimizeMedian(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+        // Downsweep
+        for (int i = 1; i < layers.length; i++) {
+
+            ArrayList<Node<NodeData, EdgeData>> processingList = layers[i];
+            ArrayList<Node<NodeData, EdgeData>> alreadyAssigned = new ArrayList<Node<NodeData, EdgeData>>();
+            for (Node<NodeData, EdgeData> n : processingList) {
+
+
+                ArrayList<Node<NodeData, EdgeData>> preds = new ArrayList<Node<NodeData, EdgeData>>(n.getPredecessors());
+                int pos = n.getData().getCoordinate();
+                if (preds.size() > 0) {
+
+                    Collections.sort(preds, new Comparator<Node<NodeData, EdgeData>>() {
+
+                        public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+                            return o1.getData().getCoordinate() - o2.getData().getCoordinate();
+                        }
+                    });
+
+                    if (preds.size() % 2 == 0) {
+                        assert preds.size() >= 2;
+                        pos = (preds.get(preds.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2), n) + preds.get(preds.size() / 2 - 1).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2 - 1), n)) / 2;
+                    } else {
+                        assert preds.size() >= 1;
+                        pos = preds.get(preds.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(preds.get(preds.size() / 2), n);
+                    }
+                }
+
+                tryAdding(alreadyAssigned, n, pos);
+            }
+        }
+        // Upsweep
+        for (int i = layers.length - 2; i >= 0; i--) {
+            ArrayList<Node<NodeData, EdgeData>> processingList = layers[i];
+            ArrayList<Node<NodeData, EdgeData>> alreadyAssigned = new ArrayList<Node<NodeData, EdgeData>>();
+            for (Node<NodeData, EdgeData> n : processingList) {
+
+                ArrayList<Node<NodeData, EdgeData>> succs = new ArrayList<Node<NodeData, EdgeData>>(n.getSuccessors());
+                int pos = n.getData().getCoordinate();
+                if (succs.size() > 0) {
+
+                    Collections.sort(succs, new Comparator<Node<NodeData, EdgeData>>() {
+
+                        public int compare(Node<NodeData, EdgeData> o1, Node<NodeData, EdgeData> o2) {
+                            return o1.getData().getCoordinate() - o2.getData().getCoordinate();
+                        }
+                    });
+
+                    if (succs.size() % 2 == 0) {
+                        assert succs.size() >= 2;
+                        pos = (succs.get(succs.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2)) + succs.get(succs.size() / 2 - 1).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2 - 1))) / 2;
+                    } else {
+                        assert succs.size() >= 1;
+                        pos = succs.get(succs.size() / 2).getData().getCoordinate() - calcRelativeCoordinate(n, succs.get(succs.size() / 2));
+                    }
+                }
+
+                tryAdding(alreadyAssigned, n, pos);
+            }
+        }
+    }
+
+    private int median(ArrayList<Integer> arr) {
+        assert arr.size() > 0;
+        Collections.sort(arr);
+        if (arr.size() % 2 == 0) {
+            return (arr.get(arr.size() / 2) + arr.get(arr.size() / 2 - 1)) / 2;
+        } else {
+            return arr.get(arr.size() / 2);
+        }
+    }
+
+    private int calcRelativeCoordinate(Node<NodeData, EdgeData> n, Node<NodeData, EdgeData> succ) {
+
+        if (n.getData().isDummy() && succ.getData().isDummy()) {
+            return 0;
+        }
+
+        int pos = 0;
+        int pos2 = 0;
+        ArrayList<Integer> coords2 = new ArrayList<Integer>();
+        ArrayList<Integer> coords = new ArrayList<Integer>();
+        /*if(!n.getData().isDummy())*/ {
+            for (Edge<NodeData, EdgeData> e : n.getOutEdges()) {
+
+                //System.out.println("reversed: " + e.getData().isReversed());
+                if (e.getDest() == succ) {
+
+                    if (e.getData().isReversed()) {
+                        if (!n.getData().isDummy()) {
+                            coords.add(e.getData().getRelativeEnd().x);
+                        }
+
+                        if (!succ.getData().isDummy()) {
+                            coords2.add(e.getData().getRelativeStart().x);
+                        }
+                    } else {
+                        if (!n.getData().isDummy()) {
+                            coords.add(e.getData().getRelativeStart().x);
+                        }
+
+                        if (!succ.getData().isDummy()) {
+                            coords2.add(e.getData().getRelativeEnd().x);
+                        }
+                    }
+                }
+            }
+
+            // assert coords.size() > 0;
+            if (!n.getData().isDummy()) {
+                pos = median(coords);
+            }
+
+            if (!succ.getData().isDummy()) {
+                pos2 = median(coords2);
+            }
+        }
+        //System.out.println("coords=" + coords);
+        //System.out.println("coords2=" + coords2);
+
+        return pos - pos2;
+    }
+
+    private boolean intersect(int v1, int w1, int v2, int w2) {
+        if (v1 >= v2 && v1 < v2 + w2) {
+            return true;
+        }
+        if (v1 + w1 > v2 && v1 + w1 < v2 + w2) {
+            return true;
+        }
+        if (v1 < v2 && v1 + w1 > v2) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean intersect(Node<NodeData, EdgeData> n1, Node<NodeData, EdgeData> n2) {
+        return intersect(n1.getData().getCoordinate(), n1.getData().getWidth() + OFFSET, n2.getData().getCoordinate(), n2.getData().getWidth() + OFFSET);
+    }
+
+    private void tryAdding(List<Node<NodeData, EdgeData>> alreadyAssigned, Node<NodeData, EdgeData> node, int pos) {
+
+        boolean doesIntersect = false;
+        node.getData().setCoordinate(pos);
+        for (Node<NodeData, EdgeData> n : alreadyAssigned) {
+            if (n.getData().getCoordinate() + n.getData().getWidth() < pos) {
+                break;
+            } else if (intersect(node, n)) {
+                doesIntersect = true;
+                break;
+            }
+
+        }
+
+        if (!doesIntersect) {
+
+            // Everything fine, just place the node
+            int z = 0;
+            for (Node<NodeData, EdgeData> n : alreadyAssigned) {
+                if (pos > n.getData().getCoordinate()) {
+                    break;
+                }
+                z++;
+            }
+
+            if (z == -1) {
+                z = alreadyAssigned.size();
+            }
+
+
+            if (ASSERT) {
+                assert !findOverlap(alreadyAssigned, node);
+            }
+            alreadyAssigned.add(z, node);
+
+        } else {
+
+            assert alreadyAssigned.size() > 0;
+
+            // Search for alternative location
+            int minOffset = Integer.MAX_VALUE;
+            int minIndex = -1;
+            int minPos = 0;
+            int w = node.getData().getWidth() + OFFSET;
+
+            // Try top-most
+            minIndex = 0;
+            minPos = alreadyAssigned.get(0).getData().getCoordinate() + alreadyAssigned.get(0).getData().getWidth() + OFFSET;
+            minOffset = Math.abs(minPos - pos);
+
+            // Try bottom-most
+            Node<NodeData, EdgeData> lastNode = alreadyAssigned.get(alreadyAssigned.size() - 1);
+            int lastPos = lastNode.getData().getCoordinate() - w;
+            int lastOffset = Math.abs(lastPos - pos);
+            if (lastOffset < minOffset) {
+                minPos = lastPos;
+                minOffset = lastOffset;
+                minIndex = alreadyAssigned.size();
+            }
+
+            // Try between
+            for (int i = 0; i < alreadyAssigned.size() - 1; i++) {
+                Node<NodeData, EdgeData> curNode = alreadyAssigned.get(i);
+                Node<NodeData, EdgeData> nextNode = alreadyAssigned.get(i + 1);
+
+                int start = nextNode.getData().getCoordinate() + nextNode.getData().getWidth() + OFFSET;
+                int end = curNode.getData().getCoordinate() - OFFSET;
+
+                int bestPoss = end - node.getData().getWidth();
+                if (bestPoss < pos && pos - bestPoss > minOffset) {
+                    // No better solution possible => break
+                    break;
+                }
+
+                if (end - start >= node.getData().getWidth()) {
+                    // Node could fit here
+                    int cand1 = start;
+                    int cand2 = end - node.getData().getWidth();
+                    int off1 = Math.abs(cand1 - pos);
+                    int off2 = Math.abs(cand2 - pos);
+                    if (off1 < minOffset) {
+                        minPos = cand1;
+                        minOffset = off1;
+                        minIndex = i + 1;
+                    }
+
+                    if (off2 < minOffset) {
+                        minPos = cand2;
+                        minOffset = off2;
+                        minIndex = i + 1;
+                    }
+                }
+            }
+
+            assert minIndex != -1;
+            node.getData().setCoordinate(minPos);
+            if (ASSERT) {
+                assert !findOverlap(alreadyAssigned, node);
+            }
+            alreadyAssigned.add(minIndex, node);
+        }
+
+    }
+
+    private boolean findOverlap(List<Node<NodeData, EdgeData>> nodes, Node<NodeData, EdgeData> node) {
+
+        for (Node<NodeData, EdgeData> n1 : nodes) {
+            if (intersect(n1, node)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private int evaluateSolution() {
+
+        int sum = 0;
+        for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+            Node<NodeData, EdgeData> source = e.getSource();
+            Node<NodeData, EdgeData> dest = e.getDest();
+            int offset = 0;
+            offset = Math.abs(source.getData().getCoordinate() - dest.getData().getCoordinate());
+            sum += offset;
+        }
+
+        return sum;
+    }
+
+    private void crossingReduction(ArrayList<Node<NodeData, EdgeData>> layers[]) {
+
+        for (int i = 0; i < layers.length - 1; i++) {
+
+            ArrayList<Node<NodeData, EdgeData>> curNodes = layers[i];
+            ArrayList<Node<NodeData, EdgeData>> nextNodes = layers[i + 1];
+            for (Node<NodeData, EdgeData> n : curNodes) {
+                for (Node<NodeData, EdgeData> succ : n.getSuccessors()) {
+                    if (ASSERT) {
+                        assert nextNodes.contains(succ);
+                    }
+                    nextNodes.remove(succ);
+                    nextNodes.add(succ);
+                }
+            }
+
+        }
+
+    }
+
+    private void removeCycles(Set<Node<NodeData, EdgeData>> rootNodes) {
+        final List<Edge<NodeData, EdgeData>> reversedEdges = new ArrayList<Edge<NodeData, EdgeData>>();
+
+
+        int removedCount = 0;
+        int reversedCount = 0;
+
+        Graph.DFSTraversalVisitor visitor = graph.new DFSTraversalVisitor() {
+
+            @Override
+            public boolean visitEdge(Edge<NodeData, EdgeData> e, boolean backEdge) {
+                if (backEdge) {
+                    if (ASSERT) {
+                        assert !reversedEdges.contains(e);
+                    }
+                    reversedEdges.add(e);
+                    e.getData().setReversed(!e.getData().isReversed());
+                }
+
+                return e.getData().isImportant();
+            }
+        };
+        Set<Node<NodeData, EdgeData>> nodes = new HashSet<Node<NodeData, EdgeData>>();
+        nodes.addAll(rootNodes);
+
+        assert nodes.size() > 0;
+
+        this.graph.traverseDFS(nodes, visitor);
+
+        for (Edge<NodeData, EdgeData> e : reversedEdges) {
+            if (e.isSelfLoop()) {
+                e.remove();
+                removedCount++;
+            } else {
+                e.reverse();
+                reversedCount++;
+            }
+        }
+    }
+
+    private boolean checkRemoveCycles() {
+        return !graph.hasCycles();
+    }
+    // Only used by assignLayers
+    private int maxLayerTemp;
+
+    private int assignLayers(Set<Node<NodeData, EdgeData>> rootNodes, Set<? extends Vertex> firstLayerHints,
+            Set<? extends Vertex> lastLayerHints) {
+        this.maxLayerTemp = -1;
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            n.getData().setLayer(-1);
+        }
+
+        Graph.BFSTraversalVisitor traverser = graph.new BFSTraversalVisitor() {
+
+            @Override
+            public void visitNode(Node<NodeData, EdgeData> n, int depth) {
+                if (depth > n.getData().getLayer()) {
+                    n.getData().setLayer(depth);
+                    maxLayerTemp = Math.max(maxLayerTemp, depth);
+                }
+            }
+        };
+
+        for (Node<NodeData, EdgeData> n : rootNodes) {
+            if (n.getData().getLayer() == -1) {
+                this.graph.traverseBFS(n, traverser, true);
+            }
+        }
+
+        for (Vertex v : firstLayerHints) {
+            assert nodeMap.containsKey(v);
+            nodeMap.get(v).getData().setLayer(0);
+        }
+
+        for (Vertex v : lastLayerHints) {
+            assert nodeMap.containsKey(v);
+            nodeMap.get(v).getData().setLayer(maxLayerTemp);
+        }
+
+        return maxLayerTemp;
+    }
+
+    private boolean checkAssignLayers() {
+
+        for (Edge<NodeData, EdgeData> e : graph.getEdges()) {
+            Node<NodeData, EdgeData> source = e.getSource();
+            Node<NodeData, EdgeData> dest = e.getDest();
+
+
+            if (source.getData().getLayer() >= dest.getData().getLayer()) {
+                return false;
+            }
+        }
+        int maxLayer = 0;
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            assert n.getData().getLayer() >= 0;
+            if (n.getData().getLayer() > maxLayer) {
+                maxLayer = n.getData().getLayer();
+            }
+        }
+
+        int countPerLayer[] = new int[maxLayer + 1];
+        for (Node<NodeData, EdgeData> n : graph.getNodes()) {
+            countPerLayer[n.getData().getLayer()]++;
+        }
+
+        if (TRACE) {
+            System.out.println("Number of layers: " + maxLayer);
+        }
+        return true;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.hierarchicallayout;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Timing {
+
+    private long lastValue;
+    private long sum;
+    private String name;
+
+    public Timing(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        long val = sum;
+        if (lastValue != 0) {
+            // Timer running
+            long newValue = System.nanoTime();
+            val += (newValue - lastValue);
+        }
+        return "Timing for " + name + " is: " + val / 1000000 + " ms";
+    }
+
+    public void print() {
+        System.out.println(toString());
+    }
+
+    public void start() {
+        lastValue = System.nanoTime();
+    }
+
+    public void stop() {
+        if (lastValue == 0) {
+            throw new IllegalStateException("You must call start before stop");
+        }
+        long newValue = System.nanoTime();
+        sum += newValue - lastValue;
+        lastValue = 0;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.layout" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.layout.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.layout
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/layout/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.layout-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=cb0889d9
+build.xml.script.CRC32=d65fccb9
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=cb0889d9
+nbproject/build-impl.xml.script.CRC32=7f82736d
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages>
+                <package>com.sun.hotspot.igv.layout</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Layout
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Rectangle;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Cluster extends Comparable<Cluster> {
+
+    public Cluster getOuter();
+
+    public void setBounds(Rectangle r);
+
+    public Set<? extends Cluster> getSuccessors();
+
+    public Set<? extends Cluster> getPredecessors();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,202 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class LayoutGraph {
+
+    private Set<? extends Link> links;
+    private SortedSet<Vertex> vertices;
+    private Hashtable<Vertex, Set<Port>> inputPorts;
+    private Hashtable<Vertex, Set<Port>> outputPorts;
+    private Hashtable<Port, Set<Link>> portLinks;
+
+    public LayoutGraph(Set<? extends Link> links) {
+        this(links, new HashSet<Vertex>());
+    }
+
+    public LayoutGraph(Set<? extends Link> links, Set<? extends Vertex> additionalVertices) {
+        this.links = links;
+        assert verify();
+
+        vertices = new TreeSet<Vertex>();
+        portLinks = new Hashtable<Port, Set<Link>>();
+        inputPorts = new Hashtable<Vertex, Set<Port>>();
+        outputPorts = new Hashtable<Vertex, Set<Port>>();
+
+        for (Link l : links) {
+            Port p = l.getFrom();
+            Port p2 = l.getTo();
+            Vertex v1 = p.getVertex();
+            Vertex v2 = p2.getVertex();
+
+            if (!vertices.contains(v1)) {
+
+                outputPorts.put(v1, new HashSet<Port>(1));
+                inputPorts.put(v1, new HashSet<Port>(3));
+                vertices.add(v1);
+                assert vertices.contains(v1);
+            }
+
+            if (!vertices.contains(v2)) {
+                vertices.add(v2);
+                assert vertices.contains(v2);
+                outputPorts.put(v2, new HashSet<Port>(1));
+                inputPorts.put(v2, new HashSet<Port>(3));
+            }
+
+            if (!portLinks.containsKey(p)) {
+                HashSet<Link> hashSet = new HashSet<Link>(3);
+                portLinks.put(p, hashSet);
+            }
+
+            if (!portLinks.containsKey(p2)) {
+                portLinks.put(p2, new HashSet<Link>(3));
+            }
+
+            outputPorts.get(v1).add(p);
+            inputPorts.get(v2).add(p2);
+
+            portLinks.get(p).add(l);
+            portLinks.get(p2).add(l);
+        }
+
+        for (Vertex v : additionalVertices) {
+            if (!vertices.contains(v)) {
+                outputPorts.put(v, new HashSet<Port>(1));
+                inputPorts.put(v, new HashSet<Port>(3));
+                vertices.add(v);
+                vertices.contains(v);
+            }
+        }
+    }
+
+    public Set<Port> getInputPorts(Vertex v) {
+        return this.inputPorts.get(v);
+    }
+
+    public Set<Port> getOutputPorts(Vertex v) {
+        return this.outputPorts.get(v);
+    }
+
+    public Set<Link> getPortLinks(Port p) {
+        return portLinks.get(p);
+    }
+
+    public Set<? extends Link> getLinks() {
+        return links;
+    }
+
+    public boolean verify() {
+        return true;
+    }
+
+    public SortedSet<Vertex> getVertices() {
+        return vertices;
+    }
+
+    private void markNotRoot(Set<Vertex> notRootSet, Vertex v, Vertex startingVertex) {
+
+        if (notRootSet.contains(v)) {
+            return;
+        }
+        if (v != startingVertex) {
+            notRootSet.add(v);
+        }
+        Set<Port> outPorts = getOutputPorts(v);
+        for (Port p : outPorts) {
+            Set<Link> portLinks = getPortLinks(p);
+            for (Link l : portLinks) {
+                Port other = l.getTo();
+                Vertex otherVertex = other.getVertex();
+                if (otherVertex != startingVertex) {
+                    markNotRoot(notRootSet, otherVertex, startingVertex);
+                }
+            }
+        }
+    }
+
+    // Returns a set of vertices with the following properties:
+    // - All Vertices in the set startingRoots are elements of the set.
+    // - When starting a DFS at every vertex in the set, every vertex of the
+    //   whole graph is visited.
+    public Set<Vertex> findRootVertices(Set<Vertex> startingRoots) {
+
+        Set<Vertex> notRootSet = new HashSet<Vertex>();
+        for (Vertex v : startingRoots) {
+            if (!notRootSet.contains(v)) {
+                markNotRoot(notRootSet, v, v);
+            }
+        }
+
+        Set<Vertex> tmpVertices = getVertices();
+        for (Vertex v : tmpVertices) {
+            if (!notRootSet.contains(v)) {
+                if (this.getInputPorts(v).size() == 0) {
+                    markNotRoot(notRootSet, v, v);
+                }
+            }
+        }
+
+        for (Vertex v : tmpVertices) {
+            if (!notRootSet.contains(v)) {
+                markNotRoot(notRootSet, v, v);
+            }
+        }
+
+        Set<Vertex> result = new HashSet<Vertex>();
+        for (Vertex v : tmpVertices) {
+            if (!notRootSet.contains(v)) {
+                result.add(v);
+            }
+        }
+        assert tmpVertices.size() == 0 || result.size() > 0;
+        return result;
+    }
+
+    public Set<Vertex> findRootVertices() {
+        return findRootVertices(new HashSet<Vertex>());
+    }
+
+    public SortedSet<Cluster> getClusters() {
+
+        SortedSet<Cluster> clusters = new TreeSet<Cluster>();
+        for (Vertex v : getVertices()) {
+            if (v.getCluster() != null) {
+                clusters.add(v.getCluster());
+            }
+        }
+
+        return clusters;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface LayoutManager {
+
+    public void doLayout(LayoutGraph graph);
+
+    public void doLayout(LayoutGraph graph, Set<? extends Vertex> firstLayerHint, Set<? extends Vertex> lastLayerHint, Set<? extends Link> importantLinks);
+
+    public void doRouting(LayoutGraph graph);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Point;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Link {
+
+    public Port getFrom();
+
+    public Port getTo();
+
+    public List<Point> getControlPoints();
+
+    public void setControlPoints(List<Point> list);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Port {
+
+    public Vertex getVertex();
+
+    public Point getRelativePosition();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.layout;
+
+import java.awt.Dimension;
+import java.awt.Point;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface Vertex extends Comparable<Vertex> {
+
+    public Cluster getCluster();
+
+    public Dimension getSize();
+
+    public Point getPosition();
+
+    public void setPosition(Point p);
+
+    public boolean isRoot();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.connection" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.connection.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.connection
+OpenIDE-Module-Layer: com/sun/hotspot/igv/connection/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/connection/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.connection-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=f8e21cb6
+build.xml.script.CRC32=a265137e
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=f8e21cb6
+nbproject/build-impl.xml.script.CRC32=36f3138c
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.connection</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.10.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.connection</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.connection.Server
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=NetworkConnection
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,96 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.connection;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.serialization.Parser;
+import com.sun.hotspot.igv.data.Properties.RegexpPropertyMatcher;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Socket;
+import javax.swing.JTextField;
+import org.openide.util.Exceptions;
+import org.openide.xml.XMLUtil;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Client implements Runnable, GroupCallback {
+
+    private Socket socket;
+    private JTextField networkTextField;
+    private GroupCallback callback;
+
+    public Client(Socket socket, JTextField networkTextField, GroupCallback callback) {
+        this.callback = callback;
+        this.socket = socket;
+        this.networkTextField = networkTextField;
+    }
+
+    public void run() {
+
+        try {
+            InputStream inputStream = socket.getInputStream();
+
+            if (networkTextField.isEnabled()) {
+
+                socket.getOutputStream().write('y');
+                InputSource is = new InputSource(inputStream);
+
+                try {
+                    XMLReader reader = XMLUtil.createXMLReader();
+                    Parser parser = new Parser(this);
+                    parser.parse(reader, is, null);
+                } catch (SAXException ex) {
+                    ex.printStackTrace();
+                }
+            } else {
+                socket.getOutputStream().write('n');
+            }
+
+            socket.close();
+        } catch (IOException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+    }
+
+    public void started(final Group g) {
+        try {
+            RegexpPropertyMatcher matcher = new RegexpPropertyMatcher("name", ".*" + networkTextField.getText() + ".*");
+            if (g.getProperties().selectSingle(matcher) != null && networkTextField.isEnabled()) {
+                socket.getOutputStream().write('y');
+                callback.started(g);
+            } else {
+                socket.getOutputStream().write('n');
+            }
+        } catch (IOException e) {
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,145 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.connection;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupCallback;
+import com.sun.hotspot.igv.data.services.GroupReceiver;
+import com.sun.hotspot.igv.settings.Settings;
+import java.awt.Component;
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.prefs.PreferenceChangeEvent;
+import java.util.prefs.PreferenceChangeListener;
+import javax.swing.SwingUtilities;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.util.RequestProcessor;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Server implements GroupCallback, GroupReceiver, PreferenceChangeListener {
+
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JCheckBox networkCheckBox;
+    private javax.swing.JTextField networkTextField;
+    private ServerSocket serverSocket;
+    private GroupCallback callback;
+    private int port;
+    private Runnable serverRunnable;
+
+    public Component init(GroupCallback callback) {
+
+        this.callback = callback;
+
+        jPanel1 = new javax.swing.JPanel();
+        networkTextField = new javax.swing.JTextField();
+        networkCheckBox = new javax.swing.JCheckBox();
+
+
+        jPanel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
+        jPanel1.setLayout(new java.awt.BorderLayout(10, 10));
+        jPanel1.add(networkTextField, java.awt.BorderLayout.CENTER);
+
+        networkCheckBox.setSelected(true);
+        org.openide.awt.Mnemonics.setLocalizedText(networkCheckBox, "Receive when name contains");
+        networkCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+        networkCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
+        networkCheckBox.addChangeListener(new javax.swing.event.ChangeListener() {
+
+            public void stateChanged(javax.swing.event.ChangeEvent evt) {
+                networkCheckBoxChanged(evt);
+            }
+        });
+        jPanel1.add(networkCheckBox, java.awt.BorderLayout.WEST);
+        networkCheckBox.getAccessibleContext().setAccessibleName("Read from network when name contains");
+
+        initializeNetwork();
+        Settings.get().addPreferenceChangeListener(this);
+        return jPanel1;
+    }
+
+    private void networkCheckBoxChanged(javax.swing.event.ChangeEvent evt) {
+        networkTextField.setEnabled(networkCheckBox.isSelected());
+    }
+
+    public void preferenceChange(PreferenceChangeEvent e) {
+
+        int curPort = Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT));
+        if (curPort != port) {
+            initializeNetwork();
+        }
+    }
+
+    private void initializeNetwork() {
+
+        int curPort = Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT));
+        this.port = curPort;
+        try {
+            serverSocket = new java.net.ServerSocket(curPort);
+        } catch (IOException ex) {
+            NotifyDescriptor message = new NotifyDescriptor.Message("Could not create server. Listening for incoming data is disabled.", NotifyDescriptor.ERROR_MESSAGE);
+            DialogDisplayer.getDefault().notifyLater(message);
+            return;
+        }
+
+        Runnable runnable = new Runnable() {
+
+            public void run() {
+                while (true) {
+                    try {
+                        Socket clientSocket = serverSocket.accept();
+                        if (serverRunnable != this) {
+                            clientSocket.close();
+                            return;
+                        }
+                        RequestProcessor.getDefault().post(new Client(clientSocket, networkTextField, Server.this), 0, Thread.MAX_PRIORITY);
+                    } catch (IOException ex) {
+                        serverSocket = null;
+                        NotifyDescriptor message = new NotifyDescriptor.Message("Error during listening for incoming connections. Listening for incoming data is disabled.", NotifyDescriptor.ERROR_MESSAGE);
+                        DialogDisplayer.getDefault().notifyLater(message);
+                        return;
+                    }
+                }
+            }
+        };
+
+        serverRunnable = runnable;
+
+        RequestProcessor.getDefault().post(runnable, 0, Thread.MAX_PRIORITY);
+    }
+
+    public void started(final Group g) {
+        SwingUtilities.invokeLater(new Runnable() {
+
+            public void run() {
+                callback.started(g);
+            }
+        });
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/README	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,45 @@
+The Ideal Graph Visualizer is a tool developed to help examine the
+intermediate representation of C2 which is commonly referred to as the
+"ideal graph".  It was developed in collaboration with the University
+of Linz in Austria and has been included as part of hotspot since that
+was the primary target of the tool.  The tool itself is fairly general
+with only a few modules that contain C2 specific elements.
+
+The tool is built on top of the NetBeans 6.0 rich client
+infrastructure and so requires NetBeans to build.  It currently
+requires Java 6 to run as it needs support for JavaScript for its
+filtering mechanism and assumes it's built into the platform.  It
+should build out of the box whit NetBeans 6 and Java 6 or later.  It's
+possible to run it on 1.5 by including Rhino on the classpath though
+that currently isn't working correctly.  Support for exporting graphs
+as SVG can be enabled by adding batik to the classpath which isn't
+included by default.
+
+It can be built on top of NetBeans 6.1 if you change the required
+modules to be platform8 instead of platform7.  The tool could run on
+JDK 1.5 with some reworking of the how the JavaScript support is
+enabled but currently it requires some tweaking of the setup.  This
+will be fixed in a later setup.
+
+The JVM support is controlled by the flag -XX:PrintIdealGraphLevel=#
+where # is:
+
+  0: no output, the default
+  1: dumps graph after parsing, before matching, and final code.
+     also dumps graph for failed compiles, if available
+  2: more detail, including after loop opts
+  3: even more detail
+  4: prints graph after parsing every bytecode (very slow)
+
+By default the JVM expects that it will connect to a visualizer on the
+local host on port 4444.  This can be configured using the options
+-XX:PrintIdealGraphAddress= and -XX:PrintIdealGraphPort=.
+PrintIdealGraphAddress can actually be a hostname.
+
+Alternatively the output can be sent to a file using
+-XX:PrintIdealGraphFile=filename.  Each compiler thread will get it's
+own file with unique names being generated by adding a number onto the
+provided file name.
+
+More information about the tool is available at
+http://wikis.sun.com/display/HotSpotInternals/IdealGraphVisualizer.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.rhino" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.rhino.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.rhino
+OpenIDE-Module-Layer: com/sun/hotspot/igv/rhino/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/rhino/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.rhino-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=0c3e7912
+build.xml.script.CRC32=44d0050c
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=0c3e7912
+nbproject/build-impl.xml.script.CRC32=7aab3f52
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.rhino</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.rhino</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.rhino.RhinoScriptEngine
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=RhinoScriptEngineProxy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.rhino;
+
+import com.sun.hotspot.igv.filter.ScriptEngineAbstraction;
+import com.sun.hotspot.igv.graph.Diagram;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RhinoScriptEngine implements ScriptEngineAbstraction {
+
+    private String jsHelperText;
+    private Constructor importer;
+    private Method scope_put;
+    private Method cx_evaluateString;
+    private Method context_enter;
+    private Method context_exit;
+
+    public boolean initialize(String s) {
+        this.jsHelperText = s;
+        Class importerTopLevel = null;
+        try {
+            ClassLoader cl = RhinoScriptEngine.class.getClassLoader();
+            Class context = cl.loadClass("org.mozilla.javascript.Context");
+            Class scriptable = cl.loadClass("org.mozilla.javascript.Scriptable");
+            importerTopLevel = cl.loadClass("org.mozilla.javascript.ImporterTopLevel");
+            importer = importerTopLevel.getDeclaredConstructor(context);
+            scope_put = importerTopLevel.getMethod("put", new Class[]{String.class, scriptable, Object.class});
+            cx_evaluateString = context.getDeclaredMethod("evaluateString", new Class[]{scriptable, String.class, String.class, Integer.TYPE, Object.class});
+            context_enter = context.getDeclaredMethod("enter", new Class[0]);
+            context_exit = context.getDeclaredMethod("exit", new Class[0]);
+            return true;
+        } catch (NoSuchMethodException nsme) {
+            return false;
+        } catch (ClassNotFoundException cnfe) {
+            return false;
+        }
+    }
+
+    public void execute(Diagram d, String code) {
+        try {
+            Object cx = context_enter.invoke(null, (Object[]) null);
+            try {
+                Object scope = importer.newInstance(cx);
+                scope_put.invoke(scope, "IO", scope, System.out);
+                scope_put.invoke(scope, "graph", scope, d);
+                cx_evaluateString.invoke(cx, scope, jsHelperText, "jsHelper.js", 1, null);
+                cx_evaluateString.invoke(cx, scope, code, "<cmd>", 1, null);
+            } finally {
+                // Exit from the context.
+                context_exit.invoke(null, (Object[]) null);
+            }
+        } catch (InvocationTargetException iae) {
+        } catch (IllegalAccessException iae) {
+        } catch (InstantiationException iae) {
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.servercompilerscheduler" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.servercompilerscheduler.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.servercompiler
+OpenIDE-Module-Layer: com/sun/hotspot/igv/servercompiler/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/servercompiler/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.servercompilerscheduler-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=d1360a65
+build.xml.script.CRC32=a9d94ef8
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=d1360a65
+nbproject/build-impl.xml.script.CRC32=52847236
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.servercompiler</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages/>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.servercompiler.JavaGroupOrganizer
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.servercompiler.ServerCompilerScheduler
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=ServerCompiler
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,200 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.servercompiler;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.services.GroupOrganizer;
+import com.sun.hotspot.igv.data.Pair;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class JavaGroupOrganizer implements GroupOrganizer {
+
+    public String getName() {
+        return "Java structure";
+    }
+
+    public List<Pair<String, List<Group>>> organize(List<String> subFolders, List<Group> groups) {
+
+        List<Pair<String, List<Group>>> result = new ArrayList<Pair<String, List<Group>>>();
+
+        if (subFolders.size() == 0) {
+            buildResult(result, groups, packageNameProvider);
+        } else if (subFolders.size() == 1) {
+            buildResult(result, groups, classNameProvider);
+        } else if (subFolders.size() == 2) {
+            for (Group g : groups) {
+                List<Group> children = new ArrayList<Group>();
+                children.add(g);
+                Pair<String, List<Group>> p = new Pair<String, List<Group>>();
+                p.setLeft(reducedNameProvider.getName(g));
+                p.setRight(children);
+                result.add(p);
+            }
+        } else {
+            result.add(new Pair<String, List<Group>>("", groups));
+        }
+
+        return result;
+    }
+
+    private void buildResult(List<Pair<String, List<Group>>> result, List<Group> groups, NameProvider provider) {
+        HashMap<String, List<Group>> map = new HashMap<String, List<Group>>();
+        for (Group g : groups) {
+            String s = provider.getName(g);
+
+            if (!map.containsKey(s)) {
+                List<Group> list = new ArrayList<Group>();
+                Pair<String, List<Group>> pair = new Pair<String, List<Group>>(s, list);
+                result.add(pair);
+                map.put(s, list);
+            }
+
+            List<Group> curList = map.get(s);
+            curList.add(g);
+        }
+
+        Collections.sort(result, new Comparator<Pair<String, List<Group>>>() {
+
+            public int compare(Pair<String, List<Group>> a, Pair<String, List<Group>> b) {
+                return a.getLeft().compareTo(b.getLeft());
+            }
+        });
+    }
+
+    private static interface NameProvider {
+
+        public String getName(Group g);
+    }
+    private NameProvider reducedNameProvider = new NameProvider() {
+
+        public String getName(Group g) {
+            String name = g.getName();
+            assert name != null : "name of group must be set!";
+            final String noReducedName = name;
+
+            int firstPoint = name.indexOf(".");
+            if (firstPoint == -1) {
+                return noReducedName;
+            }
+
+            int firstParenthese = name.indexOf("(");
+            if (firstParenthese == -1 || firstParenthese < firstPoint) {
+                return noReducedName;
+            }
+
+            int current = firstPoint;
+            while (current > 0 && name.charAt(current) != ' ') {
+                current--;
+            }
+
+            String tmp = name.substring(0, firstParenthese);
+            int lastPoint = tmp.lastIndexOf(".");
+            if (lastPoint == -1) {
+                return noReducedName;
+            }
+
+            name = name.substring(0, current + 1) + name.substring(lastPoint + 1);
+            return name;
+        }
+    };
+    private NameProvider packageNameProvider = new NameProvider() {
+
+        public String getName(Group g) {
+            String name = g.getName();
+            assert name != null : "name of group must be set!";
+            final String noPackage = "<default>";
+
+            int firstPoint = name.indexOf(".");
+            if (firstPoint == -1) {
+                return noPackage;
+            }
+
+            int firstParenthese = name.indexOf("(");
+            if (firstParenthese == -1 || firstParenthese < firstPoint) {
+                return noPackage;
+            }
+
+            int current = firstPoint;
+            while (current > 0 && name.charAt(current) != ' ') {
+                current--;
+            }
+
+            String fullClassName = name.substring(current + 1, firstParenthese);
+            int lastPoint = fullClassName.lastIndexOf(".");
+            if (lastPoint == -1) {
+                return noPackage;
+            }
+            lastPoint = fullClassName.lastIndexOf(".", lastPoint - 1);
+            if (lastPoint == -1) {
+                return noPackage;
+            }
+
+            String packageName = fullClassName.substring(0, lastPoint);
+            return packageName;
+        }
+    };
+    private NameProvider classNameProvider = new NameProvider() {
+
+        public String getName(Group g) {
+            String name = g.getName();
+            assert name != null : "name of group must be set!";
+
+            final String noClass = "<noclass>";
+
+            int firstPoint = name.indexOf(".");
+            if (firstPoint == -1) {
+                return noClass;
+            }
+
+            int firstParenthese = name.indexOf("(");
+            if (firstParenthese == -1 || firstParenthese < firstPoint) {
+                return noClass;
+            }
+
+            int current = firstPoint;
+            while (current > 0 && name.charAt(current) != ' ') {
+                current--;
+            }
+
+            String fullClassName = name.substring(current + 1, firstParenthese);
+            int lastPoint = fullClassName.lastIndexOf(".");
+            if (lastPoint == -1) {
+                return noClass;
+            }
+            int lastlastPoint = fullClassName.lastIndexOf(".", lastPoint - 1);
+
+            String className = fullClassName.substring(lastlastPoint + 1, lastPoint);
+            return className;
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,597 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.servercompiler;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputEdge;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.data.services.Scheduler;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.Vector;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ServerCompilerScheduler implements Scheduler {
+
+    private static class Node {
+
+        public InputNode inputNode;
+        public Set<Node> succs = new HashSet<Node>();
+        public List<Node> preds = new ArrayList<Node>();
+        public InputBlock block;
+        public boolean isBlockProjection;
+        public boolean isBlockStart;
+    }
+    private InputGraph graph;
+    private Collection<Node> nodes;
+    private Map<InputNode, Node> inputNodeToNode;
+    private Vector<InputBlock> blocks;
+    private Map<InputBlock, InputBlock> dominatorMap;
+    private Map<InputBlock, Integer> blockIndex;
+    private InputBlock[][] commonDominator;
+    private static final Comparator<InputEdge> edgeComparator = new Comparator<InputEdge>() {
+
+        public int compare(InputEdge o1, InputEdge o2) {
+            return o1.getToIndex() - o2.getToIndex();
+        }
+    };
+
+    public void buildBlocks() {
+
+        blocks = new Vector<InputBlock>();
+        Node root = findRoot();
+        if (root == null) {
+            return;
+        }
+        Stack<Node> stack = new Stack<Node>();
+        Set<Node> visited = new HashSet<Node>();
+        stack.add(root);
+        int blockCount = 0;
+        InputBlock rootBlock = null;
+
+
+        while (!stack.isEmpty()) {
+            Node proj = stack.pop();
+            Node parent = proj;
+            if (proj.isBlockProjection && proj.preds.size() > 0) {
+                parent = proj.preds.get(0);
+            }
+
+            if (!visited.contains(parent)) {
+                visited.add(parent);
+                InputBlock block = new InputBlock(graph, "" + blockCount);
+                blocks.add(block);
+                if (parent == root) {
+                    rootBlock = block;
+                }
+                blockCount++;
+                parent.block = block;
+                if (proj != parent && proj.succs.size() == 1 && proj.succs.contains(root)) {
+                    // Special treatment of Halt-nodes
+                    proj.block = block;
+                }
+
+                Node p = proj;
+                do {
+                    if (p.preds.size() == 0 || p.preds.get(0) == null) {
+                        p = parent;
+                        break;
+                    }
+                    p = p.preds.get(0);
+
+                    if (p.block == null) {
+                        p.block = block;
+                    }
+                } while (!p.isBlockProjection && !p.isBlockStart);
+
+                if (block != rootBlock) {
+                    for (Node n : p.preds) {
+                        if (n != null && n != p) {
+                            if (n.isBlockProjection) {
+                                n = n.preds.get(0);
+                            }
+                            if (n.block != null) {
+                                n.block.addSuccessor(block);
+                            }
+                        }
+                    }
+                }
+
+                for (Node n : parent.succs) {
+                    if (n != root && n.isBlockProjection) {
+                        for (Node n2 : n.succs) {
+
+                            if (n2 != parent && n2.block != null && n2.block != rootBlock) {
+                                block.addSuccessor(n2.block);
+                            }
+                        }
+                    } else {
+                        if (n != parent && n.block != null && n.block != rootBlock) {
+                            block.addSuccessor(n.block);
+                        }
+                    }
+                }
+
+                int num_preds = p.preds.size();
+                int bottom = -1;
+                if (isRegion(p) || isPhi(p)) {
+                    bottom = 0;
+                }
+
+                int pushed = 0;
+                for (int i = num_preds - 1; i > bottom; i--) {
+                    if (p.preds.get(i) != null && p.preds.get(i) != p) {
+                        stack.push(p.preds.get(i));
+                        pushed++;
+                    }
+                }
+
+                if (pushed == 0 && p == root) {
+                // TODO: special handling when root backedges are not built yet
+                }
+            }
+        }
+
+        for (Node n : nodes) {
+            InputBlock block = n.block;
+            if (block != null) {
+                block.addNode(n.inputNode.getId());
+            }
+        }
+
+        int z = 0;
+        blockIndex = new HashMap<InputBlock, Integer>();
+        for (InputBlock b : blocks) {
+            blockIndex.put(b, z);
+            z++;
+        }
+    }
+
+    private String getBlockName(InputNode n) {
+        return n.getProperties().get("block");
+    }
+
+    public Collection<InputBlock> schedule(InputGraph graph) {
+        if (graph.getBlocks().size() > 0) {
+            Collection<InputNode> tmpNodes = new ArrayList<InputNode>(graph.getNodes());
+            for (InputNode n : tmpNodes) {
+                String block = getBlockName(n);
+                if (graph.getBlock(n) == null) {
+                    graph.getBlock(block).addNode(n);
+                    assert graph.getBlock(n) != null;
+                }
+            }
+            return graph.getBlocks();
+        } else {
+            nodes = new ArrayList<Node>();
+            inputNodeToNode = new HashMap<InputNode, Node>();
+
+            this.graph = graph;
+            buildUpGraph();
+            buildBlocks();
+            buildDominators();
+            buildCommonDominators();
+            scheduleLatest();
+
+            for (InputNode n : graph.getNodes()) {
+                assert graph.getBlock(n) != null;
+            }
+
+            return blocks;
+        }
+    }
+
+    public void scheduleLatest() {
+
+
+        Node root = findRoot();
+
+        // Mark all nodes reachable in backward traversal from root
+        Set<Node> reachable = new HashSet<Node>();
+        reachable.add(root);
+        Stack<Node> stack = new Stack<Node>();
+        stack.push(root);
+        while (!stack.isEmpty()) {
+            Node cur = stack.pop();
+            for (Node n : cur.preds) {
+                if (!reachable.contains(n)) {
+                    reachable.add(n);
+                    stack.push(n);
+                }
+            }
+        }
+
+        Set<Node> unscheduled = new HashSet<Node>();
+        for (Node n : this.nodes) {
+            if (n.block == null && reachable.contains(n)) {
+                unscheduled.add(n);
+            }
+        }
+
+        while (unscheduled.size() > 0) {
+            boolean progress = false;
+
+            Set<Node> newUnscheduled = new HashSet<Node>();
+            for (Node n : unscheduled) {
+
+                InputBlock block = null;
+                if (this.isPhi(n) && n.preds.get(0) != null) {
+                    // Phi nodes in same block as region nodes
+                    block = n.preds.get(0).block;
+                } else {
+                    for (Node s : n.succs) {
+                        if (reachable.contains(s)) {
+                            if (s.block == null) {
+                                block = null;
+                                break;
+                            } else {
+                                if (block == null) {
+                                    block = s.block;
+                                } else {
+                                    block = commonDominator[this.blockIndex.get(block)][blockIndex.get(s.block)];
+                                }
+                            }
+                        }
+                    }
+                }
+
+                if (block != null) {
+                    n.block = block;
+                    block.addNode(n.inputNode.getId());
+                    progress = true;
+                } else {
+                    newUnscheduled.add(n);
+                }
+            }
+
+            unscheduled = newUnscheduled;
+
+            if (!progress) {
+                break;
+            }
+        }
+
+        Set<Node> curReachable = new HashSet<Node>(reachable);
+        for (Node n : curReachable) {
+            if (n.block != null) {
+                for (Node s : n.succs) {
+                    if (!reachable.contains(s)) {
+                        markWithBlock(s, n.block, reachable);
+                    }
+                }
+            }
+        }
+
+    }
+
+    private void markWithBlock(Node n, InputBlock b, Set<Node> reachable) {
+        assert !reachable.contains(n);
+        Stack<Node> stack = new Stack<Node>();
+        stack.push(n);
+        n.block = b;
+        b.addNode(n.inputNode.getId());
+        reachable.add(n);
+
+        while (!stack.isEmpty()) {
+            Node cur = stack.pop();
+            for (Node s : cur.succs) {
+                if (!reachable.contains(s)) {
+                    reachable.add(s);
+                    s.block = b;
+                    b.addNode(s.inputNode.getId());
+                    stack.push(s);
+                }
+            }
+
+            for (Node s : cur.preds) {
+                if (!reachable.contains(s)) {
+                    reachable.add(s);
+                    s.block = b;
+                    b.addNode(s.inputNode.getId());
+                    stack.push(s);
+                }
+            }
+        }
+    }
+
+    private class BlockIntermediate {
+
+        InputBlock block;
+        int index;
+        int dominator;
+        int semi;
+        int parent;
+        int label;
+        int ancestor;
+        List<Integer> pred;
+        List<Integer> bucket;
+    }
+
+    public void buildCommonDominators() {
+        commonDominator = new InputBlock[this.blocks.size()][this.blocks.size()];
+        for (int i = 0; i < blocks.size(); i++) {
+            for (int j = 0; j < blocks.size(); j++) {
+                commonDominator[i][j] = getCommonDominator(i, j);
+            }
+        }
+    }
+
+    public InputBlock getCommonDominator(int a, int b) {
+        InputBlock ba = blocks.get(a);
+        InputBlock bb = blocks.get(b);
+        if (ba == bb) {
+            return ba;
+        }
+        Set<InputBlock> visited = new HashSet<InputBlock>();
+        while (ba != null) {
+            visited.add(ba);
+            ba = dominatorMap.get(ba);
+        }
+
+        while (bb != null) {
+            if (visited.contains(bb)) {
+                return bb;
+            }
+            bb = dominatorMap.get(bb);
+        }
+
+        assert false;
+        return null;
+    }
+
+    public void buildDominators() {
+        dominatorMap = new HashMap<InputBlock, InputBlock>();
+        if (blocks.size() == 0) {
+            return;
+        }
+        Vector<BlockIntermediate> intermediate = new Vector<BlockIntermediate>();
+        Map<InputBlock, BlockIntermediate> map = new HashMap<InputBlock, BlockIntermediate>();
+        int z = 0;
+        for (InputBlock b : blocks) {
+            BlockIntermediate bi = new BlockIntermediate();
+            bi.block = b;
+            bi.index = z;
+            bi.dominator = -1;
+            bi.semi = -1;
+            bi.parent = -1;
+            bi.label = z;
+            bi.ancestor = -1;
+            bi.pred = new ArrayList<Integer>();
+            bi.bucket = new ArrayList<Integer>();
+            intermediate.add(bi);
+            map.put(b, bi);
+            z++;
+        }
+        Stack<Integer> stack = new Stack<Integer>();
+        stack.add(0);
+
+        Vector<BlockIntermediate> array = new Vector<BlockIntermediate>();
+        intermediate.get(0).dominator = 0;
+
+        int n = 0;
+        while (!stack.isEmpty()) {
+            int index = stack.pop();
+            BlockIntermediate ib = intermediate.get(index);
+            ib.semi = n;
+            array.add(ib);
+            n = n + 1;
+            for (InputBlock b : ib.block.getSuccessors()) {
+                BlockIntermediate succ = map.get(b);
+                if (succ.semi == -1) {
+                    succ.parent = index;
+                    stack.push(succ.index); // TODO: check if same node could be pushed twice
+                }
+                succ.pred.add(index);
+            }
+        }
+
+        for (int i = n - 1; i > 0; i--) {
+            BlockIntermediate block = array.get(i);
+            int block_index = block.index;
+            for (int predIndex : block.pred) {
+                int curIndex = eval(predIndex, intermediate);
+                BlockIntermediate curBlock = intermediate.get(curIndex);
+                if (curBlock.semi < block.semi) {
+                    block.semi = curBlock.semi;
+                }
+            }
+
+
+            int semiIndex = block.semi;
+            BlockIntermediate semiBlock = array.get(semiIndex);
+            semiBlock.bucket.add(block_index);
+
+            link(block.parent, block_index, intermediate);
+            BlockIntermediate parentBlock = intermediate.get(block.parent);
+
+            for (int j = 0; j < parentBlock.bucket.size(); j++) {
+                for (int curIndex : parentBlock.bucket) {
+                    int newIndex = eval(curIndex, intermediate);
+                    BlockIntermediate curBlock = intermediate.get(curIndex);
+                    BlockIntermediate newBlock = intermediate.get(newIndex);
+                    int dom = block.parent;
+                    if (newBlock.semi < curBlock.semi) {
+                        dom = newIndex;
+                    }
+
+                    curBlock.dominator = dom;
+                }
+            }
+
+
+            parentBlock.bucket.clear();
+        }
+
+        for (int i = 1; i < n; i++) {
+
+            BlockIntermediate block = array.get(i);
+            int block_index = block.index;
+
+            int semi_index = block.semi;
+            BlockIntermediate semi_block = array.get(semi_index);
+
+            if (block.dominator != semi_block.index) {
+                int new_dom = intermediate.get(block.dominator).dominator;
+                block.dominator = new_dom;
+            }
+        }
+
+        for (BlockIntermediate ib : intermediate) {
+            if (ib.dominator == -1) {
+                ib.dominator = 0;
+            }
+        }
+
+        for (BlockIntermediate bi : intermediate) {
+            InputBlock b = bi.block;
+            int dominator = bi.dominator;
+            InputBlock dominatorBlock = null;
+            if (dominator != -1) {
+                dominatorBlock = intermediate.get(dominator).block;
+            }
+
+            if (dominatorBlock == b) {
+                dominatorBlock = null;
+            }
+            this.dominatorMap.put(b, dominatorBlock);
+        }
+    }
+
+    private void compress(int index, Vector<BlockIntermediate> blocks) {
+        BlockIntermediate block = blocks.get(index);
+
+        int ancestor = block.ancestor;
+        assert ancestor != -1;
+
+        BlockIntermediate ancestor_block = blocks.get(ancestor);
+        if (ancestor_block.ancestor != -1) {
+            compress(ancestor, blocks);
+
+            int label = block.label;
+            BlockIntermediate label_block = blocks.get(label);
+
+            int ancestor_label = ancestor_block.label;
+            BlockIntermediate ancestor_label_block = blocks.get(label);
+            if (ancestor_label_block.semi < label_block.semi) {
+                block.label = ancestor_label;
+            }
+
+            block.ancestor = ancestor_block.ancestor;
+        }
+    }
+
+    private int eval(int index, Vector<BlockIntermediate> blocks) {
+        BlockIntermediate block = blocks.get(index);
+        if (block.ancestor == -1) {
+            return index;
+        } else {
+            compress(index, blocks);
+            return block.label;
+        }
+    }
+
+    private void link(int index1, int index2, Vector<BlockIntermediate> blocks) {
+        BlockIntermediate block2 = blocks.get(index2);
+        block2.ancestor = index1;
+    }
+
+    private boolean isRegion(Node n) {
+        return n.inputNode.getProperties().get("name").equals("Region");
+    }
+
+    private boolean isPhi(Node n) {
+        return n.inputNode.getProperties().get("name").equals("Phi");
+    }
+
+    private Node findRoot() {
+
+        for (Node n : nodes) {
+            InputNode inputNode = n.inputNode;
+            if (inputNode.getProperties().get("name").equals("Root")) {
+                return n;
+            }
+        }
+
+        return null;
+    }
+
+    public void buildUpGraph() {
+
+        for (InputNode n : graph.getNodes()) {
+            Node node = new Node();
+            node.inputNode = n;
+            nodes.add(node);
+            String p = n.getProperties().get("is_block_proj");
+            node.isBlockProjection = (p != null && p.equals("true"));
+            p = n.getProperties().get("is_block_start");
+            node.isBlockStart = (p != null && p.equals("true"));
+            inputNodeToNode.put(n, node);
+        }
+
+        Map<Integer, List<InputEdge>> edgeMap = new HashMap<Integer, List<InputEdge>>();
+        for (InputEdge e : graph.getEdges()) {
+
+            int to = e.getTo();
+            if (!edgeMap.containsKey(to)) {
+                edgeMap.put(to, new ArrayList<InputEdge>());
+            }
+
+
+            List<InputEdge> list = edgeMap.get(to);
+            list.add(e);
+        }
+
+
+        for (Integer i : edgeMap.keySet()) {
+
+            List<InputEdge> list = edgeMap.get(i);
+            Collections.sort(list, edgeComparator);
+
+            int to = i;
+            InputNode toInputNode = graph.getNode(to);
+            Node toNode = inputNodeToNode.get(toInputNode);
+            for (InputEdge e : list) {
+                assert to == e.getTo();
+                int from = e.getFrom();
+                InputNode fromInputNode = graph.getNode(from);
+                Node fromNode = inputNodeToNode.get(fromInputNode);
+                fromNode.succs.add(toNode);
+                toNode.preds.add(fromNode);
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+colorize("name", ".*", yellow);
+colorize("name", "Catch.*", blue);
+
+colorize("name", "Region|Loop|CountedLoop|Root", red);
+colorize("name", "CProj|IfFalse|IfTrue|JProj|CatchProj", magenta);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,4 @@
+var f = new CombineFilter("Combine Filter");
+f.addRule(new CombineFilter.CombineRule(new Properties.RegexpPropertyMatcher("name", ".*"), new Properties.RegexpPropertyMatcher("name", "Proj|IfFalse|IfTrue|JProj|MachProj|JumpProj|CatchProj")));
+f.addRule(new CombineFilter.CombineRule(new Properties.RegexpPropertyMatcher("name", "Cmp.*"), new Properties.RegexpPropertyMatcher("name", "Bool")));
+f.apply(graph);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,4 @@
+colorize("state", "same", white);
+colorize("state", "changed", orange);
+colorize("state", "new", green);
+colorize("state", "deleted", red);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,3 @@
+colorize("name", "Con.*", orange);
+colorize("name", "Parm|Proj", lightGray);
+colorize("bci", "..*", magenta);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+var f = new ColorFilter("Line Style filter");
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "int:")), null, Color.BLUE, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "control")), null, Color.RED, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "memory")), null, Color.GREEN, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "tuple:")), null, Color.MAGENTA, null));
+f.addRule(new ColorFilter.ColorRule(new MatcherSelector(new Properties.StringPropertyMatcher("type", "bottom")), null, Color.LIGHT_GRAY, null));
+f.apply(graph);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,3 @@
+colorize("is_dontcare", "false", white);
+colorize("is_shared", "true", green);
+colorize("is_dontcare", "true", red);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,24 @@
+var f = new RemoveFilter("Show only control flow");
+f.addRule(
+  new RemoveFilter.RemoveRule(
+    new InvertSelector(
+      new OrSelector(
+        new OrSelector(
+          new SuccessorSelector(
+            new MatcherSelector(
+              new Properties.StringPropertyMatcher("type", "control")
+            )
+          ),
+	  new MatcherSelector(
+            new Properties.StringPropertyMatcher("type", "control")
+          )
+        ),
+	new MatcherSelector(
+          new Properties.StringPropertyMatcher("name", "Start")
+        )
+      )
+    ), false
+  )
+);
+f.addRule( new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.RegexpPropertyMatcher("name", "Phi|Store.")), false));
+f.apply(graph);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,4 @@
+colorize("reg", "EAX", green);
+colorize("reg", "EFLAGS", gray);
+colorize("reg", "EBP", orange);
+colorize("reg", "ECX", cyan);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+remove("dump_spec", "FramePtr|ReturnAdr|I_O"); 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+
+//var f = new RemoveFilter("Remove Memory");
+//f.addRule(new RemoveFilter.RemoveRule(new MatcherSelector(new Properties.StringPropertyMatcher("dump_spec", "Memory")), false));
+//f.addRule(new RemoveFilter.RemoveRule(new AndSelector(new MatcherSelector(new Properties.StringPropertyMatcher("name", "Proj")), new MatcherSelector(new Properties.StringPropertyMatcher("type", "memory"))), false));
+//f.apply(graph);
+
+remove("dump_spec", "Memory");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+removeInputs("name", "Root");
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,4 @@
+removeInputs("name", "SafePoint|CallStaticJava|CallDynamicJava|CallJava|CallLeaf|CallRuntime|AbstractLock|CallLeafNoFP|Call|CallStaticJavaDirect", 5);
+removeInputs("name", "Unlock|Lock", 7);
+removeInputs("name", "Allocate", 7);
+removeInputs("name", "AllocateArray", 9);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+var f = new RemoveSelfLoopsFilter("Remove Self-Loops");
+f.apply(graph);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+split("name", "BoxLock");
+split("name", "(Con.*)|(loadCon.*)");
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+      <folder name="Filters">
+        <file name="Basic Coloring" url="filters/color.filter">
+            <attr name="enabled" boolvalue="true"/>
+        </file>
+        <file name="Matcher Flags Coloring" url="filters/matchingFlags.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Basic Coloring"/>
+        </file>
+        <file name="Register Coloring" url="filters/register.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Matcher Flags Coloring"/>
+        </file>
+        <file name="Extended Coloring" url="filters/extendedColor.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Register Coloring"/>
+        </file>
+        <file name="Line Coloring" url="filters/linestyle.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Extended Coloring"/>
+        </file>
+        <file name="Difference Coloring" url="filters/difference.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Line Coloring"/>
+        </file>
+        <file name="Only Control Flow" url="filters/onlyControlFlow.filter">
+            <attr name="enabled" boolvalue="false"/>
+            <attr name="after" stringvalue="Difference Coloring"/>
+        </file>
+        <file name="Remove FramePtr, I_O and Return Address" url="filters/remove.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Only Control Flow"/>
+        </file>
+        <file name="Remove Memory" url="filters/removeMemory.filter">
+            <attr name="enabled" boolvalue="false"/>
+            <attr name="after" stringvalue="Remove FramePtr, I_O and Return Address"/>
+        </file>
+        <file name="Remove Root Inputs" url="filters/removeRootInputs.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Remove Memory"/>
+        </file>
+        <file name="Remove Safepoint Inputs" url="filters/removeSafepointInputs.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Remove Root Inputs"/>
+        </file>
+        <file name="Remove Self Loops" url="filters/removeSelfLoops.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Remove Safepoint Inputs"/>
+        </file>
+        <file name="Combine" url="filters/combine.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Remove Self Loops"/>
+        </file>
+        <file name="Split" url="filters/split.filter">
+            <attr name="enabled" boolvalue="true"/>
+            <attr name="after" stringvalue="Combine"/>
+        </file>
+    </folder>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.settings" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.settings.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.settings
+OpenIDE-Module-Layer: com/sun/hotspot/igv/settings/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/settings/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.settings-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=8869440a
+build.xml.script.CRC32=7ef09117
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=8869440a
+nbproject/build-impl.xml.script.CRC32=1a0e7f21
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>org.jdesktop.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.4</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.options.api</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.5</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.settings</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+AdvancedOption_DisplayName_Settings=Settings
+AdvancedOption_Tooltip_Settings=Application Settings
+OpenIDE-Module-Name=Settings
+OptionsCategory_Name_View=General
+OptionsCategory_Title_View=View Settings
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.settings;
+
+import java.util.prefs.Preferences;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class Settings {
+
+    public final static String NODE_TEXT = "nodeText";
+    public final static String NODE_TEXT_DEFAULT = "[idx] [name]";
+    public final static String NODE_WIDTH = "nodeWidth";
+    public final static String NODE_WIDTH_DEFAULT = "100";
+    public final static String PORT = "port";
+    public final static String PORT_DEFAULT = "4444";
+    public final static String DIRECTORY = "directory";
+    public final static String DIRECTORY_DEFAULT = System.getProperty("user.dir");
+
+    public static Preferences get() {
+        return Preferences.userNodeForPackage(Settings.class);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import org.netbeans.spi.options.OptionsCategory;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ViewOptionsCategory extends OptionsCategory {
+
+    @Override
+    public Icon getIcon() {
+        return new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/settings/settings.gif"));
+    }
+
+    public String getCategoryName() {
+        return NbBundle.getMessage(ViewOptionsCategory.class, "OptionsCategory_Name_View");
+    }
+
+    public String getTitle() {
+        return NbBundle.getMessage(ViewOptionsCategory.class, "OptionsCategory_Title_View");
+    }
+
+    public OptionsPanelController create() {
+        return new ViewOptionsPanelController();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import javax.swing.JComponent;
+import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ViewOptionsPanelController extends OptionsPanelController {
+
+    private ViewPanel panel;
+    private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
+    private boolean changed;
+
+    public void update() {
+        getPanel().load();
+        changed = false;
+    }
+
+    public void applyChanges() {
+        getPanel().store();
+        changed = false;
+    }
+
+    public void cancel() {
+    // need not do anything special, if no changes have been persisted yet
+    }
+
+    public boolean isValid() {
+        return getPanel().valid();
+    }
+
+    public boolean isChanged() {
+        return changed;
+    }
+
+    public HelpCtx getHelpCtx() {
+        return null; // new HelpCtx("...ID") if you have a help set
+    }
+
+    public JComponent getComponent(Lookup masterLookup) {
+        return getPanel();
+    }
+
+    public void addPropertyChangeListener(PropertyChangeListener l) {
+        pcs.addPropertyChangeListener(l);
+    }
+
+    public void removePropertyChangeListener(PropertyChangeListener l) {
+        pcs.removePropertyChangeListener(l);
+    }
+
+    private ViewPanel getPanel() {
+        if (panel == null) {
+            panel = new ViewPanel(this);
+        }
+        return panel;
+    }
+
+    void changed() {
+        if (!changed) {
+            changed = true;
+            pcs.firePropertyChange(OptionsPanelController.PROP_CHANGED, false, true);
+        }
+        pcs.firePropertyChange(OptionsPanelController.PROP_VALID, null, null);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.form	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.3" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" max="32767" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="0" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jPanel1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace pref="206" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JPanel" name="jPanel1">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="1" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="jLabel1" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
+                      <Component id="jLabel2" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="39" max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Component id="portSpinner" alignment="0" min="-2" pref="63" max="-2" attributes="0"/>
+                      <Component id="nodeWidthSpinner" alignment="0" min="-2" pref="63" max="-2" attributes="0"/>
+                      <Component id="jScrollPane1" alignment="0" min="-2" pref="365" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <Group type="102" alignment="0" attributes="0">
+                  <EmptySpace max="-2" attributes="0"/>
+                  <Group type="103" groupAlignment="0" attributes="0">
+                      <Group type="102" alignment="0" attributes="0">
+                          <Component id="jScrollPane1" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="nodeWidthSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <EmptySpace type="separate" max="-2" attributes="0"/>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="portSpinner" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <Component id="jLabel1" alignment="0" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <EmptySpace min="-2" pref="73" max="-2" attributes="0"/>
+              </Group>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+      <SubComponents>
+        <Component class="javax.swing.JLabel" name="jLabel1">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Node Text"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel2">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Node Width"/>
+          </Properties>
+        </Component>
+        <Component class="javax.swing.JSpinner" name="portSpinner">
+        </Component>
+        <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+          <AuxValues>
+            <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+          </AuxValues>
+
+          <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+          <SubComponents>
+            <Component class="javax.swing.JTextArea" name="nodeTextArea">
+              <Properties>
+                <Property name="columns" type="int" value="20"/>
+                <Property name="rows" type="int" value="5"/>
+              </Properties>
+            </Component>
+          </SubComponents>
+        </Container>
+        <Component class="javax.swing.JSpinner" name="nodeWidthSpinner">
+        </Component>
+        <Component class="javax.swing.JLabel" name="jLabel3">
+          <Properties>
+            <Property name="text" type="java.lang.String" value="Network Port"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+  </SubComponents>
+</Form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.settings;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+final class ViewPanel extends javax.swing.JPanel {
+
+    private final ViewOptionsPanelController controller;
+
+    ViewPanel(ViewOptionsPanelController controller) {
+        this.controller = controller;
+        initComponents();
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jPanel1 = new javax.swing.JPanel();
+        jLabel1 = new javax.swing.JLabel();
+        jLabel2 = new javax.swing.JLabel();
+        portSpinner = new javax.swing.JSpinner();
+        jScrollPane1 = new javax.swing.JScrollPane();
+        nodeTextArea = new javax.swing.JTextArea();
+        nodeWidthSpinner = new javax.swing.JSpinner();
+        jLabel3 = new javax.swing.JLabel();
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel1, "Node Text");
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, "Node Width");
+
+        nodeTextArea.setColumns(20);
+        nodeTextArea.setRows(5);
+        jScrollPane1.setViewportView(nodeTextArea);
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, "Network Port");
+
+        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
+        jPanel1.setLayout(jPanel1Layout);
+        jPanel1Layout.setHorizontalGroup(
+            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(jLabel1)
+                    .add(jLabel3)
+                    .add(jLabel2))
+                .add(39, 39, 39)
+                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 63, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                    .add(nodeWidthSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 63, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 365, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
+                .addContainerGap())
+        );
+        jPanel1Layout.setVerticalGroup(
+            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(jPanel1Layout.createSequentialGroup()
+                .addContainerGap()
+                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+                    .add(jPanel1Layout.createSequentialGroup()
+                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                        .add(18, 18, 18)
+                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+                            .add(nodeWidthSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                            .add(jLabel2))
+                        .add(18, 18, 18)
+                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
+                            .add(portSpinner, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                            .add(jLabel3)))
+                    .add(jLabel1))
+                .add(73, 73, 73))
+        );
+
+        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(layout.createSequentialGroup()
+                .addContainerGap()
+                .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                .addContainerGap())
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
+            .add(layout.createSequentialGroup()
+                .addContainerGap()
+                .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 232, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(206, Short.MAX_VALUE))
+        );
+    }// </editor-fold>//GEN-END:initComponents
+    void load() {
+        nodeTextArea.setText(Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+        nodeWidthSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.NODE_WIDTH, Settings.NODE_WIDTH_DEFAULT)));
+        portSpinner.setValue(Integer.parseInt(Settings.get().get(Settings.PORT, Settings.PORT_DEFAULT)));
+    }
+
+    void store() {
+        Settings.get().put(Settings.NODE_TEXT, nodeTextArea.getText());
+        Settings.get().put(Settings.NODE_WIDTH, nodeWidthSpinner.getValue().toString());
+        Settings.get().put(Settings.PORT, portSpinner.getValue().toString());
+    }
+
+    boolean valid() {
+        return true;
+    }
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JLabel jLabel1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JPanel jPanel1;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JTextArea nodeTextArea;
+    private javax.swing.JSpinner nodeWidthSpinner;
+    private javax.swing.JSpinner portSpinner;
+    // End of variables declaration//GEN-END:variables
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="OptionsDialog">
+        <file name="Advanced.instance_hidden"/>
+        <file name="General.instance_hidden"/>
+        <file name="com-sun-hotspot-igv-settings-ViewOptionsCategory.instance"/>
+    </folder>
+</filesystem>
Binary file hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.util" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.util.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.util
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/util/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.util-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=a470a16f
+build.xml.script.CRC32=466cf03b
+build.xml.stylesheet.CRC32=05353c81
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=a470a16f
+nbproject/build-impl.xml.script.CRC32=39f45e01
+nbproject/build-impl.xml.stylesheet.CRC32=3f8b4615
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.visual</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>2.9</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.10.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.util</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,182 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseWheelEvent;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BoundedZoomAction extends WidgetAction.Adapter {
+
+    private double minFactor = 0.0;
+    private double maxFactor = Double.MAX_VALUE;
+    private double zoomMultiplier;
+    private boolean useAnimator;
+
+    public BoundedZoomAction(double zoomMultiplier, boolean useAnimator) {
+        this.zoomMultiplier = zoomMultiplier;
+        this.useAnimator = useAnimator;
+    }
+
+    public double getMinFactor() {
+        return minFactor;
+    }
+
+    public void setMinFactor(double d) {
+        minFactor = d;
+    }
+
+    public double getMaxFactor() {
+        return maxFactor;
+    }
+
+    public void setMaxFactor(double d) {
+        maxFactor = d;
+    }
+
+    private JScrollPane findScrollPane(JComponent component) {
+        for (;;) {
+            if (component == null) {
+                return null;
+            }
+            if (component instanceof JScrollPane) {
+                return ((JScrollPane) component);
+            }
+            Container parent = component.getParent();
+            if (!(parent instanceof JComponent)) {
+                return null;
+            }
+            component = (JComponent) parent;
+        }
+    }
+
+    @Override
+    public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) {
+        final Scene scene = widget.getScene();
+        int amount = event.getWheelRotation();
+        JScrollPane scrollPane = findScrollPane(scene.getView());
+        Point viewPosition = null;
+        Point mouseLocation = scene.convertSceneToView(event.getPoint());
+        int xOffset = 0;
+        int yOffset = 0;
+        Point oldViewPosition = null;
+        Rectangle bounds = new Rectangle(scene.getBounds());
+        Dimension componentSize = new Dimension(scene.getView().getPreferredSize());
+
+        if (scrollPane != null) {
+            viewPosition = new Point(scrollPane.getViewport().getViewPosition());
+            oldViewPosition = new Point(viewPosition);
+            xOffset = (mouseLocation.x - viewPosition.x);
+            yOffset = (mouseLocation.y - viewPosition.y);
+            viewPosition.x += xOffset;
+            viewPosition.y += yOffset;
+        }
+
+        if (useAnimator) {
+            SceneAnimator sceneAnimator = scene.getSceneAnimator();
+            synchronized (sceneAnimator) {
+                double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor();
+                while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) {
+                    zoom /= zoomMultiplier;
+                    if (viewPosition != null) {
+                        viewPosition.x /= zoomMultiplier;
+                        viewPosition.y /= zoomMultiplier;
+                        bounds.width /= zoomMultiplier;
+                        bounds.height /= zoomMultiplier;
+                        componentSize.width /= zoomMultiplier;
+                        componentSize.height /= zoomMultiplier;
+                    }
+                    amount--;
+                }
+                while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) {
+                    zoom *= zoomMultiplier;
+                    if (viewPosition != null) {
+                        viewPosition.x *= zoomMultiplier;
+                        viewPosition.y *= zoomMultiplier;
+                        bounds.width *= zoomMultiplier;
+                        bounds.height *= zoomMultiplier;
+                        componentSize.width *= zoomMultiplier;
+                        componentSize.height *= zoomMultiplier;
+                    }
+                    amount++;
+                }
+                sceneAnimator.animateZoomFactor(zoom);
+            }
+        } else {
+            double zoom = scene.getZoomFactor();
+            while (amount > 0 && zoom / zoomMultiplier >= minFactor && zoom / zoomMultiplier <= maxFactor) {
+                zoom /= zoomMultiplier;
+                if (viewPosition != null) {
+                    viewPosition.x /= zoomMultiplier;
+                    viewPosition.y /= zoomMultiplier;
+                    bounds.width /= zoomMultiplier;
+                    bounds.height /= zoomMultiplier;
+                    componentSize.width /= zoomMultiplier;
+                    componentSize.height /= zoomMultiplier;
+                }
+                amount--;
+            }
+            while (amount < 0 && zoom * zoomMultiplier >= minFactor && zoom * zoomMultiplier <= maxFactor) {
+                zoom *= zoomMultiplier;
+                if (viewPosition != null) {
+                    viewPosition.x *= zoomMultiplier;
+                    viewPosition.y *= zoomMultiplier;
+                    bounds.width *= zoomMultiplier;
+                    bounds.height *= zoomMultiplier;
+                    componentSize.width *= zoomMultiplier;
+                    componentSize.height *= zoomMultiplier;
+                }
+                amount++;
+            }
+            scene.setZoomFactor(zoom);
+        }
+
+        if (scrollPane != null) {
+            scene.validate(); // Call validate to update size of scene
+            Dimension size = scrollPane.getViewport().getExtentSize();
+            viewPosition.x -= xOffset;
+            viewPosition.y -= yOffset;
+            scene.resolveBounds(scene.getLocation(), bounds);
+            scene.getView().setPreferredSize(componentSize);
+            scene.getView().revalidate();
+            scene.getView().addNotify();
+            scrollPane.getViewport().setViewPosition(viewPosition);
+        }
+
+        return WidgetAction.State.CONSUMED;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+OpenIDE-Module-Name=Util
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import javax.swing.Icon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ColorIcon implements Icon {
+
+    private Color color;
+
+    public ColorIcon(Color c) {
+        color = c;
+    }
+
+    public void paintIcon(Component c, Graphics g, int x, int y) {
+        g.setColor(color);
+        g.fillRect(x, y, 16, 16);
+    }
+
+    public int getIconWidth() {
+        return 16;
+    }
+
+    public int getIconHeight() {
+        return 16;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,95 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.util;
+
+import java.awt.EventQueue;
+import org.openide.util.ContextAwareAction;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class ContextAction<T> extends CallableSystemAction implements LookupListener, ContextAwareAction {
+
+    private Lookup context = null;
+    private Lookup.Result<T> result = null;
+
+    public ContextAction() {
+        this(Utilities.actionsGlobalContext());
+    }
+
+    public ContextAction(Lookup context) {
+        init(context);
+    }
+
+    private void init(Lookup context) {
+        this.context = context;
+        result = context.lookupResult(contextClass());
+        result.addLookupListener(this);
+        resultChanged(null);
+    }
+
+    public void resultChanged(LookupEvent e) {
+        if (result.allItems().size() != 0) {
+            update(result.allInstances().iterator().next());
+        } else {
+            update(null);
+        }
+    }
+
+    @Override
+    public void performAction() {
+        final T t = result.allInstances().iterator().next();
+
+        // Ensure it's AWT event thread
+        EventQueue.invokeLater(new Runnable() {
+
+            public void run() {
+                performAction(t);
+            }
+        });
+    }
+
+    public void update(T t) {
+        if (t == null) {
+            setEnabled(false);
+        } else {
+            setEnabled(isEnabled(t));
+        }
+    }
+
+    public boolean isEnabled(T context) {
+        return true;
+    }
+
+    public abstract Class<T> contextClass();
+
+    public abstract void performAction(T context);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DoubleClickAction extends WidgetAction.Adapter {
+
+    private DoubleClickHandler handler;
+
+    public DoubleClickAction(DoubleClickHandler handler) {
+        this.handler = handler;
+    }
+
+    @Override
+    public WidgetAction.State mouseClicked(Widget widget, WidgetAction.WidgetMouseEvent event) {
+        if (event.getClickCount() > 1) {
+            handler.handleDoubleClick(widget, event);
+            return WidgetAction.State.CONSUMED;
+        }
+        return WidgetAction.State.REJECTED;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface DoubleClickHandler {
+
+    public void handleDoubleClick(Widget w, WidgetMouseEvent e);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,195 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import org.netbeans.api.visual.widget.Scene;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSatelliteComponent extends JComponent implements MouseListener, MouseMotionListener, Scene.SceneListener, ComponentListener {
+
+    private Scene scene;
+    private Image image;
+    private int imageWidth;
+    private int imageHeight;
+
+    public ExtendedSatelliteComponent(Scene scene) {
+        this.scene = scene;
+        setDoubleBuffered(true);
+        setPreferredSize(new Dimension(128, 128));
+        addMouseListener(this);
+        addMouseMotionListener(this);
+    }
+
+    @Override
+    public void addNotify() {
+        super.addNotify();
+        scene.addSceneListener(this);
+        JComponent viewComponent = scene.getView();
+        if (viewComponent == null) {
+            viewComponent = scene.createView();
+        }
+        viewComponent.addComponentListener(this);
+        repaint();
+    }
+
+    @Override
+    public void removeNotify() {
+        scene.getView().removeComponentListener(this);
+        scene.removeSceneListener(this);
+        super.removeNotify();
+    }
+
+    public void update() {
+        this.image = null;
+        repaint();
+    }
+
+    @Override
+    public void paint(Graphics g) {
+        Graphics2D gr = (Graphics2D) g;
+        super.paint(g);
+        Rectangle bounds = scene.getBounds();
+        Dimension size = getSize();
+
+        double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+        double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+        double scale = Math.min(sx, sy);
+
+        int vw = (int) (scale * bounds.width);
+        int vh = (int) (scale * bounds.height);
+        int vx = (size.width - vw) / 2;
+        int vy = (size.height - vh) / 2;
+
+
+        if (image == null || vw != imageWidth || vh != imageHeight) {
+
+            imageWidth = vw;
+            imageHeight = vh;
+            image = this.createImage(imageWidth, imageHeight);
+            Graphics2D ig = (Graphics2D) image.getGraphics();
+            ig.scale(scale, scale);
+            scene.paint(ig);
+        }
+
+        gr.drawImage(image, vx, vy, this);
+
+        JComponent component = scene.getView();
+        double zoomFactor = scene.getZoomFactor();
+        Rectangle viewRectangle = component != null ? component.getVisibleRect() : null;
+        if (viewRectangle != null) {
+            Rectangle window = new Rectangle(
+                    (int) ((double) viewRectangle.x * scale / zoomFactor),
+                    (int) ((double) viewRectangle.y * scale / zoomFactor),
+                    (int) ((double) viewRectangle.width * scale / zoomFactor),
+                    (int) ((double) viewRectangle.height * scale / zoomFactor));
+            window.translate(vx, vy);
+            gr.setColor(new Color(200, 200, 200, 128));
+            gr.fill(window);
+            gr.setColor(Color.BLACK);
+            gr.drawRect(window.x, window.y, window.width - 1, window.height - 1);
+        }
+    }
+
+    public void mouseClicked(MouseEvent e) {
+    }
+
+    public void mousePressed(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseReleased(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseEntered(MouseEvent e) {
+    }
+
+    public void mouseExited(MouseEvent e) {
+    }
+
+    public void mouseDragged(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseMoved(MouseEvent e) {
+    }
+
+    private void moveVisibleRect(Point center) {
+        JComponent component = scene.getView();
+        if (component == null) {
+            return;
+        }
+        double zoomFactor = scene.getZoomFactor();
+        Rectangle bounds = scene.getBounds();
+        Dimension size = getSize();
+
+        double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+        double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+        double scale = Math.min(sx, sy);
+
+        int vw = (int) (scale * bounds.width);
+        int vh = (int) (scale * bounds.height);
+        int vx = (size.width - vw) / 2;
+        int vy = (size.height - vh) / 2;
+
+        int cx = (int) ((double) (center.x - vx) / scale * zoomFactor);
+        int cy = (int) ((double) (center.y - vy) / scale * zoomFactor);
+
+        Rectangle visibleRect = component.getVisibleRect();
+        visibleRect.x = cx - visibleRect.width / 2;
+        visibleRect.y = cy - visibleRect.height / 2;
+        component.scrollRectToVisible(visibleRect);
+
+    }
+
+    public void sceneRepaint() {
+    }
+
+    public void sceneValidating() {
+    }
+
+    public void sceneValidated() {
+    }
+
+    public void componentResized(ComponentEvent e) {
+        repaint();
+    }
+
+    public void componentMoved(ComponentEvent e) {
+        repaint();
+    }
+
+    public void componentShown(ComponentEvent e) {
+    }
+
+    public void componentHidden(ComponentEvent e) {
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,69 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.util;
+
+import java.awt.event.MouseEvent;
+import javax.swing.JPanel;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetKeyEvent;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseEvent;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSelectAction extends WidgetAction.Adapter {
+
+    private WidgetAction innerAction;
+    private JPanel panel;
+
+    public ExtendedSelectAction(SelectProvider provider) {
+        innerAction = ActionFactory.createSelectAction(provider);
+        panel = new JPanel();
+    }
+
+    @Override
+    public State mousePressed(Widget widget, WidgetMouseEvent event) {
+        // TODO: Solve this differently?
+        if (event.getButton() != MouseEvent.BUTTON2) {
+            return innerAction.mousePressed(widget, new WidgetMouseEvent(event.getEventID(), new MouseEvent(panel, (int) event.getEventID(), event.getWhen(), event.getModifiersEx(), event.getPoint().x, event.getPoint().y, event.getClickCount(), event.isPopupTrigger(), MouseEvent.BUTTON1)));
+        } else {
+            return super.mousePressed(widget, event);
+        }
+    }
+
+    @Override
+    public State mouseReleased(Widget widget, WidgetMouseEvent event) {
+        return innerAction.mouseReleased(widget, event);
+    }
+
+    @Override
+    public State keyTyped(Widget widget, WidgetKeyEvent event) {
+        return innerAction.keyTyped(widget, event);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Property;
+import java.lang.reflect.InvocationTargetException;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PropertiesSheet {
+
+    public static void initializeSheet(Properties properties, Sheet s) {
+
+        Sheet.Set set1 = Sheet.createPropertiesSet();
+        set1.setDisplayName("Properties");
+        for (final Property p : properties.getProperties()) {
+            Node.Property<String> prop = new Node.Property<String>(String.class) {
+
+                @Override
+                public boolean canRead() {
+                    return true;
+                }
+
+                @Override
+                public String getValue() throws IllegalAccessException, InvocationTargetException {
+                    return p.getValue();
+                }
+
+                @Override
+                public boolean canWrite() {
+                    return false;
+                }
+
+                @Override
+                public void setValue(String arg0) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+                    p.setValue(arg0);
+                }
+            };
+            prop.setName(p.getName());
+            set1.put(prop);
+        }
+        s.put(set1);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,360 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.ChangedListener;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.List;
+import javax.swing.JComponent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RangeSlider extends JComponent implements ChangedListener<RangeSliderModel>, MouseListener, MouseMotionListener {
+
+    public static final int HEIGHT = 40;
+    public static final int BAR_HEIGHT = 22;
+    public static final int BAR_SELECTION_ENDING_HEIGHT = 16;
+    public static final int BAR_SELECTION_HEIGHT = 10;
+    public static final int BAR_THICKNESS = 2;
+    public static final int BAR_CIRCLE_SIZE = 9;
+    public static final int MOUSE_ENDING_OFFSET = 3;
+    public static final Color BACKGROUND_COLOR = Color.white;
+    public static final Color BAR_COLOR = Color.black;
+    public static final Color BAR_SELECTION_COLOR = new Color(255, 0, 0, 120);
+    public static final Color BAR_SELECTION_COLOR_ROLLOVER = new Color(255, 0, 255, 120);
+    public static final Color BAR_SELECTION_COLOR_DRAG = new Color(0, 0, 255, 120);
+    private RangeSliderModel model;
+    private State state;
+    private Point startPoint;
+    private RangeSliderModel tempModel;
+    private boolean isOverBar;
+
+    private enum State {
+
+        Initial,
+        DragBar,
+        DragFirstPosition,
+        DragSecondPosition
+    }
+
+    public RangeSlider() {
+        state = State.Initial;
+        this.addMouseMotionListener(this);
+        this.addMouseListener(this);
+    }
+
+    public void setModel(RangeSliderModel newModel) {
+        if (model != null) {
+            model.getChangedEvent().removeListener(this);
+            model.getColorChangedEvent().removeListener(this);
+        }
+        if (newModel != null) {
+            newModel.getChangedEvent().addListener(this);
+            newModel.getColorChangedEvent().addListener(this);
+        }
+        this.model = newModel;
+        update();
+    }
+
+    private RangeSliderModel getPaintingModel() {
+        if (tempModel != null) {
+            return tempModel;
+        }
+        return model;
+    }
+
+    @Override
+    public Dimension getPreferredSize() {
+        Dimension d = super.getPreferredSize();
+        d.height = HEIGHT;
+        return d;
+    }
+
+    public void changed(RangeSliderModel source) {
+        update();
+    }
+
+    private void update() {
+        this.repaint();
+    }
+
+    private int getXPosition(int index) {
+        assert index >= 0 && index < getPaintingModel().getPositions().size();
+        return getXOffset() * (index + 1);
+    }
+
+    private int getXOffset() {
+        int size = getPaintingModel().getPositions().size();
+        int width = getWidth();
+        return (width / (size + 1));
+    }
+
+    private int getEndXPosition(int index) {
+        return getXPosition(index) + getXOffset() / 2;
+    }
+
+    private int getStartXPosition(int index) {
+        return getXPosition(index) - getXOffset() / 2;
+    }
+
+    @Override
+    public void paint(Graphics g) {
+        super.paint(g);
+        Graphics2D g2 = (Graphics2D) g;
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                RenderingHints.VALUE_ANTIALIAS_ON);
+        int width = getWidth();
+        int height = getHeight();
+
+        g2.setColor(BACKGROUND_COLOR);
+        g2.fillRect(0, 0, width, height);
+
+        // Nothing to paint?
+        if (getPaintingModel() == null || getPaintingModel().getPositions().size() == 0) {
+            return;
+        }
+
+        int firstPos = getPaintingModel().getFirstPosition();
+        int secondPos = getPaintingModel().getSecondPosition();
+
+        paintSelected(g2, firstPos, secondPos);
+        paintBar(g2);
+
+    }
+
+    private int getBarStartY() {
+        return getHeight() - BAR_HEIGHT;
+    }
+
+    private void paintBar(Graphics2D g) {
+        List<String> list = getPaintingModel().getPositions();
+        int barStartY = getBarStartY();
+
+        g.setColor(BAR_COLOR);
+        g.fillRect(getXPosition(0), barStartY + BAR_HEIGHT / 2 - BAR_THICKNESS / 2, getXPosition(list.size() - 1) - getXPosition(0), BAR_THICKNESS);
+
+        int circleCenterY = barStartY + BAR_HEIGHT / 2;
+        for (int i = 0; i < list.size(); i++) {
+            int curX = getXPosition(i);
+            g.setColor(getPaintingModel().getColors().get(i));
+            g.fillOval(curX - BAR_CIRCLE_SIZE / 2, circleCenterY - BAR_CIRCLE_SIZE / 2, BAR_CIRCLE_SIZE, BAR_CIRCLE_SIZE);
+            g.setColor(Color.black);
+            g.drawOval(curX - BAR_CIRCLE_SIZE / 2, circleCenterY - BAR_CIRCLE_SIZE / 2, BAR_CIRCLE_SIZE, BAR_CIRCLE_SIZE);
+
+
+            String curS = list.get(i);
+            if (curS != null && curS.length() > 0) {
+                int startX = getStartXPosition(i);
+                int endX = getEndXPosition(i);
+                FontMetrics metrics = g.getFontMetrics();
+                Rectangle bounds = metrics.getStringBounds(curS, g).getBounds();
+                if (bounds.width < endX - startX && bounds.height < barStartY) {
+                    g.setColor(Color.black);
+                    g.drawString(curS, startX + (endX - startX) / 2 - bounds.width / 2, barStartY / 2 + bounds.height / 2);
+                }
+            }
+        }
+
+    }
+
+    private void paintSelected(Graphics2D g, int start, int end) {
+
+        int startX = getStartXPosition(start);
+        int endX = getEndXPosition(end);
+        int barStartY = getBarStartY();
+        int barSelectionEndingStartY = barStartY + BAR_HEIGHT / 2 - BAR_SELECTION_ENDING_HEIGHT / 2;
+        paintSelectedEnding(g, startX, barSelectionEndingStartY);
+        paintSelectedEnding(g, endX, barSelectionEndingStartY);
+
+        g.setColor(BAR_SELECTION_COLOR);
+        if (state == State.DragBar) {
+            g.setColor(BAR_SELECTION_COLOR_DRAG);
+        } else if (isOverBar) {
+            g.setColor(BAR_SELECTION_COLOR_ROLLOVER);
+        }
+        g.fillRect(startX, barStartY + BAR_HEIGHT / 2 - BAR_SELECTION_HEIGHT / 2, endX - startX, BAR_SELECTION_HEIGHT);
+    }
+
+    private void paintSelectedEnding(Graphics g, int x, int y) {
+        g.setColor(BAR_COLOR);
+        g.fillRect(x - BAR_THICKNESS / 2, y, BAR_THICKNESS, BAR_SELECTION_ENDING_HEIGHT);
+    }
+
+    private boolean isOverSecondPosition(Point p) {
+        if (p.y >= getBarStartY()) {
+            int destX = getEndXPosition(getPaintingModel().getSecondPosition());
+            int off = Math.abs(destX - p.x);
+            return off <= MOUSE_ENDING_OFFSET;
+        }
+        return false;
+    }
+
+    private boolean isOverFirstPosition(Point p) {
+        if (p.y >= getBarStartY()) {
+            int destX = getStartXPosition(getPaintingModel().getFirstPosition());
+            int off = Math.abs(destX - p.x);
+            return off <= MOUSE_ENDING_OFFSET;
+        }
+        return false;
+    }
+
+    private boolean isOverSelection(Point p) {
+        if (p.y >= getBarStartY() && !isOverFirstPosition(p) && !isOverSecondPosition(p)) {
+            return p.x > getStartXPosition(getPaintingModel().getFirstPosition()) && p.x < getEndXPosition(getPaintingModel().getSecondPosition());
+        }
+        return false;
+    }
+
+    public void mouseDragged(MouseEvent e) {
+        if (state == State.DragBar) {
+            int firstX = this.getStartXPosition(model.getFirstPosition());
+            int newFirstX = firstX + e.getPoint().x - startPoint.x;
+            int newIndex = getIndexFromPosition(newFirstX) + 1;
+            if (newIndex + model.getSecondPosition() - model.getFirstPosition() >= model.getPositions().size()) {
+                newIndex = model.getPositions().size() - (model.getSecondPosition() - model.getFirstPosition()) - 1;
+            }
+            int secondPosition = newIndex + model.getSecondPosition() - model.getFirstPosition();
+            tempModel.setPositions(newIndex, secondPosition);
+            update();
+        } else if (state == State.DragFirstPosition) {
+            int firstPosition = getIndexFromPosition(e.getPoint().x) + 1;
+            int secondPosition = model.getSecondPosition();
+            if (firstPosition > secondPosition) {
+                firstPosition--;
+            }
+            tempModel.setPositions(firstPosition, secondPosition);
+            update();
+        } else if (state == State.DragSecondPosition) {
+            int firstPosition = model.getFirstPosition();
+            int secondPosition = getIndexFromPosition(e.getPoint().x);
+            if (secondPosition < firstPosition) {
+                secondPosition++;
+            }
+            tempModel.setPositions(firstPosition, secondPosition);
+            update();
+        }
+    }
+
+    private int getIndexFromPosition(int x) {
+        if (x < getXPosition(0)) {
+            return -1;
+        }
+        for (int i = 0; i < getPaintingModel().getPositions().size() - 1; i++) {
+            int startX = getXPosition(i);
+            int endX = getXPosition(i + 1);
+            if (x >= startX && x <= endX) {
+                return i;
+            }
+        }
+        return getPaintingModel().getPositions().size() - 1;
+    }
+
+    private int getCircleIndexFromPosition(int x) {
+        int result = 0;
+        for (int i = 1; i < getPaintingModel().getPositions().size() - 1; i++) {
+            if (x > getStartXPosition(i)) {
+                result = i;
+            }
+        }
+        return result;
+    }
+
+    public void mouseMoved(MouseEvent e) {
+        isOverBar = false;
+        if (model == null) {
+            return;
+        }
+
+
+        Point p = e.getPoint();
+        if (isOverFirstPosition(p) || isOverSecondPosition(p)) {
+            setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
+        } else if (isOverSelection(p)) {
+            isOverBar = true;
+            setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+        } else {
+            this.setCursor(Cursor.getDefaultCursor());
+        }
+        repaint();
+    }
+
+    public void mouseClicked(MouseEvent e) {
+        if (e.getClickCount() > 1) {
+            // Double click
+            int index = getCircleIndexFromPosition(e.getPoint().x);
+            model.setPositions(index, index);
+        }
+    }
+
+    public void mousePressed(MouseEvent e) {
+        if (model == null) {
+            return;
+        }
+
+        Point p = e.getPoint();
+        if (isOverFirstPosition(p)) {
+            state = State.DragFirstPosition;
+        } else if (isOverSecondPosition(p)) {
+            state = State.DragSecondPosition;
+        } else if (isOverSelection(p)) {
+            state = State.DragBar;
+        } else {
+            return;
+        }
+
+        startPoint = e.getPoint();
+        tempModel = model.copy();
+    }
+
+    public void mouseReleased(MouseEvent e) {
+        if (model == null || tempModel == null) {
+            return;
+        }
+        state = State.Initial;
+        model.setPositions(tempModel.getFirstPosition(), tempModel.getSecondPosition());
+        tempModel = null;
+    }
+
+    public void mouseEntered(MouseEvent e) {
+    }
+
+    public void mouseExited(MouseEvent e) {
+        isOverBar = false;
+        repaint();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,130 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.util;
+
+import com.sun.hotspot.igv.data.ChangedEventProvider;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class RangeSliderModel implements ChangedEventProvider<RangeSliderModel> {
+
+    // Warning: Update setData method if fields are added
+    private ChangedEvent<RangeSliderModel> changedEvent;
+    private ChangedEvent<RangeSliderModel> colorChangedEvent;
+    private List<String> positions;
+    private int firstPosition;
+    private int secondPosition;
+    private List<Color> colors;
+
+    public void setData(RangeSliderModel model) {
+        boolean changed = false;
+        changed |= (positions != model.positions);
+        positions = model.positions;
+        changed |= (firstPosition != model.firstPosition);
+        firstPosition = model.firstPosition;
+        changed |= (secondPosition != model.secondPosition);
+        secondPosition = model.secondPosition;
+        boolean colorChanged = (colors != model.colors);
+        colors = model.colors;
+        if (changed) {
+            changedEvent.fire();
+        }
+        if (colorChanged) {
+            colorChangedEvent.fire();
+        }
+    }
+
+    public RangeSliderModel(List<String> positions) {
+        assert positions.size() > 0;
+        this.positions = positions;
+        this.changedEvent = new ChangedEvent<RangeSliderModel>(this);
+        this.colorChangedEvent = new ChangedEvent<RangeSliderModel>(this);
+        colors = new ArrayList<Color>();
+        for (int i = 0; i < positions.size(); i++) {
+            colors.add(Color.black);
+        }
+    }
+
+    public void setColors(List<Color> colors) {
+        this.colors = colors;
+        colorChangedEvent.fire();
+    }
+
+    public List<Color> getColors() {
+        return colors;
+    }
+
+    public RangeSliderModel copy() {
+        RangeSliderModel newModel = new RangeSliderModel(positions);
+        newModel.firstPosition = firstPosition;
+        newModel.secondPosition = secondPosition;
+        newModel.colors = colors;
+        return newModel;
+    }
+
+    public List<String> getPositions() {
+        return Collections.unmodifiableList(positions);
+    }
+
+    public int getFirstPosition() {
+        return firstPosition;
+    }
+
+    public int getSecondPosition() {
+        return secondPosition;
+    }
+
+    public void setPositions(int fp, int sp) {
+        assert fp >= 0 && fp < positions.size();
+        assert sp >= 0 && sp < positions.size();
+        firstPosition = fp;
+        secondPosition = sp;
+        ensureOrder();
+        changedEvent.fire();
+    }
+
+    private void ensureOrder() {
+        if (secondPosition < firstPosition) {
+            int tmp = secondPosition;
+            secondPosition = firstPosition;
+            firstPosition = tmp;
+        }
+    }
+
+    public ChangedEvent<RangeSliderModel> getColorChangedEvent() {
+        return colorChangedEvent;
+    }
+
+    public ChangedEvent<RangeSliderModel> getChangedEvent() {
+        return changedEvent;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="com.sun.hotspot.igv.view" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project com.sun.hotspot.igv.view.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+OpenIDE-Module: com.sun.hotspot.igv.view
+OpenIDE-Module-Layer: com/sun/hotspot/igv/view/layer.xml
+OpenIDE-Module-Localizing-Bundle: com/sun/hotspot/igv/view/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="com.sun.hotspot.igv.view-impl" basedir="..">
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=2de95ef6
+build.xml.script.CRC32=31afe4b1
+build.xml.stylesheet.CRC32=79c3b980
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=2de95ef6
+nbproject/build-impl.xml.script.CRC32=fa7a4119
+nbproject/build-impl.xml.stylesheet.CRC32=deb65f65
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=JDK_1.6
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+javac.source=1.5
+javac.compilerargs=-Xlint -Xlint:-serial
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>com.sun.hotspot.igv.view</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.data</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.difference</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.filter</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.graph</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.hierarchicallayout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.layout</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.settings</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.svg</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>com.sun.hotspot.igv.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.0</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.api.visual</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>2.9</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.actions</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.6.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.awt</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.11.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.dialogs</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.5.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.loaders</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.nodes</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.2.1.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.9.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.windows</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.16</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <public-packages>
+                <package>com.sun.hotspot.igv.view</package>
+            </public-packages>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+suite.dir=${basedir}/..
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.view.GraphViewerImplementation
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1 @@
+com.sun.hotspot.igv.view.EditorInputGraphProvider
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,175 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.action.WidgetAction.WidgetMouseWheelEvent;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BoundedZoomAction extends WidgetAction.Adapter {
+
+    private double minFactor = 0.0;
+    private double maxFactor = Double.MAX_VALUE;
+    private double zoomMultiplier;
+    private boolean useAnimator;
+
+    public BoundedZoomAction(double zoomMultiplier, boolean useAnimator) {
+        assert zoomMultiplier > 1.0;
+        this.zoomMultiplier = zoomMultiplier;
+        this.useAnimator = useAnimator;
+    }
+
+    public double getMinFactor() {
+        return minFactor;
+    }
+
+    public void setMinFactor(double d) {
+        minFactor = d;
+    }
+
+    public double getMaxFactor() {
+        return maxFactor;
+    }
+
+    public void setMaxFactor(double d) {
+        maxFactor = d;
+    }
+
+    private JScrollPane findScrollPane(JComponent component) {
+        for (;;) {
+            if (component == null) {
+                return null;
+            }
+            if (component instanceof JScrollPane) {
+                return ((JScrollPane) component);
+            }
+            Container parent = component.getParent();
+            if (!(parent instanceof JComponent)) {
+                return null;
+            }
+            component = (JComponent) parent;
+        }
+    }
+
+    @Override
+    public State mouseWheelMoved(Widget widget, WidgetMouseWheelEvent event) {
+        final Scene scene = widget.getScene();
+        int amount = event.getWheelRotation();
+        JScrollPane scrollPane = findScrollPane(scene.getView());
+        Point viewPosition = null;
+        Point mouseLocation = scene.convertSceneToView(event.getPoint());
+        int xOffset = 0;
+        int yOffset = 0;
+        Rectangle bounds = new Rectangle(scene.getBounds());
+        Dimension componentSize = new Dimension(scene.getView().getPreferredSize());
+        if (scrollPane != null) {
+            viewPosition = new Point(scrollPane.getViewport().getViewPosition());
+            xOffset = (mouseLocation.x - viewPosition.x);
+            yOffset = (mouseLocation.y - viewPosition.y);
+            viewPosition.x += xOffset;
+            viewPosition.y += yOffset;
+        }
+
+        if (useAnimator) {
+            SceneAnimator sceneAnimator = scene.getSceneAnimator();
+            synchronized (sceneAnimator) {
+                double zoom = sceneAnimator.isAnimatingZoomFactor() ? sceneAnimator.getTargetZoomFactor() : scene.getZoomFactor();
+                while (amount > 0 && zoom / zoomMultiplier >= minFactor) {
+                    zoom /= zoomMultiplier;
+                    if (viewPosition != null) {
+                        viewPosition.x /= zoomMultiplier;
+                        viewPosition.y /= zoomMultiplier;
+                        bounds.width /= zoomMultiplier;
+                        bounds.height /= zoomMultiplier;
+                        componentSize.width /= zoomMultiplier;
+                        componentSize.height /= zoomMultiplier;
+                    }
+                    amount--;
+                }
+                while (amount < 0 && zoom * zoomMultiplier <= maxFactor) {
+                    zoom *= zoomMultiplier;
+                    if (viewPosition != null) {
+                        viewPosition.x *= zoomMultiplier;
+                        viewPosition.y *= zoomMultiplier;
+                        bounds.width *= zoomMultiplier;
+                        bounds.height *= zoomMultiplier;
+                        componentSize.width *= zoomMultiplier;
+                        componentSize.height *= zoomMultiplier;
+                    }
+                    amount++;
+                }
+                sceneAnimator.animateZoomFactor(zoom);
+            }
+        } else {
+            double zoom = scene.getZoomFactor();
+            while (amount > 0 && zoom / zoomMultiplier >= minFactor) {
+                zoom /= zoomMultiplier;
+                if (viewPosition != null) {
+                    viewPosition.x /= zoomMultiplier;
+                    viewPosition.y /= zoomMultiplier;
+                    bounds.width /= zoomMultiplier;
+                    bounds.height /= zoomMultiplier;
+                    componentSize.width /= zoomMultiplier;
+                    componentSize.height /= zoomMultiplier;
+                }
+                amount--;
+            }
+            while (amount < 0 && zoom * zoomMultiplier <= maxFactor) {
+                zoom *= zoomMultiplier;
+                if (viewPosition != null) {
+                    viewPosition.x *= zoomMultiplier;
+                    viewPosition.y *= zoomMultiplier;
+                    bounds.width *= zoomMultiplier;
+                    bounds.height *= zoomMultiplier;
+                    componentSize.width *= zoomMultiplier;
+                    componentSize.height *= zoomMultiplier;
+                }
+                amount++;
+            }
+            scene.setZoomFactor(zoom);
+        }
+
+        if (scrollPane != null) {
+            viewPosition.x -= xOffset;
+            viewPosition.y -= yOffset;
+            scrollPane.getViewport().setViewPosition(viewPosition);
+        }
+
+
+        return WidgetAction.State.CONSUMED;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,3 @@
+HINT_EditorTopComponent=This is a Editor window
+OpenIDE-Module-Name=View
+CTL_EditorTopComponent=Editor Window
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.view.widgets.SlotWidget;
+import java.awt.Point;
+import java.awt.Rectangle;
+import org.netbeans.api.visual.anchor.Anchor;
+import org.netbeans.api.visual.anchor.Anchor.Entry;
+import org.netbeans.api.visual.anchor.Anchor.Result;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class ConnectionAnchor extends Anchor {
+
+    public enum HorizontalAlignment {
+
+        Left,
+        Center,
+        Right
+    }
+    private HorizontalAlignment alignment;
+
+    public ConnectionAnchor(Widget widget) {
+        this(HorizontalAlignment.Center, widget);
+    }
+
+    public ConnectionAnchor(HorizontalAlignment alignment, Widget widget) {
+        super(widget);
+        this.alignment = alignment;
+    }
+
+    public Result compute(Entry entry) {
+        return new Result(getRelatedSceneLocation(), Anchor.DIRECTION_ANY);
+    }
+
+    @Override
+    public Point getRelatedSceneLocation() {
+        Point p = null;
+        Widget w = getRelatedWidget();
+        if (w != null) {
+            if (w instanceof SlotWidget) {
+                p = ((SlotWidget) w).getAnchorPosition();
+            } else {
+                Rectangle r = w.convertLocalToScene(w.getBounds());
+                int y = r.y + r.height / 2;
+                int x = r.x;
+                if (alignment == HorizontalAlignment.Center) {
+                    x = r.x + r.width / 2;
+                } else if (alignment == HorizontalAlignment.Right) {
+                    x = r.x + r.width;
+                }
+
+                p = new Point(x, y);
+            }
+        }
+
+        return p;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1254 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.view.widgets.BlockWidget;
+import com.sun.hotspot.igv.view.widgets.LineWidget;
+import com.sun.hotspot.igv.util.DoubleClickAction;
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalClusterLayoutManager;
+import com.sun.hotspot.igv.hierarchicallayout.OldHierarchicalLayoutManager;
+import com.sun.hotspot.igv.hierarchicallayout.HierarchicalLayoutManager;
+import com.sun.hotspot.igv.view.widgets.FigureWidget;
+import com.sun.hotspot.igv.view.widgets.InputSlotWidget;
+import com.sun.hotspot.igv.view.widgets.OutputSlotWidget;
+import com.sun.hotspot.igv.view.widgets.SlotWidget;
+import com.sun.hotspot.igv.layout.LayoutGraph;
+import com.sun.hotspot.igv.data.services.Scheduler;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.graph.Block;
+import com.sun.hotspot.igv.util.ColorIcon;
+import com.sun.hotspot.igv.util.ExtendedSelectAction;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.JComponent;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.UndoableEditEvent;
+import javax.swing.undo.AbstractUndoableEdit;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.action.RectangularSelectDecorator;
+import org.netbeans.api.visual.action.RectangularSelectProvider;
+import org.netbeans.api.visual.action.SelectProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.netbeans.api.visual.widget.LayerWidget;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.widget.LabelWidget;
+import org.openide.awt.UndoRedo;
+import org.openide.util.Lookup;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramScene extends Scene implements ChangedListener<DiagramViewModel> {
+
+    private Hashtable<Figure, FigureWidget> figureWidgets;
+    private Hashtable<Slot, SlotWidget> slotWidgets;
+    private Hashtable<Connection, ConnectionWidget> connectionWidgets;
+    private Hashtable<InputBlock, BlockWidget> blockWidgets;
+    private Widget hoverWidget;
+    private WidgetAction hoverAction;
+    private List<FigureWidget> selectedWidgets;
+    private Lookup lookup;
+    private InstanceContent content;
+    private Action[] actions;
+    private LayerWidget connectionLayer;
+    private JScrollPane scrollPane;
+    private UndoRedo.Manager undoRedoManager;
+    private LayerWidget mainLayer;
+    private LayerWidget slotLayer;
+    private LayerWidget blockLayer;
+    private double realZoomFactor;
+    private BoundedZoomAction zoomAction;
+    private WidgetAction panAction;
+    private Widget topLeft;
+    private Widget bottomRight;
+    private LayerWidget startLayer;
+    private LabelWidget startLabel;
+    private DiagramViewModel model;
+    private DiagramViewModel modelCopy;
+    public static final int AFTER = 1;
+    public static final int BEFORE = 1;
+    public static final float ALPHA = 0.4f;
+    public static final int GRID_SIZE = 30;
+    public static final int BORDER_SIZE = 20;
+    public static final int UNDOREDO_LIMIT = 100;
+    public static final int SCROLL_UNIT_INCREMENT = 80;
+    public static final int SCROLL_BLOCK_INCREMENT = 400;
+    public static final float ZOOM_MAX_FACTOR = 3.0f;
+    public static final float ZOOM_MIN_FACTOR = 0.0f;//0.15f;
+    public static final float ZOOM_INCREMENT = 1.5f;
+    public static final int SLOT_OFFSET = 6;
+    public static final int ANIMATION_LIMIT = 40;
+    private PopupMenuProvider popupMenuProvider = new PopupMenuProvider() {
+
+        public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+            return DiagramScene.this.createPopupMenu();
+        }
+    };
+    private RectangularSelectDecorator rectangularSelectDecorator = new RectangularSelectDecorator() {
+
+        public Widget createSelectionWidget() {
+            Widget widget = new Widget(DiagramScene.this);
+            widget.setBorder(BorderFactory.createLineBorder(Color.black, 2));
+            widget.setForeground(Color.red);
+            return widget;
+        }
+    };
+    private RectangularSelectProvider rectangularSelectProvider = new RectangularSelectProvider() {
+
+        public void performSelection(Rectangle rectangle) {
+            if (rectangle.width < 0) {
+                rectangle.x += rectangle.width;
+                rectangle.width *= -1;
+            }
+
+            if (rectangle.height < 0) {
+                rectangle.y += rectangle.height;
+                rectangle.height *= -1;
+            }
+
+            boolean updated = false;
+            for (Figure f : getModel().getDiagramToView().getFigures()) {
+                FigureWidget w = figureWidgets.get(f);
+                Rectangle r = new Rectangle(w.getBounds());
+                r.setLocation(w.getLocation());
+                if (r.intersects(rectangle)) {
+                    if (!selectedWidgets.contains(w)) {
+                        addToSelection(w);
+                        updated = true;
+                    }
+                } else {
+                    if (selectedWidgets.contains(w)) {
+                        selectedWidgets.remove(w);
+                        content.remove(w.getNode());
+                        w.setState(w.getState().deriveSelected(false));
+                        updated = true;
+                    }
+                }
+            }
+
+            if (updated) {
+                selectionUpdated();
+            }
+        }
+    };
+    private SelectProvider selectProvider = new SelectProvider() {
+
+        public boolean isAimingAllowed(Widget widget, Point point, boolean b) {
+            return false;
+        }
+
+        public boolean isSelectionAllowed(Widget widget, Point point, boolean b) {
+            return widget instanceof FigureWidget || widget == DiagramScene.this;
+        }
+
+        public void select(Widget w, Point point, boolean change) {
+
+            boolean updated = false;
+
+            if (w == DiagramScene.this) {
+                if (DiagramScene.this.selectedWidgets.size() != 0) {
+                    clearSelection();
+                    selectionUpdated();
+                }
+                return;
+            }
+
+            FigureWidget widget = (FigureWidget) w;
+
+
+            if (change) {
+                if (widget.getState().isSelected()) {
+                    assert selectedWidgets.contains(widget);
+                    widget.setState(widget.getState().deriveSelected(false));
+                    selectedWidgets.remove(widget);
+                    content.remove(widget.getNode());
+                    updated = true;
+                } else {
+                    assert !selectedWidgets.contains(widget);
+                    addToSelection(widget);
+                    updated = true;
+                    assert widget.getState().isSelected();
+                }
+            } else {
+
+                if (widget.getState().isSelected()) {
+                    assert selectedWidgets.contains(widget);
+                } else {
+
+                    assert !selectedWidgets.contains(widget);
+                    clearSelection();
+                    addToSelection(widget);
+                    updated = true;
+                    assert widget.getState().isSelected();
+                }
+            }
+
+            if (updated) {
+                selectionUpdated();
+            }
+
+        }
+    };
+
+    private FigureWidget getFigureWidget(Figure f) {
+        return figureWidgets.get(f);
+    }
+    private FocusListener focusListener = new FocusListener() {
+
+        public void focusGained(FocusEvent e) {
+            DiagramScene.this.getView().requestFocus();
+        }
+
+        public void focusLost(FocusEvent e) {
+        }
+    };
+    private MouseWheelListener mouseWheelListener = new MouseWheelListener() {
+
+        public void mouseWheelMoved(MouseWheelEvent e) {
+            DiagramScene.this.zoomAction.mouseWheelMoved(DiagramScene.this, new WidgetAction.WidgetMouseWheelEvent(0, e));
+            DiagramScene.this.validate();
+        }
+    };
+    private MouseListener mouseListener = new MouseListener() {
+
+        public void mouseClicked(MouseEvent e) {
+            DiagramScene.this.panAction.mouseClicked(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mousePressed(MouseEvent e) {
+            DiagramScene.this.panAction.mousePressed(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mouseReleased(MouseEvent e) {
+            DiagramScene.this.panAction.mouseReleased(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mouseEntered(MouseEvent e) {
+            DiagramScene.this.panAction.mouseEntered(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mouseExited(MouseEvent e) {
+            DiagramScene.this.panAction.mouseExited(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+    };
+    private MouseMotionListener mouseMotionListener = new MouseMotionListener() {
+
+        public void mouseDragged(MouseEvent e) {
+            DiagramScene.this.panAction.mouseDragged(DiagramScene.this, new WidgetAction.WidgetMouseEvent(0, e));
+        }
+
+        public void mouseMoved(MouseEvent e) {
+        }
+    };
+    private ScrollChangeListener scrollChangeListener = new ScrollChangeListener();
+
+    private class ScrollChangeListener implements ChangeListener {
+
+        private Map<Widget, Point> relativePositions = new HashMap<Widget, Point>();
+        private Point oldPosition;
+
+        public void register(Widget w, Point p) {
+            relativePositions.put(w, p);
+        }
+
+        public void unregister(Widget w) {
+            relativePositions.remove(w);
+        }
+
+        public void stateChanged(ChangeEvent e) {
+            Point p = DiagramScene.this.getScrollPane().getViewport().getViewPosition();
+            if (oldPosition == null || !p.equals(oldPosition)) {
+                for (Widget w : relativePositions.keySet()) {
+                    Point curPoint = relativePositions.get(w);
+                    Point newPoint = new Point(p.x + curPoint.x, p.y + curPoint.y);
+                    w.setPreferredLocation(newPoint);
+                    DiagramScene.this.validate();
+                }
+                oldPosition = p;
+            }
+        }
+    }
+
+    public Point getScrollPosition() {
+        return getScrollPane().getViewport().getViewPosition();
+    }
+
+    public void setScrollPosition(Point p) {
+        getScrollPane().getViewport().setViewPosition(p);
+    }
+
+    public DiagramScene(Action[] actions, DiagramViewModel model) {
+        this.actions = actions;
+        selectedWidgets = new ArrayList<FigureWidget>();
+        content = new InstanceContent();
+        lookup = new AbstractLookup(content);
+        this.setCheckClipping(true);
+        this.getInputBindings().setZoomActionModifiers(0);
+
+        JComponent comp = this.createView();
+        comp.setDoubleBuffered(true);
+        comp.setBackground(Color.WHITE);
+        comp.setOpaque(true);
+
+        this.setBackground(Color.WHITE);
+        this.setOpaque(true);
+        scrollPane = new JScrollPane(comp);
+        scrollPane.setBackground(Color.WHITE);
+        scrollPane.getVerticalScrollBar().setUnitIncrement(SCROLL_UNIT_INCREMENT);
+        scrollPane.getVerticalScrollBar().setBlockIncrement(SCROLL_BLOCK_INCREMENT);
+        scrollPane.getHorizontalScrollBar().setUnitIncrement(SCROLL_UNIT_INCREMENT);
+        scrollPane.getHorizontalScrollBar().setBlockIncrement(SCROLL_BLOCK_INCREMENT);
+        scrollPane.getViewport().addChangeListener(scrollChangeListener);
+        hoverAction = this.createWidgetHoverAction();
+
+        blockLayer = new LayerWidget(this);
+        this.addChild(blockLayer);
+
+        startLayer = new LayerWidget(this);
+        this.addChild(startLayer);
+        // TODO: String startLabelString = "Loading graph with " + originalDiagram.getFigures().size() + " figures and " + originalDiagram.getConnections().size() + " connections...";
+        String startLabelString = "";
+        LabelWidget w = new LabelWidget(this, startLabelString);
+        scrollChangeListener.register(w, new Point(10, 10));
+        w.setAlignment(LabelWidget.Alignment.CENTER);
+        startLabel = w;
+        startLayer.addChild(w);
+
+        mainLayer = new LayerWidget(this);
+        this.addChild(mainLayer);
+
+        topLeft = new Widget(this);
+        topLeft.setPreferredLocation(new Point(-BORDER_SIZE, -BORDER_SIZE));
+        this.addChild(topLeft);
+
+
+        bottomRight = new Widget(this);
+        bottomRight.setPreferredLocation(new Point(-BORDER_SIZE, -BORDER_SIZE));
+        this.addChild(bottomRight);
+
+        slotLayer = new LayerWidget(this);
+        this.addChild(slotLayer);
+
+        connectionLayer = new LayerWidget(this);
+        this.addChild(connectionLayer);
+
+        LayerWidget selectionLayer = new LayerWidget(this);
+        this.addChild(selectionLayer);
+
+        this.setLayout(LayoutFactory.createAbsoluteLayout());
+
+        this.getActions().addAction(hoverAction);
+        zoomAction = new BoundedZoomAction(1.1, false);
+        zoomAction.setMaxFactor(ZOOM_MAX_FACTOR);
+        zoomAction.setMinFactor(ZOOM_MIN_FACTOR);
+        this.getActions().addAction(ActionFactory.createMouseCenteredZoomAction(1.1));
+        panAction = new ExtendedPanAction();
+        this.getActions().addAction(panAction);
+        this.getActions().addAction(ActionFactory.createPopupMenuAction(popupMenuProvider));
+
+        LayerWidget selectLayer = new LayerWidget(this);
+        this.addChild(selectLayer);
+        this.getActions().addAction(ActionFactory.createRectangularSelectAction(rectangularSelectDecorator, selectLayer, rectangularSelectProvider));
+
+        blockWidgets = new Hashtable<InputBlock, BlockWidget>();
+
+        boolean b = this.getUndoRedoEnabled();
+        this.setUndoRedoEnabled(false);
+        this.setNewModel(model);
+        this.setUndoRedoEnabled(b);
+    }
+
+    private void selectionUpdated() {
+        getModel().setSelectedNodes(this.getSelectedNodes());
+        addUndo();
+    }
+
+    public DiagramViewModel getModel() {
+        return model;
+    }
+
+    public void setRealZoomFactor(double d) {
+        this.realZoomFactor = d;
+    }
+
+    public double getRealZoomFactor() {
+        if (realZoomFactor == 0.0) {
+            return getZoomFactor();
+        } else {
+            return realZoomFactor;
+        }
+    }
+
+    public JScrollPane getScrollPane() {
+        return scrollPane;
+    }
+
+    public boolean isAllVisible() {
+        return getModel().getHiddenNodes().size() == 0;
+    }
+
+    public Action createGotoAction(final Figure f) {
+        final DiagramScene diagramScene = this;
+        Action a = new AbstractAction() {
+
+            public void actionPerformed(ActionEvent e) {
+                diagramScene.gotoFigure(f);
+            }
+        };
+
+        a.setEnabled(true);
+        a.putValue(Action.SMALL_ICON, new ColorIcon(f.getColor()));
+        String name = f.getLines()[0];
+
+        name += " (";
+
+        if (f.getCluster() != null) {
+            name += "B" + f.getCluster().toString();
+        }
+        if (!this.getFigureWidget(f).isVisible()) {
+            if (f.getCluster() != null) {
+                name += ", ";
+            }
+            name += "hidden";
+        }
+        name += ")";
+        a.putValue(Action.NAME, name);
+        return a;
+    }
+
+    public void setNewModel(DiagramViewModel model) {
+        if (this.model != null) {
+            this.model.getDiagramChangedEvent().removeListener(this);
+            this.model.getViewPropertiesChangedEvent().removeListener(this);
+        }
+        this.model = model;
+
+        if (this.model == null) {
+            this.modelCopy = null;
+        } else {
+            this.modelCopy = this.model.copy();
+        }
+
+        model.getDiagramChangedEvent().addListener(this);
+        model.getViewPropertiesChangedEvent().addListener(this);
+
+        update();
+    }
+
+    private void update() {
+
+        /*if (startLabel != null) {
+        // Animate fade-out
+        final LabelWidget labelWidget = this.startLabel;
+        labelWidget.setVisible(true);
+        RequestProcessor.getDefault().post(new Runnable() {
+        public void run() {
+        final int Sleep = 200;
+        final int Progress = 10;
+        for (int i = 0; i < 255 / Progress + 1; i++) {
+        try {
+        SwingUtilities.invokeAndWait(new Runnable() {
+        public void run() {
+        Color c = labelWidget.getForeground();
+        int v = c.getRed();
+        v += Progress;
+        if (v > 255) {
+        v = 255;
+        }
+        labelWidget.setForeground(new Color(v, v, v, 255 - v));
+        labelWidget.getScene().validate();
+        }
+        });
+        } catch (InterruptedException ex) {
+        } catch (InvocationTargetException ex) {
+        }
+        try {
+        Thread.sleep(Sleep);
+        } catch (InterruptedException ex) {
+        }
+        }
+        labelWidget.setVisible(false);
+        DiagramScene.this.scrollChangeListener.unregister(labelWidget);
+        }
+        }, 1000);
+        startLabel = null;
+        }*/
+
+        slotLayer.removeChildren();
+        mainLayer.removeChildren();
+        blockLayer.removeChildren();
+
+        blockWidgets.clear();
+        figureWidgets = new Hashtable<Figure, FigureWidget>();
+        slotWidgets = new Hashtable<Slot, SlotWidget>();
+        connectionWidgets = new Hashtable<Connection, ConnectionWidget>();
+
+        WidgetAction selectAction = new ExtendedSelectAction(selectProvider);
+        Diagram d = getModel().getDiagramToView();
+
+        if (getModel().getShowBlocks()) {
+            Scheduler s = Lookup.getDefault().lookup(Scheduler.class);
+            Collection<InputBlock> newBlocks = new ArrayList<InputBlock>(s.schedule(d.getGraph()));
+            d.schedule(newBlocks);
+        }
+
+        for (Figure f : d.getFigures()) {
+            FigureWidget w = new FigureWidget(f, this, mainLayer);
+            w.getActions().addAction(selectAction);
+            w.getActions().addAction(hoverAction);
+            w.getActions().addAction(ActionFactory.createPopupMenuAction(w));
+            w.getActions().addAction(new DoubleClickAction(w));
+            w.setVisible(false);
+
+            figureWidgets.put(f, w);
+
+            for (InputSlot s : f.getInputSlots()) {
+                SlotWidget sw = new InputSlotWidget(s, this, slotLayer, w);
+                slotWidgets.put(s, sw);
+                sw.getActions().addAction(selectAction);
+            }
+
+            for (OutputSlot s : f.getOutputSlots()) {
+                SlotWidget sw = new OutputSlotWidget(s, this, slotLayer, w);
+                slotWidgets.put(s, sw);
+                sw.getActions().addAction(selectAction);
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (InputBlock bn : d.getGraph().getBlocks()) {
+                BlockWidget w = new BlockWidget(this, d, bn);
+                w.setVisible(false);
+                blockWidgets.put(bn, w);
+                blockLayer.addChild(w);
+            }
+        }
+
+        this.smallUpdate(true);
+
+    }
+
+    private void smallUpdate(boolean relayout) {
+
+        this.updateHiddenNodes(model.getHiddenNodes(), relayout);
+        boolean b = this.getUndoRedoEnabled();
+        this.setUndoRedoEnabled(false);
+        this.setSelection(getModel().getSelectedNodes());
+        this.setUndoRedoEnabled(b);
+        this.validate();
+    }
+
+    private boolean isVisible(Connection c) {
+        FigureWidget w1 = figureWidgets.get(c.getInputSlot().getFigure());
+        FigureWidget w2 = figureWidgets.get(c.getOutputSlot().getFigure());
+
+        if (w1.isVisible() && w2.isVisible()) {
+            return true;
+        }
+
+        return false;
+    }
+
+    private void relayout(Set<Widget> oldVisibleWidgets) {
+
+        Diagram diagram = getModel().getDiagramToView();
+
+        HashSet<Figure> figures = new HashSet<Figure>();
+
+        for (Figure f : diagram.getFigures()) {
+            FigureWidget w = figureWidgets.get(f);
+            if (w.isVisible()) {
+                figures.add(f);
+            }
+        }
+
+        HashSet<Connection> edges = new HashSet<Connection>();
+
+        for (Connection c : diagram.getConnections()) {
+            if (isVisible(c)) {
+                edges.add(c);
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            HierarchicalClusterLayoutManager m = new HierarchicalClusterLayoutManager(OldHierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+            HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+            manager.setMaxLayerLength(9);
+            manager.setMinLayerDifference(3);
+            m.setManager(manager);
+            m.setSubManager(new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS));
+            m.doLayout(new LayoutGraph(edges, figures));
+
+        } else {
+            HierarchicalLayoutManager manager = new HierarchicalLayoutManager(HierarchicalLayoutManager.Combine.SAME_OUTPUTS);
+            manager.setMaxLayerLength(10);
+            manager.doLayout(new LayoutGraph(edges, figures));
+        }
+
+        int maxX = -BORDER_SIZE;
+        int maxY = -BORDER_SIZE;
+        for (Figure f : diagram.getFigures()) {
+            FigureWidget w = figureWidgets.get(f);
+            if (w.isVisible()) {
+                Point p = f.getPosition();
+                Dimension d = f.getSize();
+                maxX = Math.max(maxX, p.x + d.width);
+                maxY = Math.max(maxY, p.y + d.height);
+            }
+        }
+
+        for (Connection c : diagram.getConnections()) {
+            List<Point> points = c.getControlPoints();
+            FigureWidget w1 = figureWidgets.get((Figure) c.getTo().getVertex());
+            FigureWidget w2 = figureWidgets.get((Figure) c.getFrom().getVertex());
+            if (w1.isVisible() && w2.isVisible()) {
+                for (Point p : points) {
+                    if (p != null) {
+                        maxX = Math.max(maxX, p.x);
+                        maxY = Math.max(maxY, p.y);
+                    }
+                }
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (Block b : diagram.getBlocks()) {
+                BlockWidget w = blockWidgets.get(b.getInputBlock());
+                if (w != null && w.isVisible()) {
+                    Rectangle r = b.getBounds();
+                    maxX = Math.max(maxX, r.x + r.width);
+                    maxY = Math.max(maxY, r.y + r.height);
+                }
+            }
+        }
+
+        bottomRight.setPreferredLocation(new Point(maxX + BORDER_SIZE, maxY + BORDER_SIZE));
+        int offx = 0;
+        int offy = 0;
+        int curWidth = maxX + 2 * BORDER_SIZE;
+        int curHeight = maxY + 2 * BORDER_SIZE;
+
+        Rectangle bounds = this.getScrollPane().getBounds();
+        if (curWidth < bounds.width) {
+            offx = (bounds.width - curWidth) / 2;
+        }
+
+        if (curHeight < bounds.height) {
+            offy = (bounds.height - curHeight) / 2;
+        }
+
+        final int offx2 = offx;
+        final int offy2 = offy;
+
+        SceneAnimator animator = this.getSceneAnimator();
+        connectionLayer.removeChildren();
+        int visibleFigureCount = 0;
+        for (Figure f : diagram.getFigures()) {
+            if (figureWidgets.get(f).isVisible()) {
+                visibleFigureCount++;
+            }
+        }
+
+        for (Figure f : diagram.getFigures()) {
+            for (OutputSlot s : f.getOutputSlots()) {
+                SceneAnimator anim = animator;
+                if (visibleFigureCount > ANIMATION_LIMIT) {
+                    anim = null;
+                }
+                processOutputSlot(s, s.getConnections(), 0, null, null, offx2, offy2, anim);
+            }
+        }
+
+        for (Figure f : diagram.getFigures()) {
+            FigureWidget w = figureWidgets.get(f);
+            if (w.isVisible()) {
+                Point p = f.getPosition();
+                Point p2 = new Point(p.x + offx2, p.y + offy2);
+                Rectangle r = new Rectangle(p.x + offx2, p.y + offy2, f.getSize().width, f.getSize().height);
+                if (oldVisibleWidgets.contains(w)) {
+                    if (visibleFigureCount > ANIMATION_LIMIT) {
+                        w.setPreferredLocation(p2);
+                    } else {
+                        animator.animatePreferredLocation(w, p2);
+                    }
+                } else {
+                    w.setPreferredLocation(p2);
+                }
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (Block b : diagram.getBlocks()) {
+                BlockWidget w = blockWidgets.get(b.getInputBlock());
+                if (w != null && w.isVisible()) {
+                    Point location = new Point(b.getBounds().x + offx2, b.getBounds().y + offy2);
+                    Rectangle r = new Rectangle(location.x, location.y, b.getBounds().width, b.getBounds().height);
+                    if (oldVisibleWidgets.contains(w)) {
+                        if (visibleFigureCount > ANIMATION_LIMIT) {
+                            w.setPreferredBounds(r);
+                        } else {
+                            animator.animatePreferredBounds(w, r);
+                        }
+                    } else {
+                        w.setPreferredBounds(r);
+                    }
+                }
+            }
+        }
+    }
+    private final Point specialNullPoint = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE);
+
+    private void processOutputSlot(OutputSlot s, List<Connection> connections, int controlPointIndex, Point lastPoint, LineWidget predecessor, int offx, int offy, SceneAnimator animator) {
+        Map<Point, List<Connection>> pointMap = new HashMap<Point, List<Connection>>();
+
+        for (Connection c : connections) {
+
+            if (!isVisible(c)) {
+                continue;
+            }
+
+            List<Point> controlPoints = c.getControlPoints();
+            if (controlPointIndex >= controlPoints.size()) {
+                continue;
+            }
+
+            Point cur = controlPoints.get(controlPointIndex);
+            if (cur == null) {
+                cur = specialNullPoint;
+            } else if (controlPointIndex == 0 && !s.getShowName()) {
+                cur = new Point(cur.x, cur.y - SLOT_OFFSET);
+            } else if (controlPointIndex == controlPoints.size() - 1 && !c.getInputSlot().getShowName()) {
+                cur = new Point(cur.x, cur.y + SLOT_OFFSET);
+            }
+
+            if (pointMap.containsKey(cur)) {
+                pointMap.get(cur).add(c);
+            } else {
+                List<Connection> newList = new ArrayList<Connection>(2);
+                newList.add(c);
+                pointMap.put(cur, newList);
+            }
+
+        }
+
+        for (Point p : pointMap.keySet()) {
+            List<Connection> connectionList = pointMap.get(p);
+
+            boolean isBold = false;
+            boolean isDashed = true;
+
+            for (Connection c : connectionList) {
+
+                if (c.getStyle() == Connection.ConnectionStyle.BOLD) {
+                    isBold = true;
+                }
+
+                if (c.getStyle() != Connection.ConnectionStyle.DASHED) {
+                    isDashed = false;
+                }
+            }
+
+            LineWidget newPredecessor = predecessor;
+            if (p == specialNullPoint) {
+
+            } else if (lastPoint == specialNullPoint) {
+
+            } else if (lastPoint != null) {
+                Point p1 = new Point(lastPoint.x + offx, lastPoint.y + offy);
+                Point p2 = new Point(p.x + offx, p.y + offy);
+                LineWidget w = new LineWidget(this, s, connectionList, p1, p2, predecessor, animator, isBold, isDashed);
+                newPredecessor = w;
+                connectionLayer.addChild(w);
+                w.getActions().addAction(hoverAction);
+            }
+
+            processOutputSlot(s, connectionList, controlPointIndex + 1, p, newPredecessor, offx, offy, animator);
+        }
+    }
+
+    private void clearSelection() {
+        if (selectedWidgets.size() == 0) {
+            return;
+        }
+        for (FigureWidget w : selectedWidgets) {
+            assert w.getState().isSelected();
+            w.setState(w.getState().deriveSelected(false));
+            content.remove(w.getNode());
+        }
+        selectedWidgets.clear();
+    }
+
+    public Lookup getLookup() {
+        return lookup;
+    }
+
+    public void gotoFigures(final List<Figure> figures) {
+        Rectangle overall = null;
+        showFigures(figures);
+        for (Figure f : figures) {
+
+            FigureWidget fw = getFigureWidget(f);
+            if (fw != null) {
+                Rectangle r = fw.getBounds();
+                Point p = fw.getLocation();
+                Rectangle r2 = new Rectangle(p.x, p.y, r.width, r.height);
+
+                if (overall == null) {
+                    overall = r2;
+                } else {
+                    overall = overall.union(r2);
+                }
+            }
+        }
+        if (overall != null) {
+            centerRectangle(overall);
+        }
+    }
+
+    private Point calcCenter(Rectangle r) {
+
+        Point center = new Point((int) r.getCenterX(), (int) r.getCenterY());
+        center.x -= getScrollPane().getViewport().getViewRect().width / 2;
+        center.y -= getScrollPane().getViewport().getViewRect().height / 2;
+
+        // Ensure to be within area
+        center.x = Math.max(0, center.x);
+        center.x = Math.min(getScrollPane().getViewport().getViewSize().width - getScrollPane().getViewport().getViewRect().width, center.x);
+        center.y = Math.max(0, center.y);
+        center.y = Math.min(getScrollPane().getViewport().getViewSize().height - getScrollPane().getViewport().getViewRect().height, center.y);
+
+        return center;
+    }
+
+    private void centerRectangle(Rectangle r) {
+
+        if (getScrollPane().getViewport().getViewRect().width == 0 || getScrollPane().getViewport().getViewRect().height == 0) {
+            return;
+        }
+
+        Rectangle r2 = new Rectangle(r.x, r.y, r.width, r.height);
+        r2 = convertSceneToView(r2);
+
+        double factorX = (double) r2.width / (double) getScrollPane().getViewport().getViewRect().width;
+        double factorY = (double) r2.height / (double) getScrollPane().getViewport().getViewRect().height;
+        double factor = Math.max(factorX, factorY);
+        if (factor >= 1.0) {
+            Point p = getScrollPane().getViewport().getViewPosition();
+            setZoomFactor(getZoomFactor() / factor);
+            r2.x /= factor;
+            r2.y /= factor;
+            r2.width /= factor;
+            r2.height /= factor;
+            getScrollPane().getViewport().setViewPosition(calcCenter(r2));
+        } else {
+            getScrollPane().getViewport().setViewPosition(calcCenter(r2));
+        }
+    }
+
+    private void addToSelection(Figure f) {
+        FigureWidget w = getFigureWidget(f);
+        addToSelection(w);
+    }
+
+    private void addToSelection(FigureWidget w) {
+        assert !selectedWidgets.contains(w);
+        selectedWidgets.add(w);
+        content.add(w.getNode());
+        w.setState(w.getState().deriveSelected(true));
+    }
+
+    private void setSelection(Set<Integer> nodes) {
+        clearSelection();
+        for (Figure f : getModel().getDiagramToView().getFigures()) {
+            if (doesIntersect(f.getSource().getSourceNodesAsSet(), nodes)) {
+                addToSelection(f);
+            }
+        }
+        selectionUpdated();
+        this.validate();
+    }
+
+    public void setSelection(Collection<Figure> list) {
+        clearSelection();
+        for (Figure f : list) {
+            addToSelection(f);
+        }
+
+        selectionUpdated();
+        this.validate();
+    }
+
+    public Set<Figure> getSelectedFigures() {
+        Set<Figure> result = new HashSet<Figure>();
+        for (Widget w : selectedWidgets) {
+            if (w instanceof FigureWidget) {
+                FigureWidget fw = (FigureWidget) w;
+                if (fw.getState().isSelected()) {
+                    result.add(fw.getFigure());
+                }
+            }
+        }
+        return result;
+    }
+
+    public Set<Integer> getSelectedNodes() {
+        Set<Integer> result = new HashSet<Integer>();
+        for (Widget w : selectedWidgets) {
+            if (w instanceof FigureWidget) {
+                FigureWidget fw = (FigureWidget) w;
+                if (fw.getState().isSelected()) {
+                    result.addAll(fw.getFigure().getSource().getSourceNodesAsSet());
+                }
+            }
+        }
+        return result;
+    }
+
+    private UndoRedo.Manager getUndoRedoManager() {
+        if (undoRedoManager == null) {
+            undoRedoManager = new UndoRedo.Manager();
+            undoRedoManager.setLimit(UNDOREDO_LIMIT);
+        }
+
+        return undoRedoManager;
+    }
+
+    public UndoRedo getUndoRedo() {
+        return getUndoRedoManager();
+    }
+
+    private boolean isVisible(Figure f) {
+        for (Integer n : f.getSource().getSourceNodesAsSet()) {
+            if (getModel().getHiddenNodes().contains(n)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean doesIntersect(Set s1, Set s2) {
+        if (s1.size() > s2.size()) {
+            Set tmp = s1;
+            s1 = s2;
+            s2 = tmp;
+        }
+
+        for (Object o : s1) {
+            if (s2.contains(o)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public void showNot(final Set<Integer> nodes) {
+        updateHiddenNodes(nodes, true);
+    }
+
+    public void showOnly(final Set<Integer> nodes) {
+        HashSet<Integer> allNodes = new HashSet<Integer>(getModel().getGraphToView().getGroup().getAllNodes());
+        allNodes.removeAll(nodes);
+        updateHiddenNodes(allNodes, true);
+    }
+
+    private void updateHiddenNodes(Set<Integer> newHiddenNodes, boolean doRelayout) {
+
+        Set<InputBlock> visibleBlocks = new HashSet<InputBlock>();
+
+        Diagram diagram = getModel().getDiagramToView();
+        assert diagram != null;
+
+        Set<Widget> oldVisibleWidgets = new HashSet<Widget>();
+
+        for (Figure f : diagram.getFigures()) {
+            FigureWidget w = figureWidgets.get(f);
+            if (w.isVisible()) {
+                oldVisibleWidgets.add(w);
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (InputBlock b : diagram.getGraph().getBlocks()) {
+                BlockWidget w = blockWidgets.get(b);
+                if (w.isVisible()) {
+                    oldVisibleWidgets.add(w);
+                }
+            }
+        }
+
+        for (Figure f : diagram.getFigures()) {
+            boolean hiddenAfter = doesIntersect(f.getSource().getSourceNodesAsSet(), newHiddenNodes);
+
+            FigureWidget w = this.figureWidgets.get(f);
+            w.setBoundary(false);
+            if (!hiddenAfter) {
+                // Figure is shown
+                w.setVisible(true);
+                for (InputNode n : f.getSource().getSourceNodes()) {
+                    visibleBlocks.add(diagram.getGraph().getBlock(n));
+                }
+            } else {
+                // Figure is hidden
+                w.setVisible(false);
+            }
+        }
+
+        if (getModel().getShowNodeHull()) {
+            List<FigureWidget> boundaries = new ArrayList<FigureWidget>();
+            for (Figure f : diagram.getFigures()) {
+                FigureWidget w = this.figureWidgets.get(f);
+                if (!w.isVisible()) {
+                    Set<Figure> set = new HashSet<Figure>(f.getPredecessorSet());
+                    set.addAll(f.getSuccessorSet());
+
+                    boolean b = false;
+                    for (Figure neighbor : set) {
+                        FigureWidget neighborWidget = figureWidgets.get(neighbor);
+                        if (neighborWidget.isVisible()) {
+                            b = true;
+                            break;
+                        }
+                    }
+
+                    if (b) {
+                        w.setBoundary(true);
+                        for (InputNode n : f.getSource().getSourceNodes()) {
+                            visibleBlocks.add(diagram.getGraph().getBlock(n));
+                        }
+                        boundaries.add(w);
+                    }
+                }
+            }
+
+            for (FigureWidget w : boundaries) {
+                if (w.isBoundary()) {
+                    w.setVisible(true);
+                }
+            }
+        }
+
+        if (getModel().getShowBlocks()) {
+            for (InputBlock b : diagram.getGraph().getBlocks()) {
+
+                boolean visibleAfter = visibleBlocks.contains(b);
+
+                BlockWidget w = blockWidgets.get(b);
+                if (visibleAfter) {
+                    // Block must be shown
+                    w.setVisible(true);
+                } else {
+                    // Block must be hidden
+                    w.setVisible(false);
+                }
+            }
+        }
+
+        getModel().setHiddenNodes(newHiddenNodes);
+        if (doRelayout) {
+            relayout(oldVisibleWidgets);
+        }
+        this.validate();
+        addUndo();
+    }
+
+    private void showFigures(Collection<Figure> f) {
+        HashSet<Integer> newHiddenNodes = new HashSet<Integer>(getModel().getHiddenNodes());
+        for (Figure fig : f) {
+            newHiddenNodes.removeAll(fig.getSource().getSourceNodesAsSet());
+        }
+        updateHiddenNodes(newHiddenNodes, true);
+    }
+
+    private void showFigure(Figure f) {
+        HashSet<Integer> newHiddenNodes = new HashSet<Integer>(getModel().getHiddenNodes());
+        newHiddenNodes.removeAll(f.getSource().getSourceNodesAsSet());
+        updateHiddenNodes(newHiddenNodes, true);
+    }
+
+    public void showAll(final Collection<Figure> f) {
+        showFigures(f);
+
+    }
+
+    public void show(final Figure f) {
+        showFigure(f);
+    }
+
+    public void gotoFigure(final Figure f) {
+
+        if (!isVisible(f)) {
+            showFigure(f);
+        }
+
+        FigureWidget fw = getFigureWidget(f);
+        if (fw != null) {
+            Rectangle r = fw.getBounds();
+            Point p = fw.getLocation();
+            centerRectangle(new Rectangle(p.x, p.y, r.width, r.height));
+
+            // Select figure
+            clearSelection();
+            addToSelection(fw);
+            selectionUpdated();
+        }
+    }
+
+    public JPopupMenu createPopupMenu() {
+        JPopupMenu menu = new JPopupMenu();
+        for (Action a : actions) {
+            if (a == null) {
+                menu.addSeparator();
+            } else {
+                menu.add(a);
+            }
+        }
+        return menu;
+    }
+
+    private static class DiagramUndoRedo extends AbstractUndoableEdit implements ChangedListener<DiagramViewModel> {
+
+        private DiagramViewModel oldModel;
+        private DiagramViewModel newModel;
+        private Point oldScrollPosition;
+        private DiagramScene scene;
+
+        public DiagramUndoRedo(DiagramScene scene, Point oldScrollPosition, DiagramViewModel oldModel, DiagramViewModel newModel) {
+            assert oldModel != null;
+            assert newModel != null;
+            this.oldModel = oldModel;
+            this.newModel = newModel;
+            this.scene = scene;
+            this.oldScrollPosition = oldScrollPosition;
+        }
+
+        @Override
+        public void redo() throws CannotRedoException {
+            super.redo();
+            boolean b = scene.getUndoRedoEnabled();
+            scene.setUndoRedoEnabled(false);
+            scene.getModel().getViewChangedEvent().addListener(this);
+            scene.getModel().setData(newModel);
+            scene.getModel().getViewChangedEvent().removeListener(this);
+            scene.setUndoRedoEnabled(b);
+        }
+
+        @Override
+        public void undo() throws CannotUndoException {
+            super.undo();
+            boolean b = scene.getUndoRedoEnabled();
+            scene.setUndoRedoEnabled(false);
+            scene.getModel().getViewChangedEvent().addListener(this);
+            scene.getModel().setData(oldModel);
+            scene.getModel().getViewChangedEvent().removeListener(this);
+
+            SwingUtilities.invokeLater(new Runnable() {
+
+                public void run() {
+                    scene.setScrollPosition(oldScrollPosition);
+                }
+            });
+
+            scene.setUndoRedoEnabled(b);
+        }
+
+        public void changed(DiagramViewModel source) {
+            scene.getModel().getViewChangedEvent().removeListener(this);
+            if (oldModel.getSelectedNodes().equals(newModel.getHiddenNodes())) {
+                scene.smallUpdate(false);
+            } else {
+                scene.smallUpdate(true);
+            }
+        }
+    }
+    private boolean undoRedoEnabled = true;
+
+    public void setUndoRedoEnabled(boolean b) {
+        this.undoRedoEnabled = b;
+    }
+
+    public boolean getUndoRedoEnabled() {
+        return undoRedoEnabled;
+    }
+
+    public void changed(DiagramViewModel source) {
+        assert source == model : "Receive only changed event from current model!";
+        assert source != null;
+        update();
+    }
+
+    private void addUndo() {
+
+        DiagramViewModel newModelCopy = model.copy();
+
+        if (undoRedoEnabled) {
+            this.getUndoRedoManager().undoableEditHappened(new UndoableEditEvent(this, new DiagramUndoRedo(this, this.getScrollPosition(), modelCopy, newModelCopy)));
+        }
+
+        this.modelCopy = newModelCopy;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,303 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.Group;
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.difference.Difference;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.data.ChangedEvent;
+import com.sun.hotspot.igv.util.RangeSliderModel;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.settings.Settings;
+import java.awt.Color;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramViewModel extends RangeSliderModel implements ChangedListener<RangeSliderModel> {
+
+    // Warning: Update setData method if fields are added
+    private Group group;
+    private Set<Integer> hiddenNodes;
+    private Set<Integer> onScreenNodes;
+    private Set<Integer> selectedNodes;
+    private FilterChain filterChain;
+    private FilterChain sequenceFilterChain;
+    private Diagram diagram;
+    private ChangedEvent<DiagramViewModel> diagramChangedEvent;
+    private ChangedEvent<DiagramViewModel> viewChangedEvent;
+    private ChangedEvent<DiagramViewModel> viewPropertiesChangedEvent;
+    private boolean showBlocks;
+    private boolean showNodeHull;
+    private ChangedListener<FilterChain> filterChainChangedListener = new ChangedListener<FilterChain>() {
+
+        public void changed(FilterChain source) {
+            diagramChanged();
+        }
+    };
+
+    public DiagramViewModel copy() {
+        DiagramViewModel result = new DiagramViewModel(group, filterChain, sequenceFilterChain);
+        result.setData(this);
+        return result;
+    }
+
+    public void setData(DiagramViewModel newModel) {
+        super.setData(newModel);
+        boolean diagramChanged = false;
+        boolean viewChanged = false;
+        boolean viewPropertiesChanged = false;
+
+        this.group = newModel.group;
+        diagramChanged |= (filterChain != newModel.filterChain);
+        this.filterChain = newModel.filterChain;
+        diagramChanged |= (sequenceFilterChain != newModel.sequenceFilterChain);
+        this.sequenceFilterChain = newModel.sequenceFilterChain;
+        diagramChanged |= (diagram != newModel.diagram);
+        this.diagram = newModel.diagram;
+        viewChanged |= (hiddenNodes != newModel.hiddenNodes);
+        this.hiddenNodes = newModel.hiddenNodes;
+        viewChanged |= (onScreenNodes != newModel.onScreenNodes);
+        this.onScreenNodes = newModel.onScreenNodes;
+        viewChanged |= (selectedNodes != newModel.selectedNodes);
+        this.selectedNodes = newModel.selectedNodes;
+        viewPropertiesChanged |= (showBlocks != newModel.showBlocks);
+        this.showBlocks = newModel.showBlocks;
+        viewPropertiesChanged |= (showNodeHull != newModel.showNodeHull);
+        this.showNodeHull = newModel.showNodeHull;
+
+        if (diagramChanged) {
+            diagramChangedEvent.fire();
+        }
+        if (viewPropertiesChanged) {
+            viewPropertiesChangedEvent.fire();
+        }
+        if (viewChanged) {
+            viewChangedEvent.fire();
+        }
+    }
+
+    public boolean getShowBlocks() {
+        return showBlocks;
+    }
+
+    public void setShowBlocks(boolean b) {
+        showBlocks = b;
+        viewPropertiesChangedEvent.fire();
+    }
+
+    public boolean getShowNodeHull() {
+        return showNodeHull;
+    }
+
+    public void setShowNodeHull(boolean b) {
+        showNodeHull = b;
+        viewPropertiesChangedEvent.fire();
+    }
+
+    public DiagramViewModel(Group g, FilterChain filterChain, FilterChain sequenceFilterChain) {
+        super(calculateStringList(g));
+
+        this.showNodeHull = true;
+        this.showBlocks = true;
+        this.group = g;
+        assert filterChain != null;
+        this.filterChain = filterChain;
+        assert sequenceFilterChain != null;
+        this.sequenceFilterChain = sequenceFilterChain;
+        hiddenNodes = new HashSet<Integer>();
+        onScreenNodes = new HashSet<Integer>();
+        selectedNodes = new HashSet<Integer>();
+        super.getChangedEvent().addListener(this);
+        diagramChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+        viewChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+        viewPropertiesChangedEvent = new ChangedEvent<DiagramViewModel>(this);
+
+        filterChain.getChangedEvent().addListener(filterChainChangedListener);
+        sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener);
+    }
+
+    public ChangedEvent<DiagramViewModel> getDiagramChangedEvent() {
+        return diagramChangedEvent;
+    }
+
+    public ChangedEvent<DiagramViewModel> getViewChangedEvent() {
+        return viewChangedEvent;
+    }
+
+    public ChangedEvent<DiagramViewModel> getViewPropertiesChangedEvent() {
+        return viewPropertiesChangedEvent;
+    }
+
+    public Set<Integer> getSelectedNodes() {
+        return Collections.unmodifiableSet(selectedNodes);
+    }
+
+    public Set<Integer> getHiddenNodes() {
+        return Collections.unmodifiableSet(hiddenNodes);
+    }
+
+    public Set<Integer> getOnScreenNodes() {
+        return Collections.unmodifiableSet(onScreenNodes);
+    }
+
+    public void setSelectedNodes(Set<Integer> nodes) {
+        this.selectedNodes = nodes;
+        List<Color> colors = new ArrayList<Color>();
+        for (String s : getPositions()) {
+            colors.add(Color.black);
+        }
+        if (nodes.size() >= 1) {
+            for (Integer id : nodes) {
+                if (id < 0) {
+                    id = -id;
+                }
+                InputNode last = null;
+                int index = 0;
+                for (InputGraph g : group.getGraphs()) {
+                    Color curColor = colors.get(index);
+                    InputNode cur = g.getNode(id);
+                    if (cur != null) {
+                        if (last == null) {
+                            curColor = Color.green;
+                        } else {
+                            if (last.equals(cur)) {
+                                if (curColor == Color.black) {
+                                    curColor = Color.white;
+                                }
+                            } else {
+                                if (curColor != Color.green) {
+                                    curColor = Color.orange;
+                                }
+                            }
+                        }
+                    }
+                    last = cur;
+                    colors.set(index, curColor);
+                    index++;
+                }
+            }
+            this.setColors(colors);
+        }
+        setColors(colors);
+        viewChangedEvent.fire();
+    }
+
+    public void setHiddenNodes(Set<Integer> nodes) {
+        this.hiddenNodes = nodes;
+        viewChangedEvent.fire();
+    }
+
+    public void setOnScreenNodes(Set<Integer> onScreenNodes) {
+        this.onScreenNodes = onScreenNodes;
+        viewChangedEvent.fire();
+    }
+
+    public FilterChain getSequenceFilterChain() {
+        return filterChain;
+    }
+
+    public void setSequenceFilterChain(FilterChain chain) {
+        assert chain != null : "sequenceFilterChain must never be null";
+        sequenceFilterChain.getChangedEvent().removeListener(filterChainChangedListener);
+        sequenceFilterChain = chain;
+        sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener);
+        diagramChanged();
+    }
+
+    private void diagramChanged() {
+        // clear diagram
+        diagram = null;
+        getDiagramChangedEvent().fire();
+
+    }
+
+    public FilterChain getFilterChain() {
+        return filterChain;
+    }
+
+    public void setFilterChain(FilterChain chain) {
+        assert chain != null : "filterChain must never be null";
+        filterChain.getChangedEvent().removeListener(filterChainChangedListener);
+        filterChain = chain;
+        filterChain.getChangedEvent().addListener(filterChainChangedListener);
+        diagramChanged();
+    }
+
+    private static List<String> calculateStringList(Group g) {
+        List<String> result = new ArrayList<String>();
+        for (InputGraph graph : g.getGraphs()) {
+            result.add(graph.getName());
+        }
+        return result;
+    }
+
+    public InputGraph getFirstGraph() {
+        return group.getGraphs().get(getFirstPosition());
+    }
+
+    public InputGraph getSecondGraph() {
+        return group.getGraphs().get(getSecondPosition());
+    }
+
+    public void selectGraph(InputGraph g) {
+        int index = group.getGraphs().indexOf(g);
+        assert index != -1;
+        setPositions(index, index);
+    }
+
+    public Diagram getDiagramToView() {
+
+        if (diagram == null) {
+            diagram = Diagram.createDiagram(getGraphToView(), Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+            getFilterChain().apply(diagram, getSequenceFilterChain());
+        }
+
+        return diagram;
+    }
+
+    public InputGraph getGraphToView() {
+        if (getFirstGraph() != getSecondGraph()) {
+            InputGraph inputGraph = Difference.createDiffGraph(getSecondGraph(), getFirstGraph());
+            return inputGraph;
+        } else {
+            InputGraph inputGraph = getFirstGraph();
+            return inputGraph;
+        }
+    }
+
+    public void changed(RangeSliderModel source) {
+        diagramChanged();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.InputGraphProvider;
+import com.sun.hotspot.igv.data.InputNode;
+import java.util.Set;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EditorInputGraphProvider implements InputGraphProvider {
+
+    public InputGraph getGraph() {
+        EditorTopComponent e = EditorTopComponent.getActive();
+        if (e == null) {
+            return null;
+        }
+        return e.getDiagramModel().getGraphToView();
+    }
+
+    public void setSelectedNodes(Set<InputNode> nodes) {
+        EditorTopComponent e = EditorTopComponent.getActive();
+        if (e != null) {
+            e.setSelectedNodes(nodes);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.form	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Component class="javax.swing.JCheckBox" name="jCheckBox1">
+      <Properties>
+        <Property name="text" type="java.lang.String" value="jCheckBox1"/>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+            <EmptyBorder bottom="0" left="0" right="0" top="0"/>
+          </Border>
+        </Property>
+        <Property name="margin" type="java.awt.Insets" editor="org.netbeans.beaninfo.editors.InsetsEditor">
+          <Insets value="[0, 0, 0, 0]"/>
+        </Property>
+      </Properties>
+    </Component>
+  </NonVisualComponents>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+    <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+  </AuxValues>
+
+  <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+</Form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,577 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputNode;
+import com.sun.hotspot.igv.filter.FilterChain;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.actions.EnableBlockLayoutAction;
+import com.sun.hotspot.igv.view.actions.ExpandPredecessorsAction;
+import com.sun.hotspot.igv.view.actions.ExpandSuccessorsAction;
+import com.sun.hotspot.igv.view.actions.ExtractAction;
+import com.sun.hotspot.igv.view.actions.HideAction;
+import com.sun.hotspot.igv.view.actions.NextDiagramAction;
+import com.sun.hotspot.igv.view.actions.NodeFindAction;
+import com.sun.hotspot.igv.view.actions.OverviewAction;
+import com.sun.hotspot.igv.view.actions.PredSuccAction;
+import com.sun.hotspot.igv.view.actions.PrevDiagramAction;
+import com.sun.hotspot.igv.view.actions.ShowAllAction;
+import com.sun.hotspot.igv.view.actions.ZoomInAction;
+import com.sun.hotspot.igv.view.actions.ZoomOutAction;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.PropertyMatcher;
+import com.sun.hotspot.igv.filter.FilterChainProvider;
+import com.sun.hotspot.igv.util.RangeSlider;
+import com.sun.hotspot.igv.util.RangeSliderModel;
+import com.sun.hotspot.igv.svg.BatikSVG;
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.event.HierarchyBoundsListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.JPanel;
+import javax.swing.JToggleButton;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import org.openide.DialogDisplayer;
+import org.openide.actions.FindAction;
+import org.openide.actions.RedoAction;
+import org.openide.actions.UndoAction;
+import org.openide.awt.Toolbar;
+import org.openide.awt.ToolbarPool;
+import org.openide.awt.UndoRedo;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallbackSystemAction;
+import org.openide.util.actions.SystemAction;
+import org.openide.util.lookup.AbstractLookup;
+import org.openide.util.lookup.InstanceContent;
+import org.openide.util.lookup.ProxyLookup;
+import org.openide.windows.Mode;
+import org.openide.windows.TopComponent;
+import org.openide.windows.WindowManager;
+import org.openide.NotifyDescriptor;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class EditorTopComponent extends TopComponent implements ChangedListener<RangeSliderModel>, PropertyChangeListener {
+
+    private DiagramScene scene;
+    private InstanceContent content;
+    private FindPanel findPanel;
+    private EnableBlockLayoutAction blockLayoutAction;
+    private OverviewAction overviewAction;
+    private PredSuccAction predSuccAction;
+    private boolean notFirstTime;
+    private ExtendedSatelliteComponent satelliteComponent;
+    private JPanel centerPanel;
+    private CardLayout cardLayout;
+    private RangeSlider rangeSlider;
+    private JToggleButton overviewButton;
+    private static final String PREFERRED_ID = "EditorTopComponent";
+    private static final String SATELLITE_STRING = "satellite";
+    private static final String SCENE_STRING = "scene";
+    private DiagramViewModel rangeSliderModel;
+    private ExportCookie exportCookie = new ExportCookie() {
+
+        public void export(File f) {
+
+            Graphics2D svgGenerator = BatikSVG.createGraphicsObject();
+
+            if (svgGenerator == null) {
+                NotifyDescriptor message = new NotifyDescriptor.Message("For export to SVG files the Batik SVG Toolkit must be intalled.", NotifyDescriptor.ERROR_MESSAGE);
+                DialogDisplayer.getDefault().notifyLater(message);
+            } else {
+                scene.paint(svgGenerator);
+                FileOutputStream os = null;
+                try {
+                    os = new FileOutputStream(f);
+                    Writer out = new OutputStreamWriter(os, "UTF-8");
+                    BatikSVG.printToStream(svgGenerator, out, true);
+                } catch (FileNotFoundException e) {
+                    NotifyDescriptor message = new NotifyDescriptor.Message("For export to SVG files the Batik SVG Toolkit must be intalled.", NotifyDescriptor.ERROR_MESSAGE);
+                    DialogDisplayer.getDefault().notifyLater(message);
+
+                } catch (UnsupportedEncodingException e) {
+                } finally {
+                    if (os != null) {
+                        try {
+                            os.close();
+                        } catch (IOException e) {
+                        }
+                    }
+                }
+
+            }
+        }
+    };
+
+    private void updateDisplayName() {
+        setDisplayName(getDiagram().getName());
+    }
+
+    public EditorTopComponent(Diagram diagram) {
+
+        FilterChain filterChain = null;
+        FilterChain sequence = null;
+        FilterChainProvider provider = Lookup.getDefault().lookup(FilterChainProvider.class);
+        if (provider == null) {
+            filterChain = new FilterChain();
+            sequence = new FilterChain();
+        } else {
+            filterChain = provider.getFilterChain();
+            sequence = provider.getSequence();
+        }
+
+        setName(NbBundle.getMessage(EditorTopComponent.class, "CTL_EditorTopComponent"));
+        setToolTipText(NbBundle.getMessage(EditorTopComponent.class, "HINT_EditorTopComponent"));
+
+        Action[] actions = new Action[]{
+            PrevDiagramAction.get(PrevDiagramAction.class),
+            NextDiagramAction.get(NextDiagramAction.class),
+            null,
+            ExtractAction.get(ExtractAction.class),
+            ShowAllAction.get(HideAction.class),
+            ShowAllAction.get(ShowAllAction.class),
+            null,
+            ZoomInAction.get(ZoomInAction.class),
+            ZoomOutAction.get(ZoomOutAction.class),
+            null,
+            ExpandPredecessorsAction.get(ExpandPredecessorsAction.class),
+            ExpandSuccessorsAction.get(ExpandSuccessorsAction.class)
+        };
+
+
+        initComponents();
+
+        ActionMap actionMap = getActionMap();
+
+        ToolbarPool.getDefault().setPreferredIconSize(16);
+        Toolbar toolBar = new Toolbar();
+        Border b = (Border) UIManager.get("Nb.Editor.Toolbar.border"); //NOI18N
+        toolBar.setBorder(b);
+        JPanel container = new JPanel();
+        this.add(container, BorderLayout.NORTH);
+        container.setLayout(new BorderLayout());
+        container.add(BorderLayout.NORTH, toolBar);
+
+        rangeSliderModel = new DiagramViewModel(diagram.getGraph().getGroup(), filterChain, sequence);
+        rangeSliderModel.selectGraph(diagram.getGraph());
+        rangeSlider = new RangeSlider();
+        rangeSlider.setModel(rangeSliderModel);
+        rangeSliderModel.getChangedEvent().addListener(this);
+        container.add(BorderLayout.CENTER, rangeSlider);
+
+        scene = new DiagramScene(actions, rangeSliderModel);
+        content = new InstanceContent();
+        this.associateLookup(new ProxyLookup(new Lookup[]{scene.getLookup(), new AbstractLookup(content)}));
+        content.add(exportCookie);
+        content.add(rangeSliderModel);
+
+
+        findPanel = new FindPanel(diagram.getFigures());
+        findPanel.setMaximumSize(new Dimension(200, 50));
+        toolBar.add(findPanel);
+        toolBar.add(NodeFindAction.get(NodeFindAction.class));
+        toolBar.addSeparator();
+        toolBar.add(NextDiagramAction.get(NextDiagramAction.class));
+        toolBar.add(PrevDiagramAction.get(PrevDiagramAction.class));
+        toolBar.addSeparator();
+        toolBar.add(ExtractAction.get(ExtractAction.class));
+        toolBar.add(ShowAllAction.get(HideAction.class));
+        toolBar.add(ShowAllAction.get(ShowAllAction.class));
+        toolBar.addSeparator();
+        toolBar.add(ShowAllAction.get(ZoomInAction.class));
+        toolBar.add(ShowAllAction.get(ZoomOutAction.class));
+
+        blockLayoutAction = new EnableBlockLayoutAction();
+        JToggleButton button = new JToggleButton(blockLayoutAction);
+        button.setSelected(true);
+        toolBar.add(button);
+        blockLayoutAction.addPropertyChangeListener(this);
+
+        overviewAction = new OverviewAction();
+        overviewButton = new JToggleButton(overviewAction);
+        overviewButton.setSelected(false);
+        toolBar.add(overviewButton);
+        overviewAction.addPropertyChangeListener(this);
+
+        predSuccAction = new PredSuccAction();
+        button = new JToggleButton(predSuccAction);
+        button.setSelected(true);
+        toolBar.add(button);
+        predSuccAction.addPropertyChangeListener(this);
+
+        toolBar.addSeparator();
+        toolBar.add(UndoAction.get(UndoAction.class));
+        toolBar.add(RedoAction.get(RedoAction.class));
+
+        centerPanel = new JPanel();
+        this.add(centerPanel, BorderLayout.CENTER);
+        cardLayout = new CardLayout();
+        centerPanel.setLayout(cardLayout);
+        centerPanel.add(SCENE_STRING, scene.getScrollPane());
+        centerPanel.setBackground(Color.WHITE);
+        satelliteComponent = new ExtendedSatelliteComponent(scene);
+        satelliteComponent.setSize(200, 200);
+        centerPanel.add(SATELLITE_STRING, satelliteComponent);
+
+        CallbackSystemAction callFindAction = (CallbackSystemAction) SystemAction.get(FindAction.class);
+        NodeFindAction findAction = NodeFindAction.get(NodeFindAction.class);
+        Object key = callFindAction.getActionMapKey();
+        actionMap.put(key, findAction);
+
+        scene.getScrollPane().addKeyListener(keyListener);
+        scene.getView().addKeyListener(keyListener);
+        satelliteComponent.addKeyListener(keyListener);
+
+        scene.getScrollPane().addHierarchyBoundsListener(new HierarchyBoundsListener() {
+
+            public void ancestorMoved(HierarchyEvent e) {
+            }
+
+            public void ancestorResized(HierarchyEvent e) {
+                if (!notFirstTime && scene.getScrollPane().getBounds().width > 0) {
+                    notFirstTime = true;
+                    SwingUtilities.invokeLater(new Runnable() {
+
+                        public void run() {
+                            Figure f = EditorTopComponent.this.scene.getModel().getDiagramToView().getRootFigure();
+                            if (f != null) {
+                                scene.setUndoRedoEnabled(false);
+                                scene.gotoFigure(f);
+                                scene.setUndoRedoEnabled(true);
+                            }
+                        }
+                    });
+                }
+            }
+        });
+
+        updateDisplayName();
+    }
+    private KeyListener keyListener = new KeyListener() {
+
+        public void keyTyped(KeyEvent e) {
+        }
+
+        public void keyPressed(KeyEvent e) {
+            if (e.getKeyCode() == KeyEvent.VK_S) {
+                EditorTopComponent.this.overviewButton.setSelected(true);
+                EditorTopComponent.this.overviewAction.setState(true);
+            }
+        }
+
+        public void keyReleased(KeyEvent e) {
+            if (e.getKeyCode() == KeyEvent.VK_S) {
+                EditorTopComponent.this.overviewButton.setSelected(false);
+                EditorTopComponent.this.overviewAction.setState(false);
+            }
+        }
+    };
+
+    public DiagramViewModel getDiagramModel() {
+        return scene.getModel();
+    }
+
+    private void showSatellite() {
+        cardLayout.show(centerPanel, SATELLITE_STRING);
+        satelliteComponent.requestFocus();
+
+    }
+
+    private void showScene() {
+        cardLayout.show(centerPanel, SCENE_STRING);
+        scene.getView().requestFocus();
+    }
+
+    public void findNode() {
+        findPanel.find();
+    }
+
+    public void zoomOut() {
+        double zoom = scene.getZoomFactor();
+        Point viewPosition = scene.getScrollPane().getViewport().getViewPosition();
+        double newZoom = zoom / DiagramScene.ZOOM_INCREMENT;
+        if (newZoom > DiagramScene.ZOOM_MIN_FACTOR) {
+            scene.setZoomFactor(newZoom);
+            scene.validate();
+            scene.getScrollPane().getViewport().setViewPosition(new Point((int) (viewPosition.x / DiagramScene.ZOOM_INCREMENT), (int) (viewPosition.y / DiagramScene.ZOOM_INCREMENT)));
+            this.satelliteComponent.update();
+        }
+    }
+
+    public void zoomIn() {
+        double zoom = scene.getZoomFactor();
+        Point viewPosition = scene.getScrollPane().getViewport().getViewPosition();
+        double newZoom = zoom * DiagramScene.ZOOM_INCREMENT;
+        if (newZoom < DiagramScene.ZOOM_MAX_FACTOR) {
+            scene.setZoomFactor(newZoom);
+            scene.validate();
+            scene.getScrollPane().getViewport().setViewPosition(new Point((int) (viewPosition.x * DiagramScene.ZOOM_INCREMENT), (int) (viewPosition.y * DiagramScene.ZOOM_INCREMENT)));
+            this.satelliteComponent.update();
+        }
+    }
+
+    public void showPrevDiagram() {
+        int fp = getModel().getFirstPosition();
+        int sp = getModel().getSecondPosition();
+        if (fp != 0) {
+            fp--;
+            sp--;
+            getModel().setPositions(fp, sp);
+        }
+    }
+
+    public DiagramViewModel getModel() {
+        return scene.getModel();
+    }
+
+    public FilterChain getFilterChain() {
+        return this.scene.getModel().getFilterChain();
+    }
+
+    public static EditorTopComponent getActive() {
+        Set<? extends Mode> modes = WindowManager.getDefault().getModes();
+        for (Mode m : modes) {
+            TopComponent tc = m.getSelectedTopComponent();
+            if (tc instanceof EditorTopComponent) {
+                return (EditorTopComponent) tc;
+            }
+        }
+        return null;
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+        private void initComponents() {
+                jCheckBox1 = new javax.swing.JCheckBox();
+
+                org.openide.awt.Mnemonics.setLocalizedText(jCheckBox1, "jCheckBox1");
+                jCheckBox1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+                jCheckBox1.setMargin(new java.awt.Insets(0, 0, 0, 0));
+
+                setLayout(new java.awt.BorderLayout());
+
+        }// </editor-fold>//GEN-END:initComponents
+        // Variables declaration - do not modify//GEN-BEGIN:variables
+        private javax.swing.JCheckBox jCheckBox1;
+        // End of variables declaration//GEN-END:variables
+    @Override
+    public int getPersistenceType() {
+        return TopComponent.PERSISTENCE_NEVER;
+    }
+
+    @Override
+    public void componentOpened() {
+    }
+
+    @Override
+    public void componentClosed() {
+    }
+
+    @Override
+    protected String preferredID() {
+        return PREFERRED_ID;
+    }
+
+    public void changed(RangeSliderModel model) {
+        updateDisplayName();
+    }
+
+    public boolean showPredSucc() {
+        return (Boolean) predSuccAction.getValue(PredSuccAction.STATE);
+    }
+
+    public void setSelection(PropertyMatcher matcher) {
+
+        Properties.PropertySelector<Figure> selector = new Properties.PropertySelector<Figure>(scene.getModel().getDiagramToView().getFigures());
+        List<Figure> list = selector.selectMultiple(matcher);
+        boolean b = scene.getUndoRedoEnabled();
+        scene.setUndoRedoEnabled(false);
+        scene.gotoFigures(list);
+        scene.setUndoRedoEnabled(b);
+        scene.setSelection(list);
+    }
+
+    public void setSelectedNodes(Set<InputNode> nodes) {
+
+        List<Figure> list = new ArrayList<Figure>();
+        Set<Integer> ids = new HashSet<Integer>();
+        for (InputNode n : nodes) {
+            ids.add(n.getId());
+        }
+
+        for (Figure f : scene.getModel().getDiagramToView().getFigures()) {
+            for (InputNode n : f.getSource().getSourceNodes()) {
+                if (ids.contains(n.getId())) {
+                    list.add(f);
+                    break;
+                }
+            }
+        }
+
+        scene.gotoFigures(list);
+        scene.setSelection(list);
+    }
+
+    public void propertyChange(PropertyChangeEvent evt) {
+        if (evt.getSource() == this.predSuccAction) {
+            boolean b = (Boolean) predSuccAction.getValue(PredSuccAction.STATE);
+            this.getModel().setShowNodeHull(b);
+        } else if (evt.getSource() == this.overviewAction) {
+            boolean b = (Boolean) overviewAction.getValue(OverviewAction.STATE);
+            if (b) {
+                showSatellite();
+            } else {
+                showScene();
+            }
+        } else if (evt.getSource() == this.blockLayoutAction) {
+            boolean b = (Boolean) blockLayoutAction.getValue(EnableBlockLayoutAction.STATE);
+            System.out.println("Showblocks = " + b);
+            this.getModel().setShowBlocks(b);
+        } else {
+            assert false : "Unknown event source";
+        }
+    }
+
+    public void extract() {
+        scene.showOnly(scene.getSelectedNodes());
+    }
+
+    public void hideNodes() {
+        Set<Integer> selectedNodes = this.scene.getSelectedNodes();
+        HashSet<Integer> nodes = new HashSet<Integer>(scene.getModel().getHiddenNodes());
+        nodes.addAll(selectedNodes);
+        this.scene.showNot(nodes);
+    }
+
+    public void expandPredecessors() {
+        Set<Figure> oldSelection = scene.getSelectedFigures();
+        Set<Figure> figures = new HashSet<Figure>();
+
+        for (Figure f : this.getDiagramModel().getDiagramToView().getFigures()) {
+            boolean ok = false;
+            if (oldSelection.contains(f)) {
+                ok = true;
+            } else {
+                for (Figure pred : f.getSuccessors()) {
+                    if (oldSelection.contains(pred)) {
+                        ok = true;
+                        break;
+                    }
+                }
+            }
+
+            if (ok) {
+                figures.add(f);
+            }
+        }
+
+        scene.showAll(figures);
+    }
+
+    public void expandSuccessors() {
+        Set<Figure> oldSelection = scene.getSelectedFigures();
+        Set<Figure> figures = new HashSet<Figure>();
+
+        for (Figure f : this.getDiagramModel().getDiagramToView().getFigures()) {
+            boolean ok = false;
+            if (oldSelection.contains(f)) {
+                ok = true;
+            } else {
+                for (Figure succ : f.getPredecessors()) {
+                    if (oldSelection.contains(succ)) {
+                        ok = true;
+                        break;
+                    }
+                }
+            }
+
+            if (ok) {
+                figures.add(f);
+            }
+        }
+
+        scene.showAll(figures);
+    }
+
+    public void showAll() {
+        scene.showNot(new HashSet<Integer>());
+    }
+
+    public Diagram getDiagram() {
+        return getDiagramModel().getDiagramToView();
+    }
+
+    @Override
+    protected void componentActivated() {
+    }
+
+    @Override
+    public void requestFocus() {
+        super.requestFocus();
+        scene.getView().requestFocus();
+    }
+
+    @Override
+    public boolean requestFocusInWindow() {
+        super.requestFocusInWindow();
+        return scene.getView().requestFocusInWindow();
+    }
+
+    @Override
+    public UndoRedo getUndoRedo() {
+        return scene.getUndoRedo();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,36 @@
+/*
+ * Copyright 1998-2007 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 com.sun.hotspot.igv.view;
+
+import java.io.File;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public interface ExportCookie {
+
+    void export(File f);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Point;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.action.WidgetAction;
+
+import java.awt.event.MouseEvent;
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedPanAction extends WidgetAction.LockedAdapter {
+
+    private Scene scene;
+    private JScrollPane scrollPane;
+    private Point lastLocation;
+
+    protected boolean isLocked() {
+        return scrollPane != null;
+    }
+
+    @Override
+    public State mousePressed(Widget widget, WidgetMouseEvent event) {
+        if (event.getButton() == MouseEvent.BUTTON2 || event.getButton() == MouseEvent.BUTTON1 && ((event.getModifiers() & MouseEvent.CTRL_MASK) != 0)) {
+            scene = widget.getScene();
+            scrollPane = findScrollPane(scene.getView());
+            if (scrollPane != null) {
+                lastLocation = scene.convertSceneToView(widget.convertLocalToScene(event.getPoint()));
+                SwingUtilities.convertPointToScreen(lastLocation, scrollPane.getViewport().getView());
+                return State.createLocked(widget, this);
+            }
+        }
+        return State.REJECTED;
+    }
+
+    private JScrollPane findScrollPane(JComponent component) {
+        for (;;) {
+            if (component == null) {
+                return null;
+            }
+            if (component instanceof JScrollPane) {
+                return ((JScrollPane) component);
+            }
+            Container parent = component.getParent();
+            if (!(parent instanceof JComponent)) {
+                return null;
+            }
+            component = (JComponent) parent;
+        }
+    }
+
+    @Override
+    public State mouseReleased(Widget widget, WidgetMouseEvent event) {
+        boolean state = pan(widget, event.getPoint());
+        if (state) {
+            scrollPane = null;
+        }
+        return state ? State.createLocked(widget, this) : State.REJECTED;
+    }
+
+    @Override
+    public State mouseDragged(Widget widget, WidgetMouseEvent event) {
+        return pan(widget, event.getPoint()) ? State.createLocked(widget, this) : State.REJECTED;
+    }
+
+    private boolean pan(Widget widget, Point newLocation) {
+        if (scrollPane == null || scene != widget.getScene()) {
+            return false;
+        }
+        newLocation = scene.convertSceneToView(widget.convertLocalToScene(newLocation));
+        SwingUtilities.convertPointToScreen(newLocation, scrollPane.getViewport().getView());
+        Point viewPosition = scrollPane.getViewport().getViewPosition();
+        Dimension viewSize = scrollPane.getViewport().getViewSize();
+        Dimension viewPortSize = scrollPane.getViewport().getSize();
+
+        int xOffset = lastLocation.x - newLocation.x;
+        int yOffset = lastLocation.y - newLocation.y;
+
+        if (viewPortSize.height == viewSize.height) {
+            yOffset = 0;
+        }
+
+        if (viewPortSize.width == viewSize.width) {
+            xOffset = 0;
+        }
+
+        if (xOffset == 0 && yOffset == 0) {
+            return true;
+        }
+        viewPosition = new Point(viewPosition.x + xOffset, viewPosition.y + yOffset);
+        viewPosition.x = Math.max(viewPosition.x, 0);
+        viewPosition.y = Math.max(viewPosition.y, 0);
+        viewPosition.x = Math.min(viewPosition.x, scrollPane.getViewport().getView().getSize().width - scrollPane.getViewport().getSize().width);
+        viewPosition.y = Math.min(viewPosition.y, scrollPane.getViewport().getView().getSize().height - scrollPane.getViewport().getSize().height);
+
+        scrollPane.getViewport().setViewPosition(viewPosition);
+        scrollPane.getViewport().getView().repaint();
+        lastLocation = newLocation;
+        return true;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,200 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import org.netbeans.api.visual.widget.Scene;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+
+/**
+ * @author David Kaspar
+ * @author Thomas Wuerthinger
+ */
+public class ExtendedSatelliteComponent extends JComponent implements MouseListener, MouseMotionListener, Scene.SceneListener, ComponentListener {
+
+    private DiagramScene scene;
+    private Image image;
+    private int imageWidth;
+    private int imageHeight;
+
+    public ExtendedSatelliteComponent(DiagramScene scene) {
+        this.scene = scene;
+        setDoubleBuffered(true);
+        setPreferredSize(new Dimension(128, 128));
+        addMouseListener(this);
+        addMouseMotionListener(this);
+    }
+
+    public void addNotify() {
+        super.addNotify();
+        scene.addSceneListener(this);
+        JComponent viewComponent = scene.getView();
+        if (viewComponent == null) {
+            viewComponent = scene.createView();
+        }
+        viewComponent.addComponentListener(this);
+        repaint();
+    }
+
+    public void removeNotify() {
+        scene.getView().removeComponentListener(this);
+        scene.removeSceneListener(this);
+        super.removeNotify();
+    }
+
+    public void update() {
+        this.image = null;
+        if (this.isVisible()) {
+            repaint();
+            revalidate();
+            validate();
+        }
+    }
+
+    public void paint(Graphics g) {
+        Graphics2D gr = (Graphics2D) g;
+        super.paint(g);
+        Rectangle bounds = scene.getBounds();
+        Dimension size = getSize();
+
+        double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+        double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+        double scale = Math.min(sx, sy);
+
+        int vw = (int) (scale * bounds.width);
+        int vh = (int) (scale * bounds.height);
+        int vx = (size.width - vw) / 2;
+        int vy = (size.height - vh) / 2;
+
+
+        if (image == null || vw != imageWidth || vh != imageHeight) {
+
+            imageWidth = vw;
+            imageHeight = vh;
+            image = this.createImage(imageWidth, imageHeight);
+            Graphics2D ig = (Graphics2D) image.getGraphics();
+            ig.scale(scale, scale);
+            scene.setRealZoomFactor(scale);
+            scene.paint(ig);
+            scene.setRealZoomFactor(0.0);
+        }
+
+        gr.drawImage(image, vx, vy, this);
+
+        JComponent component = scene.getView();
+        double zoomFactor = scene.getZoomFactor();
+        Rectangle viewRectangle = component != null ? component.getVisibleRect() : null;
+        if (viewRectangle != null) {
+            Rectangle window = new Rectangle(
+                    (int) ((double) viewRectangle.x * scale / zoomFactor),
+                    (int) ((double) viewRectangle.y * scale / zoomFactor),
+                    (int) ((double) viewRectangle.width * scale / zoomFactor),
+                    (int) ((double) viewRectangle.height * scale / zoomFactor));
+            window.translate(vx, vy);
+            gr.setColor(new Color(200, 200, 200, 128));
+            gr.fill(window);
+            gr.setColor(Color.BLACK);
+            gr.drawRect(window.x, window.y, window.width - 1, window.height - 1);
+        }
+    }
+
+    public void mouseClicked(MouseEvent e) {
+    }
+
+    public void mousePressed(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseReleased(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseEntered(MouseEvent e) {
+    }
+
+    public void mouseExited(MouseEvent e) {
+    }
+
+    public void mouseDragged(MouseEvent e) {
+        moveVisibleRect(e.getPoint());
+    }
+
+    public void mouseMoved(MouseEvent e) {
+    }
+
+    private void moveVisibleRect(Point center) {
+        JComponent component = scene.getView();
+        if (component == null) {
+            return;
+        }
+        double zoomFactor = scene.getZoomFactor();
+        Rectangle bounds = scene.getBounds();
+        Dimension size = getSize();
+
+        double sx = bounds.width > 0 ? (double) size.width / bounds.width : 0.0;
+        double sy = bounds.width > 0 ? (double) size.height / bounds.height : 0.0;
+        double scale = Math.min(sx, sy);
+
+        int vw = (int) (scale * bounds.width);
+        int vh = (int) (scale * bounds.height);
+        int vx = (size.width - vw) / 2;
+        int vy = (size.height - vh) / 2;
+
+        int cx = (int) ((double) (center.x - vx) / scale * zoomFactor);
+        int cy = (int) ((double) (center.y - vy) / scale * zoomFactor);
+
+        Rectangle visibleRect = component.getVisibleRect();
+        visibleRect.x = cx - visibleRect.width / 2;
+        visibleRect.y = cy - visibleRect.height / 2;
+        component.scrollRectToVisible(visibleRect);
+
+        this.repaint();
+    }
+
+    public void sceneRepaint() {
+    //repaint ();
+    }
+
+    public void sceneValidating() {
+    }
+
+    public void sceneValidated() {
+    }
+
+    public void componentResized(ComponentEvent e) {
+        repaint();
+    }
+
+    public void componentMoved(ComponentEvent e) {
+        repaint();
+    }
+
+    public void componentShown(ComponentEvent e) {
+    }
+
+    public void componentHidden(ComponentEvent e) {
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,111 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.data.Properties.RegexpPropertyMatcher;
+import com.sun.hotspot.igv.data.Property;
+import java.awt.GridLayout;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+class FindPanel extends JPanel implements KeyListener {
+
+    private JComboBox nameComboBox;
+    private JTextField valueTextField;
+
+    public FindPanel(List<Figure> figures) {
+        createDesign();
+        updateComboBox(figures);
+    }
+
+    protected void createDesign() {
+        setLayout(new GridLayout());
+        nameComboBox = new JComboBox();
+        valueTextField = new JTextField();
+        add(nameComboBox);
+        add(valueTextField);
+        valueTextField.addKeyListener(this);
+    }
+
+    public void updateComboBox(List<Figure> figures) {
+
+        String sel = (String) nameComboBox.getSelectedItem();
+        SortedSet<String> propertyNames = new TreeSet<String>();
+
+        for (Figure f : figures) {
+            Properties prop = f.getProperties();
+            for (Property p : prop.getProperties()) {
+                if (!propertyNames.contains(p.getName())) {
+                    propertyNames.add(p.getName());
+                }
+            }
+        }
+
+        for (String s : propertyNames) {
+            nameComboBox.addItem(s);
+        }
+        nameComboBox.setSelectedItem(sel);
+    }
+
+    public String getNameText() {
+        return (String) nameComboBox.getSelectedItem();
+    }
+
+    public String getValueText() {
+        return valueTextField.getText();
+    }
+
+    public void keyTyped(KeyEvent e) {
+    }
+
+    public void keyPressed(KeyEvent e) {
+        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+            find();
+        }
+    }
+
+    public void find() {
+        EditorTopComponent comp = EditorTopComponent.getActive();
+        if (comp != null) {
+            RegexpPropertyMatcher matcher = new RegexpPropertyMatcher(getNameText(), getValueText());
+            comp.setSelection(matcher);
+        }
+    }
+
+    public void keyReleased(KeyEvent e) {
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import com.sun.hotspot.igv.data.InputGraph;
+import com.sun.hotspot.igv.data.services.GraphViewer;
+import com.sun.hotspot.igv.graph.Diagram;
+import com.sun.hotspot.igv.settings.Settings;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class GraphViewerImplementation implements GraphViewer {
+
+    public void view(InputGraph graph) {
+        Diagram diagram = Diagram.createDiagram(graph, Settings.get().get(Settings.NODE_TEXT, Settings.NODE_TEXT_DEFAULT));
+        EditorTopComponent tc = new EditorTopComponent(diagram);
+        tc.open();
+        tc.requestActive();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PreferenceConstants {
+
+    public static final String KEY_LINE_GENERATOR = "lineGenerator";
+    public static final String DEFAULT_LINE_GENERATOR = "com.sun.hotspot.igv.positioning.BasicLineGenerator";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.Collection;
+import java.util.List;
+import org.netbeans.api.visual.layout.Layout;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class SlotLayout implements Layout {
+
+    public enum HorizontalAlignment {
+
+        Left,
+        Center,
+        Right
+    }
+    private Layout baseLayout;
+    private HorizontalAlignment alignment;
+    private boolean vertical;
+
+    public SlotLayout() {
+        this(HorizontalAlignment.Center, false);
+    }
+
+    public SlotLayout(HorizontalAlignment alignment, boolean vertical) {
+        this.alignment = alignment;
+        baseLayout = LayoutFactory.createVerticalFlowLayout();
+        this.vertical = vertical;
+    }
+
+    public void layout(Widget widget) {
+        if (!vertical) {
+            Collection<Widget> children = widget.getChildren();
+            int gap = 0;
+            int max = 0;
+            for (Widget child : children) {
+                Rectangle preferredBounds = child.getPreferredBounds();
+                int i = preferredBounds.width;
+                if (i > max) {
+                    max = i;
+                }
+            }
+            int pos = 0;
+            for (Widget child : children) {
+                Rectangle preferredBounds = child.getPreferredBounds();
+                int x = preferredBounds.x;
+                int y = preferredBounds.y;
+                int width = preferredBounds.width;
+                int height = preferredBounds.height;
+                if (pos == 0) {
+                    pos += height / 2;
+                }
+                int lx = -x;
+                int ly = pos - y;
+                switch (alignment) {
+                    case Center:
+                        lx += (max - width) / 2;
+                        break;
+                    case Left:
+                        break;
+                    case Right:
+                        lx += max - width;
+                        break;
+                }
+                child.resolveBounds(new Point(lx, ly), new Rectangle(x, y, width, height));
+                pos += height + gap;
+            }
+        } else {
+
+            Collection<Widget> children = widget.getChildren();
+            int gap = 0;
+            int max = 0;
+            for (Widget child : children) {
+                Rectangle preferredBounds = child.getPreferredBounds();
+                int i = preferredBounds.height;
+                if (i > max) {
+                    max = i;
+                }
+            }
+            int pos = 0;
+            for (Widget child : children) {
+                Rectangle preferredBounds = child.getPreferredBounds();
+                int x = preferredBounds.x;
+                int y = preferredBounds.y;
+                int width = preferredBounds.width;
+                int height = preferredBounds.height;
+                if (pos == 0) {
+                    pos += width / 2;
+                }
+                int lx = pos - x;
+                int ly = -y;
+                switch (alignment) {
+                    case Center:
+                        ly += (max - height) / 2;
+                        break;
+                    case Left:
+                        break;
+                    case Right:
+                        ly += max - height;
+                        break;
+                }
+                child.resolveBounds(new Point(lx, ly), new Rectangle(x, y, width, height));
+                pos += width + gap;
+            }
+
+        }
+    }
+
+    public boolean requiresJustification(Widget widget) {
+        return true;
+    }
+
+    public void justify(Widget widget) {
+        baseLayout.justify(widget);
+
+        Rectangle client = widget.getClientArea();
+        List<Widget> children = widget.getChildren();
+
+        int count = children.size();
+        int z = 0;
+
+        int maxWidth = 0;
+        for (Widget c : children) {
+            if (c.getPreferredBounds().width > maxWidth) {
+                maxWidth = c.getPreferredBounds().width;
+            }
+        }
+
+        for (Widget c : children) {
+            z++;
+            Point curLocation = c.getLocation();
+            Rectangle curBounds = c.getBounds();
+
+
+            Point location = new Point(curLocation.x, client.y + client.height * z / (count + 1) - curBounds.height / 2);
+            if (vertical) {
+                location = new Point(client.x + client.width * z / (count + 1) - maxWidth / 2, curLocation.y);
+            }
+            c.resolveBounds(location, null);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+CTL_EditorAction=Open Editor Window
+CTL_LineGeneratorAction=Line Generator
+CTL_NextDiagramAction=Show next graph
+CTL_EnableBlockLayoutAction=Enable block layout
+CTL_NodeFindAction=Find
+CTL_PrevDiagramAction=Show previous graph
+CTL_ExportAction=Export...
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class EnableBlockLayoutAction extends AbstractAction {
+
+    private boolean state;
+    public static final String STATE = "state";
+
+    public EnableBlockLayoutAction() {
+        state = true;
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(STATE, true);
+        putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks");
+    }
+
+    public void actionPerformed(ActionEvent ev) {
+        this.state = !state;
+        this.putValue(STATE, state);
+    }
+
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/blocks.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExpandPredecessorsAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.expandPredecessors();
+        }
+    }
+
+    public String getName() {
+        return "Expand Predecessors";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExpandSuccessorsAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.expandSuccessors();
+        }
+    }
+
+    public String getName() {
+        return "Expand Successors";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,117 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.settings.Settings;
+import com.sun.hotspot.igv.view.ExportCookie;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import javax.swing.Action;
+import javax.swing.JFileChooser;
+import javax.swing.KeyStroke;
+import javax.swing.filechooser.FileFilter;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.LookupEvent;
+import org.openide.util.LookupListener;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExportAction extends CallableSystemAction implements LookupListener {
+
+    private final Lookup lookup;
+    private final Lookup.Result<ExportCookie> result;
+
+    public ExportAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Export current graph as an SVG file");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK));
+        lookup = Utilities.actionsGlobalContext();
+        result = lookup.lookup(new Lookup.Template<ExportCookie>(ExportCookie.class));
+        result.addLookupListener(this);
+        resultChanged(null);
+    }
+
+    public void resultChanged(LookupEvent e) {
+        super.setEnabled(result.allInstances().size() > 0);
+    }
+
+    public void performAction() {
+
+        JFileChooser fc = new JFileChooser();
+        fc.setFileFilter(new FileFilter() {
+
+            public boolean accept(File f) {
+                return true;
+            }
+
+            public String getDescription() {
+                return "SVG files (*.svg)";
+            }
+        });
+        fc.setCurrentDirectory(new File(Settings.get().get(Settings.DIRECTORY, Settings.DIRECTORY_DEFAULT)));
+
+
+        if (fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
+            File file = fc.getSelectedFile();
+            if (!file.getName().contains(".")) {
+                file = new File(file.getAbsolutePath() + ".svg");
+            }
+
+            File dir = file;
+            if (!dir.isDirectory()) {
+                dir = dir.getParentFile();
+            }
+
+            Settings.get().put(Settings.DIRECTORY, dir.getAbsolutePath());
+            ExportCookie cookie = Utilities.actionsGlobalContext().lookup(ExportCookie.class);
+            if (cookie != null) {
+                cookie.export(file);
+            }
+        }
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(ExportAction.class, "CTL_ExportAction");
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/export.gif";
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ExtractAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.extract();
+        }
+    }
+
+    public ExtractAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Extract current set of selected nodes");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK, false));
+    }
+
+    public String getName() {
+        return "Extract action";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/extract.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class HideAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.hideNodes();
+        }
+    }
+
+    public HideAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Hide selected nodes");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, Event.CTRL_MASK, false));
+    }
+
+    public String getName() {
+        return "Hide";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/hide.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import org.netbeans.api.visual.action.HoverProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.action.WidgetAction.State;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MouseOverAction extends WidgetAction.Adapter {
+
+    private long eventID = Integer.MIN_VALUE;
+    private HoverProvider provider;
+
+    public MouseOverAction(HoverProvider provider) {
+        this.provider = provider;
+    }
+
+    @Override
+    public State mouseMoved(Widget widget, WidgetMouseEvent event) {
+        long id = event.getEventID();
+        if (id != eventID) {
+            eventID = id;
+            provider.widgetHovered(widget);
+        }
+        return State.REJECTED;
+    }
+
+    @Override
+    public State mouseExited(Widget widget, WidgetMouseEvent event) {
+        provider.widgetHovered(null);
+        return State.REJECTED;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.DiagramViewModel;
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.util.ContextAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NextDiagramAction extends ContextAction<DiagramViewModel> implements ChangedListener<DiagramViewModel> {
+
+    private DiagramViewModel model;
+
+    public NextDiagramAction() {
+        this(Utilities.actionsGlobalContext());
+    }
+
+    public NextDiagramAction(Lookup lookup) {
+        putValue(Action.SHORT_DESCRIPTION, "Show next graph of current group");
+        putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/next_diagram.png")));
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(NextDiagramAction.class, "CTL_NextDiagramAction");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    public Class<DiagramViewModel> contextClass() {
+        return DiagramViewModel.class;
+    }
+
+    @Override
+    public void performAction(DiagramViewModel model) {
+        int fp = model.getFirstPosition();
+        int sp = model.getSecondPosition();
+        if (sp != model.getPositions().size() - 1) {
+            int nfp = fp + 1;
+            int nsp = sp + 1;
+            model.setPositions(nfp, nsp);
+        }
+    }
+
+    @Override
+    public void update(DiagramViewModel model) {
+        super.update(model);
+
+        if (this.model != model) {
+            if (this.model != null) {
+                this.model.getDiagramChangedEvent().removeListener(this);
+            }
+
+            this.model = model;
+            if (this.model != null) {
+                this.model.getDiagramChangedEvent().addListener(this);
+            }
+        }
+    }
+
+    @Override
+    public boolean isEnabled(DiagramViewModel model) {
+        return model.getSecondPosition() != model.getPositions().size() - 1;
+    }
+
+    public Action createContextAwareInstance(Lookup arg0) {
+        return new NextDiagramAction(arg0);
+    }
+
+    public void changed(DiagramViewModel source) {
+        update(source);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import javax.swing.Action;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class NodeFindAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent comp = EditorTopComponent.getActive();
+        if (comp != null) {
+            comp.findNode();
+        }
+    }
+
+    public NodeFindAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Find nodes");
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(NodeFindAction.class, "CTL_NodeFindAction");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/search.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OverviewAction extends AbstractAction {
+
+    private boolean state;
+    public static final String STATE = "state";
+
+    public OverviewAction() {
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(Action.SHORT_DESCRIPTION, "Show satellite view of whole graph");
+        setState(false);
+    }
+
+    public void actionPerformed(ActionEvent ev) {
+        setState(!state);
+    }
+
+    public void setState(boolean b) {
+        this.putValue(STATE, b);
+        this.state = b;
+    }
+
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/overview.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class PredSuccAction extends AbstractAction {
+
+    private boolean state;
+    public static final String STATE = "state";
+
+    public PredSuccAction() {
+        state = true;
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(STATE, true);
+        putValue(Action.SHORT_DESCRIPTION, "Show neighboring nodes of fully visible nodes semi-transparent");
+    }
+
+    public void actionPerformed(ActionEvent ev) {
+        this.state = !state;
+        this.putValue(STATE, state);
+    }
+
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/predsucc.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,105 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.data.ChangedListener;
+import com.sun.hotspot.igv.view.DiagramViewModel;
+import com.sun.hotspot.igv.util.ContextAction;
+import javax.swing.Action;
+import javax.swing.ImageIcon;
+import org.openide.util.HelpCtx;
+import org.openide.util.Lookup;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class PrevDiagramAction extends ContextAction<DiagramViewModel> implements ChangedListener<DiagramViewModel> {
+
+    private DiagramViewModel model;
+
+    public PrevDiagramAction() {
+        this(Utilities.actionsGlobalContext());
+    }
+
+    public PrevDiagramAction(Lookup lookup) {
+        putValue(Action.SHORT_DESCRIPTION, "Show previous graph of current group");
+        putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/prev_diagram.png")));
+    }
+
+    public String getName() {
+        return NbBundle.getMessage(PrevDiagramAction.class, "CTL_PrevDiagramAction");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    public Class<DiagramViewModel> contextClass() {
+        return DiagramViewModel.class;
+    }
+
+    @Override
+    public void performAction(DiagramViewModel model) {
+        int fp = model.getFirstPosition();
+        int sp = model.getSecondPosition();
+        if (fp != 0) {
+            int nfp = fp - 1;
+            int nsp = sp - 1;
+            model.setPositions(nfp, nsp);
+        }
+    }
+
+    @Override
+    public void update(DiagramViewModel model) {
+        super.update(model);
+
+        if (this.model != model) {
+            if (this.model != null) {
+                this.model.getDiagramChangedEvent().removeListener(this);
+            }
+
+            this.model = model;
+            if (this.model != null) {
+                this.model.getDiagramChangedEvent().addListener(this);
+            }
+        }
+    }
+
+    @Override
+    public boolean isEnabled(DiagramViewModel model) {
+        return model.getFirstPosition() != 0;
+    }
+
+    public Action createContextAwareInstance(Lookup arg0) {
+        return new PrevDiagramAction(arg0);
+    }
+
+    public void changed(DiagramViewModel source) {
+        update(source);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.*;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ShowAllAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.showAll();
+        }
+    }
+
+    public ShowAllAction() {
+        putValue(Action.SHORT_DESCRIPTION, "Show all nodes");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
+    }
+
+    public String getName() {
+        return "Show all";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/expand.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,69 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ZoomInAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.zoomIn();
+        }
+    }
+
+    public String getName() {
+        return "Zoom in";
+    }
+
+    public ZoomInAction() {
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, Event.CTRL_MASK, false));
+        putValue(Action.SHORT_DESCRIPTION, "Zoom in");
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/zoomin.gif";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.actions;
+
+import com.sun.hotspot.igv.view.EditorTopComponent;
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import javax.swing.Action;
+import javax.swing.KeyStroke;
+import org.openide.util.HelpCtx;
+import org.openide.util.actions.CallableSystemAction;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public final class ZoomOutAction extends CallableSystemAction {
+
+    public void performAction() {
+        EditorTopComponent editor = EditorTopComponent.getActive();
+        if (editor != null) {
+            editor.zoomOut();
+        }
+    }
+
+    public ZoomOutAction() {
+
+        putValue(Action.SHORT_DESCRIPTION, "Zoom out");
+        putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, Event.CTRL_MASK, false));
+    }
+
+    public String getName() {
+        return "Zoom out";
+    }
+
+    @Override
+    protected void initialize() {
+        super.initialize();
+    }
+
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+
+    @Override
+    protected boolean asynchronous() {
+        return false;
+    }
+
+    @Override
+    protected String iconResource() {
+        return "com/sun/hotspot/igv/view/images/zoomout.gif";
+    }
+}
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+    <folder name="Actions">
+        <folder name="File">
+            <file name="com-sun-hotspot-igv-view-actions-ExportAction.instance">
+                <attr name="position" intvalue="1100"/>
+            </file>
+        </folder>
+        <folder name="View">
+            <file name="com-sun-hotspot-igv-view-actions-NextDiagramAction.instance"><attr name="position" intvalue="2000"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-PrevDiagramAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-ShowAllAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-ExtractAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-HideAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-ZoomInAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-ZoomOutAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-OverviewAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-PredSuccAction.instance"><attr name="position" intvalue="2001"/></file>
+            <file name="com-sun-hotspot-igv-view-actions-EnableBlockLayoutAction.instance"><attr name="position" intvalue="2001"/></file>
+        </folder>
+    </folder>
+    <folder name="Menu">
+        <folder name="View">
+            <file name="com-sun-hotspot-igv-view-actions-PrevDiagramAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-PrevDiagramAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-NextDiagramAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-NextDiagramAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-ShowAllAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ShowAllAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-ExtractAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ExtractAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-HideAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-HideAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-ZoomInAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ZoomInAction.instance"/>
+            </file>
+            <file name="com-sun-hotspot-igv-view-actions-ZoomOutAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/View/com-sun-hotspot-igv-view-actions-ZoomOutAction.instance"/>
+            </file>
+        </folder>
+        <folder name="File">
+            <file name="com-sun-hotspot-igv-view-actions-ExportAction.shadow">
+                <attr name="originalFile" stringvalue="Actions/File/com-sun-hotspot-igv-view-actions-ExportAction.instance"/>
+                <attr name="position" intvalue="600"/>
+            </file>
+        </folder>
+    </folder>
+    <folder name="Toolbars">
+        <folder name="Edit">
+            <attr name="com-sun-hotspot-igv-view-actions-LineGeneratorAction.shadow/com-sun-hotspot-igv-coordinator-actions-OpenGraphAction.shadow" boolvalue="true"/>
+        </folder>
+    </folder>
+</filesystem>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.data.InputBlock;
+import com.sun.hotspot.igv.graph.Diagram;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Rectangle2D;
+import org.netbeans.api.visual.widget.Scene;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class BlockWidget extends Widget {
+
+    public static final int BORDER = 20;
+    public static final Color BACKGROUND_COLOR = new Color(235, 235, 255);
+    private static final Font titleFont = new Font("Serif", Font.PLAIN, 14).deriveFont(Font.BOLD);
+    private InputBlock blockNode;
+    private Diagram diagram;
+
+    public BlockWidget(Scene scene, Diagram d, InputBlock blockNode) {
+        super(scene);
+        this.blockNode = blockNode;
+        this.diagram = d;
+        this.setBackground(BACKGROUND_COLOR);
+        this.setOpaque(true);
+        this.setCheckClipping(true);
+    }
+
+    @Override
+    protected void paintWidget() {
+        super.paintWidget();
+        Graphics2D g = this.getGraphics();
+        Stroke old = g.getStroke();
+        g.setColor(Color.BLUE);
+        Rectangle r = new Rectangle(this.getPreferredBounds());
+        r.width--;
+        r.height--;
+        if (this.getBounds().width > 0 && this.getBounds().height > 0) {
+            g.setStroke(new BasicStroke(2));
+            g.drawRect(r.x, r.y, r.width, r.height);
+        }
+
+        Color titleColor = Color.BLACK;
+        g.setColor(titleColor);
+        g.setFont(titleFont);
+
+        String s = "B" + blockNode.toString();
+        Rectangle2D r1 = g.getFontMetrics().getStringBounds(s, g);
+        g.drawString(s, r.x + 5, r.y + (int) r1.getHeight());
+        g.setStroke(old);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,251 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.util.ArrayList;
+import java.util.List;
+import org.netbeans.api.visual.anchor.AnchorShape;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.ConnectionWidget;
+import org.netbeans.api.visual.widget.Scene;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class DiagramConnectionWidget extends ConnectionWidget {
+
+    private static Stroke DASHED_STROKE = new BasicStroke(
+            1,
+            BasicStroke.CAP_BUTT,
+            BasicStroke.JOIN_ROUND,
+            0,
+            new float[]{2},
+            0);
+    private static Stroke NORMAL_STROKE = new BasicStroke(1);
+    private static Stroke BOLD_STROKE = new BasicStroke(3);
+    public static int WHITE_FACTOR = 5;
+    private Connection connection;
+    private Color color;
+    private Point lastSourceAnchor;
+    private Point lastTargetAnchor;
+    private List<Point> controlPoints;
+    private Rectangle clientArea;
+    private boolean split;
+    private int[] xPoints;
+    private int[] yPoints;
+    private int pointCount;
+
+    /** Creates a new instance of ConnectionWidget */
+    public DiagramConnectionWidget(Connection connection, Scene scene) {
+        super(scene);
+        this.connection = connection;
+        color = connection.getColor();
+        if (connection.getStyle() == Connection.ConnectionStyle.DASHED) {
+            this.setStroke(DASHED_STROKE);
+        } else if (connection.getStyle() == Connection.ConnectionStyle.BOLD) {
+            this.setStroke(BOLD_STROKE);
+        } else {
+            this.setStroke(NORMAL_STROKE);
+        }
+        this.setCheckClipping(true);
+        clientArea = new Rectangle();
+        updateControlPoints();
+    }
+
+    public Connection getConnection() {
+        return connection;
+    }
+
+    public void updateControlPoints() {
+        List<Point> newControlPoints = connection.getControlPoints();
+        Connection c = connection;
+        Figure f = c.getInputSlot().getFigure();
+        Point p = new Point(f.getPosition());
+        p.translate(c.getInputSlot().getRelativePosition().x, f.getSize().height / 2);
+        Point p4 = new Point(f.getPosition());
+        p4.translate(c.getInputSlot().getRelativePosition().x, c.getInputSlot().getRelativePosition().y);
+
+        Figure f2 = c.getOutputSlot().getFigure();
+        Point p2 = new Point(f2.getPosition());
+        p2.translate(c.getOutputSlot().getRelativePosition().x, f2.getSize().height / 2);
+        Point p3 = new Point(f2.getPosition());
+        p3.translate(c.getOutputSlot().getRelativePosition().x, c.getOutputSlot().getRelativePosition().y);
+
+        /*if(controlPoints.size() >= 2) {
+        String className = Preferences.userNodeForPackage(PreferenceConstants.class).get(PreferenceConstants.KEY_LINE_GENERATOR, PreferenceConstants.DEFAULT_LINE_GENERATOR);
+        try {
+        LineGenerator lg = (LineGenerator)Class.forName(className).newInstance();
+        controlPoints = lg.createLine(controlPoints, p2, p);
+        } catch (InstantiationException ex) {
+        } catch (IllegalAccessException ex) {
+        } catch (ClassNotFoundException ex) {
+        }
+        }*/
+
+        this.controlPoints = newControlPoints;
+        pointCount = newControlPoints.size();
+        xPoints = new int[pointCount];
+        yPoints = new int[pointCount];
+        int minX = Integer.MAX_VALUE;
+        int maxX = Integer.MIN_VALUE;
+        int minY = Integer.MAX_VALUE;
+        int maxY = Integer.MIN_VALUE;
+        split = false;
+        for (int i = 0; i < pointCount; i++) {
+            if (newControlPoints.get(i) == null) {
+                split = true;
+            } else {
+                int curX = newControlPoints.get(i).x;
+                int curY = newControlPoints.get(i).y;
+                this.xPoints[i] = curX;
+                this.yPoints[i] = curY;
+                minX = Math.min(minX, curX);
+                maxX = Math.max(maxX, curX);
+                minY = Math.min(minY, curY);
+                maxY = Math.max(maxY, curY);
+            }
+        }
+
+        this.clientArea = new Rectangle(minX, minY, maxX - minX, maxY - minY);
+    }
+
+    @Override
+    protected void paintWidget() {
+        Graphics2D g = this.getGraphics();
+
+        if (xPoints.length == 0 || Math.abs(xPoints[0] - xPoints[xPoints.length - 1]) > 2000) {
+            return;
+        }
+
+        //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+        //g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
+        //g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
+
+        DiagramScene ds = (DiagramScene) this.getScene();
+        boolean shouldHide = false;//ds.getShouldHide(this);
+
+        Composite oldComposite = null;
+        if (shouldHide) {
+            Color c = new Color(255 - (255 - color.getRed()) / WHITE_FACTOR, 255 - (255 - color.getGreen()) / WHITE_FACTOR, 255 - (255 - color.getBlue()) / WHITE_FACTOR);
+            g.setPaint(c);
+        } else {
+            g.setPaint(color);
+        }
+
+        if (split) {
+            for (int i = 1; i < controlPoints.size(); i++) {
+                Point prev = controlPoints.get(i - 1);
+                Point cur = controlPoints.get(i);
+                if (cur == null || prev == null) {
+                    continue;
+                }
+
+                g.drawLine(prev.x, prev.y, cur.x, cur.y);
+            }
+        } else {
+            g.drawPolyline(xPoints, yPoints, pointCount);
+        }
+
+        /*for(int i=0; i<xPoints.length; i++) {
+        int x = xPoints[i];
+        int y = yPoints[i];
+        g.fillOval(x - 2, y - 2, 4, 4);
+        }*/
+
+        if (xPoints.length >= 2) {
+            Graphics2D g2 = (Graphics2D) g.create();
+            int xOff = xPoints[xPoints.length - 2] - xPoints[xPoints.length - 1];
+            int yOff = yPoints[yPoints.length - 2] - yPoints[yPoints.length - 1];
+            if (xOff == 0 && yOff == 0 && yPoints.length >= 3) {
+                xOff = xPoints[xPoints.length - 3] - xPoints[xPoints.length - 1];
+                yOff = yPoints[yPoints.length - 3] - yPoints[yPoints.length - 1];
+            }
+            g2.translate(xPoints[xPoints.length - 1], yPoints[yPoints.length - 1]);
+            g2.rotate(Math.atan2(yOff, xOff));
+
+            g2.scale(0.55, 0.80);
+            AnchorShape.TRIANGLE_FILLED.paint(g2, false);
+        }
+    }
+
+    @Override
+    public void notifyStateChanged(ObjectState previousState, ObjectState state) {
+
+        if (previousState.isHovered() != state.isHovered()) {
+            color = connection.getColor();
+            if (state.isHovered()) {
+                this.setStroke(BOLD_STROKE);
+            } else {
+                this.setStroke(NORMAL_STROKE);
+            }
+
+            if (state.isHovered()) {
+                this.setStroke(BOLD_STROKE);
+            } else {
+                this.setStroke(NORMAL_STROKE);
+            }
+
+            repaint();
+        }
+        super.notifyStateChanged(previousState, state);
+    }
+
+    @Override
+    public List<Point> getControlPoints() {
+        if (split) {
+            ArrayList<Point> result = new ArrayList<Point>();
+            for (Point p : controlPoints) {
+                if (p != null) {
+                    result.add(p);
+                }
+            }
+            return result;
+        } else {
+            return controlPoints;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "ConnectionWidget[" + connection + "]";
+    }
+
+    @Override
+    protected Rectangle calculateClientArea() {
+        Rectangle result = new Rectangle(clientArea);
+        result.grow(10, 10);
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,358 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.view.DiagramScene;
+import com.sun.hotspot.igv.view.SlotLayout;
+import com.sun.hotspot.igv.util.DoubleClickHandler;
+import com.sun.hotspot.igv.data.Properties;
+import com.sun.hotspot.igv.util.PropertiesSheet;
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.action.WidgetAction;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+import org.netbeans.api.visual.layout.LayoutFactory;
+import org.netbeans.api.visual.widget.LabelWidget;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.nodes.Node;
+import org.openide.nodes.Sheet;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class FigureWidget extends Widget implements Properties.Provider, PopupMenuProvider, DoubleClickHandler {
+
+    public static final boolean VERTICAL_LAYOUT = true;
+    public static final int DEPTH = 5;
+    public static final int MAX_STRING_LENGTH = 20;
+    private static final double LABEL_ZOOM_FACTOR = 0.3;
+    private static final double ZOOM_FACTOR = 0.1;
+    private Font font;
+    private Font boldFont;
+    private Figure figure;
+    private Widget leftWidget;
+    private Widget rightWidget;
+    private Widget middleWidget;
+    private ArrayList<LabelWidget> labelWidgets;
+    private DiagramScene diagramScene;
+    private boolean boundary;
+    private Node node;
+
+    public void setBoundary(boolean b) {
+        boundary = b;
+    }
+
+    public boolean isBoundary() {
+        return boundary;
+    }
+
+    public Node getNode() {
+        return node;
+    }
+
+    private String shortenString(String string) {
+        if (string.length() > MAX_STRING_LENGTH) {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < string.length(); i++) {
+                char c = string.charAt(i);
+                if (!Character.isLetter(c) || Character.isUpperCase(c)) {
+                    sb.append(c);
+                }
+            }
+            string = sb.toString();
+        }
+        return string;
+    }
+
+    public FigureWidget(final Figure f, DiagramScene s, Widget parent) {
+
+        super(s);
+
+
+        font = f.getDiagram().getFont();
+        boldFont = f.getDiagram().getFont().deriveFont(Font.BOLD);
+        this.setCheckClipping(true);
+        this.diagramScene = s;
+
+        parent.addChild(this);
+        this.figure = f;
+        this.resolveBounds(null, calculateClientArea());
+
+        leftWidget = new Widget(s);
+        this.addChild(leftWidget);
+        leftWidget.setLayout(new SlotLayout(SlotLayout.HorizontalAlignment.Right, VERTICAL_LAYOUT));//LayoutFactory.createVerticalFlowLayout(LayoutFactory.SerialAlignment.JUSTIFY, 0));
+
+        middleWidget = new Widget(s);
+        this.addChild(middleWidget);
+
+        if (VERTICAL_LAYOUT) {
+            this.setLayout(LayoutFactory.createVerticalFlowLayout());
+        } else {
+            this.setLayout(LayoutFactory.createHorizontalFlowLayout());
+        }
+
+        middleWidget.setLayout(LayoutFactory.createVerticalFlowLayout());
+
+        middleWidget.setBackground(f.getColor());
+        middleWidget.setOpaque(true);
+        assert this.getScene() != null;
+        assert this.getScene().getView() != null;
+        middleWidget.setBorder(BorderFactory.createLineBorder(Color.BLACK));
+
+
+        labelWidgets = new ArrayList<LabelWidget>();
+
+        String[] strings = figure.getLines();
+
+        for (String cur : strings) {
+
+            String displayString = cur;
+
+            LabelWidget lw = new LabelWidget(s);
+            labelWidgets.add(lw);
+            middleWidget.addChild(lw);
+            lw.setLabel(displayString);
+
+            lw.setFont(font);
+            lw.setForeground(Color.BLACK);
+            lw.setAlignment(LabelWidget.Alignment.CENTER);
+            lw.setVerticalAlignment(LabelWidget.VerticalAlignment.CENTER);
+            lw.setMaximumSize(new Dimension(f.getWidth(), 20000));
+            lw.setMinimumSize(new Dimension(f.getWidth(), 20));
+        }
+
+        rightWidget = new Widget(s);
+        this.addChild(rightWidget);
+        rightWidget.setLayout(new SlotLayout(SlotLayout.HorizontalAlignment.Left, VERTICAL_LAYOUT));//LayoutFactory.createVerticalLayout(LayoutFactory.SerialAlignment.JUSTIFY, 0));
+
+        // Initialize node for property sheet
+        node = new AbstractNode(Children.LEAF) {
+
+            @Override
+            protected Sheet createSheet() {
+                Sheet s = super.createSheet();
+                PropertiesSheet.initializeSheet(f.getProperties(), s);
+                return s;
+            }
+        };
+        node.setDisplayName(getName());
+    }
+    private boolean firstTime = true;
+
+    @Override
+    protected void paintWidget() {
+        if (firstTime) {
+            firstTime = false;
+            for (LabelWidget w : labelWidgets) {
+                String cur = w.getLabel();
+                Graphics graphics = this.getGraphics();
+                if (graphics.getFontMetrics().stringWidth(cur) > figure.getWidth()) {
+                    w.setLabel(shortenString(cur));
+                }
+            }
+        }
+        super.paintWidget();
+    }
+
+    public Widget getLeftWidget() {
+        return leftWidget;
+    }
+
+    public Widget getRightWidget() {
+        return rightWidget;
+    }
+
+    @Override
+    protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+        super.notifyStateChanged(previousState, state);
+
+        Color borderColor = Color.BLACK;
+        int thickness = 1;
+        boolean repaint = false;
+        Font f = font;
+        if (state.isSelected()) {
+            thickness = 1;
+            f = boldFont;
+        }
+
+        if (state.isHovered()) {
+            borderColor = Color.BLUE;
+        }
+
+        if (state.isHovered() != previousState.isHovered()) {
+            repaint = true;
+        }
+
+        if (state.isSelected() != previousState.isSelected()) {
+            repaint = true;
+        }
+
+        if (repaint) {
+            middleWidget.setBorder(BorderFactory.createLineBorder(borderColor, thickness));
+            for (LabelWidget labelWidget : labelWidgets) {
+                labelWidget.setFont(f);
+            }
+            repaint();
+        }
+    }
+
+    public String getName() {
+        return getProperties().get("name");
+    }
+
+    public Properties getProperties() {
+        return figure.getProperties();
+    }
+
+    public Figure getFigure() {
+        return figure;
+    }
+
+    @Override
+    protected void paintChildren() {
+
+        if (diagramScene.getRealZoomFactor() < ZOOM_FACTOR && diagramScene.getModel().getShowBlocks()) {
+            return;
+        }
+
+        Composite oldComposite = null;
+        if (boundary) {
+            oldComposite = getScene().getGraphics().getComposite();
+            float alpha = DiagramScene.ALPHA;
+            this.getScene().getGraphics().setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
+        }
+
+        if (diagramScene.getRealZoomFactor() < LABEL_ZOOM_FACTOR) {
+
+            for (LabelWidget labelWidget : labelWidgets) {
+                labelWidget.setVisible(false);
+            }
+            super.paintChildren();
+            for (LabelWidget labelWidget : labelWidgets) {
+                labelWidget.setVisible(true);
+            }
+
+        } else {
+            super.paintChildren();
+        }
+
+        if (boundary) {
+            getScene().getGraphics().setComposite(oldComposite);
+        }
+    }
+
+    public JPopupMenu getPopupMenu(Widget widget, Point point) {
+        JPopupMenu m = diagramScene.createPopupMenu();
+
+        JMenu predecessors = new JMenu("Predecessors");
+        addFigureToSubMenu(predecessors, getFigure(), false, DEPTH);
+
+        JMenu successors = new JMenu("Successors");
+        addFigureToSubMenu(successors, getFigure(), true, DEPTH);
+
+        m.addSeparator();
+        m.add(predecessors);
+        m.add(successors);
+        return m;
+    }
+
+    public void addFigureToSubMenu(JMenu subMenu, final Figure f, boolean successor, int depth) {
+        Set<Figure> set = f.getPredecessorSet();
+        if (successor) {
+            set = f.getSuccessorSet();
+        }
+
+        int count = set.size();
+        if (set.contains(f)) {
+            count--;
+        }
+
+        for (Figure f2 : set) {
+            if (f2 == f) {
+                continue;
+            }
+
+            count--;
+            addFigureToMenu(subMenu, f2, successor, depth - 1);
+            if (count > 0) {
+                subMenu.addSeparator();
+            }
+        }
+    }
+
+    public void addFigureToMenu(JMenu m, final Figure f, boolean successor, int depth) {
+
+        Action a = diagramScene.createGotoAction(f);
+
+
+        m.add(a);
+
+        if (depth > 0) {
+            String name = "Predecessors";
+            if (successor) {
+                name = "Successors";
+            }
+
+            JMenu subMenu = new JMenu(name);
+            addFigureToSubMenu(subMenu, f, successor, depth);
+            m.add(subMenu);
+        }
+
+    }
+
+    public void handleDoubleClick(Widget w, WidgetAction.WidgetMouseEvent e) {
+
+        if (diagramScene.isAllVisible()) {
+            Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getGraphToView().getGroup().getAllNodes());
+            hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet());
+            this.diagramScene.showNot(hiddenNodes);
+        } else if (isBoundary()) {
+
+            Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getHiddenNodes());
+            hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet());
+            this.diagramScene.showNot(hiddenNodes);
+        } else {
+            Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getHiddenNodes());
+            hiddenNodes.addAll(this.getFigure().getSource().getSourceNodesAsSet());
+            this.diagramScene.showNot(hiddenNodes);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.Point;
+import java.util.List;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class InputSlotWidget extends SlotWidget {
+
+    private InputSlot inputSlot;
+
+    public InputSlotWidget(InputSlot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+        super(slot, scene, parent, fw);
+        inputSlot = slot;
+        init();
+        getFigureWidget().getLeftWidget().addChild(this);
+    }
+
+    public InputSlot getInputSlot() {
+        return inputSlot;
+    }
+
+    protected Point calculateRelativeLocation() {
+        if (getFigureWidget().getBounds() == null) {
+            return new Point(0, 0);
+        }
+
+        double x = 0;
+        List<InputSlot> slots = inputSlot.getFigure().getInputSlots();
+        assert slots.contains(inputSlot);
+        return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(inputSlot))));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,293 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.netbeans.api.visual.action.ActionFactory;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.animator.SceneAnimator;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class LineWidget extends Widget implements PopupMenuProvider {
+
+    public final int BORDER = 8;
+    public final int ARROW_SIZE = 6;
+    public final int BOLD_ARROW_SIZE = 7;
+    public final int HOVER_ARROW_SIZE = 8;
+    public final int BOLD_STROKE_WIDTH = 2;
+    public final int HOVER_STROKE_WIDTH = 3;
+    private static double ZOOM_FACTOR = 0.1;
+    private OutputSlot outputSlot;
+    private DiagramScene scene;
+    private List<Connection> connections;
+    private Point from;
+    private Point to;
+    private Rectangle clientArea;
+    private Color color = Color.BLACK;
+    private LineWidget predecessor;
+    private List<LineWidget> successors;
+    private boolean highlighted;
+    private boolean popupVisible;
+    private boolean isBold;
+    private boolean isDashed;
+
+    public LineWidget(DiagramScene scene, OutputSlot s, List<Connection> connections, Point from, Point to, LineWidget predecessor, SceneAnimator animator, boolean isBold, boolean isDashed) {
+        super(scene);
+        this.scene = scene;
+        this.outputSlot = s;
+        this.connections = connections;
+        this.from = from;
+        this.to = to;
+        this.predecessor = predecessor;
+        this.successors = new ArrayList<LineWidget>();
+        if (predecessor != null) {
+            predecessor.addSuccessor(this);
+        }
+
+        this.isBold = isBold;
+        this.isDashed = isDashed;
+
+        int minX = from.x;
+        int minY = from.y;
+        int maxX = to.x;
+        int maxY = to.y;
+        if (minX > maxX) {
+            int tmp = minX;
+            minX = maxX;
+            maxX = tmp;
+        }
+
+        if (minY > maxY) {
+            int tmp = minY;
+            minY = maxY;
+            maxY = tmp;
+        }
+
+        clientArea = new Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1);
+        clientArea.grow(BORDER, BORDER);
+
+        if (connections.size() > 0) {
+            color = connections.get(0).getColor();
+        }
+
+        this.setCheckClipping(true);
+
+        this.getActions().addAction(ActionFactory.createPopupMenuAction(this));
+        if (animator == null) {
+            this.setBackground(color);
+        } else {
+            this.setBackground(Color.WHITE);
+            animator.animateBackgroundColor(this, color);
+        }
+    }
+
+    public Point getFrom() {
+        return from;
+    }
+
+    public Point getTo() {
+        return to;
+    }
+
+    private void addSuccessor(LineWidget widget) {
+        this.successors.add(widget);
+    }
+
+    @Override
+    protected Rectangle calculateClientArea() {
+        return clientArea;
+    }
+
+    @Override
+    protected void paintWidget() {
+        if (scene.getRealZoomFactor() < ZOOM_FACTOR) {
+            return;
+        }
+
+        Graphics2D g = getScene().getGraphics();
+        g.setPaint(this.getBackground());
+        ObjectState state = this.getState();
+        float width = 1.0f;
+
+        if (isBold) {
+            width = BOLD_STROKE_WIDTH;
+        }
+
+        if (highlighted || popupVisible) {
+            width = HOVER_STROKE_WIDTH;
+        }
+
+        Stroke oldStroke = g.getStroke();
+        if (isDashed) {
+            float[] dashPattern = {5, 5, 5, 5};
+            g.setStroke(new BasicStroke(width, BasicStroke.CAP_BUTT,
+                    BasicStroke.JOIN_MITER, 10,
+                    dashPattern, 0));
+        } else {
+            g.setStroke(new BasicStroke(width));
+        }
+
+        g.drawLine(from.x, from.y, to.x, to.y);
+
+        boolean sameFrom = false;
+        boolean sameTo = successors.size() == 0;
+        for (LineWidget w : successors) {
+            if (w.getFrom().equals(getTo())) {
+                sameTo = true;
+            }
+        }
+
+        if (predecessor == null || predecessor.getTo().equals(getFrom())) {
+            sameFrom = true;
+        }
+
+
+        int size = ARROW_SIZE;
+        if (isBold) {
+            size = BOLD_ARROW_SIZE;
+        }
+        if (highlighted || popupVisible) {
+            size = HOVER_ARROW_SIZE;
+        }
+        if (!sameFrom) {
+            g.fillPolygon(
+                    new int[]{from.x - size / 2, from.x + size / 2, from.x},
+                    new int[]{from.y - size / 2, from.y - size / 2, from.y + size / 2},
+                    3);
+        }
+        if (!sameTo) {
+            g.fillPolygon(
+                    new int[]{to.x - size / 2, to.x + size / 2, to.x},
+                    new int[]{to.y - size / 2, to.y - size / 2, to.y + size / 2},
+                    3);
+        }
+        g.setStroke(oldStroke);
+    }
+
+    private void setHighlighted(boolean b) {
+        this.highlighted = b;
+        this.revalidate(true);
+    }
+
+    private void setPopupVisible(boolean b) {
+        this.popupVisible = b;
+        this.revalidate(true);
+    }
+
+    @Override
+    public boolean isHitAt(Point localPoint) {
+        return Line2D.ptLineDistSq(from.x, from.y, to.x, to.y, localPoint.x, localPoint.y) <= BORDER * BORDER;
+    }
+
+    @Override
+    protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+        if (previousState.isHovered() != state.isHovered()) {
+            setRecursiveHighlighted(state.isHovered());
+        }
+    }
+
+    private void setRecursiveHighlighted(boolean b) {
+        LineWidget cur = predecessor;
+        while (cur != null) {
+            cur.setHighlighted(b);
+            cur = cur.predecessor;
+        }
+
+        highlightSuccessors(b);
+        this.setHighlighted(b);
+    }
+
+    private void highlightSuccessors(boolean b) {
+        for (LineWidget s : successors) {
+            s.setHighlighted(b);
+            s.highlightSuccessors(b);
+        }
+    }
+
+    private void setRecursivePopupVisible(boolean b) {
+        LineWidget cur = predecessor;
+        while (cur != null) {
+            cur.setPopupVisible(b);
+            cur = cur.predecessor;
+        }
+
+        popupVisibleSuccessors(b);
+        setPopupVisible(b);
+    }
+
+    private void popupVisibleSuccessors(boolean b) {
+        for (LineWidget s : successors) {
+            s.setPopupVisible(b);
+            s.popupVisibleSuccessors(b);
+        }
+    }
+
+    public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+        JPopupMenu menu = new JPopupMenu();
+        menu.add(scene.createGotoAction(outputSlot.getFigure()));
+        menu.addSeparator();
+
+        for (Connection c : connections) {
+            InputSlot s = c.getInputSlot();
+            menu.add(scene.createGotoAction(s.getFigure()));
+        }
+
+        final LineWidget w = this;
+        menu.addPopupMenuListener(new PopupMenuListener() {
+
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                w.setRecursivePopupVisible(true);
+            }
+
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                w.setRecursivePopupVisible(false);
+            }
+
+            public void popupMenuCanceled(PopupMenuEvent e) {
+            }
+        });
+
+        return menu;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,281 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Connection;
+import com.sun.hotspot.igv.graph.InputSlot;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Stroke;
+import java.awt.geom.Line2D;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import org.netbeans.api.visual.action.PopupMenuProvider;
+import org.netbeans.api.visual.model.ObjectState;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class MultiConnectionWidget extends Widget implements PopupMenuProvider {
+
+    public final int BORDER = 4;
+    public final int HOVER_STROKE_WIDTH = 3;
+
+    private static class Route {
+
+        public Point from;
+        public Point to;
+        public SortedSet<InputSlot> inputSlots;
+        public boolean decorateStart;
+        public boolean decorateEnd;
+
+        public Route(Point from, Point to) {
+            assert from != null;
+            assert to != null;
+            this.from = from;
+            this.to = to;
+            this.inputSlots = new TreeSet<InputSlot>();
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+
+            if (obj instanceof Route) {
+                Route r = (Route) obj;
+                return r.from.equals(from) && r.to.equals(to);
+            }
+
+            return super.equals(obj);
+        }
+
+        @Override
+        public int hashCode() {
+            return ((((from.x * 1711) + from.y) * 1711 + to.x) * 1711 + to.y);
+        }
+    }
+    private Rectangle clientArea;
+    private OutputSlot outputSlot;
+    private Map<Route, SortedSet<InputSlot>> routeMap;
+    private List<Route> routeList;
+    private Color color;
+    private DiagramScene diagramScene;
+    private boolean popupVisible;
+
+    /** Creates a new instance of MultiConnectionWidget */
+    public MultiConnectionWidget(OutputSlot outputSlot, DiagramScene scene) {
+        super(scene);
+
+        this.diagramScene = scene;
+        this.outputSlot = outputSlot;
+        this.setCheckClipping(true);
+
+        routeMap = new HashMap<Route, SortedSet<InputSlot>>();
+        routeList = new ArrayList<Route>();
+        color = Color.BLACK;
+
+        for (Connection c : outputSlot.getConnections()) {
+            List<Point> controlPoints = c.getControlPoints();
+            InputSlot inputSlot = (InputSlot) c.getTo();
+            color = c.getColor();
+
+            for (int i = 1; i < controlPoints.size(); i++) {
+                Point prev = controlPoints.get(i - 1);
+                Point cur = controlPoints.get(i);
+
+                if (prev != null && cur != null) {
+                    Route r = new Route(prev, cur);
+                    if (routeMap.containsKey(r)) {
+                        SortedSet<InputSlot> set = routeMap.get(r);
+                        set.add(inputSlot);
+                    } else {
+                        SortedSet<InputSlot> set = new TreeSet<InputSlot>(Slot.slotFigureComparator);
+                        set.add(inputSlot);
+                        routeMap.put(r, set);
+                        routeList.add(r);
+                    }
+                }
+            }
+        }
+
+        if (routeList.size() == 0) {
+            clientArea = new Rectangle();
+        } else {
+            for (Route r : routeList) {
+
+                int x = r.from.x;
+                int y = r.from.y;
+
+                int x2 = r.to.x;
+                int y2 = r.to.y;
+
+                if (x > x2) {
+                    int tmp = x;
+                    x = x2;
+                    x2 = tmp;
+                }
+
+                if (y > y2) {
+                    int tmp = y;
+                    y = y2;
+                    y2 = tmp;
+                }
+
+                int width = x2 - x + 1;
+                int height = y2 - y + 1;
+
+                Rectangle rect = new Rectangle(x, y, width, height);
+                if (clientArea == null) {
+                    clientArea = rect;
+                } else {
+                    clientArea = clientArea.union(rect);
+                }
+            }
+
+            clientArea.grow(BORDER, BORDER);
+        }
+    }
+
+    private void setHoverPosition(Point location) {
+        Route r = getNearest(location);
+    }
+
+    private Route getNearest(Point localLocation) {
+
+        double minDist = Double.MAX_VALUE;
+        Route result = null;
+        for (Route r : routeList) {
+            double dist = Line2D.ptSegDistSq((double) r.from.x, (double) r.from.y, (double) r.to.x, (double) r.to.y, (double) localLocation.x, (double) localLocation.y);
+            if (dist < minDist) {
+                result = r;
+                minDist = dist;
+            }
+        }
+
+        assert result != null;
+
+        return result;
+    }
+
+    @Override
+    public boolean isHitAt(Point localLocation) {
+        if (!super.isHitAt(localLocation)) {
+            return false;
+        }
+
+        for (Route r : routeList) {
+            double dist = Line2D.ptSegDistSq((double) r.from.x, (double) r.from.y, (double) r.to.x, (double) r.to.y, (double) localLocation.x, (double) localLocation.y);
+            if (dist < BORDER * BORDER) {
+                setHoverPosition(localLocation);
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    protected Rectangle calculateClientArea() {
+        return clientArea;
+    }
+
+    @Override
+    protected void paintWidget() {
+        Graphics2D g = getScene().getGraphics();
+        //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+        g.setColor(this.color);
+        ObjectState state = this.getState();
+        float width = 1.0f;
+        if (state.isHovered() || this.popupVisible) {
+            width = HOVER_STROKE_WIDTH;
+        }
+
+        Stroke oldStroke = g.getStroke();
+        g.setStroke(new BasicStroke(width));
+        for (Route r : routeList) {
+            g.drawLine(r.from.x, r.from.y, r.to.x, r.to.y);
+        }
+        g.setStroke(oldStroke);
+    }
+
+    @Override
+    protected void notifyStateChanged(ObjectState previousState, ObjectState state) {
+
+        boolean repaint = false;
+
+        if (state.isHovered() != previousState.isHovered()) {
+            repaint = true;
+        }
+
+        repaint();
+    }
+
+    public JPopupMenu getPopupMenu(Widget widget, Point localLocation) {
+        JPopupMenu menu = new JPopupMenu();
+        Route r = getNearest(localLocation);
+        assert r != null;
+        assert routeMap.containsKey(r);
+
+        menu.add(diagramScene.createGotoAction(outputSlot.getFigure()));
+        menu.addSeparator();
+
+        SortedSet<InputSlot> set = this.routeMap.get(r);
+        for (InputSlot s : set) {
+            menu.add(diagramScene.createGotoAction(s.getFigure()));
+        }
+
+        final MultiConnectionWidget w = this;
+        menu.addPopupMenuListener(new PopupMenuListener() {
+
+            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                w.popupVisible = true;
+                w.repaint();
+            }
+
+            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                w.popupVisible = false;
+                w.repaint();
+            }
+
+            public void popupMenuCanceled(PopupMenuEvent e) {
+            }
+        });
+
+        return menu;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.view.DiagramScene;
+import java.awt.Point;
+import java.util.List;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public class OutputSlotWidget extends SlotWidget {
+
+    private OutputSlot outputSlot;
+
+    public OutputSlotWidget(OutputSlot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+        super(slot, scene, parent, fw);
+        outputSlot = slot;
+        init();
+        getFigureWidget().getRightWidget().addChild(this);
+    }
+
+    public OutputSlot getOutputSlot() {
+        return outputSlot;
+    }
+
+    protected Point calculateRelativeLocation() {
+        if (getFigureWidget().getBounds() == null) {
+            return new Point(0, 0);
+        }
+
+        double x = this.getFigureWidget().getBounds().width;
+        List<OutputSlot> slots = outputSlot.getFigure().getOutputSlots();
+        assert slots.contains(outputSlot);
+        return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(outputSlot))));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,126 @@
+/*
+ * 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.
+ *
+ */
+package com.sun.hotspot.igv.view.widgets;
+
+import com.sun.hotspot.igv.graph.Figure;
+import com.sun.hotspot.igv.graph.OutputSlot;
+import com.sun.hotspot.igv.graph.Slot;
+import com.sun.hotspot.igv.view.*;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
+import org.netbeans.api.visual.widget.Widget;
+
+/**
+ *
+ * @author Thomas Wuerthinger
+ */
+public abstract class SlotWidget extends Widget {
+
+    private Slot slot;
+    private FigureWidget figureWidget;
+    private Image bufferImage;
+    private static double TEXT_ZOOM_FACTOR = 0.9;
+    private static double ZOOM_FACTOR = 0.6;
+    private DiagramScene scene;
+
+    public SlotWidget(Slot slot, DiagramScene scene, Widget parent, FigureWidget fw) {
+        super(scene);
+        this.scene = scene;
+        this.slot = slot;
+        figureWidget = fw;
+        this.setToolTipText("<HTML>" + slot.getName() + "</HTML>");
+        this.setCheckClipping(true);
+    }
+
+    public Point getAnchorPosition() {
+        Point p = new Point(figureWidget.getFigure().getPosition());
+        Point p2 = slot.getRelativePosition();
+        p.translate(p2.x, p2.y);
+        return p;
+    }
+
+    protected void init() {
+
+        Point p = calculateRelativeLocation();
+        Rectangle r = calculateClientArea();
+        p = new Point(p.x, p.y - r.height / 2);
+        this.setPreferredLocation(p);
+    }
+
+    public Slot getSlot() {
+        return slot;
+    }
+
+    public FigureWidget getFigureWidget() {
+        return figureWidget;
+    }
+
+    @Override
+    protected void paintWidget() {
+
+        if (scene.getRealZoomFactor() < ZOOM_FACTOR) {
+            return;
+        }
+
+        if (bufferImage == null) {
+            Graphics2D g = this.getGraphics();
+            g.setColor(Color.DARK_GRAY);
+            int w = this.getBounds().width;
+            int h = this.getBounds().height;
+
+            if (getSlot().getShortName() != null && getSlot().getShortName().length() > 0 && scene.getRealZoomFactor() >= TEXT_ZOOM_FACTOR) {
+                Font f = new Font("Arial", Font.PLAIN, 8);
+                g.setFont(f.deriveFont(7.5f));
+                Rectangle2D r1 = g.getFontMetrics().getStringBounds(getSlot().getShortName(), g);
+                g.drawString(getSlot().getShortName(), (int) (this.getBounds().width - r1.getWidth()) / 2, (int) (this.getBounds().height + r1.getHeight()) / 2);
+            } else {
+
+                if (slot instanceof OutputSlot) {
+                    g.fillArc(w / 4, -h / 4 - 1, w / 2, h / 2, 180, 180);
+                } else {
+                    g.fillArc(w / 4, 3 * h / 4, w / 2, h / 2, 0, 180);
+                }
+            }
+        }
+    }
+
+    @Override
+    protected Rectangle calculateClientArea() {
+        return new Rectangle(0, 0, Figure.SLOT_WIDTH, Figure.SLOT_WIDTH);
+    }
+
+    protected abstract Point calculateRelativeLocation();
+
+    protected double calculateRelativeY(int size, int index) {
+        assert index >= 0 && index < size;
+        assert size > 0;
+        double height = getFigureWidget().getBounds().getHeight();
+        return height * (index + 1) / (size + 1);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,7 @@
+currentVersion=IdealGraphVisualizer {0}
+LBL_splash_window_title=Starting IdealGraphVisualizer
+SPLASH_WIDTH=475
+SplashProgressBarBounds=0,268,473,6
+SplashProgressBarColor=0xFFFFFF
+SplashRunningTextBounds=269,253,205,12
+SplashRunningTextColor=0xFFFFFF
Binary file hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif has changed
Binary file hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,2 @@
+CTL_MainWindow_Title=IdealGraphVisualizer {0}
+CTL_MainWindow_Title_No_Project=IdealGraphVisualizer {0}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/build.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="IdealGraphVisualizer" basedir=".">
+    <description>Builds the module suite IdealGraphVisualizer.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="IdealGraphVisualizer-impl" basedir=".." xmlns:sproject="http://www.netbeans.org/ns/nb-module-suite-project/1">
+    <property file="nbproject/private/platform-private.properties"/>
+    <property file="nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <sproject:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir"/>
+    <sproject:property name="netbeans.dest.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir"/>
+    <fail message="You must define 'nbplatform.${nbplatform.active}.harness.dir'">
+        <condition>
+            <not>
+                <available file="${harness.dir}" type="dir"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/suite.xml"/>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=72833581
+build.xml.script.CRC32=e9c757c5
+build.xml.stylesheet.CRC32=531c622b
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=72833581
+nbproject/build-impl.xml.script.CRC32=1b6f3648
+nbproject/build-impl.xml.stylesheet.CRC32=196c7090
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+# Deprecated since 5.0u1; for compatibility with 5.0:
+disabled.clusters=\
+    apisupport1,\
+    harness,\
+    ide8,\
+    java1,\
+    nb6.0,\
+    profiler2
+disabled.modules=\
+    org.netbeans.core.execution,\
+    org.netbeans.core.multiview,\
+    org.netbeans.core.output2,\
+    org.netbeans.modules.applemenu,\
+    org.netbeans.modules.autoupdate.services,\
+    org.netbeans.modules.autoupdate.ui,\
+    org.netbeans.modules.core.kit,\
+    org.netbeans.modules.favorites,\
+    org.netbeans.modules.javahelp,\
+    org.netbeans.modules.masterfs,\
+    org.netbeans.modules.options.keymap,\
+    org.netbeans.modules.sendopts,\
+    org.netbeans.modules.templates,\
+    org.openide.compat,\
+    org.openide.execution,\
+    org.openide.util.enumerations
+enabled.clusters=\
+    platform7
+nbjdk.active=default
+nbplatform.active=default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,40 @@
+app.icon=branding/core/core.jar/org/netbeans/core/startup/frame48.gif
+app.name=idealgraphvisualizer
+app.title=IdealGraphVisualizer
+branding.token=${app.name}
+modules=\
+    ${project.com.sun.hotspot.igv.graph}:\
+    ${project.com.sun.hotspot.igv.coordinator}:\
+    ${project.com.sun.hotspot.igv.filter}:\
+    ${project.com.sun.hotspot.igv.hierarchicallayout}:\
+    ${project.com.sun.hotspot.igv.layout}:\
+    ${project.com.sun.hotspot.igv.controlflow}:\
+    ${project.com.sun.hotspot.igv.data}:\
+    ${project.com.sun.hotspot.igv.view}:\
+    ${project.com.sun.hotspot.igv.bytecodes}:\
+    ${project.com.sun.hotspot.igv.difference}:\
+    ${project.com.sun.hotspot.igv.settings}:\
+    ${project.com.sun.hotspot.igv.util}:\
+    ${project.com.sun.hotspot.igv.rhino}:\
+    ${project.com.sun.hotspot.igv.svg}:\
+    ${project.com.sun.hotspot.connection}:\
+    ${project.com.sun.hotspot.igv.servercompilerscheduler}:\
+    ${project.com.sun.hotspot.igv.filterwindow}
+project.com.sun.hotspot.connection=NetworkConnection
+project.com.sun.hotspot.igv.bytecodes=Bytecodes
+project.com.sun.hotspot.igv.controlflow=ControlFlow
+project.com.sun.hotspot.igv.coordinator=Coordinator
+project.com.sun.hotspot.igv.data=Data
+project.com.sun.hotspot.igv.difference=Difference
+project.com.sun.hotspot.igv.filter=Filter
+project.com.sun.hotspot.igv.filterwindow=FilterWindow
+project.com.sun.hotspot.igv.graph=Graph
+project.com.sun.hotspot.igv.hierarchicallayout=HierarchicalLayout
+project.com.sun.hotspot.igv.layout=Layout
+project.com.sun.hotspot.igv.rhino=RhinoScriptEngineProxy
+project.com.sun.hotspot.igv.servercompilerscheduler=ServerCompiler
+project.com.sun.hotspot.igv.settings=Settings
+project.com.sun.hotspot.igv.svg=BatikSVGProxy
+project.com.sun.hotspot.igv.view=View
+project.com.sun.hotspot.igv.util=Util
+run.args = -server -J-Xms64m -J-Xmx512m -J-da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project.suite</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-suite-project/1">
+            <name>IdealGraphVisualizer</name>
+        </data>
+    </configuration>
+</project>
--- a/hotspot/src/share/tools/MakeDeps/Database.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/tools/MakeDeps/Database.java	Wed Jul 05 16:39:00 2017 +0200
@@ -36,6 +36,7 @@
   private FileList outerFiles;
   private FileList indivIncludes;
   private FileList grandInclude; // the results for the grand include file
+  private HashMap<String,String> platformDepFiles;
   private long threshold;
   private int nOuterFiles;
   private int nPrecompiledFiles;
@@ -57,6 +58,7 @@
     outerFiles      = new FileList("outerFiles", plat);
     indivIncludes   = new FileList("IndivIncludes", plat);
     grandInclude    = new FileList(plat.getGIFileTemplate().nameOfList(), plat);
+    platformDepFiles = new HashMap<String,String>();
 
     threshold = t;
     nOuterFiles = 0;
@@ -209,6 +211,10 @@
               FileList p = allFiles.listForFile(includer);
               p.setPlatformDependentInclude(pdName.dirPreStemSuff());
 
+              // Record the implicit include of this file so that the
+              // dependencies for precompiled headers can mention it.
+              platformDepFiles.put(newIncluder, includer);
+
               // Add an implicit dependency on platform
               // specific file for the generic file
 
@@ -408,6 +414,12 @@
       for (Iterator iter = grandInclude.iterator(); iter.hasNext(); ) {
         FileList list = (FileList) iter.next();
         gd.println(list.getName() + " \\");
+        String platformDep = platformDepFiles.get(list.getName());
+        if (platformDep != null) {
+            // make sure changes to the platform dependent file will
+            // cause regeneration of the pch file.
+            gd.println(platformDep + " \\");
+        }
       }
       gd.println();
       gd.println();
--- a/hotspot/src/share/vm/adlc/adlc.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/adlc/adlc.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -29,11 +29,7 @@
 // standard library constants
 #include "stdio.h"
 #include "stdlib.h"
-#if _MSC_VER >= 1300  // Visual C++ 7.0 or later
 #include <iostream>
-#else
-#include <iostream.h>
-#endif
 #include "string.h"
 #include "ctype.h"
 #include "stdarg.h"
--- a/hotspot/src/share/vm/adlc/filebuff.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/adlc/filebuff.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -23,13 +23,9 @@
  */
 
 // FILEBUFF.HPP - Definitions for parser file buffering routines
+#include <iostream>
 
-#if _MSC_VER >= 1300  // Visual C++ 7.0 or later
-#include <iostream>
-#else
-#include <iostream.h>
-#endif
-
+using namespace std;
 // STRUCTURE FOR HANDLING INPUT AND OUTPUT FILES
 typedef struct {
   const char *_name;
--- a/hotspot/src/share/vm/adlc/formssel.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/adlc/formssel.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -729,6 +729,7 @@
         !strcmp(_matrule->_rChild->_opType,"DecodeN")    ||
         !strcmp(_matrule->_rChild->_opType,"EncodeP")    ||
         !strcmp(_matrule->_rChild->_opType,"LoadN")      ||
+        !strcmp(_matrule->_rChild->_opType,"LoadNKlass") ||
         !strcmp(_matrule->_rChild->_opType,"CreateEx")   ||  // type of exception
         !strcmp(_matrule->_rChild->_opType,"CheckCastPP")) ) return true;
   else if ( is_ideal_load() == Form::idealP )                return true;
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -1004,6 +1004,9 @@
 
   DEBUG_ONLY(mark_bitmap()->verify_clear();)
   DEBUG_ONLY(summary_data().verify_clear();)
+
+  // Have worker threads release resources the next time they run a task.
+  gc_task_manager()->release_all_resources();
 }
 
 void PSParallelCompact::post_compact()
@@ -1949,12 +1952,6 @@
   TimeStamp compaction_start;
   TimeStamp collection_exit;
 
-  // "serial_CM" is needed until the parallel implementation
-  // of the move and update is done.
-  ParCompactionManager* serial_CM = new ParCompactionManager();
-  // Don't initialize more than once.
-  // serial_CM->initialize(&summary_data(), mark_bitmap());
-
   ParallelScavengeHeap* heap = gc_heap();
   GCCause::Cause gc_cause = heap->gc_cause();
   PSYoungGen* young_gen = heap->young_gen();
@@ -1969,6 +1966,10 @@
   PreGCValues pre_gc_values;
   pre_compact(&pre_gc_values);
 
+  // Get the compaction manager reserved for the VM thread.
+  ParCompactionManager* const vmthread_cm =
+    ParCompactionManager::manager_array(gc_task_manager()->workers());
+
   // Place after pre_compact() where the number of invocations is incremented.
   AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
 
@@ -2008,7 +2009,7 @@
     bool marked_for_unloading = false;
 
     marking_start.update();
-    marking_phase(serial_CM, maximum_heap_compaction);
+    marking_phase(vmthread_cm, maximum_heap_compaction);
 
 #ifndef PRODUCT
     if (TraceParallelOldGCMarkingPhase) {
@@ -2039,7 +2040,7 @@
 #endif
 
     bool max_on_system_gc = UseMaximumCompactionOnSystemGC && is_system_gc;
-    summary_phase(serial_CM, maximum_heap_compaction || max_on_system_gc);
+    summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc);
 
 #ifdef ASSERT
     if (VerifyParallelOldWithMarkSweep &&
@@ -2067,13 +2068,13 @@
       // code can use the the forwarding pointers to
       // check the new pointer calculation.  The restore_marks()
       // has to be done before the real compact.
-      serial_CM->set_action(ParCompactionManager::VerifyUpdate);
-      compact_perm(serial_CM);
-      compact_serial(serial_CM);
-      serial_CM->set_action(ParCompactionManager::ResetObjects);
-      compact_perm(serial_CM);
-      compact_serial(serial_CM);
-      serial_CM->set_action(ParCompactionManager::UpdateAndCopy);
+      vmthread_cm->set_action(ParCompactionManager::VerifyUpdate);
+      compact_perm(vmthread_cm);
+      compact_serial(vmthread_cm);
+      vmthread_cm->set_action(ParCompactionManager::ResetObjects);
+      compact_perm(vmthread_cm);
+      compact_serial(vmthread_cm);
+      vmthread_cm->set_action(ParCompactionManager::UpdateAndCopy);
 
       // For debugging only
       PSMarkSweep::restore_marks();
@@ -2084,16 +2085,14 @@
     compaction_start.update();
     // Does the perm gen always have to be done serially because
     // klasses are used in the update of an object?
-    compact_perm(serial_CM);
+    compact_perm(vmthread_cm);
 
     if (UseParallelOldGCCompacting) {
       compact();
     } else {
-      compact_serial(serial_CM);
+      compact_serial(vmthread_cm);
     }
 
-    delete serial_CM;
-
     // Reset the mark bitmap, summary data, and do other bookkeeping.  Must be
     // done before resizing.
     post_compact();
--- a/hotspot/src/share/vm/includeDB_compiler2	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/includeDB_compiler2	Wed Jul 05 16:39:00 2017 +0200
@@ -1084,6 +1084,7 @@
 idealGraphPrinter.hpp                   vectset.hpp
 idealGraphPrinter.hpp                   growableArray.hpp
 idealGraphPrinter.hpp                   ostream.hpp
+idealGraphPrinter.hpp                   xmlstream.hpp
 
 idealGraphPrinter.cpp                   idealGraphPrinter.hpp
 idealGraphPrinter.cpp                   chaitin.hpp
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -196,6 +196,8 @@
   assert(_whole_heap.contains(new_region),
            "attempt to cover area not in reserved area");
   debug_only(verify_guard();)
+  // collided is true if the expansion would push into another committed region
+  debug_only(bool collided = false;)
   int const ind = find_covering_region_by_base(new_region.start());
   MemRegion const old_region = _covered[ind];
   assert(old_region.start() == new_region.start(), "just checking");
@@ -211,12 +213,36 @@
     }
     // Align the end up to a page size (starts are already aligned).
     jbyte* const new_end = byte_after(new_region.last());
-    HeapWord* const new_end_aligned =
+    HeapWord* new_end_aligned =
       (HeapWord*) align_size_up((uintptr_t)new_end, _page_size);
     assert(new_end_aligned >= (HeapWord*) new_end,
            "align up, but less");
+    int ri = 0;
+    for (ri = 0; ri < _cur_covered_regions; ri++) {
+      if (ri != ind) {
+        if (_committed[ri].contains(new_end_aligned)) {
+          assert((new_end_aligned >= _committed[ri].start()) &&
+                 (_committed[ri].start() > _committed[ind].start()),
+                 "New end of committed region is inconsistent");
+          new_end_aligned = _committed[ri].start();
+          assert(new_end_aligned > _committed[ind].start(),
+            "New end of committed region is before start");
+          debug_only(collided = true;)
+          // Should only collide with 1 region
+          break;
+        }
+      }
+    }
+#ifdef ASSERT
+    for (++ri; ri < _cur_covered_regions; ri++) {
+      assert(!_committed[ri].contains(new_end_aligned),
+        "New end of committed region is in a second committed region");
+    }
+#endif
     // The guard page is always committed and should not be committed over.
-    HeapWord* const new_end_for_commit = MIN2(new_end_aligned, _guard_region.start());
+    HeapWord* const new_end_for_commit = MIN2(new_end_aligned,
+                                              _guard_region.start());
+
     if (new_end_for_commit > cur_committed.end()) {
       // Must commit new pages.
       MemRegion const new_committed =
@@ -239,9 +265,11 @@
       if (!uncommit_region.is_empty()) {
         if (!os::uncommit_memory((char*)uncommit_region.start(),
                                  uncommit_region.byte_size())) {
-          // Do better than this for Merlin
-          vm_exit_out_of_memory(uncommit_region.byte_size(),
-            "card table contraction");
+          assert(false, "Card table contraction failed");
+          // The call failed so don't change the end of the
+          // committed region.  This is better than taking the
+          // VM down.
+          new_end_aligned = _committed[ind].end();
         }
       }
     }
@@ -257,8 +285,25 @@
     }
     assert(index_for(new_region.last()) < (int) _guard_index,
       "The guard card will be overwritten");
-    jbyte* const end = byte_after(new_region.last());
+    // This line commented out cleans the newly expanded region and
+    // not the aligned up expanded region.
+    // jbyte* const end = byte_after(new_region.last());
+    jbyte* const end = (jbyte*) new_end_for_commit;
+    assert((end >= byte_after(new_region.last())) || collided,
+      "Expect to be beyond new region unless impacting another region");
     // do nothing if we resized downward.
+#ifdef ASSERT
+    for (int ri = 0; ri < _cur_covered_regions; ri++) {
+      if (ri != ind) {
+        // The end of the new committed region should not
+        // be in any existing region unless it matches
+        // the start of the next region.
+        assert(!_committed[ri].contains(end) ||
+               (_committed[ri].start() == (HeapWord*) end),
+               "Overlapping committed regions");
+      }
+    }
+#endif
     if (entry < end) {
       memset(entry, clean_card, pointer_delta(end, entry, sizeof(jbyte)));
     }
--- a/hotspot/src/share/vm/oops/symbolKlass.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/oops/symbolKlass.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -209,10 +209,7 @@
 
 void symbolKlass::oop_print_on(oop obj, outputStream* st) {
   st->print("Symbol: '");
-  symbolOop sym = symbolOop(obj);
-  for (int i = 0; i < sym->utf8_length(); i++) {
-    st->print("%c", sym->byte_at(i));
-  }
+  symbolOop(obj)->print_symbol_on(st);
   st->print("'");
 }
 
--- a/hotspot/src/share/vm/oops/symbolOop.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/oops/symbolOop.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -68,8 +68,17 @@
 
 void symbolOopDesc::print_symbol_on(outputStream* st) {
   st = st ? st : tty;
-  for (int index = 0; index < utf8_length(); index++)
-    st->put((char)byte_at(index));
+  int length = UTF8::unicode_length((const char*)bytes(), utf8_length());
+  const char *ptr = (const char *)bytes();
+  jchar value;
+  for (int index = 0; index < length; index++) {
+    ptr = UTF8::next(ptr, &value);
+    if (value >= 32 && value < 127 || value == '\'' || value == '\\') {
+      st->put(value);
+    } else {
+      st->print("\\u%04x", value);
+    }
+  }
 }
 
 jchar* symbolOopDesc::as_unicode(int& length) const {
--- a/hotspot/src/share/vm/opto/callnode.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/callnode.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -632,7 +632,7 @@
   const TypeOopPtr *adrInst_t  = addr_t->isa_oopptr();
 
   // if not an InstPtr or not an instance type, assume the worst
-  if (adrInst_t == NULL || !adrInst_t->is_instance_field()) {
+  if (adrInst_t == NULL || !adrInst_t->is_known_instance_field()) {
     return true;
   }
   Compile *C = phase->C;
--- a/hotspot/src/share/vm/opto/cfgnode.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -708,12 +708,12 @@
 // Split out an instance type from a bottom phi.
 PhiNode* PhiNode::split_out_instance(const TypePtr* at, PhaseIterGVN *igvn) const {
   const TypeOopPtr *t_oop = at->isa_oopptr();
-  assert(t_oop != NULL && t_oop->is_instance(), "expecting instance oopptr");
+  assert(t_oop != NULL && t_oop->is_known_instance(), "expecting instance oopptr");
   const TypePtr *t = adr_type();
   assert(type() == Type::MEMORY &&
          (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM ||
-          t->isa_oopptr() && !t->is_oopptr()->is_instance() &&
-          t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop),
+          t->isa_oopptr() && !t->is_oopptr()->is_known_instance() &&
+          t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop),
          "bottom or raw memory required");
 
   // Check if an appropriate node already exists.
@@ -854,7 +854,8 @@
   // Until we have harmony between classes and interfaces in the type
   // lattice, we must tread carefully around phis which implicitly
   // convert the one to the other.
-  const TypeInstPtr* ttip = _type->isa_narrowoop() ? _type->isa_narrowoop()->make_oopptr()->isa_instptr() :_type->isa_instptr();
+  const TypePtr* ttp = _type->make_ptr();
+  const TypeInstPtr* ttip = (ttp != NULL) ? ttp->isa_instptr() : NULL;
   bool is_intf = false;
   if (ttip != NULL) {
     ciKlass* k = ttip->klass();
@@ -873,7 +874,8 @@
       // of all the input types.  The lattice is not distributive in
       // such cases.  Ward off asserts in type.cpp by refusing to do
       // meets between interfaces and proper classes.
-      const TypeInstPtr* tiip = ti->isa_narrowoop() ? ti->is_narrowoop()->make_oopptr()->isa_instptr() : ti->isa_instptr();
+      const TypePtr* tip = ti->make_ptr();
+      const TypeInstPtr* tiip = (tip != NULL) ? tip->isa_instptr() : NULL;
       if (tiip) {
         bool ti_is_intf = false;
         ciKlass* k = tiip->klass();
@@ -930,13 +932,14 @@
     // class-typed Phi and an interface flows in, it's possible that the meet &
     // join report an interface back out.  This isn't possible but happens
     // because the type system doesn't interact well with interfaces.
-    const TypeInstPtr *jtip = jt->isa_narrowoop() ? jt->isa_narrowoop()->make_oopptr()->isa_instptr() : jt->isa_instptr();
+    const TypePtr *jtp = jt->make_ptr();
+    const TypeInstPtr *jtip = (jtp != NULL) ? jtp->isa_instptr() : NULL;
     if( jtip && ttip ) {
       if( jtip->is_loaded() &&  jtip->klass()->is_interface() &&
           ttip->is_loaded() && !ttip->klass()->is_interface() ) {
         // Happens in a CTW of rt.jar, 320-341, no extra flags
         assert(ft == ttip->cast_to_ptr_type(jtip->ptr()) ||
-               ft->isa_narrowoop() && ft->isa_narrowoop()->make_oopptr() == ttip->cast_to_ptr_type(jtip->ptr()), "");
+               ft->isa_narrowoop() && ft->make_ptr() == ttip->cast_to_ptr_type(jtip->ptr()), "");
         jt = ft;
       }
     }
--- a/hotspot/src/share/vm/opto/cfgnode.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/cfgnode.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -129,7 +129,7 @@
   };
 
   PhiNode( Node *r, const Type *t, const TypePtr* at = NULL,
-           const int iid = TypeOopPtr::UNKNOWN_INSTANCE,
+           const int iid = TypeOopPtr::InstanceTop,
            const int iidx = Compile::AliasIdxTop,
            const int ioffs = Type::OffsetTop )
     : TypeNode(t,r->req()),
--- a/hotspot/src/share/vm/opto/compile.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/compile.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -313,9 +313,6 @@
   _compile->begin_method();
 }
 CompileWrapper::~CompileWrapper() {
-  if (_compile->failing()) {
-    _compile->print_method("Failed");
-  }
   _compile->end_method();
   if (_compile->scratch_buffer_blob() != NULL)
     BufferBlob::free(_compile->scratch_buffer_blob());
@@ -604,6 +601,8 @@
   if (failing())  return;
   NOT_PRODUCT( verify_graph_edges(); )
 
+  print_method("Before Matching");
+
 #ifndef PRODUCT
   if (PrintIdeal) {
     ttyLocker ttyl;  // keep the following output all in one block
@@ -1070,7 +1069,7 @@
       // No constant oop pointers (such as Strings); they alias with
       // unknown strings.
       tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset);
-    } else if( to->is_instance_field() ) {
+    } else if( to->is_known_instance_field() ) {
       tj = to; // Keep NotNull and klass_is_exact for instance type
     } else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) {
       // During the 2nd round of IterGVN, NotNull castings are removed.
@@ -1191,8 +1190,8 @@
   _field = NULL;
   _is_rewritable = true; // default
   const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL;
-  if (atoop != NULL && atoop->is_instance()) {
-    const TypeOopPtr *gt = atoop->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
+  if (atoop != NULL && atoop->is_known_instance()) {
+    const TypeOopPtr *gt = atoop->cast_to_instance_id(TypeOopPtr::InstanceBot);
     _general_index = Compile::current()->get_alias_index(gt);
   } else {
     _general_index = 0;
@@ -1481,7 +1480,7 @@
 
   NOT_PRODUCT( verify_graph_edges(); )
 
-  print_method("Start");
+  print_method("After Parsing");
 
  {
   // Iterative Global Value Numbering, including ideal transforms
@@ -1688,7 +1687,7 @@
     Output();
   }
 
-  print_method("End");
+  print_method("Final Code");
 
   // He's dead, Jim.
   _cfg     = (PhaseCFG*)0xdeadbeef;
@@ -2017,7 +2016,7 @@
         for (uint i = 0; i < cnt; i++) {
           Node* m = r->raw_out(i);
           if (m!= NULL && m->Opcode() == Op_ConN &&
-              m->bottom_type()->is_narrowoop()->make_oopptr() == t) {
+              m->bottom_type()->make_ptr() == t) {
             nn = m;
             break;
           }
@@ -2070,7 +2069,7 @@
             }
           }
         } else if (t->isa_oopptr()) {
-          in2 = ConNode::make(C, t->is_oopptr()->make_narrowoop());
+          in2 = ConNode::make(C, t->make_narrowoop());
         }
       }
       if( in2 != NULL ) {
@@ -2466,6 +2465,9 @@
     // Record the first failure reason.
     _failure_reason = reason;
   }
+  if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) {
+    C->print_method(_failure_reason);
+  }
   _root = NULL;  // flush the graph, too
 }
 
--- a/hotspot/src/share/vm/opto/connode.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/connode.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -565,26 +565,12 @@
 }
 
 const Type *DecodeNNode::Value( PhaseTransform *phase ) const {
-  if (phase->type( in(1) ) == TypeNarrowOop::NULL_PTR) {
-    return TypePtr::NULL_PTR;
-  }
-  return bottom_type();
-}
+  const Type *t = phase->type( in(1) );
+  if (t == Type::TOP) return Type::TOP;
+  if (t == TypeNarrowOop::NULL_PTR) return TypePtr::NULL_PTR;
 
-Node* DecodeNNode::decode(PhaseTransform* phase, Node* value) {
-  if (value->is_EncodeP()) {
-    // (DecodeN (EncodeP p)) -> p
-    return value->in(1);
-  }
-  const Type* newtype = value->bottom_type();
-  if (newtype == TypeNarrowOop::NULL_PTR) {
-    return phase->transform(new (phase->C, 1) ConPNode(TypePtr::NULL_PTR));
-  } else if (newtype->isa_narrowoop()) {
-    return phase->transform(new (phase->C, 2) DecodeNNode(value, newtype->is_narrowoop()->make_oopptr()));
-  } else {
-    ShouldNotReachHere();
-    return NULL; // to make C++ compiler happy.
-  }
+  assert(t->isa_narrowoop(), "only  narrowoop here");
+  return t->make_ptr();
 }
 
 Node* EncodePNode::Identity(PhaseTransform* phase) {
@@ -599,27 +585,14 @@
 }
 
 const Type *EncodePNode::Value( PhaseTransform *phase ) const {
-  if (phase->type( in(1) ) == TypePtr::NULL_PTR) {
-    return TypeNarrowOop::NULL_PTR;
-  }
-  return bottom_type();
+  const Type *t = phase->type( in(1) );
+  if (t == Type::TOP) return Type::TOP;
+  if (t == TypePtr::NULL_PTR) return TypeNarrowOop::NULL_PTR;
+
+  assert(t->isa_oopptr(), "only oopptr here");
+  return t->make_narrowoop();
 }
 
-Node* EncodePNode::encode(PhaseTransform* phase, Node* value) {
-  if (value->is_DecodeN()) {
-    // (EncodeP (DecodeN p)) -> p
-    return value->in(1);
-  }
-  const Type* newtype = value->bottom_type();
-  if (newtype == TypePtr::NULL_PTR) {
-    return phase->transform(new (phase->C, 1) ConNNode(TypeNarrowOop::NULL_PTR));
-  } else if (newtype->isa_oopptr()) {
-    return phase->transform(new (phase->C, 2) EncodePNode(value, newtype->is_oopptr()->make_narrowoop()));
-  } else {
-    ShouldNotReachHere();
-    return NULL; // to make C++ compiler happy.
-  }
-}
 
 Node *EncodePNode::Ideal_DU_postCCP( PhaseCCP *ccp ) {
   return MemNode::Ideal_common_DU_postCCP(ccp, this, in(1));
--- a/hotspot/src/share/vm/opto/connode.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/connode.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -280,7 +280,6 @@
   virtual const Type *Value( PhaseTransform *phase ) const;
   virtual uint  ideal_reg() const { return Op_RegN; }
 
-  static Node* encode(PhaseTransform* phase, Node* value);
   virtual Node *Ideal_DU_postCCP( PhaseCCP *ccp );
 };
 
@@ -300,8 +299,6 @@
   virtual Node *Identity( PhaseTransform *phase );
   virtual const Type *Value( PhaseTransform *phase ) const;
   virtual uint  ideal_reg() const { return Op_RegP; }
-
-  static Node* decode(PhaseTransform* phase, Node* value);
 };
 
 //------------------------------Conv2BNode-------------------------------------
@@ -549,10 +546,18 @@
   virtual uint hash() const ;                  // { return NO_HASH; }
   virtual uint cmp( const Node &n ) const;
 public:
-  Opaque1Node( Node *n ) : Node(0,n) {}
+  Opaque1Node( Compile* C, Node *n ) : Node(0,n) {
+    // Put it on the Macro nodes list to removed during macro nodes expansion.
+    init_flags(Flag_is_macro);
+    C->add_macro_node(this);
+  }
   // Special version for the pre-loop to hold the original loop limit
   // which is consumed by range check elimination.
-  Opaque1Node( Node *n, Node* orig_limit ) : Node(0,n,orig_limit) {}
+  Opaque1Node( Compile* C, Node *n, Node* orig_limit ) : Node(0,n,orig_limit) {
+    // Put it on the Macro nodes list to removed during macro nodes expansion.
+    init_flags(Flag_is_macro);
+    C->add_macro_node(this);
+  }
   Node* original_loop_limit() { return req()==3 ? in(2) : NULL; }
   virtual int Opcode() const;
   virtual const Type *bottom_type() const { return TypeInt::INT; }
@@ -572,7 +577,11 @@
   virtual uint hash() const ;                  // { return NO_HASH; }
   virtual uint cmp( const Node &n ) const;
 public:
-  Opaque2Node( Node *n ) : Node(0,n) {}
+  Opaque2Node( Compile* C, Node *n ) : Node(0,n) {
+    // Put it on the Macro nodes list to removed during macro nodes expansion.
+    init_flags(Flag_is_macro);
+    C->add_macro_node(this);
+  }
   virtual int Opcode() const;
   virtual const Type *bottom_type() const { return TypeInt::INT; }
 };
--- a/hotspot/src/share/vm/opto/escape.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/escape.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -483,7 +483,7 @@
 //
 void ConnectionGraph::split_AddP(Node *addp, Node *base,  PhaseGVN  *igvn) {
   const TypeOopPtr *base_t = igvn->type(base)->isa_oopptr();
-  assert(base_t != NULL && base_t->is_instance(), "expecting instance oopptr");
+  assert(base_t != NULL && base_t->is_known_instance(), "expecting instance oopptr");
   const TypeOopPtr *t = igvn->type(addp)->isa_oopptr();
   if (t == NULL) {
     // We are computing a raw address for a store captured by an Initialize
@@ -494,8 +494,8 @@
     assert(offs != Type::OffsetBot, "offset must be a constant");
     t = base_t->add_offset(offs)->is_oopptr();
   }
-  uint inst_id =  base_t->instance_id();
-  assert(!t->is_instance() || t->instance_id() == inst_id,
+  int inst_id =  base_t->instance_id();
+  assert(!t->is_known_instance() || t->instance_id() == inst_id,
                              "old type must be non-instance or match new type");
   const TypeOopPtr *tinst = base_t->add_offset(t->offset())->is_oopptr();
   // Do NOT remove the next call: ensure an new alias index is allocated
@@ -509,7 +509,7 @@
   Node *adr = addp->in(AddPNode::Address);
   const TypeOopPtr  *atype = igvn->type(adr)->isa_oopptr();
   if (atype != NULL && atype->instance_id() != inst_id) {
-    assert(!atype->is_instance(), "no conflicting instances");
+    assert(!atype->is_known_instance(), "no conflicting instances");
     const TypeOopPtr *new_atype = base_t->add_offset(atype->offset())->isa_oopptr();
     Node *acast = new (_compile, 2) CastPPNode(adr, new_atype);
     acast->set_req(0, adr->in(0));
@@ -663,7 +663,7 @@
     return orig_mem;
   Compile* C = phase->C;
   const TypeOopPtr *tinst = C->get_adr_type(alias_idx)->isa_oopptr();
-  bool is_instance = (tinst != NULL) && tinst->is_instance();
+  bool is_instance = (tinst != NULL) && tinst->is_known_instance();
   Node *prev = NULL;
   Node *result = orig_mem;
   while (prev != result) {
@@ -693,7 +693,7 @@
         AllocateNode* alloc = proj_in->as_Initialize()->allocation();
         // Stop if this is the initialization for the object instance which
         // which contains this memory slice, otherwise skip over it.
-        if (alloc == NULL || alloc->_idx != tinst->instance_id()) {
+        if (alloc == NULL || alloc->_idx != (uint)tinst->instance_id()) {
           result = proj_in->in(TypeFunc::Memory);
         }
       } else if (proj_in->is_MemBar()) {
@@ -887,7 +887,7 @@
       const TypeOopPtr *t = igvn->type(n)->isa_oopptr();
       if (t == NULL)
         continue;  // not a TypeInstPtr
-      tinst = t->cast_to_instance(ni);
+      tinst = t->cast_to_instance_id(ni);
       igvn->hash_delete(n);
       igvn->set_type(n,  tinst);
       n->raise_bottom_type(tinst);
@@ -959,19 +959,19 @@
         Node *val = get_map(elem);   // CheckCastPP node
         TypeNode *tn = n->as_Type();
         tinst = igvn->type(val)->isa_oopptr();
-        assert(tinst != NULL && tinst->is_instance() &&
-               tinst->instance_id() == elem , "instance type expected.");
+        assert(tinst != NULL && tinst->is_known_instance() &&
+               (uint)tinst->instance_id() == elem , "instance type expected.");
 
-        const TypeOopPtr *tn_t = NULL;
         const Type *tn_type = igvn->type(tn);
+        const TypeOopPtr *tn_t;
         if (tn_type->isa_narrowoop()) {
-          tn_t = tn_type->is_narrowoop()->make_oopptr()->isa_oopptr();
+          tn_t = tn_type->make_ptr()->isa_oopptr();
         } else {
           tn_t = tn_type->isa_oopptr();
         }
 
         if (tn_t != NULL &&
- tinst->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE)->higher_equal(tn_t)) {
+            tinst->cast_to_instance_id(TypeOopPtr::InstanceBot)->higher_equal(tn_t)) {
           if (tn_type->isa_narrowoop()) {
             tn_type = tinst->make_narrowoop();
           } else {
@@ -1921,9 +1921,7 @@
     case Op_StoreN:
     {
       const Type *adr_type = phase->type(n->in(MemNode::Address));
-      if (adr_type->isa_narrowoop()) {
-        adr_type = adr_type->is_narrowoop()->make_oopptr();
-      }
+      adr_type = adr_type->make_ptr();
       if (adr_type->isa_oopptr()) {
         add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
       } else {
@@ -1948,9 +1946,7 @@
     case Op_CompareAndSwapN:
     {
       const Type *adr_type = phase->type(n->in(MemNode::Address));
-      if (adr_type->isa_narrowoop()) {
-        adr_type = adr_type->is_narrowoop()->make_oopptr();
-      }
+      adr_type = adr_type->make_ptr();
       if (adr_type->isa_oopptr()) {
         add_node(n, PointsToNode::UnknownType, PointsToNode::UnknownEscape, false);
       } else {
@@ -2131,10 +2127,7 @@
     case Op_CompareAndSwapN:
     {
       Node *adr = n->in(MemNode::Address);
-      const Type *adr_type = phase->type(adr);
-      if (adr_type->isa_narrowoop()) {
-        adr_type = adr_type->is_narrowoop()->make_oopptr();
-      }
+      const Type *adr_type = phase->type(adr)->make_ptr();
 #ifdef ASSERT
       if (!adr_type->isa_oopptr())
         assert(phase->type(adr) == TypeRawPtr::NOTNULL, "Op_StoreP");
--- a/hotspot/src/share/vm/opto/gcm.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/gcm.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -307,7 +307,6 @@
 
     // Test and set the visited bit.
     if (mid->raise_LCA_visited() == mark)  continue;  // already visited
-    mid->set_raise_LCA_visited(mark);
 
     // Don't process the current LCA, otherwise the search may terminate early
     if (mid != LCA && mid->raise_LCA_mark() == mark) {
@@ -317,6 +316,8 @@
       assert(early->dominates(LCA), "early is high enough");
       // Resume searching at that point, skipping intermediate levels.
       worklist.push(LCA);
+      if (LCA == mid)
+        continue; // Don't mark as visited to avoid early termination.
     } else {
       // Keep searching through this block's predecessors.
       for (uint j = 1, jmax = mid->num_preds(); j < jmax; j++) {
@@ -324,6 +325,7 @@
         worklist.push(mid_parent);
       }
     }
+    mid->set_raise_LCA_visited(mark);
   }
   return LCA;
 }
--- a/hotspot/src/share/vm/opto/idealGraphPrinter.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/idealGraphPrinter.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -100,16 +100,18 @@
 // Constructor, either file or network output
 IdealGraphPrinter::IdealGraphPrinter() {
 
-  _traverse_outs = false;
+  // By default dump both ins and outs since dead or unreachable code
+  // needs to appear in the graph.  There are also some special cases
+  // in the mach where kill projections have no users but should
+  // appear in the dump.
+  _traverse_outs = true;
   _should_send_method = true;
   _output = NULL;
   buffer[0] = 0;
   _depth = 0;
   _current_method = NULL;
   assert(!_current_method, "current method must be initialized to NULL");
-  _arena = new Arena();
-
-  _stream = new (ResourceObj::C_HEAP) networkStream();
+  _stream = NULL;
 
   if (PrintIdealGraphFile != NULL) {
     ThreadCritical tc;
@@ -124,12 +126,16 @@
       } else {
         st.print("%s%d", PrintIdealGraphFile, _file_count);
       }
-      _output = new (ResourceObj::C_HEAP) fileStream(st.as_string());
+      fileStream *stream = new (ResourceObj::C_HEAP) fileStream(st.as_string());
+      _output = stream;
     } else {
-      _output = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile);
+      fileStream *stream = new (ResourceObj::C_HEAP) fileStream(PrintIdealGraphFile);
+      _output = stream;
     }
     _file_count++;
   } else {
+    _stream = new (ResourceObj::C_HEAP) networkStream();
+
     // Try to connect to visualizer
     if (_stream->connect(PrintIdealGraphAddress, PrintIdealGraphPort)) {
       char c = 0;
@@ -149,13 +155,24 @@
     }
   }
 
-  start_element(TOP_ELEMENT);
+  _xml = new (ResourceObj::C_HEAP) xmlStream(_output);
+
+  head(TOP_ELEMENT);
 }
 
 // Destructor, close file or network stream
 IdealGraphPrinter::~IdealGraphPrinter() {
 
-  end_element(TOP_ELEMENT);
+  tail(TOP_ELEMENT);
+
+  // tty->print_cr("Walk time: %d", (int)_walk_time.milliseconds());
+  // tty->print_cr("Output time: %d", (int)_output_time.milliseconds());
+  // tty->print_cr("Build blocks time: %d", (int)_build_blocks_time.milliseconds());
+
+  if(_xml) {
+    delete _xml;
+    _xml = NULL;
+  }
 
   if (_stream) {
     delete _stream;
@@ -171,94 +188,93 @@
   }
 }
 
-void IdealGraphPrinter::print_ifg(PhaseIFG* ifg) {
-
-  // Code to print an interference graph to tty, currently not used
 
-  /*
-  if (!_current_method) return;
-   // Remove neighbor colors
+void IdealGraphPrinter::begin_elem(const char *s) {
+  _xml->begin_elem(s);
+}
+
+void IdealGraphPrinter::end_elem() {
+  _xml->end_elem();
+}
 
-  for (uint i = 0; i < ifg._maxlrg; i++) {
+void IdealGraphPrinter::begin_head(const char *s) {
+  _xml->begin_head(s);
+}
 
-    IndexSet *s = ifg.neighbors(i);
-    IndexSetIterator elements(s);
-    uint neighbor;
-    while ((neighbor = elements.next()) != 0) {
-        tty->print_cr("Edge between %d and %d\n", i, neighbor);
-    }
-  }
+void IdealGraphPrinter::end_head() {
+  _xml->end_head();
+}
 
+void IdealGraphPrinter::print_attr(const char *name, intptr_t val) {
+  stringStream stream;
+  stream.print(INTX_FORMAT, val);
+  print_attr(name, stream.as_string());
+}
 
-  for (uint i = 0; i < ifg._maxlrg; i++) {
-    LRG &l = ifg.lrgs(i);
-    if (l._def) {
-      OptoReg::Name name = l.reg();
-      tty->print("OptoReg::dump: ");
-      OptoReg::dump(name);
-      tty->print_cr("");
-      tty->print_cr("name=%d\n", name);
-      if (name) {
-        if (OptoReg::is_stack(name)) {
-          tty->print_cr("Stack number %d\n", OptoReg::reg2stack(name));
+void IdealGraphPrinter::print_attr(const char *name, const char *val) {
+  _xml->print(" %s='", name);
+  text(val);
+  _xml->print("'");
+}
 
-        } else if (!OptoReg::is_valid(name)) {
-          tty->print_cr("BAD!!!");
-        } else {
+void IdealGraphPrinter::head(const char *name) {
+  _xml->head(name);
+}
+
+void IdealGraphPrinter::tail(const char *name) {
+  _xml->tail(name);
+}
 
-          if (OptoReg::is_reg(name)) {
-          tty->print_cr(OptoReg::regname(name));
-          } else {
-            int x = 0;
-          }
-        }
-        int x = 0;
-      }
+void IdealGraphPrinter::text(const char *s) {
+  _xml->text(s);
+}
+
+void IdealGraphPrinter::print_prop(const char *name, int val) {
 
-      if (l._def == NodeSentinel) {
-        tty->print("multiple mapping from %d: ", i);
-        for (int j=0; j<l._defs->length(); j++) {
-          tty->print("%d ", l._defs->at(j)->_idx);
-        }
-        tty->print_cr("");
-      } else {
-        tty->print_cr("mapping between %d and %d\n", i, l._def->_idx);
-      }
-    }
-  }*/
+  stringStream stream;
+  stream.print("%d", val);
+  print_prop(name, stream.as_string());
+}
+
+void IdealGraphPrinter::print_prop(const char *name, const char *val) {
+  begin_head(PROPERTY_ELEMENT);
+  print_attr(PROPERTY_NAME_PROPERTY, name);
+  end_head();
+  text(val);
+  tail(PROPERTY_ELEMENT);
 }
 
 void IdealGraphPrinter::print_method(ciMethod *method, int bci, InlineTree *tree) {
+  begin_head(METHOD_ELEMENT);
 
-  Properties properties;
   stringStream str;
   method->print_name(&str);
 
   stringStream shortStr;
   method->print_short_name(&shortStr);
 
+  print_attr(METHOD_NAME_PROPERTY, str.as_string());
+  print_attr(METHOD_SHORT_NAME_PROPERTY, shortStr.as_string());
+  print_attr(METHOD_BCI_PROPERTY, bci);
 
-  properties.add(new Property(METHOD_NAME_PROPERTY, str.as_string()));
-  properties.add(new Property(METHOD_SHORT_NAME_PROPERTY, shortStr.as_string()));
-  properties.add(new Property(METHOD_BCI_PROPERTY, bci));
-  start_element(METHOD_ELEMENT, &properties);
+  end_head();
 
-  start_element(BYTECODES_ELEMENT);
+  head(BYTECODES_ELEMENT);
   output()->print_cr("<![CDATA[");
   method->print_codes_on(output());
   output()->print_cr("]]>");
-  end_element(BYTECODES_ELEMENT);
+  tail(BYTECODES_ELEMENT);
 
-  start_element(INLINE_ELEMENT);
+  head(INLINE_ELEMENT);
   if (tree != NULL) {
     GrowableArray<InlineTree *> subtrees = tree->subtrees();
     for (int i = 0; i < subtrees.length(); i++) {
       print_inline_tree(subtrees.at(i));
     }
   }
-  end_element(INLINE_ELEMENT);
+  tail(INLINE_ELEMENT);
 
-  end_element(METHOD_ELEMENT);
+  tail(METHOD_ELEMENT);
   output()->flush();
 }
 
@@ -271,12 +287,6 @@
 
 }
 
-void IdealGraphPrinter::clear_nodes() {
- // for (int i = 0; i < _nodes.length(); i++) {
- //   _nodes.at(i)->clear_node();
- // }
-}
-
 void IdealGraphPrinter::print_inlining(Compile* compile) {
 
   // Print inline tree
@@ -298,143 +308,56 @@
   assert(method, "null methods are not allowed!");
   assert(!_current_method, "current method must be null!");
 
-  _arena->destruct_contents();
+  head(GROUP_ELEMENT);
 
-  start_element(GROUP_ELEMENT);
+  head(PROPERTIES_ELEMENT);
 
   // Print properties
-  Properties properties;
-
   // Add method name
   stringStream strStream;
   method->print_name(&strStream);
-  properties.add(new Property(METHOD_NAME_PROPERTY, strStream.as_string()));
+  print_prop(METHOD_NAME_PROPERTY, strStream.as_string());
 
   if (method->flags().is_public()) {
-    properties.add(new Property(METHOD_IS_PUBLIC_PROPERTY, TRUE_VALUE));
+    print_prop(METHOD_IS_PUBLIC_PROPERTY, TRUE_VALUE);
   }
 
   if (method->flags().is_static()) {
-    properties.add(new Property(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE));
+    print_prop(METHOD_IS_STATIC_PROPERTY, TRUE_VALUE);
   }
 
-  properties.print(this);
+  tail(PROPERTIES_ELEMENT);
 
   if (_stream) {
     char answer = 0;
-    _stream->flush();
+    _xml->flush();
     int result = _stream->read(&answer, 1);
     _should_send_method = (answer == 'y');
   }
 
-  this->_nodes = GrowableArray<NodeDescription *>(_arena, 2, 0, NULL);
-  this->_edges = GrowableArray< EdgeDescription * >(_arena, 2, 0, NULL);
-
-
   this->_current_method = method;
 
-
-
-  _output->flush();
+  _xml->flush();
 }
 
 // Has to be called whenever a method has finished compilation
 void IdealGraphPrinter::end_method() {
 
-//  if (finish && !in_method) return;
-
   nmethod* method = (nmethod*)this->_current_method->code();
 
-  start_element(ASSEMBLY_ELEMENT);
- // Disassembler::decode(method, _output);
-  end_element(ASSEMBLY_ELEMENT);
-
-
-  end_element(GROUP_ELEMENT);
+  tail(GROUP_ELEMENT);
   _current_method = NULL;
-  _output->flush();
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      delete desc;
-      _nodes.at_put(i, NULL);
-    }
-  }
-  this->_nodes.clear();
-
-
-  for (int i = 0; i < _edges.length(); i++) {
-   // for (int j=0; j<_edges.at(i)->length(); j++) {
-      EdgeDescription *conn = _edges.at(i);
-      conn->print(this);
-      if (conn) {
-        delete conn;
-        _edges.at_put(i, NULL);
-      }
-    //}
-    //_edges.at(i)->clear();
-    //delete _edges.at(i);
-    //_edges.at_put(i, NULL);
-  }
-  this->_edges.clear();
-
-//  in_method = false;
-}
-
-// Outputs an XML start element
-void IdealGraphPrinter::start_element(const char *s, Properties *properties /* = NULL */, bool print_indent /* = false */, bool print_return /* = true */) {
-
-  start_element_helper(s, properties, false, print_indent, print_return);
-  _depth++;
-
-}
-
-// Outputs an XML start element without body
-void IdealGraphPrinter::simple_element(const char *s, Properties *properties /* = NULL */, bool print_indent /* = false */) {
-  start_element_helper(s, properties, true, print_indent, true);
-}
-
-// Outputs an XML start element. If outputEnd is true, the element has no body.
-void IdealGraphPrinter::start_element_helper(const char *s, Properties *properties, bool outputEnd, bool print_indent /* = false */, bool print_return /* = true */) {
-
-  assert(_output, "output stream must exist!");
-
-  if (print_indent) this->print_indent();
-  _output->print("<");
-  _output->print(s);
-  if (properties) properties->print_as_attributes(this);
-
-  if (outputEnd) {
-    _output->print("/");
-  }
-
-  _output->print(">");
-  if (print_return) _output->print_cr("");
-
+  _xml->flush();
 }
 
 // Print indent
 void IdealGraphPrinter::print_indent() {
+  tty->print_cr("printing ident %d", _depth);
   for (int i = 0; i < _depth; i++) {
-    _output->print(INDENT);
+    _xml->print(INDENT);
   }
 }
 
-// Outputs an XML end element
-void IdealGraphPrinter::end_element(const char *s, bool print_indent /* = true */, bool print_return /* = true */) {
-
-  assert(_output, "output stream must exist!");
-
-  _depth--;
-
-  if (print_indent) this->print_indent();
-  _output->print("</");
-  _output->print(s);
-  _output->print(">");
-  if (print_return) _output->print_cr("");
-
-}
-
 bool IdealGraphPrinter::traverse_outs() {
   return _traverse_outs;
 }
@@ -443,7 +366,255 @@
   _traverse_outs = b;
 }
 
-void IdealGraphPrinter::walk(Node *start) {
+intptr_t IdealGraphPrinter::get_node_id(Node *n) {
+  return (intptr_t)(n);
+}
+
+void IdealGraphPrinter::visit_node(Node *n, void *param) {
+
+  if(param) {
+
+    // Output edge
+    intptr_t dest_id = get_node_id(n);
+    for ( uint i = 0; i < n->len(); i++ ) {
+      if ( n->in(i) ) {
+        Node *source = n->in(i);
+        begin_elem(EDGE_ELEMENT);
+        intptr_t source_id = get_node_id(source);
+        print_attr(FROM_PROPERTY, source_id);
+        print_attr(TO_PROPERTY, dest_id);
+        print_attr(INDEX_PROPERTY, i);
+        end_elem();
+      }
+    }
+
+  } else {
+
+    // Output node
+    begin_head(NODE_ELEMENT);
+    print_attr(NODE_ID_PROPERTY, get_node_id(n));
+    end_head();
+
+    head(PROPERTIES_ELEMENT);
+
+    Node *node = n;
+#ifndef PRODUCT
+    node->_in_dump_cnt++;
+    print_prop(NODE_NAME_PROPERTY, (const char *)node->Name());
+    const Type *t = node->bottom_type();
+    print_prop("type", (const char *)Type::msg[t->base()]);
+    print_prop("idx", node->_idx);
+#ifdef ASSERT
+    print_prop("debug_idx", node->_debug_idx);
+#endif
+
+    if(C->cfg() != NULL) {
+      Block *block = C->cfg()->_bbs[node->_idx];
+      if(block == NULL) {
+        print_prop("block", C->cfg()->_blocks[0]->_pre_order);
+      } else {
+        print_prop("block", block->_pre_order);
+      }
+    }
+
+    const jushort flags = node->flags();
+    if (flags & Node::Flag_is_Copy) {
+      print_prop("is_copy", "true");
+    }
+    if (flags & Node::Flag_is_Call) {
+      print_prop("is_call", "true");
+    }
+    if (flags & Node::Flag_rematerialize) {
+      print_prop("rematerialize", "true");
+    }
+    if (flags & Node::Flag_needs_anti_dependence_check) {
+      print_prop("needs_anti_dependence_check", "true");
+    }
+    if (flags & Node::Flag_is_macro) {
+      print_prop("is_macro", "true");
+    }
+    if (flags & Node::Flag_is_Con) {
+      print_prop("is_con", "true");
+    }
+    if (flags & Node::Flag_is_cisc_alternate) {
+      print_prop("is_cisc_alternate", "true");
+    }
+    if (flags & Node::Flag_is_Branch) {
+      print_prop("is_branch", "true");
+    }
+    if (flags & Node::Flag_is_block_start) {
+      print_prop("is_block_start", "true");
+    }
+    if (flags & Node::Flag_is_Goto) {
+      print_prop("is_goto", "true");
+    }
+    if (flags & Node::Flag_is_dead_loop_safe) {
+      print_prop("is_dead_loop_safe", "true");
+    }
+    if (flags & Node::Flag_may_be_short_branch) {
+      print_prop("may_be_short_branch", "true");
+    }
+    if (flags & Node::Flag_is_safepoint_node) {
+      print_prop("is_safepoint_node", "true");
+    }
+    if (flags & Node::Flag_is_pc_relative) {
+      print_prop("is_pc_relative", "true");
+    }
+
+    if (C->matcher() != NULL) {
+      if (C->matcher()->is_shared(node)) {
+        print_prop("is_shared", "true");
+      } else {
+        print_prop("is_shared", "false");
+      }
+      if (C->matcher()->is_dontcare(node)) {
+        print_prop("is_dontcare", "true");
+      } else {
+        print_prop("is_dontcare", "false");
+      }
+
+      Node* old = C->matcher()->find_old_node(node);
+      if (old != NULL) {
+        print_prop("old_node_idx", old->_idx);
+      }
+    }
+
+    if (node->is_Proj()) {
+      print_prop("con", (int)node->as_Proj()->_con);
+    }
+
+    if (node->is_Mach()) {
+      print_prop("idealOpcode", (const char *)NodeClassNames[node->as_Mach()->ideal_Opcode()]);
+    }
+
+    buffer[0] = 0;
+    stringStream s2(buffer, sizeof(buffer) - 1);
+
+    node->dump_spec(&s2);
+    if (t != NULL && (t->isa_instptr() || t->isa_klassptr())) {
+      const TypeInstPtr  *toop = t->isa_instptr();
+      const TypeKlassPtr *tkls = t->isa_klassptr();
+      ciKlass*           klass = toop ? toop->klass() : (tkls ? tkls->klass() : NULL );
+      if( klass && klass->is_loaded() && klass->is_interface() ) {
+        s2.print("  Interface:");
+      } else if( toop ) {
+        s2.print("  Oop:");
+      } else if( tkls ) {
+        s2.print("  Klass:");
+      }
+      t->dump_on(&s2);
+    } else if( t == Type::MEMORY ) {
+      s2.print("  Memory:");
+      MemNode::dump_adr_type(node, node->adr_type(), &s2);
+    }
+
+    assert(s2.size() < sizeof(buffer), "size in range");
+    print_prop("dump_spec", buffer);
+
+    if (node->is_block_proj()) {
+      print_prop("is_block_proj", "true");
+    }
+
+    if (node->is_block_start()) {
+      print_prop("is_block_start", "true");
+    }
+
+    const char *short_name = "short_name";
+    if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) {
+      int index = node->as_Proj()->_con - TypeFunc::Parms;
+      if (index >= 10) {
+        print_prop(short_name, "PA");
+      } else {
+        sprintf(buffer, "P%d", index);
+        print_prop(short_name, buffer);
+      }
+    } else if (strcmp(node->Name(), "IfTrue") == 0) {
+      print_prop(short_name, "T");
+    } else if (strcmp(node->Name(), "IfFalse") == 0) {
+      print_prop(short_name, "F");
+    } else if ((node->is_Con() && node->is_Type()) || node->is_Proj()) {
+
+      if (t->base() == Type::Int && t->is_int()->is_con()) {
+        const TypeInt *typeInt = t->is_int();
+        assert(typeInt->is_con(), "must be constant");
+        jint value = typeInt->get_con();
+
+        // max. 2 chars allowed
+        if (value >= -9 && value <= 99) {
+          sprintf(buffer, "%d", value);
+          print_prop(short_name, buffer);
+        } else {
+          print_prop(short_name, "I");
+        }
+      } else if (t == Type::TOP) {
+        print_prop(short_name, "^");
+      } else if (t->base() == Type::Long && t->is_long()->is_con()) {
+        const TypeLong *typeLong = t->is_long();
+        assert(typeLong->is_con(), "must be constant");
+        jlong value = typeLong->get_con();
+
+        // max. 2 chars allowed
+        if (value >= -9 && value <= 99) {
+          sprintf(buffer, "%d", value);
+          print_prop(short_name, buffer);
+        } else {
+          print_prop(short_name, "L");
+        }
+      } else if (t->base() == Type::KlassPtr) {
+        const TypeKlassPtr *typeKlass = t->is_klassptr();
+        print_prop(short_name, "CP");
+      } else if (t->base() == Type::Control) {
+        print_prop(short_name, "C");
+      } else if (t->base() == Type::Memory) {
+        print_prop(short_name, "M");
+      } else if (t->base() == Type::Abio) {
+        print_prop(short_name, "IO");
+      } else if (t->base() == Type::Return_Address) {
+        print_prop(short_name, "RA");
+      } else if (t->base() == Type::AnyPtr) {
+        print_prop(short_name, "P");
+      } else if (t->base() == Type::RawPtr) {
+        print_prop(short_name, "RP");
+      } else if (t->base() == Type::AryPtr) {
+        print_prop(short_name, "AP");
+      }
+    }
+
+    JVMState* caller = NULL;
+    if (node->is_SafePoint()) {
+      caller = node->as_SafePoint()->jvms();
+    } else {
+      Node_Notes* notes = C->node_notes_at(node->_idx);
+      if (notes != NULL) {
+        caller = notes->jvms();
+      }
+    }
+
+    if (caller != NULL) {
+      stringStream bciStream;
+      while(caller) {
+        bciStream.print("%d ", caller->bci());
+        caller = caller->caller();
+      }
+      print_prop("bci", bciStream.as_string());
+    }
+
+    if (_chaitin && _chaitin != (PhaseChaitin *)0xdeadbeef) {
+      buffer[0] = 0;
+      _chaitin->dump_register(node, buffer);
+      print_prop("reg", buffer);
+      print_prop("lrg", _chaitin->n2lidx(node));
+    }
+
+    node->_in_dump_cnt--;
+#endif
+
+    tail(PROPERTIES_ELEMENT);
+    tail(NODE_ELEMENT);
+  }
+}
+
+void IdealGraphPrinter::walk_nodes(Node *start, void *param) {
 
 
   VectorSet visited(Thread::current()->resource_area());
@@ -453,7 +624,7 @@
   while(nodeStack.length() > 0) {
 
     Node *n = nodeStack.pop();
-    IdealGraphPrinter::pre_node(n, this);
+    visit_node(n, param);
 
     if (_traverse_outs) {
       for (DUIterator i = n->outs(); n->has_out(i); i++) {
@@ -474,573 +645,6 @@
   }
 }
 
-void IdealGraphPrinter::compress(int index, GrowableArray<Block>* blocks) {
-  Block *block = blocks->adr_at(index);
-
-  int ancestor = block->ancestor();
-  assert(ancestor != -1, "");
-
-  Block *ancestor_block = blocks->adr_at(ancestor);
-  if (ancestor_block->ancestor() != -1) {
-    compress(ancestor, blocks);
-
-    int label = block->label();
-    Block *label_block = blocks->adr_at(label);
-
-    int ancestor_label = ancestor_block->label();
-    Block *ancestor_label_block = blocks->adr_at(label);
-    if (ancestor_label_block->semi() < label_block->semi()) {
-      block->set_label(ancestor_label);
-    }
-
-    block->set_ancestor(ancestor_block->ancestor());
-  }
-}
-
-int IdealGraphPrinter::eval(int index, GrowableArray<Block>* blocks) {
-  Block *block = blocks->adr_at(index);
-  if (block->ancestor() == -1) {
-    return index;
-  } else {
-    compress(index, blocks);
-    return block->label();
-  }
-}
-
-void IdealGraphPrinter::link(int index1, int index2, GrowableArray<Block>* blocks) {
-  Block *block2 = blocks->adr_at(index2);
-  block2->set_ancestor(index1);
-}
-
-void IdealGraphPrinter::build_dominators(GrowableArray<Block>* blocks) {
-
-  if (blocks->length() == 0) return;
-
-  GrowableArray<int> stack;
-  stack.append(0);
-
-  GrowableArray<Block *> array;
-
-  assert(blocks->length() > 0, "");
-  blocks->adr_at(0)->set_dominator(0);
-
-  int n = 0;
-  while(!stack.is_empty()) {
-    int index = stack.pop();
-    Block *block = blocks->adr_at(index);
-    block->set_semi(n);
-    array.append(block);
-    n = n + 1;
-    for (int i = 0; i < block->succs()->length(); i++) {
-      int succ_index = block->succs()->at(i);
-      Block *succ = blocks->adr_at(succ_index);
-      if (succ->semi() == -1) {
-        succ->set_parent(index);
-        stack.push(succ_index);
-      }
-      succ->add_pred(index);
-    }
-  }
-
-  for (int i=n-1; i>0; i--) {
-    Block *block = array.at(i);
-    int block_index = block->index();
-    for (int j=0; j<block->pred()->length(); j++) {
-      int pred_index = block->pred()->at(j);
-      int cur_index = eval(pred_index, blocks);
-
-      Block *cur_block = blocks->adr_at(cur_index);
-      if (cur_block->semi() < block->semi()) {
-        block->set_semi(cur_block->semi());
-      }
-    }
-
-    int semi_index = block->semi();
-    Block *semi_block = array.at(semi_index);
-    semi_block->add_to_bucket(block_index);
-
-    link(block->parent(), block_index, blocks);
-    Block *parent_block = blocks->adr_at(block->parent());
-
-    for (int j=0; j<parent_block->bucket()->length(); j++) {
-      int cur_index = parent_block->bucket()->at(j);
-      int new_index = eval(cur_index, blocks);
-      Block *cur_block = blocks->adr_at(cur_index);
-      Block *new_block = blocks->adr_at(new_index);
-      int dom = block->parent();
-
-      if (new_block->semi() < cur_block->semi()) {
-        dom = new_index;
-      }
-
-      cur_block->set_dominator(dom);
-    }
-
-    parent_block->clear_bucket();
-  }
-
-  for (int i=1; i < n; i++) {
-
-    Block *block = array.at(i);
-    int block_index = block->index();
-
-    int semi_index = block->semi();
-    Block *semi_block = array.at(semi_index);
-
-    if (block->dominator() != semi_block->index()) {
-      int new_dom = blocks->adr_at(block->dominator())->dominator();
-      block->set_dominator(new_dom);
-    }
-  }
-
-  for (int i = 0; i < blocks->length(); i++) {
-    if (blocks->adr_at(i)->dominator() == -1) {
-      blocks->adr_at(i)->set_dominator(0);
-    }
-  }
-
-  // Build dominates array
-  for (int i=1; i < blocks->length(); i++) {
-    Block *block = blocks->adr_at(i);
-    int dominator = block->dominator();
-    Block *dom_block = blocks->adr_at(dominator);
-    dom_block->add_dominates(i);
-    dom_block->add_child(i);
-
-    while(dominator != 0) {
-      dominator = dom_block->dominator();
-      dom_block = blocks->adr_at(dominator);
-      dom_block->add_child(i);
-    }
-  }
-}
-
-void IdealGraphPrinter::build_common_dominator(int **common_dominator, int index, GrowableArray<Block>* blocks) {
-
-  common_dominator[index][index] = index;
-  Block *block = blocks->adr_at(index);
-  for (int i = 0; i < block->dominates()->length(); i++) {
-    Block *dominated = blocks->adr_at(block->dominates()->at(i));
-
-    for (int j=0; j<dominated->children()->length(); j++) {
-      Block *child = blocks->adr_at(dominated->children()->at(j));
-      common_dominator[index][child->index()] = common_dominator[child->index()][index] = index;
-
-      for (int k=0; k<i; k++) {
-        Block *other_dominated = blocks->adr_at(block->dominates()->at(k));
-        common_dominator[child->index()][other_dominated->index()] = common_dominator[other_dominated->index()][child->index()] = index;
-
-        for (int l=0 ; l<other_dominated->children()->length(); l++) {
-          Block *other_child = blocks->adr_at(other_dominated->children()->at(l));
-          common_dominator[child->index()][other_child->index()] = common_dominator[other_child->index()][child->index()] = index;
-        }
-      }
-    }
-
-    build_common_dominator(common_dominator, dominated->index(), blocks);
-  }
-}
-
-void IdealGraphPrinter::schedule_latest(int **common_dominator, GrowableArray<Block>* blocks) {
-
-  int queue_size = _nodes.length() + 1;
-  NodeDescription **queue = NEW_RESOURCE_ARRAY(NodeDescription *, queue_size);
-  int queue_start = 0;
-  int queue_end = 0;
-  Arena *a = new Arena();
-  VectorSet on_queue(a);
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      desc->init_succs();
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      for (uint j=0; j<desc->node()->len(); j++) {
-        Node *n = desc->node()->in(j);
-        if (n) {
-          NodeDescription *other_desc = _nodes.at(n->_idx);
-          other_desc->add_succ(desc);
-        }
-      }
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc && desc->block_index() == -1) {
-
-      // Put Phi into same block as region
-      if (desc->node()->is_Phi() && desc->node()->in(0) && _nodes.at(desc->node()->in(0)->_idx)->block_index() != -1) {
-        int index = _nodes.at(desc->node()->in(0)->_idx)->block_index();
-        desc->set_block_index(index);
-        blocks->adr_at(index)->add_node(desc);
-
-      // Put Projections to same block as parent
-      } else if (desc->node()->is_block_proj() && _nodes.at(desc->node()->is_block_proj()->_idx)->block_index() != -1) {
-        int index = _nodes.at(desc->node()->is_block_proj()->_idx)->block_index();
-        desc->set_block_index(index);
-        blocks->adr_at(index)->add_node(desc);
-      } else {
-        queue[queue_end] = desc;
-        queue_end++;
-        on_queue.set(desc->node()->_idx);
-      }
-    }
-  }
-
-
-  int z = 0;
-  while(queue_start != queue_end && z < 10000) {
-
-    NodeDescription *desc = queue[queue_start];
-    queue_start = (queue_start + 1) % queue_size;
-    on_queue >>= desc->node()->_idx;
-
-    Node* node = desc->node();
-
-    if (desc->succs()->length() == 0) {
-      int x = 0;
-    }
-
-    int block_index = -1;
-    if (desc->succs()->length() != 0) {
-      for (int i = 0; i < desc->succs()->length(); i++) {
-          NodeDescription *cur_desc = desc->succs()->at(i);
-          if (cur_desc != desc) {
-            if (cur_desc->succs()->length() == 0) {
-
-              // Ignore nodes with 0 successors
-
-            } else if (cur_desc->block_index() == -1) {
-
-              // Let this node schedule first
-              block_index = -1;
-              break;
-
-            } else if (cur_desc->node()->is_Phi()){
-
-              // Special treatment for Phi functions
-              PhiNode *phi = cur_desc->node()->as_Phi();
-              assert(phi->in(0) && phi->in(0)->is_Region(), "Must have region node in first input");
-              RegionNode *region = phi->in(0)->as_Region();
-
-              for (uint j=1; j<phi->len(); j++) {
-                Node *cur_phi_input = phi->in(j);
-                if (cur_phi_input == desc->node() && region->in(j)) {
-                  NodeDescription *cur_region_input = _nodes.at(region->in(j)->_idx);
-                  if (cur_region_input->block_index() == -1) {
-
-                    // Let this node schedule first
-                    block_index = -1;
-                    break;
-                  } else {
-                    if (block_index == -1) {
-                      block_index = cur_region_input->block_index();
-                    } else {
-                      block_index = common_dominator[block_index][cur_region_input->block_index()];
-                    }
-                  }
-                }
-              }
-
-            } else {
-              if (block_index == -1) {
-                block_index = cur_desc->block_index();
-              } else {
-                block_index = common_dominator[block_index][cur_desc->block_index()];
-              }
-            }
-          }
-      }
-    }
-
-    if (block_index == -1) {
-      queue[queue_end] = desc;
-      queue_end = (queue_end + 1) % queue_size;
-      on_queue.set(desc->node()->_idx);
-      z++;
-    } else {
-      assert(desc->block_index() == -1, "");
-      desc->set_block_index(block_index);
-      blocks->adr_at(block_index)->add_node(desc);
-      z = 0;
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc && desc->block_index() == -1) {
-
-      //if (desc->node()->is_Proj() || desc->node()->is_Con()) {
-        Node *parent = desc->node()->in(0);
-        uint cur = 1;
-        while(!parent && cur < desc->node()->len()) {
-          parent = desc->node()->in(cur);
-          cur++;
-        }
-
-        if (parent && _nodes.at(parent->_idx)->block_index() != -1) {
-          int index = _nodes.at(parent->_idx)->block_index();
-          desc->set_block_index(index);
-          blocks->adr_at(index)->add_node(desc);
-        } else {
-          desc->set_block_index(0);
-          blocks->adr_at(0)->add_node(desc);
-          //ShouldNotReachHere();
-        }
-      //}
-      /*
-      if (desc->node()->is_block_proj() && _nodes.at(desc->node()->is_block_proj()->_idx)->block_index() != -1) {
-        int index = _nodes.at(desc->node()->is_block_proj()->_idx)->block_index();
-        desc->set_block_index(index);
-        blocks->adr_at(index)->add_node(desc);
-      } */
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      desc->clear_succs();
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      int block_index = desc->block_index();
-
-      assert(block_index >= 0 && block_index < blocks->length(), "Block index must be in range");
-      assert(blocks->adr_at(block_index)->nodes()->contains(desc), "Node must be child of block");
-    }
-  }
-  a->destruct_contents();
-}
-
-void IdealGraphPrinter::build_blocks(Node *root) {
-
-  Arena *a = new Arena();
-  Node_Stack stack(a, 100);
-
-  VectorSet visited(a);
-  stack.push(root, 0);
-  GrowableArray<Block> blocks(a, 2, 0, Block(0));
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    if (_nodes.at(i)) _nodes.at(i)->set_block_index(-1);
-  }
-
-
-  // Order nodes such that node index is equal to idx
-  for (int i = 0; i < _nodes.length(); i++) {
-
-    if (_nodes.at(i)) {
-      NodeDescription *node = _nodes.at(i);
-      int index = node->node()->_idx;
-      if (index != i) {
-        _nodes.at_grow(index);
-        NodeDescription *tmp = _nodes.at(index);
-        *(_nodes.adr_at(index)) = node;
-        *(_nodes.adr_at(i)) = tmp;
-        i--;
-      }
-    }
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *node = _nodes.at(i);
-    if (node) {
-      assert(node->node()->_idx == (uint)i, "");
-    }
-  }
-
-  while(stack.is_nonempty()) {
-
-    //Node *n = stack.node();
-    //int index = stack.index();
-    Node *proj = stack.node();//n->in(index);
-    const Node *parent = proj->is_block_proj();
-    if (parent == NULL) {
-      parent = proj;
-    }
-
-    if (!visited.test_set(parent->_idx)) {
-
-      NodeDescription *end_desc = _nodes.at(parent->_idx);
-      int block_index = blocks.length();
-      Block block(block_index);
-      blocks.append(block);
-      Block *b = blocks.adr_at(block_index);
-      b->set_start(end_desc);
-     // assert(end_desc->block_index() == -1, "");
-      end_desc->set_block_index(block_index);
-      b->add_node(end_desc);
-
-      // Skip any control-pinned middle'in stuff
-      Node *p = proj;
-      NodeDescription *start_desc = NULL;
-      do {
-        proj = p;                   // Update pointer to last Control
-        if (p->in(0) == NULL) {
-          start_desc = end_desc;
-          break;
-        }
-        p = p->in(0);               // Move control forward
-        start_desc = _nodes.at(p->_idx);
-        assert(start_desc, "");
-
-        if (start_desc != end_desc && start_desc->block_index() == -1) {
-          assert(start_desc->block_index() == -1, "");
-          assert(block_index < blocks.length(), "");
-          start_desc->set_block_index(block_index);
-          b->add_node(start_desc);
-        }
-     } while( !p->is_block_proj() &&
-               !p->is_block_start() );
-
-      for (uint i = 0; i < start_desc->node()->len(); i++) {
-
-          Node *pred_node = start_desc->node()->in(i);
-
-
-          if (pred_node && pred_node != start_desc->node()) {
-            const Node *cur_parent = pred_node->is_block_proj();
-            if (cur_parent != NULL) {
-              pred_node = (Node *)cur_parent;
-            }
-
-            NodeDescription *pred_node_desc = _nodes.at(pred_node->_idx);
-            if (pred_node_desc->block_index() != -1) {
-              blocks.adr_at(pred_node_desc->block_index())->add_succ(block_index);
-            }
-          }
-      }
-
-      for (DUIterator_Fast dmax, i = end_desc->node()->fast_outs(dmax); i < dmax; i++) {
-        Node* cur_succ = end_desc->node()->fast_out(i);
-        NodeDescription *cur_succ_desc = _nodes.at(cur_succ->_idx);
-
-        DUIterator_Fast dmax2, i2 = cur_succ->fast_outs(dmax2);
-        if (cur_succ->is_block_proj() && i2 < dmax2 && !cur_succ->is_Root()) {
-
-          for (; i2<dmax2; i2++) {
-            Node *cur_succ2 = cur_succ->fast_out(i2);
-            if (cur_succ2) {
-              cur_succ_desc = _nodes.at(cur_succ2->_idx);
-              if (cur_succ_desc == NULL) {
-                // dead node so skip it
-                continue;
-              }
-              if (cur_succ2 != end_desc->node() && cur_succ_desc->block_index() != -1) {
-                b->add_succ(cur_succ_desc->block_index());
-              }
-            }
-          }
-
-        } else {
-
-          if (cur_succ != end_desc->node() && cur_succ_desc && cur_succ_desc->block_index() != -1) {
-            b->add_succ(cur_succ_desc->block_index());
-          }
-        }
-      }
-
-
-      int num_preds = p->len();
-      int bottom = -1;
-      if (p->is_Region() || p->is_Phi()) {
-        bottom = 0;
-      }
-
-      int pushed = 0;
-      for (int i=num_preds - 1; i > bottom; i--) {
-        if (p->in(i) != NULL && p->in(i) != p) {
-          stack.push(p->in(i), 0);
-          pushed++;
-        }
-      }
-
-      if (pushed == 0 && p->is_Root() && !_matcher) {
-        // Special case when backedges to root are not yet built
-        for (int i = 0; i < _nodes.length(); i++) {
-          if (_nodes.at(i) && _nodes.at(i)->node()->is_SafePoint() && _nodes.at(i)->node()->outcnt() == 0) {
-            stack.push(_nodes.at(i)->node(), 0);
-          }
-        }
-      }
-
-    } else {
-      stack.pop();
-    }
-  }
-
-  build_dominators(&blocks);
-
-  int **common_dominator = NEW_RESOURCE_ARRAY(int *, blocks.length());
-  for (int i = 0; i < blocks.length(); i++) {
-    int *cur = NEW_RESOURCE_ARRAY(int, blocks.length());
-    common_dominator[i] = cur;
-
-    for (int j=0; j<blocks.length(); j++) {
-      cur[j] = 0;
-    }
-  }
-
-  for (int i = 0; i < blocks.length(); i++) {
-    blocks.adr_at(i)->add_child(blocks.adr_at(i)->index());
-  }
-  build_common_dominator(common_dominator, 0, &blocks);
-
-  schedule_latest(common_dominator, &blocks);
-
-  start_element(CONTROL_FLOW_ELEMENT);
-
-  for (int i = 0; i < blocks.length(); i++) {
-    Block *block = blocks.adr_at(i);
-
-    Properties props;
-    props.add(new Property(BLOCK_NAME_PROPERTY, i));
-    props.add(new Property(BLOCK_DOMINATOR_PROPERTY, block->dominator()));
-    start_element(BLOCK_ELEMENT, &props);
-
-    if (block->succs()->length() > 0) {
-      start_element(SUCCESSORS_ELEMENT);
-      for (int j=0; j<block->succs()->length(); j++) {
-        int cur_index = block->succs()->at(j);
-        if (cur_index != 0 /* start_block has must not have inputs */) {
-          Properties properties;
-          properties.add(new Property(BLOCK_NAME_PROPERTY, cur_index));
-          simple_element(SUCCESSOR_ELEMENT, &properties);
-        }
-      }
-      end_element(SUCCESSORS_ELEMENT);
-    }
-
-    start_element(NODES_ELEMENT);
-
-    for (int j=0; j<block->nodes()->length(); j++) {
-      NodeDescription *n = block->nodes()->at(j);
-      Properties properties;
-      properties.add(new Property(NODE_ID_PROPERTY, n->id()));
-      simple_element(NODE_ELEMENT, &properties);
-    }
-
-    end_element(NODES_ELEMENT);
-
-    end_element(BLOCK_ELEMENT);
-  }
-
-
-  end_element(CONTROL_FLOW_ELEMENT);
-
-  a->destruct_contents();
-}
-
 void IdealGraphPrinter::print_method(Compile* compile, const char *name, int level, bool clear_nodes) {
   print(compile, name, (Node *)compile->root(), level, clear_nodes);
 }
@@ -1048,872 +652,53 @@
 // Print current ideal graph
 void IdealGraphPrinter::print(Compile* compile, const char *name, Node *node, int level, bool clear_nodes) {
 
-//  if (finish && !in_method) return;
   if (!_current_method || !_should_send_method || level > PrintIdealGraphLevel) return;
 
-  assert(_current_method, "newMethod has to be called first!");
-
-  if (clear_nodes) {
-    int x = 0;
-  }
-
-  _clear_nodes = clear_nodes;
+  this->C = compile;
 
   // Warning, unsafe cast?
-  _chaitin = (PhaseChaitin *)compile->regalloc();
-  _matcher = compile->matcher();
-
-
-  // Update nodes
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      desc->set_state(Invalid);
-    }
-  }
-  Node *n = node;
-  walk(n);
-
-  // Update edges
-  for (int i = 0; i < _edges.length(); i++) {
-      _edges.at(i)->set_state(Invalid);
-  }
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc && desc->state() != Invalid) {
-
-      int to = desc->id();
-      uint len = desc->node()->len();
-      for (uint j=0; j<len; j++) {
-        Node *n = desc->node()->in(j);
-
-        if (n) {
-
-
-          intptr_t from = (intptr_t)n;
+  _chaitin = (PhaseChaitin *)C->regalloc();
 
-          // Assert from node is valid
-          /*
-          bool ok = false;
-          for (int k=0; k<_nodes.length(); k++) {
-            NodeDescription *desc = _nodes.at(k);
-            if (desc && desc->id() == from) {
-              assert(desc->state() != Invalid, "");
-              ok = true;
-            }
-          }
-          assert(ok, "");*/
-
-          uint index = j;
-          if (index >= desc->node()->req()) {
-            index = desc->node()->req();
-          }
+  begin_head(GRAPH_ELEMENT);
+  print_attr(GRAPH_NAME_PROPERTY, (const char *)name);
+  end_head();
 
-          print_edge(from, to, index);
-        }
-      }
-    }
-  }
-
-  bool is_different = false;
-
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc && desc->state() != Valid) {
-      is_different = true;
-      break;
-    }
-  }
-
-  if (!is_different) {
-    for (int i = 0; i < _edges.length(); i++) {
-      EdgeDescription *conn = _edges.at(i);
-      if (conn && conn->state() != Valid) {
-        is_different = true;
-        break;
-      }
-    }
-  }
+  head(NODES_ELEMENT);
+  walk_nodes(node, NULL);
+  tail(NODES_ELEMENT);
 
-  // No changes -> do not print graph
-  if (!is_different) return;
-
-  Properties properties;
-  properties.add(new Property(GRAPH_NAME_PROPERTY, (const char *)name));
-  start_element(GRAPH_ELEMENT, &properties);
-
-  start_element(NODES_ELEMENT);
-  for (int i = 0; i < _nodes.length(); i++) {
-    NodeDescription *desc = _nodes.at(i);
-    if (desc) {
-      desc->print(this);
-      if (desc->state() == Invalid) {
-        delete desc;
-        _nodes.at_put(i, NULL);
-      } else {
-        desc->set_state(Valid);
-      }
-    }
-  }
-  end_element(NODES_ELEMENT);
-
-  build_blocks(node);
-
-  start_element(EDGES_ELEMENT);
-  for (int i = 0; i < _edges.length(); i++) {
-    EdgeDescription *conn = _edges.at(i);
-
-    // Assert from and to nodes are valid
-    /*
-    if (!conn->state() == Invalid) {
-      bool ok1 = false;
-      bool ok2 = false;
-      for (int j=0; j<_nodes.length(); j++) {
-        NodeDescription *desc = _nodes.at(j);
-        if (desc && desc->id() == conn->from()) {
-          ok1 = true;
-        }
+  head(EDGES_ELEMENT);
+  walk_nodes(node, (void *)1);
+  tail(EDGES_ELEMENT);
+  if (C->cfg() != NULL) {
+    head(CONTROL_FLOW_ELEMENT);
+    for (uint i = 0; i < C->cfg()->_blocks.size(); i++) {
+      Block *b = C->cfg()->_blocks[i];
+      begin_head(BLOCK_ELEMENT);
+      print_attr(BLOCK_NAME_PROPERTY, b->_pre_order);
+      end_head();
 
-        if (desc && desc->id() == conn->to()) {
-          ok2 = true;
-        }
+      head(SUCCESSORS_ELEMENT);
+      for (uint s = 0; s < C->cfg()->_blocks[i]->_num_succs; s++) {
+        begin_elem(SUCCESSOR_ELEMENT);
+        print_attr(BLOCK_NAME_PROPERTY, b->_succs[s]->_pre_order);
+        end_elem();
       }
-
-      assert(ok1, "from node not found!");
-      assert(ok2, "to node not found!");
-    }*/
-
-    conn->print(this);
-    if (conn->state() == Invalid) {
-      _edges.remove_at(i);
-      delete conn;
-      i--;
-    }
-  }
-
-  end_element(EDGES_ELEMENT);
+      tail(SUCCESSORS_ELEMENT);
 
-  end_element(GRAPH_ELEMENT);
-
-  _output->flush();
-}
-
-// Print edge
-void IdealGraphPrinter::print_edge(int from, int to, int index) {
+      tail(BLOCK_ELEMENT);
+    }
 
-  EdgeDescription *conn = new EdgeDescription(from, to, index);
-  for (int i = 0; i < _edges.length(); i++) {
-    if (_edges.at(i)->equals(conn)) {
-      conn->set_state(Valid);
-      delete _edges.at(i);
-      _edges.at_put(i, conn);
-      return;
-    }
+    tail(CONTROL_FLOW_ELEMENT);
   }
-
-  _edges.append(conn);
+  tail(GRAPH_ELEMENT);
+  output()->flush();
 }
 
 extern const char *NodeClassNames[];
 
-// Create node description
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::create_node_description(Node* node) {
-
-#ifndef PRODUCT
-  node->_in_dump_cnt++;
-  NodeDescription *desc = new NodeDescription(node);
-  desc->properties()->add(new Property(NODE_NAME_PROPERTY, (const char *)node->Name()));
-
-  const Type *t = node->bottom_type();
-  desc->properties()->add(new Property("type", (const char *)Type::msg[t->base()]));
-
-  desc->properties()->add(new Property("idx", node->_idx));
-#ifdef ASSERT
-  desc->properties()->add(new Property("debug_idx", node->_debug_idx));
-#endif
-
-
-  const jushort flags = node->flags();
-  if (flags & Node::Flag_is_Copy) {
-    desc->properties()->add(new Property("is_copy", "true"));
-  }
-  if (flags & Node::Flag_is_Call) {
-    desc->properties()->add(new Property("is_call", "true"));
-  }
-  if (flags & Node::Flag_rematerialize) {
-    desc->properties()->add(new Property("rematerialize", "true"));
-  }
-  if (flags & Node::Flag_needs_anti_dependence_check) {
-    desc->properties()->add(new Property("needs_anti_dependence_check", "true"));
-  }
-  if (flags & Node::Flag_is_macro) {
-    desc->properties()->add(new Property("is_macro", "true"));
-  }
-  if (flags & Node::Flag_is_Con) {
-    desc->properties()->add(new Property("is_con", "true"));
-  }
-  if (flags & Node::Flag_is_cisc_alternate) {
-    desc->properties()->add(new Property("is_cisc_alternate", "true"));
-  }
-  if (flags & Node::Flag_is_Branch) {
-    desc->properties()->add(new Property("is_branch", "true"));
-  }
-  if (flags & Node::Flag_is_block_start) {
-    desc->properties()->add(new Property("is_block_start", "true"));
-  }
-  if (flags & Node::Flag_is_Goto) {
-    desc->properties()->add(new Property("is_goto", "true"));
-  }
-  if (flags & Node::Flag_is_dead_loop_safe) {
-    desc->properties()->add(new Property("is_dead_loop_safe", "true"));
-  }
-  if (flags & Node::Flag_may_be_short_branch) {
-    desc->properties()->add(new Property("may_be_short_branch", "true"));
-  }
-  if (flags & Node::Flag_is_safepoint_node) {
-    desc->properties()->add(new Property("is_safepoint_node", "true"));
-  }
-  if (flags & Node::Flag_is_pc_relative) {
-    desc->properties()->add(new Property("is_pc_relative", "true"));
-  }
-
-  if (_matcher) {
-    if (_matcher->is_shared(desc->node())) {
-      desc->properties()->add(new Property("is_shared", "true"));
-    } else {
-      desc->properties()->add(new Property("is_shared", "false"));
-    }
-
-    if (_matcher->is_dontcare(desc->node())) {
-      desc->properties()->add(new Property("is_dontcare", "true"));
-    } else {
-      desc->properties()->add(new Property("is_dontcare", "false"));
-    }
-  }
-
-  if (node->is_Proj()) {
-    desc->properties()->add(new Property("con", (int)node->as_Proj()->_con));
-  }
-
-  if (node->is_Mach()) {
-    desc->properties()->add(new Property("idealOpcode", (const char *)NodeClassNames[node->as_Mach()->ideal_Opcode()]));
-  }
-
-
-
-
-
-  outputStream *oldTty = tty;
-  buffer[0] = 0;
-  stringStream s2(buffer, sizeof(buffer) - 1);
-
-  node->dump_spec(&s2);
-  assert(s2.size() < sizeof(buffer), "size in range");
-  desc->properties()->add(new Property("dump_spec", buffer));
-
-  if (node->is_block_proj()) {
-    desc->properties()->add(new Property("is_block_proj", "true"));
-  }
-
-  if (node->is_block_start()) {
-    desc->properties()->add(new Property("is_block_start", "true"));
-  }
-
-  const char *short_name = "short_name";
-  if (strcmp(node->Name(), "Parm") == 0 && node->as_Proj()->_con >= TypeFunc::Parms) {
-      int index = node->as_Proj()->_con - TypeFunc::Parms;
-      if (index >= 10) {
-        desc->properties()->add(new Property(short_name, "PA"));
-      } else {
-        sprintf(buffer, "P%d", index);
-        desc->properties()->add(new Property(short_name, buffer));
-      }
-  } else if (strcmp(node->Name(), "IfTrue") == 0) {
-     desc->properties()->add(new Property(short_name, "T"));
-  } else if (strcmp(node->Name(), "IfFalse") == 0) {
-     desc->properties()->add(new Property(short_name, "F"));
-  } else if ((node->is_Con() && node->is_Type()) || node->is_Proj()) {
-
-    if (t->base() == Type::Int && t->is_int()->is_con()) {
-      const TypeInt *typeInt = t->is_int();
-      assert(typeInt->is_con(), "must be constant");
-      jint value = typeInt->get_con();
-
-      // max. 2 chars allowed
-      if (value >= -9 && value <= 99) {
-        sprintf(buffer, "%d", value);
-        desc->properties()->add(new Property(short_name, buffer));
-      }
-      else
-      {
-        desc->properties()->add(new Property(short_name, "I"));
-      }
-    } else if (t == Type::TOP) {
-      desc->properties()->add(new Property(short_name, "^"));
-    } else if (t->base() == Type::Long && t->is_long()->is_con()) {
-      const TypeLong *typeLong = t->is_long();
-      assert(typeLong->is_con(), "must be constant");
-      jlong value = typeLong->get_con();
-
-      // max. 2 chars allowed
-      if (value >= -9 && value <= 99) {
-        sprintf(buffer, "%d", value);
-        desc->properties()->add(new Property(short_name, buffer));
-      }
-      else
-      {
-        desc->properties()->add(new Property(short_name, "L"));
-      }
-    } else if (t->base() == Type::KlassPtr) {
-      const TypeKlassPtr *typeKlass = t->is_klassptr();
-      desc->properties()->add(new Property(short_name, "CP"));
-    } else if (t->base() == Type::Control) {
-      desc->properties()->add(new Property(short_name, "C"));
-    } else if (t->base() == Type::Memory) {
-      desc->properties()->add(new Property(short_name, "M"));
-    } else if (t->base() == Type::Abio) {
-      desc->properties()->add(new Property(short_name, "IO"));
-    } else if (t->base() == Type::Return_Address) {
-      desc->properties()->add(new Property(short_name, "RA"));
-    } else if (t->base() == Type::AnyPtr) {
-      desc->properties()->add(new Property(short_name, "P"));
-    } else if (t->base() == Type::RawPtr) {
-      desc->properties()->add(new Property(short_name, "RP"));
-    } else if (t->base() == Type::AryPtr) {
-      desc->properties()->add(new Property(short_name, "AP"));
-    }
-  }
-
-  if (node->is_SafePoint()) {
-    SafePointNode *safePointNode = node->as_SafePoint();
-    if (safePointNode->jvms()) {
-      stringStream bciStream;
-      bciStream.print("%d ", safePointNode->jvms()->bci());
-      JVMState *caller = safePointNode->jvms()->caller();
-      while(caller) {
-        bciStream.print("%d ", caller->bci());
-
-        caller = caller->caller();
-      }
-      desc->properties()->add(new Property("bci", bciStream.as_string()));
-    }
-  }
-
-  if (_chaitin && _chaitin != (PhaseChaitin *)0xdeadbeef) {
-    buffer[0] = 0;
-    _chaitin->dump_register(node, buffer);
-    desc->properties()->add(new Property("reg", buffer));
-    desc->properties()->add(new Property("lrg", _chaitin->n2lidx(node)));
-  }
-
-
-  node->_in_dump_cnt--;
-  return desc;
-#else
-  return NULL;
-#endif
-}
-
-void IdealGraphPrinter::pre_node(Node* node, void *env) {
-
-  IdealGraphPrinter *printer = (IdealGraphPrinter *)env;
-
-  NodeDescription *newDesc = printer->create_node_description(node);
-
-  if (printer->_clear_nodes) {
-
-    printer->_nodes.append(newDesc);
-  } else {
-
-    NodeDescription *desc = printer->_nodes.at_grow(node->_idx, NULL);
-
-    if (desc && desc->equals(newDesc)) {
-      //desc->set_state(Valid);
-      //desc->set_node(node);
-      delete desc;
-      printer->_nodes.at_put(node->_idx, NULL);
-      newDesc->set_state(Valid);
-      //printer->_nodes.at_put(node->_idx, newDesc);
-    } else {
-
-      if (desc && desc->id() == newDesc->id()) {
-        delete desc;
-        printer->_nodes.at_put(node->_idx, NULL);
-        newDesc->set_state(New);
-
-      }
-
-      //if (desc) {
-      //  delete desc;
-      //}
-
-      //printer->_nodes.at_put(node->_idx, newDesc);
-    }
-
-    printer->_nodes.append(newDesc);
-  }
-}
-
-void IdealGraphPrinter::post_node(Node* node, void *env) {
-}
-
 outputStream *IdealGraphPrinter::output() {
-  return _output;
-}
-
-IdealGraphPrinter::Description::Description() {
-  _state = New;
-}
-
-void IdealGraphPrinter::Description::print(IdealGraphPrinter *printer) {
-  if (_state == Invalid) {
-    print_removed(printer);
-  } else if (_state == New) {
-    print_changed(printer);
-  }
-}
-
-void IdealGraphPrinter::Description::set_state(State s) {
-  _state = s;
-}
-
-IdealGraphPrinter::State IdealGraphPrinter::Description::state() {
-  return _state;
-}
-
-void IdealGraphPrinter::Block::set_proj(NodeDescription *n) {
-  _proj = n;
-}
-
-void IdealGraphPrinter::Block::set_start(NodeDescription *n) {
-  _start = n;
-}
-
-int IdealGraphPrinter::Block::semi() {
-  return _semi;
-}
-
-int IdealGraphPrinter::Block::parent() {
-  return _parent;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::bucket() {
-  return &_bucket;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::children() {
-  return &_children;
-}
-
-void IdealGraphPrinter::Block::add_child(int i) {
-  _children.append(i);
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::dominates() {
-  return &_dominates;
-}
-
-void IdealGraphPrinter::Block::add_dominates(int i) {
-  _dominates.append(i);
-}
-
-void IdealGraphPrinter::Block::add_to_bucket(int i) {
-  _bucket.append(i);
-}
-
-void IdealGraphPrinter::Block::clear_bucket() {
-  _bucket.clear();
-}
-
-void IdealGraphPrinter::Block::set_dominator(int i) {
-  _dominator = i;
-}
-
-void IdealGraphPrinter::Block::set_label(int i) {
-  _label = i;
-}
-
-int IdealGraphPrinter::Block::label() {
-  return _label;
-}
-
-int IdealGraphPrinter::Block::ancestor() {
-  return _ancestor;
-}
-
-void IdealGraphPrinter::Block::set_ancestor(int i) {
-  _ancestor = i;
-}
-
-int IdealGraphPrinter::Block::dominator() {
-  return _dominator;
-}
-
-int IdealGraphPrinter::Block::index() {
-  return _index;
-}
-
-void IdealGraphPrinter::Block::set_parent(int i) {
-  _parent = i;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::pred() {
-  return &_pred;
-}
-
-void IdealGraphPrinter::Block::set_semi(int i) {
-  _semi = i;
-}
-
-IdealGraphPrinter::Block::Block() {
-}
-
-IdealGraphPrinter::Block::Block(int index) {
-  _index = index;
-  _label = index;
-  _semi = -1;
-  _ancestor = -1;
-  _dominator = -1;
-}
-
-void IdealGraphPrinter::Block::add_pred(int i) {
-  _pred.append(i);
-}
-
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::Block::proj() {
-  return _proj;
-}
-
-IdealGraphPrinter::NodeDescription *IdealGraphPrinter::Block::start() {
-  return _start;
-}
-
-GrowableArray<int>* IdealGraphPrinter::Block::succs() {
-  return &_succs;
-}
-
-void IdealGraphPrinter::Block::add_succ(int index) {
-
-  if (this->_index == 16 && index == 15) {
-    int x = 0;
-  }
-
-  if (!_succs.contains(index)) {
-    _succs.append(index);
-  }
-}
-
-
-void IdealGraphPrinter::Block::add_node(NodeDescription *n) {
-  if (!_nodes.contains(n)) {
-    _nodes.append(n);
-  }
-}
-
-GrowableArray<IdealGraphPrinter::NodeDescription *>* IdealGraphPrinter::Block::nodes() {
-  return &_nodes;
-}
-
-int IdealGraphPrinter::NodeDescription::count = 0;
-
-IdealGraphPrinter::NodeDescription::NodeDescription(Node* node) : _node(node) {
-  _id = (intptr_t)(node);
-  _block_index = -1;
-}
-
-IdealGraphPrinter::NodeDescription::~NodeDescription() {
-  _properties.clean();
-}
-
-// void IdealGraphPrinter::NodeDescription::set_node(Node* node) {
-//   //this->_node = node;
-// }
-
-int IdealGraphPrinter::NodeDescription::block_index() {
-  return _block_index;
-}
-
-
-GrowableArray<IdealGraphPrinter::NodeDescription *>* IdealGraphPrinter::NodeDescription::succs() {
-  return &_succs;
-}
-
-void IdealGraphPrinter::NodeDescription::clear_succs() {
-  _succs.clear();
-}
-
-void IdealGraphPrinter::NodeDescription::init_succs() {
-  _succs = GrowableArray<NodeDescription *>();
-}
-
-void IdealGraphPrinter::NodeDescription::add_succ(NodeDescription *desc) {
-  _succs.append(desc);
-}
-
-void IdealGraphPrinter::NodeDescription::set_block_index(int i) {
-  _block_index = i;
-}
-
-bool IdealGraphPrinter::NodeDescription::equals(NodeDescription *desc) {
-  if (desc == NULL) return false;
-  if (desc->id() != id()) return false;
-  return properties()->equals(desc->properties());
-}
-
-Node* IdealGraphPrinter::NodeDescription::node() {
-  return _node;
-}
-
-IdealGraphPrinter::Properties* IdealGraphPrinter::NodeDescription::properties() {
-  return &_properties;
-}
-
-uint IdealGraphPrinter::NodeDescription::id() {
-  return _id;
-}
-
-void IdealGraphPrinter::NodeDescription::print_changed(IdealGraphPrinter *printer) {
-
-
-  Properties properties;
-  properties.add(new Property(NODE_ID_PROPERTY, id()));
-  printer->start_element(NODE_ELEMENT, &properties);
-
-  this->properties()->print(printer);
-
-
-  printer->end_element(NODE_ELEMENT);
-}
-
-void IdealGraphPrinter::NodeDescription::print_removed(IdealGraphPrinter *printer) {
-
-  Properties properties;
-  properties.add(new Property(NODE_ID_PROPERTY, id()));
-  printer->simple_element(REMOVE_NODE_ELEMENT, &properties);
-}
-
-IdealGraphPrinter::EdgeDescription::EdgeDescription(int from, int to, int index) {
-  this->_from = from;
-  this->_to = to;
-  this->_index = index;
-}
-
-IdealGraphPrinter::EdgeDescription::~EdgeDescription() {
-}
-
-int IdealGraphPrinter::EdgeDescription::from() {
-  return _from;
-}
-
-int IdealGraphPrinter::EdgeDescription::to() {
-  return _to;
-}
-
-void IdealGraphPrinter::EdgeDescription::print_changed(IdealGraphPrinter *printer) {
-
-  Properties properties;
-  properties.add(new Property(INDEX_PROPERTY, _index));
-  properties.add(new Property(FROM_PROPERTY, _from));
-  properties.add(new Property(TO_PROPERTY, _to));
-  printer->simple_element(EDGE_ELEMENT, &properties);
-}
-
-void IdealGraphPrinter::EdgeDescription::print_removed(IdealGraphPrinter *printer) {
-
-  Properties properties;
-  properties.add(new Property(INDEX_PROPERTY, _index));
-  properties.add(new Property(FROM_PROPERTY, _from));
-  properties.add(new Property(TO_PROPERTY, _to));
-  printer->simple_element(REMOVE_EDGE_ELEMENT, &properties);
-}
-
-bool IdealGraphPrinter::EdgeDescription::equals(IdealGraphPrinter::EdgeDescription *desc) {
-  if (desc == NULL) return false;
-  return (_from == desc->_from && _to == desc->_to && _index == desc->_index);
-}
-
-IdealGraphPrinter::Properties::Properties() : list(new (ResourceObj::C_HEAP) GrowableArray<Property *>(2, 0, NULL, true)) {
-}
-
-IdealGraphPrinter::Properties::~Properties() {
-  clean();
-  delete list;
-}
-
-void IdealGraphPrinter::Properties::add(Property *p) {
-  assert(p != NULL, "Property not NULL");
-  list->append(p);
-}
-
-void IdealGraphPrinter::Properties::print(IdealGraphPrinter *printer) {
-  printer->start_element(PROPERTIES_ELEMENT);
-
-  for (int i = 0; i < list->length(); i++) {
-    list->at(i)->print(printer);
-  }
-
-  printer->end_element(PROPERTIES_ELEMENT);
-}
-
-void IdealGraphPrinter::Properties::clean() {
-  for (int i = 0; i < list->length(); i++) {
-    delete list->at(i);
-    list->at_put(i, NULL);
-  }
-  list->clear();
-  assert(list->length() == 0, "List cleared");
-}
-
-void IdealGraphPrinter::Properties::remove(const char *name) {
-  for (int i = 0; i < list->length(); i++) {
-    if (strcmp(list->at(i)->name(), name) == 0) {
-      delete list->at(i);
-      list->remove_at(i);
-      i--;
-    }
-  }
-}
-
-void IdealGraphPrinter::Properties::print_as_attributes(IdealGraphPrinter *printer) {
-
-  for (int i = 0; i < list->length(); i++) {
-    assert(list->at(i) != NULL, "Property not null!");
-    printer->output()->print(" ");
-    list->at(i)->print_as_attribute(printer);
-  }
-}
-
-bool IdealGraphPrinter::Properties::equals(Properties* p) {
-  if (p->list->length() != this->list->length()) return false;
-
-  for (int i = 0; i < list->length(); i++) {
-    assert(list->at(i) != NULL, "Property not null!");
-    if (!list->at(i)->equals(p->list->at(i))) return false;
-  }
-
-  return true;
-}
-
-IdealGraphPrinter::Property::Property() {
-  _name = NULL;
-  _value = NULL;
-}
-
-const char *IdealGraphPrinter::Property::name() {
-  return _name;
-}
-
-IdealGraphPrinter::Property::Property(const Property* p) {
-
-  this->_name = NULL;
-  this->_value = NULL;
-
-  if (p->_name != NULL) {
-    _name = dup(p->_name);
-  }
-
-  if (p->_value) {
-    _value = dup(p->_value);
-  }
-}
-
-IdealGraphPrinter::Property::~Property() {
-
-  clean();
-}
-
-IdealGraphPrinter::Property::Property(const char *name, const char *value) {
-
-  assert(name, "Name must not be null!");
-  assert(value, "Value must not be null!");
-
-  _name = dup(name);
-  _value = dup(value);
-}
-
-IdealGraphPrinter::Property::Property(const char *name, int intValue) {
-  _name = dup(name);
-
-  stringStream stream;
-  stream.print("%d", intValue);
-  _value = dup(stream.as_string());
-}
-
-void IdealGraphPrinter::Property::clean() {
-  if (_name) {
-    delete _name;
-    _name = NULL;
-  }
-
-  if (_value) {
-    delete _value;
-    _value = NULL;
-  }
-}
-
-
-bool IdealGraphPrinter::Property::is_null() {
-  return _name == NULL;
-}
-
-void IdealGraphPrinter::Property::print(IdealGraphPrinter *printer) {
-
-  assert(!is_null(), "null properties cannot be printed!");
-  Properties properties;
-  properties.add(new Property(PROPERTY_NAME_PROPERTY, _name));
-  printer->start_element(PROPERTY_ELEMENT, &properties, false, false);
-  printer->print_xml(_value);
-  printer->end_element(PROPERTY_ELEMENT, false, true);
-}
-
-void IdealGraphPrinter::Property::print_as_attribute(IdealGraphPrinter *printer) {
-
-  printer->output()->print(_name);
-  printer->output()->print("=\"");
-  printer->print_xml(_value);
-  printer->output()->print("\"");
-}
-
-
-bool IdealGraphPrinter::Property::equals(Property* p) {
-
-  if (is_null() && p->is_null()) return true;
-  if (is_null()) return false;
-  if (p->is_null()) return false;
-
-  int cmp1 = strcmp(p->_name, _name);
-  if (cmp1 != 0) return false;
-
-  int cmp2 = strcmp(p->_value, _value);
-  if (cmp2 != 0) return false;
-
-  return true;
-}
-
-void IdealGraphPrinter::print_xml(const char *value) {
-  size_t len = strlen(value);
-
-  char buf[2];
-  buf[1] = 0;
-  for (size_t i = 0; i < len; i++) {
-    char c = value[i];
-
-    switch(c) {
-      case '<':
-        output()->print("&lt;");
-        break;
-
-      case '>':
-        output()->print("&gt;");
-        break;
-
-      default:
-        buf[0] = c;
-        output()->print(buf);
-        break;
-    }
-  }
+  return _xml;
 }
 
 #endif
--- a/hotspot/src/share/vm/opto/idealGraphPrinter.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/idealGraphPrinter.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -82,222 +82,42 @@
   static const char *METHOD_SHORT_NAME_PROPERTY;
   static const char *ASSEMBLY_ELEMENT;
 
-  class Property {
-
-  private:
-
-    const char *_name;
-    const char *_value;
-
-  public:
-
-    Property();
-    Property(const Property* p);
-    ~Property();
-    Property(const char *name, const char *value);
-    Property(const char *name, int value);
-    bool equals(Property* p);
-    void print(IdealGraphPrinter *printer);
-    void print_as_attribute(IdealGraphPrinter *printer);
-    bool is_null();
-    void clean();
-    const char *name();
-
-    static const char* dup(const char *str) {
-      char * copy = new char[strlen(str)+1];
-      strcpy(copy, str);
-      return copy;
-    }
-
-  };
-
-  class Properties {
-
-  private:
-
-    GrowableArray<Property *> *list;
-
-  public:
-
-    Properties();
-    ~Properties();
-    void add(Property *p);
-    void remove(const char *name);
-    bool equals(Properties* p);
-    void print(IdealGraphPrinter *printer);
-    void print_as_attributes(IdealGraphPrinter *printer);
-    void clean();
-
-  };
-
-
-  class Description {
-
-  private:
-
-    State _state;
-
-  public:
-
-    Description();
-
-    State state();
-    void set_state(State s);
-    void print(IdealGraphPrinter *printer);
-    virtual void print_changed(IdealGraphPrinter *printer) = 0;
-    virtual void print_removed(IdealGraphPrinter *printer) = 0;
-
-  };
-
-  class NodeDescription : public Description{
-
-  public:
-
-    static int count;
-
-  private:
-
-    GrowableArray<NodeDescription *> _succs;
-    int _block_index;
-    uintptr_t _id;
-    Properties _properties;
-    Node* _node;
-
-  public:
-
-    NodeDescription(Node* node);
-    ~NodeDescription();
-    Node* node();
-
-    // void set_node(Node* node);
-    GrowableArray<NodeDescription *>* succs();
-    void init_succs();
-    void clear_succs();
-    void add_succ(NodeDescription *desc);
-    int block_index();
-    void set_block_index(int i);
-    Properties* properties();
-    virtual void print_changed(IdealGraphPrinter *printer);
-    virtual void print_removed(IdealGraphPrinter *printer);
-    bool equals(NodeDescription *desc);
-    uint id();
-
-  };
-
-  class Block {
-
-  private:
-
-    NodeDescription *_start;
-    NodeDescription *_proj;
-    GrowableArray<int> _succs;
-    GrowableArray<NodeDescription *> _nodes;
-    GrowableArray<int> _dominates;
-    GrowableArray<int> _children;
-    int _semi;
-    int _parent;
-    GrowableArray<int> _pred;
-    GrowableArray<int> _bucket;
-    int _index;
-    int _dominator;
-    int _ancestor;
-    int _label;
-
-  public:
-
-    Block();
-    Block(int index);
-
-    void add_node(NodeDescription *n);
-    GrowableArray<NodeDescription *>* nodes();
-    GrowableArray<int>* children();
-    void add_child(int i);
-    void add_succ(int index);
-    GrowableArray<int>* succs();
-    GrowableArray<int>* dominates();
-    void add_dominates(int i);
-    NodeDescription *start();
-    NodeDescription *proj();
-    void set_start(NodeDescription *n);
-    void set_proj(NodeDescription *n);
-
-    int label();
-    void set_label(int i);
-    int ancestor();
-    void set_ancestor(int i);
-    int index();
-    int dominator();
-    void set_dominator(int i);
-    int parent();
-    void set_parent(int i);
-    int semi();
-    GrowableArray<int>* bucket();
-    void add_to_bucket(int i);
-    void clear_bucket();
-    GrowableArray<int>* pred();
-    void set_semi(int i);
-    void add_pred(int i);
-
-  };
-
-  class EdgeDescription : public Description {
-
-  private:
-
-    int _from;
-    int _to;
-    int _index;
-  public:
-
-    EdgeDescription(int from, int to, int index);
-    ~EdgeDescription();
-
-    virtual void print_changed(IdealGraphPrinter *printer);
-    virtual void print_removed(IdealGraphPrinter *printer);
-    bool equals(EdgeDescription *desc);
-    int from();
-    int to();
-  };
-
+  elapsedTimer _walk_time;
+  elapsedTimer _output_time;
+  elapsedTimer _build_blocks_time;
 
   static int _file_count;
   networkStream *_stream;
+  xmlStream *_xml;
   outputStream *_output;
   ciMethod *_current_method;
-  GrowableArray<NodeDescription *> _nodes;
-  GrowableArray<EdgeDescription *> _edges;
   int _depth;
-  Arena *_arena;
   char buffer[128];
   bool _should_send_method;
   PhaseChaitin* _chaitin;
-  bool _clear_nodes;
-  Matcher* _matcher;
   bool _traverse_outs;
-
-  void start_element_helper(const char *name, Properties *properties, bool endElement, bool print_indent = false, bool print_return = true);
-  NodeDescription *create_node_description(Node* node);
+  Compile *C;
 
   static void pre_node(Node* node, void *env);
   static void post_node(Node* node, void *env);
 
-  void schedule_latest(int **common_dominator, GrowableArray<Block>* blocks);
-  void build_common_dominator(int **common_dominator, int index, GrowableArray<Block>* blocks);
-  void compress(int index, GrowableArray<Block>* blocks);
-  int eval(int index, GrowableArray<Block>* blocks);
-  void link(int index1, int index2, GrowableArray<Block>* blocks);
-  void build_dominators(GrowableArray<Block>* blocks);
-  void build_blocks(Node *node);
-  void walk(Node *n);
-  void start_element(const char *name, Properties *properties = NULL, bool print_indent = false, bool print_return = true);
-  void simple_element(const char *name, Properties *properties = NULL, bool print_indent = false);
-  void end_element(const char *name, bool print_indent = false, bool print_return = true);
-  void print_edge(int from, int to, int index);
   void print_indent();
   void print_method(ciMethod *method, int bci, InlineTree *tree);
   void print_inline_tree(InlineTree *tree);
-  void clear_nodes();
-
+  void visit_node(Node *n, void *param);
+  void walk_nodes(Node *start, void *param);
+  void begin_elem(const char *s);
+  void end_elem();
+  void begin_head(const char *s);
+  void end_head();
+  void print_attr(const char *name, const char *val);
+  void print_attr(const char *name, intptr_t val);
+  void print_prop(const char *name, const char *val);
+  void print_prop(const char *name, int val);
+  void tail(const char *name);
+  void head(const char *name);
+  void text(const char *s);
+  intptr_t get_node_id(Node *n);
   IdealGraphPrinter();
   ~IdealGraphPrinter();
 
@@ -308,7 +128,6 @@
 
   bool traverse_outs();
   void set_traverse_outs(bool b);
-  void print_ifg(PhaseIFG* ifg);
   outputStream *output();
   void print_inlining(Compile* compile);
   void begin_method(Compile* compile);
--- a/hotspot/src/share/vm/opto/library_call.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/library_call.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -2194,14 +2194,15 @@
     pre_barrier(control(), base, adr, alias_idx, newval, value_type, T_OBJECT);
 #ifdef _LP64
     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
+      Node *newval_enc = _gvn.transform(new (C, 2) EncodePNode(newval, newval->bottom_type()->make_narrowoop()));
+      Node *oldval_enc = _gvn.transform(new (C, 2) EncodePNode(oldval, oldval->bottom_type()->make_narrowoop()));
       cas = _gvn.transform(new (C, 5) CompareAndSwapNNode(control(), mem, adr,
-                                                           EncodePNode::encode(&_gvn, newval),
-                                                           EncodePNode::encode(&_gvn, oldval)));
+                                                          newval_enc, oldval_enc));
     } else
 #endif
-      {
-        cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
-      }
+    {
+      cas = _gvn.transform(new (C, 5) CompareAndSwapPNode(control(), mem, adr, newval, oldval));
+    }
     post_barrier(control(), cas, base, adr, alias_idx, newval, T_OBJECT, true);
     break;
   default:
--- a/hotspot/src/share/vm/opto/loopTransform.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -690,7 +690,7 @@
   // (the main-loop trip-counter exit value) because we will be changing
   // the exit value (via unrolling) so we cannot constant-fold away the zero
   // trip guard until all unrolling is done.
-  Node *zer_opaq = new (C, 2) Opaque1Node(incr);
+  Node *zer_opaq = new (C, 2) Opaque1Node(C, incr);
   Node *zer_cmp  = new (C, 3) CmpINode( zer_opaq, limit );
   Node *zer_bol  = new (C, 2) BoolNode( zer_cmp, b_test );
   register_new_node( zer_opaq, new_main_exit );
@@ -760,7 +760,7 @@
   // pre-loop, the main-loop may not execute at all.  Later in life this
   // zero-trip guard will become the minimum-trip guard when we unroll
   // the main-loop.
-  Node *min_opaq = new (C, 2) Opaque1Node(limit);
+  Node *min_opaq = new (C, 2) Opaque1Node(C, limit);
   Node *min_cmp  = new (C, 3) CmpINode( pre_incr, min_opaq );
   Node *min_bol  = new (C, 2) BoolNode( min_cmp, b_test );
   register_new_node( min_opaq, new_pre_exit );
@@ -810,7 +810,7 @@
 
   // Save the original loop limit in this Opaque1 node for
   // use by range check elimination.
-  Node *pre_opaq  = new (C, 3) Opaque1Node(pre_limit, limit);
+  Node *pre_opaq  = new (C, 3) Opaque1Node(C, pre_limit, limit);
 
   register_new_node( pre_limit, pre_head->in(0) );
   register_new_node( pre_opaq , pre_head->in(0) );
--- a/hotspot/src/share/vm/opto/loopUnswitch.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopUnswitch.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -205,7 +205,7 @@
 
   Node *cont      = _igvn.intcon(1);
   set_ctrl(cont, C->root());
-  Node* opq       = new (C, 2) Opaque1Node(cont);
+  Node* opq       = new (C, 2) Opaque1Node(C, cont);
   register_node(opq, outer_loop, entry, dom_depth(entry));
   Node *bol       = new (C, 2) Conv2BNode(opq);
   register_node(bol, outer_loop, entry, dom_depth(entry));
--- a/hotspot/src/share/vm/opto/loopnode.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopnode.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -1072,8 +1072,6 @@
       phase->_igvn.add_users_to_worklist(l->fast_out(i));
   }
 
-  phase->C->print_method("After beautify loops", 3);
-
   // Now recursively beautify nested loops
   if( _child ) result |= _child->beautify_loops( phase );
   if( _next  ) result |= _next ->beautify_loops( phase );
@@ -1470,6 +1468,8 @@
       }
       // Reset loop nesting depth
       _ltree_root->set_nest( 0 );
+
+      C->print_method("After beautify loops", 3);
     }
   }
 
--- a/hotspot/src/share/vm/opto/loopopts.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/loopopts.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -41,7 +41,7 @@
   const Type* type = n->bottom_type();
   const TypeOopPtr *t_oop = _igvn.type(n)->isa_oopptr();
   Node *phi;
-  if( t_oop != NULL && t_oop->is_instance_field() ) {
+  if( t_oop != NULL && t_oop->is_known_instance_field() ) {
     int iid    = t_oop->instance_id();
     int index  = C->get_alias_index(t_oop);
     int offset = t_oop->offset();
@@ -2685,7 +2685,7 @@
       if( !cle->stride_is_con() ) continue;
       // Hit!  Refactor use to use the post-incremented tripcounter.
       // Compute a post-increment tripcounter.
-      Node *opaq = new (C, 2) Opaque2Node( cle->incr() );
+      Node *opaq = new (C, 2) Opaque2Node( C, cle->incr() );
       register_new_node( opaq, u_ctrl );
       Node *neg_stride = _igvn.intcon(-cle->stride_con());
       set_ctrl(neg_stride, C->root());
--- a/hotspot/src/share/vm/opto/machnode.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/machnode.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -262,17 +262,19 @@
     // Now we have collected every part of the ADLC MEMORY_INTER.
     // See if it adds up to a base + offset.
     if (index != NULL) {
-      if (!index->is_Con()) {
-        const TypeNarrowOop* narrowoop = index->bottom_type()->isa_narrowoop();
-        if (narrowoop != NULL) {
-          // Memory references through narrow oops have a
-          // funny base so grab the type from the index.
-          adr_type = narrowoop->make_oopptr();
-          return NULL;
-        }
+      const Type* t_index = index->bottom_type();
+      if (t_index->isa_narrowoop()) { // EncodeN, LoadN, LoadConN, LoadNKlass.
+        // Memory references through narrow oops have a
+        // funny base so grab the type from the index:
+        // [R12 + narrow_oop_reg<<3 + offset]
+        assert(base == NULL, "Memory references through narrow oops have no base");
+        offset = disp;
+        adr_type = t_index->make_ptr()->add_offset(offset);
+        return NULL;
+      } else if (!index->is_Con()) {
         disp = Type::OffsetBot;
       } else if (disp != Type::OffsetBot) {
-        const TypeX* ti = index->bottom_type()->isa_intptr_t();
+        const TypeX* ti = t_index->isa_intptr_t();
         if (ti == NULL) {
           disp = Type::OffsetBot;  // a random constant??
         } else {
--- a/hotspot/src/share/vm/opto/macro.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/macro.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -320,9 +320,9 @@
 
 // Search the last value stored into the object's field.
 Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, BasicType ft, const Type *ftype, const TypeOopPtr *adr_t, Node *alloc) {
-  assert(adr_t->is_instance_field(), "instance required");
-  uint instance_id = adr_t->instance_id();
-  assert(instance_id == alloc->_idx, "wrong allocation");
+  assert(adr_t->is_known_instance_field(), "instance required");
+  int instance_id = adr_t->instance_id();
+  assert((uint)instance_id == alloc->_idx, "wrong allocation");
 
   int alias_idx = C->get_alias_index(adr_t);
   int offset = adr_t->offset();
@@ -354,7 +354,7 @@
       const TypeOopPtr* atype = mem->as_Store()->adr_type()->isa_oopptr();
       assert(atype != NULL, "address type must be oopptr");
       assert(C->get_alias_index(atype) == alias_idx &&
-             atype->is_instance_field() && atype->offset() == offset &&
+             atype->is_known_instance_field() && atype->offset() == offset &&
              atype->instance_id() == instance_id, "store is correct memory slice");
       done = true;
     } else if (mem->is_Phi()) {
@@ -598,7 +598,7 @@
           field_type = TypeOopPtr::make_from_klass(elem_type->as_klass());
         }
         if (UseCompressedOops) {
-          field_type = field_type->is_oopptr()->make_narrowoop();
+          field_type = field_type->make_narrowoop();
           basic_elem_type = T_NARROWOOP;
         }
       } else {
@@ -666,9 +666,11 @@
       if (UseCompressedOops && field_type->isa_narrowoop()) {
         // Enable "DecodeN(EncodeP(Allocate)) --> Allocate" transformation
         // to be able scalar replace the allocation.
-        _igvn.set_delay_transform(false);
-        field_val = DecodeNNode::decode(&_igvn, field_val);
-        _igvn.set_delay_transform(true);
+        if (field_val->is_EncodeP()) {
+          field_val = field_val->in(1);
+        } else {
+          field_val = transform_later(new (C, 2) DecodeNNode(field_val, field_val->bottom_type()->make_ptr()));
+        }
       }
       sfpt->add_req(field_val);
     }
@@ -1674,7 +1676,14 @@
         success = eliminate_locking_node(n->as_AbstractLock());
         break;
       default:
-        assert(false, "unknown node type in macro list");
+        if (n->Opcode() == Op_Opaque1 || n->Opcode() == Op_Opaque2) {
+          _igvn.add_users_to_worklist(n);
+          _igvn.hash_delete(n);
+          _igvn.subsume_node(n, n->in(1));
+          success = true;
+        } else {
+          assert(false, "unknown node type in macro list");
+        }
       }
       assert(success == (C->macro_count() < old_macro_count), "elimination reduces macro count");
       progress = progress || success;
--- a/hotspot/src/share/vm/opto/matcher.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/matcher.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -51,6 +51,7 @@
   PhaseTransform( Phase::Ins_Select ),
 #ifdef ASSERT
   _old2new_map(C->comp_arena()),
+  _new2old_map(C->comp_arena()),
 #endif
   _shared_nodes(C->comp_arena()),
   _reduceOp(reduceOp), _leftOp(leftOp), _rightOp(rightOp),
@@ -82,6 +83,7 @@
   idealreg2debugmask[Op_RegF] = NULL;
   idealreg2debugmask[Op_RegD] = NULL;
   idealreg2debugmask[Op_RegP] = NULL;
+  debug_only(_mem_node = NULL;)   // Ideal memory node consumed by mach node
 }
 
 //------------------------------warp_incoming_stk_arg------------------------
@@ -834,10 +836,16 @@
             if( n->is_Proj() && n->in(0)->is_Multi()) {       // Projections?
               // Convert to machine-dependent projection
               m = n->in(0)->as_Multi()->match( n->as_Proj(), this );
+#ifdef ASSERT
+              _new2old_map.map(m->_idx, n);
+#endif
               if (m->in(0) != NULL) // m might be top
                 collect_null_checks(m);
             } else {                // Else just a regular 'ol guy
               m = n->clone();       // So just clone into new-space
+#ifdef ASSERT
+              _new2old_map.map(m->_idx, n);
+#endif
               // Def-Use edges will be added incrementally as Uses
               // of this node are matched.
               assert(m->outcnt() == 0, "no Uses of this clone yet");
@@ -886,6 +894,9 @@
             // || op == Op_BoxLock  // %%%% enable this and remove (+++) in chaitin.cpp
             ) {
           m = m->clone();
+#ifdef ASSERT
+          _new2old_map.map(m->_idx, n);
+#endif
           mstack.push(m, Post_Visit, n, i); // Don't neet to visit
           mstack.push(m->in(0), Visit, m, 0);
         } else {
@@ -1153,7 +1164,10 @@
 
   // StoreNodes require their Memory input to match any LoadNodes
   Node *mem = n->is_Store() ? n->in(MemNode::Memory) : (Node*)1 ;
-
+#ifdef ASSERT
+  Node* save_mem_node = _mem_node;
+  _mem_node = n->is_Store() ? (Node*)n : NULL;
+#endif
   // State object for root node of match tree
   // Allocate it on _states_arena - stack allocation can cause stack overflow.
   State *s = new (&_states_arena) State;
@@ -1186,6 +1200,7 @@
   MachNode *m = ReduceInst( s, s->_rule[mincost], mem );
 #ifdef ASSERT
   _old2new_map.map(n->_idx, m);
+  _new2old_map.map(m->_idx, (Node*)n);
 #endif
 
   // Add any Matcher-ignored edges
@@ -1205,6 +1220,7 @@
     }
   }
 
+  debug_only( _mem_node = save_mem_node; )
   return m;
 }
 
@@ -1445,8 +1461,30 @@
   }
 
   // If a Memory was used, insert a Memory edge
-  if( mem != (Node*)1 )
+  if( mem != (Node*)1 ) {
     mach->ins_req(MemNode::Memory,mem);
+#ifdef ASSERT
+    // Verify adr type after matching memory operation
+    const MachOper* oper = mach->memory_operand();
+    if (oper != NULL && oper != (MachOper*)-1 &&
+        mach->adr_type() != TypeRawPtr::BOTTOM) { // non-direct addressing mode
+      // It has a unique memory operand.  Find corresponding ideal mem node.
+      Node* m = NULL;
+      if (leaf->is_Mem()) {
+        m = leaf;
+      } else {
+        m = _mem_node;
+        assert(m != NULL && m->is_Mem(), "expecting memory node");
+      }
+      if (m->adr_type() != mach->adr_type()) {
+        m->dump();
+        tty->print_cr("mach:");
+        mach->dump(1);
+      }
+      assert(m->adr_type() == mach->adr_type(), "matcher should not change adr type");
+    }
+#endif
+  }
 
   // If the _leaf is an AddP, insert the base edge
   if( leaf->is_AddP() )
@@ -1464,6 +1502,9 @@
     for( uint i=0; i<mach->req(); i++ ) {
       mach->set_req(i,NULL);
     }
+#ifdef ASSERT
+    _new2old_map.map(ex->_idx, s->_leaf);
+#endif
   }
 
   // PhaseChaitin::fixup_spills will sometimes generate spill code
@@ -1510,7 +1551,9 @@
     assert( newrule >= _LAST_MACH_OPER, "Do NOT chain from internal operand");
     mach->_opnds[1] = s->MachOperGenerator( _reduceOp[catch_op], C );
     Node *mem1 = (Node*)1;
+    debug_only(Node *save_mem_node = _mem_node;)
     mach->add_req( ReduceInst(s, newrule, mem1) );
+    debug_only(_mem_node = save_mem_node;)
   }
   return;
 }
@@ -1520,6 +1563,7 @@
   if( s->_leaf->is_Load() ) {
     Node *mem2 = s->_leaf->in(MemNode::Memory);
     assert( mem == (Node*)1 || mem == mem2, "multiple Memories being matched at once?" );
+    debug_only( if( mem == (Node*)1 ) _mem_node = s->_leaf;)
     mem = mem2;
   }
   if( s->_leaf->in(0) != NULL && s->_leaf->req() > 1) {
@@ -1563,7 +1607,9 @@
         //             --> ReduceInst( newrule )
         mach->_opnds[num_opnds++] = s->MachOperGenerator( _reduceOp[catch_op], C );
         Node *mem1 = (Node*)1;
+        debug_only(Node *save_mem_node = _mem_node;)
         mach->add_req( ReduceInst( newstate, newrule, mem1 ) );
+        debug_only(_mem_node = save_mem_node;)
       }
     }
     assert( mach->_opnds[num_opnds-1], "" );
@@ -1594,6 +1640,7 @@
   if( s->_leaf->is_Load() ) {
     assert( mem == (Node*)1, "multiple Memories being matched at once?" );
     mem = s->_leaf->in(MemNode::Memory);
+    debug_only(_mem_node = s->_leaf;)
   }
   if( s->_leaf->in(0) && s->_leaf->req() > 1) {
     if( !mach->in(0) )
@@ -1618,7 +1665,9 @@
       // Reduce the instruction, and add a direct pointer from this
       // machine instruction to the newly reduced one.
       Node *mem1 = (Node*)1;
+      debug_only(Node *save_mem_node = _mem_node;)
       mach->add_req( ReduceInst( kid, newrule, mem1 ) );
+      debug_only(_mem_node = save_mem_node;)
     }
   }
 }
@@ -1731,8 +1780,8 @@
       }
       case Op_ConN: {  // Convert narrow pointers above the centerline to NUL
         TypeNode *tn = n->as_Type(); // Constants derive from type nodes
-        const TypePtr* tp = tn->type()->is_narrowoop()->make_oopptr();
-        if (tp->_ptr == TypePtr::AnyNull) {
+        const TypePtr* tp = tn->type()->make_ptr();
+        if (tp && tp->_ptr == TypePtr::AnyNull) {
           tn->set_type(TypeNarrowOop::NULL_PTR);
         }
         break;
--- a/hotspot/src/share/vm/opto/matcher.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/matcher.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -84,6 +84,7 @@
   Node_Array _shared_nodes;
 
   debug_only(Node_Array _old2new_map;)   // Map roots of ideal-trees to machine-roots
+  debug_only(Node_Array _new2old_map;)   // Maps machine nodes back to ideal
 
   // Accessors for the inherited field PhaseTransform::_nodes:
   void   grow_new_node_array(uint idx_limit) {
@@ -104,6 +105,8 @@
 #ifdef ASSERT
   // Make sure only new nodes are reachable from this node
   void verify_new_nodes_only(Node* root);
+
+  Node* _mem_node;   // Ideal memory node consumed by mach node
 #endif
 
 public:
@@ -388,5 +391,9 @@
 
 #ifdef ASSERT
   void dump_old2new_map();      // machine-independent to machine-dependent
+
+  Node* find_old_node(Node* new_node) {
+    return _new2old_map[new_node->_idx];
+  }
 #endif
 };
--- a/hotspot/src/share/vm/opto/memnode.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/memnode.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -91,7 +91,7 @@
 
 Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
   const TypeOopPtr *tinst = t_adr->isa_oopptr();
-  if (tinst == NULL || !tinst->is_instance_field())
+  if (tinst == NULL || !tinst->is_known_instance_field())
     return mchain;  // don't try to optimize non-instance types
   uint instance_id = tinst->instance_id();
   Node *prev = NULL;
@@ -125,7 +125,7 @@
 
 Node *MemNode::optimize_memory_chain(Node *mchain, const TypePtr *t_adr, PhaseGVN *phase) {
   const TypeOopPtr *t_oop = t_adr->isa_oopptr();
-  bool is_instance = (t_oop != NULL) && t_oop->is_instance_field();
+  bool is_instance = (t_oop != NULL) && t_oop->is_known_instance_field();
   PhaseIterGVN *igvn = phase->is_IterGVN();
   Node *result = mchain;
   result = optimize_simple_memory_chain(result, t_adr, phase);
@@ -134,8 +134,8 @@
     assert(mphi->bottom_type() == Type::MEMORY, "memory phi required");
     const TypePtr *t = mphi->adr_type();
     if (t == TypePtr::BOTTOM || t == TypeRawPtr::BOTTOM ||
-        t->isa_oopptr() && !t->is_oopptr()->is_instance() &&
-        t->is_oopptr()->cast_to_instance(t_oop->instance_id()) == t_oop) {
+        t->isa_oopptr() && !t->is_oopptr()->is_known_instance() &&
+        t->is_oopptr()->cast_to_instance_id(t_oop->instance_id()) == t_oop) {
       // clone the Phi with our address type
       result = mphi->split_out_instance(t_adr, igvn);
     } else {
@@ -470,7 +470,7 @@
         return mem;         // let caller handle steps (c), (d)
       }
 
-    } else if (addr_t != NULL && addr_t->is_instance_field()) {
+    } else if (addr_t != NULL && addr_t->is_known_instance_field()) {
       // Can't use optimize_simple_memory_chain() since it needs PhaseGVN.
       if (mem->is_Proj() && mem->in(0)->is_Call()) {
         CallNode *call = mem->in(0)->as_Call();
@@ -769,15 +769,8 @@
   case T_OBJECT:
 #ifdef _LP64
     if (adr->bottom_type()->is_ptr_to_narrowoop()) {
-      const TypeNarrowOop* narrowtype;
-      if (rt->isa_narrowoop()) {
-        narrowtype = rt->is_narrowoop();
-      } else {
-        narrowtype = rt->is_oopptr()->make_narrowoop();
-      }
-      Node* load  = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, narrowtype));
-
-      return DecodeNNode::decode(&gvn, load);
+      Node* load  = gvn.transform(new (C, 3) LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop()));
+      return new (C, 2) DecodeNNode(load, load->bottom_type()->make_ptr());
     } else
 #endif
     {
@@ -923,7 +916,7 @@
       in(MemNode::Address)->is_AddP() ) {
     const TypeOopPtr* t_oop = in(MemNode::Address)->bottom_type()->isa_oopptr();
     // Only instances.
-    if( t_oop != NULL && t_oop->is_instance_field() &&
+    if( t_oop != NULL && t_oop->is_known_instance_field() &&
         t_oop->offset() != Type::OffsetBot &&
         t_oop->offset() != Type::OffsetTop) {
       return true;
@@ -1146,7 +1139,7 @@
   const TypeOopPtr *t_oop = addr_t->isa_oopptr();
 
   assert(mem->is_Phi() && (t_oop != NULL) &&
-         t_oop->is_instance_field(), "invalide conditions");
+         t_oop->is_known_instance_field(), "invalide conditions");
 
   Node *region = mem->in(0);
   if (region == NULL) {
@@ -1314,7 +1307,7 @@
     }
     const TypeOopPtr *t_oop = addr_t->isa_oopptr();
     if (can_reshape && opt_mem->is_Phi() &&
-        (t_oop != NULL) && t_oop->is_instance_field()) {
+        (t_oop != NULL) && t_oop->is_known_instance_field()) {
       // Split instance field load through Phi.
       Node* result = split_through_phi(phase);
       if (result != NULL) return result;
@@ -1549,7 +1542,7 @@
   }
 
   const TypeOopPtr *tinst = tp->isa_oopptr();
-  if (tinst != NULL && tinst->is_instance_field()) {
+  if (tinst != NULL && tinst->is_known_instance_field()) {
     // If we have an instance type and our memory input is the
     // programs's initial memory state, there is no matching store,
     // so just return a zero of the appropriate type
@@ -1631,9 +1624,8 @@
   assert(adr_type != NULL, "expecting TypeOopPtr");
 #ifdef _LP64
   if (adr_type->is_ptr_to_narrowoop()) {
-    const TypeNarrowOop* narrowtype = tk->is_oopptr()->make_narrowoop();
-    Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, narrowtype));
-    return DecodeNNode::decode(&gvn, load_klass);
+    Node* load_klass = gvn.transform(new (C, 3) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowoop()));
+    return new (C, 2) DecodeNNode(load_klass, load_klass->bottom_type()->make_ptr());
   }
 #endif
   assert(!adr_type->is_ptr_to_narrowoop(), "should have got back a narrow oop");
@@ -1843,15 +1835,10 @@
 //------------------------------Value------------------------------------------
 const Type *LoadNKlassNode::Value( PhaseTransform *phase ) const {
   const Type *t = klass_value_common(phase);
-
-  if (t == TypePtr::NULL_PTR) {
-    return TypeNarrowOop::NULL_PTR;
-  }
-  if (t != Type::TOP && !t->isa_narrowoop()) {
-    assert(t->is_oopptr(), "sanity");
-    t = t->is_oopptr()->make_narrowoop();
-  }
-  return t;
+  if (t == Type::TOP)
+    return t;
+
+  return t->make_narrowoop();
 }
 
 //------------------------------Identity---------------------------------------
@@ -1864,7 +1851,7 @@
   if( t == Type::TOP ) return x;
   if( t->isa_narrowoop()) return x;
 
-  return EncodePNode::encode(phase, x);
+  return phase->transform(new (phase->C, 2) EncodePNode(x, t->make_narrowoop()));
 }
 
 //------------------------------Value-----------------------------------------
@@ -1930,14 +1917,13 @@
     if (adr->bottom_type()->is_ptr_to_narrowoop() ||
         (UseCompressedOops && val->bottom_type()->isa_klassptr() &&
          adr->bottom_type()->isa_rawptr())) {
-      const TypePtr* type = val->bottom_type()->is_ptr();
-      Node* cp = EncodePNode::encode(&gvn, val);
-      return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, cp);
+      val = gvn.transform(new (C, 2) EncodePNode(val, val->bottom_type()->make_narrowoop()));
+      return new (C, 4) StoreNNode(ctl, mem, adr, adr_type, val);
     } else
 #endif
-      {
-        return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val);
-      }
+    {
+      return new (C, 4) StorePNode(ctl, mem, adr, adr_type, val);
+    }
   }
   ShouldNotReachHere();
   return (StoreNode*)NULL;
@@ -2151,7 +2137,7 @@
   const TypeOopPtr *adr_oop = phase->type(adr)->isa_oopptr();
   if (adr_oop == NULL)
     return false;
-  if (!adr_oop->is_instance_field())
+  if (!adr_oop->is_known_instance_field())
     return false; // if not a distinct instance, there may be aliases of the address
   for (DUIterator_Fast imax, i = adr->fast_outs(imax); i < imax; i++) {
     Node *use = adr->fast_out(i);
--- a/hotspot/src/share/vm/opto/node.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/node.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -1387,7 +1387,7 @@
   }
 #ifdef ASSERT
   // Search along debug_orig edges last:
-  for (Node* orig = n->debug_orig(); orig != NULL; orig = orig->debug_orig()) {
+  for (Node* orig = n->debug_orig(); orig != NULL && n != orig; orig = orig->debug_orig()) {
     if (NotANode(orig))  break;
     find_recur( result, orig, idx, only_ctrl, old_space, new_space );
   }
--- a/hotspot/src/share/vm/opto/output.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/output.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -447,6 +447,7 @@
             // We've got a winner.  Replace this branch.
             MachNode *replacement = mach->short_branch_version(this);
             b->_nodes.map(j, replacement);
+            mach->subsume_by(replacement);
 
             // Update the jmp_end size to save time in our
             // next pass.
--- a/hotspot/src/share/vm/opto/parse2.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/parse2.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -67,12 +67,9 @@
   const Type*       elemtype = arytype->elem();
 
   if (UseUniqueSubclasses && result2 != NULL) {
-    const Type* el = elemtype;
-    if (elemtype->isa_narrowoop()) {
-      el = elemtype->is_narrowoop()->make_oopptr();
-    }
-    const TypeInstPtr* toop = el->isa_instptr();
-    if (toop) {
+    const Type* el = elemtype->make_ptr();
+    if (el && el->isa_instptr()) {
+      const TypeInstPtr* toop = el->is_instptr();
       if (toop->klass()->as_instance_klass()->unique_concrete_subklass()) {
         // If we load from "AbstractClass[]" we must see "ConcreteSubClass".
         const Type* subklass = Type::get_const_type(toop->klass());
@@ -2223,7 +2220,7 @@
     sprintf(buffer, "Bytecode %d: %s", bci(), Bytecodes::name(bc()));
     bool old = printer->traverse_outs();
     printer->set_traverse_outs(true);
-    printer->print_method(C, buffer, 3);
+    printer->print_method(C, buffer, 4);
     printer->set_traverse_outs(old);
   }
 #endif
--- a/hotspot/src/share/vm/opto/subnode.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/subnode.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -45,10 +45,13 @@
     return in(2)->in(2);
   }
 
-  // Convert "(X+Y) - Y" into X
+  // Convert "(X+Y) - Y" into X and "(X+Y) - X" into Y
   if( in(1)->Opcode() == Op_AddI ) {
     if( phase->eqv(in(1)->in(2),in(2)) )
       return in(1)->in(1);
+    if (phase->eqv(in(1)->in(1),in(2)))
+      return in(1)->in(2);
+
     // Also catch: "(X + Opaque2(Y)) - Y".  In this case, 'Y' is a loop-varying
     // trip counter and X is likely to be loop-invariant (that's how O2 Nodes
     // are originally used, although the optimizer sometimes jiggers things).
@@ -740,8 +743,8 @@
 // Simplify an CmpN (compare 2 pointers) node, based on local information.
 // If both inputs are constants, compare them.
 const Type *CmpNNode::sub( const Type *t1, const Type *t2 ) const {
-  const TypePtr *r0 = t1->is_narrowoop()->make_oopptr(); // Handy access
-  const TypePtr *r1 = t2->is_narrowoop()->make_oopptr();
+  const TypePtr *r0 = t1->make_ptr(); // Handy access
+  const TypePtr *r1 = t2->make_ptr();
 
   // Undefined inputs makes for an undefined result
   if( TypePtr::above_centerline(r0->_ptr) ||
--- a/hotspot/src/share/vm/opto/superword.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/superword.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -1424,9 +1424,9 @@
 //---------------------------container_type---------------------------
 // Smallest type containing range of values
 const Type* SuperWord::container_type(const Type* t) {
-  if (t->isa_narrowoop()) t = t->is_narrowoop()->make_oopptr();
-  if (t->isa_aryptr()) {
-    t = t->is_aryptr()->elem();
+  const Type* tp = t->make_ptr();
+  if (tp && tp->isa_aryptr()) {
+    t = tp->is_aryptr()->elem();
   }
   if (t->basic_type() == T_INT) {
     if (t->higher_equal(TypeInt::BOOL))  return TypeInt::BOOL;
--- a/hotspot/src/share/vm/opto/type.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/type.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -491,14 +491,8 @@
 // commutative and the lattice is symmetric.
 const Type *Type::meet( const Type *t ) const {
   if (isa_narrowoop() && t->isa_narrowoop()) {
-    const Type* result = is_narrowoop()->make_oopptr()->meet(t->is_narrowoop()->make_oopptr());
-    if (result->isa_oopptr()) {
-      return result->isa_oopptr()->make_narrowoop();
-    } else if (result == TypePtr::NULL_PTR) {
-      return TypeNarrowOop::NULL_PTR;
-    } else {
-      return result;
-    }
+    const Type* result = make_ptr()->meet(t->make_ptr());
+    return result->make_narrowoop();
   }
 
   const Type *mt = xmeet(t);
@@ -520,23 +514,8 @@
     bool    t_interface =    t_inst->klass()->is_interface();
     interface_vs_oop = this_interface ^ t_interface;
   }
-  const Type *tdual = t->_dual;
-  const Type *thisdual = _dual;
-  // strip out instances
-  if (t2t->isa_oopptr() != NULL) {
-    t2t = t2t->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
-  }
-  if (t2this->isa_oopptr() != NULL) {
-    t2this = t2this->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
-  }
-  if (tdual->isa_oopptr() != NULL) {
-    tdual = tdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
-  }
-  if (thisdual->isa_oopptr() != NULL) {
-    thisdual = thisdual->isa_oopptr()->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE);
-  }
-
-  if( !interface_vs_oop && (t2t != tdual || t2this != thisdual) ) {
+
+  if( !interface_vs_oop && (t2t != t->_dual || t2this != _dual) ) {
     tty->print_cr("=== Meet Not Symmetric ===");
     tty->print("t   =                   ");         t->dump(); tty->cr();
     tty->print("this=                   ");            dump(); tty->cr();
@@ -1764,7 +1743,7 @@
 //------------------------------make-------------------------------------------
 const TypeAry *TypeAry::make( const Type *elem, const TypeInt *size) {
   if (UseCompressedOops && elem->isa_oopptr()) {
-    elem = elem->is_oopptr()->make_narrowoop();
+    elem = elem->make_narrowoop();
   }
   size = normalize_array_size(size);
   return (TypeAry*)(new TypeAry(elem,size))->hashcons();
@@ -1849,9 +1828,8 @@
   if (_elem == BOTTOM)      return false;  // general array not exact
   if (_elem == TOP   )      return false;  // inverted general array not exact
   const TypeOopPtr*  toop = NULL;
-  if (UseCompressedOops) {
-    const TypeNarrowOop* noop = _elem->isa_narrowoop();
-    if (noop) toop = noop->make_oopptr()->isa_oopptr();
+  if (UseCompressedOops && _elem->isa_narrowoop()) {
+    toop = _elem->make_ptr()->isa_oopptr();
   } else {
     toop = _elem->isa_oopptr();
   }
@@ -1861,16 +1839,18 @@
   if (!tklass->is_loaded()) return false;  // unloaded class
   const TypeInstPtr* tinst;
   if (_elem->isa_narrowoop())
-    tinst = _elem->is_narrowoop()->make_oopptr()->isa_instptr();
+    tinst = _elem->make_ptr()->isa_instptr();
   else
     tinst = _elem->isa_instptr();
-  if (tinst)                return tklass->as_instance_klass()->is_final();
+  if (tinst)
+    return tklass->as_instance_klass()->is_final();
   const TypeAryPtr*  tap;
   if (_elem->isa_narrowoop())
-    tap = _elem->is_narrowoop()->make_oopptr()->isa_aryptr();
+    tap = _elem->make_ptr()->isa_aryptr();
   else
     tap = _elem->isa_aryptr();
-  if (tap)                  return tap->ary()->ary_must_be_exact();
+  if (tap)
+    return tap->ary()->ary_must_be_exact();
   return false;
 }
 
@@ -2227,7 +2207,7 @@
   ciKlass*  k = ciKlassKlass::make();
   bool      xk = false;
   ciObject* o = NULL;
-  return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, UNKNOWN_INSTANCE))->hashcons();
+  return (TypeOopPtr*)(new TypeOopPtr(OopPtr, ptr, k, xk, o, offset, InstanceBot))->hashcons();
 }
 
 
@@ -2239,7 +2219,7 @@
 }
 
 //-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeOopPtr::cast_to_instance(int instance_id) const {
+const TypeOopPtr *TypeOopPtr::cast_to_instance_id(int instance_id) const {
   // There are no instances of a general oop.
   // Return self unchanged.
   return this;
@@ -2333,7 +2313,7 @@
 const Type *TypeOopPtr::xdual() const {
   assert(klass() == ciKlassKlass::make(), "no klasses here");
   assert(const_oop() == NULL,             "no constants here");
-  return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance()  );
+  return new TypeOopPtr(_base, dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id()  );
 }
 
 //--------------------------make_from_klass_common-----------------------------
@@ -2547,7 +2527,9 @@
   case         0: break;
   default:        st->print("+%d",_offset); break;
   }
-  if (_instance_id != UNKNOWN_INSTANCE)
+  if (_instance_id == InstanceTop)
+    st->print(",iid=top");
+  else if (_instance_id != InstanceBot)
     st->print(",iid=%d",_instance_id);
 }
 #endif
@@ -2579,20 +2561,24 @@
   return make( _ptr, xadd_offset(offset) );
 }
 
-const TypeNarrowOop* TypeOopPtr::make_narrowoop() const {
-  return TypeNarrowOop::make(this);
+//------------------------------meet_instance_id--------------------------------
+int TypeOopPtr::meet_instance_id( int instance_id ) const {
+  // Either is 'TOP' instance?  Return the other instance!
+  if( _instance_id == InstanceTop ) return  instance_id;
+  if(  instance_id == InstanceTop ) return _instance_id;
+  // If either is different, return 'BOTTOM' instance
+  if( _instance_id != instance_id ) return InstanceBot;
+  return _instance_id;
 }
 
-int TypeOopPtr::meet_instance(int iid) const {
-  if (iid == 0) {
-    return (_instance_id < 0)  ? _instance_id : UNKNOWN_INSTANCE;
-  } else if (_instance_id == UNKNOWN_INSTANCE) {
-    return (iid < 0)  ? iid : UNKNOWN_INSTANCE;
-  } else {
-    return (_instance_id == iid) ? iid : UNKNOWN_INSTANCE;
-  }
+//------------------------------dual_instance_id--------------------------------
+int TypeOopPtr::dual_instance_id( ) const {
+  if( _instance_id == InstanceTop ) return InstanceBot; // Map TOP into BOTTOM
+  if( _instance_id == InstanceBot ) return InstanceTop; // Map BOTTOM into TOP
+  return _instance_id;              // Map everything else into self
 }
 
+
 //=============================================================================
 // Convenience common pre-built types.
 const TypeInstPtr *TypeInstPtr::NOTNULL;
@@ -2624,7 +2610,7 @@
   // Ptr is never Null
   assert( ptr != Null, "NULL pointers are not typed" );
 
-  if (instance_id != UNKNOWN_INSTANCE)
+  if ( instance_id > 0 )
     xk = true;  // instances are always exactly typed
   if (!UseExactTypes)  xk = false;
   if (ptr == Constant) {
@@ -2649,7 +2635,7 @@
   if( ptr == _ptr ) return this;
   // Reconstruct _sig info here since not a problem with later lazy
   // construction, _sig will show up on demand.
-  return make(ptr, klass(), klass_is_exact(), const_oop(), _offset);
+  return make(ptr, klass(), klass_is_exact(), const_oop(), _offset, _instance_id);
 }
 
 
@@ -2665,13 +2651,13 @@
 }
 
 //-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeInstPtr::cast_to_instance(int instance_id) const {
-  if( instance_id == _instance_id) return this;
-  bool exact = true;
-  PTR  ptr_t = NotNull;
-  if (instance_id == UNKNOWN_INSTANCE) {
-    exact = _klass_is_exact;
-    ptr_t = _ptr;
+const TypeOopPtr *TypeInstPtr::cast_to_instance_id(int instance_id) const {
+  if( instance_id == _instance_id ) return this;
+  bool exact = _klass_is_exact;
+  PTR  ptr_t = _ptr;
+  if ( instance_id > 0 ) { // instances are always exactly typed
+    if (UseExactTypes) exact = true;
+    ptr_t = NotNull;
   }
   return make(ptr_t, klass(), exact, const_oop(), _offset, instance_id);
 }
@@ -2754,16 +2740,17 @@
     const TypeAryPtr *tp = t->is_aryptr();
     int offset = meet_offset(tp->offset());
     PTR ptr = meet_ptr(tp->ptr());
-    int iid = meet_instance(tp->instance_id());
+    int instance_id = meet_instance_id(tp->instance_id());
     switch (ptr) {
     case TopPTR:
     case AnyNull:                // Fall 'down' to dual of object klass
       if (klass()->equals(ciEnv::current()->Object_klass())) {
-        return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid);
+        return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id);
       } else {
         // cannot subclass, so the meet has to fall badly below the centerline
         ptr = NotNull;
-        return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid);
+        instance_id = InstanceBot;
+        return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id);
       }
     case Constant:
     case NotNull:
@@ -2774,14 +2761,15 @@
         // then we can subclass in the Java class heirarchy.
         if (klass()->equals(ciEnv::current()->Object_klass())) {
           // that is, tp's array type is a subtype of my klass
-          return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, iid);
+          return TypeAryPtr::make(ptr, tp->ary(), tp->klass(), tp->klass_is_exact(), offset, instance_id);
         }
       }
       // The other case cannot happen, since I cannot be a subtype of an array.
       // The meet falls down to Object class below centerline.
       if( ptr == Constant )
          ptr = NotNull;
-      return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, iid );
+      instance_id = InstanceBot;
+      return make( ptr, ciEnv::current()->Object_klass(), false, NULL, offset, instance_id );
     default: typerr(t);
     }
   }
@@ -2793,9 +2781,11 @@
     PTR ptr = meet_ptr(tp->ptr());
     switch (tp->ptr()) {
     case TopPTR:
-    case AnyNull:
+    case AnyNull: {
+      int instance_id = meet_instance_id(InstanceTop);
       return make(ptr, klass(), klass_is_exact(),
-                  (ptr == Constant ? const_oop() : NULL), offset);
+                  (ptr == Constant ? const_oop() : NULL), offset, instance_id);
+    }
     case NotNull:
     case BotPTR:
       return TypeOopPtr::make(ptr, offset);
@@ -2811,10 +2801,13 @@
     switch (tp->ptr()) {
     case Null:
       if( ptr == Null ) return TypePtr::make( AnyPtr, ptr, offset );
+      // else fall through to AnyNull
     case TopPTR:
-    case AnyNull:
+    case AnyNull: {
+      int instance_id = meet_instance_id(InstanceTop);
       return make( ptr, klass(), klass_is_exact(),
-                   (ptr == Constant ? const_oop() : NULL), offset );
+                   (ptr == Constant ? const_oop() : NULL), offset, instance_id);
+    }
     case NotNull:
     case BotPTR:
       return TypePtr::make( AnyPtr, ptr, offset );
@@ -2843,7 +2836,7 @@
     const TypeInstPtr *tinst = t->is_instptr();
     int off = meet_offset( tinst->offset() );
     PTR ptr = meet_ptr( tinst->ptr() );
-    int instance_id = meet_instance(tinst->instance_id());
+    int instance_id = meet_instance_id(tinst->instance_id());
 
     // Check for easy case; klasses are equal (and perhaps not loaded!)
     // If we have constants, then we created oops so classes are loaded
@@ -2912,7 +2905,7 @@
         // Find out which constant.
         o = (this_klass == klass()) ? const_oop() : tinst->const_oop();
       }
-      return make( ptr, k, xk, o, off );
+      return make( ptr, k, xk, o, off, instance_id );
     }
 
     // Either oop vs oop or interface vs interface or interface vs Object
@@ -2999,7 +2992,7 @@
 
     // Now we find the LCA of Java classes
     ciKlass* k = this_klass->least_common_ancestor(tinst_klass);
-    return make( ptr, k, false, NULL, off );
+    return make( ptr, k, false, NULL, off, instance_id );
   } // End of case InstPtr
 
   case KlassPtr:
@@ -3026,7 +3019,7 @@
 // Dual: do NOT dual on klasses.  This means I do NOT understand the Java
 // inheritence mechanism.
 const Type *TypeInstPtr::xdual() const {
-  return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance()  );
+  return new TypeInstPtr( dual_ptr(), klass(), klass_is_exact(), const_oop(), dual_offset(), dual_instance_id()  );
 }
 
 //------------------------------eq---------------------------------------------
@@ -3078,7 +3071,9 @@
   }
 
   st->print(" *");
-  if (_instance_id != UNKNOWN_INSTANCE)
+  if (_instance_id == InstanceTop)
+    st->print(",iid=top");
+  else if (_instance_id != InstanceBot)
     st->print(",iid=%d",_instance_id);
 }
 #endif
@@ -3106,7 +3101,7 @@
   assert(!(k == NULL && ary->_elem->isa_int()),
          "integral arrays must be pre-equipped with a class");
   if (!xk)  xk = ary->ary_must_be_exact();
-  if (instance_id != UNKNOWN_INSTANCE)
+  if ( instance_id > 0 )
     xk = true;  // instances are always exactly typed
   if (!UseExactTypes)  xk = (ptr == Constant);
   return (TypeAryPtr*)(new TypeAryPtr(ptr, NULL, ary, k, xk, offset, instance_id))->hashcons();
@@ -3118,7 +3113,7 @@
          "integral arrays must be pre-equipped with a class");
   assert( (ptr==Constant && o) || (ptr!=Constant && !o), "" );
   if (!xk)  xk = (o != NULL) || ary->ary_must_be_exact();
-  if (instance_id != UNKNOWN_INSTANCE)
+  if ( instance_id > 0 )
     xk = true;  // instances are always exactly typed
   if (!UseExactTypes)  xk = (ptr == Constant);
   return (TypeAryPtr*)(new TypeAryPtr(ptr, o, ary, k, xk, offset, instance_id))->hashcons();
@@ -3127,7 +3122,7 @@
 //------------------------------cast_to_ptr_type-------------------------------
 const Type *TypeAryPtr::cast_to_ptr_type(PTR ptr) const {
   if( ptr == _ptr ) return this;
-  return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset);
+  return make(ptr, const_oop(), _ary, klass(), klass_is_exact(), _offset, _instance_id);
 }
 
 
@@ -3140,13 +3135,13 @@
 }
 
 //-----------------------------cast_to_instance-------------------------------
-const TypeOopPtr *TypeAryPtr::cast_to_instance(int instance_id) const {
-  if( instance_id == _instance_id) return this;
-  bool exact = true;
-  PTR  ptr_t = NotNull;
-  if (instance_id == UNKNOWN_INSTANCE) {
-    exact = _klass_is_exact;
-    ptr_t = _ptr;
+const TypeOopPtr *TypeAryPtr::cast_to_instance_id(int instance_id) const {
+  if( instance_id == _instance_id ) return this;
+  bool exact = _klass_is_exact;
+  PTR  ptr_t = _ptr;
+  if ( instance_id > 0 ) { // instances are always exactly typed
+    if (UseExactTypes) exact = true;
+    ptr_t = NotNull;
   }
   return make(ptr_t, const_oop(), _ary, klass(), exact, _offset, instance_id);
 }
@@ -3199,7 +3194,7 @@
     new_size = TypeInt::ZERO; // intermediate dead fast-path goo
   if (new_size == size())  return this;
   const TypeAry* new_ary = TypeAry::make(elem(), new_size);
-  return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset);
+  return make(ptr(), const_oop(), new_ary, klass(), klass_is_exact(), _offset, _instance_id);
 }
 
 
@@ -3251,8 +3246,11 @@
     PTR ptr = meet_ptr(tp->ptr());
     switch (tp->ptr()) {
     case TopPTR:
-    case AnyNull:
-      return make(ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset);
+    case AnyNull: {
+      int instance_id = meet_instance_id(InstanceTop);
+      return make(ptr, (ptr == Constant ? const_oop() : NULL),
+                  _ary, _klass, _klass_is_exact, offset, instance_id);
+    }
     case BotPTR:
     case NotNull:
       return TypeOopPtr::make(ptr, offset);
@@ -3273,8 +3271,12 @@
       return TypePtr::make(AnyPtr, ptr, offset);
     case Null:
       if( ptr == Null ) return TypePtr::make(AnyPtr, ptr, offset);
-    case AnyNull:
-      return make( ptr, (ptr == Constant ? const_oop() : NULL), _ary, _klass, _klass_is_exact, offset );
+      // else fall through to AnyNull
+    case AnyNull: {
+      int instance_id = meet_instance_id(InstanceTop);
+      return make( ptr, (ptr == Constant ? const_oop() : NULL),
+                  _ary, _klass, _klass_is_exact, offset, instance_id);
+    }
     default: ShouldNotReachHere();
     }
   }
@@ -3286,7 +3288,7 @@
     int off = meet_offset(tap->offset());
     const TypeAry *tary = _ary->meet(tap->_ary)->is_ary();
     PTR ptr = meet_ptr(tap->ptr());
-    int iid = meet_instance(tap->instance_id());
+    int instance_id = meet_instance_id(tap->instance_id());
     ciKlass* lazy_klass = NULL;
     if (tary->_elem->isa_int()) {
       // Integral array element types have irrelevant lattice relations.
@@ -3307,7 +3309,7 @@
     case TopPTR:
       // Compute new klass on demand, do not use tap->_klass
       xk = (tap->_klass_is_exact | this->_klass_is_exact);
-      return make( ptr, const_oop(), tary, lazy_klass, xk, off, iid );
+      return make( ptr, const_oop(), tary, lazy_klass, xk, off, instance_id );
     case Constant: {
       ciObject* o = const_oop();
       if( _ptr == Constant ) {
@@ -3319,7 +3321,7 @@
         o = tap->const_oop();
       }
       xk = true;
-      return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, iid );
+      return TypeAryPtr::make( ptr, o, tary, tap->_klass, xk, off, instance_id );
     }
     case NotNull:
     case BotPTR:
@@ -3330,7 +3332,7 @@
             xk = this->_klass_is_exact;
       else  xk = (tap->_klass_is_exact & this->_klass_is_exact) &&
               (klass() == tap->klass()); // Only precise for identical arrays
-      return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, iid );
+      return TypeAryPtr::make( ptr, NULL, tary, lazy_klass, xk, off, instance_id );
     default: ShouldNotReachHere();
     }
   }
@@ -3340,16 +3342,17 @@
     const TypeInstPtr *tp = t->is_instptr();
     int offset = meet_offset(tp->offset());
     PTR ptr = meet_ptr(tp->ptr());
-    int iid = meet_instance(tp->instance_id());
+    int instance_id = meet_instance_id(tp->instance_id());
     switch (ptr) {
     case TopPTR:
     case AnyNull:                // Fall 'down' to dual of object klass
       if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) {
-        return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, iid );
+        return TypeAryPtr::make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id );
       } else {
         // cannot subclass, so the meet has to fall badly below the centerline
         ptr = NotNull;
-        return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid);
+        instance_id = InstanceBot;
+        return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id);
       }
     case Constant:
     case NotNull:
@@ -3360,14 +3363,15 @@
         // then we can subclass in the Java class heirarchy.
         if( tp->klass()->equals(ciEnv::current()->Object_klass()) ) {
           // that is, my array type is a subtype of 'tp' klass
-          return make( ptr, _ary, _klass, _klass_is_exact, offset, iid );
+          return make( ptr, _ary, _klass, _klass_is_exact, offset, instance_id );
         }
       }
       // The other case cannot happen, since t cannot be a subtype of an array.
       // The meet falls down to Object class below centerline.
       if( ptr == Constant )
          ptr = NotNull;
-      return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, iid);
+      instance_id = InstanceBot;
+      return TypeInstPtr::make( ptr, ciEnv::current()->Object_klass(), false, NULL,offset, instance_id);
     default: typerr(t);
     }
   }
@@ -3382,7 +3386,7 @@
 //------------------------------xdual------------------------------------------
 // Dual: compute field-by-field dual
 const Type *TypeAryPtr::xdual() const {
-  return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance() );
+  return new TypeAryPtr( dual_ptr(), _const_oop, _ary->dual()->is_ary(),_klass, _klass_is_exact, dual_offset(), dual_instance_id() );
 }
 
 //------------------------------dump2------------------------------------------
@@ -3419,7 +3423,9 @@
     }
   }
   st->print(" *");
-  if (_instance_id != UNKNOWN_INSTANCE)
+  if (_instance_id == InstanceTop)
+    st->print(",iid=top");
+  else if (_instance_id != InstanceBot)
     st->print(",iid=%d",_instance_id);
 }
 #endif
@@ -3494,7 +3500,7 @@
     return this;
 
   case NarrowOop: {
-    const Type* result = _ooptype->xmeet(t->is_narrowoop()->make_oopptr());
+    const Type* result = _ooptype->xmeet(t->make_ptr());
     if (result->isa_ptr()) {
       return TypeNarrowOop::make(result->is_ptr());
     }
@@ -3604,7 +3610,7 @@
   const TypeAryPtr *tary;
   const Type* el = elem();
   if (el->isa_narrowoop()) {
-    el = el->is_narrowoop()->make_oopptr();
+    el = el->make_ptr();
   }
 
   // Get element klass
--- a/hotspot/src/share/vm/opto/type.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/opto/type.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -225,6 +225,12 @@
   virtual bool      is_finite() const;           // Has a finite value
   virtual bool      is_nan()    const;           // Is not a number (NaN)
 
+  // Returns this ptr type or the equivalent ptr type for this compressed pointer.
+  const TypePtr* make_ptr() const;
+  // Returns this compressed pointer or the equivalent compressed version
+  // of this pointer type.
+  const TypeNarrowOop* make_narrowoop() const;
+
   // Special test for register pressure heuristic
   bool is_floatingpoint() const;        // True if Float or Double base type
 
@@ -648,7 +654,8 @@
   virtual int  hash() const;             // Type specific hashing
   virtual bool singleton(void) const;    // TRUE if type is a singleton
   enum {
-   UNKNOWN_INSTANCE = 0
+   InstanceTop = -1,   // undefined instance
+   InstanceBot = 0     // any possible instance
   };
 protected:
 
@@ -661,14 +668,15 @@
   bool          _klass_is_exact;
   bool          _is_ptr_to_narrowoop;
 
-  int           _instance_id;  // if not UNKNOWN_INSTANCE, indicates that this is a particular instance
-                               // of this type which is distinct.  This is the  the node index of the
-                               // node creating this instance
+  // If not InstanceTop or InstanceBot, indicates that this is
+  // a particular instance of this type which is distinct.
+  // This is the the node index of the allocation node creating this instance.
+  int           _instance_id;
 
   static const TypeOopPtr* make_from_klass_common(ciKlass* klass, bool klass_change, bool try_for_exact);
 
-  int dual_instance()      const { return -_instance_id; }
-  int meet_instance(int uid) const;
+  int dual_instance_id() const;
+  int meet_instance_id(int uid) const;
 
 public:
   // Creates a type given a klass. Correctly handles multi-dimensional arrays
@@ -701,9 +709,9 @@
   // compressed oop references.
   bool is_ptr_to_narrowoop_nv() const { return _is_ptr_to_narrowoop; }
 
-  bool is_instance()       const { return _instance_id != UNKNOWN_INSTANCE; }
-  uint instance_id()       const { return _instance_id; }
-  bool is_instance_field() const { return _instance_id != UNKNOWN_INSTANCE && _offset >= 0; }
+  bool is_known_instance()       const { return _instance_id > 0; }
+  int  instance_id()             const { return _instance_id; }
+  bool is_known_instance_field() const { return is_known_instance() && _offset >= 0; }
 
   virtual intptr_t get_con() const;
 
@@ -711,16 +719,13 @@
 
   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 
-  virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 
   // corresponding pointer to klass, for a given instance
   const TypeKlassPtr* as_klass_type() const;
 
   virtual const TypePtr *add_offset( int offset ) const;
 
-  // returns the equivalent compressed version of this pointer type
-  virtual const TypeNarrowOop* make_narrowoop() const;
-
   virtual const Type *xmeet( const Type *t ) const;
   virtual const Type *xdual() const;    // Compute dual right now.
 
@@ -775,7 +780,7 @@
   }
 
   // Make a pointer to an oop.
-  static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = 0 );
+  static const TypeInstPtr *make(PTR ptr, ciKlass* k, bool xk, ciObject* o, int offset, int instance_id = InstanceBot );
 
   // If this is a java.lang.Class constant, return the type for it or NULL.
   // Pass to Type::get_const_type to turn it to a type, which will usually
@@ -786,7 +791,7 @@
 
   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 
-  virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 
   virtual const TypePtr *add_offset( int offset ) const;
 
@@ -820,9 +825,9 @@
   const Type*    elem() const { return _ary->_elem; }
   const TypeInt* size() const { return _ary->_size; }
 
-  static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0);
+  static const TypeAryPtr *make( PTR ptr, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot);
   // Constant pointer to array
-  static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = 0);
+  static const TypeAryPtr *make( PTR ptr, ciObject* o, const TypeAry *ary, ciKlass* k, bool xk, int offset, int instance_id = InstanceBot);
 
   // Convenience
   static const TypeAryPtr *make(ciObject* o);
@@ -832,7 +837,7 @@
 
   virtual const Type *cast_to_exactness(bool klass_is_exact) const;
 
-  virtual const TypeOopPtr *cast_to_instance(int instance_id) const;
+  virtual const TypeOopPtr *cast_to_instance_id(int instance_id) const;
 
   virtual const TypeAryPtr* cast_to_size(const TypeInt* size) const;
 
@@ -911,7 +916,7 @@
 // between the normal and the compressed form.
 class TypeNarrowOop : public Type {
 protected:
-  const TypePtr* _ooptype;
+  const TypePtr* _ooptype; // Could be TypePtr::NULL_PTR
 
   TypeNarrowOop( const TypePtr* ooptype): Type(NarrowOop),
     _ooptype(ooptype) {
@@ -940,8 +945,8 @@
     return make(TypeOopPtr::make_from_constant(con));
   }
 
-  // returns the equivalent oopptr type for this compressed pointer
-  virtual const TypePtr *make_oopptr() const {
+  // returns the equivalent ptr type for this compressed pointer
+  const TypePtr *make_oopptr() const {
     return _ooptype;
   }
 
@@ -1128,6 +1133,16 @@
   return (TypeKlassPtr*)this;
 }
 
+inline const TypePtr* Type::make_ptr() const {
+  return (_base == NarrowOop) ? is_narrowoop()->make_oopptr() :
+                                (isa_ptr() ? is_ptr() : NULL);
+}
+
+inline const TypeNarrowOop* Type::make_narrowoop() const {
+  return (_base == NarrowOop) ? is_narrowoop() :
+                                (isa_ptr() ? TypeNarrowOop::make(is_ptr()) : NULL);
+}
+
 inline bool Type::is_floatingpoint() const {
   if( (_base == FloatCon)  || (_base == FloatBot) ||
       (_base == DoubleCon) || (_base == DoubleBot) )
--- a/hotspot/src/share/vm/prims/jni.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/prims/jni.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -631,7 +631,7 @@
   DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg);
   tty->print_cr("FATAL ERROR in native method: %s", msg);
   thread->print_stack();
-  os::abort(false); // Prevent core dump, causes a jck failure.
+  os::abort(); // Dump core and abort
 JNI_END
 
 
--- a/hotspot/src/share/vm/prims/jvm.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvm.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -624,6 +624,30 @@
   if (PrintJVMWarnings) warning("JVM_ResolveClass not implemented");
 JVM_END
 
+// Rationale behind JVM_FindClassFromBootLoader
+// a> JVM_FindClassFromClassLoader was never exported in the export tables.
+// b> because of (a) java.dll has a direct dependecy on the  unexported
+//    private symbol "_JVM_FindClassFromClassLoader@20".
+// c> the launcher cannot use the private symbol as it dynamically opens
+//    the entry point, so if something changes, the launcher will fail
+//    unexpectedly at runtime, it is safest for the launcher to dlopen a
+//    stable exported interface.
+// d> re-exporting JVM_FindClassFromClassLoader as public, will cause its
+//    signature to change from _JVM_FindClassFromClassLoader@20 to
+//    JVM_FindClassFromClassLoader and will not be backward compatible
+//    with older JDKs.
+// Thus a public/stable exported entry point is the right solution,
+// public here means public in linker semantics, and is exported only
+// to the JDK, and is not intended to be a public API.
+
+JVM_ENTRY(jclass, JVM_FindClassFromBootLoader(JNIEnv* env,
+                                              const char* name,
+                                              jboolean throwError))
+  JVMWrapper3("JVM_FindClassFromBootLoader %s throw %s", name,
+              throwError ? "error" : "exception");
+  return JVM_FindClassFromClassLoader(env, name, JNI_FALSE,
+                                      (jobject)NULL, throwError);
+JVM_END
 
 JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
                                                jboolean init, jobject loader,
--- a/hotspot/src/share/vm/prims/jvm.h	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/prims/jvm.h	Wed Jul 05 16:39:00 2017 +0200
@@ -390,6 +390,17 @@
                              jobject loader, jboolean throwError);
 
 /*
+ * Find a class from a boot class loader. Throw ClassNotFoundException
+ * or NoClassDefFoundError depending on the value of the last
+ * argument. This is the same as FindClassFromClassLoader but provided
+ * as a convenience method exported correctly on all platforms for
+ * JSR 277 launcher class loading.
+ */
+JNIEXPORT jclass JNICALL
+JVM_FindClassFromBootLoader(JNIEnv *env, const char *name,
+                            jboolean throwError);
+
+/*
  * Find a class from a given class.
  */
 JNIEXPORT jclass JNICALL
--- a/hotspot/src/share/vm/runtime/globals.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/runtime/globals.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -946,6 +946,9 @@
   diagnostic(bool, UseIncDec, true,                                         \
           "Use INC, DEC instructions on x86")                               \
                                                                             \
+  product(bool, UseNewLongLShift, false,                                    \
+          "Use optimized bitwise shift left")                               \
+                                                                            \
   product(bool, UseStoreImmI16, true,                                       \
           "Use store immediate 16-bits value instruction on x86")           \
                                                                             \
--- a/hotspot/src/share/vm/runtime/hpi.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/runtime/hpi.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -66,6 +66,8 @@
   static inline int    socket_shutdown(int fd, int howto);
   static inline int    recv(int fd, char *buf, int nBytes, int flags);
   static inline int    send(int fd, char *buf, int nBytes, int flags);
+  // Variant of send that doesn't support interruptible I/O
+  static inline int    raw_send(int fd, char *buf, int nBytes, int flags);
   static inline int    timeout(int fd, long timeout);
   static inline int    listen(int fd, int count);
   static inline int    connect(int fd, struct sockaddr *him, int len);
--- a/hotspot/src/share/vm/runtime/java.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/runtime/java.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -502,9 +502,9 @@
   os::shutdown();
 }
 
-void vm_abort() {
+void vm_abort(bool dump_core) {
   vm_perform_shutdown_actions();
-  os::abort(PRODUCT_ONLY(false));
+  os::abort(dump_core);
   ShouldNotReachHere();
 }
 
@@ -538,18 +538,24 @@
   java_lang_Throwable::print_stack_trace(exception(), tty);
   tty->cr();
   vm_notify_during_shutdown(NULL, NULL);
-  vm_abort();
+
+  // Failure during initialization, we don't want to dump core
+  vm_abort(false);
 }
 
 void vm_exit_during_initialization(symbolHandle ex, const char* message) {
   ResourceMark rm;
   vm_notify_during_shutdown(ex->as_C_string(), message);
-  vm_abort();
+
+  // Failure during initialization, we don't want to dump core
+  vm_abort(false);
 }
 
 void vm_exit_during_initialization(const char* error, const char* message) {
   vm_notify_during_shutdown(error, message);
-  vm_abort();
+
+  // Failure during initialization, we don't want to dump core
+  vm_abort(false);
 }
 
 void vm_shutdown_during_initialization(const char* error, const char* message) {
--- a/hotspot/src/share/vm/runtime/java.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/runtime/java.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -37,7 +37,7 @@
 // Shutdown the VM but do not exit the process
 extern void vm_shutdown();
 // Shutdown the VM and abort the process
-extern void vm_abort();
+extern void vm_abort(bool dump_core=true);
 
 // Trigger any necessary notification of the VM being shutdown
 extern void notify_vm_shutdown();
--- a/hotspot/src/share/vm/utilities/debug.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/utilities/debug.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -208,7 +208,9 @@
     Thread* thread = ThreadLocalStorage::get_thread_slow();
     VMError(thread, size, message, file_name, line_no).report_and_die();
   }
-  vm_abort();
+
+  // Dump core and abort
+  vm_abort(true);
 }
 
 void report_vm_out_of_memory_vararg(const char* file_name, int line_no, size_t size, const char* format, ...) {
--- a/hotspot/src/share/vm/utilities/ostream.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/utilities/ostream.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -753,21 +753,28 @@
   write(str, len);
 }
 
-bufferedStream::bufferedStream(size_t initial_size) : outputStream() {
+bufferedStream::bufferedStream(size_t initial_size, size_t bufmax) : outputStream() {
   buffer_length = initial_size;
   buffer        = NEW_C_HEAP_ARRAY(char, buffer_length);
   buffer_pos    = 0;
   buffer_fixed  = false;
+  buffer_max    = bufmax;
 }
 
-bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size) : outputStream() {
+bufferedStream::bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax) : outputStream() {
   buffer_length = fixed_buffer_size;
   buffer        = fixed_buffer;
   buffer_pos    = 0;
   buffer_fixed  = true;
+  buffer_max    = bufmax;
 }
 
 void bufferedStream::write(const char* s, size_t len) {
+
+  if(buffer_pos + len > buffer_max) {
+    flush();
+  }
+
   size_t end = buffer_pos + len;
   if (end >= buffer_length) {
     if (buffer_fixed) {
@@ -811,7 +818,7 @@
 #endif
 
 // Network access
-networkStream::networkStream() {
+networkStream::networkStream() : bufferedStream(1024*10, 1024*10) {
 
   _socket = -1;
 
@@ -831,7 +838,9 @@
 
 void networkStream::flush() {
   if (size() != 0) {
-    hpi::send(_socket, (char *)base(), (int)size(), 0);
+    int result = hpi::raw_send(_socket, (char *)base(), (int)size(), 0);
+    assert(result != -1, "connection error");
+    assert(result == (int)size(), "didn't send enough data");
   }
   reset();
 }
--- a/hotspot/src/share/vm/utilities/ostream.hpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/utilities/ostream.hpp	Wed Jul 05 16:39:00 2017 +0200
@@ -206,11 +206,12 @@
  protected:
   char*  buffer;
   size_t buffer_pos;
+  size_t buffer_max;
   size_t buffer_length;
   bool   buffer_fixed;
  public:
-  bufferedStream(size_t initial_bufsize = 256);
-  bufferedStream(char* fixed_buffer, size_t fixed_buffer_size);
+  bufferedStream(size_t initial_bufsize = 256, size_t bufmax = 1024*1024*10);
+  bufferedStream(char* fixed_buffer, size_t fixed_buffer_size, size_t bufmax = 1024*1024*10);
   ~bufferedStream();
   virtual void write(const char* c, size_t len);
   size_t      size() { return buffer_pos; }
--- a/hotspot/src/share/vm/utilities/xmlstream.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ b/hotspot/src/share/vm/utilities/xmlstream.cpp	Wed Jul 05 16:39:00 2017 +0200
@@ -59,6 +59,7 @@
   if (!is_open())  return;
 
   out()->write(s, len);
+  update_position(s, len);
 }
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6714694/Tester.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,820 @@
+/*
+ * 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 6714694
+ * @summary assertion in 64bit server vm (store->find_edge(load) != -1,"missing precedence edge") with COOPs
+ * @run main/othervm -Xcomp Tester
+ */
+
+/* Complexity upper bound: 38602 ops */
+
+interface Tester_Interface_0 {
+}
+
+
+abstract class Tester_Class_1 implements Tester_Interface_0 {
+    static int var_1 = (false ? (short)'b' : (short)-2.4256387E38F) | (byte)('g' * -7.660532860983624E307);
+    float var_2;
+    byte var_3;
+    static boolean var_4 = true;
+    double var_5 = 8.818325751338691E307;
+    Object var_6;
+    static short var_7;
+    final static char var_8 = 'x';
+    final static float var_9 = 2.2030989E38F;
+
+
+    public Tester_Class_1()
+    {
+        var_6 = (var_6 = (var_6 = "xkx"));
+        switch (var_7 = (var_3 = (byte)var_5))
+        {
+            case 113:
+
+            case 114:
+                Object var_12;
+                var_4 = 4.9121917E37F < 1957795258;
+                var_4 |= (var_4 ^= !var_4) ^ (var_4 |= var_4);
+                var_3 = (var_3 = (var_3 = (byte)+6010964363045275648L));
+                break;
+
+            case 102:
+
+        }
+        final float var_13 = 1.2443151E38F;
+        var_3 = (byte)(var_1 |= (var_7 = (var_3 = (byte)var_5)));
+        var_2 = (long)(var_7 = (var_3 = (byte)var_8)) - (var_7 = (byte)386742565);
+        var_4 &= var_4;
+        var_2 = (long)((var_3 = (var_3 = (byte)var_8)) / ((var_4 ^= (var_5 /= var_9) <= (var_1 &= var_1)) ? (var_7 = (short)6872886933545336832L) : (byte)var_8));
+        var_6 = "uqflj";
+        {
+            switch (((new String[var_3 = (byte)var_5])[var_3 = (byte)8097442298927900672L]).charAt(1540148550))
+            {
+                case 'l':
+
+            }
+            var_2 = (var_7 = (byte)2.9859440663042714E307);
+            {
+                Object var_14;
+            }
+            var_3 = (var_3 = (var_3 = (byte)3.3634427195550136E307));
+            var_5 += '_';
+        }
+        var_6 = "tempfdjen";
+        var_3 = (((var_4 ^= new String("jmwiwmk").endsWith("rtlstmnuo")) ? !true : !false) ? true : (var_4 = false)) ? (var_3 = (byte)var_5) : (var_3 = (var_3 = (byte)var_5));
+        var_4 ^= false;
+        if (1.6435436003809043E307 != var_9)
+        {
+            boolean var_15 = true;
+        }
+        else
+        {
+            var_4 = false;
+        }
+        {
+            Object var_16 = ((new Tester_Class_1[(byte)71832757][(byte)1.0694914E38F])[(byte)1315653071][(byte)(var_7 = (var_7 = (byte)var_8))]).var_6 = new int[(byte)var_8][var_3 = (byte)1933656747];
+        }
+        var_7 = (var_4 = var_4) ? (short)2.756967E37F : (short)'K';
+        byte var_17;
+    }
+
+
+
+    abstract public Tester_Interface_0 func_0(double[][] arg_0, final Object arg_1);
+
+
+    final double func_0(final float arg_0, final short arg_1, final boolean arg_2)
+    {
+        var_6 = (var_6 = "lmshbl");
+        var_3 = (var_3 = (new byte[(new byte[(byte)arg_1])[var_3 = (byte)arg_0]])[var_3 = (var_3 = (byte)(var_1 >>>= var_1))]);
+        var_5 %= (var_3 = (byte)1909375874);
+        var_1 /= (char)(short)'i';
+        {
+            "vgar".length();
+        }
+        int var_10;
+        {
+            var_3 = (var_4 &= true) ? (byte)(var_5 *= 6375499657746206720L) : (byte)+ (var_5 /= var_9);
+            var_7 = (var_4 = true) ? (byte)(false ? (short)749593632 : (byte)8.692758043260743E307) : (byte)var_1;
+            ((new Tester_Class_1[(byte)1.2890904018345944E308])[(byte)var_1]).var_3 = (var_3 = (byte)arg_0);
+            var_4 = true ^ var_4;
+        }
+        {
+            var_1 ^= (var_3 = (var_3 = (var_3 = (byte)'U')));
+        }
+        var_3 = (var_3 = (var_3 = (var_3 = (byte)arg_1)));
+        char var_11;
+        var_1 += (var_2 = (var_7 = arg_1));
+        {
+            var_7 = (var_7 = arg_1);
+        }
+        var_7 = arg_1;
+        var_6 = (new char[(byte)1985094111797788672L][var_3 = (byte)3112604683090268160L])[var_3 = (byte)~ (var_3 = (byte)(var_5 += var_1))];
+        var_3 = (var_3 = (var_3 = (var_3 = (byte)3694858000202921984L)));
+        var_1 /= ~ ((byte)1311538336);
+        (((var_4 |= arg_2 ? !true && arg_2 : false) ? arg_2 : arg_2) ? "iih".substring(~ (var_3 = (byte)3.5401308E37F), 'g' * arg_1) : "gynskmvoj").trim();
+        var_3 = (var_3 = arg_2 ? (byte)+ ~5247392660383928320L : (byte)8392160279007184896L);
+        var_3 = (var_3 = (var_3 = (byte)var_8));
+        return (var_5 += 7.157559E37F) + (var_11 = 'V');
+    }
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_1.var_7 = "; result += Tester.Printer.print(var_7);
+        result += "\n";
+        result += "Tester_Class_1.var_3 = "; result += Tester.Printer.print(var_3);
+        result += "\n";
+        result += "Tester_Class_1.var_8 = "; result += Tester.Printer.print(var_8);
+        result += "\n";
+        result += "Tester_Class_1.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "\n";
+        result += "Tester_Class_1.var_4 = "; result += Tester.Printer.print(var_4);
+        result += "\n";
+        result += "Tester_Class_1.var_5 = "; result += Tester.Printer.print(var_5);
+        result += "\n";
+        result += "Tester_Class_1.var_2 = "; result += Tester.Printer.print(var_2);
+        result += "\n";
+        result += "Tester_Class_1.var_9 = "; result += Tester.Printer.print(var_9);
+        result += "\n";
+        result += "Tester_Class_1.var_6 = "; result += Tester.Printer.print(var_6);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+
+class Tester_Class_2 extends Tester_Class_1 implements Tester_Interface_0 {
+    final static String var_18 = false | Tester_Class_1.var_4 | (Tester_Class_1.var_4 &= (Tester_Class_1.var_4 |= (Tester_Class_1.var_4 = var_4))) ? "tbobyhqne" : "";
+    static String var_19 = "acxfj";
+
+
+    public Tester_Class_2()
+    {
+        Tester_Class_1.var_4 = !Tester_Class_1.var_4;
+        var_1++;
+        var_2 = (byte)2.4009747E38F;
+        new String();
+        var_6 = (var_19 = "hsshyw");
+        var_19 = var_19;
+    }
+
+
+    public Tester_Interface_0 func_0(double[][] arg_0, final Object arg_1)
+    {
+        var_5 = 4.0352057E37F;
+        (((false && ! ((Tester_Class_1.var_4 |= !true) ^ (Tester_Class_1.var_4 ^ false))) ^ (var_4 &= true) ? var_4 : (var_4 ^= true)) ? "spskwj" : "xcqianm").length();
+        ((var_4 |= (Tester_Class_1.var_4 ^= Tester_Class_1.var_4) ? (Tester_Class_1.var_4 &= false) : (Tester_Class_1.var_4 |= Tester_Class_1.var_4)) ? (Tester_Class_1)(var_6 = new double[(byte)6.628342687109622E307]) : (Tester_Class_1)arg_1).var_6 = arg_0;
+        var_7 = (short)(byte)(short)8775325134193811456L;
+        var_4 ^= (var_4 &= !false);
+        ((Tester_Class_1)arg_1).var_3 = (var_3 = (byte)(var_5 %= 8.933448E37F));
+        Tester_Class_1 var_20 = Tester_Class_1.var_4 ? (Tester_Class_1)arg_1 : (Tester_Class_1)arg_1;
+        {
+            var_19.endsWith(var_19);
+            var_6 = var_20;
+            (var_20 = (var_20 = var_20)).var_2 = (short)('p' <= 1986176769 % (int)2242661265280256000L % 2664882044098145280L ? ~ (var_3 = (byte)1.1892553447967157E308) & ~1806805036550279168L : (var_7 = (byte)var_8));
+        }
+        final boolean var_21 = Tester_Class_1.var_4;
+        var_20.var_3 = (var_3 = (var_20.var_3 = (byte)'t'));
+        boolean var_22 = true;
+        Tester_Class_1.var_4 |= (var_4 = var_21);
+        var_19 = "ocn";
+        var_19 = var_19;
+        var_1 *= Tester_Class_1.var_8;
+        var_20 = var_22 ? var_20 : var_20;
+        var_7 = var_21 ? (byte)+ ((byte)var_1) : ((var_20 = (var_20 = var_20)).var_3 = (var_3 = (var_3 = (byte)'L')));
+        return true ? (var_20 = var_20) : (new Tester_Interface_0[(byte)5618282952859970560L])[var_3 = (byte)Tester_Class_1.var_8];
+    }
+
+
+    public boolean equals(Object obj)
+    {
+        Tester_Class_1.var_7 = (var_7 = (((Tester_Class_1)obj).var_3 = (byte)var_9));
+        {
+            final Tester_Class_1 var_23 = (Tester_Class_1)obj;
+        }
+        ++Tester_Class_1.var_1;
+        var_5 = (Tester_Class_1.var_7 = var_4 ? (Tester_Class_1.var_7 = (((Tester_Class_1)obj).var_3 = (byte)Tester_Class_1.var_8)) : (var_7 = (byte)var_9));
+        ((Tester_Class_1)obj).var_6 = var_18.replace(Tester_Class_1.var_8, Tester_Class_1.var_8);
+        ((new Tester_Class_1[((Tester_Class_1)(obj = new char[var_3 = (byte)Tester_Class_1.var_8])).var_3 = (((Tester_Class_1)obj).var_3 = (byte)(var_1 %= 787509251458841600L))])[(new byte[var_3 = (byte)Tester_Class_1.var_1])[((Tester_Class_1)obj).var_3 = (byte)1.2382548E38F]]).var_3 = (((Tester_Class_1)obj).var_3 = var_4 ? (byte)Tester_Class_1.var_8 : (byte)4.1085164E36F);
+        var_1 &= var_8;
+        var_7 = var_4 ? (var_3 = (byte)var_8) : (byte)var_5;
+        var_19 = var_18;
+        ("o".compareTo("kwlfk") > (var_2 = 5289241662482067456L) ? (Tester_Class_1)obj : (Tester_Class_1)obj).var_5 -= (((Tester_Class_1)obj).var_3 = (((Tester_Class_1)obj).var_3 = (((Tester_Class_1)obj).var_3 = (byte)var_9)));
+        return true;
+    }
+
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_2.var_7 = "; result += Tester.Printer.print(var_7);
+        result += "\n";
+        result += "Tester_Class_2.var_8 = "; result += Tester.Printer.print(var_8);
+        result += "\n";
+        result += "Tester_Class_2.var_3 = "; result += Tester.Printer.print(var_3);
+        result += "\n";
+        result += "Tester_Class_2.var_18 = "; result += Tester.Printer.print(var_18);
+        result += "\n";
+        result += "Tester_Class_2.var_19 = "; result += Tester.Printer.print(var_19);
+        result += "\n";
+        result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "\n";
+        result += "Tester_Class_2.var_4 = "; result += Tester.Printer.print(var_4);
+        result += "\n";
+        result += "Tester_Class_2.var_5 = "; result += Tester.Printer.print(var_5);
+        result += "\n";
+        result += "Tester_Class_2.var_2 = "; result += Tester.Printer.print(var_2);
+        result += "\n";
+        result += "Tester_Class_2.var_9 = "; result += Tester.Printer.print(var_9);
+        result += "\n";
+        result += "Tester_Class_2.var_6 = "; result += Tester.Printer.print(var_6);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+
+class Tester_Class_3 extends Tester_Class_2 implements Tester_Interface_0 {
+    long var_24 = 9026266006808413184L;
+    char var_25;
+    String var_26 = ((var_4 ^= Tester_Class_1.var_4) ? (!true ? false : (var_4 |= true)) : (Tester_Class_2.var_4 ^= var_4)) ? "dkmhvhl" : (var_19 = (Tester_Class_2.var_19 = (Tester_Class_2.var_19 = var_18)));
+    static Tester_Class_2 var_27;
+    short var_28 = Tester_Class_2.var_7 = (short)(Tester_Class_2.var_1 &= (var_3 = (var_3 = (var_3 = (byte)Tester_Class_2.var_9))));
+    static boolean var_29 = false;
+    static Object[][] var_30;
+    int var_31 = 750583762;
+    Tester_Class_2 var_32;
+    final static long var_33 = 3050784555932008448L;
+
+
+    public Tester_Class_3()
+    {
+        byte[] var_34;
+        var_4 &= (Tester_Class_1.var_4 = true);
+        Tester_Class_1.var_1--;
+        switch (var_28 >>= ~ ((byte)var_28))
+        {
+            case 9:
+
+            case 26:
+                Tester_Class_1.var_4 ^= Tester_Class_1.var_4;
+                (Tester_Class_2.var_19 = "pwtic").indexOf(Tester_Class_2.var_18);
+                var_26.indexOf(var_19);
+                ((Tester_Class_1)(new Tester_Interface_0[(byte)var_5])[var_24 <= var_31 ? (byte)'^' : (byte)var_24]).var_2 = 5611775846881101824L;
+                var_29 |= (Tester_Class_2.var_4 ^= var_29);
+                Tester_Class_2 var_35;
+                var_24 <<= (var_31 >>= (var_25 = var_8));
+                break;
+
+            case 28:
+
+        }
+        new String();
+        var_5 %= (var_25 = 'n');
+        ((Tester_Class_2)(Tester_Class_1)(((Tester_Class_1)(var_6 = Tester_Class_2.var_18)).var_6 = (var_26 = ""))).var_2 = var_31;
+        --var_1;
+    }
+
+
+
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_3.var_8 = "; result += Tester.Printer.print(var_8);
+        result += "\n";
+        result += "Tester_Class_3.var_25 = "; result += Tester.Printer.print(var_25);
+        result += "\n";
+        result += "Tester_Class_3.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "\n";
+        result += "Tester_Class_3.var_31 = "; result += Tester.Printer.print(var_31);
+        result += "\n";
+        result += "Tester_Class_3.var_30 = "; result += Tester.Printer.print(var_30);
+        result += "\n";
+        result += "Tester_Class_3.var_24 = "; result += Tester.Printer.print(var_24);
+        result += "\n";
+        result += "Tester_Class_3.var_33 = "; result += Tester.Printer.print(var_33);
+        result += "\n";
+        result += "Tester_Class_3.var_5 = "; result += Tester.Printer.print(var_5);
+        result += "\n";
+        result += "Tester_Class_3.var_2 = "; result += Tester.Printer.print(var_2);
+        result += "\n";
+        result += "Tester_Class_3.var_9 = "; result += Tester.Printer.print(var_9);
+        result += "\n";
+        result += "Tester_Class_3.var_7 = "; result += Tester.Printer.print(var_7);
+        result += "\n";
+        result += "Tester_Class_3.var_28 = "; result += Tester.Printer.print(var_28);
+        result += "\n";
+        result += "Tester_Class_3.var_3 = "; result += Tester.Printer.print(var_3);
+        result += "\n";
+        result += "Tester_Class_3.var_18 = "; result += Tester.Printer.print(var_18);
+        result += "\n";
+        result += "Tester_Class_3.var_19 = "; result += Tester.Printer.print(var_19);
+        result += "\n";
+        result += "Tester_Class_3.var_26 = "; result += Tester.Printer.print(var_26);
+        result += "\n";
+        result += "Tester_Class_3.var_4 = "; result += Tester.Printer.print(var_4);
+        result += "\n";
+        result += "Tester_Class_3.var_29 = "; result += Tester.Printer.print(var_29);
+        result += "\n";
+        result += "Tester_Class_3.var_27 = "; result += Tester.Printer.print(var_27);
+        result += "\n";
+        result += "Tester_Class_3.var_32 = "; result += Tester.Printer.print(var_32);
+        result += "\n";
+        result += "Tester_Class_3.var_6 = "; result += Tester.Printer.print(var_6);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+public class Tester {
+    static double var_36 = 2.679028326789642E307;
+    float var_37;
+    String var_38 = Tester_Class_2.var_18;
+    static Tester_Interface_0 var_39;
+    static char var_40 = 'D';
+    Tester_Class_1 var_41;
+    static int var_42;
+    final static boolean var_43 = false;
+
+
+    final static Tester_Class_2 func_0(Tester_Class_1 arg_0, final Tester_Class_2 arg_1)
+    {
+        "ooots".replaceFirst("rdxor", ((new Tester_Class_3[arg_1.var_3 = (byte)2.7836305E38F])[arg_0.var_3 = (byte)+ + +1.4958218616334936E307]).var_26);
+        if (true)
+        {
+            arg_0 = (Tester_Class_3)arg_0;
+            ((Tester_Class_3)arg_0).var_25 = var_40;
+            final Tester_Class_2 var_44 = (Tester_Class_2)((Tester_Class_3.var_29 |= var_43) ? arg_0 : (arg_0.var_6 = Tester_Class_3.var_18));
+        }
+        else
+        {
+            var_39 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_1);
+        }
+        Tester_Class_3.var_19 = "onndgsil";
+        var_39 = arg_0;
+        return (Tester_Class_2.var_4 &= Tester_Class_2.var_4 ^ true) ? (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)arg_1) : (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)arg_1);
+    }
+
+    private final static float func_1(final short arg_0, int[][] arg_1, final long arg_2)
+    {
+        Tester_Class_2.var_1 *= arg_0;
+        double var_45 = 6.841391103184752E307;
+        long var_46;
+        Tester_Class_2.var_1--;
+        --var_40;
+        ++var_40;
+        ++Tester_Class_3.var_1;
+        Tester_Class_1.var_4 = false;
+        var_36 %= 'X';
+        ++Tester_Class_2.var_1;
+        Tester_Class_1.var_1++;
+        return 3.2422038E38F;
+    }
+
+    private final static char func_2(double arg_0, final byte arg_1, int arg_2)
+    {
+        --Tester_Class_3.var_1;
+        if (Tester_Class_1.var_4)
+        {
+            if (var_43)
+            {
+                Tester_Class_3.var_1++;
+            }
+            else
+            {
+                var_40 <<= 1329560515532651520L;
+            }
+            (false & Tester_Class_2.var_4 ? (new Tester_Class_1[arg_1])[arg_1] : (new Tester_Class_1[arg_1][arg_1])[arg_1][arg_1]).var_3 = arg_1;
+            Tester_Class_2.var_19 = Tester_Class_3.var_19;
+            --var_40;
+            final long var_47 = ~Tester_Class_3.var_33 << var_40--;
+            ((Tester_Class_3)(new Tester_Class_2[arg_1][arg_1])[arg_1][arg_1]).var_24 *= (var_36 *= (long)arg_1 * ~arg_1);
+            Tester_Class_2.var_19 = Tester_Class_2.var_19;
+            ++((new Tester_Class_3[arg_1])[arg_1]).var_24;
+        }
+        else
+        {
+            var_40++;
+        }
+        var_40 <<= var_40;
+        if (true)
+        {
+            ++arg_2;
+        }
+        else
+        {
+            Tester_Class_2.var_7 = arg_1;
+        }
+        boolean var_48 = true;
+        var_36 /= arg_1;
+        final short var_49 = 15276;
+        Tester_Interface_0 var_50;
+        ((Tester_Class_2.var_19 = (Tester_Class_2.var_19 = Tester_Class_2.var_19)) + "xhi").toString();
+        arg_2++;
+        return var_40;
+    }
+
+    public final static char func_4(final boolean arg_0)
+    {
+        float var_52 = 2.8063675E38F;
+        var_40--;
+        Object var_53;
+        Tester_Class_3.var_29 |= (Tester_Class_3.var_29 &= true);
+        if (!Tester_Class_1.var_4)
+        {
+            --var_40;
+        }
+        else
+        {
+            var_52 %= 2027756834;
+        }
+        int var_54 = Tester_Class_1.var_1++;
+        var_40--;
+        long var_55;
+        byte var_56 = 97;
+        var_36 *= 9.75628909363086E307 % + -1.9812653793936264E306;
+        int var_57;
+        boolean var_58 = Tester_Class_1.var_4 ^= var_43;
+        return 'J';
+    }
+
+    static float func_5(final Object arg_0, float arg_1, final Tester_Class_2 arg_2)
+    {
+        var_39 = arg_2;
+        Tester_Class_3.var_27 = arg_2;
+        arg_1 %= 1.7777554E38F;
+        var_39 = (Tester_Class_3.var_27 = arg_2);
+        Tester_Class_3 var_59;
+        {
+            var_40 -= arg_1 - ~ (((Tester_Class_3)arg_2).var_3 = (byte)1455854212);
+        }
+        Object var_60 = Tester_Class_1.var_4 ? arg_0 : new String[arg_2.var_3 = (byte)arg_1][(byte)((Tester_Class_3)arg_0).var_28];
+        Tester_Class_3.var_27 = (Tester_Class_2)(var_39 = arg_2);
+        ((Tester_Class_3.var_4 |= var_43) ? (var_59 = (var_59 = (var_59 = (Tester_Class_3)var_60))) : (var_59 = (Tester_Class_3)arg_2)).var_24 ^= Tester_Class_3.var_1;
+        return Tester_Class_1.var_9;
+    }
+
+    private static void func_6(char arg_0, final Tester_Class_3 arg_1, String arg_2, final double arg_3)
+    {
+        ((new Tester_Class_1[(byte)arg_1.var_28])[(arg_1.var_32 = arg_1).var_3 = (byte)var_40]).var_2 = Tester_Class_3.var_9;
+        double var_61;
+        (true ? (arg_1.var_32 = arg_1) : (arg_1.var_32 = (Tester_Class_3.var_27 = (arg_1.var_32 = arg_1)))).var_6 = var_43 | (Tester_Class_2.var_4 = !Tester_Class_3.var_4) ? (arg_1.var_26 = arg_2) : (Tester_Class_2.var_19 = Tester_Class_2.var_18);
+    }
+
+    private final char func_7(int arg_0)
+    {
+        Tester_Class_2.var_4 &= var_43;
+        float var_62 = Tester_Class_3.var_9;
+        --var_40;
+        int var_63 = Tester_Class_1.var_1++;
+        {
+            "nncjfoit".indexOf((new int[(byte)'\\'])[(byte)var_36]);
+            if (var_43)
+            {
+                ((new Tester_Class_3[(byte)var_40][(byte)Tester_Class_2.var_1])[(byte)5046997225818337280L][(byte)var_63]).var_24 >>>= var_40;
+            }
+            else
+            {
+                --var_40;
+            }
+            --Tester_Class_2.var_1;
+            --var_63;
+        }
+        {
+            final byte var_64 = Tester_Class_1.var_4 ? (byte)'M' : (byte)(var_62 -= + ((byte)Tester_Class_1.var_8));
+            float var_65;
+            var_62 *= ((Tester_Class_3)(new Tester_Interface_0[var_64])[var_64]).var_24++;
+            var_36 /= var_64;
+            {
+                double var_66;
+            }
+            var_40 += 3500240160155094016L;
+            ((new Tester_Class_1[var_64][var_64])[var_64][var_64]).var_3 = (byte)(Tester_Class_2.var_7 = (Tester_Class_1.var_7 = (Tester_Class_1.var_7 = (Tester_Class_1.var_7 = var_64))));
+            ++Tester_Class_3.var_1;
+        }
+        --arg_0;
+        {
+            arg_0++;
+        }
+        Tester_Class_2.var_1++;
+        var_40 &= (short)((byte)Tester_Class_2.var_8 >> (((new Tester_Class_3[(byte)var_36])[(byte)(var_40 = Tester_Class_3.var_8)]).var_3 = (byte)((byte)3.3531374E38F * var_40)));
+        var_36 %= (var_62 = (byte)900943133);
+        var_36 = Tester_Class_3.var_33;
+        var_62 += (var_40 /= (byte)6766658341842315264L % (byte)'p') * (short)2019461672;
+        --var_40;
+        if (true)
+        {
+            var_62 *= 365879806965555200L;
+        }
+        else
+        {
+            var_36 -= ~9163555887358003200L;
+        }
+        Tester_Class_1.var_4 = Tester_Class_1.var_4;
+        {
+            var_40 <<= var_63;
+        }
+        var_40++;
+        String var_67;
+        return Tester_Class_1.var_8;
+    }
+
+    private final static Tester_Interface_0 func_8(char arg_0, final Tester_Class_2 arg_1, final String arg_2)
+    {
+        ((new Tester[(byte)((Tester_Class_3)arg_1).var_28])[((Tester_Class_1)(var_39 = arg_1)).var_3 = ((Tester_Class_3.var_27 = (Tester_Class_3)arg_1).var_3 = (byte)+ -9.9100855E36F)]).var_38 = (var_43 ? "k" : Tester_Class_2.var_19).substring(350785312);
+        return (new Tester_Interface_0[(byte)'l'])[((Tester_Class_1)(var_39 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_1))).var_3 = ((Tester_Class_3.var_27 = arg_1).var_3 = (((Tester_Class_3)arg_1).var_3 = (arg_1.var_3 = (arg_1.var_3 = (byte)'['))))];
+    }
+
+    private final int func_9(Tester_Class_3 arg_0, char arg_1)
+    {
+        final float var_68 = Tester_Class_3.var_9;
+        Tester_Class_2.var_18.toLowerCase();
+        double var_69;
+        {
+            Tester_Class_3.var_29 ^= !false || Tester_Class_2.var_4;
+        }
+        Tester_Class_1 var_70;
+        (Tester_Class_3.var_27 = (Tester_Class_2)(var_70 = arg_0)).var_6 = (Tester_Class_2)((var_41 = arg_0).var_6 = (arg_0.var_6 = arg_0));
+        "hv".codePointBefore(--Tester_Class_2.var_1);
+        var_41 = arg_0;
+        return ~ (((arg_0 = arg_0).var_24 &= arg_1) == 3.0764282E38F ? (byte)457565863 : ((arg_0 = arg_0).var_3 = (byte)arg_0.var_28));
+    }
+
+    private static void func_10(double arg_0, final Tester_Class_3 arg_1, double arg_2)
+    {
+        arg_1.var_32 = 'g' != 1.520646515461986E307 ? (arg_1.var_32 = arg_1) : arg_1;
+        Tester_Class_2.var_19.startsWith(Tester_Class_2.var_19 = Tester_Class_3.var_18);
+        Tester_Class_1.var_4 ^= true & (arg_1.var_3 = (arg_1.var_3 = (byte)- ((byte)1.4509185661781193E308))) > (arg_1.var_2 = var_40);
+        var_36 += Tester_Class_3.var_9;
+    }
+
+    Tester_Interface_0 func_12(final Object arg_0, float arg_1)
+    {
+        switch (((Tester_Class_3)arg_0).var_3 = (byte)arg_1)
+        {
+            case 4:
+                var_41 = (Tester_Class_3)(var_39 = (Tester_Class_3.var_27 = (Tester_Class_3.var_27 = (Tester_Class_3)arg_0)));
+                double var_72 = (double)3858573493713776640L;
+                byte var_73 = (var_41 = (Tester_Class_2)arg_0).var_3 = (((Tester_Class_3)arg_0).var_3 = (byte)var_72);
+                break;
+
+            case 13:
+                (Tester_Class_3.var_27 = (((Tester_Class_3)arg_0).var_32 = (Tester_Class_3)(Tester_Class_2)arg_0)).var_3 = (Tester_Class_2.var_1 *= ((Tester_Class_3)arg_0).var_24) == (byte)Tester_Class_3.var_33 ? (byte)188693954866039808L : (byte)Tester_Class_2.var_8;
+                break;
+
+            default:
+                var_40 <<= (byte)157510337;
+                break;
+
+            case 26:
+
+            case 122:
+
+        }
+        Tester_Interface_0 var_74;
+        long var_75;
+        var_41 = (var_41 = (var_41 = (Tester_Class_2)arg_0));
+        arg_1 *= 1601420762;
+        var_74 = (var_41 = Tester_Class_1.var_4 ? (Tester_Class_3)arg_0 : (Tester_Class_2)arg_0);
+        (Tester_Class_1.var_4 ? (Tester_Class_3)(var_39 = (Tester_Class_3)arg_0) : (true ? (Tester_Class_3)arg_0 : (Tester_Class_3)arg_0)).var_28 *= 1066935145;
+        var_40 >>>= (byte)6.643183E36F / - ((byte)1.277596E37F);
+        {
+            ((Tester_Class_3)(((Tester_Class_3)((Tester_Class_3.var_29 ^= (Tester_Class_3.var_29 &= var_43)) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0)).var_32 = (Tester_Class_3.var_27 = (Tester_Class_2)arg_0))).var_28--;
+        }
+        var_38 = "qad";
+        byte var_76 = ((Tester_Class_2)(var_39 = (Tester_Class_3)arg_0)).var_3 = true ? ((var_41 = (var_41 = (Tester_Class_3)arg_0)).var_3 = (byte)1.7128118638075888E308) : (byte)1.6562746603631249E308;
+        return var_39 = (Tester_Class_3)((var_41 = (Tester_Class_3)arg_0).var_6 = Tester_Class_2.var_18);
+    }
+
+    protected final String func_13()
+    {
+        float var_77;
+        var_38 = (Tester_Class_2.var_19 = var_38);
+        Tester_Class_2.var_4 ^= !var_43 | (Tester_Class_3.var_29 ^= Tester_Class_1.var_4);
+        Tester_Class_3.var_1--;
+        Tester_Class_2.var_1++;
+        return Tester_Class_2.var_18;
+    }
+
+    public static String execute()
+    {
+        try {
+            Tester t = new Tester();
+            try { t.test(); }
+            catch(Throwable e) { }
+            try { return t.toString(); }
+            catch (Throwable e) { return "Error during result conversion to String"; }
+        } catch (Throwable e) { return "Error during test execution"; }
+    }
+
+    public static void main(String[] args)
+    {
+        try {
+            Tester t = new Tester();
+            try { t.test(); }
+            catch(Throwable e) { }
+            try { System.out.println(t); }
+            catch(Throwable e) { }
+        } catch (Throwable e) { }
+    }
+
+    private void test()
+    {
+        int var_78 = 0;
+        var_39 = (new Tester_Class_1[(byte)var_40])[(byte)Tester_Class_3.var_33];
+        while (var_43 && (var_78 < 70 && true))
+        {
+            var_40 *= ~ ~Tester_Class_3.var_33 % Tester_Class_3.var_9;
+            var_78++;
+            var_39 = new Tester_Class_3();
+            var_39 = (var_41 = (Tester_Class_3.var_27 = new Tester_Class_2()));
+        }
+        final Tester_Class_3 var_79 = (Tester_Class_1.var_4 ? ~Tester_Class_3.var_33 : var_36) == 1433764895112462336L ? new Tester_Class_3() : new Tester_Class_3();
+        Tester_Class_2 var_80;
+    }
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester.var_40 = "; result += Printer.print(var_40);
+        result += "\n";
+        result += "Tester.var_42 = "; result += Printer.print(var_42);
+        result += "\n";
+        result += "Tester.var_36 = "; result += Printer.print(var_36);
+        result += "\n";
+        result += "Tester.var_37 = "; result += Printer.print(var_37);
+        result += "\n";
+        result += "Tester.var_39 = "; result += Printer.print(var_39);
+        result += "\n";
+        result += "Tester.var_38 = "; result += Printer.print(var_38);
+        result += "\n";
+        result += "Tester.var_43 = "; result += Printer.print(var_43);
+        result += "\n";
+        result += "Tester.var_41 = "; result += Printer.print(var_41);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+    static class Printer
+    {
+        public static String print(boolean arg) { return String.valueOf(arg); }
+        public static String print(byte arg)    { return String.valueOf(arg); }
+        public static String print(short arg)   { return String.valueOf(arg); }
+        public static String print(char arg)    { return String.valueOf((int)arg); }
+        public static String print(int arg)     { return String.valueOf(arg); }
+        public static String print(long arg)    { return String.valueOf(arg); }
+        public static String print(float arg)   { return String.valueOf(arg); }
+        public static String print(double arg)  { return String.valueOf(arg); }
+
+
+        public static String print(Object arg)
+        {
+            return print_r(new java.util.Stack(), arg);
+        }
+
+        private static String print_r(java.util.Stack visitedObjects, Object arg)
+        {
+            String result = "";
+            if (arg == null)
+                result += "null";
+            else
+            if (arg.getClass().isArray())
+            {
+                for (int i = 0; i < visitedObjects.size(); i++)
+                    if (visitedObjects.elementAt(i) == arg) return "<recursive>";
+
+                visitedObjects.push(arg);
+
+                final String delimiter = ", ";
+                result += "[";
+
+                if (arg instanceof Object[])
+                {
+                    Object[] array = (Object[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print_r(visitedObjects, array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof boolean[])
+                {
+                    boolean[] array = (boolean[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof byte[])
+                {
+                    byte[] array = (byte[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof short[])
+                {
+                    short[] array = (short[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof char[])
+                {
+                    char[] array = (char[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof int[])
+                {
+                     int[] array = (int[]) arg;
+                     for (int i = 0; i < array.length; i++)
+                     {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                     }
+                }
+                else
+                if (arg instanceof long[])
+                {
+                    long[] array = (long[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof float[])
+                {
+                    float[] array = (float[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof double[])
+                {
+                    double[] array = (double[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+
+                result += "]";
+                visitedObjects.pop();
+
+            } else
+            {
+                result += arg.toString();
+            }
+
+            return result;
+        }
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/6716441/Tester.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,940 @@
+/*
+ * 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 6716441
+ * @summary error in meet with +DoEscapeAnalysis
+ * @run main/othervm -Xcomp -XX:+AggressiveOpts Tester
+ */
+
+/* Complexity upper bound: 70070 ops */
+
+class Tester_Class_0 {
+    Object var_1;
+
+
+    public Tester_Class_0()
+    {
+        var_1 = "cmlv";
+        {
+            final Object var_7 = false ? (var_1 = "flwnujmm") : (var_1 = "");
+        }
+        float var_8 = 0F;
+        boolean var_9;
+        do
+        {
+            ((var_9 = (var_9 = (var_9 = false))) && true ? new String("yvirc") : "rmfkjbx").indexOf(99854165);
+            var_8++;
+            boolean var_10 = true;
+            var_10 |= true ? true : false;
+            var_10 |= false | var_10 ? (var_10 |= true) : true;
+        } while (var_8 < 1 && "tpb".charAt(~ ((byte)2449669946597620736L)) >>> (byte)1.704554E38F >= ('t' < var_8 ? (short)var_8 : 1237471887 / +4199632387838836736L));
+        var_1 = (var_1 = "y");
+        switch ((var_9 = "".equalsIgnoreCase("kqalxwsnu") | false) ? (new char[(byte)1.3230508534158742E308])[(byte)(short)93390917] : 'c')
+        {
+            case 'U':
+
+            case 'W':
+
+            case 'A':
+
+            case 72:
+
+        }
+        var_9 = (var_9 = false);
+        float var_11 = 0F;
+        var_9 = true;
+        for (var_1 = (var_1 = new boolean[(new byte[(byte)'O'])[(byte)'l']]); var_11 < 2; var_1 = (true ? "" : "nn").toUpperCase())
+        {
+            var_9 = true;
+            var_11++;
+            var_9 = true;
+            int var_12 = (new short[(byte)1825213428])[(byte)1.6151095881186834E308] + (byte)(short)'V';
+        }
+        var_1 = (new boolean[(byte)1546704177][(byte)6314352927310996480L][(byte)6838913812451802112L])["e".equalsIgnoreCase("d") ? (byte)3.964472879846357E307 : (byte)'L'];
+        var_9 = (var_9 = false);
+    }
+
+
+
+    protected Object clone()
+    {
+        var_1 = (var_1 = "dbogknllu");
+        var_1 = "jljax";
+        var_1 = (var_1 = false ? "s" : "upqinst");
+        if (false)
+        {
+            var_1 = (var_1 = (var_1 = "nwhu"));
+        }
+        else
+        {
+            short var_2;
+            var_2 = false ? (byte)((short)'e' - (byte)2.267975E38F) : (byte)1.28920093132789E308;
+        }
+        (((byte)2.3450009E38F >= (byte)- (+ - -1.6256751428449317E306 * 954071273906192384L) ? true : true) ? "gpv".substring(468176669, 1915798010) : "macqbvf").offsetByCodePoints("ivwivjege".charAt(1819923298) >>> (byte)((- ~653213024937366528L + 'N') * +1.0297164E38F) + (short)~ + -4535402293751053312L, (short)3837656677199316992L + (new byte[(byte)2.1586717E38F])[(byte)((short)719847962 - 8.599263E37F)]);
+        new String((char)650047353 > (short)'I' ? "maygldu".replaceAll("hpn", "bacoyows") : "nkx").endsWith(new String("h" + "vx"));
+        byte var_3;
+        return var_1 = "vbiccvdu";
+    }
+
+    public boolean equals(Object obj)
+    {
+        var_1 = "rxpocj";
+        obj = "ndogtwvuh";
+        {
+            {
+                var_1 = "vmdkvs";
+            }
+            final boolean var_4 = false;
+            long var_5;
+            var_5 = (short)'G' >> + ((byte)1.1872624048733707E308);
+        }
+        var_1 = (new byte[(byte)(short)1.7804576633213148E308][(byte)(short)8.300151422843056E307])[(byte)3110360603258978304L];
+        obj = "fudebwroh";
+        obj = new Object[(false && false) & false ? (byte)8796624364629753856L : (byte)- +1.5843542184394165E308];
+        if (true)
+        {
+            var_1 = new float[(byte)1372189277][(byte)((byte)8.352642520619892E307 == (! !false ^ true ? (short)1.3871033E37F : (byte)'f') ? 7.33899E37F - (short)2.2558552E37F : 2.6072269E38F)];
+        }
+        else
+        {
+            var_1 = obj;
+            obj = new boolean[(byte)8.623747E37F][(byte)~ ((byte)(short)(byte)2100816354)];
+        }
+        var_1 = new int[(new byte[(byte)7410132537719084032L])[(byte)1524949007]][(byte)((long)9188640 ^ 'n')];
+        if (-3.0364305E38F > 8.114229090672013E307)
+        {
+            var_1 = (var_1 = new boolean[(byte)1.0354788699727844E308][(byte)-4867581638981979136L]);
+        }
+        else
+        {
+            obj = (obj = obj);
+            obj = (new int[(byte)'f'][(byte)7563033606293564416L])[(byte)2052737645];
+        }
+        long var_6;
+        var_6 = (+ + ~3862500564271147008L != (short)8549491352795953152L || (byte)+ + (var_6 = 'D') > (var_6 = 1687952259)) && true ? (short)1756260278 : (byte)(short)3.202384E36F;
+        return false ^ ((false ? !true : true) ? false : (true ? ! !false : false));
+    }
+
+
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_0.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+
+interface Tester_Interface_1 {
+}
+
+
+final class Tester_Class_2 extends Tester_Class_0 {
+    static char var_13;
+    final static long var_14 = ~ ~ (((false ? !true ^ !true : !false | true) ? (byte)1.4363583E38F : (byte)(short)'X') * + + +3767002589844008960L << (var_13 = (var_13 = 'X')));
+
+
+    public Tester_Class_2()
+    {
+        ((true ? (byte)- ((byte)2.6338962E38F) : (byte)'H') <= (short)8.671266E37F || !false & true ? (Tester_Class_0)(var_1 = "tgoexsr") : (Tester_Class_0)(var_1 = "mptusv")).var_1 = "tbxbgyti";
+        var_1 = true ? (var_1 = "islgpxwa") : "rypkbu";
+        var_1 = "vngiif";
+        var_13 = (var_13 = (short)~ (-3250577075350561792L + +2983539228635145216L - '`') < 861590495 * (short)1.5299644E38F ? 'V' : 'G');
+        Object[] var_27;
+        var_1 = (var_1 = "glu");
+    }
+
+
+
+
+
+    private static int func_0(Tester_Interface_1 arg_0, Tester_Interface_1 arg_1, final int arg_2)
+    {
+        var_13 = 'i';
+        new String();
+        (true ? "pu" : "oltbcysyd").substring(1236315614);
+        byte var_15;
+        var_15 = (new byte[(byte)1582653493940204544L][(byte)(char)-1.5806537192822515E308])[(byte)1.2986292E38F][(byte)(short)arg_2];
+        if (true || true)
+        {
+            ((new Tester_Class_2[var_15 = (byte)'q'])[var_15 = 7.653082E37F < (var_13 = 'o') ? (byte)- - + +3.1640875E38F : (byte)-6820511772487837696L]).var_1 = (new Tester_Class_0[(byte)(short)(new byte[(byte)1080194717])[(byte)8297829563314362368L]])[var_15 = (var_15 = (var_15 = (var_15 = (byte)'t')))];
+            double[] var_16;
+        }
+        else
+        {
+            arg_1 = (arg_1 = arg_0);
+        }
+        var_13 = (var_13 = 'o');
+        var_13 = (false || false ^ false) ^ !true ? 'Z' : (var_13 = 'i');
+        return true ? (var_15 = (byte)'C') : 1120493294;
+    }
+
+    static double func_1(final int arg_0, long arg_1, long arg_2)
+    {
+        "ghtfhmbeg".compareToIgnoreCase("djn");
+        {
+            ((true ? true : ! !true) ? "" : "ioowivxge").substring(1844979226, "ppsk".startsWith("lllmn") | false ? arg_0 * arg_0 : (byte)663320199);
+            ((Tester_Class_0)(((new Tester_Class_2[(byte)4797509007239530496L])[(byte)(- -2.8961086E38F - arg_1)]).var_1 = new float[(byte)('m' / 6.0657416E37F)])).var_1 = new boolean[(byte)(short)(+4.515459E37F - (short)arg_0)][(byte)(-1.3002677717712297E308 + (var_13 = "bcjfdnc".charAt(arg_0)) * (arg_2 - 1.6058080036165979E308))];
+            var_13 = 'E';
+        }
+        float var_17 = 0F;
+        --arg_1;
+        do
+        {
+            final String[] var_18 = new String[(byte)(short)arg_0];
+            var_17++;
+            Object var_19 = (new Object[(byte)var_17])[(false ? "xfkx".equalsIgnoreCase("j") : !false) ^ !false ? (byte)(1.6627987E35F * 2.62825E38F) : (byte)var_17];
+        } while (var_17 < 2 && false | ((byte)1.4661115E38F | arg_0 - 'l') < ('J' & (byte)+ ((float)1200013759)));
+        long var_20 = 0L;
+        arg_2--;
+        for (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'p'))))); var_20 < 4; var_13 = 'y')
+        {
+            new String((true | true ? "oxpfy" : "gaynucv") + (true ? "cmrrk".substring(653981013, arg_0) : "ociewl" + "srhbvcgci"));
+            var_20++;
+            arg_2 >>= arg_0;
+            arg_2 = false ? (byte)'l' : (byte)(~var_20 - (byte)1.1290483681734838E308);
+        }
+        ((new Tester_Class_2[(byte)arg_1++])[(byte)685259385]).var_1 = new Tester_Interface_1[(byte)arg_0];
+        --arg_1;
+        var_13 = 483446392 - (byte)'P' < ((short)(true ? (var_13 = 't') : 'n') & (short)'l') ? (var_13 = 'q') : (var_13 = (var_13 = 'h'));
+        var_13 = 'y';
+        return 1.097000731360761E308;
+    }
+
+    private final boolean func_2(final short[][] arg_0, byte arg_1, Object arg_2)
+    {
+        var_1 = new char[arg_1];
+        arg_1 /= (var_13 = 'A') + -var_14;
+        int var_21 = 0;
+        arg_2 = (new Tester_Class_0[arg_1 += var_14][arg_1])[arg_1 >>>= 'R' + + -var_14 - 4078879817303787520L];
+        for (arg_1--; (+ +1.1473423E38F < 'w' & false | var_21 != (short)4633877342445358080L | !false ? false | !false : true) && (var_21 < 1 && (arg_0[arg_1])[arg_1 %= 7.136449148111178E307] > 7.362329280963185E307); arg_1++)
+        {
+            arg_1 = (arg_1 %= + -9.872181578576624E307);
+            var_21++;
+            arg_1 /= 7.365334241099395E307;
+            var_13 = (var_13 = (var_13 = (var_13 = (var_13 = (var_13 = 'A')))));
+        }
+        arg_1 >>= var_14;
+        boolean var_22 = false;
+        return ((var_22 &= true) && var_22 ? (short)1.568578228250838E308 : arg_1) >= (new float[arg_1])[arg_1 /= 1.6849858816110731E308];
+    }
+
+    public final String func_3(Tester_Interface_1 arg_0)
+    {
+        arg_0 = arg_0;
+        arg_0 = (arg_0 = arg_0);
+        var_13 = (var_13 = (var_13 = (var_13 = "rqimya".charAt(390686412))));
+        ((Tester_Class_0)(var_1 = "suxd")).var_1 = new Tester_Class_0[(byte)(float)(short)1.584667675541511E308];
+        arg_0 = ((byte)+ + - +1.3636011E38F == 'L' ^ true) & (!true | true) ? (arg_0 = arg_0) : arg_0;
+        var_1 = (((Tester_Class_0)(var_1 = (Tester_Class_0)(var_1 = "ndxcurdr"))).var_1 = (var_1 = (var_1 = "schnhe")));
+        var_1 = (new Object[(byte)(var_13 = (var_13 = 'G'))])[(byte)((byte)1.5366658198344074E308 - 1.0051541518022535E308)];
+        var_13 = (var_13 = 'x');
+        (true ? (Tester_Class_0)(var_1 = "slesdph") : (Tester_Class_0)(var_1 = "wxj")).var_1 = false ? (Tester_Class_0)(var_1 = "iddvoil") : (Tester_Class_0)(var_1 = "yjbxhuip");
+        var_13 = (var_13 = 'f');
+        var_1 = (new short[(byte)1.8902424351360974E307])[(new byte[(byte)1552392028])[(byte)'V']] >= (1.2449926736063704E308 + 'K') / (short)1.0847178E38F / ((short)'M' % (1.225890077244388E308 + + ((byte)1.5358312881295287E308))) ? (Tester_Class_0)(var_1 = "khfntg".toString()) : (Tester_Class_0)(var_1 = "jkttx");
+        {
+            arg_0 = arg_0;
+        }
+        arg_0 = arg_0;
+        var_13 = (true ? "jndbffakc" : "hhcsc").charAt((byte)7322932713210745856L >> (short)(var_13 = (var_13 = 'R')));
+        var_13 = (var_13 = (var_13 = 'U'));
+        {
+            "gepdu".trim();
+        }
+        var_13 = 'H';
+        new String();
+        {
+            (false ^ (true ^ ((!true | ! !true) ^ ! (1.7800668444792402E308 * var_14 >= (var_13 = (var_13 = (var_13 = 'g')))))) ? "dsm" : "g").toUpperCase().toString();
+            ((Tester_Class_0)(var_1 = "fcdvd")).var_1 = (Tester_Class_0)(((Tester_Class_0)(var_1 = "uwhnte")).var_1 = "vpatqpd");
+        }
+        switch (((byte)((byte)((int)'n' / var_14) >>> (short)7.786475993917233E307 - (var_13 = 'm')) <= (("".endsWith("pbypgis") ^ false) & true ? (byte)func_0(arg_0, arg_0, 723551781) : (short)140766856) ? true | (!false || false) : 'F' != (var_13 = 'V')) ? (var_13 = 'j') : 'D')
+        {
+            case 'p':
+
+        }
+        var_13 = (var_13 = (var_13 = 'y'));
+        var_13 = ("" + "wwbxwyt").charAt((short)8373354379880418304L << (short)(byte)1.557224945027141E308);
+        arg_0 = true ? (arg_0 = arg_0) : arg_0;
+        ((Tester_Class_0)(((Tester_Class_0)(var_1 = "rmkvbp")).var_1 = (var_1 = "gvb"))).var_1 = new Tester_Class_0[(byte)var_14];
+        arg_0 = arg_0;
+        return 2.5245162E38F + 3.9088502076337727E307 > 1.0883030748712796E308 ? "efttufmbg" : "xy";
+    }
+
+    protected short func_4(final double arg_0, long arg_1, final Object arg_2, final byte arg_3)
+    {
+        (((("ptnmpn".startsWith("xxgxjvsie") ? !true : ! !true) ? ! !false : false) ? (true ? true : false) : (var_13 = (var_13 = 'X')) == 1948276447) ? (Tester_Class_0)(var_1 = new float[arg_3][arg_3]) : (Tester_Class_0)arg_2).var_1 = new double[(new byte[arg_3][arg_3])[arg_3][arg_3]][arg_3];
+        boolean var_23;
+        return true ? (short)'r' : (byte)(short)('\\' >>> arg_3);
+    }
+
+    final static byte func_5(final long arg_0, float arg_1, final double arg_2)
+    {
+        arg_1 = arg_2 <= ((var_13 = 'D') <= - (3463565869695079424L << 'S') ? 'a' : (var_13 = 'o')) | (true ? !false : !false) ? (byte)(short)(var_13 = 'r') : (short)(byte)'S';
+        {
+            {
+                arg_1 %= '_';
+            }
+            char var_24 = 'G';
+            "hc".lastIndexOf("");
+            arg_1 *= (arg_1 /= (byte)-8.308933840953204E306);
+            --var_24;
+            arg_1 /= ~ ((byte)2.2736606E38F) <= (3392301601783633920L == 3.015267E38F ^ ! !true ? (byte)88382550 : (byte)1.2019729E38F) ? 1027309963 : + -4.355887546298483E307;
+            ((new Tester_Class_2[(byte)arg_2])[(byte)870592870]).var_1 = "i";
+            arg_1 /= 't';
+        }
+        var_13 = 'f';
+        Tester_Class_0 var_25 = (new Tester_Class_0[(byte)arg_1])[(true | false ^ !false) & ! !true & - +2.758844E38F >= (new short[(byte)5.9160883E37F])[(byte)'r'] ? (byte)arg_0 : (byte)((short)1802078016 & arg_0)];
+        arg_1 /= (byte)arg_2;
+        var_13 = 'R';
+        boolean var_26 = (true ? false : !false) ? false : !true == ! !false;
+        arg_1 %= (var_26 ^= (byte)1101752087 <= (short)arg_1) ? arg_1 : (float)1882235314;
+        var_25 = var_25;
+        if (var_26 &= var_26)
+        {
+            var_13 = "".startsWith("vp", - ((byte)2040501187) ^ (byte)-3921263616446438400L) ? "gam".charAt(+ ((byte)arg_1)) : (var_13 = 'H');
+            arg_1 /= var_26 | ! (var_26 ^ (byte)arg_0 <= (var_13 = 'r') | (var_26 |= var_26)) ? 'N' : ~8963227563301903360L;
+        }
+        else
+        {
+            var_13 = 'l';
+            var_25 = (var_25 = var_25);
+        }
+        arg_1 += (byte)(("m".substring(837996717, 861903057).startsWith("vwpky", (var_13 = 'Z') % (byte)arg_1) ? !false ^ !var_26 : var_26) ? (byte)arg_1 : ((var_26 | var_26) ^ !false ? (short)'U' : (short)'d'));
+        ((1.3445538E38F < (arg_1 -= 1236356135) ^ (var_26 = true)) & var_26 ? var_25 : (var_25 = var_25)).var_1 = true ? (var_25.var_1 = var_25) : (var_25.var_1 = var_25);
+        var_26 |= - ((byte)251113415) < (short)arg_1 & false & false;
+        arg_1 += (var_26 &= true) ? 7.546147305340402E307 : (true & !var_26 ? (byte)1.5107802154474685E307 : (byte)arg_1);
+        var_25.var_1 = true ? "bqsewhn" : "aojssvan";
+        return (byte)(var_13 = (char)(new short[(byte)46697464])[(byte)var_14]);
+    }
+
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester_Class_2.var_13 = "; result += Tester.Printer.print(var_13);
+        result += "\n";
+        result += "Tester_Class_2.var_14 = "; result += Tester.Printer.print(var_14);
+        result += "\n";
+        result += "Tester_Class_2.var_1 = "; result += Tester.Printer.print(var_1);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+}
+
+public class Tester {
+    static Tester_Class_0 var_28;
+    double var_29 = 4.861846831496217E307;
+    static byte var_30 = 79;
+    static boolean var_31 = false;
+    final byte var_32 = 48;
+
+
+    public short func_0(final byte arg_0, boolean arg_1, final double arg_2)
+    {
+        --var_30;
+        new Tester_Class_2().var_1 = "xdwldeqhc";
+        char var_33 = 'd';
+        return (var_31 = var_30 < (new short[var_30])[var_30]) ? (short)(var_33 >>>= (short)2.3152642E38F) : var_30;
+    }
+
+    private final float func_1(final long arg_0, final Tester_Class_0 arg_1, Tester_Class_0 arg_2, final char arg_3)
+    {
+        {
+            new Tester_Class_0();
+        }
+        var_30 >>= (short)1.1469118780047631E308;
+        var_31 |= var_31;
+        if (true)
+        {
+            Tester_Class_2 var_34 = (var_31 ^= (var_31 ^= false)) ? (Tester_Class_2)arg_1 : (new Tester_Class_2[var_32])[var_30];
+        }
+        else
+        {
+            "shqjwg".compareToIgnoreCase(false ? "gxoyw" + "cx" : "r" + "icj");
+        }
+        ((new Tester_Class_2[var_32])[++var_30]).var_1 = (new Object[var_30][var_32][var_32])[var_30 |= var_32];
+        arg_1.var_1 = (arg_2 = arg_2);
+        arg_1.var_1 = (((new Tester_Class_2[var_30])[var_30 = var_32]).var_1 = new String[var_32]);
+        var_28 = (Tester_Class_2)((arg_2 = arg_2).var_1 = new double[var_30]);
+        arg_2 = arg_1;
+        final boolean var_35 = "qjsdfuyru".endsWith("nuw" + "bne") | arg_3 >= 1.2054153346397785E308;
+        var_31 &= (var_31 ^= var_35);
+        {
+            var_31 &= var_31 ? false : !false;
+        }
+        if (var_31)
+        {
+            var_28 = (new Tester_Class_2[var_32])[var_32];
+        }
+        else
+        {
+            arg_1.equals((new Object[var_32])[var_32]);
+        }
+        ((var_31 ^= true) ? "x" : "euc").substring(+ (var_30 ^= var_30) & (byte)(new short[var_30])[var_30 /= 4.220757896697652E307]);
+        arg_2 = var_31 ? (Tester_Class_2)arg_1 : (Tester_Class_2)arg_2;
+        arg_2 = (Tester_Class_2)(new Object[var_32][var_32])[var_30][var_32];
+        return 9.932983E36F * (Tester_Class_2.var_13 = arg_3);
+    }
+
+    public int func_2(Tester_Class_0 arg_0)
+    {
+        "ptwusxrxn".indexOf("v");
+        var_30 |= 1770666843;
+        var_29 += (short)(Tester_Class_2.var_14 / Tester_Class_2.var_14);
+        if (var_31)
+        {
+            var_30 = var_32;
+        }
+        else
+        {
+            double var_36;
+        }
+        if (true)
+        {
+            var_30 -= 2.1474216E38F;
+        }
+        else
+        {
+            var_29 += 'f';
+        }
+        var_29 -= Tester_Class_2.var_14;
+        if (false)
+        {
+            arg_0.var_1 = arg_0;
+        }
+        else
+        {
+            arg_0 = (var_28 = (var_28 = arg_0));
+        }
+        {
+            Tester_Class_2.var_13 = 'p';
+        }
+        var_29 = ~Tester_Class_2.var_14 % 'y';
+        switch (var_30 >>>= var_30)
+        {
+            case 115:
+
+        }
+        arg_0 = arg_0;
+        var_31 ^= (var_31 = true);
+        return "".charAt(~var_32) >> ((var_31 &= true) ? var_30 : var_32);
+    }
+
+    protected double func_3(boolean[] arg_0, double arg_1, long[][] arg_2)
+    {
+        switch (var_31 ? (short)(var_32 / (arg_1 /= (int)(arg_1 *= (Tester_Class_2.var_13 = ']')))) : (var_30 ^= + +Tester_Class_2.var_14 * (+ +3075166460237931520L / '[')))
+        {
+            case 31:
+
+            case 118:
+
+        }
+        Tester_Class_2.var_13 = 'm';
+        "mwkh".indexOf("hdgiquve", (new char[var_32])[var_30 &= 'S'] % var_30);
+        final boolean var_37 = false;
+        char var_38 = 'F';
+        var_28 = (new Tester_Class_2[var_30][var_30])[var_30 *= var_38][var_32];
+        new Tester_Class_0().var_1 = new char[var_32][var_30];
+        var_30 &= var_30;
+        var_31 |= (var_31 |= true);
+        int var_39 = 1769831681;
+        final Tester_Class_2 var_40 = (var_31 |= false ? var_31 : var_37) ? (Tester_Class_2)((new Object[var_30][var_30][var_32])[var_30 <<= var_30])[var_30][var_30++] : (Tester_Class_2)new Tester_Class_0();
+        var_30 -= +var_30;
+        "dvmuim".replaceFirst("clmisuxu", "".toLowerCase() + "xi");
+        var_39 = var_38 - (short)585806817;
+        arg_1 += (double)(short)(6.4329855E37F / var_32 * (var_38 += 'w'));
+        ++var_39;
+        var_40.var_1 = (var_28 = (var_28 = var_40));
+        var_29 /= 3.5705444317400964E306;
+        Tester_Interface_1 var_41;
+        return arg_1;
+    }
+
+    final char func_4(final long arg_0, int arg_1, final int arg_2)
+    {
+        {
+            Tester_Class_2.var_13 = 'D';
+            var_31 = false;
+        }
+        if (var_31)
+        {
+            var_30--;
+            Tester_Class_0 var_42 = var_28 = (new Tester_Class_0[var_32])[var_32];
+        }
+        else
+        {
+            Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'H');
+        }
+        var_28 = (Tester_Class_2)(new Tester_Class_2().var_1 = (var_28 = (new Tester_Class_0[var_30])[var_30]));
+        arg_1 &= var_32;
+        --var_30;
+        return Tester_Class_2.var_13 = 'n';
+    }
+
+    final static Object func_5()
+    {
+        var_28 = (Tester_Class_2)(! (var_31 |= true & var_31) ? (new Tester_Class_0[var_30])[var_30] : (var_28 = (new Tester_Class_0[var_30])[var_30]));
+        var_31 |= false;
+        return var_31 ? (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = (new Tester_Class_0[var_30 /= 1366944127])[var_30]) : (new Tester_Class_0[var_30][var_30])[var_30 += 1.4070924450257891E307][var_30];
+    }
+
+    static Tester_Class_2 func_6(final Object arg_0)
+    {
+        var_28 = (var_31 ^= true) ? (Tester_Class_2)arg_0 : (Tester_Class_2)arg_0;
+        ((new Tester[--var_30])[var_30]).var_29 -= -3.0029087E38F * (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k'));
+        var_28 = (Tester_Class_2)(var_28 = (var_28 = (var_28 = (Tester_Class_0)arg_0)));
+        return false ? new Tester_Class_2() : new Tester_Class_2();
+    }
+
+    private static Tester_Interface_1 func_7(byte arg_0, Tester_Class_2 arg_1, final int arg_2, char arg_3)
+    {
+        {
+            var_31 = var_31;
+            var_31 |= (var_31 &= (var_31 |= !true));
+            arg_0 += Tester_Class_2.var_14;
+        }
+        var_30 = (var_30 *= ((new Tester[arg_0 ^= 1039546367])[arg_0]).var_32);
+        arg_1.var_1 = (var_31 ^= (var_31 &= !var_31 && !var_31)) ? (arg_1 = (arg_1 = arg_1)) : (new Tester_Class_0[arg_0++][arg_0])[arg_0][arg_0];
+        arg_1.var_1 = var_31 ? "jpmg" : "epwvupaqp";
+        var_28 = arg_1;
+        if (false)
+        {
+            arg_1 = arg_1;
+        }
+        else
+        {
+            arg_3 += var_30 % -9.298157E37F;
+        }
+        arg_1.var_1 = ((var_28 = (var_28 = arg_1)).var_1 = ((var_28 = arg_1).var_1 = "rlmf"));
+        var_28 = (arg_1 = arg_1);
+        arg_1 = arg_1;
+        {
+            var_31 = true;
+        }
+        (arg_1 = arg_1).var_1 = (arg_1.var_1 = (arg_1 = arg_1));
+        final short[] var_43 = new short[(var_31 &= false) ? arg_0 : var_30];
+        final short var_44 = 18087;
+        return false ? (new Tester_Interface_1[var_30 %= Tester_Class_2.var_14])[arg_0 -= 8.913955E37F * +arg_0] : (new Tester_Interface_1[var_30])[var_30];
+    }
+
+    private static float func_8(final Object[] arg_0, final byte arg_1, Tester_Class_0[] arg_2)
+    {
+        ((new Tester_Class_2[var_30 /= -2.37832E38F])[((new Tester[arg_1])[(new byte[arg_1])[arg_1]]).var_32]).var_1 = new Tester_Interface_1[arg_1];
+        if (var_31)
+        {
+            var_28 = (Tester_Class_2)(var_28 = arg_2[var_30]);
+        }
+        else
+        {
+            var_30 -= Tester_Class_2.var_14;
+            final int var_45 = 1864933386;
+            final Tester_Class_0 var_46 = var_28 = (new Tester_Class_2[arg_1][var_30 |= Tester_Class_2.var_14])[((new Tester[arg_1][var_30])[var_30][var_30]).var_32][arg_1];
+            var_31 &= (var_31 ^= false);
+            var_30 += (false ? 2.7581227E37F : + +1.8832631E38F) * ('P' * -1.9479086E38F);
+        }
+        (var_28 = (Tester_Class_2)arg_2[arg_1]).var_1 = (new Tester_Class_2[var_30][arg_1][arg_1])[arg_1];
+        ++var_30;
+        (var_28 = (new Tester_Class_2[var_30])[arg_1]).var_1 = false ? (new Tester_Class_0[var_30][var_30])[var_30][arg_1] : arg_2[var_30];
+        var_31 |= false;
+        ((new Tester[arg_1][var_30 >>>= (char)1981599])[arg_1][arg_1]).var_29 = false ^ (var_31 = var_31) ? (Tester_Class_2.var_13 = "nes".charAt(1080898679)) : - (var_30 %= 'n') ^ arg_1;
+        {
+            ((new Tester[arg_1])[var_30]).var_29 = (short)(Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'h'));
+        }
+        Tester_Class_2.var_13 = 'j';
+        ((new Tester_Class_2[arg_1])[var_30]).var_1 = new byte[var_30];
+        var_31 ^= (var_31 ^= !false);
+        "wcbi".toString();
+        final byte var_47 = var_30;
+        if (true)
+        {
+            "mpbkilw".substring(199662864);
+        }
+        else
+        {
+            var_30++;
+        }
+        Tester_Class_2.var_13 = '`';
+        "yujypq".indexOf("crve" + "inmvh", false ? ~arg_1 : "vukbkc".charAt(528096652));
+        Tester_Class_2 var_48 = (Tester_Class_2)((!var_31 & (var_31 ^= false ^ !true) ? false | !true : false) ? (var_28 = (Tester_Class_2)arg_0[var_30]) : (new Tester_Class_2[arg_1])[var_30]);
+        return (float)(var_31 ^ var_31 ? (var_30 ^= (short)((new Tester[var_30])[var_30]).var_29) : (var_30 /= - -5.917837279005691E307 - - +3.2004715720509636E306));
+    }
+
+    final Tester_Class_0 func_9()
+    {
+        var_30 += -3531557622894482432L / ~var_30;
+        var_28 = (var_28 = (new Tester_Class_2[var_30 += + -7.0203367E37F])[var_30]);
+        var_31 ^= ! !false ^ false;
+        if (true)
+        {
+            byte[] var_49;
+            var_31 &= true;
+            short var_50 = 14869;
+        }
+        else
+        {
+            (((new Tester[var_32][var_30][var_32])[var_30])[var_32][var_30]).var_29 *= 'h';
+        }
+        final int var_51 = false ? +var_32 >>> ~var_30 : --var_30;
+        var_31 |= false;
+        return (new Tester_Class_0[var_32][var_32])[var_30][var_30];
+    }
+
+    public static Object func_10()
+    {
+        Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'O');
+        return ((Tester_Class_2)(new Object[--var_30])[var_30]).var_1 = (((Tester_Class_2)(new Object[var_30])[var_30]).var_1 = "iu");
+    }
+
+    protected byte func_11(final Tester_Interface_1[] arg_0)
+    {
+        {
+            --var_30;
+            var_29 *= (short)1749707986816114688L;
+            var_31 = (var_31 = (var_31 |= var_31));
+            var_30 -= 6.4575257E37F;
+        }
+        var_28 = (var_28 = func_9());
+        Tester_Class_2.var_13 = 'b';
+        var_30--;
+        var_28 = (var_28 = (var_28 = (var_28 = (Tester_Class_2)func_10())));
+        var_28 = (new Tester_Class_2[var_32])[var_30];
+        char var_52 = (var_31 = false) ? (char)+ +Tester_Class_2.var_14 : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = '_'));
+        if (false)
+        {
+            var_30 += (short)(var_32 + 840104459);
+        }
+        else
+        {
+            var_29 /= 2.5320765E38F;
+        }
+        if (true)
+        {
+            var_30 %= 379977167934025728L;
+        }
+        else
+        {
+            var_52 = var_52;
+        }
+        var_30 >>= ('A' ^ --var_30) & 'H';
+        Tester_Class_2 var_53;
+        final int var_54 = 771623383;
+        var_29 %= (+1.938582E37F - 'G') * ++var_30;
+        int var_55 = (short)6.234053079170724E306 - (int)'^' / ((var_31 &= (var_31 ^= var_31)) ? (short)var_30 : ++var_30);
+        var_55 >>>= var_55 / ~6865244393150017536L;
+        var_31 ^= !false;
+        return var_30 >>>= 4351766607072508928L >> func_0(var_32, var_31, 1.021781609675458E308);
+    }
+
+    public static String execute()
+    {
+        try {
+            Tester t = new Tester();
+            try { t.test(); }
+            catch(Throwable e) { }
+            try { return t.toString(); }
+            catch (Throwable e) { return "Error during result conversion to String"; }
+        } catch (Throwable e) { return "Error during test execution"; }
+    }
+
+    public static void main(String[] args)
+    {
+        try {
+            Tester t = new Tester();
+            try { t.test(); }
+            catch(Throwable e) { }
+            try { System.out.println(t); }
+            catch(Throwable e) { }
+        } catch (Throwable e) { }
+    }
+
+    private void test()
+    {
+        {
+            ((Tester_Class_2)(Tester_Class_0)((var_31 = true) ^ (var_31 |= false & true) ? func_10() : new Tester_Class_2[var_32])).var_1 = ((var_28 = new Tester_Class_0()).var_1 = (new Tester_Class_0().var_1 = new Tester_Class_2()));
+        }
+        new String();
+        Tester_Class_2.var_13 = '[';
+        var_28 = (Tester_Class_2)(((var_31 ^= true) ? func_9() : new Tester_Class_0()).var_1 = new Tester_Class_2());
+        var_28 = new Tester_Class_0();
+        new String();
+        {
+            if ((new boolean[var_30])[var_30] & 732877932 == 1.4654316E38F & "xpqy".replace(']', 'f').startsWith("pqrqunvfx") ? ((var_31 ^= (var_31 &= var_31)) ? !var_31 : (var_31 &= true)) : var_31)
+            {
+                var_31 &= var_31;
+            }
+            else
+            {
+                func_2(var_28 = new Tester_Class_0());
+            }
+            {
+                ((new Tester_Class_0[var_30][var_30])[var_30][var_30]).var_1 = "uwrbjvl";
+                var_28 = (Tester_Class_0)func_5();
+            }
+            Tester_Class_2.var_13 = 's';
+            Tester_Class_0 var_56 = var_28 = true ? func_6(func_5()) : (new Tester_Class_2[var_30][var_32])[var_32][var_32];
+            double var_57 = 0;
+            var_29 += 1024895641427426304L % ~ ~Tester_Class_2.var_14;
+            while ((true || (var_31 = var_31)) && var_57 < 12)
+            {
+                (false & !false ? var_56 : (var_56 = var_56)).var_1 = "vbc";
+                var_57++;
+                var_29 += func_0(var_30 /= (short)var_30 / var_32, false, var_57);
+                (var_31 ? (Tester_Class_2)var_56 : (new Tester_Class_2[var_30])[var_30]).var_1 = new double[var_31 ? (var_30 |= 177265600183083008L) : var_32];
+            }
+            switch (var_31 ^ var_31 | ! (var_31 = false) & (var_31 & false) ? (true ? (short)var_30 : func_0(var_30, true, var_57)) : func_0(var_30, var_31, var_29 /= 2.7203017E38F))
+            {
+                case 23:
+                    var_31 ^= true ? var_31 : var_31;
+                    break;
+
+                case 40:
+
+                default:
+
+                case 104:
+
+            }
+            Object var_58 = (var_31 ^= (var_31 ^= false) | (~3392263608888292352L < 1681682009 | var_31)) ? (((new Tester_Class_2[Tester_Class_2.func_5(Tester_Class_2.var_14, 3.3507317E38F, var_57)])[var_30 %= var_32]).var_1 = (var_56 = (Tester_Class_0)func_5())) : func_5();
+            (var_56 = (var_28 = (var_56 = func_6(var_58)))).var_1 = (((new Tester_Class_2[var_30])[var_30]).var_1 = new float[(byte)Tester_Class_2.var_14][var_32]);
+            new Tester_Class_2().var_1 = new double[var_30];
+            final Tester_Class_0 var_59 = var_28 = (!false & (false || (var_31 && !var_31) & false) ? var_31 : (var_31 |= !var_31)) ? (Tester_Class_2)(var_28 = new Tester_Class_2()) : (false ? new Tester_Class_2() : (Tester_Class_2)var_58);
+        }
+        var_30--;
+        {
+            var_29 += ~func_11(((new Tester_Interface_1[var_32][var_30][var_32])[var_30 ^= var_30])[var_32]);
+        }
+        float var_60 = 0F;
+        double var_61 = var_29;
+        do
+        {
+            long var_62;
+            var_60++;
+            "vcs".offsetByCodePoints((short)('w' | (short)var_30) & (new short[--var_30])[var_30], ((var_31 |= var_31) ^ (var_31 = var_31) ? var_32 : var_30) - (short)86413218);
+        } while (false && (var_60 < 100 && ((var_31 = false) ? var_31 : (var_31 ^= false)) & var_31));
+        long var_63 = 0L;
+        double var_64 = (var_31 ? (Tester_Class_2.var_13 = 'V') : 'e') - (var_29 = 'A') * (var_29 = var_30);
+        var_31 &= (short)+ var_30-- + var_30 <= var_60;
+        while (false && (var_63 < 23 && false))
+        {
+            var_30 >>= func_0(var_30, var_31, var_29) ^ ("".endsWith("mecvlajq" + "jhrbf") ? var_30 : (short)var_61);
+            var_63++;
+            var_28 = (Tester_Class_2)(var_28 = new Tester_Class_2());
+            new Tester_Class_0();
+        }
+        double var_65 = 0;
+        var_61 -= var_65;
+        for (((var_31 &= (var_31 ^= var_31)) | var_31 ? new Tester_Class_2() : new Tester_Class_2()).var_1 = ! (var_31 = false) && !var_31 ? func_10() : new Object[var_32][var_32]; var_31 | var_31 && (var_65 < 107 && (false ? !var_31 : (var_31 &= var_31))); var_30 *= Tester_Class_2.var_14)
+        {
+            var_28 = var_30 > (var_31 | true ? (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'k')) : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'r'))) ? (Tester_Class_2)((var_28 = (Tester_Class_0)func_5()).var_1 = func_5()) : new Tester_Class_2();
+            var_65++;
+            var_29 = "efothsl".startsWith("qk") ? 3.2306712E37F : +1.1835607464479516E308;
+            new Tester_Class_2().var_1 = new Tester_Class_0();
+        }
+        double var_66 = 0;
+        func_6(((Tester_Class_2)((true ? (Tester_Class_2)func_10() : (Tester_Class_2)func_9()).var_1 = (var_28 = (Tester_Class_2)func_10()))).var_1 = "");
+        while (false | (new boolean[var_30][var_30])[var_30][var_32] && (var_66 < 104 && false))
+        {
+            ((var_31 ^= !false) ? "" : "slgr").toUpperCase();
+            var_66++;
+            var_28 = func_6(func_9().var_1 = func_10());
+            var_31 |= (var_31 |= true);
+        }
+        Tester_Class_2.var_13 = var_31 ? (Tester_Class_2.var_13 = 'Y') : (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = (Tester_Class_2.var_13 = func_4(var_63, 137999726, 1870981930))));
+        int var_67 = 0;
+        final double var_68 = 9.955130040461458E307;
+        do
+        {
+            "".lastIndexOf(var_32 != (Tester_Class_2.var_13 = 'f') ? (Tester_Class_2.var_13 = 'C') : ~var_30, (char)3.187607E38F + (var_30 /= var_30));
+            var_67++;
+            Tester_Class_2.var_13 = (Tester_Class_2.var_13 = 'B');
+        } while (var_67 < 9 && var_31 ^ var_31);
+        int var_69 = 0;
+        (true ? func_6(func_10()) : (Tester_Class_2)func_9()).var_1 = ((var_28 = (var_28 = new Tester_Class_2())).var_1 = (func_6(new Tester_Class_2().var_1 = new Tester_Class_0()).var_1 = (Tester_Class_2)func_9()));
+        do
+        {
+            var_28 = (Tester_Class_2)(var_28 = (Tester_Class_0)(new Tester_Class_2().var_1 = "qs"));
+            var_69++;
+            var_31 ^= var_31;
+        } while (var_69 < 189);
+        (! (var_31 = true) | var_31 ? new Tester_Class_2() : (new Tester_Class_0[var_30])[var_30]).var_1 = (((new Tester_Class_2[var_30 ^= (short)var_30])[var_30]).var_1 = (var_31 ? var_31 : (var_31 |= false)) ? "lfhliyphg" : "impovq");
+        ((var_31 ? var_32 == (short)8901596111720974336L : 220705842 != var_60) ? (new Tester_Class_2[var_30])[var_32] : (new Tester_Class_2[var_30][var_32])[var_30][var_30]).var_1 = (var_28 = ((char)var_30 >= "pngjthlf".lastIndexOf("jjbuojp") & var_31 ? var_31 : var_31) ? (new Tester_Class_2[var_32])[var_30] : func_6(new Tester_Class_2().var_1 = new String[var_32]));
+        Tester_Class_2.var_13 = 'c';
+    }
+    public String toString()
+    {
+        String result =  "[\n";
+        result += "Tester.var_29 = "; result += Printer.print(var_29);
+        result += "\n";
+        result += "Tester.var_30 = "; result += Printer.print(var_30);
+        result += "\n";
+        result += "Tester.var_32 = "; result += Printer.print(var_32);
+        result += "\n";
+        result += "Tester.var_31 = "; result += Printer.print(var_31);
+        result += "\n";
+        result += "Tester.var_28 = "; result += Printer.print(var_28);
+        result += "";
+        result += "\n]";
+        return result;
+    }
+    static class Printer
+    {
+        public static String print(boolean arg) { return String.valueOf(arg); }
+        public static String print(byte arg)    { return String.valueOf(arg); }
+        public static String print(short arg)   { return String.valueOf(arg); }
+        public static String print(char arg)    { return String.valueOf((int)arg); }
+        public static String print(int arg)     { return String.valueOf(arg); }
+        public static String print(long arg)    { return String.valueOf(arg); }
+        public static String print(float arg)   { return String.valueOf(arg); }
+        public static String print(double arg)  { return String.valueOf(arg); }
+
+
+        public static String print(Object arg)
+        {
+            return print_r(new java.util.Stack(), arg);
+        }
+
+        private static String print_r(java.util.Stack visitedObjects, Object arg)
+        {
+            String result = "";
+            if (arg == null)
+                result += "null";
+            else
+            if (arg.getClass().isArray())
+            {
+                for (int i = 0; i < visitedObjects.size(); i++)
+                    if (visitedObjects.elementAt(i) == arg) return "<recursive>";
+
+                visitedObjects.push(arg);
+
+                final String delimiter = ", ";
+                result += "[";
+
+                if (arg instanceof Object[])
+                {
+                    Object[] array = (Object[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print_r(visitedObjects, array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof boolean[])
+                {
+                    boolean[] array = (boolean[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof byte[])
+                {
+                    byte[] array = (byte[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof short[])
+                {
+                    short[] array = (short[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof char[])
+                {
+                    char[] array = (char[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof int[])
+                {
+                     int[] array = (int[]) arg;
+                     for (int i = 0; i < array.length; i++)
+                     {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                     }
+                }
+                else
+                if (arg instanceof long[])
+                {
+                    long[] array = (long[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof float[])
+                {
+                    float[] array = (float[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+                else
+                if (arg instanceof double[])
+                {
+                    double[] array = (double[]) arg;
+                    for (int i = 0; i < array.length; i++)
+                    {
+                        result += print(array[i]);
+                        if (i < array.length - 1) result += delimiter;
+                    }
+                }
+
+                result += "]";
+                visitedObjects.pop();
+
+            } else
+            {
+                result += arg.toString();
+            }
+
+            return result;
+        }
+    }
+}
+
+
--- a/jaxp/.hgtags	Wed Jul 05 16:38:26 2017 +0200
+++ b/jaxp/.hgtags	Wed Jul 05 16:39:00 2017 +0200
@@ -4,3 +4,4 @@
 bafed478d67c3acf7744aaad88b9404261ea6739 jdk7-b27
 b996318955c0ad8e9fa0ffb56c74f626786e863f jdk7-b28
 617ee8607cfd5fd81f233f3c0b690f85084687a0 jdk7-b29
+2d94a238a1641d074e6032dcdceed461d6f85d6a jdk7-b30
--- a/jaxws/.hgtags	Wed Jul 05 16:38:26 2017 +0200
+++ b/jaxws/.hgtags	Wed Jul 05 16:39:00 2017 +0200
@@ -4,3 +4,4 @@
 27d8f42862c11b4ddc4af2dd2d2a3cd86cda04c2 jdk7-b27
 eefcd5204500a11d6aa802dca9f961cf10ab64c2 jdk7-b28
 836c55713abab186e4de0c6eabd06ff008c7b8d0 jdk7-b29
+7f2466f8cc7009702e548d1a763254f546024d7e jdk7-b30
--- a/jdk/.hgtags	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/.hgtags	Wed Jul 05 16:39:00 2017 +0200
@@ -4,3 +4,4 @@
 3e599d98875ddf919c8ea11cff9b3a99ba631a9b jdk7-b27
 02e4c5348592a8d7fc2cba28bc5f8e35c0e17277 jdk7-b28
 e21f4266466cd1306b176aaa08b2cd8337a9be3d jdk7-b29
+b6d6877c1155621a175dccd12dc14c54f938fb8b jdk7-b30
--- a/jdk/make/common/shared/Platform.gmk	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/make/common/shared/Platform.gmk	Wed Jul 05 16:39:00 2017 +0200
@@ -72,7 +72,6 @@
 #     ISA_DIR                     solaris only: /sparcv9 or /amd64
 #     LIBARCH32                   solaris only: sparc or i386
 #     LIBARCH64                   solaris only: sparcv9 or amd64
-#     REQUIRED_WINDOWS_NAME       windows only: basic name of windows 
 #     REQUIRED_WINDOWS_VERSION    windows only: specific version of windows 
 #     USING_CYGWIN                windows only: true or false
 #     WINDOWS_NT_VERSION_STRING   windows only: long version name
@@ -311,19 +310,11 @@
     endif
   endif
   export ARCH_DATA_MODEL
-  # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel
-  ARCH=i586
-  LIBARCH=i386
-  # Value of Java os.arch property
-  ARCHPROP=x86
-  REQUIRED_WINDOWS_NAME=Windows Professional 2000
-  REQUIRED_WINDOWS_VERSION=5 0 Service Pack 4
   ifeq ($(ARCH_DATA_MODEL), 64)
     # If the user wants to perform a cross compile build then they must
     # - set ARCH_DATA_MODEL=64 and either
     #      + set ARCH to ia64 or amd64, or
-    REQUIRED_WINDOWS_NAME=Windows Server 2003
-    REQUIRED_WINDOWS_VERSION=5 2 Service Pack 1
+    REQUIRED_WINDOWS_VERSION=Server 2003 Enterprise x64 Edition
     ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)), AMD64)
       ARCH=amd64
     else
@@ -332,6 +323,14 @@
     LIBARCH=$(ARCH)
     # Value of Java os.arch property
     ARCHPROP=$(LIBARCH)
+  else
+    REQUIRED_WINDOWS_VERSION=2000 or Unknown
+    #REQUIRED_WINDOWS_VERSION=XP Professional
+    # LIBARCH is used to preserve the jre/lib/i386 directory name for 32-bit intel
+    ARCH=i586
+    LIBARCH=i386
+    # Value of Java os.arch property
+    ARCHPROP=x86
   endif
   ARCH_FAMILY = $(ARCH)
   # Where is unwanted output to be delivered?
--- a/jdk/make/common/shared/Sanity.gmk	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/make/common/shared/Sanity.gmk	Wed Jul 05 16:39:00 2017 +0200
@@ -82,15 +82,16 @@
 endif
 
 ifeq ($(PLATFORM), windows)
-  WINVER=$(JDK_TOPDIR)/make/tools/winver/bin/winver.exe
   FREE_SPACE := $(shell $(DF) -kP $(OUTPUTDIR) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
   TEMP_FREE_SPACE := $(shell $(DF) -kP $(TEMP_DISK) | $(TAIL) -1 | $(NAWK) '{print $$4;}')
-  WINDOWS_VERSION := $(shell \
-      if [ -x $(WINVER) ]; then \
-	$(WINVER) ; \
-      else \
-	$(ECHO) "Unknown Windows Version"; \
-      fi)
+  # Localized systeminfo has localized labels, but not localized values.
+  _WINDOWS_VERSION := \
+    $(shell systeminfo 2> $(DEV_NULL) | grep 'Microsoft' | grep 'Windows' | \
+	 cut -d':' -f2)
+  ifeq ($(_WINDOWS_VERSION),)
+    _WINDOWS_VERSION := Windows 2000 or Unknown (no systeminfo utility)
+  endif
+  WINDOWS_VERSION := $(strip $(_WINDOWS_VERSION))
   DXSDK_VER := $(shell $(EGREP) DIRECTDRAW_VERSION $(DXSDK_INCLUDE_PATH)/ddraw.h 2>&1 | \
     $(EGREP) "\#define" | $(NAWK) '{print $$3}')
 endif
@@ -264,9 +265,9 @@
 	    "" >> $(WARNING_FILE) ; \
 	fi
   ifeq ($(PLATFORM), windows)
-	@if [ "$(WINDOWS_VERSION)" != "$(REQUIRED_WINDOWS_VERSION)" ]; then \
-	    $(ECHO) "WARNING: $(YOU_ARE_USING) an unsupported version of $(REQUIRED_WINDOWS_NAME). \n" \
-	      "        The supported version is $(REQUIRED_WINDOWS_NAME) $(REQUIRED_WINDOWS_VERSION). \n" \
+	@if [ "$(findstring $(REQUIRED_WINDOWS_VERSION),$(WINDOWS_VERSION))" = "" ]; then \
+	    $(ECHO) "WARNING: $(YOU_ARE_USING) an unknown version of Windows. \n" \
+	      "        The required version is $(REQUIRED_WINDOWS_VERSION). \n" \
 	      "        $(YOU_ARE_USING) $(WINDOWS_VERSION) \n" \
 	      "" >> $(WARNING_FILE) ; \
 	fi
--- a/jdk/make/tools/Makefile	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/make/tools/Makefile	Wed Jul 05 16:39:00 2017 +0200
@@ -51,7 +51,6 @@
   jdwpgen                   \
   makeclasslist             \
   strip_properties          \
-  winver                    \
   CharsetMapping
 
 all build clean clobber::
--- a/jdk/make/tools/winver/Makefile	Wed Jul 05 16:38:26 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-#
-# Copyright 1998-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.  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.
-#
-
-#
-# Makefile for building the winver tool
-#
-
-BUILDDIR = ../..
-PRODUCT = tools
-PROGRAM = winver
-include $(BUILDDIR)/common/Defs.gmk
-
-build: permissions
-
-permissions:
-ifeq ($(PLATFORM),windows)
-	$(CHMOD) a+x bin/winver.exe
-endif
-
-#
-# Rules.
-#
-include $(BUILDDIR)/common/Rules.gmk
-
-.PHONY: permissions
-
Binary file jdk/make/tools/winver/bin/winver.exe has changed
--- a/jdk/make/tools/winver/src/StdAfx.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright 2001 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.
- */
-
-// stdafx.cpp : source file that includes just the standard includes
-//      getver.pch will be the pre-compiled header
-//      stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
-
-// TODO: reference any additional headers you need in STDAFX.H
-// and not in this file
--- a/jdk/make/tools/winver/src/StdAfx.h	Wed Jul 05 16:38:26 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Copyright 2001 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.
- */
-
-// stdafx.h : include file for standard system include files,
-//  or project specific include files that are used frequently, but
-//      are changed infrequently
-//
-
-#if !defined(AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_)
-#define AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
-
-#include <stdio.h>
-
-// TODO: reference additional headers your program requires here
-
-//{{AFX_INSERT_LOCATION}}
-// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
-
-#endif // !defined(AFX_STDAFX_H__C592D6C3_027D_11D5_8DFB_080020C19238__INCLUDED_)
--- a/jdk/make/tools/winver/src/winver.cpp	Wed Jul 05 16:38:26 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * Copyright 2001 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.
- */
-
-// getver.cpp : Defines the entry point for the console application.
-//
-
-#include "stdafx.h"
-#include <windows.h>
-
-int main(int argc, char* argv[])
-{
-        OSVERSIONINFO verInfo;
-
-        memset(&verInfo,0,sizeof(verInfo));
-        verInfo.dwOSVersionInfoSize = sizeof(verInfo);
-
-        if (GetVersionEx(&verInfo))
-        {
-                printf("%d %d %s",verInfo.dwMajorVersion,verInfo.dwMinorVersion,verInfo.szCSDVersion);
-        }
-        else
-        {
-                printf("No version info available");
-        }
-
-        return 0;
-}
--- a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java	Wed Jul 05 16:39:00 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2000-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
@@ -1145,6 +1145,10 @@
                 sharedState.put(NAME, username);
                 sharedState.put(PWD, password);
             }
+        } else {
+            // remove temp results for the next try
+            encKeys = null;
+            principal = null;
         }
         username = null;
         password = null;
--- a/jdk/src/share/classes/java/nio/charset/Charset.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/src/share/classes/java/nio/charset/Charset.java	Wed Jul 05 16:39:00 2017 +0200
@@ -188,21 +188,22 @@
  * <ul>
  *
  *   <li><p> When decoding, the <tt>UTF-16BE</tt> and <tt>UTF-16LE</tt>
- *   charsets ignore byte-order marks; when encoding, they do not write
+ *   charsets interpret the initial byte-order marks as a <small>ZERO-WIDTH
+ *   NON-BREAKING SPACE</small>; when encoding, they do not write
  *   byte-order marks. </p></li>
+
  *
- *   <li><p> When decoding, the <tt>UTF-16</tt> charset interprets a byte-order
- *   mark to indicate the byte order of the stream but defaults to big-endian
- *   if there is no byte-order mark; when encoding, it uses big-endian byte
- *   order and writes a big-endian byte-order mark. </p></li>
+ *   <li><p> When decoding, the <tt>UTF-16</tt> charset interprets the
+ *   byte-order mark at the beginning of the input stream to indicate the
+ *   byte-order of the stream but defaults to big-endian if there is no
+ *   byte-order mark; when encoding, it uses big-endian byte order and writes
+ *   a big-endian byte-order mark. </p></li>
  *
  * </ul>
  *
- * In any case, when a byte-order mark is read at the beginning of a decoding
- * operation it is omitted from the resulting sequence of characters.  Byte
- * order marks occuring after the first element of an input sequence are not
- * omitted since the same code is used to represent <small>ZERO-WIDTH
- * NON-BREAKING SPACE</small>.
+ * In any case, byte order marks occuring after the first element of an
+ * input sequence are not omitted since the same code is used to represent
+ * <small>ZERO-WIDTH NON-BREAKING SPACE</small>.
  *
  * <p> Every instance of the Java virtual machine has a default charset, which
  * may or may not be one of the standard charsets.  The default charset is
--- a/jdk/src/share/classes/sun/nio/ch/Util.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/src/share/classes/sun/nio/ch/Util.java	Wed Jul 05 16:39:00 2017 +0200
@@ -142,11 +142,10 @@
             || ((sel = selWrapper.get()) == null)
             || (sel.provider() != sc.provider())) {
             sel = sc.provider().openSelector();
-            localSelector.set(new SoftReference<SelectorWrapper>(
-                                  new SelectorWrapper(sel)));
-        } else {
-            localSelectorWrapper.set(selWrapper);
+            selWrapper = new SelectorWrapper(sel);
+            localSelector.set(new SoftReference<SelectorWrapper>(selWrapper));
         }
+        localSelectorWrapper.set(selWrapper);
         return sel;
     }
 
--- a/jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java	Wed Jul 05 16:39:00 2017 +0200
@@ -59,7 +59,7 @@
     private int i;
     private NameConstraintsExtension prevNC;
 
-    private static Set<String> supportedExts;
+    private Set<String> supportedExts;
 
     /**
      * Creates a ConstraintsChecker.
--- a/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java	Wed Jul 05 16:39:00 2017 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2000-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
@@ -198,6 +198,11 @@
         X509CertSelector sel = null;
 
         if (currentState.isInitial()) {
+            if (targetCertConstraints.getBasicConstraints() == -2) {
+                // no need to continue: this means we never can match a CA cert
+                return;
+            }
+
             /* This means a CA is the target, so match on same stuff as
              * getMatchingEECerts
              */
--- a/jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java	Wed Jul 05 16:39:00 2017 +0200
@@ -50,7 +50,7 @@
     private CertSelector targetConstraints;
     private int remainingCerts;
 
-    private static Set<String> supportedExts;
+    private Set<String> supportedExts;
 
     /**
      * Default Constructor
--- a/jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java	Wed Jul 05 16:39:00 2017 +0200
@@ -68,7 +68,7 @@
     private int inhibitAnyPolicy;
     private int certIndex;
 
-    private static Set<String> supportedExts;
+    private Set<String> supportedExts;
 
     private static final Debug debug = Debug.getInstance("certpath");
     static final String ANY_POLICY = "2.5.29.32.0";
--- a/jdk/src/windows/native/java/io/io_util_md.c	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/src/windows/native/java/io/io_util_md.c	Wed Jul 05 16:39:00 2017 +0200
@@ -104,23 +104,56 @@
     }
 }
 
+/*
+  The "abpathlen" is the size of the buffer needed by _wfullpath. If the
+  "path" is a relative path, it is "the length of the current dir" + "the
+  length of the path", if it's "absolute" already, it's the same as
+  pathlen which is the length of "path".
+ */
+WCHAR* prefixAbpath(const WCHAR* path, int pathlen, int abpathlen) {
+    WCHAR* pathbuf = NULL;
+    WCHAR* abpath = NULL;
+
+    abpathlen += 10;  //padding
+    abpath = (WCHAR*)malloc(abpathlen * sizeof(WCHAR));
+    if (abpath) {
+        /* Collapse instances of "foo\.." and ensure absoluteness before
+           going down to prefixing.
+        */
+        if (_wfullpath(abpath, path, abpathlen)) {
+            pathbuf = getPrefixed(abpath, abpathlen);
+        } else {
+            /* _wfullpath fails if the pathlength exceeds 32k wchar.
+               Instead of doing more fancy things we simply copy the
+               ps into the return buffer, the subsequent win32 API will
+               probably fail with FileNotFoundException, which is expected
+            */
+            pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
+            if (pathbuf != 0) {
+                wcscpy(pathbuf, path);
+            }
+        }
+        free(abpath);
+    }
+    return pathbuf;
+}
+
 /* If this returns NULL then an exception is pending */
 WCHAR*
 pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE) {
     int pathlen = 0;
     WCHAR *pathbuf = NULL;
-    int max_path = 248;   /* Since CreateDirectoryW() has the limit of
-                             248 instead of the normal MAX_PATH, we
-                             use 248 as the max_path to satisfy both
-                           */
+    int max_path = 248; /* CreateDirectoryW() has the limit of 248 */
+
     WITH_UNICODE_STRING(env, path, ps) {
         pathlen = wcslen(ps);
         if (pathlen != 0) {
             if (pathlen > 2 &&
                 (ps[0] == L'\\' && ps[1] == L'\\' ||   //UNC
-                 ps[1] == L':' && ps[2] == L'\\')) {   //absolute
+                 ps[1] == L':' && ps[2] == L'\\'))     //absolute
+            {
                  if (pathlen > max_path - 1) {
-                     pathbuf = getPrefixed(ps, pathlen);
+                     pathbuf = prefixAbpath(ps, pathlen, pathlen);
                  } else {
                      pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
                      if (pathbuf != 0) {
@@ -132,7 +165,7 @@
                    its absolute form is bigger than max_path or not, if yes
                    need to (1)convert it to absolute and (2)prefix. This is
                    obviously a burden to all relative paths (The current dir/len
-                   for "dirve & directory" relative path is cached, so we only
+                   for "drive & directory" relative path is cached, so we only
                    calculate it once but for "drive-relative path we call
                    _wgetdcwd() and wcslen() everytime), but a hit we have
                    to take if we want to support relative path beyond max_path.
@@ -143,24 +176,7 @@
                 WCHAR *abpath = NULL;
                 int dirlen = currentDirLength(ps, pathlen);
                 if (dirlen + pathlen + 1 > max_path - 1) {
-                    int abpathlen = dirlen + pathlen + 10;
-                    abpath = (WCHAR*)malloc(abpathlen * sizeof(WCHAR));
-                    if (abpath) {
-                        if (_wfullpath(abpath, ps, abpathlen)) {
-                            pathbuf = getPrefixed(abpath, abpathlen);
-                        } else {
-                            /* _wfullpath fails if the pathlength exceeds 32k wchar.
-                               Instead of doing more fancy things we simply copy the
-                               ps into the return buffer, the subsequent win32 API will
-                               probably fail with FileNotFoundException, which is expected
-                             */
-                            pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
-                            if (pathbuf != 0) {
-                                wcscpy(pathbuf, ps);
-                            }
-                        }
-                        free(abpath);
-                    }
+                    pathbuf = prefixAbpath(ps, pathlen, dirlen + pathlen);
                 } else {
                     pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
                     if (pathbuf != 0) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/io/File/MaxPath.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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 6481955
+   @summary Path length less than MAX_PATH (260) works on Windows
+ */
+
+import java.io.*;
+
+public class MaxPath {
+    public static void main(String[] args) throws Exception {
+        String osName = System.getProperty("os.name");
+        if (!osName.startsWith("Windows")) {
+            return;
+        }
+        int MAX_PATH = 260;
+        String dir = new File(".").getAbsolutePath() + "\\";
+        String padding = "1234567890123456789012345678901234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890012345678900123456789001234567890";
+        for (int i = 240 - dir.length(); i < MAX_PATH - dir.length(); i++) {
+            String longname = dir + padding.substring(0, i);
+            try {
+                File f = new File(longname);
+                if (f.createNewFile()) {
+                    if (!f.exists() || !f.canRead()) {
+                        throw new RuntimeException("Failed at length: " + longname.length());
+                    }
+                    f.delete();
+                }
+            } catch (IOException e) {
+                System.out.println("Failed at length: " + longname.length());
+                throw e;
+            }
+        }
+    }
+}
--- a/jdk/test/java/nio/channels/FileChannel/LongTransferTest.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/jdk/test/java/nio/channels/FileChannel/LongTransferTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -22,7 +22,7 @@
  */
 
 /* @test
-   @bug 5105464 6269047
+   @bug 5105464 6269047 6541631
  * @summary Test to transfer bytes with a size bigger than Integer.MAX_VALUE
  */
 
@@ -81,8 +81,10 @@
         System.out.println("LongTransferTest-main: OK!");
 
         socket.close();
+        server.close();
 
-        server.close();
+        inChannel.close();
+        outChannel.close();
 
         inFile.delete();
         outFile.delete();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,79 @@
+/*
+ * 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 6714842
+ * @library ../../../testlibrary
+ * @build CertUtils
+ * @run main BuildEEBasicConstraints
+ * @summary make sure a PKIX CertPathBuilder builds a path to an
+ *      end entity certificate when the setBasicConstraints method of the
+ *      X509CertSelector of the targetConstraints PKIXBuilderParameters
+ *      parameter is set to -2.
+ */
+
+import java.security.cert.Certificate;
+import java.security.cert.CertPath;
+import java.security.cert.CertStore;
+import java.security.cert.CollectionCertStoreParameters;
+import java.security.cert.PKIXBuilderParameters;
+import java.security.cert.PKIXCertPathBuilderResult;
+import java.security.cert.TrustAnchor;
+import java.security.cert.X509Certificate;
+import java.security.cert.X509CertSelector;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class BuildEEBasicConstraints {
+
+    public static void main(String[] args) throws Exception {
+
+        X509Certificate rootCert = CertUtils.getCertFromFile("anchor.cer");
+        TrustAnchor anchor = new TrustAnchor
+            (rootCert.getSubjectX500Principal(), rootCert.getPublicKey(), null);
+        X509CertSelector sel = new X509CertSelector();
+        sel.setBasicConstraints(-2);
+        PKIXBuilderParameters params = new PKIXBuilderParameters
+            (Collections.singleton(anchor), sel);
+        params.setRevocationEnabled(false);
+        X509Certificate eeCert = CertUtils.getCertFromFile("ee.cer");
+        X509Certificate caCert = CertUtils.getCertFromFile("ca.cer");
+        ArrayList<X509Certificate> certs = new ArrayList<X509Certificate>();
+        certs.add(caCert);
+        certs.add(eeCert);
+        CollectionCertStoreParameters ccsp =
+            new CollectionCertStoreParameters(certs);
+        CertStore cs = CertStore.getInstance("Collection", ccsp);
+        params.addCertStore(cs);
+        PKIXCertPathBuilderResult res = CertUtils.build(params);
+        CertPath cp = res.getCertPath();
+        // check that first certificate is an EE cert
+        List<? extends Certificate> certList = cp.getCertificates();
+        X509Certificate cert = (X509Certificate) certList.get(0);
+        if (cert.getBasicConstraints() != -1) {
+            throw new Exception("Target certificate is not an EE certificate");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/anchor.cer	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8 @@
+-----BEGIN CERTIFICATE-----
+MIIBFzCBwgIBATANBgkqhkiG9w0BAQQFADAXMRUwEwYDVQQDEwxUcnVzdCBBbmNo
+b3IwHhcNMDIxMTA3MTE1NzAzWhcNMjIxMTA3MTE1NzAzWjAXMRUwEwYDVQQDEwxU
+cnVzdCBBbmNob3IwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA9uCj12hwDgC1n9go
+0ozQAVMM+DfX0vpKOemyGNp+ycSLfAq3pxBcUKbQhjSRL7YjPkEL8XC6pRLwyEoF
+osWweQIDAQABMA0GCSqGSIb3DQEBBAUAA0EAzZta5M1qbbozj7jWnNyTgB4HUpzv
+4eP0VYQb1pQY1/xEMczaRt+RuoIDnHCq5a1vOiwk6ZbdG6GlJKx9lj0oMQ==
+-----END CERTIFICATE-----
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ca.cer	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,9 @@
+-----BEGIN CERTIFICATE-----
+MIIBSjCB9aADAgECAgECMA0GCSqGSIb3DQEBBAUAMBcxFTATBgNVBAMTDFRydXN0
+IEFuY2hvcjAeFw0wMjExMDcxMTU3MDNaFw0yMjExMDcxMTU3MDNaMA0xCzAJBgNV
+BAMTAkNBMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ8mP3x37PablDfwldGL5G0+
+l9NgMJSdxVNWBg+ySzQNsZklEFCxGfxPQW+EFYfafHbTbmnni2gsgU1mgPBTQDsC
+AwEAAaM2MDQwCwYDVR0PBAQDAgIEMBcGA1UdIAQQMA4wBgYEVR0gADAEBgIqADAM
+BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA0EA9oCyzh0UKmNsKb+KpppbKYs8
+iA8sDm9oDCwyVSXBM46zrP38nRcx3EdKFvGTwbb/Np+lcZALUsKVYQy3rlU+cQ==
+-----END CERTIFICATE-----
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ee.cer	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,9 @@
+-----BEGIN CERTIFICATE-----
+MIIBLTCB2KADAgECAgEDMA0GCSqGSIb3DQEBBAUAMA0xCzAJBgNVBAMTAkNBMB4X
+DTAyMTEwNzExNTcwM1oXDTIyMTEwNzExNTcwM1owFTETMBEGA1UEAxMKRW5kIEVu
+dGl0eTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDVBDfF+uBr5s5jzzDs1njKlZNt
+h8hHzEt3ASh67Peos+QrDzgpUyFXT6fdW2h7iPf0ifjM8eW2xa+3EnPjjU5jAgMB
+AAGjGzAZMBcGA1UdIAQQMA4wBgYEVR0gADAEBgIqADANBgkqhkiG9w0BAQQFAANB
+AFo//WOboCNOCcA1fvcWW9oc4MvV8ZPvFIAbyEbgyFd4id5lGDTRbRPvvNZRvdsN
+NM2gXYr+f87NHIXc9EF3pzw=
+-----END CERTIFICATE-----
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/BufferUnderflowEUCTWTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,64 @@
+/*
+ * 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 4834154
+   @summary Decode a file using EUC-TW, test for decode errors
+ */
+
+/*
+ * Tests for decode errors in NIO EUC-TW decoder. 4734607 details
+ * decoding errors which occur when the input file > 8k in size
+ * and contains numerous US-ASCII range chars
+ */
+
+import java.io.*;
+
+public class BufferUnderflowEUCTWTest {
+    private static int BUFFERSIZE = 8194;
+
+    public static void main (String[] args) throws Exception {
+        int i = 0;
+        byte[] b = new byte[BUFFERSIZE];
+
+        for (; i < BUFFERSIZE - 4; i++) // pad with zeroes
+            b[i] = 0;
+
+        // Overspill a valid EUC-TW 4 byte sequence between 2
+        // successive input buffers.
+        b[i++] = (byte)0x8E;
+        b[i++] = (byte)0xA2;
+        b[i++] = (byte)0xA1;
+        b[i++] = (byte)0xA6;
+
+        ByteArrayInputStream r = new ByteArrayInputStream(b);
+
+        try {
+            InputStreamReader isr=new InputStreamReader(r, "EUC-TW");
+            char[] cc = new char[BUFFERSIZE];
+            int cx = isr.read(cc);
+        } catch (ArrayIndexOutOfBoundsException e) {
+            throw new Exception("Array Index error: bug 4834154");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/CheckCaseInsensitiveEncAliases.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,99 @@
+/*
+ * 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 4216191 4721369 4807283
+   @summary Test to validate case insensitivity of encoding alias names
+ */
+
+// Fixed since 1.4.0 by virtue of NIO charset lookup mechanism
+// which is by design case insensitive
+
+import java.lang.*;
+import java.io.*;
+
+public class CheckCaseInsensitiveEncAliases
+{
+  public static void main(String args[]) throws Exception
+  {
+    // Try various encoding names in mixed cases
+    // Tests subset of encoding names provided within bugID 4216191
+
+    // Various forms of US-ASCII
+    tryToEncode( "ANSI_X3.4-1968" );
+    tryToEncode( "iso-ir-6" );
+    tryToEncode( "ANSI_X3.4-1986" );
+    tryToEncode( "ISO_646.irv:1991" );
+    tryToEncode( "ASCII" );
+    tryToEncode( "ascii" );
+    tryToEncode( "Ascii" );
+    tryToEncode( "Ascii7" );
+    tryToEncode( "ascii7" );
+    tryToEncode( "ISO646-US" );
+    tryToEncode( "US-ASCII" );
+    tryToEncode( "us-ascii" );
+    tryToEncode( "US-Ascii" );
+    tryToEncode( "us" );
+    tryToEncode( "IBM367" );
+    tryToEncode( "cp367" );
+    tryToEncode( "csASCII" );
+
+    // Variants on Unicode
+    tryToEncode( "Unicode" );
+    tryToEncode( "UNICODE" );
+    tryToEncode( "unicode" );
+
+    // Variants on Big5
+    tryToEncode( "Big5" );
+    tryToEncode( "big5" );
+    tryToEncode( "bIg5" );
+    tryToEncode( "biG5" );
+    tryToEncode( "bIG5" );
+
+    // Variants of Cp1252
+    tryToEncode( "Cp1252" );
+    tryToEncode( "cp1252" );
+    tryToEncode( "CP1252" );
+
+    // Variants of PCK
+    tryToEncode( "pck" );
+    tryToEncode( "Pck" );
+
+  }
+
+
+  public static final String ENCODE_STRING = "Encode me";
+
+  public static void tryToEncode( String encoding) throws Exception
+  {
+    try
+    {
+      byte[] bytes = ENCODE_STRING.getBytes( encoding );
+      System.out.println( "Encoding \"" + encoding + "\" recognized" );
+    }
+    catch( UnsupportedEncodingException e )
+    {
+      throw new Exception("Encoding \"" + encoding + "\" NOT recognized");
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/CheckHistoricalNames.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,313 @@
+/*
+ * 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 4513767 4961027
+   @summary Checks canonical names match between old and (NIO) core charsets
+ */
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+public class CheckHistoricalNames {
+    static int failed = 0;
+    public static void main (String[] args) throws Exception {
+        checkHistoricalName("ASCII");
+        checkHistoricalName("Cp1252");
+        checkHistoricalName("ISO8859_1");
+        checkHistoricalName("UnicodeBigUnmarked");
+        checkHistoricalName("UnicodeLittle");
+        checkHistoricalName("UnicodeLittleUnmarked");
+        checkHistoricalName("UTF8");
+        checkHistoricalName("UTF-16");
+
+        checkMappedName("UnicodeBig", "UTF-16");
+        checkMappedName("US-ASCII", "ASCII");
+        checkMappedName("ISO-8859-1", "ISO8859_1");
+        checkMappedName("UTF-8", "UTF8");
+        checkMappedName("UTF-16BE", "UnicodeBigUnmarked");
+        checkMappedName("UTF-16LE", "UnicodeLittleUnmarked");
+
+        checkHistoricalName("ISO8859_2");
+        checkHistoricalName("ISO8859_4");
+        checkHistoricalName("ISO8859_5");
+        checkHistoricalName("ISO8859_7");
+        checkHistoricalName("ISO8859_9");
+        checkHistoricalName("ISO8859_13");
+        checkHistoricalName("KOI8_R");
+        checkHistoricalName("Cp1250");
+        checkHistoricalName("Cp1251");
+        checkHistoricalName("Cp1253");
+        checkHistoricalName("Cp1254");
+        checkHistoricalName("Cp1257");
+
+        checkMappedName("ISO-8859-2", "ISO8859_2");
+        checkMappedName("ISO-8859-4", "ISO8859_4");
+        checkMappedName("ISO-8859-5", "ISO8859_5");
+        checkMappedName("ISO-8859-7", "ISO8859_7");
+        checkMappedName("ISO-8859-9", "ISO8859_9");
+        checkMappedName("ISO-8859-13", "ISO8859_13");
+        checkMappedName("KOI8-R", "KOI8_R");
+        checkMappedName("windows-1250", "Cp1250");
+        checkMappedName("windows-1251","Cp1251");
+        checkMappedName("windows-1253", "Cp1253");
+        checkMappedName("windows-1254", "Cp1254");
+        checkMappedName("windows-1257", "Cp1257");
+
+        checkHistoricalName("EUC_CN");
+        checkHistoricalName("EUC_JP");
+        checkHistoricalName("EUC_JP_LINUX");
+        checkHistoricalName("EUC_KR");
+        checkHistoricalName("EUC_TW");
+        checkHistoricalName("ISO2022CN");
+        checkHistoricalName("ISO2022JP");
+        checkHistoricalName("ISO2022KR");
+        checkHistoricalName("ISO8859_3");
+        checkHistoricalName("ISO8859_6");
+        checkHistoricalName("ISO8859_8");
+        checkHistoricalName("Cp1255");
+        checkHistoricalName("Cp1256");
+        checkHistoricalName("Cp1258");
+        checkHistoricalName("MS936");
+        checkHistoricalName("MS949");
+        checkHistoricalName("MS950");
+        checkHistoricalName("TIS620");
+
+        checkMappedName("EUC-CN", "EUC_CN");
+        checkMappedName("EUC-JP", "EUC_JP");
+        checkMappedName("EUC-JP-LINUX", "EUC_JP_LINUX");
+        checkMappedName("EUC-TW", "EUC_TW");
+        checkMappedName("EUC-KR", "EUC_KR");
+        checkMappedName("ISO-2022-CN", "ISO2022CN");
+        checkMappedName("ISO-2022-JP", "ISO2022JP");
+        checkMappedName("ISO-2022-KR", "ISO2022KR");
+        checkMappedName("ISO-8859-3", "ISO8859_3");
+        checkMappedName("ISO-8859-6", "ISO8859_6");
+        checkMappedName("ISO-8859-8", "ISO8859_8");
+        checkMappedName("windows-1255", "Cp1255");
+        checkMappedName("windows-1256", "Cp1256");
+        checkMappedName("windows-1258", "Cp1258");
+        checkMappedName("windows-936", "GBK");
+        checkMappedName("windows-949", "MS949");
+        checkMappedName("windows-950", "MS950");
+        checkMappedName("x-MS950-HKSCS", "MS950_HKSCS");
+        checkMappedName("x-PCK", "PCK");
+        checkMappedName("Shift_JIS", "SJIS");
+        checkMappedName("x-JISAutoDetect", "JISAutoDetect");
+        checkMappedName("TIS-620", "TIS620");
+        checkMappedName("x-Big5-Solaris", "Big5_Solaris");
+
+        checkHistoricalName("Cp037");
+        checkHistoricalName("Cp1006");
+        checkHistoricalName("Cp1025");
+        checkHistoricalName("Cp1026");
+        checkHistoricalName("Cp1046");
+        checkHistoricalName("Cp1047");
+        checkHistoricalName("Cp1097");
+        checkHistoricalName("Cp1098");
+        checkHistoricalName("Cp1112");
+        checkHistoricalName("Cp1122");
+        checkHistoricalName("Cp1123");
+        checkHistoricalName("Cp1124");
+        checkHistoricalName("Cp1140");
+        checkHistoricalName("Cp1141");
+        checkHistoricalName("Cp1142");
+        checkHistoricalName("Cp1143");
+        checkHistoricalName("Cp1144");
+        checkHistoricalName("Cp1145");
+        checkHistoricalName("Cp1146");
+        checkHistoricalName("Cp1147");
+        checkHistoricalName("Cp1148");
+        checkHistoricalName("Cp1149");
+        checkHistoricalName("Cp1381");
+        checkHistoricalName("Cp1383");
+        checkHistoricalName("Cp273");
+        checkHistoricalName("Cp277");
+        checkHistoricalName("Cp278");
+        checkHistoricalName("Cp280");
+        checkHistoricalName("Cp284");
+        checkHistoricalName("Cp285");
+        checkHistoricalName("Cp297");
+        checkHistoricalName("Cp33722");
+        checkHistoricalName("Cp420");
+        checkHistoricalName("Cp424");
+        checkHistoricalName("Cp437");
+        checkHistoricalName("Cp500");
+        checkHistoricalName("Cp737");
+        checkHistoricalName("Cp775");
+        checkHistoricalName("Cp838");
+        checkHistoricalName("Cp850");
+        checkHistoricalName("Cp852");
+        checkHistoricalName("Cp855");
+        checkHistoricalName("Cp856");
+        checkHistoricalName("Cp857");
+        checkHistoricalName("Cp858");
+        checkHistoricalName("Cp860");
+        checkHistoricalName("Cp861");
+        checkHistoricalName("Cp862");
+        checkHistoricalName("Cp863");
+        checkHistoricalName("Cp864");
+        checkHistoricalName("Cp865");
+        checkHistoricalName("Cp866");
+        checkHistoricalName("Cp868");
+        checkHistoricalName("Cp869");
+        checkHistoricalName("Cp870");
+        checkHistoricalName("Cp871");
+        checkHistoricalName("Cp874");
+        checkHistoricalName("Cp875");
+        checkHistoricalName("Cp918");
+        checkHistoricalName("Cp921");
+        checkHistoricalName("Cp922");
+        checkHistoricalName("Cp933");
+        checkHistoricalName("Cp939");
+        checkHistoricalName("Cp949");
+        checkHistoricalName("Cp964");
+        checkHistoricalName("Cp970");
+
+        checkMappedName("IBM037", "Cp037");
+        checkMappedName("IBM1006", "Cp1006");
+        checkMappedName("IBM1025", "Cp1025");
+        checkMappedName("IBM1026", "Cp1026");
+        checkMappedName("x-IBM1046", "Cp1046");
+        checkMappedName("IBM1047", "Cp1047");
+        checkMappedName("IBM1097", "Cp1097");
+        checkMappedName("IBM1098", "Cp1098");
+        checkMappedName("IBM1112", "Cp1112");
+        checkMappedName("IBM1122", "Cp1122");
+        checkMappedName("IBM1123", "Cp1123");
+        checkMappedName("IBM1124", "Cp1124");
+        checkMappedName("IBM01140", "Cp1140");
+        checkMappedName("IBM01141", "Cp1141");
+        checkMappedName("IBM01142", "Cp1142");
+        checkMappedName("IBM01143", "Cp1143");
+        checkMappedName("IBM01144", "Cp1144");
+        checkMappedName("IBM01145", "Cp1145");
+        checkMappedName("IBM01146", "Cp1146");
+        checkMappedName("IBM01147", "Cp1147");
+        checkMappedName("IBM01148", "Cp1148");
+        checkMappedName("IBM01149", "Cp1149");
+        checkMappedName("IBM1381", "Cp1381");
+        checkMappedName("IBM1383", "Cp1383");
+        checkMappedName("IBM273", "Cp273");
+        checkMappedName("IBM277", "Cp277");
+        checkMappedName("IBM278", "Cp278");
+        checkMappedName("IBM280", "Cp280");
+        checkMappedName("IBM284", "Cp284");
+        checkMappedName("IBM285", "Cp285");
+        checkMappedName("IBM297", "Cp297");
+        checkMappedName("IBM33722", "Cp33722");
+        checkMappedName("IBM420", "Cp420");
+        checkMappedName("IBM424", "Cp424");
+        checkMappedName("IBM437", "Cp437");
+        checkMappedName("IBM500", "Cp500");
+        checkMappedName("IBM737", "Cp737");
+        checkMappedName("IBM775", "Cp775");
+        checkMappedName("IBM838", "Cp838");
+        checkMappedName("IBM850", "Cp850");
+        checkMappedName("IBM852", "Cp852");
+        checkMappedName("IBM855", "Cp855");
+        checkMappedName("IBM856", "Cp856");
+        checkMappedName("IBM857", "Cp857");
+        checkMappedName("IBM00858", "Cp858");
+        checkMappedName("IBM860", "Cp860");
+        checkMappedName("IBM861", "Cp861");
+        checkMappedName("IBM862", "Cp862");
+        checkMappedName("IBM863", "Cp863");
+        checkMappedName("IBM864", "Cp864");
+        checkMappedName("IBM865", "Cp865");
+        checkMappedName("IBM866", "Cp866");
+        checkMappedName("IBM868", "Cp868");
+        checkMappedName("IBM869", "Cp869");
+        checkMappedName("IBM870", "Cp870");
+        checkMappedName("IBM871", "Cp871");
+        checkMappedName("IBM874", "Cp874");
+        checkMappedName("IBM875", "Cp875");
+        checkMappedName("IBM918", "Cp918");
+        checkMappedName("IBM921", "Cp921");
+        checkMappedName("IBM922", "Cp922");
+        checkMappedName("x-IBM930", "Cp930");
+        checkMappedName("IBM933", "Cp933");
+        checkMappedName("x-IBM935", "Cp935");
+        checkMappedName("x-IBM937", "Cp937");
+        checkMappedName("IBM939", "Cp939");
+        checkMappedName("x-IBM942", "Cp942");
+        checkMappedName("x-IBM942C", "Cp942C");
+        checkMappedName("x-IBM943", "Cp943");
+        checkMappedName("x-IBM943C", "Cp943C");
+        checkMappedName("x-IBM948", "Cp948");
+        checkMappedName("IBM949", "Cp949");
+        checkMappedName("x-IBM949C", "Cp949C");
+        checkMappedName("x-IBM950", "Cp950");
+        checkMappedName("IBM964", "Cp964");
+        checkMappedName("IBM970", "Cp970");
+
+        checkHistoricalName("MacArabic");
+        checkHistoricalName("MacCentralEurope");
+        checkHistoricalName("MacCroatian");
+        checkHistoricalName("MacCyrillic");
+        checkHistoricalName("MacDingbat");
+        checkHistoricalName("MacGreek");
+        checkHistoricalName("MacHebrew");
+        checkHistoricalName("MacIceland");
+        checkHistoricalName("MacRoman");
+        checkHistoricalName("MacRomania");
+        checkHistoricalName("MacSymbol");
+        checkHistoricalName("MacThai");
+        checkHistoricalName("MacTurkish");
+        checkHistoricalName("MacUkraine");
+
+        checkMappedName("x-MacArabic", "MacArabic");
+        checkMappedName("x-MacCentralEurope", "MacCentralEurope");
+        checkMappedName("x-MacCroatian", "MacCroatian");
+        checkMappedName("x-MacCyrillic", "MacCyrillic");
+        checkMappedName("x-MacDingbat", "MacDingbat");
+        checkMappedName("x-MacGreek", "MacGreek");
+        checkMappedName("x-MacHebrew", "MacHebrew");
+        checkMappedName("x-MacIceland", "MacIceland");
+        checkMappedName("x-MacRoman", "MacRoman");
+        checkMappedName("x-MacRomania", "MacRomania");
+        checkMappedName("x-MacSymbol", "MacSymbol");
+        checkMappedName("x-MacThai", "MacThai");
+        checkMappedName("x-MacTurkish", "MacTurkish");
+        checkMappedName("x-MacUkraine", "MacUkraine");
+
+        if (failed != 0)
+            throw new Exception("Test Failed: " + failed);
+        else
+            System.out.println("Test Passed!");
+    }
+
+    private static void checkHistoricalName(String name) throws Exception {
+        checkMappedName(name, name);
+    }
+
+    private static void checkMappedName(String alias, String canonical)
+        throws Exception {
+        InputStreamReader reader = new InputStreamReader(System.in, alias);
+        if (!reader.getEncoding().equals(canonical)) {
+            System.out.println("Failed canonical names : mismatch for " + alias
+                               + " - expected " + canonical
+                               + ", got " + reader.getEncoding());
+            failed++;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ConvertSingle.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * 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 4094987
+   @summary Verify that malformed expression exceptions are thrown
+       but no internal errors in certain pathologial cases.
+
+ */
+
+
+import java.io.*;
+import java.nio.charset.*;
+
+public class ConvertSingle {
+
+    public static void main(String args[]) throws Exception {
+        // This conversion is pathologically bad - it is attempting to
+        // read unicode from an ascii encoded string.
+        // The orignal bug: A internal error in ISR results if the
+        // byte counter in ByteToCharUnicode
+        // is not advanced as the input is consumed.
+
+        try{
+            String s = "\n";
+            byte ss[] = null;
+            String sstring = "x";
+            ss = s.getBytes();
+            ByteArrayInputStream BAIS = new ByteArrayInputStream(ss);
+            InputStreamReader ISR = new InputStreamReader(BAIS, "Unicode");
+            BufferedReader BR = new BufferedReader(ISR);
+            sstring = BR.readLine();
+            BR.close();
+            System.out.println(sstring);
+        } catch (MalformedInputException e){
+            // Right error
+            return;
+        } catch (java.lang.InternalError e) {
+            throw new Exception("ByteToCharUnicode is failing incorrectly for "
+                                + " single byte input");
+        }
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Decode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+
+/**/
+
+public class Decode {
+    private static boolean isAscii(char c) {
+        return c < '\u0080';
+    }
+
+    private static boolean isPrintable(char c) {
+        return ('\u0020' < c) && (c < '\u007f');
+    }
+
+    public static void main(String[] args) throws Throwable {
+        if (args.length < 2)
+            throw new Exception("Usage: java Decode CHARSET BYTE [BYTE ...]");
+        String cs = args[0];
+        byte[] bytes = new byte[args.length-1];
+        for (int i = 1; i < args.length; i++) {
+            String arg = args[i];
+            bytes[i-1] =
+                (arg.length() == 1 && isAscii(arg.charAt(0))) ?
+                (byte) arg.charAt(0) :
+                arg.equals("ESC") ? 0x1b :
+                arg.equals("SO")  ? 0x0e :
+                arg.equals("SI")  ? 0x0f :
+                arg.equals("SS2") ? (byte) 0x8e :
+                arg.equals("SS3") ? (byte) 0x8f :
+                arg.matches("0x.*") ? Integer.decode(arg).byteValue() :
+                Integer.decode("0x"+arg).byteValue();
+        }
+        String s = new String(bytes, cs);
+
+        for (int j = 0; j < s.length(); j++) {
+            if (j > 0)
+                System.out.print(' ');
+            char c = s.charAt(j);
+            if (isPrintable(c))
+                System.out.print(c);
+            else if (c == '\u001b') System.out.print("ESC");
+            else
+                System.out.printf("\\u%04x", (int) c);
+        }
+        System.out.print("\n");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/DecoderOverflow.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * 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 5101128
+   @summary Check behavior of CharsetDecoder.decode when overflow occurs
+   @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class DecoderOverflow {
+    static int failures = 0;
+
+    public static void main(String[] args) throws Exception {
+        for (String csn : Charset.availableCharsets().keySet()) {
+            try {
+                test(csn);
+            } catch (Throwable t) {
+                System.out.println(csn);
+                t.printStackTrace();
+                failures++;
+            }
+        }
+        if (failures > 0)
+            throw new Exception(failures + " charsets failed");
+    }
+
+    static void test(String encoding) throws Exception {
+        String text = "Vote for Duke!";
+        Charset cs = Charset.forName(encoding);
+        if (! cs.canEncode() || ! cs.newEncoder().canEncode('.')) return;
+        ByteBuffer in = ByteBuffer.wrap(text.getBytes(encoding));
+        CharBuffer out = CharBuffer.allocate(text.length()/2);
+        CoderResult result = cs.newDecoder().decode(in, out, true);
+        if (out.hasRemaining() || ! result.isOverflow())
+            throw new Exception
+                ("out.hasRemaining()=" + out.hasRemaining() +
+                 " result.isOverflow()=" + result.isOverflow() +
+                 " in.capacity()=" + in.capacity() +
+                 " encoding=" + encoding);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/EUCJPUnderflowDecodeTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,104 @@
+/*
+ * 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 4867457
+   @summary Check for correct byte buffer underflow handling in EUC-JP
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class EUCJPUnderflowDecodeTest {
+    public static void main(String[] args) throws Exception{
+
+        ByteBuffer bb = ByteBuffer.allocateDirect(255);
+        CharBuffer cc = CharBuffer.allocate(255);
+
+
+        // Test both regular EUC-JP and Linux variant
+
+        String[] charsetNames = { "EUC_JP", "EUC-JP-LINUX" };
+
+        for (int i = 0 ; i < charsetNames.length; i++) {
+            Charset cs = Charset.forName(charsetNames[i]);
+            CharsetDecoder decoder = cs.newDecoder();
+            bb.clear();
+            cc.clear();
+
+            // Fakes a partial 3 byte EUC_JP (JIS-X-0212 range)
+            // encoded character/byte sequence
+            bb.put((byte)0x8f);
+            bb.put((byte)0xa2);
+            bb.flip();
+            // Now decode with endOfInput method param set to
+            // indicate to decoder that there is more encoded
+            // data to follow in a subsequent invocation
+
+            CoderResult result = decoder.decode(bb, cc, false);
+
+            // java.nio.charset.CharsetDecoder spec specifies
+            // that the coder ought to return CoderResult.UNDERFLOW
+            // when insufficient bytes have been supplied to complete
+            // the decoding operation
+
+            if (result != CoderResult.UNDERFLOW) {
+                throw new Exception("test failed - UNDERFLOW not returned");
+            }
+
+            // Repeat the test with the lead byte (minus its pursuing
+            // trail byte) for the EUC-JP 2 byte (JIS208) range
+            decoder.reset();
+            bb.clear();
+            cc.clear();
+            bb.put((byte)0xa1);
+            bb.flip();
+            result = decoder.decode(bb, cc, false);
+            if (result != CoderResult.UNDERFLOW) {
+                throw new Exception("test failed");
+            }
+
+            // finally ensure that a valid JIS208 range EUC-JP
+            // 2 byte value is correctly decoded when it is presented
+            // at the trailing bounds of a ByteBuffer in the case where
+            // charset decoder expects (endOfInput ==false) more
+            //input to follow
+
+            decoder.reset();
+            bb.clear();
+            cc.clear();
+            bb.put((byte)0xa1);
+            bb.put((byte)0xc0);
+            bb.flip();
+
+            result = decoder.decode(bb, cc, false);
+
+            cc.flip();
+
+            if (result != CoderResult.UNDERFLOW && cc.get() != '\uFF3c') {
+                throw new Exception("test failed to decode EUC-JP (0xA1C0)");
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/EucJpLinux0212.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,79 @@
+/*
+ * 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 6350021
+ * @summary Consistency checks when input buffer contains JISX0212 characters
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class EucJpLinux0212 {
+    private static void equal(CharBuffer b1, CharBuffer b2) {
+        equal(b1.position(), b2.position());
+        equal(b1.limit(), b2.limit());
+        System.out.printf("positions=%d %d%n", b1.position(), b2.position());
+        System.out.printf("limits=%d %d%n", b1.limit(), b2.limit());
+        for (int i = b1.position(); i < b1.limit(); i++)
+            equal((int)b1.get(i), (int)b2.get(i));
+    }
+
+    private static void realMain(String[] args) throws Throwable {
+        List<ByteBuffer> bbs = Arrays.asList(
+            ByteBuffer.allocate(10),
+            ByteBuffer.allocateDirect(10));
+        List<CharBuffer> cbs = new ArrayList<CharBuffer>();
+
+        for (ByteBuffer bb : bbs) {
+            bb.put(new byte[]{ (byte)0x8f, 0x01, 0x02,
+                               (byte)0xa1, (byte)0xc0,
+                               0x02, 0x03});
+            bb.flip();
+            CharsetDecoder decoder = Charset.forName("EUC_JP_LINUX").newDecoder();
+            decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
+            CharBuffer cb = decoder.decode(bb);
+            cbs.add(cb);
+        }
+        equal(cbs.get(0), cbs.get(1));
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/EucJpLinuxDecoderRecoveryTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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 5016049
+   @summary ensure euc-jp-linux charset decoder recovery for unmappable input
+ */
+
+import java.io.*;
+
+public class EucJpLinuxDecoderRecoveryTest {
+    public static void main(String[] args) throws Exception {
+        byte[] encoded = {
+                // EUC_JP_LINUX mappable JIS X 0208 range
+                (byte)0xa6, (byte)0xc5,
+                // EUC_JP_LINUX Unmappable (JIS X 0212 range)
+                (byte)0x8f, (byte)0xa2, (byte)0xb7,
+                // EUC_JP_LINUX mappable JIS X 0208 range
+                (byte)0xa6, (byte)0xc7 };
+
+        char[] decodedChars = new char[3];
+        char[] expectedChars =
+                        {
+                        '\u03B5',  // mapped
+                        '\ufffd',  // unmapped
+                        '\u03B7'   // mapped
+                        };
+
+        ByteArrayInputStream bais = new ByteArrayInputStream(encoded);
+        InputStreamReader isr = new InputStreamReader(bais, "EUC_JP_LINUX");
+        int n = 0;   // number of chars decoded
+
+        try {
+            n = isr.read(decodedChars);
+        } catch (Exception ex) {
+            throw new Error("euc-jp-linux decoding broken");
+        }
+
+        // check number of decoded chars is what is expected
+        if (n != expectedChars.length)
+            throw new Error("Unexpected number of chars decoded");
+
+        // Compare actual decoded with expected
+
+        for (int i = 0; i < n; i++) {
+            if (expectedChars[i] != decodedChars[i])
+                throw new Error("euc-jp-linux decoding incorrect");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/EuroConverter.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,158 @@
+/*
+ * 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      4114080
+ * @summary  Make sure the euro converters, which are derived from
+ * existing converters, only differ from their parents at the expected
+ * code point.
+ */
+
+import java.text.*;
+import java.util.*;
+import java.io.*;
+
+/* Author: Alan Liu
+ * 7/14/98
+ */
+public class EuroConverter {
+    public static void main(String args[]) throws Exception {
+        boolean pass = true;
+        char[] map = new char[256]; // map for the encoding
+        byte[] bytes = new byte[1]; // scratch
+        char[] chars = new char[1]; // scratch
+        for (int i=0; i<DATA.length; ) {
+            String euroEnc = DATA[i++];
+            String parentEnc = DATA[i++];
+            System.out.println("Checking encoder " + euroEnc + " against " + parentEnc);
+            String currentEnc = parentEnc;
+
+            try {
+                // Fill map with parent values
+                for (int j=-128; j<128; ++j) {
+                    bytes[0] = (byte)j;
+                    char parentValue = new String(bytes, parentEnc).charAt(0);
+                    // NOTE: 0x25 doesn't round trip on the EBCDIC code pages,
+                    // so we don't check that code point in the sanity check.
+                    if (j != 0x0025) {
+                        chars[0] = parentValue;
+                        int parentRoundTrip = new String(chars).getBytes(parentEnc)[0];
+                        // This is a sanity check -- we aren't really testing the parent
+                        // encoder here.
+                        if (parentRoundTrip != j) {
+                            pass = false;
+                            System.out.println("Error: Encoder " + parentEnc +
+                                           " fails round-trip: " + j +
+                                           " -> \\u" + Integer.toHexString(parentValue) +
+                                           " -> " + parentRoundTrip);
+                        }
+                    }
+                    map[(j+0x100)&0xFF] = parentValue;
+                }
+
+                // Modify map with new expected values.  Each pair has code point, parent value, euro value.
+                // Terminated by null.
+                while (DATA[i] != null) {
+                    int codePoint = Integer.valueOf(DATA[i++], 16).intValue();
+                    char expectedParentValue = DATA[i++].charAt(0);
+                    char expectedEuroValue = DATA[i++].charAt(0);
+                    // This is a sanity check -- we aren't really testing the parent
+                    // encoder here.
+                    if (map[codePoint] != expectedParentValue) {
+                        pass = false;
+                        System.out.println("Error: Encoder " + parentEnc +
+                                           " " + Integer.toHexString(codePoint) + " -> \\u" +
+                                           Integer.toHexString(map[codePoint]) + ", expected \\u" +
+                                           Integer.toHexString(expectedParentValue));
+                    }
+                    // Fill in new expected value
+                    map[codePoint] = expectedEuroValue;
+                }
+                ++i; // Skip over null at end of set
+
+                // Now verify the euro encoder
+                currentEnc = euroEnc;
+                for (int j=-128; j<128; ++j) {
+                    bytes[0] = (byte)j;
+                    char euroValue = new String(bytes, euroEnc).charAt(0);
+                    chars[0] = euroValue;
+                    // NOTE: 0x15 doesn't round trip on the EBCDIC code pages,
+                    // so we don't check that code point in the sanity check.
+                    if (j != 0x0015) {
+                        int euroRoundTrip = new String(chars).getBytes(euroEnc)[0];
+                        if (euroRoundTrip != j) {
+                            pass = false;
+                            System.out.println("Error: Encoder " + euroEnc +
+                                           " fails round-trip at " + j);
+                        }
+                    }
+                    // Compare against the map
+                    if (euroValue != map[(j+0x100)&0xFF]) {
+                        pass = false;
+                        System.out.println("Error: Encoder " + euroEnc +
+                                           " " + Integer.toHexString((j+0x100)&0xFF) + " -> \\u" +
+                                           Integer.toHexString(euroValue) + ", expected \\u" +
+                                           Integer.toHexString(map[(j+0x100)&0xFF]));
+                    }
+                }
+            } catch (UnsupportedEncodingException e) {
+                System.out.println("Unsupported encoding " + currentEnc);
+                pass = false;
+                while (i < DATA.length && DATA[i] != null) ++i;
+                ++i; // Skip over null
+            }
+        }
+        if (!pass) {
+            throw new RuntimeException("Bug 4114080 - Euro encoder test failed");
+        }
+    }
+    static String[] DATA = {
+        // New converter, parent converter, [ code point that changed, parent code point value,
+        // euro code point value ], null
+        // Any number of changed code points may be specified, including zero.
+        "ISO8859_15_FDIS", "ISO8859_1",
+            "A4", "\u00A4", "\u20AC",
+            "A6", "\u00A6", "\u0160",
+            "A8", "\u00A8", "\u0161",
+            "B4", "\u00B4", "\u017D",
+            "B8", "\u00B8", "\u017E",
+            "BC", "\u00BC", "\u0152",
+            "BD", "\u00BD", "\u0153",
+            "BE", "\u00BE", "\u0178",
+            null,
+        // 923 is IBM's name for ISO 8859-15; make sure they're identical
+        "Cp923", "ISO8859_15_FDIS", null,
+        "Cp858", "Cp850", "D5", "\u0131", "\u20AC", null,
+        "Cp1140", "Cp037", "9F", "\u00A4", "\u20AC", null,
+        "Cp1141", "Cp273", "9F", "\u00A4", "\u20AC", null,
+        "Cp1142", "Cp277", "5A", "\u00A4", "\u20AC", null,
+        "Cp1143", "Cp278", "5A", "\u00A4", "\u20AC", null,
+        "Cp1144", "Cp280", "9F", "\u00A4", "\u20AC", null,
+        "Cp1145", "Cp284", "9F", "\u00A4", "\u20AC", null,
+        "Cp1146", "Cp285", "9F", "\u00A4", "\u20AC", null,
+        "Cp1147", "Cp297", "9F", "\u00A4", "\u20AC", null,
+        "Cp1148", "Cp500", "9F", "\u00A4", "\u20AC", null,
+        "Cp1149", "Cp871", "9F", "\u00A4", "\u20AC", null,
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindASCIICodingBugs.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,90 @@
+/*
+ * 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 6196991
+ * @summary Roundtrip Encoding/Decoding of just one ASCII char
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindASCIICodingBugs {
+    private static int failures = 0;
+
+    private static void check(boolean condition) {
+        if (! condition) {
+            new Error("test failed").printStackTrace();
+            failures++;
+        }
+    }
+
+    private static boolean equals(byte[] ba, ByteBuffer bb) {
+        if (ba.length != bb.limit())
+            return false;
+        for (int i = 0; i < ba.length; i++)
+            if (ba[i] != bb.get(i))
+                return false;
+        return true;
+    }
+
+    public static void main(String[] args) throws Exception {
+        for (Map.Entry<String,Charset> e
+                 : Charset.availableCharsets().entrySet()) {
+            String csn = e.getKey();
+            Charset cs = e.getValue();
+
+            // Delete the following lines when these charsets are fixed!
+            if (csn.equals("x-JIS0208"))      continue; // MalformedInput
+            if (csn.equals("JIS_X0212-1990")) continue; // MalformedInput
+
+            if (! cs.canEncode()) continue;
+
+            CharsetEncoder enc = cs.newEncoder();
+            CharsetDecoder dec = cs.newDecoder();
+
+            if (! enc.canEncode('A')) continue;
+
+            System.out.println(csn);
+
+            try {
+                byte[] bytes1 = "A".getBytes(csn);
+                ByteBuffer bb = enc.encode(CharBuffer.wrap(new char[]{'A'}));
+
+                check(equals(bytes1, bb));
+                check(new String(bytes1, csn).equals("A"));
+
+                CharBuffer cb = dec.decode(bb);
+                check(cb.toString().equals("A"));
+            } catch (Throwable t) {
+                t.printStackTrace();
+                failures++;
+            }
+        }
+
+        if (failures > 0)
+            throw new Exception(failures + "tests failed");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindASCIIRangeCodingBugs.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,78 @@
+/*
+ * 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 6378295
+ * @summary Roundtrip Encoding/Decoding of ASCII chars from 0x00-0x7f
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindASCIIRangeCodingBugs {
+    private static int failures = 0;
+    private static byte[] asciiBytes = new byte[0x80];
+    private static char[] asciiChars = new char[0x80];
+    private static String asciiString;
+
+    private static void check(String csn) throws Exception {
+        System.out.println(csn);
+        if (! Arrays.equals(asciiString.getBytes(csn), asciiBytes)) {
+            System.out.printf("%s -> bytes%n", csn);
+            failures++;
+        }
+        if (! new String(asciiBytes, csn).equals(asciiString)) {
+            System.out.printf("%s -> chars%n", csn);
+            failures++;
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        for (int i = 0; i < 0x80; i++) {
+            asciiBytes[i] = (byte) i;
+            asciiChars[i] = (char) i;
+        }
+        asciiString = new String(asciiChars);
+        Charset ascii = Charset.forName("ASCII");
+        for (Map.Entry<String,Charset> e
+                 : Charset.availableCharsets().entrySet()) {
+            String csn = e.getKey();
+            Charset cs = e.getValue();
+            if (!cs.contains(ascii) ||
+                csn.matches(".*2022.*") ||             //iso2022 family
+                csn.matches("x-windows-5022[0|1]") ||  //windows 2022jp
+                csn.matches(".*UTF-[16|32].*"))        //multi-bytes
+                continue;
+            if (! cs.canEncode()) continue;
+            try {
+                check(csn);
+            } catch (Throwable t) {
+                t.printStackTrace();
+                failures++;
+            }
+        }
+        if (failures > 0)
+            throw new Exception(failures + "tests failed");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindCanEncodeBugs.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,93 @@
+/*
+ * 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 5066863 5066867 5066874 5066879 5066884 5066887
+   @summary canEncode() false iff encode() throws CharacterCodingException
+   @run main/timeout=1200 FindCanEncodeBugs
+   @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.charset.*;
+import java.nio.*;
+
+public class FindCanEncodeBugs {
+    static boolean encodable1(CharsetEncoder enc, char c) {
+        enc.reset();
+        return enc.canEncode(c);
+    }
+
+    static boolean encodable2(CharsetEncoder enc, char c) {
+        enc.reset();
+        try { enc.encode(CharBuffer.wrap(new char[]{c})); return true; }
+        catch (CharacterCodingException e) { return false; }
+    }
+
+    public static void main(String[] args) throws Exception {
+        int failures = 0;
+
+        for (Map.Entry<String,Charset> e
+                 : Charset.availableCharsets().entrySet()) {
+            String csn = e.getKey();
+            Charset cs = e.getValue();
+
+            if (! cs.canEncode() ||
+                csn.matches("x-COMPOUND_TEXT") ||
+                csn.matches("x-ISO-2022-CN-CNS") || // ISO2022_CN_CNS supports less
+                csn.matches("(x-)?IBM(970).*")) // Broken as of 2004-07
+                continue;
+
+            //System.out.println(csn);
+
+            CharsetEncoder enc = cs.newEncoder();
+
+            for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; i++) {
+                boolean encodable1 = encodable1(enc, (char)i);
+                boolean encodable2 = encodable2(enc, (char)i);
+                if (encodable1 != encodable2) {
+                    int start = i;
+                    int end = i;
+                    for (int j = i;
+                         j <= '\uffff' &&
+                             encodable1(enc, (char)j) == encodable1 &&
+                             encodable2(enc, (char)j) == encodable2;
+                         j++)
+                        end = j;
+                    System.out.printf("charset=%-18s canEncode=%-5b ",
+                                      csn, encodable1);
+                    if (start == end)
+                        System.out.printf("\'\\u%04x\'%n", start);
+                    else
+                        System.out.printf("\'\\u%04x\' - \'\\u%04x\'%n",
+                                          start, end);
+                    i = end;
+                    failures++;
+                }
+            }
+        }
+
+        if (failures > 0)
+            throw new Exception(failures + " failures");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindDecoderBugs.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,442 @@
+/*
+ * 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 6380723
+ * @summary Decode many byte sequences in many ways
+ * @run main/timeout=1800 FindDecoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.util.regex.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindDecoderBugs {
+
+    static boolean isBroken(String csn) {
+        if (csn.equals("x-COMPOUND_TEXT")) return true;
+        return false;
+    }
+
+    static <T extends Comparable<? super T>> List<T> sort(Collection<T> c) {
+        List<T> list = new ArrayList<T>(c);
+        Collections.sort(list);
+        return list;
+    }
+
+    static class TooManyFailures extends RuntimeException {
+        private static final long serialVersionUID = 0L;
+    }
+
+    static String string(byte[] a) {
+        final StringBuilder sb = new StringBuilder();
+        for (byte b : a) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("%02x", b & 0xff));
+        }
+        return sb.toString();
+    }
+
+    static String string(char[] a) {
+        final StringBuilder sb = new StringBuilder();
+        for (char c : a) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("\\u%04x", (int) c));
+        }
+        return sb.toString();
+    }
+
+    static class Reporter {
+        // Some machinery to make sure only a small number of errors
+        // that are "too similar" are reported.
+        static class Counts extends HashMap<String, Long> {
+            private static final long serialVersionUID = -1;
+            long inc(String signature) {
+                Long count = get(signature);
+                if (count == null) count = 0L;
+                put(signature, count+1);
+                return count+1;
+            }
+        }
+
+        final Counts failureCounts = new Counts();
+        final static long maxFailures = 2;
+
+        final static Pattern hideBytes = Pattern.compile("\"[0-9a-f ]+\"");
+        final static Pattern hideChars = Pattern.compile("\\\\u[0-9a-f]{4}");
+
+        boolean bug(String format, Object... args) {
+            String signature = String.format(format, args);
+            signature = hideBytes.matcher(signature).replaceAll("\"??\"");
+            signature = hideChars.matcher(signature).replaceAll("\\u????");
+            failed++;
+            if (failureCounts.inc(signature) <= maxFailures) {
+                System.out.printf(format, args);
+                System.out.println();
+                return true;
+            }
+            return false;
+        }
+
+        void summarize() {
+            for (String key : sort(failureCounts.keySet()))
+                System.out.printf("-----%n%s%nfailures=%d%n",
+                                  key, failureCounts.get(key));
+        }
+    }
+
+    static final Reporter reporter = new Reporter();
+
+    static class Result {
+        final int limit;
+        final int ipos;
+        final boolean direct;
+        final byte[] ia;
+        final char[] oa;
+        final CoderResult cr;
+
+        Result(ByteBuffer ib, CharBuffer ob, CoderResult cr) {
+            ipos = ib.position();
+            ia = toArray(ib);
+            oa = toArray(ob);
+            direct = ib.isDirect();
+            limit = ob.limit();
+            this.cr = cr;
+        }
+
+        static byte[] toArray(ByteBuffer b) {
+            int pos = b.position();
+            byte[] a = new byte[b.limit()];
+            b.position(0);
+            b.get(a);
+            b.position(pos);
+            return a;
+        }
+
+        static char[] toArray(CharBuffer b) {
+            char[] a = new char[b.position()];
+            b.position(0);
+            b.get(a);
+            return a;
+        }
+
+        static boolean eq(Result x, Result y) {
+            return x == y ||
+                (x != null && y != null &&
+                 (Arrays.equals(x.oa, y.oa) &&
+                  x.ipos == y.ipos &&
+                  x.cr == y.cr));
+        }
+
+        public String toString() {
+            return String.format("\"%s\"[%d/%d] => %s \"%s\"[%d/%d]%s",
+                                 string(ia), ipos, ia.length,
+                                 cr, string(oa), oa.length, limit,
+                                 (direct ? " (direct)" : ""));
+        }
+    }
+
+    // legend: r=regular d=direct In=Input Ou=Output
+    static final int maxBufSize = 20;
+    static final ByteBuffer[] ribs = new ByteBuffer[maxBufSize];
+    static final ByteBuffer[] dibs = new ByteBuffer[maxBufSize];
+
+    static final CharBuffer[] robs = new CharBuffer[maxBufSize];
+    static final CharBuffer[] dobs = new CharBuffer[maxBufSize];
+    static {
+        for (int i = 0; i < maxBufSize; i++) {
+            ribs[i] = ByteBuffer.allocate(i);
+            dibs[i] = ByteBuffer.allocateDirect(i);
+            robs[i] = CharBuffer.allocate(i);
+            dobs[i] = ByteBuffer.allocateDirect(i*2).asCharBuffer();
+        }
+    }
+
+    static class CharsetTester {
+        private final Charset cs;
+        private static final long maxFailures = 5;
+        private long failures = 0;
+        // private static final long maxCharsetFailures = Long.MAX_VALUE;
+        private static final long maxCharsetFailures = 10000L;
+        private final long failed0 = failed;
+
+        CharsetTester(Charset cs) {
+            this.cs = cs;
+        }
+
+        static boolean bug(String format, Object... args) {
+            return reporter.bug(format, args);
+        }
+
+        Result recode(ByteBuffer ib, CharBuffer ob) {
+            try {
+                char canary = '\u4242';
+                ib.clear();     // Prepare to read
+                ob.clear();     // Prepare to write
+                for (int i = 0; i < ob.limit(); i++)
+                    ob.put(i, canary);
+                CharsetDecoder coder = cs.newDecoder();
+                CoderResult cr = coder.decode(ib, ob, false);
+                equal(ib.limit(), ib.capacity());
+                equal(ob.limit(), ob.capacity());
+                Result r = new Result(ib, ob, cr);
+                if (cr.isError())
+                    check(cr.length() > 0);
+                if (cr.isOverflow() && ob.remaining() > 10)
+                    bug("OVERFLOW, but there's lots of room: %s %s",
+                        cs, r);
+//              if (cr.isOverflow() && ib.remaining() == 0)
+//                  bug("OVERFLOW, yet remaining() == 0: %s %s",
+//                      cs, r);
+                if (cr.isError() && ib.remaining() < cr.length())
+                    bug("remaining() < CoderResult.length(): %s %s",
+                        cs, r);
+//              if (ib.position() == 0 && ob.position() > 0)
+//                  reporter. bug("output only if input consumed: %s %s",
+//                                cs, r);
+                // Should we warn if cr.isUnmappable() ??
+                CoderResult cr2 = coder.decode(ib, ob, false);
+                if (ib.position() != r.ipos ||
+                    ob.position() != r.oa.length ||
+                    cr != cr2)
+                    bug("Coding operation not idempotent: %s%n    %s%n    %s",
+                        cs, r, new Result(ib, ob, cr2));
+                if (ob.position() < ob.limit() &&
+                    ob.get(ob.position()) != canary)
+                    bug("Buffer overrun: %s %s %s",
+                        cs, r, ob.get(ob.position()));
+                return r;
+            } catch (Throwable t) {
+                if (bug("Unexpected exception: %s %s %s",
+                        cs, t.getClass().getSimpleName(),
+                        new Result(ib, ob, null)))
+                    t.printStackTrace();
+                return null;
+            }
+        }
+
+        Result recode2(byte[] ia, int n) {
+            int len = ia.length;
+            ByteBuffer rib = ByteBuffer.wrap(ia);
+            ByteBuffer dib = dibs[len];
+            dib.clear(); dib.put(ia); dib.clear();
+            CharBuffer rob = robs[n];
+            CharBuffer dob = dobs[n];
+            equal(rob.limit(), n);
+            equal(dob.limit(), n);
+            check(dib.isDirect());
+            check(dob.isDirect());
+            Result r1 = recode(rib, rob);
+            Result r2 = recode(dib, dob);
+            if (r1 != null && r2 != null && ! Result.eq(r1, r2))
+                bug("Results differ for direct buffers: %s%n    %s%n    %s",
+                    cs, r1, r2);
+            return r1;
+        }
+
+        Result test(byte[] ia) {
+            if (failed - failed0 >= maxCharsetFailures)
+                throw new TooManyFailures();
+
+            Result roomy = recode2(ia, maxBufSize - 1);
+            if (roomy == null) return roomy;
+            int olen = roomy.oa.length;
+            if (olen > 0) {
+                if (roomy.ipos == roomy.ia.length) {
+                    Result perfectFit = recode2(ia, olen);
+                    if (! Result.eq(roomy, perfectFit))
+                        bug("Results differ: %s%n    %s%n    %s",
+                            cs, roomy, perfectFit);
+                }
+                for (int i = 0; i < olen; i++) {
+                    Result claustrophobic = recode2(ia, i);
+                    if (claustrophobic == null) return roomy;
+                    if (roomy.cr.isUnderflow() &&
+                        ! claustrophobic.cr.isOverflow())
+                        bug("Expected OVERFLOW: %s%n    %s%n    %s",
+                            cs, roomy, claustrophobic);
+                }
+            }
+            return roomy;
+        }
+
+        void testExhaustively(byte[] prefix, int n) {
+            int len = prefix.length;
+            byte[] ia = Arrays.copyOf(prefix, len + 1);
+            for (int i = 0; i < 0x100; i++) {
+                ia[len] = (byte) i;
+                if (n == 1)
+                    test(ia);
+                else
+                    testExhaustively(ia, n - 1);
+            }
+        }
+
+        void testRandomly(byte[] prefix, int n) {
+            int len = prefix.length;
+            byte[] ia = Arrays.copyOf(prefix, len + n);
+            for (int i = 0; i < 10000; i++) {
+                for (int j = 0; j < n; j++)
+                    ia[len + j] = randomByte();
+                test(ia);
+            }
+        }
+
+        void testPrefix(byte[] prefix) {
+            if (prefix.length > 0)
+                System.out.printf("Testing prefix %s%n", string(prefix));
+
+            test(prefix);
+
+            testExhaustively(prefix, 1);
+            testExhaustively(prefix, 2);
+            // Can you spare a week of CPU time?
+            // testExhaustively(cs, tester, prefix, 3);
+
+            testRandomly(prefix, 3);
+            testRandomly(prefix, 4);
+        }
+    }
+
+    private final static Random rnd = new Random();
+    private static byte randomByte() {
+        return (byte) rnd.nextInt(0x100);
+    }
+    private static byte[] randomBytes(int len) {
+        byte[] a = new byte[len];
+        for (int i = 0; i < len; i++)
+            a[i] = randomByte();
+        return a;
+    }
+
+    private static final byte SS2 = (byte) 0x8e;
+    private static final byte SS3 = (byte) 0x8f;
+    private static final byte ESC = (byte) 0x1b;
+    private static final byte SO  = (byte) 0x0e;
+    private static final byte SI  = (byte) 0x0f;
+
+    private final static byte[][] stateChangers = {
+        {SS2}, {SS3}, {SO}, {SI}
+    };
+
+    private final static byte[][]escapeSequences = {
+        {ESC, '(', 'B'},
+        {ESC, '(', 'I'},
+        {ESC, '(', 'J'},
+        {ESC, '$', '@'},
+        {ESC, '$', 'A'},
+        {ESC, '$', ')', 'A'},
+        {ESC, '$', ')', 'C'},
+        {ESC, '$', ')', 'G'},
+        {ESC, '$', '*', 'H'},
+        {ESC, '$', '+', 'I'},
+        {ESC, '$', 'B'},
+        {ESC, 'N'},
+        {ESC, 'O'},
+        {ESC, '$', '(', 'D'},
+    };
+
+    private static boolean isStateChanger(Charset cs, byte[] ia) {
+        Result r = new CharsetTester(cs).recode2(ia, 9);
+        return r == null ? false :
+            (r.cr.isUnderflow() &&
+             r.ipos == ia.length &&
+             r.oa.length == 0);
+    }
+
+    private final static byte[][] incompletePrefixes = {
+        {ESC},
+        {ESC, '('},
+        {ESC, '$'},
+        {ESC, '$', '(',},
+    };
+
+    private static boolean isIncompletePrefix(Charset cs, byte[] ia) {
+        Result r = new CharsetTester(cs).recode2(ia, 9);
+        return r == null ? false :
+            (r.cr.isUnderflow() &&
+             r.ipos == 0 &&
+             r.oa.length == 0);
+    }
+
+    private static void testCharset(Charset cs) throws Throwable {
+        final String csn = cs.name();
+
+        if (isBroken(csn)) {
+            System.out.printf("Skipping possibly broken charset %s%n", csn);
+            return;
+        }
+        System.out.println(csn);
+        CharsetTester tester = new CharsetTester(cs);
+
+        tester.testPrefix(new byte[0]);
+
+        if (! csn.matches("(?:x-)?(?:UTF|JIS(?:_X)?0).*")) {
+            for (byte[] prefix : stateChangers)
+                if (isStateChanger(cs, prefix))
+                    tester.testPrefix(prefix);
+
+            for (byte[] prefix : incompletePrefixes)
+                if (isIncompletePrefix(cs, prefix))
+                    tester.testPrefix(prefix);
+
+            if (isIncompletePrefix(cs, new byte[] {ESC}))
+                for (byte[] prefix : escapeSequences)
+                    if (isStateChanger(cs, prefix))
+                        tester.testPrefix(prefix);
+        }
+    }
+
+    private static void realMain(String[] args) {
+        for (Charset cs : sort(Charset.availableCharsets().values())) {
+            try {
+                testCharset(cs);
+            } catch (TooManyFailures e) {
+                System.out.printf("Too many failures for %s%n", cs);
+            } catch (Throwable t) {
+                unexpected(t);
+            }
+        }
+        reporter.summarize();
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile long passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String format, Object... args) {
+        System.out.println(String.format(format, args)); failed++;}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindEncoderBugs.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,529 @@
+/*
+ * 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 6233345 6381699 6381702 6381705 6381706
+ * @summary Encode many char sequences in many ways
+ * @run main/timeout=1200 FindEncoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.util.regex.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindEncoderBugs {
+
+    static boolean isBroken(String csn) {
+        if (csn.equals("x-COMPOUND_TEXT")) return true;
+        if (csn.equals("x-IBM834")) return true;  // stateful korean
+        if (csn.equals("x-IBM933")) return true;  // stateful korean
+        if (csn.equals("x-IBM970")) return true;  // stateful korean
+        if (csn.equals("x-IBM949")) return true;  // stateful korean
+        if (csn.equals("x-IBM949C")) return true; // stateful korean
+        return false;
+    }
+
+    static <T extends Comparable<? super T>> List<T> sort(Collection<T> c) {
+        List<T> list = new ArrayList<T>(c);
+        Collections.sort(list);
+        return list;
+    }
+
+    static class TooManyFailures extends RuntimeException {
+        private static final long serialVersionUID = 0L;
+    }
+
+    static String string(byte[] a) {
+        final StringBuilder sb = new StringBuilder();
+        for (byte b : a) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("%02x", b & 0xff));
+        }
+        return sb.toString();
+    }
+
+    static String string(char[] a) {
+        final StringBuilder sb = new StringBuilder();
+        for (char c : a) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("\\u%04x", (int) c));
+        }
+        return sb.toString();
+    }
+
+    static class Reporter {
+        // Some machinery to make sure only a small number of errors
+        // that are "too similar" are reported.
+        static class Counts extends HashMap<String, Long> {
+            private static final long serialVersionUID = -1;
+            long inc(String signature) {
+                Long count = get(signature);
+                if (count == null) count = 0L;
+                put(signature, count+1);
+                return count+1;
+            }
+        }
+
+        final Counts failureCounts = new Counts();
+        final static long maxFailures = 2;
+
+        final static Pattern hideBytes = Pattern.compile("\"[0-9a-f ]+\"");
+        final static Pattern hideChars = Pattern.compile("\\\\u[0-9a-f]{4}");
+
+        boolean bug(String format, Object... args) {
+            String signature = String.format(format, args);
+            //      signature = hideBytes.matcher(signature).replaceAll("\"??\"");
+            //      signature = hideChars.matcher(signature).replaceAll("\\u????");
+            failed++;
+            if (failureCounts.inc(signature) <= maxFailures) {
+                System.out.printf(format, args);
+                System.out.println();
+                return true;
+            }
+            return false;
+        }
+
+        void summarize() {
+            for (String key : sort(failureCounts.keySet()))
+                System.out.printf("-----%n%s%nfailures=%d%n",
+                                  key, failureCounts.get(key));
+        }
+    }
+
+    static final Reporter reporter = new Reporter();
+
+    static class Result {
+        final int limit;
+        final int ipos;
+        final boolean direct;
+        final char[] ia;
+        final byte[] oa;
+        final CoderResult cr;
+
+        private static byte[] toByteArray(ByteBuffer bb) {
+            byte[] bytes = new byte[bb.position()];
+            for (int i = 0; i < bytes.length; i++)
+                bytes[i] = bb.get(i);
+            return bytes;
+        }
+
+        Result(CharBuffer ib, ByteBuffer ob, CoderResult cr) {
+            ipos = ib.position();
+            ia = toArray(ib);
+            oa = toArray(ob);
+            direct = ib.isDirect();
+            limit = ob.limit();
+            this.cr = cr;
+        }
+
+        static char[] toArray(CharBuffer b) {
+            int pos = b.position();
+            char[] a = new char[b.limit()];
+            b.position(0);
+            b.get(a);
+            b.position(pos);
+            return a;
+        }
+
+        static byte[] toArray(ByteBuffer b) {
+            byte[] a = new byte[b.position()];
+            b.position(0);
+            b.get(a);
+            return a;
+        }
+
+        static boolean eq(Result x, Result y) {
+            return x == y ||
+                (x != null && y != null &&
+                 (Arrays.equals(x.oa, y.oa) &&
+                  x.ipos == y.ipos &&
+                  x.cr == y.cr));
+        }
+
+        public String toString() {
+            return String.format("\"%s\"[%d/%d] => %s \"%s\"[%d/%d]%s",
+                                 string(ia), ipos, ia.length,
+                                 cr, string(oa), oa.length, limit,
+                                 (direct ? " (direct)" : ""));
+        }
+    }
+
+    static class CharsetTester {
+        private final Charset cs;
+        private final boolean hasBom;
+        private static final int maxFailures = 5;
+        private int failures = 0;
+        // private static final long maxCharsetFailures = Long.MAX_VALUE;
+        private static final long maxCharsetFailures = 10000L;
+        private final long failed0 = failed;
+
+        // legend: r=regular d=direct In=Input Ou=Output
+        static final int maxBufSize = 20;
+        static final CharBuffer[] rInBuffers = new CharBuffer[maxBufSize];
+        static final CharBuffer[] dInBuffers = new CharBuffer[maxBufSize];
+
+        static final ByteBuffer[] rOuBuffers = new ByteBuffer[maxBufSize];
+        static final ByteBuffer[] dOuBuffers = new ByteBuffer[maxBufSize];
+        static {
+            for (int i = 0; i < maxBufSize; i++) {
+                rInBuffers[i] = CharBuffer.allocate(i);
+                dInBuffers[i] = ByteBuffer.allocateDirect(i*2).asCharBuffer();
+                rOuBuffers[i] = ByteBuffer.allocate(i);
+                dOuBuffers[i] = ByteBuffer.allocateDirect(i);
+            }
+        }
+
+        CharsetTester(Charset cs) {
+            this.cs = cs;
+            this.hasBom =
+                cs.name().matches(".*BOM.*") ||
+                cs.name().equals("UTF-16");
+        }
+
+        static boolean bug(String format, Object... args) {
+            return reporter.bug(format, args);
+        }
+
+        static boolean hasBom(byte[] a) {
+            switch (a.length) {
+            case 2: case 4:
+                int sum = 0;
+                for (byte x : a)
+                    sum += x;
+                return sum == (byte) 0xfe + (byte) 0xff;
+            default: return false;
+            }
+        }
+
+        void testSurrogates() {
+            int failures = 0;
+            for (int i = 0; i < 10; i++) {
+                Result r = test(new char[] { randomHighSurrogate() });
+                if (r == null) break;
+                if (! (r.cr.isUnderflow() &&
+                       r.ipos == 0))
+                    bug("Lone high surrogate not UNDERFLOW: %s %s",
+                        cs, r);
+            }
+            for (int i = 0; i < 10; i++) {
+                Result r = test(new char[] { randomLowSurrogate() });
+                if (r == null) break;
+                if (! (r.cr.isMalformed() && r.cr.length() == 1))
+                    bug("Lone low surrogate not MALFORMED[1]: %s %s",
+                        cs, r);
+            }
+            char[] chars = new char[2];
+            for (int i = 0; i < 10; i++) {
+                chars[0] = randomLowSurrogate(); // Always illegal
+                chars[1] = randomChar();
+                Result r = test(chars);
+                if (r == null) break;
+                if (! (r.cr.isMalformed() &&
+                       r.cr.length() == 1 &&
+                       (r.ipos == 0 || (hasBom && hasBom(r.oa))))) {
+                    if (failures++ > 5) return;
+                    bug("Unpaired low surrogate not MALFORMED[1]: %s %s",
+                        cs, r);
+                }
+            }
+            for (int i = 0; i < 10; i++) {
+                chars[0] = randomHighSurrogate();
+                do {
+                    chars[1] = randomChar();
+                } while (Character.isLowSurrogate(chars[1]));
+                Result r = test(chars);
+                if (r == null) break;
+                if (! (r.cr.isMalformed() &&
+                       r.cr.length() == 1 &&
+                       (r.ipos == 0 || (hasBom && hasBom(r.oa))))) {
+                    if (failures++ > 5) return;
+                    bug("Unpaired high surrogate not MALFORMED[1]: %s %s",
+                        cs, r);
+                }
+            }
+            for (int i = 0; i < 1000; i++) {
+                chars[0] = randomHighSurrogate();
+                chars[1] = randomLowSurrogate();
+                Result r = test(chars);
+                if (r == null) break;
+                if (! ((r.cr.isUnmappable() &&
+                        r.cr.length() == 2 &&
+                        r.oa.length == 0)
+                       ||
+                       (r.cr.isUnderflow() &&
+                        r.oa.length > 0 &&
+                        r.ipos == 2))) {
+                    if (failures++ > 5) return;
+                    bug("Legal supplementary character bug: %s %s",
+                        cs, r);
+                }
+            }
+        }
+
+//              if (! (r.cr.isMalformed() &&
+//                     r.cr.length() == 1 &&
+//                     (rob.position() == 0 || hasBom(rob)))) {
+//                  if (failures++ > 5) return;
+//                  bug("Unpaired surrogate not malformed: %s %s",
+//                               cs, r);
+//              }
+//          }
+
+//                  dib.clear(); dib.put(chars); dib.flip();
+//                  rib.position(0);
+//                  rob.clear(); rob.limit(lim);
+//                  for (CharBuffer ib : new CharBuffer[] { rib, dib }) {
+//                      Result r = recode(ib, rob);
+//                      if (! (r.cr.isMalformed() &&
+//                             r.cr.length() == 1 &&
+//                             (rob.position() == 0 || hasBom(rob)))) {
+//                          if (failures++ > 5) return;
+//                          bug("Unpaired surrogate not malformed: %s %s",
+//                                       cs, r);
+//                      }
+//                  }
+//                  //}
+//              for (int i = 0; i < 10000; i++) {
+//                  chars[0] = randomHighSurrogate();
+//                  chars[1] = randomLowSurrogate();
+//                  dib.clear(); dib.put(chars); dib.flip();
+//                  rib.position(0);
+//                  rob.clear(); rob.limit(lim);
+//                  for (CharBuffer ib : new CharBuffer[] { rib, dib }) {
+//                      Result r = recode(ib, rob);
+//                      if (! ((r.cr.isUnmappable() &&
+//                              r.cr.length() == 2 &&
+//                              rob.position() == 0)
+//                             ||
+//                             (r.cr.isUnderflow() &&
+//                              rob.position() > 0 &&
+//                              ib.position() == 2))) {
+//                          if (failures++ > 5) return;
+//                          bug("Legal supplementary character bug: %s %s",
+//                                       cs, r);
+//                      }
+//                  }
+//              }
+//          }
+//      }
+
+        Result recode(CharBuffer ib, ByteBuffer ob) {
+            try {
+                byte canary = 22;
+                ib.clear();     // Prepare to read
+                ob.clear();     // Prepare to write
+                for (int i = 0; i < ob.limit(); i++)
+                    ob.put(i, canary);
+                CharsetEncoder coder = cs.newEncoder();
+                CoderResult cr = coder.encode(ib, ob, false);
+                equal(ib.limit(), ib.capacity());
+                equal(ob.limit(), ob.capacity());
+                Result r = new Result(ib, ob, cr);
+                if (cr.isError())
+                    check(cr.length() > 0);
+                if (cr.isOverflow() && ob.remaining() > 10)
+                    bug("OVERFLOW, but there's lots of room: %s %s",
+                        cs, r);
+//              if (cr.isOverflow() && ib.remaining() == 0 && ! hasBom)
+//                  bug("OVERFLOW, yet remaining() == 0: %s %s",
+//                      cs, r);
+                if (cr.isError() && ib.remaining() < cr.length())
+                    bug("remaining() < CoderResult.length(): %s %s",
+                        cs, r);
+//              if (ib.position() == 0
+//                  && ob.position() > 0
+//                  && ! hasBom(r.oa))
+//                  bug("output only if input consumed: %s %s",
+//                       cs, r);
+                CoderResult cr2 = coder.encode(ib, ob, false);
+                if (ib.position() != r.ipos ||
+                    ob.position() != r.oa.length ||
+                    cr != cr2)
+                    bug("Coding operation not idempotent: %s%n    %s%n    %s",
+                        cs, r, new Result(ib, ob, cr2));
+                if (ob.position() < ob.limit() &&
+                    ob.get(ob.position()) != canary)
+                    bug("Buffer overrun: %s %s %s",
+                        cs, r, ob.get(ob.position()));
+                return r;
+            } catch (Throwable t) {
+                if (bug("Unexpected exception: %s %s %s",
+                        cs, t.getClass().getSimpleName(),
+                        new Result(ib, ob, null)))
+                    t.printStackTrace();
+                return null;
+            }
+        }
+
+        Result recode2(char[] ia, int n) {
+            int len = ia.length;
+            CharBuffer rib = CharBuffer.wrap(ia);
+            CharBuffer dib = dInBuffers[len];
+            dib.clear(); dib.put(ia); dib.clear();
+            ByteBuffer rob = rOuBuffers[n];
+            ByteBuffer dob = dOuBuffers[n];
+            equal(rob.limit(), n);
+            equal(dob.limit(), n);
+            check(dib.isDirect());
+            check(dob.isDirect());
+            Result r1 = recode(rib, rob);
+            Result r2 = recode(dib, dob);
+            if (r1 != null && r2 != null && ! Result.eq(r1, r2))
+                bug("Results differ for direct buffers: %s%n    %s%n    %s",
+                    cs, r1, r2);
+            return r1;
+        }
+
+        Result test(char[] ia) {
+            if (failed - failed0 >= maxCharsetFailures)
+                throw new TooManyFailures();
+
+            Result roomy = recode2(ia, maxBufSize - 1);
+            if (roomy == null) return roomy;
+            int olen = roomy.oa.length;
+            if (olen > 0) {
+                if (roomy.ipos == roomy.ia.length) {
+                    Result perfectFit = recode2(ia, olen);
+                    if (! Result.eq(roomy, perfectFit))
+                        bug("Results differ: %s%n    %s%n    %s",
+                            cs, roomy, perfectFit);
+                }
+                for (int i = 0; i < olen; i++) {
+                    Result claustrophobic = recode2(ia, i);
+                    if (claustrophobic == null) return roomy;
+                    if (roomy.cr.isUnderflow() &&
+                        ! claustrophobic.cr.isOverflow())
+                        bug("Expected OVERFLOW: %s%n    %s%n    %s",
+                            cs, roomy, claustrophobic);
+                }
+            }
+            return roomy;
+        }
+
+        void testExhaustively(char[] prefix, int n) {
+            int len = prefix.length;
+            char[] ia = Arrays.copyOf(prefix, len + 1);
+            for (int i = 0; i < 0x10000; i++) {
+                ia[len] = (char) i;
+                if (n == 1)
+                    test(ia);
+                else
+                    testExhaustively(ia, n - 1);
+            }
+        }
+
+        void testRandomly(char[] prefix, int n) {
+            int len = prefix.length;
+            char[] ia = Arrays.copyOf(prefix, len + n);
+            for (int i = 0; i < 10000; i++) {
+                for (int j = 0; j < n; j++)
+                    ia[len + j] = randomChar();
+                test(ia);
+            }
+        }
+
+        void testPrefix(char[] prefix) {
+            if (prefix.length > 0)
+                System.out.printf("Testing prefix %s%n", string(prefix));
+
+            test(prefix);
+
+            testExhaustively(prefix, 1);
+            // Can you spare a year of CPU time?
+            //testExhaustively(prefix, 2);
+
+            testRandomly(prefix, 2);
+            testRandomly(prefix, 3);
+        }
+    }
+
+    private final static Random rnd = new Random();
+    private static char randomChar() {
+        return (char) rnd.nextInt(Character.MAX_VALUE);
+    }
+    private static char randomHighSurrogate() {
+        return (char) (Character.MIN_HIGH_SURROGATE + rnd.nextInt(1024));
+    }
+    private static char randomLowSurrogate() {
+        return (char) (Character.MIN_LOW_SURROGATE + rnd.nextInt(1024));
+    }
+
+    private static void testCharset(Charset cs) throws Throwable {
+        if (! cs.canEncode())
+            return;
+
+        final String csn = cs.name();
+
+        if (isBroken(csn)) {
+            System.out.printf("Skipping possibly broken charset %s%n", csn);
+            return;
+        }
+        System.out.println(csn);
+
+        CharsetTester tester = new CharsetTester(cs);
+
+        tester.testSurrogates();
+
+        tester.testPrefix(new char[] {});
+
+        if (csn.equals("x-ISCII91")) {
+            System.out.println("More ISCII testing...");
+            new CharsetTester(cs).testPrefix(new char[]{'\u094d'}); // Halant
+            new CharsetTester(cs).testPrefix(new char[]{'\u093c'}); // Nukta
+        }
+    }
+
+    private static void realMain(String[] args) {
+        for (Charset cs : sort(Charset.availableCharsets().values())) {
+            try {
+                testCharset(cs);
+            } catch (TooManyFailures e) {
+                System.out.printf("Too many failures for %s%n", cs);
+            } catch (Throwable t) {
+                unexpected(t);
+            }
+        }
+        reporter.summarize();
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile long passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String format, Object... args) {
+        System.out.println(String.format(format, args)); failed++;}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/FindOneCharEncoderBugs.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,169 @@
+/*
+ * 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 5058133 6233345 6381699 6381702 6381705 6381706
+ * @summary Check that all one-char sequences can be encoded by all charsets
+ * @run main/timeout=1200 FindOneCharEncoderBugs
+ * @author Martin Buchholz
+ */
+
+import java.util.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class FindOneCharEncoderBugs {
+    final static String[] brokenCharsets = {
+        // Delete the following lines when these charsets are fixed!
+        "x-IBM970",
+        "x-COMPOUND_TEXT", // Direct buffers not supported
+    };
+
+    private static boolean equals(byte[] ba, ByteBuffer bb) {
+        if (ba.length != bb.limit())
+            return false;
+        for (int i = 0; i < ba.length; i++)
+            if (ba[i] != bb.get(i))
+                return false;
+        return true;
+    }
+
+    private static String toString(byte[] bytes) {
+        final StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("%02x", (int)b));
+        }
+        return sb.toString();
+    }
+
+    private static String toString(ByteBuffer bb) {
+        final StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < bb.limit(); i++) {
+            if (sb.length() != 0) sb.append(' ');
+            sb.append(String.format("%02x", (int)bb.get(i)));
+        }
+        return sb.toString();
+    }
+
+    private static ByteBuffer convert(Charset cs, char c, CharBuffer cb) throws Throwable {
+        cb.clear(); cb.put(c); cb.flip();
+        return cs.newEncoder()
+            .onUnmappableCharacter(CodingErrorAction.REPLACE)
+            .onMalformedInput(CodingErrorAction.REPLACE)
+            .encode(cb);
+    }
+
+    /** Returns a direct CharBuffer with the same capacity as ordinary CharBuffer ocb */
+    private static CharBuffer directCharBuffer(CharBuffer ocb) {
+        final CharBuffer dcb =
+            ByteBuffer.allocateDirect(ocb.capacity() * Character.SIZE / Byte.SIZE)
+            .asCharBuffer();
+        check(! ocb.isDirect());
+        check(  dcb.isDirect());
+        equal(ocb.capacity(), dcb.capacity());
+        return dcb;
+    }
+
+    private static void testChar(byte[] expected, CharBuffer cb, Charset cs, char c) {
+        try {
+            final ByteBuffer bb = convert(cs, c, cb);
+            if (! equals(expected, bb))
+                fail("bytes differ charset=%s direct=%s char=\\u%04x%n%s%n%s",
+                     cs, cb.isDirect(), (int)c,
+                     toString(expected), toString(bb));
+        } catch (Throwable t) {
+            System.out.printf("Unexpected exception charset=%s direct=%s char=\\u%04x%n",
+                              cs, cb.isDirect(), (int)c);
+            unexpected(t);
+            failed++;
+        }
+    }
+
+    private static void testCharset(Charset cs) throws Throwable {
+        if (! cs.canEncode())
+            return;
+
+        final String csn = cs.name();
+
+        for (String n : brokenCharsets)
+            if (csn.equals(n)) {
+                System.out.printf("Skipping possibly broken charset %s%n", csn);
+                return;
+            }
+        System.out.println(csn);
+
+        final char[] theChar = new char[1];
+        final CharBuffer ocb = CharBuffer.allocate(1);
+        final CharBuffer dcb = directCharBuffer(ocb);
+        final int maxFailuresPerCharset = 5;
+        final int failed0 = failed;
+
+        for (char c = '\u0000';
+             (c+1 != 0x10000) && (failed - failed0 < maxFailuresPerCharset);
+             c++) {
+            theChar[0] = c;
+            byte[] bytes = new String(theChar).getBytes(csn);
+            if (bytes.length == 0)
+                fail("Empty output?! charset=%s char=\\u%04x", cs, (int)c);
+            testChar(bytes, ocb, cs, c);
+            testChar(bytes, dcb, cs, c);
+        }
+    }
+
+    private static void realMain(String[] args) {
+        for (Charset cs : Charset.availableCharsets().values()) {
+            try { testCharset(cs); }
+            catch (Throwable t) { unexpected(t); }
+        }
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String format, Object... args) {
+        System.out.println(String.format(format, args)); failed++;}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+    private static abstract class Fun {abstract void f() throws Throwable;}
+    static void THROWS(Class<? extends Throwable> k, Fun... fs) {
+        for (Fun f : fs)
+            try { f.f(); fail("Expected " + k.getName() + " not thrown"); }
+            catch (Throwable t) {
+                if (k.isAssignableFrom(t.getClass())) pass();
+                else unexpected(t);}}
+    private static abstract class CheckedThread extends Thread {
+        abstract void realRun() throws Throwable;
+        public void run() {
+            try {realRun();} catch (Throwable t) {unexpected(t);}}}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/HWKatakanaMS932EncodeTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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.
+ *
+ * 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 4715330
+   @summary Check MS932/windows-31j encoding (char->byte) for halfwidth katakana chars
+ */
+
+/*
+ * Tests encodeability of the Unicode defined Halfwidth Katakana
+ * characters using the MS932/windows-31j encoder
+ */
+
+public class HWKatakanaMS932EncodeTest {
+   public static void main(String[] args) throws Exception {
+
+        char[] testChars = new char[1];
+        byte[] testBytes = new byte[1];
+        int offset = 0;
+        String encoding = "windows-31j";
+
+        // Halfwidth Katakana chars run from U+FF61 --> U+FF9F
+        // and their native equivalents in Code page 932 run
+        // sequentially from 0xa1 --> 0xdf
+
+        for (int lsByte = 0x61 ; lsByte <= 0x9F; lsByte++, offset++) {
+            testChars[0] = (char) (lsByte | 0xFF00);
+            String s = new String(testChars);
+            testBytes = s.getBytes(encoding);
+            if ( testBytes[0] != (byte)(0xa1 + offset))
+                throw new Exception("failed Test");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ISCIITest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,350 @@
+/*
+ * 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 4328178
+   @summary Performs baseline and regression test on the ISCII91 charset
+ */
+
+import java.io.*;
+
+public class ISCIITest {
+
+    private static void failureReport() {
+        System.err.println ("Failed ISCII91 Regression Test");
+    }
+
+    private static void mapEquiv(int start,
+                                 int end,
+                                 String testName)
+    throws Exception
+    {
+        byte[] singleByte = new byte[1];
+        byte[] encoded = new byte[1];
+
+        for (int i = start; i <= end; i++ ) {
+            singleByte[0] = (byte) i;
+            try {
+                String unicodeStr =
+                        new String (singleByte,"ISCII91");
+
+                if (i != (int)unicodeStr.charAt(0)) {
+                    System.err.println ("FAILED ISCII91 Regression test"
+                                        + "input byte is " + i );
+                    throw new Exception("");
+                }
+                encoded = unicodeStr.getBytes("ISCII91");
+
+                if (encoded[0] != singleByte[0]) {
+                   System.err.println("Encoding error " + testName);
+                   throw new Exception("Failed ISCII91 Regression test");
+                }
+
+            } catch (UnsupportedEncodingException e) {
+                failureReport();
+            }
+        }
+        return;
+    }
+
+    private static void checkUnmapped(int start,
+                                      int end,
+                                      String testName)
+    throws Exception {
+
+        byte[] singleByte = new byte[1];
+
+        for (int i = start; i <= end; i++ ) {
+            singleByte[0] = (byte) i;
+            try {
+                String unicodeStr = new String (singleByte, "ISCII91");
+
+                if (unicodeStr.charAt(0) != '\uFFFD') {
+                    System.err.println("FAILED " + testName +
+                                        "input byte is " + i );
+                    throw new Exception ("Failed ISCII91 regression test");
+                }
+            } catch (UnsupportedEncodingException e) {
+                System.err.println("Unsupported character encoding");
+            }
+        }
+        return;
+    }
+
+    /*
+     *
+     */
+    private static void checkRange(int start, int end,
+                                   char[] expectChars,
+                                   String testName)
+                                   throws Exception {
+        byte[] singleByte = new byte[1];
+        byte[] encoded = new byte[1];
+        int lookupOffset = 0;
+
+        for (int i=start; i <= end; i++ ) {
+            singleByte[0] = (byte) i;
+            String unicodeStr = new String (singleByte, "ISCII91");
+            if (unicodeStr.charAt(0) != expectChars[lookupOffset++]) {
+                throw new Exception ("Failed ISCII91 Regression Test");
+            }
+            encoded = unicodeStr.getBytes("ISCII");
+        }
+        return;
+    }
+
+    /*
+     * Tests the ISCII91 Indic character encoding
+     * as per IS 13194:1991 Bureau of Indian Standards.
+     */
+
+    private static void test () throws Exception {
+
+        try {
+
+
+            // ISCII91 is an 8-byte encoding which retains the ASCII
+            // mappings in the lower half.
+
+            mapEquiv(0, 0x7f, "7 bit ASCII range");
+
+            // Checks a range of characters which are unmappable according
+            // to the standards.
+
+            checkUnmapped(0x81, 0x9f, "UNMAPPED");
+
+            // Vowel Modifier chars can be used to modify the vowel
+            // sound of the preceding consonant, vowel or matra character.
+
+            byte[] testByte = new byte[1];
+            char[] vowelModChars = {
+                '\u0901', // Vowel modifier Chandrabindu
+                '\u0902', // Vowel modifier Anuswar
+                '\u0903'  // Vowel modifier Visarg
+            };
+
+            checkRange(0xa1, 0xa3, vowelModChars, "INDIC VOWEL MODIFIER CHARS");
+
+            char[] expectChars = {
+                '\u0905', // a4 -- Vowel A
+                '\u0906', // a5 -- Vowel AA
+                '\u0907', // a6 -- Vowel I
+                '\u0908', // a7 -- Vowel II
+                '\u0909', // a8 -- Vowel U
+                '\u090a', // a9 -- Vowel UU
+                '\u090b', // aa -- Vowel RI
+                '\u090e', // ab -- Vowel E ( Southern Scripts )
+                '\u090f', // ac -- Vowel EY
+                '\u0910', // ad -- Vowel AI
+                '\u090d', // ae -- Vowel AYE ( Devanagari Script )
+                '\u0912', // af -- Vowel O ( Southern Scripts )
+                '\u0913', // b0 -- Vowel OW
+                '\u0914', // b1 -- Vowel AU
+                '\u0911', // b2 -- Vowel AWE ( Devanagari Script )
+            };
+
+            checkRange(0xa4, 0xb2, expectChars, "INDIC VOWELS");
+
+            char[] expectConsChars =
+            {
+                '\u0915', // b3 -- Consonant KA
+                '\u0916', // b4 -- Consonant KHA
+                '\u0917', // b5 -- Consonant GA
+                '\u0918', // b6 -- Consonant GHA
+                '\u0919', // b7 -- Consonant NGA
+                '\u091a', // b8 -- Consonant CHA
+                '\u091b', // b9 -- Consonant CHHA
+                '\u091c', // ba -- Consonant JA
+                '\u091d', // bb -- Consonant JHA
+                '\u091e', // bc -- Consonant JNA
+                '\u091f', // bd -- Consonant Hard TA
+                '\u0920', // be -- Consonant Hard THA
+                '\u0921', // bf -- Consonant Hard DA
+                '\u0922', // c0 -- Consonant Hard DHA
+                '\u0923', // c1 -- Consonant Hard NA
+                '\u0924', // c2 -- Consonant Soft TA
+                '\u0925', // c3 -- Consonant Soft THA
+                '\u0926', // c4 -- Consonant Soft DA
+                '\u0927', // c5 -- Consonant Soft DHA
+                '\u0928', // c6 -- Consonant Soft NA
+                '\u0929', // c7 -- Consonant NA ( Tamil )
+                '\u092a', // c8 -- Consonant PA
+                '\u092b', // c9 -- Consonant PHA
+                '\u092c', // ca -- Consonant BA
+                '\u092d', // cb -- Consonant BHA
+                '\u092e', // cc -- Consonant MA
+                '\u092f', // cd -- Consonant YA
+                '\u095f', // ce -- Consonant JYA ( Bengali, Assamese & Oriya )
+                '\u0930', // cf -- Consonant RA
+                '\u0931', // d0 -- Consonant Hard RA ( Southern Scripts )
+                '\u0932', // d1 -- Consonant LA
+                '\u0933', // d2 -- Consonant Hard LA
+                '\u0934', // d3 -- Consonant ZHA ( Tamil & Malayalam )
+                '\u0935', // d4 -- Consonant VA
+                '\u0936', // d5 -- Consonant SHA
+                '\u0937', // d6 -- Consonant Hard SHA
+                '\u0938', // d7 -- Consonant SA
+                '\u0939', // d8 -- Consonant HA
+            };
+
+            checkRange(0xb3, 0xd8, expectConsChars, "INDIC CONSONANTS");
+
+            char[] matraChars = {
+                '\u093e', // da -- Vowel Sign AA
+                '\u093f', // db -- Vowel Sign I
+                '\u0940', // dc -- Vowel Sign II
+                '\u0941', // dd -- Vowel Sign U
+                '\u0942', // de -- Vowel Sign UU
+                '\u0943', // df -- Vowel Sign RI
+                '\u0946', // e0 -- Vowel Sign E ( Southern Scripts )
+                '\u0947', // e1 -- Vowel Sign EY
+                '\u0948', // e2 -- Vowel Sign AI
+                '\u0945', // e3 -- Vowel Sign AYE ( Devanagari Script )
+                '\u094a', // e4 -- Vowel Sign O ( Southern Scripts )
+                '\u094b', // e5 -- Vowel Sign OW
+                '\u094c', // e6 -- Vowel Sign AU
+                '\u0949' // e7 -- Vowel Sign AWE ( Devanagari Script )
+            };
+
+            // Matras or Vowel signs alter the implicit
+            // vowel sound associated with an Indic consonant.
+
+            checkRange(0xda, 0xe7, matraChars, "INDIC MATRAS");
+
+            char[] loneContextModifierChars = {
+            '\u094d', // e8 -- Vowel Omission Sign ( Halant )
+            '\u093c', // e9 -- Diacritic Sign ( Nukta )
+            '\u0964' // ea -- Full Stop ( Viram, Northern Scripts )
+            };
+
+            checkRange(0xe8, 0xea,
+                       loneContextModifierChars, "LONE INDIC CONTEXT CHARS");
+
+
+            // Test Indic script numeral chars
+            // (as opposed to international numerals)
+
+            char[] expectNumeralChars =
+            {
+                '\u0966', // f1 -- Digit 0
+                '\u0967', // f2 -- Digit 1
+                '\u0968', // f3 -- Digit 2
+                '\u0969', // f4 -- Digit 3
+                '\u096a', // f5 -- Digit 4
+                '\u096b', // f6 -- Digit 5
+                '\u096c', // f7 -- Digit 6
+                '\u096d', // f8 -- Digit 7
+                '\u096e', // f9 -- Digit 8
+                '\u096f'  // fa -- Digit 9
+            };
+
+            checkRange(0xf1, 0xfa,
+                       expectNumeralChars, "NUMERAL/DIGIT CHARACTERS");
+            int lookupOffset = 0;
+
+            char[] expectNuktaSub = {
+                '\u0950',
+                '\u090c',
+                '\u0961',
+                '\u0960',
+                '\u0962',
+                '\u0963',
+                '\u0944',
+                '\u093d'
+            };
+
+            /*
+             * ISCII uses a number of code extension techniques
+             * to access a number of lesser used characters.
+             * The Nukta character which ordinarily signifies
+             * a diacritic is used in combination with existing
+             * characters to escape them to a different character.
+             * value.
+            */
+
+            byte[] codeExtensionBytes = {
+                (byte)0xa1 , (byte)0xe9, // Chandrabindu + Nukta
+                                         // =>DEVANAGARI OM SIGN
+                (byte)0xa6 , (byte)0xe9, // Vowel I + Nukta
+                                         // => DEVANAGARI VOCALIC L
+                (byte)0xa7 , (byte)0xe9, // Vowel II + Nukta
+                                         // => DEVANAGARI VOCALIC LL
+                (byte)0xaa , (byte)0xe9, // Vowel RI + Nukta
+                                         // => DEVANAGARI VOCALIC RR
+                (byte)0xdb , (byte)0xe9, //  Vowel sign I + Nukta
+                                         // => DEVANAGARI VOWEL SIGN VOCALIC L
+                (byte)0xdc , (byte)0xe9, // Vowel sign II + Nukta
+                                         // => DEVANAGARI VOWEL SIGN VOCALIC LL
+
+                (byte)0xdf , (byte)0xe9, // Vowel sign Vocalic R + Nukta
+                                         // => DEVANAGARI VOWEL SIGN VOCALIC RR
+                (byte)0xea , (byte)0xe9  // Full stop/Phrase separator + Nukta
+                                         // => DEVANAGARI SIGN AVAGRAHA
+            };
+
+            lookupOffset = 0;
+            byte[] bytePair = new byte[2];
+
+            for (int i=0; i < (codeExtensionBytes.length)/2; i++ ) {
+                bytePair[0] = (byte) codeExtensionBytes[lookupOffset++];
+                bytePair[1] = (byte) codeExtensionBytes[lookupOffset++];
+
+                String unicodeStr = new String (bytePair,"ISCII91");
+                if (unicodeStr.charAt(0) != expectNuktaSub[i]) {
+                    throw new Exception("Failed Nukta Sub");
+                }
+            }
+
+            lookupOffset = 0;
+            byte[] comboBytes = {
+                (byte)0xe8 , (byte)0xe8, //HALANT + HALANT
+                (byte)0xe8 , (byte)0xe9  //HALANT + NUKTA    aka. Soft Halant
+            };
+            char[] expectCombChars = {
+                '\u094d',
+                '\u200c',
+                '\u094d',
+                '\u200d'
+            };
+
+            for (int i=0; i < (comboBytes.length)/2; i++ ) {
+                bytePair[0] = (byte) comboBytes[lookupOffset++];
+                bytePair[1] = (byte) comboBytes[lookupOffset];
+                String unicodeStr = new String (bytePair, "ISCII91");
+                if (unicodeStr.charAt(0) != expectCombChars[lookupOffset-1]
+                    && unicodeStr.charAt(1) != expectCombChars[lookupOffset]) {
+                    throw new Exception("Failed ISCII91 Regression Test");
+                }
+                lookupOffset++;
+            }
+
+        } catch (UnsupportedEncodingException e) {
+             System.err.println ("ISCII91 encoding not supported");
+             throw new Exception ("Failed ISCII91 Regression Test");
+        }
+    }
+
+    public static void main (String[] args) throws Exception {
+        test();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ISO2022JP.trailEsc	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,454 @@
+test0
+  $B!!(B $B!"(B $B!#(B $B!$(B $B!%(B $B!&(B $B!'(B $B!((B $B!)(B $B!*(B $B!+(B $B!,(B $B!-(B $B!.(B $B!/(B
+$B!0(B $B!1(B $B!2(B $B!3(B $B!4(B $B!5(B $B!6(B $B!7(B $B!8(B $B!9(B $B!:(B $B!;(B $B!<(B $B!=(B $B!>(B $B!?(B
+  $B!A(B $B!B(B $B!C(B $B!D(B $B!E(B $B!F(B $B!G(B $B!H(B $B!I(B $B!J(B $B!K(B $B!L(B $B!M(B $B!N(B $B!O(B
+$B!P(B $B!Q(B $B!R(B $B!S(B $B!T(B $B!U(B $B!V(B $B!W(B $B!X(B $B!Y(B $B!Z(B $B![(B $B!\(B $B!](B $B!^(B $B!_(B
+$B!`(B $B!a(B $B!b(B $B!c(B $B!d(B $B!e(B $B!f(B $B!g(B $B!h(B $B!i(B $B!j(B $B!k(B $B!l(B $B!m(B $B!n(B $B!o(B
+$B!p(B $B!q(B $B!r(B $B!s(B $B!t(B $B!u(B $B!v(B $B!w(B $B!x(B $B!y(B $B!z(B $B!{(B $B!|(B $B!}(B $B!~(B
+  $B"!(B $B""(B $B"#(B $B"$(B $B"%(B $B"&(B $B"'(B $B"((B $B")(B $B"*(B $B"+(B $B",(B $B"-(B $B".(B
+                    $B":(B $B";(B $B"<(B $B"=(B $B">(B $B"?(B
+$B"@(B $B"A(B                 $B"J(B $B"K(B $B"L(B $B"M(B $B"N(B $B"O(B
+$B"P(B                       $B"\(B $B"](B $B"^(B $B"_(B
+$B"`(B $B"a(B $B"b(B $B"c(B $B"d(B $B"e(B $B"f(B $B"g(B $B"h(B $B"i(B $B"j(B
+    $B"r(B $B"s(B $B"t(B $B"u(B $B"v(B $B"w(B $B"x(B $B"y(B         $B"~(B
+$B#0(B $B#1(B $B#2(B $B#3(B $B#4(B $B#5(B $B#6(B $B#7(B $B#8(B $B#9(B
+   $B#A(B $B#B(B $B#C(B $B#D(B $B#E(B $B#F(B $B#G(B $B#H(B $B#I(B $B#J(B $B#K(B $B#L(B $B#M(B $B#N(B $B#O(B
+$B#P(B $B#Q(B $B#R(B $B#S(B $B#T(B $B#U(B $B#V(B $B#W(B $B#X(B $B#Y(B $B#Z(B
+   $B#a(B $B#b(B $B#c(B $B#d(B $B#e(B $B#f(B $B#g(B $B#h(B $B#i(B $B#j(B $B#k(B $B#l(B $B#m(B $B#n(B $B#o(B
+$B#p(B $B#q(B $B#r(B $B#s(B $B#t(B $B#u(B $B#v(B $B#w(B $B#x(B $B#y(B $B#z(B
+   $B$!(B $B$"(B $B$#(B $B$$(B $B$%(B $B$&(B $B$'(B $B$((B $B$)(B $B$*(B $B$+(B $B$,(B $B$-(B $B$.(B $B$/(B
+$B$0(B $B$1(B $B$2(B $B$3(B $B$4(B $B$5(B $B$6(B $B$7(B $B$8(B $B$9(B $B$:(B $B$;(B $B$<(B $B$=(B $B$>(B $B$?(B
+$B$@(B $B$A(B $B$B(B $B$C(B $B$D(B $B$E(B $B$F(B $B$G(B $B$H(B $B$I(B $B$J(B $B$K(B $B$L(B $B$M(B $B$N(B $B$O(B
+$B$P(B $B$Q(B $B$R(B $B$S(B $B$T(B $B$U(B $B$V(B $B$W(B $B$X(B $B$Y(B $B$Z(B $B$[(B $B$\(B $B$](B $B$^(B $B$_(B
+$B$`(B $B$a(B $B$b(B $B$c(B $B$d(B $B$e(B $B$f(B $B$g(B $B$h(B $B$i(B $B$j(B $B$k(B $B$l(B $B$m(B $B$n(B $B$o(B
+$B$p(B $B$q(B $B$r(B $B$s(B
+   $B%!(B $B%"(B $B%#(B $B%$(B $B%%(B $B%&(B $B%'(B $B%((B $B%)(B $B%*(B $B%+(B $B%,(B $B%-(B $B%.(B $B%/(B
+$B%0(B $B%1(B $B%2(B $B%3(B $B%4(B $B%5(B $B%6(B $B%7(B $B%8(B $B%9(B $B%:(B $B%;(B $B%<(B $B%=(B $B%>(B $B%?(B
+$B%@(B $B%A(B $B%B(B $B%C(B $B%D(B $B%E(B $B%F(B $B%G(B $B%H(B $B%I(B $B%J(B $B%K(B $B%L(B $B%M(B $B%N(B $B%O(B
+$B%P(B $B%Q(B $B%R(B $B%S(B $B%T(B $B%U(B $B%V(B $B%W(B $B%X(B $B%Y(B $B%Z(B $B%[(B $B%\(B $B%](B $B%^(B $B%_(B
+$B%`(B $B%a(B $B%b(B $B%c(B $B%d(B $B%e(B $B%f(B $B%g(B $B%h(B $B%i(B $B%j(B $B%k(B $B%l(B $B%m(B $B%n(B $B%o(B
+$B%p(B $B%q(B $B%r(B $B%s(B $B%t(B $B%u(B $B%v(B
+  $B&!(B $B&"(B $B&#(B $B&$(B $B&%(B $B&&(B $B&'(B $B&((B $B&)(B $B&*(B $B&+(B $B&,(B $B&-(B $B&.(B $B&/(B
+$B&0(B $B&1(B $B&2(B $B&3(B $B&4(B $B&5(B $B&6(B $B&7(B $B&8(B
+  $B&A(B $B&B(B $B&C(B $B&D(B $B&E(B $B&F(B $B&G(B $B&H(B $B&I(B $B&J(B $B&K(B $B&L(B $B&M(B $B&N(B $B&O(B
+$B&P(B $B&Q(B $B&R(B $B&S(B $B&T(B $B&U(B $B&V(B $B&W(B $B&X(B
+  $B'!(B $B'"(B $B'#(B $B'$(B $B'%(B $B'&(B $B''(B $B'((B $B')(B $B'*(B $B'+(B $B',(B $B'-(B $B'.(B $B'/(B
+$B'0(B $B'1(B $B'2(B $B'3(B $B'4(B $B'5(B $B'6(B $B'7(B $B'8(B $B'9(B $B':(B $B';(B $B'<(B $B'=(B $B'>(B $B'?(B
+$B'@(B $B'A(B
+  $B'Q(B $B'R(B $B'S(B $B'T(B $B'U(B $B'V(B $B'W(B $B'X(B $B'Y(B $B'Z(B $B'[(B $B'\(B $B'](B $B'^(B $B'_(B
+$B'`(B $B'a(B $B'b(B $B'c(B $B'd(B $B'e(B $B'f(B $B'g(B $B'h(B $B'i(B $B'j(B $B'k(B $B'l(B $B'm(B $B'n(B $B'o(B
+$B'p(B $B'q(B
+  $B(!(B $B("(B $B(#(B $B($(B $B(%(B $B(&(B $B('(B $B(((B $B()(B $B(*(B $B(+(B $B(,(B $B(-(B $B(.(B $B(/(B
+$B(0(B $B(1(B $B(2(B $B(3(B $B(4(B $B(5(B $B(6(B $B(7(B $B(8(B $B(9(B $B(:(B $B(;(B $B(<(B $B(=(B $B(>(B $B(?(B
+$B(@(B
+   $B0!(B $B0"(B $B0#(B $B0$(B $B0%(B $B0&(B $B0'(B $B0((B $B0)(B $B0*(B $B0+(B $B0,(B $B0-(B $B0.(B $B0/(B
+$B00(B $B01(B $B02(B $B03(B $B04(B $B05(B $B06(B $B07(B $B08(B $B09(B $B0:(B $B0;(B $B0<(B $B0=(B $B0>(B $B0?(B
+$B0@(B $B0A(B $B0B(B $B0C(B $B0D(B $B0E(B $B0F(B $B0G(B $B0H(B $B0I(B $B0J(B $B0K(B $B0L(B $B0M(B $B0N(B $B0O(B
+$B0P(B $B0Q(B $B0R(B $B0S(B $B0T(B $B0U(B $B0V(B $B0W(B $B0X(B $B0Y(B $B0Z(B $B0[(B $B0\(B $B0](B $B0^(B $B0_(B
+$B0`(B $B0a(B $B0b(B $B0c(B $B0d(B $B0e(B $B0f(B $B0g(B $B0h(B $B0i(B $B0j(B $B0k(B $B0l(B $B0m(B $B0n(B $B0o(B
+$B0p(B $B0q(B $B0r(B $B0s(B $B0t(B $B0u(B $B0v(B $B0w(B $B0x(B $B0y(B $B0z(B $B0{(B $B0|(B $B0}(B $B0~(B
+   $B1!(B $B1"(B $B1#(B $B1$(B $B1%(B $B1&(B $B1'(B $B1((B $B1)(B $B1*(B $B1+(B $B1,(B $B1-(B $B1.(B $B1/(B
+$B10(B $B11(B $B12(B $B13(B $B14(B $B15(B $B16(B $B17(B $B18(B $B19(B $B1:(B $B1;(B $B1<(B $B1=(B $B1>(B $B1?(B
+$B1@(B $B1A(B $B1B(B $B1C(B $B1D(B $B1E(B $B1F(B $B1G(B $B1H(B $B1I(B $B1J(B $B1K(B $B1L(B $B1M(B $B1N(B $B1O(B
+$B1P(B $B1Q(B $B1R(B $B1S(B $B1T(B $B1U(B $B1V(B $B1W(B $B1X(B $B1Y(B $B1Z(B $B1[(B $B1\(B $B1](B $B1^(B $B1_(B
+$B1`(B $B1a(B $B1b(B $B1c(B $B1d(B $B1e(B $B1f(B $B1g(B $B1h(B $B1i(B $B1j(B $B1k(B $B1l(B $B1m(B $B1n(B $B1o(B
+$B1p(B $B1q(B $B1r(B $B1s(B $B1t(B $B1u(B $B1v(B $B1w(B $B1x(B $B1y(B $B1z(B $B1{(B $B1|(B $B1}(B $B1~(B
+   $B2!(B $B2"(B $B2#(B $B2$(B $B2%(B $B2&(B $B2'(B $B2((B $B2)(B $B2*(B $B2+(B $B2,(B $B2-(B $B2.(B $B2/(B
+$B20(B $B21(B $B22(B $B23(B $B24(B $B25(B $B26(B $B27(B $B28(B $B29(B $B2:(B $B2;(B $B2<(B $B2=(B $B2>(B $B2?(B
+$B2@(B $B2A(B $B2B(B $B2C(B $B2D(B $B2E(B $B2F(B $B2G(B $B2H(B $B2I(B $B2J(B $B2K(B $B2L(B $B2M(B $B2N(B $B2O(B
+$B2P(B $B2Q(B $B2R(B $B2S(B $B2T(B $B2U(B $B2V(B $B2W(B $B2X(B $B2Y(B $B2Z(B $B2[(B $B2\(B $B2](B $B2^(B $B2_(B
+$B2`(B $B2a(B $B2b(B $B2c(B $B2d(B $B2e(B $B2f(B $B2g(B $B2h(B $B2i(B $B2j(B $B2k(B $B2l(B $B2m(B $B2n(B $B2o(B
+$B2p(B $B2q(B $B2r(B $B2s(B $B2t(B $B2u(B $B2v(B $B2w(B $B2x(B $B2y(B $B2z(B $B2{(B $B2|(B $B2}(B $B2~(B
+   $B3!(B $B3"(B $B3#(B $B3$(B $B3%(B $B3&(B $B3'(B $B3((B $B3)(B $B3*(B $B3+(B $B3,(B $B3-(B $B3.(B $B3/(B
+$B30(B $B31(B $B32(B $B33(B $B34(B $B35(B $B36(B $B37(B $B38(B $B39(B $B3:(B $B3;(B $B3<(B $B3=(B $B3>(B $B3?(B
+$B3@(B $B3A(B $B3B(B $B3C(B $B3D(B $B3E(B $B3F(B $B3G(B $B3H(B $B3I(B $B3J(B $B3K(B $B3L(B $B3M(B $B3N(B $B3O(B
+$B3P(B $B3Q(B $B3R(B $B3S(B $B3T(B $B3U(B $B3V(B $B3W(B $B3X(B $B3Y(B $B3Z(B $B3[(B $B3\(B $B3](B $B3^(B $B3_(B
+$B3`(B $B3a(B $B3b(B $B3c(B $B3d(B $B3e(B $B3f(B $B3g(B $B3h(B $B3i(B $B3j(B $B3k(B $B3l(B $B3m(B $B3n(B $B3o(B
+$B3p(B $B3q(B $B3r(B $B3s(B $B3t(B $B3u(B $B3v(B $B3w(B $B3x(B $B3y(B $B3z(B $B3{(B $B3|(B $B3}(B $B3~(B
+   $B4!(B $B4"(B $B4#(B $B4$(B $B4%(B $B4&(B $B4'(B $B4((B $B4)(B $B4*(B $B4+(B $B4,(B $B4-(B $B4.(B $B4/(B
+$B40(B $B41(B $B42(B $B43(B $B44(B $B45(B $B46(B $B47(B $B48(B $B49(B $B4:(B $B4;(B $B4<(B $B4=(B $B4>(B $B4?(B
+$B4@(B $B4A(B $B4B(B $B4C(B $B4D(B $B4E(B $B4F(B $B4G(B $B4H(B $B4I(B $B4J(B $B4K(B $B4L(B $B4M(B $B4N(B $B4O(B
+$B4P(B $B4Q(B $B4R(B $B4S(B $B4T(B $B4U(B $B4V(B $B4W(B $B4X(B $B4Y(B $B4Z(B $B4[(B $B4\(B $B4](B $B4^(B $B4_(B
+$B4`(B $B4a(B $B4b(B $B4c(B $B4d(B $B4e(B $B4f(B $B4g(B $B4h(B $B4i(B $B4j(B $B4k(B $B4l(B $B4m(B $B4n(B $B4o(B
+$B4p(B $B4q(B $B4r(B $B4s(B $B4t(B $B4u(B $B4v(B $B4w(B $B4x(B $B4y(B $B4z(B $B4{(B $B4|(B $B4}(B $B4~(B
+   $B5!(B $B5"(B $B5#(B $B5$(B $B5%(B $B5&(B $B5'(B $B5((B $B5)(B $B5*(B $B5+(B $B5,(B $B5-(B $B5.(B $B5/(B
+$B50(B $B51(B $B52(B $B53(B $B54(B $B55(B $B56(B $B57(B $B58(B $B59(B $B5:(B $B5;(B $B5<(B $B5=(B $B5>(B $B5?(B
+$B5@(B $B5A(B $B5B(B $B5C(B $B5D(B $B5E(B $B5F(B $B5G(B $B5H(B $B5I(B $B5J(B $B5K(B $B5L(B $B5M(B $B5N(B $B5O(B
+$B5P(B $B5Q(B $B5R(B $B5S(B $B5T(B $B5U(B $B5V(B $B5W(B $B5X(B $B5Y(B $B5Z(B $B5[(B $B5\(B $B5](B $B5^(B $B5_(B
+$B5`(B $B5a(B $B5b(B $B5c(B $B5d(B $B5e(B $B5f(B $B5g(B $B5h(B $B5i(B $B5j(B $B5k(B $B5l(B $B5m(B $B5n(B $B5o(B
+$B5p(B $B5q(B $B5r(B $B5s(B $B5t(B $B5u(B $B5v(B $B5w(B $B5x(B $B5y(B $B5z(B $B5{(B $B5|(B $B5}(B $B5~(B
+   $B6!(B $B6"(B $B6#(B $B6$(B $B6%(B $B6&(B $B6'(B $B6((B $B6)(B $B6*(B $B6+(B $B6,(B $B6-(B $B6.(B $B6/(B
+$B60(B $B61(B $B62(B $B63(B $B64(B $B65(B $B66(B $B67(B $B68(B $B69(B $B6:(B $B6;(B $B6<(B $B6=(B $B6>(B $B6?(B
+$B6@(B $B6A(B $B6B(B $B6C(B $B6D(B $B6E(B $B6F(B $B6G(B $B6H(B $B6I(B $B6J(B $B6K(B $B6L(B $B6M(B $B6N(B $B6O(B
+$B6P(B $B6Q(B $B6R(B $B6S(B $B6T(B $B6U(B $B6V(B $B6W(B $B6X(B $B6Y(B $B6Z(B $B6[(B $B6\(B $B6](B $B6^(B $B6_(B
+$B6`(B $B6a(B $B6b(B $B6c(B $B6d(B $B6e(B $B6f(B $B6g(B $B6h(B $B6i(B $B6j(B $B6k(B $B6l(B $B6m(B $B6n(B $B6o(B
+$B6p(B $B6q(B $B6r(B $B6s(B $B6t(B $B6u(B $B6v(B $B6w(B $B6x(B $B6y(B $B6z(B $B6{(B $B6|(B $B6}(B $B6~(B
+   $B7!(B $B7"(B $B7#(B $B7$(B $B7%(B $B7&(B $B7'(B $B7((B $B7)(B $B7*(B $B7+(B $B7,(B $B7-(B $B7.(B $B7/(B
+$B70(B $B71(B $B72(B $B73(B $B74(B $B75(B $B76(B $B77(B $B78(B $B79(B $B7:(B $B7;(B $B7<(B $B7=(B $B7>(B $B7?(B
+$B7@(B $B7A(B $B7B(B $B7C(B $B7D(B $B7E(B $B7F(B $B7G(B $B7H(B $B7I(B $B7J(B $B7K(B $B7L(B $B7M(B $B7N(B $B7O(B
+$B7P(B $B7Q(B $B7R(B $B7S(B $B7T(B $B7U(B $B7V(B $B7W(B $B7X(B $B7Y(B $B7Z(B $B7[(B $B7\(B $B7](B $B7^(B $B7_(B
+$B7`(B $B7a(B $B7b(B $B7c(B $B7d(B $B7e(B $B7f(B $B7g(B $B7h(B $B7i(B $B7j(B $B7k(B $B7l(B $B7m(B $B7n(B $B7o(B
+$B7p(B $B7q(B $B7r(B $B7s(B $B7t(B $B7u(B $B7v(B $B7w(B $B7x(B $B7y(B $B7z(B $B7{(B $B7|(B $B7}(B $B7~(B
+   $B8!(B $B8"(B $B8#(B $B8$(B $B8%(B $B8&(B $B8'(B $B8((B $B8)(B $B8*(B $B8+(B $B8,(B $B8-(B $B8.(B $B8/(B
+$B80(B $B81(B $B82(B $B83(B $B84(B $B85(B $B86(B $B87(B $B88(B $B89(B $B8:(B $B8;(B $B8<(B $B8=(B $B8>(B $B8?(B
+$B8@(B $B8A(B $B8B(B $B8C(B $B8D(B $B8E(B $B8F(B $B8G(B $B8H(B $B8I(B $B8J(B $B8K(B $B8L(B $B8M(B $B8N(B $B8O(B
+$B8P(B $B8Q(B $B8R(B $B8S(B $B8T(B $B8U(B $B8V(B $B8W(B $B8X(B $B8Y(B $B8Z(B $B8[(B $B8\(B $B8](B $B8^(B $B8_(B
+$B8`(B $B8a(B $B8b(B $B8c(B $B8d(B $B8e(B $B8f(B $B8g(B $B8h(B $B8i(B $B8j(B $B8k(B $B8l(B $B8m(B $B8n(B $B8o(B
+$B8p(B $B8q(B $B8r(B $B8s(B $B8t(B $B8u(B $B8v(B $B8w(B $B8x(B $B8y(B $B8z(B $B8{(B $B8|(B $B8}(B $B8~(B
+   $B9!(B $B9"(B $B9#(B $B9$(B $B9%(B $B9&(B $B9'(B $B9((B $B9)(B $B9*(B $B9+(B $B9,(B $B9-(B $B9.(B $B9/(B
+$B90(B $B91(B $B92(B $B93(B $B94(B $B95(B $B96(B $B97(B $B98(B $B99(B $B9:(B $B9;(B $B9<(B $B9=(B $B9>(B $B9?(B
+$B9@(B $B9A(B $B9B(B $B9C(B $B9D(B $B9E(B $B9F(B $B9G(B $B9H(B $B9I(B $B9J(B $B9K(B $B9L(B $B9M(B $B9N(B $B9O(B
+$B9P(B $B9Q(B $B9R(B $B9S(B $B9T(B $B9U(B $B9V(B $B9W(B $B9X(B $B9Y(B $B9Z(B $B9[(B $B9\(B $B9](B $B9^(B $B9_(B
+$B9`(B $B9a(B $B9b(B $B9c(B $B9d(B $B9e(B $B9f(B $B9g(B $B9h(B $B9i(B $B9j(B $B9k(B $B9l(B $B9m(B $B9n(B $B9o(B
+$B9p(B $B9q(B $B9r(B $B9s(B $B9t(B $B9u(B $B9v(B $B9w(B $B9x(B $B9y(B $B9z(B $B9{(B $B9|(B $B9}(B $B9~(B
+   $B:!(B $B:"(B $B:#(B $B:$(B $B:%(B $B:&(B $B:'(B $B:((B $B:)(B $B:*(B $B:+(B $B:,(B $B:-(B $B:.(B $B:/(B
+$B:0(B $B:1(B $B:2(B $B:3(B $B:4(B $B:5(B $B:6(B $B:7(B $B:8(B $B:9(B $B::(B $B:;(B $B:<(B $B:=(B $B:>(B $B:?(B
+$B:@(B $B:A(B $B:B(B $B:C(B $B:D(B $B:E(B $B:F(B $B:G(B $B:H(B $B:I(B $B:J(B $B:K(B $B:L(B $B:M(B $B:N(B $B:O(B
+$B:P(B $B:Q(B $B:R(B $B:S(B $B:T(B $B:U(B $B:V(B $B:W(B $B:X(B $B:Y(B $B:Z(B $B:[(B $B:\(B $B:](B $B:^(B $B:_(B
+$B:`(B $B:a(B $B:b(B $B:c(B $B:d(B $B:e(B $B:f(B $B:g(B $B:h(B $B:i(B $B:j(B $B:k(B $B:l(B $B:m(B $B:n(B $B:o(B
+$B:p(B $B:q(B $B:r(B $B:s(B $B:t(B $B:u(B $B:v(B $B:w(B $B:x(B $B:y(B $B:z(B $B:{(B $B:|(B $B:}(B $B:~(B
+   $B;!(B $B;"(B $B;#(B $B;$(B $B;%(B $B;&(B $B;'(B $B;((B $B;)(B $B;*(B $B;+(B $B;,(B $B;-(B $B;.(B $B;/(B
+$B;0(B $B;1(B $B;2(B $B;3(B $B;4(B $B;5(B $B;6(B $B;7(B $B;8(B $B;9(B $B;:(B $B;;(B $B;<(B $B;=(B $B;>(B $B;?(B
+$B;@(B $B;A(B $B;B(B $B;C(B $B;D(B $B;E(B $B;F(B $B;G(B $B;H(B $B;I(B $B;J(B $B;K(B $B;L(B $B;M(B $B;N(B $B;O(B
+$B;P(B $B;Q(B $B;R(B $B;S(B $B;T(B $B;U(B $B;V(B $B;W(B $B;X(B $B;Y(B $B;Z(B $B;[(B $B;\(B $B;](B $B;^(B $B;_(B
+$B;`(B $B;a(B $B;b(B $B;c(B $B;d(B $B;e(B $B;f(B $B;g(B $B;h(B $B;i(B $B;j(B $B;k(B $B;l(B $B;m(B $B;n(B $B;o(B
+$B;p(B $B;q(B $B;r(B $B;s(B $B;t(B $B;u(B $B;v(B $B;w(B $B;x(B $B;y(B $B;z(B $B;{(B $B;|(B $B;}(B $B;~(B
+   $B<!(B $B<"(B $B<#(B $B<$(B $B<%(B $B<&(B $B<'(B $B<((B $B<)(B $B<*(B $B<+(B $B<,(B $B<-(B $B<.(B $B</(B
+$B<0(B $B<1(B $B<2(B $B<3(B $B<4(B $B<5(B $B<6(B $B<7(B $B<8(B $B<9(B $B<:(B $B<;(B $B<<(B $B<=(B $B<>(B $B<?(B
+$B<@(B $B<A(B $B<B(B $B<C(B $B<D(B $B<E(B $B<F(B $B<G(B $B<H(B $B<I(B $B<J(B $B<K(B $B<L(B $B<M(B $B<N(B $B<O(B
+$B<P(B $B<Q(B $B<R(B $B<S(B $B<T(B $B<U(B $B<V(B $B<W(B $B<X(B $B<Y(B $B<Z(B $B<[(B $B<\(B $B<](B $B<^(B $B<_(B
+$B<`(B $B<a(B $B<b(B $B<c(B $B<d(B $B<e(B $B<f(B $B<g(B $B<h(B $B<i(B $B<j(B $B<k(B $B<l(B $B<m(B $B<n(B $B<o(B
+$B<p(B $B<q(B $B<r(B $B<s(B $B<t(B $B<u(B $B<v(B $B<w(B $B<x(B $B<y(B $B<z(B $B<{(B $B<|(B $B<}(B $B<~(B
+   $B=!(B $B="(B $B=#(B $B=$(B $B=%(B $B=&(B $B='(B $B=((B $B=)(B $B=*(B $B=+(B $B=,(B $B=-(B $B=.(B $B=/(B
+$B=0(B $B=1(B $B=2(B $B=3(B $B=4(B $B=5(B $B=6(B $B=7(B $B=8(B $B=9(B $B=:(B $B=;(B $B=<(B $B==(B $B=>(B $B=?(B
+$B=@(B $B=A(B $B=B(B $B=C(B $B=D(B $B=E(B $B=F(B $B=G(B $B=H(B $B=I(B $B=J(B $B=K(B $B=L(B $B=M(B $B=N(B $B=O(B
+$B=P(B $B=Q(B $B=R(B $B=S(B $B=T(B $B=U(B $B=V(B $B=W(B $B=X(B $B=Y(B $B=Z(B $B=[(B $B=\(B $B=](B $B=^(B $B=_(B
+$B=`(B $B=a(B $B=b(B $B=c(B $B=d(B $B=e(B $B=f(B $B=g(B $B=h(B $B=i(B $B=j(B $B=k(B $B=l(B $B=m(B $B=n(B $B=o(B
+$B=p(B $B=q(B $B=r(B $B=s(B $B=t(B $B=u(B $B=v(B $B=w(B $B=x(B $B=y(B $B=z(B $B={(B $B=|(B $B=}(B $B=~(B
+   $B>!(B $B>"(B $B>#(B $B>$(B $B>%(B $B>&(B $B>'(B $B>((B $B>)(B $B>*(B $B>+(B $B>,(B $B>-(B $B>.(B $B>/(B
+$B>0(B $B>1(B $B>2(B $B>3(B $B>4(B $B>5(B $B>6(B $B>7(B $B>8(B $B>9(B $B>:(B $B>;(B $B><(B $B>=(B $B>>(B $B>?(B
+$B>@(B $B>A(B $B>B(B $B>C(B $B>D(B $B>E(B $B>F(B $B>G(B $B>H(B $B>I(B $B>J(B $B>K(B $B>L(B $B>M(B $B>N(B $B>O(B
+$B>P(B $B>Q(B $B>R(B $B>S(B $B>T(B $B>U(B $B>V(B $B>W(B $B>X(B $B>Y(B $B>Z(B $B>[(B $B>\(B $B>](B $B>^(B $B>_(B
+$B>`(B $B>a(B $B>b(B $B>c(B $B>d(B $B>e(B $B>f(B $B>g(B $B>h(B $B>i(B $B>j(B $B>k(B $B>l(B $B>m(B $B>n(B $B>o(B
+$B>p(B $B>q(B $B>r(B $B>s(B $B>t(B $B>u(B $B>v(B $B>w(B $B>x(B $B>y(B $B>z(B $B>{(B $B>|(B $B>}(B $B>~(B
+   $B?!(B $B?"(B $B?#(B $B?$(B $B?%(B $B?&(B $B?'(B $B?((B $B?)(B $B?*(B $B?+(B $B?,(B $B?-(B $B?.(B $B?/(B
+$B?0(B $B?1(B $B?2(B $B?3(B $B?4(B $B?5(B $B?6(B $B?7(B $B?8(B $B?9(B $B?:(B $B?;(B $B?<(B $B?=(B $B?>(B $B??(B
+$B?@(B $B?A(B $B?B(B $B?C(B $B?D(B $B?E(B $B?F(B $B?G(B $B?H(B $B?I(B $B?J(B $B?K(B $B?L(B $B?M(B $B?N(B $B?O(B
+$B?P(B $B?Q(B $B?R(B $B?S(B $B?T(B $B?U(B $B?V(B $B?W(B $B?X(B $B?Y(B $B?Z(B $B?[(B $B?\(B $B?](B $B?^(B $B?_(B
+$B?`(B $B?a(B $B?b(B $B?c(B $B?d(B $B?e(B $B?f(B $B?g(B $B?h(B $B?i(B $B?j(B $B?k(B $B?l(B $B?m(B $B?n(B $B?o(B
+$B?p(B $B?q(B $B?r(B $B?s(B $B?t(B $B?u(B $B?v(B $B?w(B $B?x(B $B?y(B $B?z(B $B?{(B $B?|(B $B?}(B $B?~(B
+   $B@!(B $B@"(B $B@#(B $B@$(B $B@%(B $B@&(B $B@'(B $B@((B $B@)(B $B@*(B $B@+(B $B@,(B $B@-(B $B@.(B $B@/(B
+$B@0(B $B@1(B $B@2(B $B@3(B $B@4(B $B@5(B $B@6(B $B@7(B $B@8(B $B@9(B $B@:(B $B@;(B $B@<(B $B@=(B $B@>(B $B@?(B
+$B@@(B $B@A(B $B@B(B $B@C(B $B@D(B $B@E(B $B@F(B $B@G(B $B@H(B $B@I(B $B@J(B $B@K(B $B@L(B $B@M(B $B@N(B $B@O(B
+$B@P(B $B@Q(B $B@R(B $B@S(B $B@T(B $B@U(B $B@V(B $B@W(B $B@X(B $B@Y(B $B@Z(B $B@[(B $B@\(B $B@](B $B@^(B $B@_(B
+$B@`(B $B@a(B $B@b(B $B@c(B $B@d(B $B@e(B $B@f(B $B@g(B $B@h(B $B@i(B $B@j(B $B@k(B $B@l(B $B@m(B $B@n(B $B@o(B
+$B@p(B $B@q(B $B@r(B $B@s(B $B@t(B $B@u(B $B@v(B $B@w(B $B@x(B $B@y(B $B@z(B $B@{(B $B@|(B $B@}(B $B@~(B
+   $BA!(B $BA"(B $BA#(B $BA$(B $BA%(B $BA&(B $BA'(B $BA((B $BA)(B $BA*(B $BA+(B $BA,(B $BA-(B $BA.(B $BA/(B
+$BA0(B $BA1(B $BA2(B $BA3(B $BA4(B $BA5(B $BA6(B $BA7(B $BA8(B $BA9(B $BA:(B $BA;(B $BA<(B $BA=(B $BA>(B $BA?(B
+$BA@(B $BAA(B $BAB(B $BAC(B $BAD(B $BAE(B $BAF(B $BAG(B $BAH(B $BAI(B $BAJ(B $BAK(B $BAL(B $BAM(B $BAN(B $BAO(B
+$BAP(B $BAQ(B $BAR(B $BAS(B $BAT(B $BAU(B $BAV(B $BAW(B $BAX(B $BAY(B $BAZ(B $BA[(B $BA\(B $BA](B $BA^(B $BA_(B
+$BA`(B $BAa(B $BAb(B $BAc(B $BAd(B $BAe(B $BAf(B $BAg(B $BAh(B $BAi(B $BAj(B $BAk(B $BAl(B $BAm(B $BAn(B $BAo(B
+$BAp(B $BAq(B $BAr(B $BAs(B $BAt(B $BAu(B $BAv(B $BAw(B $BAx(B $BAy(B $BAz(B $BA{(B $BA|(B $BA}(B $BA~(B
+   $BB!(B $BB"(B $BB#(B $BB$(B $BB%(B $BB&(B $BB'(B $BB((B $BB)(B $BB*(B $BB+(B $BB,(B $BB-(B $BB.(B $BB/(B
+$BB0(B $BB1(B $BB2(B $BB3(B $BB4(B $BB5(B $BB6(B $BB7(B $BB8(B $BB9(B $BB:(B $BB;(B $BB<(B $BB=(B $BB>(B $BB?(B
+$BB@(B $BBA(B $BBB(B $BBC(B $BBD(B $BBE(B $BBF(B $BBG(B $BBH(B $BBI(B $BBJ(B $BBK(B $BBL(B $BBM(B $BBN(B $BBO(B
+$BBP(B $BBQ(B $BBR(B $BBS(B $BBT(B $BBU(B $BBV(B $BBW(B $BBX(B $BBY(B $BBZ(B $BB[(B $BB\(B $BB](B $BB^(B $BB_(B
+$BB`(B $BBa(B $BBb(B $BBc(B $BBd(B $BBe(B $BBf(B $BBg(B $BBh(B $BBi(B $BBj(B $BBk(B $BBl(B $BBm(B $BBn(B $BBo(B
+$BBp(B $BBq(B $BBr(B $BBs(B $BBt(B $BBu(B $BBv(B $BBw(B $BBx(B $BBy(B $BBz(B $BB{(B $BB|(B $BB}(B $BB~(B
+   $BC!(B $BC"(B $BC#(B $BC$(B $BC%(B $BC&(B $BC'(B $BC((B $BC)(B $BC*(B $BC+(B $BC,(B $BC-(B $BC.(B $BC/(B
+$BC0(B $BC1(B $BC2(B $BC3(B $BC4(B $BC5(B $BC6(B $BC7(B $BC8(B $BC9(B $BC:(B $BC;(B $BC<(B $BC=(B $BC>(B $BC?(B
+$BC@(B $BCA(B $BCB(B $BCC(B $BCD(B $BCE(B $BCF(B $BCG(B $BCH(B $BCI(B $BCJ(B $BCK(B $BCL(B $BCM(B $BCN(B $BCO(B
+$BCP(B $BCQ(B $BCR(B $BCS(B $BCT(B $BCU(B $BCV(B $BCW(B $BCX(B $BCY(B $BCZ(B $BC[(B $BC\(B $BC](B $BC^(B $BC_(B
+$BC`(B $BCa(B $BCb(B $BCc(B $BCd(B $BCe(B $BCf(B $BCg(B $BCh(B $BCi(B $BCj(B $BCk(B $BCl(B $BCm(B $BCn(B $BCo(B
+$BCp(B $BCq(B $BCr(B $BCs(B $BCt(B $BCu(B $BCv(B $BCw(B $BCx(B $BCy(B $BCz(B $BC{(B $BC|(B $BC}(B $BC~(B
+   $BD!(B $BD"(B $BD#(B $BD$(B $BD%(B $BD&(B $BD'(B $BD((B $BD)(B $BD*(B $BD+(B $BD,(B $BD-(B $BD.(B $BD/(B
+$BD0(B $BD1(B $BD2(B $BD3(B $BD4(B $BD5(B $BD6(B $BD7(B $BD8(B $BD9(B $BD:(B $BD;(B $BD<(B $BD=(B $BD>(B $BD?(B
+$BD@(B $BDA(B $BDB(B $BDC(B $BDD(B $BDE(B $BDF(B $BDG(B $BDH(B $BDI(B $BDJ(B $BDK(B $BDL(B $BDM(B $BDN(B $BDO(B
+$BDP(B $BDQ(B $BDR(B $BDS(B $BDT(B $BDU(B $BDV(B $BDW(B $BDX(B $BDY(B $BDZ(B $BD[(B $BD\(B $BD](B $BD^(B $BD_(B
+$BD`(B $BDa(B $BDb(B $BDc(B $BDd(B $BDe(B $BDf(B $BDg(B $BDh(B $BDi(B $BDj(B $BDk(B $BDl(B $BDm(B $BDn(B $BDo(B
+$BDp(B $BDq(B $BDr(B $BDs(B $BDt(B $BDu(B $BDv(B $BDw(B $BDx(B $BDy(B $BDz(B $BD{(B $BD|(B $BD}(B $BD~(B
+   $BE!(B $BE"(B $BE#(B $BE$(B $BE%(B $BE&(B $BE'(B $BE((B $BE)(B $BE*(B $BE+(B $BE,(B $BE-(B $BE.(B $BE/(B
+$BE0(B $BE1(B $BE2(B $BE3(B $BE4(B $BE5(B $BE6(B $BE7(B $BE8(B $BE9(B $BE:(B $BE;(B $BE<(B $BE=(B $BE>(B $BE?(B
+$BE@(B $BEA(B $BEB(B $BEC(B $BED(B $BEE(B $BEF(B $BEG(B $BEH(B $BEI(B $BEJ(B $BEK(B $BEL(B $BEM(B $BEN(B $BEO(B
+$BEP(B $BEQ(B $BER(B $BES(B $BET(B $BEU(B $BEV(B $BEW(B $BEX(B $BEY(B $BEZ(B $BE[(B $BE\(B $BE](B $BE^(B $BE_(B
+$BE`(B $BEa(B $BEb(B $BEc(B $BEd(B $BEe(B $BEf(B $BEg(B $BEh(B $BEi(B $BEj(B $BEk(B $BEl(B $BEm(B $BEn(B $BEo(B
+$BEp(B $BEq(B $BEr(B $BEs(B $BEt(B $BEu(B $BEv(B $BEw(B $BEx(B $BEy(B $BEz(B $BE{(B $BE|(B $BE}(B $BE~(B
+   $BF!(B $BF"(B $BF#(B $BF$(B $BF%(B $BF&(B $BF'(B $BF((B $BF)(B $BF*(B $BF+(B $BF,(B $BF-(B $BF.(B $BF/(B
+$BF0(B $BF1(B $BF2(B $BF3(B $BF4(B $BF5(B $BF6(B $BF7(B $BF8(B $BF9(B $BF:(B $BF;(B $BF<(B $BF=(B $BF>(B $BF?(B
+$BF@(B $BFA(B $BFB(B $BFC(B $BFD(B $BFE(B $BFF(B $BFG(B $BFH(B $BFI(B $BFJ(B $BFK(B $BFL(B $BFM(B $BFN(B $BFO(B
+$BFP(B $BFQ(B $BFR(B $BFS(B $BFT(B $BFU(B $BFV(B $BFW(B $BFX(B $BFY(B $BFZ(B $BF[(B $BF\(B $BF](B $BF^(B $BF_(B
+$BF`(B $BFa(B $BFb(B $BFc(B $BFd(B $BFe(B $BFf(B $BFg(B $BFh(B $BFi(B $BFj(B $BFk(B $BFl(B $BFm(B $BFn(B $BFo(B
+$BFp(B $BFq(B $BFr(B $BFs(B $BFt(B $BFu(B $BFv(B $BFw(B $BFx(B $BFy(B $BFz(B $BF{(B $BF|(B $BF}(B $BF~(B
+   $BG!(B $BG"(B $BG#(B $BG$(B $BG%(B $BG&(B $BG'(B $BG((B $BG)(B $BG*(B $BG+(B $BG,(B $BG-(B $BG.(B $BG/(B
+$BG0(B $BG1(B $BG2(B $BG3(B $BG4(B $BG5(B $BG6(B $BG7(B $BG8(B $BG9(B $BG:(B $BG;(B $BG<(B $BG=(B $BG>(B $BG?(B
+$BG@(B $BGA(B $BGB(B $BGC(B $BGD(B $BGE(B $BGF(B $BGG(B $BGH(B $BGI(B $BGJ(B $BGK(B $BGL(B $BGM(B $BGN(B $BGO(B
+$BGP(B $BGQ(B $BGR(B $BGS(B $BGT(B $BGU(B $BGV(B $BGW(B $BGX(B $BGY(B $BGZ(B $BG[(B $BG\(B $BG](B $BG^(B $BG_(B
+$BG`(B $BGa(B $BGb(B $BGc(B $BGd(B $BGe(B $BGf(B $BGg(B $BGh(B $BGi(B $BGj(B $BGk(B $BGl(B $BGm(B $BGn(B $BGo(B
+$BGp(B $BGq(B $BGr(B $BGs(B $BGt(B $BGu(B $BGv(B $BGw(B $BGx(B $BGy(B $BGz(B $BG{(B $BG|(B $BG}(B $BG~(B
+   $BH!(B $BH"(B $BH#(B $BH$(B $BH%(B $BH&(B $BH'(B $BH((B $BH)(B $BH*(B $BH+(B $BH,(B $BH-(B $BH.(B $BH/(B
+$BH0(B $BH1(B $BH2(B $BH3(B $BH4(B $BH5(B $BH6(B $BH7(B $BH8(B $BH9(B $BH:(B $BH;(B $BH<(B $BH=(B $BH>(B $BH?(B
+$BH@(B $BHA(B $BHB(B $BHC(B $BHD(B $BHE(B $BHF(B $BHG(B $BHH(B $BHI(B $BHJ(B $BHK(B $BHL(B $BHM(B $BHN(B $BHO(B
+$BHP(B $BHQ(B $BHR(B $BHS(B $BHT(B $BHU(B $BHV(B $BHW(B $BHX(B $BHY(B $BHZ(B $BH[(B $BH\(B $BH](B $BH^(B $BH_(B
+$BH`(B $BHa(B $BHb(B $BHc(B $BHd(B $BHe(B $BHf(B $BHg(B $BHh(B $BHi(B $BHj(B $BHk(B $BHl(B $BHm(B $BHn(B $BHo(B
+$BHp(B $BHq(B $BHr(B $BHs(B $BHt(B $BHu(B $BHv(B $BHw(B $BHx(B $BHy(B $BHz(B $BH{(B $BH|(B $BH}(B $BH~(B
+   $BI!(B $BI"(B $BI#(B $BI$(B $BI%(B $BI&(B $BI'(B $BI((B $BI)(B $BI*(B $BI+(B $BI,(B $BI-(B $BI.(B $BI/(B
+$BI0(B $BI1(B $BI2(B $BI3(B $BI4(B $BI5(B $BI6(B $BI7(B $BI8(B $BI9(B $BI:(B $BI;(B $BI<(B $BI=(B $BI>(B $BI?(B
+$BI@(B $BIA(B $BIB(B $BIC(B $BID(B $BIE(B $BIF(B $BIG(B $BIH(B $BII(B $BIJ(B $BIK(B $BIL(B $BIM(B $BIN(B $BIO(B
+$BIP(B $BIQ(B $BIR(B $BIS(B $BIT(B $BIU(B $BIV(B $BIW(B $BIX(B $BIY(B $BIZ(B $BI[(B $BI\(B $BI](B $BI^(B $BI_(B
+$BI`(B $BIa(B $BIb(B $BIc(B $BId(B $BIe(B $BIf(B $BIg(B $BIh(B $BIi(B $BIj(B $BIk(B $BIl(B $BIm(B $BIn(B $BIo(B
+$BIp(B $BIq(B $BIr(B $BIs(B $BIt(B $BIu(B $BIv(B $BIw(B $BIx(B $BIy(B $BIz(B $BI{(B $BI|(B $BI}(B $BI~(B
+   $BJ!(B $BJ"(B $BJ#(B $BJ$(B $BJ%(B $BJ&(B $BJ'(B $BJ((B $BJ)(B $BJ*(B $BJ+(B $BJ,(B $BJ-(B $BJ.(B $BJ/(B
+$BJ0(B $BJ1(B $BJ2(B $BJ3(B $BJ4(B $BJ5(B $BJ6(B $BJ7(B $BJ8(B $BJ9(B $BJ:(B $BJ;(B $BJ<(B $BJ=(B $BJ>(B $BJ?(B
+$BJ@(B $BJA(B $BJB(B $BJC(B $BJD(B $BJE(B $BJF(B $BJG(B $BJH(B $BJI(B $BJJ(B $BJK(B $BJL(B $BJM(B $BJN(B $BJO(B
+$BJP(B $BJQ(B $BJR(B $BJS(B $BJT(B $BJU(B $BJV(B $BJW(B $BJX(B $BJY(B $BJZ(B $BJ[(B $BJ\(B $BJ](B $BJ^(B $BJ_(B
+$BJ`(B $BJa(B $BJb(B $BJc(B $BJd(B $BJe(B $BJf(B $BJg(B $BJh(B $BJi(B $BJj(B $BJk(B $BJl(B $BJm(B $BJn(B $BJo(B
+$BJp(B $BJq(B $BJr(B $BJs(B $BJt(B $BJu(B $BJv(B $BJw(B $BJx(B $BJy(B $BJz(B $BJ{(B $BJ|(B $BJ}(B $BJ~(B
+   $BK!(B $BK"(B $BK#(B $BK$(B $BK%(B $BK&(B $BK'(B $BK((B $BK)(B $BK*(B $BK+(B $BK,(B $BK-(B $BK.(B $BK/(B
+$BK0(B $BK1(B $BK2(B $BK3(B $BK4(B $BK5(B $BK6(B $BK7(B $BK8(B $BK9(B $BK:(B $BK;(B $BK<(B $BK=(B $BK>(B $BK?(B
+$BK@(B $BKA(B $BKB(B $BKC(B $BKD(B $BKE(B $BKF(B $BKG(B $BKH(B $BKI(B $BKJ(B $BKK(B $BKL(B $BKM(B $BKN(B $BKO(B
+$BKP(B $BKQ(B $BKR(B $BKS(B $BKT(B $BKU(B $BKV(B $BKW(B $BKX(B $BKY(B $BKZ(B $BK[(B $BK\(B $BK](B $BK^(B $BK_(B
+$BK`(B $BKa(B $BKb(B $BKc(B $BKd(B $BKe(B $BKf(B $BKg(B $BKh(B $BKi(B $BKj(B $BKk(B $BKl(B $BKm(B $BKn(B $BKo(B
+$BKp(B $BKq(B $BKr(B $BKs(B $BKt(B $BKu(B $BKv(B $BKw(B $BKx(B $BKy(B $BKz(B $BK{(B $BK|(B $BK}(B $BK~(B
+   $BL!(B $BL"(B $BL#(B $BL$(B $BL%(B $BL&(B $BL'(B $BL((B $BL)(B $BL*(B $BL+(B $BL,(B $BL-(B $BL.(B $BL/(B
+$BL0(B $BL1(B $BL2(B $BL3(B $BL4(B $BL5(B $BL6(B $BL7(B $BL8(B $BL9(B $BL:(B $BL;(B $BL<(B $BL=(B $BL>(B $BL?(B
+$BL@(B $BLA(B $BLB(B $BLC(B $BLD(B $BLE(B $BLF(B $BLG(B $BLH(B $BLI(B $BLJ(B $BLK(B $BLL(B $BLM(B $BLN(B $BLO(B
+$BLP(B $BLQ(B $BLR(B $BLS(B $BLT(B $BLU(B $BLV(B $BLW(B $BLX(B $BLY(B $BLZ(B $BL[(B $BL\(B $BL](B $BL^(B $BL_(B
+$BL`(B $BLa(B $BLb(B $BLc(B $BLd(B $BLe(B $BLf(B $BLg(B $BLh(B $BLi(B $BLj(B $BLk(B $BLl(B $BLm(B $BLn(B $BLo(B
+$BLp(B $BLq(B $BLr(B $BLs(B $BLt(B $BLu(B $BLv(B $BLw(B $BLx(B $BLy(B $BLz(B $BL{(B $BL|(B $BL}(B $BL~(B
+   $BM!(B $BM"(B $BM#(B $BM$(B $BM%(B $BM&(B $BM'(B $BM((B $BM)(B $BM*(B $BM+(B $BM,(B $BM-(B $BM.(B $BM/(B
+$BM0(B $BM1(B $BM2(B $BM3(B $BM4(B $BM5(B $BM6(B $BM7(B $BM8(B $BM9(B $BM:(B $BM;(B $BM<(B $BM=(B $BM>(B $BM?(B
+$BM@(B $BMA(B $BMB(B $BMC(B $BMD(B $BME(B $BMF(B $BMG(B $BMH(B $BMI(B $BMJ(B $BMK(B $BML(B $BMM(B $BMN(B $BMO(B
+$BMP(B $BMQ(B $BMR(B $BMS(B $BMT(B $BMU(B $BMV(B $BMW(B $BMX(B $BMY(B $BMZ(B $BM[(B $BM\(B $BM](B $BM^(B $BM_(B
+$BM`(B $BMa(B $BMb(B $BMc(B $BMd(B $BMe(B $BMf(B $BMg(B $BMh(B $BMi(B $BMj(B $BMk(B $BMl(B $BMm(B $BMn(B $BMo(B
+$BMp(B $BMq(B $BMr(B $BMs(B $BMt(B $BMu(B $BMv(B $BMw(B $BMx(B $BMy(B $BMz(B $BM{(B $BM|(B $BM}(B $BM~(B
+   $BN!(B $BN"(B $BN#(B $BN$(B $BN%(B $BN&(B $BN'(B $BN((B $BN)(B $BN*(B $BN+(B $BN,(B $BN-(B $BN.(B $BN/(B
+$BN0(B $BN1(B $BN2(B $BN3(B $BN4(B $BN5(B $BN6(B $BN7(B $BN8(B $BN9(B $BN:(B $BN;(B $BN<(B $BN=(B $BN>(B $BN?(B
+$BN@(B $BNA(B $BNB(B $BNC(B $BND(B $BNE(B $BNF(B $BNG(B $BNH(B $BNI(B $BNJ(B $BNK(B $BNL(B $BNM(B $BNN(B $BNO(B
+$BNP(B $BNQ(B $BNR(B $BNS(B $BNT(B $BNU(B $BNV(B $BNW(B $BNX(B $BNY(B $BNZ(B $BN[(B $BN\(B $BN](B $BN^(B $BN_(B
+$BN`(B $BNa(B $BNb(B $BNc(B $BNd(B $BNe(B $BNf(B $BNg(B $BNh(B $BNi(B $BNj(B $BNk(B $BNl(B $BNm(B $BNn(B $BNo(B
+$BNp(B $BNq(B $BNr(B $BNs(B $BNt(B $BNu(B $BNv(B $BNw(B $BNx(B $BNy(B $BNz(B $BN{(B $BN|(B $BN}(B $BN~(B
+   $BO!(B $BO"(B $BO#(B $BO$(B $BO%(B $BO&(B $BO'(B $BO((B $BO)(B $BO*(B $BO+(B $BO,(B $BO-(B $BO.(B $BO/(B
+$BO0(B $BO1(B $BO2(B $BO3(B $BO4(B $BO5(B $BO6(B $BO7(B $BO8(B $BO9(B $BO:(B $BO;(B $BO<(B $BO=(B $BO>(B $BO?(B
+$BO@(B $BOA(B $BOB(B $BOC(B $BOD(B $BOE(B $BOF(B $BOG(B $BOH(B $BOI(B $BOJ(B $BOK(B $BOL(B $BOM(B $BON(B $BOO(B
+$BOP(B $BOQ(B $BOR(B $BOS(B
+   $BP!(B $BP"(B $BP#(B $BP$(B $BP%(B $BP&(B $BP'(B $BP((B $BP)(B $BP*(B $BP+(B $BP,(B $BP-(B $BP.(B $BP/(B
+$BP0(B $BP1(B $BP2(B $BP3(B $BP4(B $BP5(B $BP6(B $BP7(B $BP8(B $BP9(B $BP:(B $BP;(B $BP<(B $BP=(B $BP>(B $BP?(B
+$BP@(B $BPA(B $BPB(B $BPC(B $BPD(B $BPE(B $BPF(B $BPG(B $BPH(B $BPI(B $BPJ(B $BPK(B $BPL(B $BPM(B $BPN(B $BPO(B
+$BPP(B $BPQ(B $BPR(B $BPS(B $BPT(B $BPU(B $BPV(B $BPW(B $BPX(B $BPY(B $BPZ(B $BP[(B $BP\(B $BP](B $BP^(B $BP_(B
+$BP`(B $BPa(B $BPb(B $BPc(B $BPd(B $BPe(B $BPf(B $BPg(B $BPh(B $BPi(B $BPj(B $BPk(B $BPl(B $BPm(B $BPn(B $BPo(B
+$BPp(B $BPq(B $BPr(B $BPs(B $BPt(B $BPu(B $BPv(B $BPw(B $BPx(B $BPy(B $BPz(B $BP{(B $BP|(B $BP}(B $BP~(B
+   $BQ!(B $BQ"(B $BQ#(B $BQ$(B $BQ%(B $BQ&(B $BQ'(B $BQ((B $BQ)(B $BQ*(B $BQ+(B $BQ,(B $BQ-(B $BQ.(B $BQ/(B
+$BQ0(B $BQ1(B $BQ2(B $BQ3(B $BQ4(B $BQ5(B $BQ6(B $BQ7(B $BQ8(B $BQ9(B $BQ:(B $BQ;(B $BQ<(B $BQ=(B $BQ>(B $BQ?(B
+$BQ@(B $BQA(B $BQB(B $BQC(B $BQD(B $BQE(B $BQF(B $BQG(B $BQH(B $BQI(B $BQJ(B $BQK(B $BQL(B $BQM(B $BQN(B $BQO(B
+$BQP(B $BQQ(B $BQR(B $BQS(B $BQT(B $BQU(B $BQV(B $BQW(B $BQX(B $BQY(B $BQZ(B $BQ[(B $BQ\(B $BQ](B $BQ^(B $BQ_(B
+$BQ`(B $BQa(B $BQb(B $BQc(B $BQd(B $BQe(B $BQf(B $BQg(B $BQh(B $BQi(B $BQj(B $BQk(B $BQl(B $BQm(B $BQn(B $BQo(B
+$BQp(B $BQq(B $BQr(B $BQs(B $BQt(B $BQu(B $BQv(B $BQw(B $BQx(B $BQy(B $BQz(B $BQ{(B $BQ|(B $BQ}(B $BQ~(B
+   $BR!(B $BR"(B $BR#(B $BR$(B $BR%(B $BR&(B $BR'(B $BR((B $BR)(B $BR*(B $BR+(B $BR,(B $BR-(B $BR.(B $BR/(B
+$BR0(B $BR1(B $BR2(B $BR3(B $BR4(B $BR5(B $BR6(B $BR7(B $BR8(B $BR9(B $BR:(B $BR;(B $BR<(B $BR=(B $BR>(B $BR?(B
+$BR@(B $BRA(B $BRB(B $BRC(B $BRD(B $BRE(B $BRF(B $BRG(B $BRH(B $BRI(B $BRJ(B $BRK(B $BRL(B $BRM(B $BRN(B $BRO(B
+$BRP(B $BRQ(B $BRR(B $BRS(B $BRT(B $BRU(B $BRV(B $BRW(B $BRX(B $BRY(B $BRZ(B $BR[(B $BR\(B $BR](B $BR^(B $BR_(B
+$BR`(B $BRa(B $BRb(B $BRc(B $BRd(B $BRe(B $BRf(B $BRg(B $BRh(B $BRi(B $BRj(B $BRk(B $BRl(B $BRm(B $BRn(B $BRo(B
+$BRp(B $BRq(B $BRr(B $BRs(B $BRt(B $BRu(B $BRv(B $BRw(B $BRx(B $BRy(B $BRz(B $BR{(B $BR|(B $BR}(B $BR~(B
+   $BS!(B $BS"(B $BS#(B $BS$(B $BS%(B $BS&(B $BS'(B $BS((B $BS)(B $BS*(B $BS+(B $BS,(B $BS-(B $BS.(B $BS/(B
+$BS0(B $BS1(B $BS2(B $BS3(B $BS4(B $BS5(B $BS6(B $BS7(B $BS8(B $BS9(B $BS:(B $BS;(B $BS<(B $BS=(B $BS>(B $BS?(B
+$BS@(B $BSA(B $BSB(B $BSC(B $BSD(B $BSE(B $BSF(B $BSG(B $BSH(B $BSI(B $BSJ(B $BSK(B $BSL(B $BSM(B $BSN(B $BSO(B
+$BSP(B $BSQ(B $BSR(B $BSS(B $BST(B $BSU(B $BSV(B $BSW(B $BSX(B $BSY(B $BSZ(B $BS[(B $BS\(B $BS](B $BS^(B $BS_(B
+$BS`(B $BSa(B $BSb(B $BSc(B $BSd(B $BSe(B $BSf(B $BSg(B $BSh(B $BSi(B $BSj(B $BSk(B $BSl(B $BSm(B $BSn(B $BSo(B
+$BSp(B $BSq(B $BSr(B $BSs(B $BSt(B $BSu(B $BSv(B $BSw(B $BSx(B $BSy(B $BSz(B $BS{(B $BS|(B $BS}(B $BS~(B
+   $BT!(B $BT"(B $BT#(B $BT$(B $BT%(B $BT&(B $BT'(B $BT((B $BT)(B $BT*(B $BT+(B $BT,(B $BT-(B $BT.(B $BT/(B
+$BT0(B $BT1(B $BT2(B $BT3(B $BT4(B $BT5(B $BT6(B $BT7(B $BT8(B $BT9(B $BT:(B $BT;(B $BT<(B $BT=(B $BT>(B $BT?(B
+$BT@(B $BTA(B $BTB(B $BTC(B $BTD(B $BTE(B $BTF(B $BTG(B $BTH(B $BTI(B $BTJ(B $BTK(B $BTL(B $BTM(B $BTN(B $BTO(B
+$BTP(B $BTQ(B $BTR(B $BTS(B $BTT(B $BTU(B $BTV(B $BTW(B $BTX(B $BTY(B $BTZ(B $BT[(B $BT\(B $BT](B $BT^(B $BT_(B
+$BT`(B $BTa(B $BTb(B $BTc(B $BTd(B $BTe(B $BTf(B $BTg(B $BTh(B $BTi(B $BTj(B $BTk(B $BTl(B $BTm(B $BTn(B $BTo(B
+$BTp(B $BTq(B $BTr(B $BTs(B $BTt(B $BTu(B $BTv(B $BTw(B $BTx(B $BTy(B $BTz(B $BT{(B $BT|(B $BT}(B $BT~(B
+   $BU!(B $BU"(B $BU#(B $BU$(B $BU%(B $BU&(B $BU'(B $BU((B $BU)(B $BU*(B $BU+(B $BU,(B $BU-(B $BU.(B $BU/(B
+$BU0(B $BU1(B $BU2(B $BU3(B $BU4(B $BU5(B $BU6(B $BU7(B $BU8(B $BU9(B $BU:(B $BU;(B $BU<(B $BU=(B $BU>(B $BU?(B
+$BU@(B $BUA(B $BUB(B $BUC(B $BUD(B $BUE(B $BUF(B $BUG(B $BUH(B $BUI(B $BUJ(B $BUK(B $BUL(B $BUM(B $BUN(B $BUO(B
+$BUP(B $BUQ(B $BUR(B $BUS(B $BUT(B $BUU(B $BUV(B $BUW(B $BUX(B $BUY(B $BUZ(B $BU[(B $BU\(B $BU](B $BU^(B $BU_(B
+$BU`(B $BUa(B $BUb(B $BUc(B $BUd(B $BUe(B $BUf(B $BUg(B $BUh(B $BUi(B $BUj(B $BUk(B $BUl(B $BUm(B $BUn(B $BUo(B
+$BUp(B $BUq(B $BUr(B $BUs(B $BUt(B $BUu(B $BUv(B $BUw(B $BUx(B $BUy(B $BUz(B $BU{(B $BU|(B $BU}(B $BU~(B
+   $BV!(B $BV"(B $BV#(B $BV$(B $BV%(B $BV&(B $BV'(B $BV((B $BV)(B $BV*(B $BV+(B $BV,(B $BV-(B $BV.(B $BV/(B
+$BV0(B $BV1(B $BV2(B $BV3(B $BV4(B $BV5(B $BV6(B $BV7(B $BV8(B $BV9(B $BV:(B $BV;(B $BV<(B $BV=(B $BV>(B $BV?(B
+$BV@(B $BVA(B $BVB(B $BVC(B $BVD(B $BVE(B $BVF(B $BVG(B $BVH(B $BVI(B $BVJ(B $BVK(B $BVL(B $BVM(B $BVN(B $BVO(B
+$BVP(B $BVQ(B $BVR(B $BVS(B $BVT(B $BVU(B $BVV(B $BVW(B $BVX(B $BVY(B $BVZ(B $BV[(B $BV\(B $BV](B $BV^(B $BV_(B
+$BV`(B $BVa(B $BVb(B $BVc(B $BVd(B $BVe(B $BVf(B $BVg(B $BVh(B $BVi(B $BVj(B $BVk(B $BVl(B $BVm(B $BVn(B $BVo(B
+$BVp(B $BVq(B $BVr(B $BVs(B $BVt(B $BVu(B $BVv(B $BVw(B $BVx(B $BVy(B $BVz(B $BV{(B $BV|(B $BV}(B $BV~(B
+   $BW!(B $BW"(B $BW#(B $BW$(B $BW%(B $BW&(B $BW'(B $BW((B $BW)(B $BW*(B $BW+(B $BW,(B $BW-(B $BW.(B $BW/(B
+$BW0(B $BW1(B $BW2(B $BW3(B $BW4(B $BW5(B $BW6(B $BW7(B $BW8(B $BW9(B $BW:(B $BW;(B $BW<(B $BW=(B $BW>(B $BW?(B
+$BW@(B $BWA(B $BWB(B $BWC(B $BWD(B $BWE(B $BWF(B $BWG(B $BWH(B $BWI(B $BWJ(B $BWK(B $BWL(B $BWM(B $BWN(B $BWO(B
+$BWP(B $BWQ(B $BWR(B $BWS(B $BWT(B $BWU(B $BWV(B $BWW(B $BWX(B $BWY(B $BWZ(B $BW[(B $BW\(B $BW](B $BW^(B $BW_(B
+$BW`(B $BWa(B $BWb(B $BWc(B $BWd(B $BWe(B $BWf(B $BWg(B $BWh(B $BWi(B $BWj(B $BWk(B $BWl(B $BWm(B $BWn(B $BWo(B
+$BWp(B $BWq(B $BWr(B $BWs(B $BWt(B $BWu(B $BWv(B $BWw(B $BWx(B $BWy(B $BWz(B $BW{(B $BW|(B $BW}(B $BW~(B
+   $BX!(B $BX"(B $BX#(B $BX$(B $BX%(B $BX&(B $BX'(B $BX((B $BX)(B $BX*(B $BX+(B $BX,(B $BX-(B $BX.(B $BX/(B
+$BX0(B $BX1(B $BX2(B $BX3(B $BX4(B $BX5(B $BX6(B $BX7(B $BX8(B $BX9(B $BX:(B $BX;(B $BX<(B $BX=(B $BX>(B $BX?(B
+$BX@(B $BXA(B $BXB(B $BXC(B $BXD(B $BXE(B $BXF(B $BXG(B $BXH(B $BXI(B $BXJ(B $BXK(B $BXL(B $BXM(B $BXN(B $BXO(B
+$BXP(B $BXQ(B $BXR(B $BXS(B $BXT(B $BXU(B $BXV(B $BXW(B $BXX(B $BXY(B $BXZ(B $BX[(B $BX\(B $BX](B $BX^(B $BX_(B
+$BX`(B $BXa(B $BXb(B $BXc(B $BXd(B $BXe(B $BXf(B $BXg(B $BXh(B $BXi(B $BXj(B $BXk(B $BXl(B $BXm(B $BXn(B $BXo(B
+$BXp(B $BXq(B $BXr(B $BXs(B $BXt(B $BXu(B $BXv(B $BXw(B $BXx(B $BXy(B $BXz(B $BX{(B $BX|(B $BX}(B $BX~(B
+   $BY!(B $BY"(B $BY#(B $BY$(B $BY%(B $BY&(B $BY'(B $BY((B $BY)(B $BY*(B $BY+(B $BY,(B $BY-(B $BY.(B $BY/(B
+$BY0(B $BY1(B $BY2(B $BY3(B $BY4(B $BY5(B $BY6(B $BY7(B $BY8(B $BY9(B $BY:(B $BY;(B $BY<(B $BY=(B $BY>(B $BY?(B
+$BY@(B $BYA(B $BYB(B $BYC(B $BYD(B $BYE(B $BYF(B $BYG(B $BYH(B $BYI(B $BYJ(B $BYK(B $BYL(B $BYM(B $BYN(B $BYO(B
+$BYP(B $BYQ(B $BYR(B $BYS(B $BYT(B $BYU(B $BYV(B $BYW(B $BYX(B $BYY(B $BYZ(B $BY[(B $BY\(B $BY](B $BY^(B $BY_(B
+$BY`(B $BYa(B $BYb(B $BYc(B $BYd(B $BYe(B $BYf(B $BYg(B $BYh(B $BYi(B $BYj(B $BYk(B $BYl(B $BYm(B $BYn(B $BYo(B
+$BYp(B $BYq(B $BYr(B $BYs(B $BYt(B $BYu(B $BYv(B $BYw(B $BYx(B $BYy(B $BYz(B $BY{(B $BY|(B $BY}(B $BY~(B
+   $BZ!(B $BZ"(B $BZ#(B $BZ$(B $BZ%(B $BZ&(B $BZ'(B $BZ((B $BZ)(B $BZ*(B $BZ+(B $BZ,(B $BZ-(B $BZ.(B $BZ/(B
+$BZ0(B $BZ1(B $BZ2(B $BZ3(B $BZ4(B $BZ5(B $BZ6(B $BZ7(B $BZ8(B $BZ9(B $BZ:(B $BZ;(B $BZ<(B $BZ=(B $BZ>(B $BZ?(B
+$BZ@(B $BZA(B $BZB(B $BZC(B $BZD(B $BZE(B $BZF(B $BZG(B $BZH(B $BZI(B $BZJ(B $BZK(B $BZL(B $BZM(B $BZN(B $BZO(B
+$BZP(B $BZQ(B $BZR(B $BZS(B $BZT(B $BZU(B $BZV(B $BZW(B $BZX(B $BZY(B $BZZ(B $BZ[(B $BZ\(B $BZ](B $BZ^(B $BZ_(B
+$BZ`(B $BZa(B $BZb(B $BZc(B $BZd(B $BZe(B $BZf(B $BZg(B $BZh(B $BZi(B $BZj(B $BZk(B $BZl(B $BZm(B $BZn(B $BZo(B
+$BZp(B $BZq(B $BZr(B $BZs(B $BZt(B $BZu(B $BZv(B $BZw(B $BZx(B $BZy(B $BZz(B $BZ{(B $BZ|(B $BZ}(B $BZ~(B
+   $B[!(B $B["(B $B[#(B $B[$(B $B[%(B $B[&(B $B['(B $B[((B $B[)(B $B[*(B $B[+(B $B[,(B $B[-(B $B[.(B $B[/(B
+$B[0(B $B[1(B $B[2(B $B[3(B $B[4(B $B[5(B $B[6(B $B[7(B $B[8(B $B[9(B $B[:(B $B[;(B $B[<(B $B[=(B $B[>(B $B[?(B
+$B[@(B $B[A(B $B[B(B $B[C(B $B[D(B $B[E(B $B[F(B $B[G(B $B[H(B $B[I(B $B[J(B $B[K(B $B[L(B $B[M(B $B[N(B $B[O(B
+$B[P(B $B[Q(B $B[R(B $B[S(B $B[T(B $B[U(B $B[V(B $B[W(B $B[X(B $B[Y(B $B[Z(B $B[[(B $B[\(B $B[](B $B[^(B $B[_(B
+$B[`(B $B[a(B $B[b(B $B[c(B $B[d(B $B[e(B $B[f(B $B[g(B $B[h(B $B[i(B $B[j(B $B[k(B $B[l(B $B[m(B $B[n(B $B[o(B
+$B[p(B $B[q(B $B[r(B $B[s(B $B[t(B $B[u(B $B[v(B $B[w(B $B[x(B $B[y(B $B[z(B $B[{(B $B[|(B $B[}(B $B[~(B
+   $B\!(B $B\"(B $B\#(B $B\$(B $B\%(B $B\&(B $B\'(B $B\((B $B\)(B $B\*(B $B\+(B $B\,(B $B\-(B $B\.(B $B\/(B
+$B\0(B $B\1(B $B\2(B $B\3(B $B\4(B $B\5(B $B\6(B $B\7(B $B\8(B $B\9(B $B\:(B $B\;(B $B\<(B $B\=(B $B\>(B $B\?(B
+$B\@(B $B\A(B $B\B(B $B\C(B $B\D(B $B\E(B $B\F(B $B\G(B $B\H(B $B\I(B $B\J(B $B\K(B $B\L(B $B\M(B $B\N(B $B\O(B
+$B\P(B $B\Q(B $B\R(B $B\S(B $B\T(B $B\U(B $B\V(B $B\W(B $B\X(B $B\Y(B $B\Z(B $B\[(B $B\\(B $B\](B $B\^(B $B\_(B
+$B\`(B $B\a(B $B\b(B $B\c(B $B\d(B $B\e(B $B\f(B $B\g(B $B\h(B $B\i(B $B\j(B $B\k(B $B\l(B $B\m(B $B\n(B $B\o(B
+$B\p(B $B\q(B $B\r(B $B\s(B $B\t(B $B\u(B $B\v(B $B\w(B $B\x(B $B\y(B $B\z(B $B\{(B $B\|(B $B\}(B $B\~(B
+   $B]!(B $B]"(B $B]#(B $B]$(B $B]%(B $B]&(B $B]'(B $B]((B $B])(B $B]*(B $B]+(B $B],(B $B]-(B $B].(B $B]/(B
+$B]0(B $B]1(B $B]2(B $B]3(B $B]4(B $B]5(B $B]6(B $B]7(B $B]8(B $B]9(B $B]:(B $B];(B $B]<(B $B]=(B $B]>(B $B]?(B
+$B]@(B $B]A(B $B]B(B $B]C(B $B]D(B $B]E(B $B]F(B $B]G(B $B]H(B $B]I(B $B]J(B $B]K(B $B]L(B $B]M(B $B]N(B $B]O(B
+$B]P(B $B]Q(B $B]R(B $B]S(B $B]T(B $B]U(B $B]V(B $B]W(B $B]X(B $B]Y(B $B]Z(B $B][(B $B]\(B $B]](B $B]^(B $B]_(B
+$B]`(B $B]a(B $B]b(B $B]c(B $B]d(B $B]e(B $B]f(B $B]g(B $B]h(B $B]i(B $B]j(B $B]k(B $B]l(B $B]m(B $B]n(B $B]o(B
+$B]p(B $B]q(B $B]r(B $B]s(B $B]t(B $B]u(B $B]v(B $B]w(B $B]x(B $B]y(B $B]z(B $B]{(B $B]|(B $B]}(B $B]~(B
+   $B^!(B $B^"(B $B^#(B $B^$(B $B^%(B $B^&(B $B^'(B $B^((B $B^)(B $B^*(B $B^+(B $B^,(B $B^-(B $B^.(B $B^/(B
+$B^0(B $B^1(B $B^2(B $B^3(B $B^4(B $B^5(B $B^6(B $B^7(B $B^8(B $B^9(B $B^:(B $B^;(B $B^<(B $B^=(B $B^>(B $B^?(B
+$B^@(B $B^A(B $B^B(B $B^C(B $B^D(B $B^E(B $B^F(B $B^G(B $B^H(B $B^I(B $B^J(B $B^K(B $B^L(B $B^M(B $B^N(B $B^O(B
+$B^P(B $B^Q(B $B^R(B $B^S(B $B^T(B $B^U(B $B^V(B $B^W(B $B^X(B $B^Y(B $B^Z(B $B^[(B $B^\(B $B^](B $B^^(B $B^_(B
+$B^`(B $B^a(B $B^b(B $B^c(B $B^d(B $B^e(B $B^f(B $B^g(B $B^h(B $B^i(B $B^j(B $B^k(B $B^l(B $B^m(B $B^n(B $B^o(B
+$B^p(B $B^q(B $B^r(B $B^s(B $B^t(B $B^u(B $B^v(B $B^w(B $B^x(B $B^y(B $B^z(B $B^{(B $B^|(B $B^}(B $B^~(B
+   $B_!(B $B_"(B $B_#(B $B_$(B $B_%(B $B_&(B $B_'(B $B_((B $B_)(B $B_*(B $B_+(B $B_,(B $B_-(B $B_.(B $B_/(B
+$B_0(B $B_1(B $B_2(B $B_3(B $B_4(B $B_5(B $B_6(B $B_7(B $B_8(B $B_9(B $B_:(B $B_;(B $B_<(B $B_=(B $B_>(B $B_?(B
+$B_@(B $B_A(B $B_B(B $B_C(B $B_D(B $B_E(B $B_F(B $B_G(B $B_H(B $B_I(B $B_J(B $B_K(B $B_L(B $B_M(B $B_N(B $B_O(B
+$B_P(B $B_Q(B $B_R(B $B_S(B $B_T(B $B_U(B $B_V(B $B_W(B $B_X(B $B_Y(B $B_Z(B $B_[(B $B_\(B $B_](B $B_^(B $B__(B
+$B_`(B $B_a(B $B_b(B $B_c(B $B_d(B $B_e(B $B_f(B $B_g(B $B_h(B $B_i(B $B_j(B $B_k(B $B_l(B $B_m(B $B_n(B $B_o(B
+$B_p(B $B_q(B $B_r(B $B_s(B $B_t(B $B_u(B $B_v(B $B_w(B $B_x(B $B_y(B $B_z(B $B_{(B $B_|(B $B_}(B $B_~(B
+   $B`!(B $B`"(B $B`#(B $B`$(B $B`%(B $B`&(B $B`'(B $B`((B $B`)(B $B`*(B $B`+(B $B`,(B $B`-(B $B`.(B $B`/(B
+$B`0(B $B`1(B $B`2(B $B`3(B $B`4(B $B`5(B $B`6(B $B`7(B $B`8(B $B`9(B $B`:(B $B`;(B $B`<(B $B`=(B $B`>(B $B`?(B
+$B`@(B $B`A(B $B`B(B $B`C(B $B`D(B $B`E(B $B`F(B $B`G(B $B`H(B $B`I(B $B`J(B $B`K(B $B`L(B $B`M(B $B`N(B $B`O(B
+$B`P(B $B`Q(B $B`R(B $B`S(B $B`T(B $B`U(B $B`V(B $B`W(B $B`X(B $B`Y(B $B`Z(B $B`[(B $B`\(B $B`](B $B`^(B $B`_(B
+$B``(B $B`a(B $B`b(B $B`c(B $B`d(B $B`e(B $B`f(B $B`g(B $B`h(B $B`i(B $B`j(B $B`k(B $B`l(B $B`m(B $B`n(B $B`o(B
+$B`p(B $B`q(B $B`r(B $B`s(B $B`t(B $B`u(B $B`v(B $B`w(B $B`x(B $B`y(B $B`z(B $B`{(B $B`|(B $B`}(B $B`~(B
+   $Ba!(B $Ba"(B $Ba#(B $Ba$(B $Ba%(B $Ba&(B $Ba'(B $Ba((B $Ba)(B $Ba*(B $Ba+(B $Ba,(B $Ba-(B $Ba.(B $Ba/(B
+$Ba0(B $Ba1(B $Ba2(B $Ba3(B $Ba4(B $Ba5(B $Ba6(B $Ba7(B $Ba8(B $Ba9(B $Ba:(B $Ba;(B $Ba<(B $Ba=(B $Ba>(B $Ba?(B
+$Ba@(B $BaA(B $BaB(B $BaC(B $BaD(B $BaE(B $BaF(B $BaG(B $BaH(B $BaI(B $BaJ(B $BaK(B $BaL(B $BaM(B $BaN(B $BaO(B
+$BaP(B $BaQ(B $BaR(B $BaS(B $BaT(B $BaU(B $BaV(B $BaW(B $BaX(B $BaY(B $BaZ(B $Ba[(B $Ba\(B $Ba](B $Ba^(B $Ba_(B
+$Ba`(B $Baa(B $Bab(B $Bac(B $Bad(B $Bae(B $Baf(B $Bag(B $Bah(B $Bai(B $Baj(B $Bak(B $Bal(B $Bam(B $Ban(B $Bao(B
+$Bap(B $Baq(B $Bar(B $Bas(B $Bat(B $Bau(B $Bav(B $Baw(B $Bax(B $Bay(B $Baz(B $Ba{(B $Ba|(B $Ba}(B $Ba~(B
+   $Bb!(B $Bb"(B $Bb#(B $Bb$(B $Bb%(B $Bb&(B $Bb'(B $Bb((B $Bb)(B $Bb*(B $Bb+(B $Bb,(B $Bb-(B $Bb.(B $Bb/(B
+$Bb0(B $Bb1(B $Bb2(B $Bb3(B $Bb4(B $Bb5(B $Bb6(B $Bb7(B $Bb8(B $Bb9(B $Bb:(B $Bb;(B $Bb<(B $Bb=(B $Bb>(B $Bb?(B
+$Bb@(B $BbA(B $BbB(B $BbC(B $BbD(B $BbE(B $BbF(B $BbG(B $BbH(B $BbI(B $BbJ(B $BbK(B $BbL(B $BbM(B $BbN(B $BbO(B
+$BbP(B $BbQ(B $BbR(B $BbS(B $BbT(B $BbU(B $BbV(B $BbW(B $BbX(B $BbY(B $BbZ(B $Bb[(B $Bb\(B $Bb](B $Bb^(B $Bb_(B
+$Bb`(B $Bba(B $Bbb(B $Bbc(B $Bbd(B $Bbe(B $Bbf(B $Bbg(B $Bbh(B $Bbi(B $Bbj(B $Bbk(B $Bbl(B $Bbm(B $Bbn(B $Bbo(B
+$Bbp(B $Bbq(B $Bbr(B $Bbs(B $Bbt(B $Bbu(B $Bbv(B $Bbw(B $Bbx(B $Bby(B $Bbz(B $Bb{(B $Bb|(B $Bb}(B $Bb~(B
+   $Bc!(B $Bc"(B $Bc#(B $Bc$(B $Bc%(B $Bc&(B $Bc'(B $Bc((B $Bc)(B $Bc*(B $Bc+(B $Bc,(B $Bc-(B $Bc.(B $Bc/(B
+$Bc0(B $Bc1(B $Bc2(B $Bc3(B $Bc4(B $Bc5(B $Bc6(B $Bc7(B $Bc8(B $Bc9(B $Bc:(B $Bc;(B $Bc<(B $Bc=(B $Bc>(B $Bc?(B
+$Bc@(B $BcA(B $BcB(B $BcC(B $BcD(B $BcE(B $BcF(B $BcG(B $BcH(B $BcI(B $BcJ(B $BcK(B $BcL(B $BcM(B $BcN(B $BcO(B
+$BcP(B $BcQ(B $BcR(B $BcS(B $BcT(B $BcU(B $BcV(B $BcW(B $BcX(B $BcY(B $BcZ(B $Bc[(B $Bc\(B $Bc](B $Bc^(B $Bc_(B
+$Bc`(B $Bca(B $Bcb(B $Bcc(B $Bcd(B $Bce(B $Bcf(B $Bcg(B $Bch(B $Bci(B $Bcj(B $Bck(B $Bcl(B $Bcm(B $Bcn(B $Bco(B
+$Bcp(B $Bcq(B $Bcr(B $Bcs(B $Bct(B $Bcu(B $Bcv(B $Bcw(B $Bcx(B $Bcy(B $Bcz(B $Bc{(B $Bc|(B $Bc}(B $Bc~(B
+   $Bd!(B $Bd"(B $Bd#(B $Bd$(B $Bd%(B $Bd&(B $Bd'(B $Bd((B $Bd)(B $Bd*(B $Bd+(B $Bd,(B $Bd-(B $Bd.(B $Bd/(B
+$Bd0(B $Bd1(B $Bd2(B $Bd3(B $Bd4(B $Bd5(B $Bd6(B $Bd7(B $Bd8(B $Bd9(B $Bd:(B $Bd;(B $Bd<(B $Bd=(B $Bd>(B $Bd?(B
+$Bd@(B $BdA(B $BdB(B $BdC(B $BdD(B $BdE(B $BdF(B $BdG(B $BdH(B $BdI(B $BdJ(B $BdK(B $BdL(B $BdM(B $BdN(B $BdO(B
+$BdP(B $BdQ(B $BdR(B $BdS(B $BdT(B $BdU(B $BdV(B $BdW(B $BdX(B $BdY(B $BdZ(B $Bd[(B $Bd\(B $Bd](B $Bd^(B $Bd_(B
+$Bd`(B $Bda(B $Bdb(B $Bdc(B $Bdd(B $Bde(B $Bdf(B $Bdg(B $Bdh(B $Bdi(B $Bdj(B $Bdk(B $Bdl(B $Bdm(B $Bdn(B $Bdo(B
+$Bdp(B $Bdq(B $Bdr(B $Bds(B $Bdt(B $Bdu(B $Bdv(B $Bdw(B $Bdx(B $Bdy(B $Bdz(B $Bd{(B $Bd|(B $Bd}(B $Bd~(B
+   $Be!(B $Be"(B $Be#(B $Be$(B $Be%(B $Be&(B $Be'(B $Be((B $Be)(B $Be*(B $Be+(B $Be,(B $Be-(B $Be.(B $Be/(B
+$Be0(B $Be1(B $Be2(B $Be3(B $Be4(B $Be5(B $Be6(B $Be7(B $Be8(B $Be9(B $Be:(B $Be;(B $Be<(B $Be=(B $Be>(B $Be?(B
+$Be@(B $BeA(B $BeB(B $BeC(B $BeD(B $BeE(B $BeF(B $BeG(B $BeH(B $BeI(B $BeJ(B $BeK(B $BeL(B $BeM(B $BeN(B $BeO(B
+$BeP(B $BeQ(B $BeR(B $BeS(B $BeT(B $BeU(B $BeV(B $BeW(B $BeX(B $BeY(B $BeZ(B $Be[(B $Be\(B $Be](B $Be^(B $Be_(B
+$Be`(B $Bea(B $Beb(B $Bec(B $Bed(B $Bee(B $Bef(B $Beg(B $Beh(B $Bei(B $Bej(B $Bek(B $Bel(B $Bem(B $Ben(B $Beo(B
+$Bep(B $Beq(B $Ber(B $Bes(B $Bet(B $Beu(B $Bev(B $Bew(B $Bex(B $Bey(B $Bez(B $Be{(B $Be|(B $Be}(B $Be~(B
+   $Bf!(B $Bf"(B $Bf#(B $Bf$(B $Bf%(B $Bf&(B $Bf'(B $Bf((B $Bf)(B $Bf*(B $Bf+(B $Bf,(B $Bf-(B $Bf.(B $Bf/(B
+$Bf0(B $Bf1(B $Bf2(B $Bf3(B $Bf4(B $Bf5(B $Bf6(B $Bf7(B $Bf8(B $Bf9(B $Bf:(B $Bf;(B $Bf<(B $Bf=(B $Bf>(B $Bf?(B
+$Bf@(B $BfA(B $BfB(B $BfC(B $BfD(B $BfE(B $BfF(B $BfG(B $BfH(B $BfI(B $BfJ(B $BfK(B $BfL(B $BfM(B $BfN(B $BfO(B
+$BfP(B $BfQ(B $BfR(B $BfS(B $BfT(B $BfU(B $BfV(B $BfW(B $BfX(B $BfY(B $BfZ(B $Bf[(B $Bf\(B $Bf](B $Bf^(B $Bf_(B
+$Bf`(B $Bfa(B $Bfb(B $Bfc(B $Bfd(B $Bfe(B $Bff(B $Bfg(B $Bfh(B $Bfi(B $Bfj(B $Bfk(B $Bfl(B $Bfm(B $Bfn(B $Bfo(B
+$Bfp(B $Bfq(B $Bfr(B $Bfs(B $Bft(B $Bfu(B $Bfv(B $Bfw(B $Bfx(B $Bfy(B $Bfz(B $Bf{(B $Bf|(B $Bf}(B $Bf~(B
+   $Bg!(B $Bg"(B $Bg#(B $Bg$(B $Bg%(B $Bg&(B $Bg'(B $Bg((B $Bg)(B $Bg*(B $Bg+(B $Bg,(B $Bg-(B $Bg.(B $Bg/(B
+$Bg0(B $Bg1(B $Bg2(B $Bg3(B $Bg4(B $Bg5(B $Bg6(B $Bg7(B $Bg8(B $Bg9(B $Bg:(B $Bg;(B $Bg<(B $Bg=(B $Bg>(B $Bg?(B
+$Bg@(B $BgA(B $BgB(B $BgC(B $BgD(B $BgE(B $BgF(B $BgG(B $BgH(B $BgI(B $BgJ(B $BgK(B $BgL(B $BgM(B $BgN(B $BgO(B
+$BgP(B $BgQ(B $BgR(B $BgS(B $BgT(B $BgU(B $BgV(B $BgW(B $BgX(B $BgY(B $BgZ(B $Bg[(B $Bg\(B $Bg](B $Bg^(B $Bg_(B
+$Bg`(B $Bga(B $Bgb(B $Bgc(B $Bgd(B $Bge(B $Bgf(B $Bgg(B $Bgh(B $Bgi(B $Bgj(B $Bgk(B $Bgl(B $Bgm(B $Bgn(B $Bgo(B
+$Bgp(B $Bgq(B $Bgr(B $Bgs(B $Bgt(B $Bgu(B $Bgv(B $Bgw(B $Bgx(B $Bgy(B $Bgz(B $Bg{(B $Bg|(B $Bg}(B $Bg~(B
+   $Bh!(B $Bh"(B $Bh#(B $Bh$(B $Bh%(B $Bh&(B $Bh'(B $Bh((B $Bh)(B $Bh*(B $Bh+(B $Bh,(B $Bh-(B $Bh.(B $Bh/(B
+$Bh0(B $Bh1(B $Bh2(B $Bh3(B $Bh4(B $Bh5(B $Bh6(B $Bh7(B $Bh8(B $Bh9(B $Bh:(B $Bh;(B $Bh<(B $Bh=(B $Bh>(B $Bh?(B
+$Bh@(B $BhA(B $BhB(B $BhC(B $BhD(B $BhE(B $BhF(B $BhG(B $BhH(B $BhI(B $BhJ(B $BhK(B $BhL(B $BhM(B $BhN(B $BhO(B
+$BhP(B $BhQ(B $BhR(B $BhS(B $BhT(B $BhU(B $BhV(B $BhW(B $BhX(B $BhY(B $BhZ(B $Bh[(B $Bh\(B $Bh](B $Bh^(B $Bh_(B
+$Bh`(B $Bha(B $Bhb(B $Bhc(B $Bhd(B $Bhe(B $Bhf(B $Bhg(B $Bhh(B $Bhi(B $Bhj(B $Bhk(B $Bhl(B $Bhm(B $Bhn(B $Bho(B
+$Bhp(B $Bhq(B $Bhr(B $Bhs(B $Bht(B $Bhu(B $Bhv(B $Bhw(B $Bhx(B $Bhy(B $Bhz(B $Bh{(B $Bh|(B $Bh}(B $Bh~(B
+   $Bi!(B $Bi"(B $Bi#(B $Bi$(B $Bi%(B $Bi&(B $Bi'(B $Bi((B $Bi)(B $Bi*(B $Bi+(B $Bi,(B $Bi-(B $Bi.(B $Bi/(B
+$Bi0(B $Bi1(B $Bi2(B $Bi3(B $Bi4(B $Bi5(B $Bi6(B $Bi7(B $Bi8(B $Bi9(B $Bi:(B $Bi;(B $Bi<(B $Bi=(B $Bi>(B $Bi?(B
+$Bi@(B $BiA(B $BiB(B $BiC(B $BiD(B $BiE(B $BiF(B $BiG(B $BiH(B $BiI(B $BiJ(B $BiK(B $BiL(B $BiM(B $BiN(B $BiO(B
+$BiP(B $BiQ(B $BiR(B $BiS(B $BiT(B $BiU(B $BiV(B $BiW(B $BiX(B $BiY(B $BiZ(B $Bi[(B $Bi\(B $Bi](B $Bi^(B $Bi_(B
+$Bi`(B $Bia(B $Bib(B $Bic(B $Bid(B $Bie(B $Bif(B $Big(B $Bih(B $Bii(B $Bij(B $Bik(B $Bil(B $Bim(B $Bin(B $Bio(B
+$Bip(B $Biq(B $Bir(B $Bis(B $Bit(B $Biu(B $Biv(B $Biw(B $Bix(B $Biy(B $Biz(B $Bi{(B $Bi|(B $Bi}(B $Bi~(B
+   $Bj!(B $Bj"(B $Bj#(B $Bj$(B $Bj%(B $Bj&(B $Bj'(B $Bj((B $Bj)(B $Bj*(B $Bj+(B $Bj,(B $Bj-(B $Bj.(B $Bj/(B
+$Bj0(B $Bj1(B $Bj2(B $Bj3(B $Bj4(B $Bj5(B $Bj6(B $Bj7(B $Bj8(B $Bj9(B $Bj:(B $Bj;(B $Bj<(B $Bj=(B $Bj>(B $Bj?(B
+$Bj@(B $BjA(B $BjB(B $BjC(B $BjD(B $BjE(B $BjF(B $BjG(B $BjH(B $BjI(B $BjJ(B $BjK(B $BjL(B $BjM(B $BjN(B $BjO(B
+$BjP(B $BjQ(B $BjR(B $BjS(B $BjT(B $BjU(B $BjV(B $BjW(B $BjX(B $BjY(B $BjZ(B $Bj[(B $Bj\(B $Bj](B $Bj^(B $Bj_(B
+$Bj`(B $Bja(B $Bjb(B $Bjc(B $Bjd(B $Bje(B $Bjf(B $Bjg(B $Bjh(B $Bji(B $Bjj(B $Bjk(B $Bjl(B $Bjm(B $Bjn(B $Bjo(B
+$Bjp(B $Bjq(B $Bjr(B $Bjs(B $Bjt(B $Bju(B $Bjv(B $Bjw(B $Bjx(B $Bjy(B $Bjz(B $Bj{(B $Bj|(B $Bj}(B $Bj~(B
+   $Bk!(B $Bk"(B $Bk#(B $Bk$(B $Bk%(B $Bk&(B $Bk'(B $Bk((B $Bk)(B $Bk*(B $Bk+(B $Bk,(B $Bk-(B $Bk.(B $Bk/(B
+$Bk0(B $Bk1(B $Bk2(B $Bk3(B $Bk4(B $Bk5(B $Bk6(B $Bk7(B $Bk8(B $Bk9(B $Bk:(B $Bk;(B $Bk<(B $Bk=(B $Bk>(B $Bk?(B
+$Bk@(B $BkA(B $BkB(B $BkC(B $BkD(B $BkE(B $BkF(B $BkG(B $BkH(B $BkI(B $BkJ(B $BkK(B $BkL(B $BkM(B $BkN(B $BkO(B
+$BkP(B $BkQ(B $BkR(B $BkS(B $BkT(B $BkU(B $BkV(B $BkW(B $BkX(B $BkY(B $BkZ(B $Bk[(B $Bk\(B $Bk](B $Bk^(B $Bk_(B
+$Bk`(B $Bka(B $Bkb(B $Bkc(B $Bkd(B $Bke(B $Bkf(B $Bkg(B $Bkh(B $Bki(B $Bkj(B $Bkk(B $Bkl(B $Bkm(B $Bkn(B $Bko(B
+$Bkp(B $Bkq(B $Bkr(B $Bks(B $Bkt(B $Bku(B $Bkv(B $Bkw(B $Bkx(B $Bky(B $Bkz(B $Bk{(B $Bk|(B $Bk}(B $Bk~(B
+   $Bl!(B $Bl"(B $Bl#(B $Bl$(B $Bl%(B $Bl&(B $Bl'(B $Bl((B $Bl)(B $Bl*(B $Bl+(B $Bl,(B $Bl-(B $Bl.(B $Bl/(B
+$Bl0(B $Bl1(B $Bl2(B $Bl3(B $Bl4(B $Bl5(B $Bl6(B $Bl7(B $Bl8(B $Bl9(B $Bl:(B $Bl;(B $Bl<(B $Bl=(B $Bl>(B $Bl?(B
+$Bl@(B $BlA(B $BlB(B $BlC(B $BlD(B $BlE(B $BlF(B $BlG(B $BlH(B $BlI(B $BlJ(B $BlK(B $BlL(B $BlM(B $BlN(B $BlO(B
+$BlP(B $BlQ(B $BlR(B $BlS(B $BlT(B $BlU(B $BlV(B $BlW(B $BlX(B $BlY(B $BlZ(B $Bl[(B $Bl\(B $Bl](B $Bl^(B $Bl_(B
+$Bl`(B $Bla(B $Blb(B $Blc(B $Bld(B $Ble(B $Blf(B $Blg(B $Blh(B $Bli(B $Blj(B $Blk(B $Bll(B $Blm(B $Bln(B $Blo(B
+$Blp(B $Blq(B $Blr(B $Bls(B $Blt(B $Blu(B $Blv(B $Blw(B $Blx(B $Bly(B $Blz(B $Bl{(B $Bl|(B $Bl}(B $Bl~(B
+   $Bm!(B $Bm"(B $Bm#(B $Bm$(B $Bm%(B $Bm&(B $Bm'(B $Bm((B $Bm)(B $Bm*(B $Bm+(B $Bm,(B $Bm-(B $Bm.(B $Bm/(B
+$Bm0(B $Bm1(B $Bm2(B $Bm3(B $Bm4(B $Bm5(B $Bm6(B $Bm7(B $Bm8(B $Bm9(B $Bm:(B $Bm;(B $Bm<(B $Bm=(B $Bm>(B $Bm?(B
+$Bm@(B $BmA(B $BmB(B $BmC(B $BmD(B $BmE(B $BmF(B $BmG(B $BmH(B $BmI(B $BmJ(B $BmK(B $BmL(B $BmM(B $BmN(B $BmO(B
+$BmP(B $BmQ(B $BmR(B $BmS(B $BmT(B $BmU(B $BmV(B $BmW(B $BmX(B $BmY(B $BmZ(B $Bm[(B $Bm\(B $Bm](B $Bm^(B $Bm_(B
+$Bm`(B $Bma(B $Bmb(B $Bmc(B $Bmd(B $Bme(B $Bmf(B $Bmg(B $Bmh(B $Bmi(B $Bmj(B $Bmk(B $Bml(B $Bmm(B $Bmn(B $Bmo(B
+$Bmp(B $Bmq(B $Bmr(B $Bms(B $Bmt(B $Bmu(B $Bmv(B $Bmw(B $Bmx(B $Bmy(B $Bmz(B $Bm{(B $Bm|(B $Bm}(B $Bm~(B
+   $Bn!(B $Bn"(B $Bn#(B $Bn$(B $Bn%(B $Bn&(B $Bn'(B $Bn((B $Bn)(B $Bn*(B $Bn+(B $Bn,(B $Bn-(B $Bn.(B $Bn/(B
+$Bn0(B $Bn1(B $Bn2(B $Bn3(B $Bn4(B $Bn5(B $Bn6(B $Bn7(B $Bn8(B $Bn9(B $Bn:(B $Bn;(B $Bn<(B $Bn=(B $Bn>(B $Bn?(B
+$Bn@(B $BnA(B $BnB(B $BnC(B $BnD(B $BnE(B $BnF(B $BnG(B $BnH(B $BnI(B $BnJ(B $BnK(B $BnL(B $BnM(B $BnN(B $BnO(B
+$BnP(B $BnQ(B $BnR(B $BnS(B $BnT(B $BnU(B $BnV(B $BnW(B $BnX(B $BnY(B $BnZ(B $Bn[(B $Bn\(B $Bn](B $Bn^(B $Bn_(B
+$Bn`(B $Bna(B $Bnb(B $Bnc(B $Bnd(B $Bne(B $Bnf(B $Bng(B $Bnh(B $Bni(B $Bnj(B $Bnk(B $Bnl(B $Bnm(B $Bnn(B $Bno(B
+$Bnp(B $Bnq(B $Bnr(B $Bns(B $Bnt(B $Bnu(B $Bnv(B $Bnw(B $Bnx(B $Bny(B $Bnz(B $Bn{(B $Bn|(B $Bn}(B $Bn~(B
+   $Bo!(B $Bo"(B $Bo#(B $Bo$(B $Bo%(B $Bo&(B $Bo'(B $Bo((B $Bo)(B $Bo*(B $Bo+(B $Bo,(B $Bo-(B $Bo.(B $Bo/(B
+$Bo0(B $Bo1(B $Bo2(B $Bo3(B $Bo4(B $Bo5(B $Bo6(B $Bo7(B $Bo8(B $Bo9(B $Bo:(B $Bo;(B $Bo<(B $Bo=(B $Bo>(B $Bo?(B
+$Bo@(B $BoA(B $BoB(B $BoC(B $BoD(B $BoE(B $BoF(B $BoG(B $BoH(B $BoI(B $BoJ(B $BoK(B $BoL(B $BoM(B $BoN(B $BoO(B
+$BoP(B $BoQ(B $BoR(B $BoS(B $BoT(B $BoU(B $BoV(B $BoW(B $BoX(B $BoY(B $BoZ(B $Bo[(B $Bo\(B $Bo](B $Bo^(B $Bo_(B
+$Bo`(B $Boa(B $Bob(B $Boc(B $Bod(B $Boe(B $Bof(B $Bog(B $Boh(B $Boi(B $Boj(B $Bok(B $Bol(B $Bom(B $Bon(B $Boo(B
+$Bop(B $Boq(B $Bor(B $Bos(B $Bot(B $Bou(B $Bov(B $Bow(B $Box(B $Boy(B $Boz(B $Bo{(B $Bo|(B $Bo}(B $Bo~(B
+   $Bp!(B $Bp"(B $Bp#(B $Bp$(B $Bp%(B $Bp&(B $Bp'(B $Bp((B $Bp)(B $Bp*(B $Bp+(B $Bp,(B $Bp-(B $Bp.(B $Bp/(B
+$Bp0(B $Bp1(B $Bp2(B $Bp3(B $Bp4(B $Bp5(B $Bp6(B $Bp7(B $Bp8(B $Bp9(B $Bp:(B $Bp;(B $Bp<(B $Bp=(B $Bp>(B $Bp?(B
+$Bp@(B $BpA(B $BpB(B $BpC(B $BpD(B $BpE(B $BpF(B $BpG(B $BpH(B $BpI(B $BpJ(B $BpK(B $BpL(B $BpM(B $BpN(B $BpO(B
+$BpP(B $BpQ(B $BpR(B $BpS(B $BpT(B $BpU(B $BpV(B $BpW(B $BpX(B $BpY(B $BpZ(B $Bp[(B $Bp\(B $Bp](B $Bp^(B $Bp_(B
+$Bp`(B $Bpa(B $Bpb(B $Bpc(B $Bpd(B $Bpe(B $Bpf(B $Bpg(B $Bph(B $Bpi(B $Bpj(B $Bpk(B $Bpl(B $Bpm(B $Bpn(B $Bpo(B
+$Bpp(B $Bpq(B $Bpr(B $Bps(B $Bpt(B $Bpu(B $Bpv(B $Bpw(B $Bpx(B $Bpy(B $Bpz(B $Bp{(B $Bp|(B $Bp}(B $Bp~(B
+   $Bq!(B $Bq"(B $Bq#(B $Bq$(B $Bq%(B $Bq&(B $Bq'(B $Bq((B $Bq)(B $Bq*(B $Bq+(B $Bq,(B $Bq-(B $Bq.(B $Bq/(B
+$Bq0(B $Bq1(B $Bq2(B $Bq3(B $Bq4(B $Bq5(B $Bq6(B $Bq7(B $Bq8(B $Bq9(B $Bq:(B $Bq;(B $Bq<(B $Bq=(B $Bq>(B $Bq?(B
+$Bq@(B $BqA(B $BqB(B $BqC(B $BqD(B $BqE(B $BqF(B $BqG(B $BqH(B $BqI(B $BqJ(B $BqK(B $BqL(B $BqM(B $BqN(B $BqO(B
+$BqP(B $BqQ(B $BqR(B $BqS(B $BqT(B $BqU(B $BqV(B $BqW(B $BqX(B $BqY(B $BqZ(B $Bq[(B $Bq\(B $Bq](B $Bq^(B $Bq_(B
+$Bq`(B $Bqa(B $Bqb(B $Bqc(B $Bqd(B $Bqe(B $Bqf(B $Bqg(B $Bqh(B $Bqi(B $Bqj(B $Bqk(B $Bql(B $Bqm(B $Bqn(B $Bqo(B
+$Bqp(B $Bqq(B $Bqr(B $Bqs(B $Bqt(B $Bqu(B $Bqv(B $Bqw(B $Bqx(B $Bqy(B $Bqz(B $Bq{(B $Bq|(B $Bq}(B $Bq~(B
+   $Br!(B $Br"(B $Br#(B $Br$(B $Br%(B $Br&(B $Br'(B $Br((B $Br)(B $Br*(B $Br+(B $Br,(B $Br-(B $Br.(B $Br/(B
+$Br0(B $Br1(B $Br2(B $Br3(B $Br4(B $Br5(B $Br6(B $Br7(B $Br8(B $Br9(B $Br:(B $Br;(B $Br<(B $Br=(B $Br>(B $Br?(B
+$Br@(B $BrA(B $BrB(B $BrC(B $BrD(B $BrE(B $BrF(B $BrG(B $BrH(B $BrI(B $BrJ(B $BrK(B $BrL(B $BrM(B $BrN(B $BrO(B
+$BrP(B $BrQ(B $BrR(B $BrS(B $BrT(B $BrU(B $BrV(B $BrW(B $BrX(B $BrY(B $BrZ(B $Br[(B $Br\(B $Br](B $Br^(B $Br_(B
+$Br`(B $Bra(B $Brb(B $Brc(B $Brd(B $Bre(B $Brf(B $Brg(B $Brh(B $Bri(B $Brj(B $Brk(B $Brl(B $Brm(B $Brn(B $Bro(B
+$Brp(B $Brq(B $Brr(B $Brs(B $Brt(B $Bru(B $Brv(B $Brw(B $Brx(B $Bry(B $Brz(B $Br{(B $Br|(B $Br}(B $Br~(B
+   $Bs!(B $Bs"(B $Bs#(B $Bs$(B $Bs%(B $Bs&(B $Bs'(B $Bs((B $Bs)(B $Bs*(B $Bs+(B $Bs,(B $Bs-(B $Bs.(B $Bs/(B
+$Bs0(B $Bs1(B $Bs2(B $Bs3(B $Bs4(B $Bs5(B $Bs6(B $Bs7(B $Bs8(B $Bs9(B $Bs:(B $Bs;(B $Bs<(B $Bs=(B $Bs>(B $Bs?(B
+$Bs@(B $BsA(B $BsB(B $BsC(B $BsD(B $BsE(B $BsF(B $BsG(B $BsH(B $BsI(B $BsJ(B $BsK(B $BsL(B $BsM(B $BsN(B $BsO(B
+$BsP(B $BsQ(B $BsR(B $BsS(B $BsT(B $BsU(B $BsV(B $BsW(B $BsX(B $BsY(B $BsZ(B $Bs[(B $Bs\(B $Bs](B $Bs^(B $Bs_(B
+$Bs`(B $Bsa(B $Bsb(B $Bsc(B $Bsd(B $Bse(B $Bsf(B $Bsg(B $Bsh(B $Bsi(B $Bsj(B $Bsk(B $Bsl(B $Bsm(B $Bsn(B $Bso(B
+$Bsp(B $Bsq(B $Bsr(B $Bss(B $Bst(B $Bsu(B $Bsv(B $Bsw(B $Bsx(B $Bsy(B $Bsz(B $Bs{(B $Bs|(B $Bs}(B $Bs~(B
+   $Bt!(B $Bt"(B $Bt#(B $Bt$(B $Bt%(B $Bt&(B
+
+JIS0123 ($BF|K\8l(B)		$B$3$s$K$A$O(B
+	JIS  -- $B855$(B  $B3+H/(B
+    $B/export/Users/ianl/1.4.2/test/sun/nio/cs/SCCS/s.ISO2022JP.data0%G!<%?%Y!<%9$KAw$k$Y$-$G$J$$$3$H$KCmL\$7$F$/$@$5$$!#(B</p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ISO8859x.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,105 @@
+/*
+ * 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 6419791
+ * @summary
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.util.*;
+import java.nio.charset.*;
+import java.nio.*;
+
+public class ISO8859x {
+    final static byte[] lowBytes = new byte[0xa0];
+    final static char[] lowChars = new char[0xa0];
+    final static String lowString;
+    static {
+        for (int i = 0; i < 0xa0; i++) {
+            lowBytes[i] = (byte) i;
+            lowChars[i] = (char) i;
+        }
+        lowString = new String(lowChars);
+    }
+
+    private static void testCharset(Charset cs) throws Throwable {
+        String csn = cs.name();
+        System.out.println(csn);
+
+        check(cs.canEncode());
+        check(Arrays.equals(lowString.getBytes(csn), lowBytes));
+        check(new String(lowBytes, csn).equals(lowString));
+
+        CharsetEncoder encoder = cs.newEncoder();
+        CharsetDecoder decoder = cs.newDecoder();
+        decoder.onUnmappableCharacter(CodingErrorAction.REPORT)
+               .onMalformedInput(CodingErrorAction.REPORT);
+        encoder.onUnmappableCharacter(CodingErrorAction.REPORT)
+               .onMalformedInput(CodingErrorAction.REPORT);
+
+        byte[] bytes = new byte[1];
+        for (int c = 0xa0; c < 0x100; c++) {
+            try {
+                bytes[0] = (byte) c;
+                char[] chars;
+                try { chars = decoder.decode(ByteBuffer.wrap(bytes)).array(); }
+                catch (UnmappableCharacterException x) { continue; }
+                equal(chars.length, 1);
+                byte[] bytes2 = encoder.encode(CharBuffer.wrap(chars)).array();
+                check(Arrays.equals(bytes2, bytes));
+            } catch (Throwable t) {
+                System.out.printf("cs=%s c=%02x%n", cs, c);
+                unexpected(t);
+            }
+        }
+    }
+
+    private static void realMain(String[] args) throws Throwable {
+        for (Map.Entry<String,Charset> e
+                 : Charset.availableCharsets().entrySet()) {
+            String csn = e.getKey();
+            Charset cs = e.getValue();
+            if (csn.matches(".*(8859).*"))
+                try { testCharset(cs); }
+                catch (Throwable t) { unexpected(t); }
+        }
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/JISAutoDetectTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,158 @@
+/*
+ * 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 4087261 4184592
+ * @summary Make sure to determine Japanese text encoding as correctly
+ * as possible.
+ */
+
+import java.nio.charset.*;
+import java.nio.*;
+
+public class JISAutoDetectTest {
+
+    class TestData {
+        byte[]  input;
+        byte[]  input2;                 // for second call
+        String  expectedCharset;
+    }
+    TestData[] data = new TestData[50];
+
+    public static void main(String[] argv) throws Exception {
+        JISAutoDetectTest test =  new JISAutoDetectTest();
+        test.execute();
+    }
+
+    void execute() throws Exception {
+        CharBuffer output = CharBuffer.allocate(128);
+        CharBuffer expectedOutput = CharBuffer.allocate(128);
+
+        for (int i = 0; i < data.length; i++) {
+            if (data[i] == null)
+                break;
+
+            CharsetDecoder autoDetect = Charset.forName("JISAutoDetect").newDecoder();
+            CharsetDecoder dec = Charset.forName(data[i].expectedCharset).newDecoder();
+            CoderResult ncr, mcr;
+            output.clear();
+            expectedOutput.clear();
+            ncr = autoDetect.decode(ByteBuffer.wrap(data[i].input),
+                                    output,
+                                    true);
+            mcr = dec.decode(ByteBuffer.wrap(data[i].input),
+                             expectedOutput,
+                             true);
+
+            if (data[i].input2 != null) {
+                ncr = autoDetect.decode(ByteBuffer.wrap(data[i].input2),
+                                       output,
+                                       true);
+                mcr = dec.decode(ByteBuffer.wrap(data[i].input2),
+                                 expectedOutput,
+                                 true);
+            }
+            String testNumber = " (test#: " + i + ")";
+            if (ncr != mcr)
+                throw new Exception("JISAutoDetect returned a wrong result");
+            output.flip();
+            expectedOutput.flip();
+            if (output.limit() != expectedOutput.limit())
+                throw new Exception("JISAutoDetect returned a wrong length"+testNumber);
+
+            for (int x = 0; x < output.limit(); x++) {
+                if (expectedOutput.charAt(x) != output.charAt(x))
+                    throw new Exception("JISAutoDetect returned a wrong string"+testNumber);
+            }
+        }
+    }
+
+    public JISAutoDetectTest() {
+        int i = 0;
+
+        // 0
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)'C', (byte)'o', (byte)'p', (byte)'y',
+                                     (byte)'r', (byte)'i', (byte)'g', (byte)'h',
+                                     (byte)'t', (byte)' ', (byte)0xa9, (byte)' ',
+                                     (byte)'1', (byte)'9', (byte)'9', (byte)'8' };
+        data[i].expectedCharset = "SJIS";
+
+        // 1
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                                     (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                                     (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+                                     (byte)0x82, (byte)0xc5, (byte)0x82, (byte)0xb7 };
+        data[i].expectedCharset = "SJIS";
+
+        // 2
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                                     (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                                     (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde};
+        data[i].expectedCharset = "SJIS";
+
+        // 3
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                                     (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                                     (byte)0xc3, (byte)0xd1, (byte)0xbd };
+        data[i].expectedCharset = "SJIS";
+
+        // 4
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0x8f, (byte)0xa1, (byte)0xaa };
+        data[i].expectedCharset = "SJIS";
+
+        // 5
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xa4, (byte)0xd2, (byte)0xa4, (byte)0xe9,
+                                     (byte)0xa4, (byte)0xac, (byte)0xa4, (byte)0xca };
+        data[i].expectedCharset = "EUC_JP";
+
+        // 6
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                                     (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                                     (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+                                     (byte)0xa4, (byte)0xc7, (byte)0xa4, (byte)0xb9 };
+        data[i].expectedCharset = "EUC_JP";
+
+        // 7 (for 4184592)
+        i++;
+        data[i] = new TestData();
+        data[i].input = new byte[] { (byte)'a', (byte)'b', (byte)'c' };
+        data[i].input2 = new byte[] { (byte)0x1b, (byte)'$', (byte)'B',
+                                      (byte)'#', (byte)'4', (byte)'$', (byte)'5',
+                                      (byte)0x1b, (byte)'(', (byte)'B' };
+        data[i].expectedCharset = "ISO2022JP";
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,80 @@
+/*
+ * 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 4658679 4879644
+   @summary Checks replacement logic within EUC-TW decoder
+*/
+
+/*
+ * Tests goodness of fix for bugID 4658679: EUC-TW decoder should
+ * perform replacement when it encounters latin chars outside the
+ * normal US-ASCII range. For example: Isolated occurrences of
+ * French accented chars. See bugID: 4658679.
+ */
+import java.io.*;
+public class LatinCharReplacementTWTest {
+    public static void  main(String[] args) throws Exception {
+        final String bugID = "4658679";
+        // Attempt to decode
+        byte[] input = { (byte)0xa1,
+                         (byte)0xf0,
+                         (byte)'r',
+                         (byte)'e',
+                         (byte)'s',
+                         (byte)0xe9,  // illegal within EUC-TW
+                         (byte)'r',
+                         (byte)'v',
+                         (byte)0xe9,  // illegal within EUC-TW
+                         (byte)'s',
+                         (byte)0xa2,
+                         (byte)0xf8
+                       };
+
+        char[] expected = { (char) 0xa7,
+                         (char) 'r',
+                         (char) 'e',
+                         (char) 's',
+                         (char) 0xFFFD,  // replacement for accented lowercase e
+                         (char) 'r',
+                         (char) 'v',
+                         (char) 0xFFFD,  // replacement for accented lowercase e
+                         (char) 's',
+                         (char) 0xb0 };
+
+        ByteArrayInputStream bais = new ByteArrayInputStream(input);
+        InputStreamReader isr = new InputStreamReader(bais, "x-EUC-TW");
+
+        char[] decoded = new char[128];
+        int numChars = isr.read(decoded);
+
+        if (numChars != expected.length) {
+            throw new Exception("failure of test for bug " + bugID);
+        }
+
+        for (int i = 0 ; i < numChars; i++) {
+           if (decoded[i] != expected[i])
+                throw new Exception("failure of test for bug " + bugID);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/LeftOverSurrogate.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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 4160949
+   @summary Verify that left over high surrogate does not
+   cause an UnknownCharacterException when substitutition mode is turned on.
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class LeftOverSurrogate {
+
+    public static void main(String args[]) throws Exception {
+        String s = "abc\uD800\uDC00qrst"; // Valid surrogate
+        char[] c = s.toCharArray();
+        CharsetEncoder enc = Charset.forName("ISO8859_1").newEncoder()
+          .onUnmappableCharacter(CodingErrorAction.REPLACE);
+        /* Process the first 4 characters, including the high surrogate
+           which should be stored */
+        ByteBuffer bb = ByteBuffer.allocate(10);
+        CharBuffer cb = CharBuffer.wrap(c);
+        cb.limit(4);
+        enc.encode(cb, bb, false);
+        cb.limit(7);
+        enc.encode(cb, bb, true);
+        byte[] first = bb.array();
+        for(int i = 0; i < 7; i++)
+            System.err.printf("[%d]=%d was %d\n",
+                              i,
+                              (int) first[i] &0xffff,
+                              (int) c[i] & 0xffff);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/MalformedSurrogates.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,85 @@
+/*
+ * 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 4153987
+   @summary Malformed surrogates should be handled by the converter in
+   substitution mode.
+ */
+
+import java.io.*;
+
+public class MalformedSurrogates {
+
+    public static void main(String[] args) throws Exception {
+
+        String fe = System.getProperty("file.encoding");
+        if (  fe.equalsIgnoreCase("UTF8")
+              || fe.equalsIgnoreCase("UTF-8")
+              || fe.equalsIgnoreCase("UTF_8"))
+            // This test is meaningless if the default charset
+            // does handle surrogates
+            return;
+
+        System.out.println("Testing string conversion...");
+        /* Example with malformed surrogate, and an offset */
+        String t = "abc\uD800\uDB00efgh";
+        String t2 = t.substring(2);
+        byte[] b = t2.getBytes();
+        System.err.println(b.length);
+        for (int i = 0; i < b.length; i++)
+            System.err.println("[" + i + "]" + "=" + (char) b[i]
+                               + "=" + (int) b[i]);
+        if (b.length != 7) {
+            throw new Exception("Bad string conversion for bad surrogate");
+        }
+
+        /* Example with a proper surrogate, no offset. Always worked */
+        String t3 = "abc\uD800\uDC00efgh";
+        byte[] b2 = t3.getBytes();
+        System.out.println(b2.length);
+        for(int i = 0; i < b2.length; i++)
+            System.err.println("[" + i + "]" + "=" + (char) b2[i]);
+        if (b2.length != 8) {
+            throw new Exception("Bad string conversion for good surrogate");
+        }
+
+        OutputStream os = new ByteArrayOutputStream();
+        OutputStreamWriter osw = new OutputStreamWriter(os);
+        System.out.println("Testing flush....");
+        /* Check for the case where the converter has a left over
+           high surrogate when flush is called on the converter */
+        osw.flush();
+        String s = "abc\uD800"; // High surrogate
+        char[] c = s.toCharArray();
+        osw.write(s, 0, 4);
+        osw.flush();
+
+        System.out.println("Testing convert...");
+        /* Verify that all other characters go through */
+        for (int k = 1; k < 65535 ; k++) {
+            osw.write("Char[" + k + "]=\"" + ((char) k) + "\"");
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,282 @@
+/*
+ * 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 4831163 5053096 5056440
+ * @summary NIO charset basic verification of JISAutodetect decoder
+ * @author Martin Buchholz
+ */
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CoderResult;
+import static java.lang.System.*;
+
+public class NIOJISAutoDetectTest {
+    private static int failures = 0;
+
+    private static void fail(String failureMsg) {
+        System.out.println(failureMsg);
+        failures++;
+    }
+
+    private static void check(boolean cond, String msg) {
+        if (!cond) {
+            fail("test failed: " + msg);
+            new Exception().printStackTrace();
+        }
+    }
+
+    private static String SJISName() throws Exception {
+        return detectingCharset(new byte[] {(byte)0xbb, (byte)0xdd,
+                                            (byte)0xcf, (byte)0xb2});
+    }
+
+    private static String EUCJName() throws Exception {
+        return detectingCharset(new byte[] {(byte)0xa4, (byte)0xd2,
+                                            (byte)0xa4, (byte)0xe9});
+    }
+
+    private static String detectingCharset(byte[] bytes) throws Exception {
+        //----------------------------------------------------------------
+        // Test special public methods of CharsetDecoder while we're here
+        //----------------------------------------------------------------
+        CharsetDecoder cd = Charset.forName("JISAutodetect").newDecoder();
+        check(cd.isAutoDetecting(), "isAutodecting()");
+        check(! cd.isCharsetDetected(), "isCharsetDetected");
+        cd.decode(ByteBuffer.wrap(new byte[] {(byte)'A'}));
+        check(! cd.isCharsetDetected(), "isCharsetDetected");
+        try {
+            cd.detectedCharset();
+            fail("no IllegalStateException");
+        } catch (IllegalStateException e) {}
+        cd.decode(ByteBuffer.wrap(bytes));
+        check(cd.isCharsetDetected(), "isCharsetDetected");
+        Charset cs = cd.detectedCharset();
+        check(cs != null, "cs != null");
+        check(! cs.newDecoder().isAutoDetecting(), "isAutodetecting()");
+        return cs.name();
+    }
+
+    public static void main(String[] argv) throws Exception {
+        //----------------------------------------------------------------
+        // Used to throw BufferOverflowException
+        //----------------------------------------------------------------
+        out.println(new String(new byte[] {0x61}, "JISAutoDetect"));
+
+        //----------------------------------------------------------------
+        // InputStreamReader(...JISAutoDetect) used to infloop
+        //----------------------------------------------------------------
+        {
+            byte[] bytes = "ABCD\n".getBytes();
+            ByteArrayInputStream bais = new  ByteArrayInputStream(bytes);
+            InputStreamReader isr = new InputStreamReader(bais, "JISAutoDetect");
+            BufferedReader reader = new BufferedReader(isr);
+            check (reader.readLine().equals("ABCD"), "first read gets text");
+            // used to return "ABCD" on second and subsequent reads
+            check (reader.readLine() == null, "second read gets null");
+        }
+
+        //----------------------------------------------------------------
+        // Check all Japanese chars for sanity
+        //----------------------------------------------------------------
+        String SJIS = SJISName();
+        String EUCJ = EUCJName();
+        out.printf("SJIS charset is %s%n", SJIS);
+        out.printf("EUCJ charset is %s%n", EUCJ);
+
+        int cnt2022 = 0;
+        int cnteucj = 0;
+        int cntsjis = 0;
+        int cntBAD  = 0;
+        for (char c = '\u0000'; c < '\uffff'; c++) {
+            if (c == '\u001b' || // ESC
+                c == '\u2014')   // Em-Dash?
+                continue;
+            String s = new String (new char[] {c});
+
+            //----------------------------------------------------------------
+            // JISAutoDetect can handle all chars that EUC-JP can,
+            // unless there is an ambiguity with SJIS.
+            //----------------------------------------------------------------
+            byte[] beucj = s.getBytes(EUCJ);
+            String seucj = new String(beucj, EUCJ);
+            if (seucj.equals(s)) {
+                cnteucj++;
+                String sauto = new String(beucj, "JISAutoDetect");
+
+                if (! sauto.equals(seucj)) {
+                    cntBAD++;
+                    String ssjis = new String(beucj, SJIS);
+                    if (! sauto.equals(ssjis)) {
+                        fail("Autodetection agrees with neither EUC nor SJIS");
+                    }
+                }
+            } else
+                continue; // Optimization
+
+            //----------------------------------------------------------------
+            // JISAutoDetect can handle all chars that ISO-2022-JP can.
+            //----------------------------------------------------------------
+            byte[] b2022 = s.getBytes("ISO-2022-JP");
+            if (new String(b2022, "ISO-2022-JP").equals(s)) {
+                cnt2022++;
+                check(new String(b2022,"JISAutoDetect").equals(s),
+                      "ISO2022 autodetection");
+            }
+
+            //----------------------------------------------------------------
+            // JISAutoDetect can handle almost all chars that SJIS can.
+            //----------------------------------------------------------------
+            byte[] bsjis = s.getBytes(SJIS);
+            if (new String(bsjis, SJIS).equals(s)) {
+                cntsjis++;
+                check(new String(bsjis,"JISAutoDetect").equals(s),
+                      "SJIS autodetection");
+            }
+        }
+        out.printf("There are %d ISO-2022-JP-encodable characters.%n", cnt2022);
+        out.printf("There are %d SJIS-encodable characters.%n",        cntsjis);
+        out.printf("There are %d EUC-JP-encodable characters.%n",      cnteucj);
+        out.printf("There are %d characters that are " +
+                   "misdetected as SJIS after being EUC-encoded.%n", cntBAD);
+
+
+        //----------------------------------------------------------------
+        // tests for specific byte sequences
+        //----------------------------------------------------------------
+        test("ISO-2022-JP", new byte[] {'A', 'B', 'C'});
+        test("EUC-JP",      new byte[] {'A', 'B', 'C'});
+        test("SJIS",        new byte[] {'A', 'B', 'C'});
+
+        test("SJIS",
+             new byte[] { 'C', 'o', 'p',  'y',  'r', 'i', 'g',  'h', 't',
+                          ' ', (byte)0xa9, ' ', '1', '9', '9',  '8' });
+
+        test("SJIS",
+             new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                          (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                          (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+                          (byte)0x82, (byte)0xc5, (byte)0x82, (byte)0xb7 });
+
+        test("EUC-JP",
+             new byte[] { (byte)0xa4, (byte)0xd2, (byte)0xa4, (byte)0xe9,
+                          (byte)0xa4, (byte)0xac, (byte)0xa4, (byte)0xca });
+
+        test("SJIS",
+             new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                          (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                          (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde});
+
+        test("SJIS",
+             new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                          (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                          (byte)0xc3, (byte)0xd1, (byte)0xbd });
+
+        test("SJIS",
+             new byte[] { (byte)0x8f, (byte)0xa1, (byte)0xaa });
+
+        test("EUC-JP",
+             new byte[] { (byte)0x8f, (byte)0xc5, (byte)0xe0, (byte)0x20});
+
+        test("EUC-JP",
+             new byte[] { (byte)0xbb, (byte)0xdd, (byte)0xcf, (byte)0xb2,
+                          (byte)0xb8, (byte)0xdb, (byte)0xbc, (byte)0xbd,
+                          (byte)0xc3, (byte)0xd1, (byte)0xbd, (byte)0xde,
+                          (byte)0xa4, (byte)0xc7, (byte)0xa4, (byte)0xb9 });
+
+        test("ISO-2022-JP",
+             new byte[] { 0x1b, '$', 'B', '#', '4', '$', '5', 0x1b, '(', 'B' });
+
+
+        //----------------------------------------------------------------
+        // Check handling of ambiguous end-of-input in middle of first char
+        //----------------------------------------------------------------
+        {
+            CharsetDecoder dc = Charset.forName("x-JISAutoDetect").newDecoder();
+            ByteBuffer bb = ByteBuffer.allocate(128);
+            CharBuffer cb = CharBuffer.allocate(128);
+            bb.put((byte)'A').put((byte)0x8f);
+            bb.flip();
+            CoderResult res = dc.decode(bb,cb,false);
+            check(res.isUnderflow(), "isUnderflow");
+            check(bb.position() == 1, "bb.position()");
+            check(cb.position() == 1, "cb.position()");
+            res = dc.decode(bb,cb,false);
+            check(res.isUnderflow(), "isUnderflow");
+            check(bb.position() == 1, "bb.position()");
+            check(cb.position() == 1, "cb.position()");
+            bb.compact();
+            bb.put((byte)0xa1);
+            bb.flip();
+            res = dc.decode(bb,cb,true);
+            check(res.isUnderflow(), "isUnderflow");
+            check(bb.position() == 2, "bb.position()");
+            check(cb.position() == 2, "cb.position()");
+        }
+
+
+        if (failures > 0)
+            throw new RuntimeException(failures + " tests failed");
+    }
+
+    static void checkCoderResult(CoderResult result) {
+        check(result.isUnderflow(),
+              "Unexpected coder result: " + result);
+    }
+
+    static void test(String expectedCharset, byte[] input) throws Exception {
+        Charset cs = Charset.forName("x-JISAutoDetect");
+        CharsetDecoder autoDetect = cs.newDecoder();
+
+        Charset cs2 = Charset.forName(expectedCharset);
+        CharsetDecoder decoder = cs2.newDecoder();
+
+        ByteBuffer bb = ByteBuffer.allocate(128);
+        CharBuffer charOutput = CharBuffer.allocate(128);
+        CharBuffer charExpected = CharBuffer.allocate(128);
+
+        bb.put(input);
+        bb.flip();
+        bb.mark();
+
+        CoderResult result = autoDetect.decode(bb, charOutput, true);
+        checkCoderResult(result);
+        charOutput.flip();
+        String actual = charOutput.toString();
+
+        bb.reset();
+
+        result = decoder.decode(bb, charExpected, true);
+        checkCoderResult(result);
+        charExpected.flip();
+        String expected = charExpected.toString();
+
+        check(actual.equals(expected),
+              String.format("actual=%s expected=%s", actual, expected));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ReadZero.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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
+ * @summary Verify that if InputStream.read returns 0 we throw an exception.
+ * @bug 4684515
+ */
+
+import java.io.*;
+
+public class ReadZero {
+
+    public static void main(String [] args) throws IOException {
+        ReadZero r = new ReadZero();
+        r.testInputStream();
+    }
+
+    private void testInputStream() throws IOException {
+        File f = new File(System.getProperty("test.src", "."), "ReadZero.java");
+        InputStream is = new FileInputStream(f) {
+            public int read(byte [] b, int off, int len) {
+                System.out.println("FileInputStream.read");
+                return 0;
+            }
+        };
+
+        is.read(new byte[1], 0, 1); // ok
+        InputStreamReader isr = new InputStreamReader(is);
+
+        try {
+            int res = isr.read(new char[1], 0, 1);
+        } catch (IOException x) {
+            System.out.println("IOException caught");
+            return;
+        }
+        throw new RuntimeException("IOException not thrown");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SJISCanEncode.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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 4913702
+   @summary validates canEncode(char c) method for sun.nio.cs.Shift_JIS
+ */
+
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class SJISCanEncode {
+    private Charset cs;
+    private CharsetEncoder encoder;
+
+    private void canEncodeTest(char inputChar,
+                               boolean expectedResult)
+                               throws Exception {
+        String msg = "err: Shift_JIS canEncode() return value ";
+
+        if (encoder.canEncode(inputChar) != expectedResult) {
+            throw new Exception(msg + !(expectedResult) +
+                ": "  + Integer.toHexString((int)inputChar));
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        SJISCanEncode test = new SJISCanEncode();
+        test.cs = Charset.forName("SJIS");
+        test.encoder = test.cs.newEncoder();
+
+        // us-ascii (mappable by Shift_JIS)
+        test.canEncodeTest('\u0001', true);
+
+        // Halfwidth Katakana
+        test.canEncodeTest('\uFF01', true);
+
+        // CJK ideograph
+        test.canEncodeTest('\u4E9C', true);
+
+        //Hiragana
+        test.canEncodeTest('\u3041', true);
+        // fullwidth Katakana
+        test.canEncodeTest('\u30A1', true);
+
+        // U+0080 should be unmappable
+        // U+4000 is a BMP character not covered by Shift_JISe
+
+        test.canEncodeTest('\u0080', false);
+        test.canEncodeTest('\u4000', false);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/StreamEncoderClose.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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 5005426
+   @summary Check if StreamEncoder close() method works correctly from
+            error recovery after the underneath OutputStream failed to
+            close the first time.
+ */
+
+import java.io.*;
+public class StreamEncoderClose {
+    public static void main( String arg[] ) throws Exception {
+        byte[] expected = {(byte)0x1b,(byte)0x24,(byte)0x42,
+                           (byte)0x30,(byte)0x6c,
+                           (byte)0x1b,(byte)0x28,(byte)0x42};
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        MyBufferedOutputStream mbos = new MyBufferedOutputStream(baos);
+        PrintWriter pw = new PrintWriter(new OutputStreamWriter(mbos, "ISO-2022-JP"));
+        mbos.dontClose();
+        pw.write("\u4e00");
+        pw.close();             //  1st PrintWriter Close
+        mbos.canClose();
+        pw.close();             //  2nd PrintWriter Close
+
+        //double check, probably not necessary
+        byte[] out = baos.toByteArray();
+        if (out.length != expected.length) {
+            throw new IOException("Failed");
+        }
+        for (int i = 0; i < out.length; i++) {
+            //System.out.printf("(byte)0x%x,", out[i] & 0xff);
+            if (out[i] != expected[i])
+                throw new IOException("Failed");
+        }
+    }
+
+    static class MyBufferedOutputStream extends BufferedOutputStream {
+        MyBufferedOutputStream(OutputStream os) {
+            super(os);
+        }
+        private boolean status;
+        public void dontClose() {
+            status = false;
+        }
+        public void canClose() {
+            status = true;
+        }
+        public void close() throws IOException {
+            if ( status == false ) {
+                throw new IOException("Can't close ");
+            }
+            super.close();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateGB18030Test.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,121 @@
+/*
+ * 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 4896454
+   @summary Check GB18030 surrogate encoding/decoding handling
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class SurrogateGB18030Test {
+    public static void main(String[] args) throws Exception {
+        SurrogateGB18030Test test = new SurrogateGB18030Test();
+
+        test.roundtripTest();
+
+        /**
+         * Valid Surrogate pair and 4 byte GB18030 representation
+         */
+
+        String inputString =  "\uD800\uDC00";
+
+        byte[] expectedBytes = { (byte)0x90,
+                                 (byte)0x30,
+                                 (byte)0x81,
+                                 (byte)0x30
+                               };
+        test.encodeTest(inputString, expectedBytes);
+
+        /**
+         * Vice-versa : check that 4 byte GB18030 value encodes correctly
+         */
+
+        String expectedStr = "\uDBFF\uDFFF";
+
+        byte[] inputBytes = { (byte)0xe3,
+                              (byte)0x32,
+                              (byte)0x9a,
+                              (byte)0x35
+                              };
+
+
+        test.decodeTest(inputBytes, expectedStr);
+
+    }
+
+    private void roundtripTest() throws Exception
+    {
+        byte[] ba;
+        char[] pair = new char[2];
+        for (char high = '\ud800'; high <= '\udbff'; high++) {
+            for (char low = '\udc00'; low <= '\udfff'; low++) {
+                pair[0] = high;
+                pair[1] = low;
+                String s = new String(pair);
+                if (!s.equals(new String(s.getBytes("gb18030"), "gb18030")))
+                    throw new Exception ("GB18030 roundtrip failure");
+            }
+        }
+
+    }
+
+    private void encodeTest(String inputString, byte[] expectedBytes)
+        throws Exception
+    {
+        byte[] encoded = inputString.getBytes("GB18030");
+
+        CharBuffer cb = CharBuffer.wrap(inputString.toCharArray());
+        ByteBuffer bb = ByteBuffer.allocate(4);
+
+        CharsetEncoder encoder = Charset.forName("GB18030").newEncoder();
+        encoder.encode(cb, bb, true);
+
+        bb.flip();
+        for (int i = 0 ; i < expectedBytes.length; i++) {
+            if (encoded[i] != expectedBytes[i]
+                || bb.get() != expectedBytes[i])
+                    throw new Exception ("GB18030 encode failure");
+        }
+    }
+
+    private void decodeTest(byte[] inputBytes, String expectedStr)
+        throws Exception
+    {
+        String s2 = new String(inputBytes, "GB18030");
+
+        CharsetDecoder decoder = Charset.forName("GB18030").newDecoder();
+
+        ByteBuffer bb = ByteBuffer.wrap(inputBytes);
+        CharBuffer cb = CharBuffer.allocate(2);
+        decoder.decode(bb, cb, true);
+
+        cb.flip();
+        for (int i = 0 ; i < expectedStr.length(); i++) {
+            if (expectedStr.charAt(i) != cb.get()
+                || s2.charAt(i) != expectedStr.charAt(i))
+                    throw new Exception ("GB18030 encode failure");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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 4847097
+   @summary Check surrogate coverage of EUC_TW
+ */
+
+/*
+ * Tests the full surrogate mapping roundtrip fidelity of the
+ * EUC-TW charset coder updated to support the additional
+ * planes 4,5,6,7,15
+ *
+ * byte->char mappings are contained in external files
+ * using plane{x}.surrogate as the convention for the input filenames
+ *
+ */
+
+import java.io.*;
+public class SurrogateTestEUCTW {
+
+    private static final String testRootDir
+        = System.getProperty("test.src", ".");
+
+    public static void main(String[] args) throws Exception {
+        char[] surrogatePair = new char[2];
+        int[] expectBytes = new int[4];
+
+        // Iterate test over each supported CNS-11643 plane
+        // containing supplementary character mappings
+
+        String[] testPlane = { "3", "4", "5", "6" ,"7", "15" };
+
+        for (int i = 0 ; i < testPlane.length; i++) {
+            FileReader f = new FileReader(testRootDir +
+                                          System.getProperty("file.separator")
+                                          + "SurrogateTestEUCTW.plane"
+                                          + testPlane[i]
+                                          + ".surrogates");
+            BufferedReader r = new BufferedReader(f);
+            String line;
+
+            while ((line = r.readLine()) != null) {
+                int charValue = Integer.parseInt(line.substring(9,14), 16);
+                surrogatePair[0] = (char) ((charValue - 0x10000) / 0x400
+                                    + 0xd800);
+                surrogatePair[1] = (char) ((charValue - 0x10000) % 0x400
+                                    + 0xdc00);
+                // Synthesize 4 byte expected byte values from CNS input values
+                expectBytes[0] = 0x8E;
+                expectBytes[1] = 0xA0 + Integer.parseInt(testPlane[i]);
+                expectBytes[2] = 0x80 | Integer.parseInt(line.substring(2,4), 16);
+                expectBytes[3] = 0x80 | Integer.parseInt(line.substring(4,6), 16);
+
+                String testStr = new String(surrogatePair);
+                byte[] encodedBytes = testStr.getBytes("EUC-TW");
+
+                for (int x = 0 ; x < 4 ; x++) {
+                    if (encodedBytes[x] != (byte)(expectBytes[x] & 0xff)) {
+                        throw new Exception("EUC_TW Surrogate Encoder error");
+                    }
+                }
+
+                // Next: test round-trip fidelity
+                String decoded = new String(encodedBytes, "EUC-TW");
+
+                if (!decoded.equals(testStr)) {
+                    throw new Exception("EUCTW Decoder error");
+                }
+            }
+            r.close();
+            f.close();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6476 @@
+0x2121	0x20002	
+0x2122	0x2008C	
+0x2123	0x200D4	
+0x2124	0x201A5	
+0x2125	0x20092	
+0x2126	0x20093	
+0x2127	0x200D8	
+0x2128	0x200D9	
+0x2129	0x201A7	
+0x212A	0x2062B	
+0x212B	0x2062C	
+0x212C	0x2062D	
+0x212D	0x20630	
+0x212E	0x2062E	
+0x212F	0x206AB	
+0x2131	0x2092D	
+0x2132	0x2096D	
+0x2133	0x2F834	
+0x2134	0x20A0F	
+0x2136	0x20B9D	
+0x2137	0x211A2	
+0x2138	0x215D4	
+0x2139	0x21B56	
+0x213A	0x21BC3	
+0x213B	0x22014	
+0x213D	0x2471A	
+0x213E	0x2000F	
+0x213F	0x20010	
+0x2140	0x2009A	
+0x2141	0x2009B	
+0x2143	0x201AC	
+0x2145	0x20097	
+0x2146	0x20546	
+0x2148	0x20576	
+0x2149	0x20577	
+0x214A	0x205AE	
+0x214B	0x2063A	
+0x214C	0x2067D	
+0x214D	0x21BC5	
+0x214E	0x20BA8	
+0x2151	0x21241	
+0x2152	0x21242	
+0x2153	0x215D8	
+0x2154	0x215D9	
+0x2155	0x216AA	
+0x2156	0x216AB	
+0x2157	0x21942	
+0x2158	0x21941	
+0x215A	0x21BC6	
+0x215C	0x21D35	
+0x215D	0x21D36	
+0x215E	0x21D37	
+0x215F	0x2F883	
+0x2160	0x2634D	
+0x2162	0x221B5	
+0x2163	0x22317	
+0x2164	0x22482	
+0x2165	0x233B6	
+0x2167	0x23C72	
+0x2168	0x2455C	
+0x2169	0x245A8	
+0x216B	0x215E3	
+0x216E	0x200E6	
+0x216F	0x20144	
+0x2170	0x20145	
+0x2173	0x201C4	
+0x2174	0x201C5	
+0x2175	0x201C6	
+0x2176	0x201C7	
+0x2177	0x201C8	
+0x2178	0x201C9	
+0x2179	0x201CA	
+0x217A	0x201D4	
+0x217B	0x2057D	
+0x217C	0x26272	
+0x217D	0x205B2	
+0x217E	0x205B4	
+0x2221	0x20682	
+0x2222	0x206C7	
+0x2223	0x206C8	
+0x2225	0x2083C	
+0x2226	0x2083D	
+0x2227	0x2083E	
+0x2228	0x2083F	
+0x2229	0x2F824	
+0x222A	0x208D3	
+0x222B	0x20147	
+0x222D	0x20A3D	
+0x222E	0x20AE2	
+0x222F	0x20BB8	
+0x2230	0x20BB9	
+0x2231	0x20BC2	
+0x2232	0x20BBA	
+0x2233	0x20BC6	
+0x2234	0x20BBB	
+0x2235	0x211AD	
+0x2236	0x2124C	
+0x2237	0x2124D	
+0x2239	0x216B2	
+0x223A	0x216B3	
+0x223B	0x216B4	
+0x223C	0x216B5	
+0x223D	0x219C3	
+0x223E	0x219C4	
+0x223F	0x219C5	
+0x2240	0x219C6	
+0x2241	0x219C7	
+0x2243	0x21BCE	
+0x2244	0x21C30	
+0x2245	0x21D47	
+0x2246	0x21D48	
+0x2248	0x2205C	
+0x224A	0x2205F	
+0x224B	0x22318	
+0x224C	0x22319	
+0x224D	0x2237E	
+0x224F	0x225B0	
+0x2250	0x22A75	
+0x2252	0x22A76	
+0x2253	0x23041	
+0x2254	0x23142	
+0x2256	0x233BD	
+0x225A	0x23B1E	
+0x225B	0x23B1F	
+0x225C	0x23C87	
+0x225E	0x23C78	
+0x225F	0x24188	
+0x2260	0x24189	
+0x2261	0x2418A	
+0x2262	0x24617	
+0x2263	0x24615	
+0x2267	0x250E5	
+0x2268	0x25609	
+0x2269	0x2573B	
+0x226A	0x2574F	
+0x226C	0x2662E	
+0x226D	0x2662F	
+0x226E	0x26AFF	
+0x226F	0x26AFD	
+0x2270	0x26AFE	
+0x2274	0x20023	
+0x2275	0x200EA	
+0x2276	0x2012A	
+0x2277	0x20149	
+0x2278	0x2014A	
+0x2279	0x2014B	
+0x227A	0x201DF	
+0x227B	0x201E0	
+0x227C	0x201E1	
+0x227D	0x201E2	
+0x227E	0x205C1	
+0x2321	0x201E3	
+0x2322	0x201E4	
+0x2323	0x201E5	
+0x2324	0x205C0	
+0x2325	0x201E6	
+0x2326	0x201F7	
+0x2328	0x201E7	
+0x2329	0x201E8	
+0x232A	0x201E9	
+0x232B	0x201EA	
+0x232C	0x201EB	
+0x232D	0x2050E	
+0x232E	0x20580	
+0x232F	0x20581	
+0x2330	0x205BA	
+0x2331	0x205BB	
+0x2332	0x205BC	
+0x2333	0x205BD	
+0x2334	0x2063F	
+0x2335	0x20640	
+0x2336	0x20688	
+0x2337	0x2F81F	
+0x2338	0x20846	
+0x233A	0x20847	
+0x233B	0x20848	
+0x233C	0x20936	
+0x233D	0x20972	
+0x233E	0x20996	
+0x233F	0x20A47	
+0x2340	0x20AE7	
+0x2341	0x20B34	
+0x2342	0x20B35	
+0x2343	0x20B36	
+0x2344	0x20B37	
+0x2345	0x20BE3	
+0x2346	0x20BE4	
+0x2347	0x20BE5	
+0x2348	0x20BEB	
+0x234A	0x20BE6	
+0x234B	0x20BE7	
+0x234C	0x20BE8	
+0x234F	0x211B9	
+0x2351	0x211BA	
+0x2353	0x21263	
+0x2354	0x21264	
+0x2356	0x21265	
+0x2358	0x21266	
+0x2359	0x2127C	
+0x235A	0x21267	
+0x235B	0x2F85A	
+0x235C	0x21559	
+0x235D	0x215E9	
+0x235E	0x215EA	
+0x235F	0x215EB	
+0x2360	0x215EC	
+0x2361	0x215ED	
+0x2362	0x215EE	
+0x2363	0x215EF	
+0x2364	0x216BF	
+0x2365	0x216CB	
+0x2366	0x216C3	
+0x2367	0x216D5	
+0x2368	0x216C4	
+0x2369	0x216C5	
+0x236A	0x216D3	
+0x236B	0x216C6	
+0x236C	0x216C7	
+0x236D	0x216C8	
+0x236E	0x216C9	
+0x236F	0x216CA	
+0x2370	0x2194A	
+0x2372	0x219D1	
+0x2373	0x21B61	
+0x2374	0x21C37	
+0x2376	0x21D64	
+0x2377	0x21D66	
+0x2379	0x21D67	
+0x237A	0x21D68	
+0x237B	0x21D69	
+0x237D	0x21D73	
+0x237E	0x21D6A	
+0x2421	0x21D6B	
+0x2424	0x22072	
+0x2426	0x221B9	
+0x2427	0x2231C	
+0x2428	0x22336	
+0x2429	0x223BC	
+0x242A	0x223BE	
+0x242B	0x223BF	
+0x242C	0x223C0	
+0x242D	0x22487	
+0x242E	0x225DC	
+0x242F	0x225DD	
+0x2430	0x225F5	
+0x2431	0x225DE	
+0x2432	0x225DF	
+0x2433	0x2F89E	
+0x2434	0x225E0	
+0x2435	0x225E1	
+0x2436	0x225E2	
+0x2437	0x22A2C	
+0x2438	0x22A2D	
+0x243A	0x22AA9	
+0x243B	0x22A9C	
+0x243C	0x22A9D	
+0x243D	0x22A9E	
+0x243E	0x22A9F	
+0x243F	0x22AA0	
+0x2440	0x22AA1	
+0x2441	0x22AA2	
+0x2443	0x22AA3	
+0x2444	0x22AA4	
+0x2445	0x22AA7	
+0x2446	0x23042	
+0x2447	0x23093	
+0x2448	0x23151	
+0x244A	0x23152	
+0x244B	0x23144	
+0x244C	0x23153	
+0x244D	0x23322	
+0x244E	0x233C6	
+0x244F	0x233C7	
+0x2450	0x233C9	
+0x2451	0x2F8DD	
+0x2452	0x233CA	
+0x2454	0x233C8	
+0x2455	0x23B24	
+0x2456	0x23B25	
+0x2457	0x23B26	
+0x2459	0x23B27	
+0x245A	0x23B28	
+0x245C	0x23C58	
+0x245D	0x2F8FB	
+0x245E	0x23CA7	
+0x245F	0x23C88	
+0x2460	0x23C89	
+0x2461	0x23CA5	
+0x2462	0x23CA8	
+0x2463	0x23CA9	
+0x2464	0x23CAA	
+0x2465	0x23CAB	
+0x2466	0x23CAC	
+0x2467	0x23CAD	
+0x2469	0x23C79	
+0x246B	0x24194	
+0x246C	0x24195	
+0x246D	0x24196	
+0x2470	0x24197	
+0x2472	0x24198	
+0x2473	0x2454E	
+0x2474	0x2454F	
+0x2475	0x24619	
+0x2477	0x24741	
+0x2478	0x2F92A	
+0x2479	0x248F7	
+0x247A	0x24C04	
+0x247B	0x24C19	
+0x247C	0x24C17	
+0x247D	0x25040	
+0x247E	0x250EC	
+0x2521	0x2541B	
+0x2522	0x2541C	
+0x2524	0x2560E	
+0x2525	0x25752	
+0x2526	0x25AD8	
+0x2527	0x25E26	
+0x2528	0x26274	
+0x252A	0x26275	
+0x252B	0x269C6	
+0x252C	0x26B0B	
+0x252D	0x26B0C	
+0x252E	0x26B0D	
+0x252F	0x26B0E	
+0x2530	0x26B0F	
+0x2531	0x26B10	
+0x2533	0x28459	
+0x2534	0x2845A	
+0x2535	0x28683	
+0x2536	0x28684	
+0x2537	0x28685	
+0x253A	0x28E20	
+0x253B	0x28E21	
+0x253C	0x28E22	
+0x253D	0x28E23	
+0x253E	0x28E24	
+0x253F	0x28E29	
+0x2540	0x200F4	
+0x2542	0x2158F	
+0x2543	0x20151	
+0x2545	0x20217	
+0x2546	0x20218	
+0x2547	0x2025B	
+0x2548	0x20219	
+0x2549	0x2021A	
+0x254B	0x2021B	
+0x254C	0x2021C	
+0x254D	0x2021D	
+0x254E	0x2021E	
+0x254F	0x2021F	
+0x2550	0x20220	
+0x2551	0x20221	
+0x2552	0x2048B	
+0x2553	0x20488	
+0x2555	0x20585	
+0x2556	0x26287	
+0x2557	0x205C7	
+0x2558	0x2064C	
+0x2559	0x2064D	
+0x255A	0x206FC	
+0x255B	0x206FD	
+0x255C	0x206FE	
+0x255D	0x206FF	
+0x2560	0x20856	
+0x2561	0x20857	
+0x2562	0x20858	
+0x2563	0x20859	
+0x2564	0x208DC	
+0x2565	0x208DD	
+0x2566	0x20973	
+0x2567	0x2099D	
+0x2568	0x209A1	
+0x2569	0x2099E	
+0x256A	0x2099F	
+0x256B	0x209A0	
+0x256C	0x209E6	
+0x256D	0x20A51	
+0x256E	0x20A52	
+0x256F	0x20B3D	
+0x2570	0x20C22	
+0x2572	0x20C23	
+0x2573	0x20C24	
+0x2574	0x20C25	
+0x2575	0x20C26	
+0x2576	0x20C27	
+0x2577	0x20C28	
+0x2578	0x20C29	
+0x2579	0x20C2A	
+0x257A	0x20C2B	
+0x257C	0x20C40	
+0x257D	0x20C2C	
+0x257E	0x20C2D	
+0x2621	0x20C2E	
+0x2622	0x20C2F	
+0x2623	0x20C30	
+0x2624	0x211D0	
+0x2625	0x212A8	
+0x2626	0x21294	
+0x2627	0x21295	
+0x2628	0x21296	
+0x2629	0x21297	
+0x262A	0x21298	
+0x262B	0x2129C	
+0x262C	0x2129B	
+0x262E	0x212A1	
+0x262F	0x212A0	
+0x2630	0x21299	
+0x2631	0x2129A	
+0x2632	0x212A7	
+0x2634	0x21564	
+0x2636	0x21600	
+0x2637	0x21601	
+0x263A	0x216E5	
+0x263B	0x216E9	
+0x263C	0x216FB	
+0x263D	0x216FC	
+0x263E	0x216EA	
+0x263F	0x216EB	
+0x2640	0x216EC	
+0x2641	0x216ED	
+0x2642	0x216EE	
+0x2643	0x216EF	
+0x2644	0x216FA	
+0x2645	0x216F0	
+0x2646	0x216F1	
+0x2647	0x216F2	
+0x2648	0x216F3	
+0x2649	0x216F4	
+0x264A	0x21952	
+0x264B	0x21953	
+0x264C	0x21954	
+0x264D	0x21955	
+0x264E	0x21958	
+0x264F	0x21956	
+0x2651	0x219DD	
+0x2652	0x219DE	
+0x2653	0x219E3	
+0x2654	0x219DF	
+0x2655	0x219E0	
+0x2656	0x21B22	
+0x2657	0x21B23	
+0x2658	0x21B68	
+0x2659	0x21BDF	
+0x265B	0x21C44	
+0x265C	0x21D94	
+0x265D	0x21D95	
+0x265E	0x21D96	
+0x265F	0x21D97	
+0x2660	0x21D98	
+0x2661	0x21D99	
+0x2662	0x2F879	
+0x2663	0x21D9A	
+0x2664	0x21D9B	
+0x2665	0x21D9D	
+0x2666	0x21D9E	
+0x2667	0x21D9F	
+0x2668	0x21DA0	
+0x2669	0x21FF3	
+0x266A	0x21FF2	
+0x266B	0x2201F	
+0x266C	0x22088	
+0x266D	0x2218F	
+0x266E	0x22190	
+0x2670	0x221FD	
+0x2671	0x221FE	
+0x2672	0x221FF	
+0x2673	0x22200	
+0x2674	0x22201	
+0x2675	0x2261A	
+0x2677	0x225E3	
+0x2678	0x225E4	
+0x2679	0x225E5	
+0x267A	0x225E6	
+0x267B	0x225E7	
+0x267C	0x225EB	
+0x267D	0x225E8	
+0x267E	0x225E9	
+0x2721	0x225EA	
+0x2722	0x2261D	
+0x2723	0x229A4	
+0x2724	0x229A3	
+0x2725	0x22AD4	
+0x2726	0x22AC6	
+0x2727	0x22AC7	
+0x2728	0x22AC8	
+0x2729	0x22AC9	
+0x272A	0x22ACA	
+0x272B	0x22ACB	
+0x272C	0x22ACC	
+0x272D	0x22ACD	
+0x272F	0x22ACE	
+0x2731	0x22EB8	
+0x2732	0x22EB9	
+0x2733	0x22EBA	
+0x2734	0x2306E	
+0x2735	0x230DB	
+0x2736	0x230DC	
+0x2737	0x23168	
+0x2738	0x23169	
+0x2739	0x2316A	
+0x273A	0x2316B	
+0x273B	0x2316C	
+0x273C	0x2316D	
+0x273D	0x2316E	
+0x273F	0x23324	
+0x2740	0x23325	
+0x2742	0x23400	
+0x2743	0x233E5	
+0x2744	0x233F9	
+0x2745	0x233E7	
+0x2746	0x233E8	
+0x2747	0x233E9	
+0x2748	0x233FE	
+0x2749	0x233EA	
+0x274A	0x233EB	
+0x274B	0x233EC	
+0x274D	0x233ED	
+0x274F	0x233EE	
+0x2751	0x233EF	
+0x2753	0x23417	
+0x2754	0x233F0	
+0x2755	0x233F1	
+0x2756	0x23894	
+0x2757	0x2395B	
+0x2758	0x2395C	
+0x2759	0x2395D	
+0x275A	0x23B2F	
+0x275C	0x23B30	
+0x275D	0x23B31	
+0x275E	0x23B32	
+0x275F	0x23B33	
+0x2760	0x23CCC	
+0x2761	0x23CCD	
+0x2762	0x23CCE	
+0x2763	0x23CAE	
+0x2764	0x23CAF	
+0x2765	0x23CB0	
+0x2767	0x23CCF	
+0x2768	0x23CD0	
+0x2769	0x23CD1	
+0x276A	0x23CD2	
+0x276B	0x23CD3	
+0x276D	0x23CD4	
+0x276F	0x241A6	
+0x2770	0x241A7	
+0x2771	0x241A8	
+0x2772	0x241B0	
+0x2773	0x241A9	
+0x2774	0x241AA	
+0x2775	0x241AB	
+0x2776	0x241AC	
+0x2777	0x241AD	
+0x2778	0x244FB	
+0x2779	0x244FC	
+0x277B	0x2462D	
+0x277C	0x2462E	
+0x277D	0x24650	
+0x277E	0x2462F	
+0x2821	0x24630	
+0x2822	0x24765	
+0x2823	0x248E6	
+0x2824	0x2490C	
+0x2825	0x24902	
+0x2826	0x24903	
+0x2827	0x24904	
+0x2828	0x24905	
+0x2829	0x24906	
+0x282B	0x24BC0	
+0x282C	0x24C24	
+0x282D	0x24C25	
+0x282E	0x24D16	
+0x282F	0x24D32	
+0x2830	0x25420	
+0x2831	0x25421	
+0x2832	0x25422	
+0x2833	0x25423	
+0x2835	0x25425	
+0x2836	0x25619	
+0x2837	0x25624	
+0x2838	0x2561A	
+0x2839	0x2561B	
+0x283A	0x2561C	
+0x283B	0x2561D	
+0x283C	0x2F952	
+0x283D	0x2561E	
+0x283E	0x2575A	
+0x283F	0x2575B	
+0x2840	0x2575C	
+0x2841	0x2575D	
+0x2842	0x2575E	
+0x2843	0x25931	
+0x2845	0x25E29	
+0x2847	0x25F88	
+0x2848	0x25F89	
+0x2849	0x26289	
+0x284B	0x26356	
+0x284C	0x264D1	
+0x284D	0x264E6	
+0x284E	0x26532	
+0x284F	0x26533	
+0x2850	0x26652	
+0x2851	0x26653	
+0x2853	0x26654	
+0x2854	0x26655	
+0x2857	0x26B29	
+0x2858	0x26B2A	
+0x2859	0x26B2B	
+0x285A	0x26B2C	
+0x285B	0x26B2D	
+0x285C	0x2F992	
+0x285D	0x26B2E	
+0x285E	0x26B2F	
+0x285F	0x26B30	
+0x2860	0x26B31	
+0x2861	0x26B32	
+0x2862	0x26B33	
+0x2864	0x26B34	
+0x2865	0x2719B	
+0x2866	0x27223	
+0x2867	0x27224	
+0x2869	0x27225	
+0x286A	0x27227	
+0x286B	0x27616	
+0x286C	0x27CA0	
+0x286D	0x2846F	
+0x286F	0x28470	
+0x2870	0x28471	
+0x2873	0x28472	
+0x2874	0x28473	
+0x2875	0x28474	
+0x2876	0x2869C	
+0x2877	0x286AA	
+0x2878	0x2869D	
+0x2879	0x2869E	
+0x287B	0x286AB	
+0x287C	0x2869F	
+0x287D	0x28E35	
+0x287E	0x28E38	
+0x2921	0x2A38D	
+0x2922	0x20035	
+0x2923	0x20036	
+0x2924	0x25AEE	
+0x2925	0x200B4	
+0x2926	0x2A6C9	
+0x2927	0x20132	
+0x2928	0x20155	
+0x2929	0x20244	
+0x292A	0x20245	
+0x292B	0x20246	
+0x292C	0x20247	
+0x292E	0x20248	
+0x292F	0x20249	
+0x2931	0x2024A	
+0x2932	0x2024B	
+0x2933	0x2024C	
+0x2934	0x2024D	
+0x2935	0x2024E	
+0x2936	0x2024F	
+0x2937	0x20250	
+0x2938	0x20251	
+0x2939	0x26299	
+0x293A	0x205D1	
+0x293C	0x205D2	
+0x293D	0x205D3	
+0x293E	0x205D4	
+0x293F	0x205D5	
+0x2940	0x20721	
+0x2941	0x20722	
+0x2942	0x20723	
+0x2943	0x20868	
+0x2944	0x20869	
+0x2945	0x2086A	
+0x2946	0x208E2	
+0x2947	0x20945	
+0x2948	0x209EC	
+0x2949	0x209ED	
+0x294A	0x209EE	
+0x294B	0x209EF	
+0x294D	0x20A62	
+0x294E	0x20A63	
+0x294F	0x20AF4	
+0x2950	0x2006F	
+0x2951	0x20B44	
+0x2952	0x20B45	
+0x2953	0x20C79	
+0x2955	0x20C7A	
+0x2956	0x20C7B	
+0x2957	0x20C7C	
+0x2958	0x20C7D	
+0x2959	0x20C7E	
+0x295A	0x20C7F	
+0x295B	0x20C80	
+0x295E	0x20C81	
+0x295F	0x20C82	
+0x2960	0x20C83	
+0x2961	0x20C84	
+0x2962	0x20C85	
+0x2963	0x20C86	
+0x2964	0x20C87	
+0x2965	0x20C8F	
+0x2966	0x20C88	
+0x2967	0x20C89	
+0x2968	0x212C5	
+0x2969	0x212C6	
+0x296B	0x212C7	
+0x296C	0x212C8	
+0x296D	0x212C9	
+0x296E	0x212CA	
+0x296F	0x212CB	
+0x2970	0x212CC	
+0x2972	0x212CD	
+0x2973	0x212CE	
+0x2974	0x212E3	
+0x2975	0x212CF	
+0x2976	0x212D0	
+0x2977	0x212D1	
+0x2978	0x212D2	
+0x2979	0x212D3	
+0x297A	0x212C4	
+0x297B	0x212D4	
+0x297C	0x212D5	
+0x297D	0x212D6	
+0x297E	0x21520	
+0x2A21	0x21521	
+0x2A22	0x2161A	
+0x2A23	0x21612	
+0x2A24	0x21614	
+0x2A25	0x21615	
+0x2A26	0x21616	
+0x2A27	0x21619	
+0x2A28	0x21617	
+0x2A29	0x21618	
+0x2A2B	0x2F861	
+0x2A2D	0x21712	
+0x2A2E	0x21713	
+0x2A2F	0x21714	
+0x2A30	0x21715	
+0x2A31	0x21716	
+0x2A32	0x21717	
+0x2A33	0x21718	
+0x2A34	0x21719	
+0x2A35	0x21961	
+0x2A36	0x21962	
+0x2A37	0x21963	
+0x2A38	0x219F5	
+0x2A3A	0x219F6	
+0x2A3B	0x219F7	
+0x2A3C	0x219F8	
+0x2A3D	0x21B29	
+0x2A3F	0x21C5D	
+0x2A40	0x21C57	
+0x2A41	0x21C58	
+0x2A42	0x21C59	
+0x2A43	0x21C5A	
+0x2A44	0x21C5B	
+0x2A45	0x21DBB	
+0x2A46	0x21DD1	
+0x2A47	0x21DBC	
+0x2A48	0x21DBD	
+0x2A49	0x268DF	
+0x2A4A	0x21DD0	
+0x2A4B	0x21DBE	
+0x2A4C	0x21DBF	
+0x2A4D	0x21DC0	
+0x2A4E	0x21DC1	
+0x2A4F	0x21DC2	
+0x2A50	0x21DC3	
+0x2A51	0x21DC4	
+0x2A52	0x26B6C	
+0x2A53	0x220A1	
+0x2A54	0x220A2	
+0x2A55	0x220A3	
+0x2A56	0x22193	
+0x2A57	0x2220D	
+0x2A58	0x2220F	
+0x2A59	0x2220E	
+0x2A5A	0x22210	
+0x2A5B	0x22211	
+0x2A5C	0x22212	
+0x2A5D	0x2F895	
+0x2A5E	0x224E5	
+0x2A5F	0x2262F	
+0x2A61	0x22657	
+0x2A62	0x22630	
+0x2A63	0x22668	
+0x2A64	0x2262B	
+0x2A65	0x22631	
+0x2A66	0x22658	
+0x2A67	0x2F8A2	
+0x2A68	0x22632	
+0x2A69	0x22659	
+0x2A6B	0x2265A	
+0x2A6C	0x22633	
+0x2A6D	0x2265B	
+0x2A6E	0x2265C	
+0x2A6F	0x2265D	
+0x2A70	0x2261E	
+0x2A71	0x229AE	
+0x2A72	0x229AF	
+0x2A73	0x22A3B	
+0x2A74	0x22A3C	
+0x2A75	0x22A3D	
+0x2A76	0x22B07	
+0x2A77	0x22B08	
+0x2A78	0x22B09	
+0x2A79	0x22B0A	
+0x2A7A	0x22B0B	
+0x2A7B	0x22B0C	
+0x2A7C	0x22B0D	
+0x2A7D	0x22B0E	
+0x2A7E	0x22B0F	
+0x2B21	0x22B10	
+0x2B22	0x22B22	
+0x2B23	0x22B11	
+0x2B24	0x22B12	
+0x2B25	0x22B13	
+0x2B26	0x22B14	
+0x2B27	0x22B15	
+0x2B28	0x22B16	
+0x2B29	0x22B17	
+0x2B2A	0x22B18	
+0x2B2B	0x2F8B8	
+0x2B2D	0x23046	
+0x2B2E	0x23047	
+0x2B2F	0x23048	
+0x2B30	0x230E1	
+0x2B31	0x23181	
+0x2B32	0x23183	
+0x2B33	0x20C75	
+0x2B35	0x23185	
+0x2B36	0x23186	
+0x2B37	0x2332A	
+0x2B38	0x2F8D1	
+0x2B39	0x2332B	
+0x2B3A	0x2336B	
+0x2B3B	0x23418	
+0x2B3C	0x23419	
+0x2B3D	0x2341A	
+0x2B3F	0x2341B	
+0x2B40	0x2341C	
+0x2B41	0x2341D	
+0x2B42	0x2341E	
+0x2B43	0x2341F	
+0x2B44	0x23420	
+0x2B45	0x23421	
+0x2B46	0x23422	
+0x2B47	0x23423	
+0x2B49	0x23424	
+0x2B4A	0x23425	
+0x2B4B	0x23426	
+0x2B4C	0x23427	
+0x2B4D	0x23428	
+0x2B4E	0x23429	
+0x2B4F	0x2342A	
+0x2B50	0x239EF	
+0x2B51	0x23B49	
+0x2B52	0x23B4A	
+0x2B53	0x23B4B	
+0x2B54	0x23B4C	
+0x2B55	0x23B4D	
+0x2B56	0x23B4E	
+0x2B57	0x23B4F	
+0x2B58	0x23B50	
+0x2B59	0x23B51	
+0x2B5A	0x23B52	
+0x2B5B	0x23B53	
+0x2B5C	0x23B54	
+0x2B5D	0x23B5A	
+0x2B5E	0x23B55	
+0x2B5F	0x23C5F	
+0x2B60	0x23D02	
+0x2B61	0x23D03	
+0x2B62	0x23D04	
+0x2B63	0x23D05	
+0x2B64	0x23CD5	
+0x2B65	0x23D06	
+0x2B66	0x23D07	
+0x2B67	0x23CD6	
+0x2B68	0x23D08	
+0x2B69	0x23D09	
+0x2B6A	0x23D0A	
+0x2B6B	0x23D0B	
+0x2B6C	0x23CD7	
+0x2B6D	0x23D0C	
+0x2B6E	0x23D0D	
+0x2B6F	0x241C8	
+0x2B70	0x241C9	
+0x2B71	0x241CA	
+0x2B72	0x241CB	
+0x2B73	0x241CC	
+0x2B74	0x241CD	
+0x2B75	0x241CE	
+0x2B76	0x241CF	
+0x2B77	0x241D0	
+0x2B78	0x241D1	
+0x2B79	0x241D2	
+0x2B7B	0x241D3	
+0x2B7C	0x241D4	
+0x2B7D	0x241D5	
+0x2B7E	0x241D6	
+0x2C21	0x241D7	
+0x2C22	0x241E2	
+0x2C23	0x241D8	
+0x2C24	0x24504	
+0x2C25	0x24505	
+0x2C26	0x24506	
+0x2C28	0x24643	
+0x2C29	0x24644	
+0x2C2A	0x24784	
+0x2C2B	0x2478F	
+0x2C2C	0x24785	
+0x2C2D	0x24786	
+0x2C2E	0x2492F	
+0x2C2F	0x2491A	
+0x2C30	0x2491B	
+0x2C31	0x2491C	
+0x2C33	0x2491D	
+0x2C34	0x2491E	
+0x2C35	0x2491F	
+0x2C36	0x24920	
+0x2C37	0x24921	
+0x2C38	0x24922	
+0x2C39	0x2F92C	
+0x2C3A	0x24923	
+0x2C3B	0x24924	
+0x2C3C	0x2490E	
+0x2C3D	0x24925	
+0x2C3E	0x2492B	
+0x2C3F	0x2492C	
+0x2C40	0x2490B	
+0x2C41	0x24AEE	
+0x2C43	0x24BC3	
+0x2C44	0x24BD8	
+0x2C45	0x24BD9	
+0x2C46	0x24C38	
+0x2C47	0x24C39	
+0x2C48	0x24C3A	
+0x2C49	0x24C3B	
+0x2C4B	0x24C3C	
+0x2C4C	0x24C3D	
+0x2C4D	0x24C3E	
+0x2C4E	0x24C3F	
+0x2C4F	0x24C40	
+0x2C50	0x24D48	
+0x2C51	0x24D4C	
+0x2C52	0x24F28	
+0x2C53	0x24F51	
+0x2C54	0x24F52	
+0x2C55	0x2504C	
+0x2C56	0x25123	
+0x2C57	0x2F945	
+0x2C58	0x25124	
+0x2C59	0x25431	
+0x2C5A	0x25432	
+0x2C5B	0x25433	
+0x2C5D	0x25434	
+0x2C5E	0x25435	
+0x2C5F	0x25436	
+0x2C60	0x25440	
+0x2C61	0x25437	
+0x2C63	0x25438	
+0x2C64	0x2543D	
+0x2C65	0x25638	
+0x2C66	0x25639	
+0x2C67	0x2563A	
+0x2C68	0x2563B	
+0x2C69	0x2563C	
+0x2C6A	0x2564C	
+0x2C6B	0x25773	
+0x2C6C	0x25774	
+0x2C6E	0x25775	
+0x2C6F	0x25776	
+0x2C70	0x25779	
+0x2C71	0x25941	
+0x2C72	0x25942	
+0x2C73	0x25943	
+0x2C74	0x25A5B	
+0x2C77	0x238A6	
+0x2C78	0x25A5C	
+0x2C79	0x25AE5	
+0x2C7A	0x25AE6	
+0x2C7B	0x25AE7	
+0x2C7C	0x25AE8	
+0x2C7D	0x25AED	
+0x2C7E	0x25E30	
+0x2D22	0x25E31	
+0x2D23	0x25F94	
+0x2D24	0x26351	
+0x2D25	0x263FD	
+0x2D26	0x263FE	
+0x2D27	0x264E9	
+0x2D29	0x266B3	
+0x2D2A	0x26684	
+0x2D2B	0x26694	
+0x2D2D	0x2669C	
+0x2D2F	0x26685	
+0x2D30	0x26900	
+0x2D31	0x26937	
+0x2D32	0x26957	
+0x2D33	0x26B54	
+0x2D34	0x26B68	
+0x2D35	0x26B55	
+0x2D36	0x26B5C	
+0x2D37	0x26B56	
+0x2D38	0x26B57	
+0x2D39	0x26B58	
+0x2D3A	0x26B59	
+0x2D3B	0x26B5A	
+0x2D3C	0x26B5B	
+0x2D3D	0x27234	
+0x2D3F	0x27235	
+0x2D41	0x27239	
+0x2D42	0x27236	
+0x2D43	0x27237	
+0x2D44	0x27238	
+0x2D45	0x275E5	
+0x2D46	0x27659	
+0x2D48	0x2763A	
+0x2D49	0x2763B	
+0x2D4A	0x27D28	
+0x2D4B	0x27E89	
+0x2D4D	0x27E8A	
+0x2D4E	0x27E8B	
+0x2D4F	0x27E8C	
+0x2D50	0x27E8D	
+0x2D51	0x27FBC	
+0x2D52	0x282A3	
+0x2D54	0x282A4	
+0x2D55	0x28493	
+0x2D56	0x28494	
+0x2D57	0x28495	
+0x2D58	0x28496	
+0x2D59	0x28497	
+0x2D5A	0x286B9	
+0x2D5B	0x28E4F	
+0x2D5C	0x28E50	
+0x2D5D	0x28E51	
+0x2D5E	0x29076	
+0x2D60	0x200FB	
+0x2D61	0x20083	
+0x2D62	0x20138	
+0x2D63	0x2015D	
+0x2D64	0x20271	
+0x2D66	0x20277	
+0x2D67	0x20278	
+0x2D68	0x2F807	
+0x2D69	0x202C3	
+0x2D6A	0x20279	
+0x2D6B	0x2027A	
+0x2D6C	0x2027B	
+0x2D6D	0x2027C	
+0x2D6E	0x20272	
+0x2D6F	0x2027D	
+0x2D70	0x202A0	
+0x2D71	0x2027E	
+0x2D72	0x2027F	
+0x2D73	0x20280	
+0x2D74	0x20281	
+0x2D75	0x20282	
+0x2D76	0x20283	
+0x2D77	0x2029E	
+0x2D78	0x20284	
+0x2D79	0x20285	
+0x2D7A	0x20286	
+0x2D7B	0x20287	
+0x2D7C	0x20288	
+0x2D7D	0x20493	
+0x2D7E	0x20494	
+0x2E21	0x20495	
+0x2E22	0x204EF	
+0x2E23	0x204F0	
+0x2E25	0x2058D	
+0x2E26	0x2058F	
+0x2E27	0x20590	
+0x2E28	0x20591	
+0x2E29	0x20592	
+0x2E2A	0x205DE	
+0x2E2B	0x205E1	
+0x2E2C	0x20653	
+0x2E2E	0x2074A	
+0x2E2F	0x2074B	
+0x2E30	0x2074C	
+0x2E31	0x20751	
+0x2E32	0x2074D	
+0x2E33	0x20748	
+0x2E34	0x20874	
+0x2E35	0x20875	
+0x2E36	0x20920	
+0x2E37	0x20921	
+0x2E38	0x209A5	
+0x2E39	0x209A6	
+0x2E3A	0x20A73	
+0x2E3B	0x20A74	
+0x2E3C	0x20B50	
+0x2E3D	0x20B51	
+0x2E3E	0x20B52	
+0x2E3F	0x20B53	
+0x2E40	0x20CDB	
+0x2E41	0x20CDC	
+0x2E43	0x20CDD	
+0x2E44	0x20CDE	
+0x2E45	0x20CFF	
+0x2E48	0x20CDF	
+0x2E49	0x20CE0	
+0x2E4B	0x20CE1	
+0x2E4C	0x20CE2	
+0x2E4D	0x20CE3	
+0x2E4E	0x20CE4	
+0x2E4F	0x20CE5	
+0x2E50	0x20CE6	
+0x2E51	0x20CE7	
+0x2E52	0x20CE8	
+0x2E53	0x20CE9	
+0x2E54	0x20CEA	
+0x2E55	0x21307	
+0x2E56	0x21308	
+0x2E57	0x21309	
+0x2E58	0x2130A	
+0x2E59	0x2130B	
+0x2E5A	0x2130C	
+0x2E5B	0x2130D	
+0x2E5D	0x2131A	
+0x2E5E	0x2130E	
+0x2E5F	0x2130F	
+0x2E60	0x21310	
+0x2E61	0x2131C	
+0x2E62	0x21527	
+0x2E63	0x21566	
+0x2E64	0x21598	
+0x2E65	0x21599	
+0x2E66	0x21633	
+0x2E67	0x21624	
+0x2E68	0x21625	
+0x2E69	0x21626	
+0x2E6C	0x2173E	
+0x2E6D	0x2F864	
+0x2E6E	0x2173F	
+0x2E6F	0x21757	
+0x2E70	0x21740	
+0x2E71	0x21741	
+0x2E72	0x21758	
+0x2E73	0x21742	
+0x2E74	0x21743	
+0x2E75	0x21744	
+0x2E76	0x21745	
+0x2E77	0x21746	
+0x2E79	0x21747	
+0x2E7A	0x2196B	
+0x2E7B	0x2196C	
+0x2E7C	0x21A10	
+0x2E7D	0x21A11	
+0x2F21	0x21B75	
+0x2F22	0x21BEF	
+0x2F23	0x21C6A	
+0x2F24	0x21C6B	
+0x2F26	0x21C6C	
+0x2F27	0x21C6D	
+0x2F28	0x21C6E	
+0x2F29	0x21DEF	
+0x2F2A	0x21DF0	
+0x2F2B	0x21DF1	
+0x2F2C	0x21DF2	
+0x2F2D	0x21DF3	
+0x2F2E	0x21DF4	
+0x2F2F	0x21DF5	
+0x2F30	0x21DFF	
+0x2F31	0x21DF6	
+0x2F32	0x21E02	
+0x2F33	0x21DF7	
+0x2F34	0x22022	
+0x2F35	0x220C4	
+0x2F36	0x220C3	
+0x2F37	0x22228	
+0x2F39	0x22320	
+0x2F3A	0x22325	
+0x2F3B	0x22322	
+0x2F3C	0x22323	
+0x2F3D	0x223EB	
+0x2F3F	0x224F9	
+0x2F40	0x224FA	
+0x2F41	0x22699	
+0x2F42	0x2269A	
+0x2F43	0x2269B	
+0x2F44	0x22663	
+0x2F46	0x2265E	
+0x2F47	0x2265F	
+0x2F48	0x22660	
+0x2F49	0x2269C	
+0x2F4A	0x22661	
+0x2F4B	0x2269D	
+0x2F4C	0x22B54	
+0x2F4D	0x22B55	
+0x2F4E	0x22B56	
+0x2F4F	0x22B57	
+0x2F50	0x22B58	
+0x2F51	0x22B59	
+0x2F52	0x22B5A	
+0x2F53	0x22B19	
+0x2F54	0x22B6A	
+0x2F55	0x22B5B	
+0x2F56	0x22B5C	
+0x2F57	0x22B5D	
+0x2F58	0x22B66	
+0x2F5A	0x22B5E	
+0x2F5B	0x22B5F	
+0x2F5C	0x22B1A	
+0x2F5D	0x22B60	
+0x2F5E	0x22B61	
+0x2F60	0x22B62	
+0x2F61	0x22B1B	
+0x2F62	0x22B63	
+0x2F63	0x26410	
+0x2F64	0x26411	
+0x2F65	0x2304C	
+0x2F66	0x2309B	
+0x2F67	0x230EB	
+0x2F68	0x230EC	
+0x2F69	0x230ED	
+0x2F6A	0x230EE	
+0x2F6B	0x231A3	
+0x2F6C	0x231A8	
+0x2F6D	0x231A6	
+0x2F6F	0x2332F	
+0x2F70	0x23330	
+0x2F71	0x23331	
+0x2F72	0x23332	
+0x2F73	0x23333	
+0x2F74	0x2344F	
+0x2F75	0x23451	
+0x2F76	0x23452	
+0x2F77	0x2347D	
+0x2F78	0x23453	
+0x2F79	0x23454	
+0x2F7A	0x23455	
+0x2F7B	0x23456	
+0x2F7C	0x23457	
+0x2F7D	0x23458	
+0x2F7E	0x23459	
+0x3021	0x2345A	
+0x3022	0x2345B	
+0x3023	0x2345C	
+0x3025	0x2345D	
+0x3026	0x2345E	
+0x3027	0x2345F	
+0x3028	0x2346F	
+0x3029	0x23460	
+0x302A	0x23461	
+0x302B	0x23462	
+0x302C	0x23463	
+0x302D	0x23472	
+0x302E	0x23464	
+0x3030	0x2346E	
+0x3031	0x238B5	
+0x3032	0x23B65	
+0x3033	0x23B66	
+0x3034	0x23B67	
+0x3035	0x23B68	
+0x3036	0x23B69	
+0x3037	0x23B6A	
+0x3038	0x23B6B	
+0x3039	0x23B6C	
+0x303A	0x23D0E	
+0x303B	0x23D43	
+0x303D	0x23D0F	
+0x303E	0x23D44	
+0x303F	0x23D45	
+0x3040	0x23D46	
+0x3041	0x23D47	
+0x3042	0x23D48	
+0x3043	0x23D49	
+0x3044	0x23D10	
+0x3045	0x23D4A	
+0x3046	0x23D4B	
+0x3047	0x23D4C	
+0x3048	0x23D4D	
+0x304A	0x23D4E	
+0x304B	0x23D4F	
+0x304C	0x23D50	
+0x304D	0x23D51	
+0x304E	0x23D52	
+0x304F	0x23D53	
+0x3050	0x23D54	
+0x3051	0x23D55	
+0x3052	0x23D56	
+0x3053	0x23D57	
+0x3054	0x23D58	
+0x3055	0x23D59	
+0x3056	0x23D5A	
+0x3057	0x23D1D	
+0x3058	0x23D5B	
+0x3059	0x23D5C	
+0x305A	0x23D5D	
+0x305B	0x2F906	
+0x305D	0x241FE	
+0x305E	0x241FF	
+0x305F	0x24200	
+0x3060	0x24201	
+0x3061	0x24202	
+0x3062	0x24203	
+0x3063	0x24204	
+0x3064	0x24205	
+0x3065	0x24206	
+0x3066	0x24207	
+0x3067	0x24218	
+0x3068	0x24208	
+0x3069	0x24209	
+0x306A	0x241F3	
+0x306B	0x2420A	
+0x306C	0x2420B	
+0x306D	0x2421B	
+0x306E	0x2420C	
+0x306F	0x2420D	
+0x3070	0x2420E	
+0x3071	0x2420F	
+0x3072	0x24210	
+0x3073	0x2450F	
+0x3074	0x24561	
+0x3075	0x24579	
+0x3076	0x247C1	
+0x3077	0x247AC	
+0x3078	0x247AD	
+0x3079	0x24943	
+0x307A	0x24944	
+0x307B	0x24945	
+0x307C	0x24946	
+0x307D	0x24947	
+0x307E	0x24948	
+0x3121	0x24949	
+0x3122	0x24964	
+0x3123	0x2494A	
+0x3124	0x2494B	
+0x3125	0x2494C	
+0x3126	0x2494D	
+0x3128	0x2F92D	
+0x3129	0x24B39	
+0x312A	0x24C57	
+0x312B	0x24C58	
+0x312C	0x24C59	
+0x312D	0x24C5F	
+0x312E	0x24C5A	
+0x312F	0x24D6A	
+0x3130	0x24F2B	
+0x3131	0x24F5D	
+0x3132	0x24F5E	
+0x3133	0x24F5F	
+0x3135	0x24F60	
+0x3136	0x24F61	
+0x3137	0x25058	
+0x3138	0x25059	
+0x3139	0x2514A	
+0x313A	0x2514B	
+0x313B	0x2514C	
+0x313C	0x2514D	
+0x313D	0x2514E	
+0x313E	0x25457	
+0x313F	0x253B3	
+0x3140	0x253B4	
+0x3141	0x2546E	
+0x3142	0x2545B	
+0x3143	0x2545C	
+0x3145	0x2545D	
+0x3146	0x2545E	
+0x3148	0x2546C	
+0x3149	0x2563D	
+0x314A	0x25654	
+0x314B	0x2563E	
+0x314C	0x25655	
+0x314D	0x25656	
+0x314E	0x2563F	
+0x314F	0x25657	
+0x3150	0x25658	
+0x3151	0x25659	
+0x3152	0x2565A	
+0x3153	0x2565B	
+0x3154	0x2565C	
+0x3155	0x25788	
+0x3156	0x25789	
+0x3158	0x25958	
+0x3159	0x25959	
+0x315A	0x2595A	
+0x315C	0x25A67	
+0x315D	0x25A68	
+0x315E	0x25A69	
+0x315F	0x25A6A	
+0x3161	0x25A6B	
+0x3162	0x25A6C	
+0x3163	0x25AFE	
+0x3164	0x25AFF	
+0x3165	0x25B00	
+0x3166	0x25B01	
+0x3167	0x25B02	
+0x3168	0x25B03	
+0x3169	0x25B04	
+0x316A	0x25B05	
+0x316B	0x25E39	
+0x316C	0x25E3A	
+0x316D	0x25E3B	
+0x316E	0x25E3C	
+0x3171	0x25FB2	
+0x3172	0x25FB3	
+0x3173	0x25FB4	
+0x3174	0x25FB5	
+0x3175	0x25FB6	
+0x3176	0x25FB7	
+0x3177	0x25FB8	
+0x3179	0x262A2	
+0x317A	0x26361	
+0x317B	0x26362	
+0x317C	0x26414	
+0x317E	0x264EB	
+0x3221	0x26542	
+0x3222	0x26548	
+0x3224	0x26543	
+0x3225	0x2654E	
+0x3226	0x26544	
+0x3227	0x26545	
+0x3228	0x266B4	
+0x3229	0x266B5	
+0x322D	0x266B6	
+0x322F	0x268E1	
+0x3230	0x26905	
+0x3233	0x26B9A	
+0x3235	0x26B9B	
+0x3236	0x26B9C	
+0x3237	0x26B9D	
+0x3238	0x26B9E	
+0x3239	0x26B9F	
+0x323A	0x2F99A	
+0x323B	0x26BA0	
+0x323C	0x26BA1	
+0x323D	0x26BA2	
+0x323E	0x26BB5	
+0x323F	0x26BA3	
+0x3240	0x26BA4	
+0x3242	0x26BA5	
+0x3243	0x26BA6	
+0x3244	0x26BA7	
+0x3245	0x26BA8	
+0x3246	0x26BAF	
+0x3247	0x26BA9	
+0x3248	0x26BAA	
+0x3249	0x26BAB	
+0x324A	0x26BAC	
+0x324B	0x26BAD	
+0x324C	0x26BB3	
+0x324E	0x271A0	
+0x324F	0x27256	
+0x3250	0x27634	
+0x3252	0x2763C	
+0x3253	0x2780C	
+0x3255	0x27C3E	
+0x3256	0x27CA3	
+0x3257	0x27D30	
+0x3258	0x27D31	
+0x3259	0x27E97	
+0x325A	0x27E98	
+0x325B	0x27E99	
+0x325C	0x27E9A	
+0x325D	0x27E9B	
+0x325E	0x282B2	
+0x325F	0x282AB	
+0x3260	0x282AC	
+0x3261	0x286FC	
+0x3262	0x286E8	
+0x3263	0x286E9	
+0x3264	0x286EA	
+0x3265	0x287F1	
+0x3266	0x2893F	
+0x3267	0x28CCE	
+0x3268	0x28E6D	
+0x3269	0x28E6E	
+0x326A	0x28E6F	
+0x326B	0x28E70	
+0x326C	0x28E71	
+0x326D	0x28E72	
+0x326E	0x28E73	
+0x3270	0x29078	
+0x3271	0x2983A	
+0x3272	0x20167	
+0x3274	0x20164	
+0x3275	0x20165	
+0x3276	0x20307	
+0x3277	0x202C4	
+0x3278	0x202C5	
+0x3279	0x202C6	
+0x327A	0x202C7	
+0x327B	0x202C8	
+0x327C	0x202C9	
+0x327D	0x202E5	
+0x327E	0x202CA	
+0x3321	0x202CB	
+0x3323	0x202CC	
+0x3324	0x202CD	
+0x3325	0x202CE	
+0x3326	0x202CF	
+0x3327	0x202D0	
+0x3328	0x20497	
+0x3329	0x2049A	
+0x332A	0x2049B	
+0x332B	0x205EA	
+0x332C	0x205EC	
+0x332D	0x205ED	
+0x332E	0x205F7	
+0x332F	0x205EE	
+0x3330	0x205EF	
+0x3331	0x2065B	
+0x3332	0x2065C	
+0x3333	0x2065D	
+0x3334	0x2076D	
+0x3335	0x2076E	
+0x3337	0x2076F	
+0x3338	0x20881	
+0x3339	0x20882	
+0x333A	0x2094F	
+0x333B	0x209AD	
+0x333C	0x2870A	
+0x333D	0x20A7E	
+0x333E	0x20B69	
+0x333F	0x20D54	
+0x3340	0x20D55	
+0x3341	0x20D56	
+0x3342	0x20D57	
+0x3344	0x20D58	
+0x3345	0x20D59	
+0x3346	0x20D5A	
+0x3347	0x20D5B	
+0x3348	0x20D5C	
+0x3349	0x20D5D	
+0x334C	0x20D5E	
+0x334D	0x20D5F	
+0x334E	0x2133B	
+0x334F	0x21336	
+0x3350	0x2133C	
+0x3351	0x2133D	
+0x3352	0x2133E	
+0x3353	0x2133F	
+0x3354	0x21340	
+0x3355	0x21341	
+0x3356	0x21342	
+0x3358	0x21343	
+0x3359	0x21344	
+0x335A	0x21345	
+0x335B	0x21337	
+0x335E	0x21346	
+0x335F	0x21347	
+0x3360	0x21348	
+0x3361	0x21349	
+0x3362	0x2152D	
+0x3363	0x215A5	
+0x3364	0x2163D	
+0x3365	0x2163F	
+0x3366	0x2196E	
+0x3367	0x217E7	
+0x3368	0x21775	
+0x3369	0x21776	
+0x336A	0x21777	
+0x336B	0x21778	
+0x336C	0x21779	
+0x336D	0x2177A	
+0x336E	0x2177B	
+0x336F	0x2177C	
+0x3370	0x2178E	
+0x3371	0x2177D	
+0x3372	0x2177E	
+0x3374	0x2177F	
+0x3375	0x21780	
+0x3376	0x21781	
+0x3377	0x21782	
+0x3378	0x21783	
+0x3379	0x21784	
+0x337A	0x21785	
+0x337B	0x21786	
+0x337C	0x21787	
+0x337D	0x21788	
+0x337E	0x21789	
+0x3421	0x2178A	
+0x3422	0x2178B	
+0x3423	0x2178C	
+0x3424	0x2196F	
+0x3425	0x21970	
+0x3426	0x21971	
+0x3427	0x21972	
+0x3428	0x21A2A	
+0x3429	0x21A2B	
+0x342A	0x21A2C	
+0x342B	0x21A2D	
+0x342C	0x21A2E	
+0x342D	0x21A2F	
+0x342E	0x21A30	
+0x342F	0x21A31	
+0x3430	0x21B83	
+0x3431	0x21C84	
+0x3432	0x21C85	
+0x3433	0x21C93	
+0x3435	0x21C86	
+0x3436	0x21C87	
+0x3437	0x21C88	
+0x3438	0x21C89	
+0x3439	0x21C8A	
+0x343A	0x21C8B	
+0x343B	0x21E36	
+0x343C	0x21E38	
+0x343D	0x21E39	
+0x343E	0x21E3A	
+0x3440	0x21E3B	
+0x3441	0x21E3C	
+0x3442	0x21E3D	
+0x3443	0x21E3E	
+0x3444	0x21E3F	
+0x3446	0x21E40	
+0x3447	0x21E41	
+0x3448	0x21E42	
+0x3449	0x220DE	
+0x344A	0x220DF	
+0x344B	0x220E0	
+0x344C	0x220E1	
+0x344D	0x2224A	
+0x344E	0x2224B	
+0x344F	0x2224C	
+0x3450	0x2224D	
+0x3451	0x2224E	
+0x3452	0x2224F	
+0x3453	0x22250	
+0x3454	0x22327	
+0x3455	0x223F9	
+0x3456	0x223FA	
+0x3457	0x223FB	
+0x3458	0x22498	
+0x3459	0x22499	
+0x345A	0x2249A	
+0x345C	0x2251E	
+0x345D	0x2269E	
+0x345E	0x226F7	
+0x345F	0x2269F	
+0x3460	0x226A0	
+0x3461	0x226F0	
+0x3462	0x226F8	
+0x3463	0x226F9	
+0x3464	0x226A1	
+0x3465	0x226A2	
+0x3466	0x226A3	
+0x3467	0x226A4	
+0x3468	0x226A5	
+0x3469	0x226FA	
+0x346A	0x226FB	
+0x346B	0x226FC	
+0x346C	0x226FD	
+0x346D	0x226FE	
+0x346E	0x2271F	
+0x346F	0x226FF	
+0x3470	0x22700	
+0x3471	0x2278C	
+0x3472	0x22701	
+0x3473	0x229C2	
+0x3474	0x229C3	
+0x3476	0x229D3	
+0x3477	0x22A4E	
+0x3478	0x22BAF	
+0x3479	0x22BB0	
+0x347A	0x22BB1	
+0x347B	0x22BB2	
+0x347C	0x22BB3	
+0x347D	0x22BC6	
+0x347E	0x22BB4	
+0x3522	0x22BB5	
+0x3523	0x22BB6	
+0x3524	0x22BB7	
+0x3525	0x22BB8	
+0x3526	0x22BB9	
+0x3527	0x22BBA	
+0x3528	0x22BBB	
+0x3529	0x22BBC	
+0x352A	0x22BBD	
+0x352B	0x22BBE	
+0x352C	0x22BBF	
+0x352D	0x22BC1	
+0x352E	0x22BC0	
+0x352F	0x22BC2	
+0x3530	0x22BC3	
+0x3531	0x22F51	
+0x3532	0x22F52	
+0x3533	0x22F53	
+0x3534	0x22F54	
+0x3535	0x22F55	
+0x3536	0x2305A	
+0x3537	0x23050	
+0x3538	0x23051	
+0x3539	0x23078	
+0x353A	0x230F8	
+0x353B	0x230F9	
+0x353C	0x231C6	
+0x353D	0x231CB	
+0x353E	0x231CC	
+0x353F	0x231CD	
+0x3540	0x231CE	
+0x3541	0x231CF	
+0x3542	0x231D0	
+0x3543	0x231D1	
+0x3544	0x231D2	
+0x3545	0x231D3	
+0x3546	0x231D4	
+0x3547	0x231D5	
+0x3549	0x23337	
+0x354A	0x23338	
+0x354B	0x23373	
+0x354C	0x23490	
+0x354D	0x23491	
+0x354E	0x234BF	
+0x354F	0x23492	
+0x3550	0x23493	
+0x3551	0x23494	
+0x3552	0x23495	
+0x3553	0x23496	
+0x3554	0x23497	
+0x3555	0x23498	
+0x3556	0x23499	
+0x3558	0x2349A	
+0x3559	0x2349B	
+0x355A	0x2349C	
+0x355B	0x2349D	
+0x355C	0x2349E	
+0x355D	0x2349F	
+0x355E	0x234A0	
+0x355F	0x234A1	
+0x3560	0x234A2	
+0x3561	0x234A3	
+0x3562	0x234A4	
+0x3563	0x234A5	
+0x3565	0x234A6	
+0x3566	0x234A7	
+0x3567	0x238BF	
+0x3568	0x238C0	
+0x3569	0x238C1	
+0x356A	0x238C2	
+0x356B	0x238C3	
+0x356C	0x238C4	
+0x356D	0x238C5	
+0x356E	0x238C6	
+0x356F	0x23975	
+0x3570	0x23A43	
+0x3571	0x23A12	
+0x3572	0x23A9F	
+0x3573	0x23A91	
+0x3574	0x2F8F6	
+0x3575	0x23A92	
+0x3576	0x23A93	
+0x3577	0x23A94	
+0x3578	0x23B7E	
+0x3579	0x23B7F	
+0x357A	0x23B80	
+0x357B	0x23B81	
+0x357C	0x23B82	
+0x357D	0x23C4C	
+0x357E	0x23C63	
+0x3621	0x23DC0	
+0x3622	0x23DC1	
+0x3623	0x23DC2	
+0x3624	0x2423A	
+0x3625	0x23DC3	
+0x3626	0x23DC4	
+0x3627	0x23DC5	
+0x3628	0x23DC6	
+0x362A	0x23DC7	
+0x362C	0x23DC8	
+0x362D	0x23D73	
+0x362E	0x23DC9	
+0x362F	0x23DCA	
+0x3630	0x23DCB	
+0x3631	0x23DCC	
+0x3632	0x23DCD	
+0x3636	0x23DCE	
+0x3637	0x23DCF	
+0x3638	0x23DD0	
+0x3639	0x23DD1	
+0x363A	0x23DD2	
+0x363B	0x23DD3	
+0x363C	0x23DD4	
+0x363D	0x23DD5	
+0x363E	0x2423B	
+0x363F	0x2423C	
+0x3640	0x2423D	
+0x3641	0x2423E	
+0x3643	0x2423F	
+0x3644	0x24240	
+0x3645	0x24241	
+0x3646	0x24242	
+0x3647	0x24243	
+0x3649	0x24244	
+0x364A	0x24245	
+0x364B	0x24259	
+0x364C	0x24246	
+0x364D	0x24247	
+0x364E	0x24248	
+0x3650	0x24249	
+0x3651	0x24513	
+0x3652	0x24582	
+0x3653	0x24583	
+0x3654	0x24666	
+0x3655	0x24667	
+0x3656	0x24965	
+0x3658	0x24966	
+0x365A	0x24975	
+0x365B	0x24974	
+0x365C	0x24967	
+0x365D	0x2496D	
+0x365E	0x24976	
+0x365F	0x24968	
+0x3660	0x24969	
+0x3661	0x2496A	
+0x3662	0x2496B	
+0x3663	0x2494F	
+0x3664	0x2496C	
+0x3665	0x24AF8	
+0x3666	0x24B45	
+0x3668	0x24B46	
+0x3669	0x24BE4	
+0x366A	0x24C85	
+0x366B	0x24C6F	
+0x366C	0x24C70	
+0x366D	0x24D82	
+0x366E	0x24D83	
+0x366F	0x24D84	
+0x3670	0x24D8B	
+0x3671	0x24F2D	
+0x3672	0x24F68	
+0x3673	0x24F69	
+0x3674	0x24F77	
+0x3675	0x24F64	
+0x3676	0x24F6A	
+0x3678	0x24FF2	
+0x3679	0x24FE2	
+0x367A	0x25063	
+0x367B	0x25064	
+0x367C	0x25065	
+0x367D	0x25066	
+0x3721	0x25067	
+0x3722	0x25068	
+0x3725	0x25172	
+0x3726	0x2517D	
+0x3727	0x25369	
+0x3728	0x25484	
+0x3729	0x25486	
+0x372A	0x25487	
+0x372B	0x25488	
+0x372C	0x2549E	
+0x372E	0x25489	
+0x372F	0x2548A	
+0x3730	0x25496	
+0x3731	0x2548B	
+0x3732	0x2548C	
+0x3733	0x2548D	
+0x3734	0x25679	
+0x3735	0x25683	
+0x3736	0x2567A	
+0x3737	0x2565D	
+0x3738	0x2567B	
+0x373A	0x2579F	
+0x373C	0x257A0	
+0x373D	0x257A1	
+0x373E	0x257A2	
+0x3740	0x2596A	
+0x3741	0x2596B	
+0x3742	0x2596C	
+0x3743	0x2596D	
+0x3744	0x2596E	
+0x3745	0x25A78	
+0x3747	0x25A79	
+0x3748	0x25A7C	
+0x3749	0x25B21	
+0x374A	0x25B22	
+0x374B	0x25B23	
+0x374C	0x25B24	
+0x374E	0x25B25	
+0x374F	0x25B26	
+0x3750	0x25E51	
+0x3751	0x25E52	
+0x3752	0x25E56	
+0x3755	0x25FE1	
+0x3758	0x25FD6	
+0x3759	0x25FD7	
+0x375A	0x25FD8	
+0x375B	0x25FD9	
+0x375C	0x262B5	
+0x375D	0x2636C	
+0x375E	0x2636F	
+0x375F	0x26370	
+0x3760	0x264BC	
+0x3761	0x264BD	
+0x3762	0x264ED	
+0x3763	0x2655B	
+0x3764	0x2655C	
+0x3765	0x2655D	
+0x3766	0x2655E	
+0x3767	0x26686	
+0x3768	0x26687	
+0x3769	0x266ED	
+0x376B	0x266EE	
+0x376D	0x2690E	
+0x376E	0x2690F	
+0x3770	0x26A2D	
+0x3771	0x26A2A	
+0x3772	0x26A2E	
+0x3773	0x26ACC	
+0x3774	0x26BF9	
+0x3775	0x26BFA	
+0x3776	0x26BFB	
+0x3777	0x26BFC	
+0x3779	0x26BFD	
+0x377A	0x26C1B	
+0x377B	0x26BFE	
+0x377C	0x26BFF	
+0x377D	0x26C00	
+0x377E	0x26C01	
+0x3821	0x26C02	
+0x3822	0x26C03	
+0x3823	0x26C21	
+0x3824	0x26C04	
+0x3825	0x26C05	
+0x3826	0x26C06	
+0x3827	0x26C07	
+0x3828	0x26C08	
+0x3829	0x26C09	
+0x382A	0x26C0A	
+0x382B	0x26C0B	
+0x382C	0x26C0C	
+0x382D	0x26C0D	
+0x382E	0x26C0E	
+0x382F	0x26C0F	
+0x3830	0x26C10	
+0x3831	0x26C11	
+0x3832	0x26C12	
+0x3833	0x26C13	
+0x3834	0x26C14	
+0x3835	0x26C15	
+0x3836	0x2727B	
+0x3837	0x2727C	
+0x3838	0x2727D	
+0x3839	0x2727E	
+0x383B	0x2727F	
+0x383C	0x27280	
+0x383D	0x27266	
+0x383E	0x27281	
+0x383F	0x27282	
+0x3840	0x27283	
+0x3841	0x275B2	
+0x3843	0x2767F	
+0x3844	0x27672	
+0x3845	0x2765A	
+0x3846	0x277EB	
+0x3847	0x27815	
+0x3849	0x27816	
+0x384A	0x2F9CA	
+0x384B	0x27817	
+0x384D	0x278C5	
+0x384E	0x278C6	
+0x384F	0x278C7	
+0x3850	0x27988	
+0x3851	0x27989	
+0x3853	0x2798A	
+0x3854	0x2798B	
+0x3855	0x2798C	
+0x3856	0x2798D	
+0x3857	0x27BDF	
+0x3859	0x27D3B	
+0x385A	0x27D3C	
+0x385B	0x27D3D	
+0x385C	0x27D3E	
+0x385D	0x27D3F	
+0x385E	0x27D40	
+0x385F	0x27D41	
+0x3860	0x27D42	
+0x3861	0x27E5C	
+0x3862	0x27EAF	
+0x3863	0x27EA9	
+0x3864	0x27EAA	
+0x3865	0x27EAB	
+0x3866	0x27EAC	
+0x3867	0x27EB5	
+0x3868	0x27EAD	
+0x3869	0x27EAE	
+0x386A	0x27FE2	
+0x386B	0x28224	
+0x386D	0x282C4	
+0x386F	0x284EA	
+0x3870	0x284D3	
+0x3871	0x284D4	
+0x3872	0x284D5	
+0x3873	0x28686	
+0x3875	0x28687	
+0x3876	0x286FD	
+0x3877	0x28805	
+0x3878	0x28949	
+0x3879	0x28C5F	
+0x387A	0x28CD3	
+0x387B	0x28CD5	
+0x387C	0x28E8A	
+0x387D	0x28E8B	
+0x387E	0x28E8C	
+0x3921	0x28E8D	
+0x3922	0x28E8E	
+0x3923	0x28E8F	
+0x3924	0x28E90	
+0x3925	0x28E91	
+0x3926	0x28E92	
+0x3927	0x28E93	
+0x3928	0x2907D	
+0x3929	0x2907E	
+0x392D	0x291EC	
+0x392E	0x2925B	
+0x392F	0x29C87	
+0x3930	0x29C86	
+0x3932	0x20046	
+0x3933	0x20047	
+0x3934	0x20102	
+0x3935	0x2016D	
+0x3936	0x2016E	
+0x3937	0x2016F	
+0x3938	0x2030D	
+0x3939	0x2030E	
+0x393A	0x2030F	
+0x393B	0x20310	
+0x393C	0x20311	
+0x393D	0x20312	
+0x393E	0x20313	
+0x393F	0x20314	
+0x3940	0x2049F	
+0x3941	0x204A0	
+0x3942	0x204A1	
+0x3943	0x204A3	
+0x3944	0x20521	
+0x3945	0x20522	
+0x3946	0x2337C	
+0x3947	0x20595	
+0x3948	0x20596	
+0x3949	0x20661	
+0x394A	0x20667	
+0x394B	0x20791	
+0x394C	0x20792	
+0x394D	0x20793	
+0x394E	0x20794	
+0x394F	0x2088A	
+0x3950	0x2088B	
+0x3951	0x208F7	
+0x3952	0x20924	
+0x3953	0x209B0	
+0x3954	0x209B1	
+0x3955	0x20A8E	
+0x3956	0x20B04	
+0x3957	0x20B6A	
+0x3958	0x20B6B	
+0x3959	0x20B6C	
+0x395A	0x20B6D	
+0x395B	0x20DE8	
+0x395C	0x20E0C	
+0x395D	0x20DE9	
+0x395E	0x20DEA	
+0x395F	0x20E0D	
+0x3961	0x20DEB	
+0x3962	0x20DEC	
+0x3963	0x20DED	
+0x3964	0x20DEE	
+0x3965	0x20DEF	
+0x3966	0x20DF0	
+0x3967	0x20DF1	
+0x3968	0x20DF2	
+0x3969	0x20E16	
+0x396A	0x20DF3	
+0x396B	0x20E04	
+0x396C	0x20E1D	
+0x396D	0x20DF4	
+0x396E	0x20DF5	
+0x396F	0x20DF6	
+0x3970	0x20DF7	
+0x3972	0x21202	
+0x3973	0x21203	
+0x3974	0x21204	
+0x3975	0x2139A	
+0x3976	0x2137C	
+0x3977	0x213C5	
+0x3978	0x2137D	
+0x3979	0x2137E	
+0x397A	0x2137F	
+0x397B	0x21380	
+0x397C	0x21381	
+0x3A21	0x21382	
+0x3A22	0x21383	
+0x3A23	0x21384	
+0x3A24	0x21385	
+0x3A25	0x21386	
+0x3A26	0x21387	
+0x3A27	0x215AE	
+0x3A28	0x2164D	
+0x3A29	0x217B0	
+0x3A2A	0x217DC	
+0x3A2B	0x217B6	
+0x3A2C	0x217B7	
+0x3A2D	0x217B8	
+0x3A2E	0x217B9	
+0x3A2F	0x217BA	
+0x3A30	0x217BB	
+0x3A31	0x217DB	
+0x3A32	0x217BC	
+0x3A33	0x217BD	
+0x3A34	0x217BE	
+0x3A36	0x217BF	
+0x3A37	0x217C0	
+0x3A38	0x217C1	
+0x3A39	0x217C2	
+0x3A3A	0x217C3	
+0x3A3B	0x217CE	
+0x3A3D	0x217D9	
+0x3A3E	0x217C4	
+0x3A3F	0x217C5	
+0x3A40	0x217DA	
+0x3A41	0x217C6	
+0x3A42	0x217C7	
+0x3A43	0x217C8	
+0x3A44	0x217C9	
+0x3A45	0x217CA	
+0x3A46	0x2197E	
+0x3A47	0x2197B	
+0x3A48	0x21A4E	
+0x3A49	0x21A4F	
+0x3A4A	0x21A50	
+0x3A4B	0x21A51	
+0x3A4C	0x21A52	
+0x3A4D	0x21A53	
+0x3A4E	0x21A54	
+0x3A4F	0x21A55	
+0x3A50	0x21B8F	
+0x3A51	0x21BFC	
+0x3A52	0x21CA6	
+0x3A53	0x21CA7	
+0x3A54	0x21CA8	
+0x3A55	0x21D23	
+0x3A56	0x21E8B	
+0x3A58	0x21E8C	
+0x3A59	0x21E8D	
+0x3A5A	0x21E8E	
+0x3A5B	0x21E8F	
+0x3A5C	0x21EA4	
+0x3A5D	0x20599	
+0x3A5E	0x22024	
+0x3A5F	0x22046	
+0x3A60	0x22047	
+0x3A61	0x22048	
+0x3A62	0x220FD	
+0x3A63	0x220FE	
+0x3A65	0x2226E	
+0x3A66	0x2227C	
+0x3A67	0x2226F	
+0x3A68	0x22270	
+0x3A69	0x22271	
+0x3A6A	0x22272	
+0x3A6B	0x22329	
+0x3A6C	0x2232A	
+0x3A6D	0x2235F	
+0x3A6E	0x224A2	
+0x3A6F	0x22530	
+0x3A70	0x2252B	
+0x3A71	0x22761	
+0x3A72	0x22702	
+0x3A73	0x22703	
+0x3A74	0x22704	
+0x3A75	0x22705	
+0x3A76	0x22706	
+0x3A77	0x22707	
+0x3A79	0x22708	
+0x3A7A	0x22709	
+0x3A7B	0x22762	
+0x3A7C	0x2270A	
+0x3A7D	0x2270B	
+0x3A7E	0x2270C	
+0x3B21	0x2270D	
+0x3B22	0x2270E	
+0x3B23	0x22763	
+0x3B24	0x22727	
+0x3B25	0x2270F	
+0x3B27	0x2271B	
+0x3B28	0x22764	
+0x3B29	0x22710	
+0x3B2A	0x22711	
+0x3B2B	0x22781	
+0x3B2C	0x22712	
+0x3B2D	0x22765	
+0x3B2E	0x22713	
+0x3B2F	0x229CE	
+0x3B30	0x22C29	
+0x3B31	0x22BC4	
+0x3B32	0x22C2A	
+0x3B34	0x22C2B	
+0x3B35	0x22C2C	
+0x3B36	0x22C2D	
+0x3B37	0x22C2E	
+0x3B38	0x22C2F	
+0x3B39	0x22C30	
+0x3B3A	0x22C31	
+0x3B3B	0x22C32	
+0x3B3C	0x22C33	
+0x3B3D	0x22C34	
+0x3B3F	0x22C35	
+0x3B40	0x22C36	
+0x3B41	0x22BE3	
+0x3B42	0x22C37	
+0x3B43	0x22C38	
+0x3B44	0x22C39	
+0x3B45	0x22C3A	
+0x3B46	0x22C3B	
+0x3B47	0x22C4D	
+0x3B48	0x22C3C	
+0x3B49	0x22C3D	
+0x3B4A	0x22C3E	
+0x3B4C	0x22ED0	
+0x3B4D	0x22ED1	
+0x3B4E	0x23055	
+0x3B4F	0x23102	
+0x3B50	0x23104	
+0x3B51	0x231FC	
+0x3B52	0x23207	
+0x3B53	0x231FD	
+0x3B54	0x231FE	
+0x3B56	0x231FF	
+0x3B57	0x23200	
+0x3B58	0x23208	
+0x3B59	0x23201	
+0x3B5A	0x23202	
+0x3B5B	0x23235	
+0x3B5C	0x23203	
+0x3B5D	0x23204	
+0x3B5F	0x2333B	
+0x3B60	0x23389	
+0x3B61	0x23381	
+0x3B62	0x23382	
+0x3B63	0x26733	
+0x3B64	0x234EB	
+0x3B65	0x234EC	
+0x3B67	0x234ED	
+0x3B68	0x234EE	
+0x3B69	0x234EF	
+0x3B6B	0x234F0	
+0x3B6C	0x234F1	
+0x3B6D	0x234F2	
+0x3B6F	0x234F3	
+0x3B71	0x234F4	
+0x3B72	0x234F5	
+0x3B73	0x2004B	
+0x3B74	0x234F6	
+0x3B75	0x234F7	
+0x3B76	0x234F8	
+0x3B77	0x234F9	
+0x3B78	0x234FA	
+0x3B79	0x234FB	
+0x3B7A	0x234FC	
+0x3B7B	0x234FD	
+0x3B7C	0x234FE	
+0x3B7D	0x234FF	
+0x3B7E	0x23500	
+0x3C22	0x23501	
+0x3C23	0x23502	
+0x3C24	0x23503	
+0x3C25	0x23504	
+0x3C26	0x23505	
+0x3C27	0x23506	
+0x3C28	0x23507	
+0x3C2A	0x23508	
+0x3C2B	0x23509	
+0x3C2C	0x2350A	
+0x3C2D	0x2350B	
+0x3C2E	0x2350C	
+0x3C2F	0x2350D	
+0x3C30	0x238D7	
+0x3C31	0x238D8	
+0x3C32	0x23A29	
+0x3C33	0x23A9C	
+0x3C34	0x23AF8	
+0x3C35	0x23B98	
+0x3C36	0x23BA4	
+0x3C37	0x23B99	
+0x3C38	0x23B9A	
+0x3C39	0x23B9B	
+0x3C3A	0x23B97	
+0x3C3B	0x23B9C	
+0x3C3D	0x23B9D	
+0x3C3F	0x23B9E	
+0x3C40	0x23B9F	
+0x3C41	0x23C65	
+0x3C42	0x23DD6	
+0x3C44	0x23E32	
+0x3C45	0x23E33	
+0x3C46	0x23E34	
+0x3C48	0x23E35	
+0x3C49	0x23E36	
+0x3C4A	0x23E37	
+0x3C4B	0x23DD7	
+0x3C4D	0x23DD8	
+0x3C4E	0x23E38	
+0x3C4F	0x23E39	
+0x3C50	0x23E3A	
+0x3C51	0x23E3B	
+0x3C52	0x23E3C	
+0x3C53	0x23E3D	
+0x3C54	0x23E3E	
+0x3C55	0x23E3F	
+0x3C56	0x23E40	
+0x3C57	0x23DD9	
+0x3C58	0x23E41	
+0x3C59	0x23E42	
+0x3C5B	0x23E43	
+0x3C5C	0x23E44	
+0x3C5E	0x2427C	
+0x3C5F	0x2427D	
+0x3C60	0x2427E	
+0x3C61	0x2427F	
+0x3C62	0x24280	
+0x3C63	0x24281	
+0x3C64	0x24282	
+0x3C66	0x24283	
+0x3C67	0x24284	
+0x3C68	0x24285	
+0x3C69	0x24286	
+0x3C6A	0x242A5	
+0x3C6B	0x24287	
+0x3C6C	0x24288	
+0x3C6D	0x24289	
+0x3C6E	0x2428A	
+0x3C6F	0x2428B	
+0x3C70	0x2428C	
+0x3C71	0x2428D	
+0x3C72	0x2428E	
+0x3C75	0x2428F	
+0x3C77	0x24290	
+0x3C78	0x24291	
+0x3C79	0x24292	
+0x3C7A	0x24293	
+0x3C7B	0x24294	
+0x3C7C	0x24295	
+0x3D21	0x24296	
+0x3D22	0x24556	
+0x3D23	0x24557	
+0x3D24	0x245E1	
+0x3D25	0x2460E	
+0x3D26	0x2460F	
+0x3D27	0x2467A	
+0x3D28	0x2467B	
+0x3D29	0x2468B	
+0x3D2A	0x247F2	
+0x3D2B	0x247F3	
+0x3D2C	0x24993	
+0x3D2D	0x24994	
+0x3D2E	0x24995	
+0x3D2F	0x24996	
+0x3D30	0x24997	
+0x3D31	0x249AD	
+0x3D32	0x24998	
+0x3D33	0x249AB	
+0x3D34	0x2497B	
+0x3D35	0x24999	
+0x3D36	0x2499A	
+0x3D37	0x2499B	
+0x3D38	0x24985	
+0x3D39	0x2499C	
+0x3D3A	0x2499D	
+0x3D3D	0x249AC	
+0x3D3E	0x24979	
+0x3D3F	0x2499E	
+0x3D40	0x249A4	
+0x3D41	0x24AFD	
+0x3D42	0x24BEB	
+0x3D43	0x24BEA	
+0x3D44	0x24C8F	
+0x3D45	0x24C90	
+0x3D46	0x24C86	
+0x3D47	0x24C87	
+0x3D48	0x24C88	
+0x3D49	0x24DAC	
+0x3D4A	0x24DAD	
+0x3D4B	0x24FEC	
+0x3D4C	0x25073	
+0x3D4D	0x25074	
+0x3D4F	0x251AA	
+0x3D50	0x251AB	
+0x3D51	0x251AC	
+0x3D52	0x253D1	
+0x3D53	0x253D7	
+0x3D54	0x254B9	
+0x3D55	0x254BA	
+0x3D56	0x254BB	
+0x3D57	0x254BC	
+0x3D58	0x2568E	
+0x3D59	0x2568F	
+0x3D5A	0x25690	
+0x3D5B	0x2567C	
+0x3D5C	0x25691	
+0x3D5D	0x25692	
+0x3D5E	0x25693	
+0x3D5F	0x25694	
+0x3D60	0x2F954	
+0x3D61	0x2569A	
+0x3D62	0x25695	
+0x3D63	0x25696	
+0x3D64	0x25697	
+0x3D65	0x257BD	
+0x3D66	0x257C7	
+0x3D67	0x257BE	
+0x3D69	0x257BF	
+0x3D6B	0x25993	
+0x3D6C	0x21A5E	
+0x3D6D	0x25A86	
+0x3D6E	0x25A87	
+0x3D6F	0x25A88	
+0x3D70	0x25A89	
+0x3D71	0x25B41	
+0x3D72	0x25B42	
+0x3D73	0x25B43	
+0x3D74	0x25B44	
+0x3D75	0x25B45	
+0x3D76	0x25B46	
+0x3D77	0x25B4A	
+0x3D78	0x25B47	
+0x3D79	0x25B48	
+0x3D7A	0x25B49	
+0x3D7B	0x25E6B	
+0x3D7C	0x25E66	
+0x3D7E	0x25E67	
+0x3E22	0x25E68	
+0x3E25	0x25FFD	
+0x3E26	0x25FFE	
+0x3E27	0x25FFF	
+0x3E28	0x26000	
+0x3E29	0x26001	
+0x3E2A	0x26002	
+0x3E2B	0x26003	
+0x3E2C	0x26004	
+0x3E2D	0x26005	
+0x3E2E	0x26006	
+0x3E2F	0x26233	
+0x3E30	0x262C2	
+0x3E31	0x262D0	
+0x3E32	0x2F974	
+0x3E33	0x26395	
+0x3E34	0x26396	
+0x3E35	0x26435	
+0x3E36	0x26436	
+0x3E37	0x26567	
+0x3E38	0x26568	
+0x3E39	0x26569	
+0x3E3A	0x2656A	
+0x3E3B	0x26572	
+0x3E3C	0x2656B	
+0x3E3D	0x2656C	
+0x3E3E	0x2656D	
+0x3E3F	0x2656E	
+0x3E40	0x2656F	
+0x3E41	0x26722	
+0x3E44	0x26723	
+0x3E45	0x26741	
+0x3E46	0x26724	
+0x3E47	0x26725	
+0x3E48	0x26726	
+0x3E49	0x26727	
+0x3E4A	0x26728	
+0x3E4B	0x26729	
+0x3E4C	0x266B7	
+0x3E50	0x269DA	
+0x3E51	0x26ACF	
+0x3E52	0x26ADA	
+0x3E53	0x26C89	
+0x3E54	0x26CB7	
+0x3E55	0x26C8A	
+0x3E56	0x26C8B	
+0x3E57	0x26D5E	
+0x3E58	0x26C8C	
+0x3E5A	0x26C8D	
+0x3E5B	0x26C8E	
+0x3E5C	0x26C8F	
+0x3E5D	0x26C90	
+0x3E5E	0x26C91	
+0x3E5F	0x26C92	
+0x3E60	0x26C93	
+0x3E61	0x26C94	
+0x3E62	0x26CB6	
+0x3E63	0x26C95	
+0x3E64	0x26C96	
+0x3E65	0x26C97	
+0x3E68	0x26C98	
+0x3E69	0x26C99	
+0x3E6A	0x26C9A	
+0x3E6D	0x26C9B	
+0x3E6E	0x26CBD	
+0x3E6F	0x26C9C	
+0x3E70	0x26C9D	
+0x3E71	0x26C9E	
+0x3E72	0x26C9F	
+0x3E73	0x26CC0	
+0x3E74	0x26CA0	
+0x3E75	0x26CA1	
+0x3E76	0x26CA2	
+0x3E77	0x26CA3	
+0x3E78	0x26CA4	
+0x3E79	0x26CA5	
+0x3E7A	0x26CA6	
+0x3E7B	0x26CA7	
+0x3E7C	0x26CA8	
+0x3E7D	0x26CA9	
+0x3E7E	0x26CAA	
+0x3F22	0x271B4	
+0x3F23	0x271B5	
+0x3F24	0x271B6	
+0x3F25	0x272B9	
+0x3F26	0x272BA	
+0x3F27	0x272BB	
+0x3F28	0x27291	
+0x3F29	0x272BC	
+0x3F2A	0x275EE	
+0x3F2B	0x275EF	
+0x3F2C	0x27696	
+0x3F2D	0x27697	
+0x3F2E	0x27673	
+0x3F2F	0x27698	
+0x3F30	0x27699	
+0x3F31	0x277ED	
+0x3F32	0x277EE	
+0x3F33	0x278DE	
+0x3F34	0x279B0	
+0x3F35	0x279B1	
+0x3F36	0x279B2	
+0x3F37	0x279B3	
+0x3F38	0x279B4	
+0x3F39	0x279B5	
+0x3F3A	0x279B6	
+0x3F3B	0x2F9CE	
+0x3F3C	0x279B7	
+0x3F3D	0x27BE3	
+0x3F3E	0x27CB9	
+0x3F3F	0x27D55	
+0x3F40	0x27D7E	
+0x3F41	0x27D56	
+0x3F42	0x27D57	
+0x3F43	0x27D58	
+0x3F44	0x27D59	
+0x3F45	0x27D5A	
+0x3F47	0x27EC4	
+0x3F48	0x27EC5	
+0x3F49	0x27EC6	
+0x3F4A	0x27EC7	
+0x3F4B	0x27EC8	
+0x3F4C	0x27EC9	
+0x3F4D	0x27EEE	
+0x3F4E	0x27ECF	
+0x3F4F	0x27ECA	
+0x3F50	0x27ECB	
+0x3F51	0x27ECC	
+0x3F52	0x28009	
+0x3F53	0x2F9DA	
+0x3F54	0x28003	
+0x3F55	0x2822F	
+0x3F56	0x28230	
+0x3F57	0x28231	
+0x3F58	0x28232	
+0x3F59	0x2850E	
+0x3F5A	0x2850F	
+0x3F5B	0x28510	
+0x3F5C	0x28511	
+0x3F5D	0x28512	
+0x3F5F	0x28513	
+0x3F60	0x28514	
+0x3F61	0x28515	
+0x3F62	0x284FF	
+0x3F63	0x2871F	
+0x3F64	0x28720	
+0x3F65	0x28721	
+0x3F66	0x2872D	
+0x3F68	0x2881B	
+0x3F69	0x2881C	
+0x3F6A	0x2881D	
+0x3F6B	0x2881E	
+0x3F6C	0x28953	
+0x3F6D	0x28954	
+0x3F6E	0x28955	
+0x3F6F	0x28956	
+0x3F70	0x28964	
+0x3F71	0x28959	
+0x3F72	0x28957	
+0x3F74	0x28958	
+0x3F75	0x28C6B	
+0x3F78	0x28CE7	
+0x3F79	0x28CE8	
+0x3F7A	0x28CE9	
+0x3F7B	0x28CEA	
+0x3F7C	0x28CEB	
+0x3F7D	0x28CEC	
+0x4021	0x28CED	
+0x4022	0x28EB1	
+0x4023	0x28EB4	
+0x4025	0x2908A	
+0x4026	0x2908D	
+0x4027	0x2908C	
+0x4028	0x291F2	
+0x4029	0x291F3	
+0x402B	0x22108	
+0x402C	0x29417	
+0x402E	0x2959F	
+0x402F	0x296A0	
+0x4031	0x2986D	
+0x4032	0x2307D	
+0x4033	0x29F90	
+0x4034	0x2A5C4	
+0x4035	0x2004C	
+0x4036	0x20174	
+0x4037	0x20175	
+0x4038	0x20176	
+0x4039	0x20349	
+0x403A	0x2034A	
+0x403B	0x2034B	
+0x403C	0x2034C	
+0x403D	0x2034D	
+0x403E	0x2034E	
+0x403F	0x2034F	
+0x4040	0x20350	
+0x4041	0x20351	
+0x4042	0x20352	
+0x4043	0x20353	
+0x4044	0x20354	
+0x4045	0x20355	
+0x4046	0x20356	
+0x4047	0x204A4	
+0x4048	0x204A9	
+0x4049	0x2052A	
+0x404A	0x2052B	
+0x404B	0x207B3	
+0x404C	0x207C1	
+0x404D	0x20898	
+0x404E	0x208FB	
+0x404F	0x208FC	
+0x4050	0x209BC	
+0x4051	0x20A96	
+0x4052	0x20B0A	
+0x4054	0x20EA2	
+0x4056	0x20E81	
+0x4057	0x20E82	
+0x4058	0x20E83	
+0x4059	0x20E84	
+0x405A	0x20E85	
+0x405B	0x20E86	
+0x405C	0x20E87	
+0x405D	0x20E88	
+0x405E	0x20E89	
+0x405F	0x20E8A	
+0x4060	0x20E8B	
+0x4061	0x20E8C	
+0x4063	0x20E8D	
+0x4064	0x20ED1	
+0x4065	0x21214	
+0x4066	0x213C9	
+0x4067	0x213CA	
+0x4068	0x213CB	
+0x4069	0x29AFD	
+0x406A	0x213CC	
+0x406B	0x213CD	
+0x406C	0x213CE	
+0x406D	0x213CF	
+0x406E	0x213D0	
+0x406F	0x213D1	
+0x4070	0x213D2	
+0x4071	0x213D3	
+0x4072	0x213D4	
+0x4073	0x213D5	
+0x4074	0x21571	
+0x4075	0x2004D	
+0x4076	0x21662	
+0x4077	0x2180E	
+0x4078	0x217FE	
+0x4079	0x217FF	
+0x407A	0x21800	
+0x407C	0x21801	
+0x407D	0x21802	
+0x407E	0x21803	
+0x4121	0x21815	
+0x4122	0x21804	
+0x4123	0x21805	
+0x4125	0x21987	
+0x4126	0x21989	
+0x4127	0x21A6E	
+0x4128	0x21A6F	
+0x4129	0x21A70	
+0x412A	0x21A71	
+0x412B	0x2F86E	
+0x412C	0x21A72	
+0x412D	0x21A73	
+0x412E	0x21A74	
+0x412F	0x21B9D	
+0x4130	0x21CB8	
+0x4131	0x21CB9	
+0x4132	0x21CBA	
+0x4133	0x21EC2	
+0x4134	0x21EC3	
+0x4135	0x21ED5	
+0x4136	0x21EC4	
+0x4137	0x21EC0	
+0x4138	0x21EC5	
+0x4139	0x21EC6	
+0x413A	0x2228A	
+0x413B	0x2228B	
+0x413C	0x2228C	
+0x413D	0x22364	
+0x413E	0x25B8C	
+0x4140	0x2240D	
+0x4141	0x224A8	
+0x4142	0x2253B	
+0x4143	0x2253C	
+0x4144	0x2253D	
+0x4145	0x2253E	
+0x4146	0x2253F	
+0x4147	0x22540	
+0x4148	0x22766	
+0x4149	0x227CB	
+0x414A	0x227B7	
+0x414B	0x227B8	
+0x414C	0x227B9	
+0x414D	0x227BA	
+0x414E	0x22767	
+0x414F	0x227BB	
+0x4150	0x22768	
+0x4151	0x22769	
+0x4152	0x2276A	
+0x4153	0x227BC	
+0x4155	0x229DB	
+0x4156	0x22C81	
+0x4157	0x22C82	
+0x4158	0x22C83	
+0x4159	0x22C84	
+0x415A	0x22C85	
+0x415B	0x22C86	
+0x415C	0x22C87	
+0x415D	0x22C88	
+0x415E	0x22C89	
+0x415F	0x2F8BF	
+0x4160	0x22C8A	
+0x4161	0x22C8B	
+0x4163	0x22C8C	
+0x4164	0x22C8D	
+0x4165	0x22C8E	
+0x4166	0x22C8F	
+0x4167	0x22C90	
+0x4168	0x22CA1	
+0x4169	0x22C91	
+0x416A	0x22ED6	
+0x416B	0x22F9F	
+0x416C	0x23058	
+0x416D	0x23085	
+0x416E	0x2310B	
+0x416F	0x2310C	
+0x4170	0x23237	
+0x4171	0x23238	
+0x4172	0x2F8CE	
+0x4173	0x23239	
+0x4174	0x2323A	
+0x4175	0x2323B	
+0x4176	0x2323C	
+0x4177	0x2323D	
+0x4178	0x2323E	
+0x4179	0x23240	
+0x417A	0x23241	
+0x417B	0x23242	
+0x417D	0x23243	
+0x417E	0x2338A	
+0x4221	0x2338B	
+0x4222	0x23590	
+0x4223	0x23559	
+0x4224	0x2355B	
+0x4225	0x2355C	
+0x4226	0x2355D	
+0x4227	0x2355E	
+0x4229	0x2355F	
+0x422A	0x23560	
+0x422B	0x23561	
+0x422C	0x23562	
+0x422D	0x23563	
+0x422E	0x23564	
+0x422F	0x23593	
+0x4230	0x23565	
+0x4231	0x23566	
+0x4232	0x23567	
+0x4233	0x23568	
+0x4234	0x23569	
+0x4235	0x2356A	
+0x4236	0x2356B	
+0x4237	0x23595	
+0x4238	0x2356C	
+0x4239	0x2356D	
+0x423A	0x2356E	
+0x423B	0x2356F	
+0x423D	0x23570	
+0x423E	0x23571	
+0x423F	0x23572	
+0x4240	0x23573	
+0x4241	0x23574	
+0x4242	0x23575	
+0x4243	0x23576	
+0x4244	0x23577	
+0x4245	0x23578	
+0x4246	0x23579	
+0x4248	0x2357A	
+0x424A	0x2357B	
+0x424B	0x235A9	
+0x424C	0x2357C	
+0x424D	0x238F1	
+0x424E	0x238EB	
+0x424F	0x2398A	
+0x4250	0x23A3D	
+0x4251	0x23AA6	
+0x4252	0x23AA7	
+0x4253	0x23BBA	
+0x4255	0x23BBB	
+0x4256	0x23BBC	
+0x4257	0x23BBD	
+0x4258	0x23E91	
+0x4259	0x23E92	
+0x425A	0x23E93	
+0x425B	0x23E94	
+0x425C	0x23E95	
+0x425D	0x23E96	
+0x425E	0x23E97	
+0x425F	0x23DDA	
+0x4260	0x23E98	
+0x4261	0x23E99	
+0x4262	0x23E9A	
+0x4265	0x23E9B	
+0x4266	0x23E9C	
+0x4267	0x23E9D	
+0x4268	0x23E9E	
+0x4269	0x23E9F	
+0x426A	0x23EA0	
+0x426B	0x23EBF	
+0x426C	0x23EA1	
+0x426D	0x23EA2	
+0x426E	0x23EA3	
+0x426F	0x23EA4	
+0x4270	0x23EA5	
+0x4271	0x23EA6	
+0x4272	0x23EA7	
+0x4273	0x23E5B	
+0x4274	0x2F90D	
+0x4275	0x23EA8	
+0x4276	0x242CB	
+0x4279	0x242CC	
+0x427A	0x2434F	
+0x427B	0x242CD	
+0x427C	0x242CE	
+0x427D	0x242CF	
+0x427E	0x2434E	
+0x4321	0x242D0	
+0x4322	0x242D1	
+0x4323	0x242D2	
+0x4325	0x242D3	
+0x4326	0x242D4	
+0x4327	0x242D5	
+0x4328	0x242D6	
+0x4329	0x242D7	
+0x432A	0x242D8	
+0x432B	0x242D9	
+0x432C	0x242FA	
+0x432D	0x242DA	
+0x432E	0x242DB	
+0x432F	0x2F91C	
+0x4330	0x242DC	
+0x4333	0x242DD	
+0x4334	0x242DE	
+0x4335	0x242DF	
+0x4336	0x242E0	
+0x4337	0x242E1	
+0x4338	0x242E2	
+0x4339	0x242E3	
+0x433A	0x242E4	
+0x433B	0x242E5	
+0x433D	0x242E6	
+0x433E	0x242E7	
+0x433F	0x2458E	
+0x4340	0x24698	
+0x4341	0x24699	
+0x4343	0x2480A	
+0x4345	0x24826	
+0x4346	0x24827	
+0x4347	0x249BD	
+0x4348	0x249DF	
+0x434A	0x249BE	
+0x434B	0x249DE	
+0x434C	0x249BF	
+0x434D	0x249C0	
+0x434E	0x249C1	
+0x434F	0x249C2	
+0x4350	0x2499F	
+0x4351	0x249C3	
+0x4352	0x249C4	
+0x4353	0x249C5	
+0x4354	0x249C6	
+0x4355	0x249C7	
+0x4357	0x249C8	
+0x4358	0x249C9	
+0x4359	0x249E3	
+0x435A	0x249CA	
+0x435B	0x249CB	
+0x435C	0x249CC	
+0x435D	0x249CD	
+0x435E	0x249CE	
+0x435F	0x249CF	
+0x4360	0x249D0	
+0x4361	0x249D1	
+0x4362	0x249D2	
+0x4363	0x249D3	
+0x4364	0x2F92F	
+0x4365	0x249D4	
+0x4366	0x24B04	
+0x4367	0x24B65	
+0x4368	0x24BEE	
+0x4369	0x24CA0	
+0x436A	0x24CA1	
+0x436B	0x24DDD	
+0x436C	0x24DDE	
+0x436D	0x24F83	
+0x436E	0x24FFA	
+0x436F	0x2507F	
+0x4370	0x25080	
+0x4371	0x251E8	
+0x4372	0x251E9	
+0x4373	0x251EA	
+0x4374	0x235A6	
+0x4375	0x253E1	
+0x4377	0x254DB	
+0x4378	0x254DC	
+0x4379	0x254DD	
+0x437A	0x254DE	
+0x437B	0x254DF	
+0x437C	0x254E0	
+0x437D	0x254E1	
+0x437E	0x254E2	
+0x4421	0x254E3	
+0x4422	0x254E4	
+0x4423	0x254E5	
+0x4424	0x254E6	
+0x4426	0x254E7	
+0x4427	0x256B0	
+0x4428	0x25698	
+0x4429	0x256B1	
+0x442A	0x25699	
+0x442B	0x256B2	
+0x442C	0x256B3	
+0x442D	0x256B4	
+0x442E	0x256B5	
+0x442F	0x256B6	
+0x4430	0x256B7	
+0x4431	0x256B8	
+0x4432	0x256B9	
+0x4433	0x257E2	
+0x4434	0x257E3	
+0x4435	0x257E4	
+0x4436	0x257E5	
+0x4437	0x257E6	
+0x4438	0x257E7	
+0x4439	0x257E8	
+0x443A	0x257E9	
+0x443B	0x259AD	
+0x443C	0x259CF	
+0x443D	0x259AE	
+0x443E	0x259AF	
+0x443F	0x259B0	
+0x4440	0x259B1	
+0x4441	0x25A92	
+0x4442	0x25A93	
+0x4443	0x25A94	
+0x4444	0x25B79	
+0x4446	0x25B7A	
+0x4447	0x25B7B	
+0x4448	0x25B7C	
+0x4449	0x25B7D	
+0x444A	0x25B7E	
+0x444B	0x25B7F	
+0x444C	0x25B80	
+0x444D	0x25B81	
+0x444E	0x25B82	
+0x444F	0x25B83	
+0x4450	0x25B84	
+0x4451	0x25E97	
+0x4452	0x25E84	
+0x4453	0x25E85	
+0x4454	0x25E89	
+0x4455	0x25E86	
+0x4456	0x25E87	
+0x4457	0x2602C	
+0x4458	0x2602D	
+0x4459	0x2602E	
+0x445A	0x2602F	
+0x445B	0x26030	
+0x445C	0x26031	
+0x445D	0x26032	
+0x445E	0x26033	
+0x445F	0x26034	
+0x4460	0x26035	
+0x4461	0x26036	
+0x4462	0x26037	
+0x4463	0x262D2	
+0x4464	0x26444	
+0x4465	0x26500	
+0x4466	0x26583	
+0x4467	0x26584	
+0x4468	0x2F986	
+0x4469	0x2677A	
+0x446A	0x2677B	
+0x446B	0x2677C	
+0x446C	0x2677D	
+0x446D	0x2677E	
+0x446F	0x2677F	
+0x4470	0x26787	
+0x4471	0x26780	
+0x4472	0x26A43	
+0x4473	0x26D34	
+0x4475	0x26D35	
+0x4476	0x26D36	
+0x4477	0x26D37	
+0x4478	0x26D38	
+0x4479	0x26D39	
+0x447A	0x26D3A	
+0x447B	0x26D3B	
+0x447C	0x26D3C	
+0x447D	0x26D3D	
+0x447E	0x26D3E	
+0x4521	0x26D3F	
+0x4522	0x26D40	
+0x4523	0x26D41	
+0x4524	0x26D42	
+0x4525	0x26D43	
+0x4526	0x26D44	
+0x4527	0x26D45	
+0x4528	0x26D46	
+0x4529	0x26D47	
+0x452A	0x26D48	
+0x452B	0x26D49	
+0x452C	0x26D4A	
+0x452E	0x26D4B	
+0x452F	0x26D4C	
+0x4530	0x26D4D	
+0x4531	0x26D4E	
+0x4532	0x272E7	
+0x4533	0x272E8	
+0x4534	0x272E9	
+0x4535	0x272EA	
+0x4536	0x272EB	
+0x4537	0x272EC	
+0x4538	0x272ED	
+0x4539	0x272EE	
+0x453A	0x275F7	
+0x453B	0x2769A	
+0x453C	0x276CD	
+0x453D	0x2F9C8	
+0x453E	0x276A3	
+0x453F	0x276CE	
+0x4540	0x27831	
+0x4541	0x27832	
+0x4542	0x27833	
+0x4543	0x279E4	
+0x4545	0x279E5	
+0x4546	0x279E6	
+0x4547	0x27CC8	
+0x4548	0x27D74	
+0x4549	0x27D75	
+0x454A	0x27D76	
+0x454B	0x27D77	
+0x454C	0x27D78	
+0x454D	0x27D79	
+0x454E	0x27D7A	
+0x454F	0x27E61	
+0x4550	0x27EDF	
+0x4551	0x27EE0	
+0x4552	0x27EE1	
+0x4553	0x27EE2	
+0x4554	0x27EE3	
+0x4555	0x27EE4	
+0x4556	0x27EE5	
+0x4557	0x27EE6	
+0x4559	0x28031	
+0x455A	0x2823D	
+0x455B	0x2823E	
+0x455C	0x2823F	
+0x455D	0x282F4	
+0x455E	0x282F5	
+0x455F	0x282F6	
+0x4561	0x28417	
+0x4562	0x28541	
+0x4563	0x28542	
+0x4564	0x28543	
+0x4565	0x28544	
+0x4566	0x28545	
+0x4567	0x28546	
+0x4568	0x28547	
+0x4569	0x28548	
+0x456A	0x28549	
+0x456B	0x2854A	
+0x456C	0x2854B	
+0x456E	0x286BA	
+0x456F	0x28744	
+0x4570	0x2892A	
+0x4571	0x2896D	
+0x4573	0x2F9E7	
+0x4574	0x2897E	
+0x4575	0x2896E	
+0x4576	0x2896F	
+0x4577	0x28970	
+0x4578	0x28971	
+0x4579	0x28976	
+0x457A	0x28C79	
+0x457D	0x28D04	
+0x457E	0x28CF8	
+0x4621	0x28D05	
+0x4622	0x28EDA	
+0x4623	0x28EDB	
+0x4624	0x28EDC	
+0x4625	0x28EDD	
+0x4626	0x28EDE	
+0x4627	0x28EDF	
+0x4628	0x28EE0	
+0x4629	0x28EE1	
+0x462A	0x290C5	
+0x462B	0x2909A	
+0x462C	0x2909B	
+0x462D	0x2909C	
+0x462E	0x291D8	
+0x462F	0x291D9	
+0x4630	0x291DA	
+0x4631	0x2926E	
+0x4633	0x2946B	
+0x4634	0x27D83	
+0x4636	0x296D6	
+0x4637	0x296BD	
+0x4639	0x2322E	
+0x463A	0x29AFC	
+0x463B	0x29D53	
+0x463C	0x29DB7	
+0x463D	0x2A28C	
+0x463E	0x2A38E	
+0x463F	0x2A2FF	
+0x4640	0x20076	
+0x4641	0x20106	
+0x4642	0x2017E	
+0x4643	0x20384	
+0x4644	0x20385	
+0x4645	0x20386	
+0x4646	0x20387	
+0x4647	0x20388	
+0x4648	0x203A7	
+0x4649	0x20389	
+0x464A	0x2038A	
+0x464B	0x2038B	
+0x464C	0x2038C	
+0x464D	0x2038D	
+0x464E	0x2038E	
+0x464F	0x2038F	
+0x4650	0x203A3	
+0x4651	0x20390	
+0x4652	0x20391	
+0x4653	0x20392	
+0x4654	0x20393	
+0x4655	0x203AC	
+0x4656	0x20394	
+0x4657	0x20395	
+0x4658	0x20396	
+0x4659	0x204AA	
+0x465A	0x204AB	
+0x465B	0x2059E	
+0x465D	0x20608	
+0x465E	0x20609	
+0x465F	0x20668	
+0x4660	0x20669	
+0x4661	0x2066A	
+0x4662	0x2069A	
+0x4663	0x207D9	
+0x4664	0x207DA	
+0x4665	0x207DB	
+0x4666	0x208A8	
+0x4667	0x20901	
+0x4668	0x20928	
+0x4669	0x20977	
+0x466A	0x209BD	
+0x466B	0x209BE	
+0x466C	0x20F60	
+0x466D	0x20AA0	
+0x466E	0x20AA2	
+0x466F	0x20B0F	
+0x4670	0x20B85	
+0x4671	0x20EFE	
+0x4672	0x20EFF	
+0x4673	0x20F00	
+0x4674	0x20F01	
+0x4675	0x20F16	
+0x4676	0x20F02	
+0x4677	0x20F03	
+0x4678	0x20F04	
+0x4679	0x20F05	
+0x467A	0x20F06	
+0x467B	0x20F07	
+0x467C	0x20F08	
+0x467D	0x20F22	
+0x467E	0x20F09	
+0x4721	0x20F0A	
+0x4722	0x20F0B	
+0x4723	0x20F0C	
+0x4724	0x20F14	
+0x4725	0x20F29	
+0x4726	0x20E6E	
+0x4727	0x20F0D	
+0x4728	0x20F0E	
+0x4729	0x20F0F	
+0x472A	0x20F10	
+0x472B	0x20F11	
+0x472C	0x20F12	
+0x472D	0x20F13	
+0x472E	0x2121B	
+0x472F	0x2121C	
+0x4730	0x2121D	
+0x4731	0x21413	
+0x4732	0x213FF	
+0x4733	0x21400	
+0x4734	0x21401	
+0x4735	0x21402	
+0x4736	0x21403	
+0x4737	0x21404	
+0x4738	0x2140A	
+0x4739	0x21405	
+0x473A	0x21406	
+0x473B	0x21407	
+0x473C	0x21408	
+0x473D	0x2153A	
+0x473E	0x21573	
+0x473F	0x2166F	
+0x4740	0x21670	
+0x4741	0x21671	
+0x4742	0x20052	
+0x4744	0x21A9A	
+0x4745	0x21860	
+0x4746	0x2F869	
+0x4747	0x2182B	
+0x4748	0x21824	
+0x4749	0x2182C	
+0x474A	0x2182D	
+0x474B	0x2182E	
+0x474C	0x2182F	
+0x474D	0x21830	
+0x474E	0x21831	
+0x474F	0x21832	
+0x4750	0x21833	
+0x4751	0x21834	
+0x4752	0x21835	
+0x4753	0x21845	
+0x4754	0x21836	
+0x4755	0x21992	
+0x4756	0x21993	
+0x4757	0x21A88	
+0x4758	0x21A89	
+0x4759	0x21A8A	
+0x475A	0x21A8B	
+0x475B	0x21B3F	
+0x475D	0x21CCA	
+0x475E	0x21EF6	
+0x475F	0x21EF7	
+0x4760	0x21EF8	
+0x4761	0x21EF9	
+0x4762	0x2212B	
+0x4764	0x221A4	
+0x4765	0x221CE	
+0x4767	0x2229E	
+0x4768	0x2229F	
+0x4769	0x222A0	
+0x476A	0x222A1	
+0x476B	0x222A2	
+0x476C	0x222A3	
+0x476D	0x222A4	
+0x476E	0x222A5	
+0x476F	0x222A6	
+0x4770	0x22418	
+0x4771	0x22560	
+0x4772	0x22561	
+0x4773	0x22562	
+0x4774	0x22563	
+0x4775	0x22564	
+0x4776	0x227BD	
+0x4777	0x227BE	
+0x4778	0x2280B	
+0x4779	0x227BF	
+0x477A	0x227C0	
+0x477C	0x2280C	
+0x477D	0x2278D	
+0x477E	0x2280D	
+0x4821	0x2280E	
+0x4822	0x2285E	
+0x4823	0x2280F	
+0x4824	0x22810	
+0x4825	0x227C1	
+0x4826	0x22811	
+0x4828	0x227C2	
+0x4829	0x229EA	
+0x482A	0x229EB	
+0x482B	0x22CE3	
+0x482C	0x22CE4	
+0x482D	0x22CE5	
+0x482E	0x22CE6	
+0x482F	0x22CE7	
+0x4830	0x22C92	
+0x4831	0x22D4A	
+0x4833	0x22CE8	
+0x4834	0x22CE9	
+0x4835	0x22CEA	
+0x4836	0x22D01	
+0x4837	0x22CEB	
+0x4838	0x22CEC	
+0x4839	0x22CEF	
+0x483A	0x22CED	
+0x483B	0x22CEE	
+0x483C	0x22CF0	
+0x483D	0x22CF1	
+0x483E	0x22CF2	
+0x483F	0x22CF3	
+0x4840	0x22CF4	
+0x4841	0x22CF5	
+0x4842	0x22CF6	
+0x4843	0x22CF7	
+0x4844	0x22CF8	
+0x4845	0x22CF9	
+0x4846	0x22CFE	
+0x4847	0x22CFA	
+0x4848	0x22CFB	
+0x4849	0x22CFC	
+0x484A	0x23263	
+0x484B	0x23264	
+0x484C	0x23265	
+0x484D	0x23266	
+0x484E	0x23267	
+0x484F	0x23268	
+0x4850	0x2360B	
+0x4851	0x2360D	
+0x4853	0x2360E	
+0x4854	0x2360F	
+0x4856	0x23614	
+0x4857	0x235D4	
+0x4858	0x235D5	
+0x4859	0x235D6	
+0x485A	0x235D7	
+0x485B	0x235D8	
+0x485C	0x235D9	
+0x485D	0x235DA	
+0x485E	0x235DB	
+0x485F	0x235DC	
+0x4860	0x235DD	
+0x4861	0x235DE	
+0x4862	0x235DF	
+0x4863	0x235E0	
+0x4864	0x235E1	
+0x4865	0x235E2	
+0x4866	0x235E3	
+0x4867	0x235E4	
+0x4868	0x235E5	
+0x4869	0x235E6	
+0x486A	0x235E7	
+0x486B	0x235E8	
+0x486C	0x235E9	
+0x486D	0x235EA	
+0x486E	0x235EB	
+0x486F	0x235EC	
+0x4870	0x236EC	
+0x4871	0x235ED	
+0x4872	0x235EE	
+0x4873	0x235EF	
+0x4874	0x23600	
+0x4875	0x235F0	
+0x4876	0x23904	
+0x4878	0x23905	
+0x4879	0x2F8F3	
+0x487A	0x23AB5	
+0x487B	0x2F8F9	
+0x487C	0x23BD6	
+0x487D	0x23BD7	
+0x487E	0x23BD8	
+0x4921	0x23BD9	
+0x4922	0x23EA9	
+0x4923	0x23F00	
+0x4924	0x23F01	
+0x4925	0x23F02	
+0x4926	0x23F03	
+0x4927	0x23F04	
+0x4928	0x23F05	
+0x4929	0x23F06	
+0x492A	0x23F3F	
+0x492B	0x23F07	
+0x492C	0x23F08	
+0x492D	0x23F09	
+0x492E	0x23F0A	
+0x492F	0x23EB6	
+0x4930	0x23F0B	
+0x4931	0x23F0C	
+0x4934	0x23F0D	
+0x4936	0x23F0E	
+0x4937	0x23F0F	
+0x4938	0x23F10	
+0x4939	0x23F11	
+0x493A	0x23F12	
+0x493B	0x23F35	
+0x493C	0x23F13	
+0x493D	0x23F14	
+0x493E	0x23EAA	
+0x4940	0x23FC1	
+0x4941	0x23F15	
+0x4942	0x23F16	
+0x4943	0x23F17	
+0x4944	0x2431E	
+0x4945	0x2431F	
+0x4946	0x24320	
+0x4947	0x24321	
+0x4949	0x24322	
+0x494A	0x24323	
+0x494C	0x24324	
+0x494D	0x24325	
+0x494E	0x24326	
+0x494F	0x24327	
+0x4950	0x24328	
+0x4951	0x24329	
+0x4952	0x2432A	
+0x4953	0x2432B	
+0x4954	0x24307	
+0x4955	0x2432C	
+0x4956	0x2432D	
+0x4957	0x2432E	
+0x495A	0x2432F	
+0x495B	0x24330	
+0x495C	0x24348	
+0x495D	0x24331	
+0x495E	0x24332	
+0x4960	0x24333	
+0x4962	0x24334	
+0x4963	0x24335	
+0x4964	0x24336	
+0x4965	0x24559	
+0x4966	0x24591	
+0x4967	0x245E7	
+0x4968	0x246B8	
+0x4969	0x246B9	
+0x496A	0x246BA	
+0x496B	0x246BB	
+0x496C	0x246C8	
+0x496D	0x2484D	
+0x496E	0x24889	
+0x496F	0x24850	
+0x4970	0x24828	
+0x4971	0x249FB	
+0x4972	0x249FC	
+0x4973	0x249FD	
+0x4974	0x249FE	
+0x4975	0x249FF	
+0x4977	0x24A00	
+0x4978	0x24A01	
+0x4979	0x24A02	
+0x497A	0x249E4	
+0x497B	0x249E5	
+0x497C	0x24A03	
+0x497D	0x24A04	
+0x497E	0x24A05	
+0x4A21	0x24A06	
+0x4A22	0x24A07	
+0x4A23	0x24A13	
+0x4A24	0x24A08	
+0x4A25	0x24A09	
+0x4A26	0x249E6	
+0x4A27	0x24A0A	
+0x4A28	0x24A0B	
+0x4A29	0x24A0C	
+0x4A2A	0x24B0B	
+0x4A2B	0x24BF4	
+0x4A2C	0x24C0A	
+0x4A2D	0x24CB1	
+0x4A2E	0x24E1D	
+0x4A2F	0x2F93B	
+0x4A30	0x24F8B	
+0x4A31	0x24F8C	
+0x4A32	0x24F8F	
+0x4A33	0x24F8D	
+0x4A34	0x24F8E	
+0x4A35	0x25006	
+0x4A36	0x25086	
+0x4A37	0x25222	
+0x4A38	0x25223	
+0x4A39	0x25224	
+0x4A3A	0x25225	
+0x4A3B	0x25226	
+0x4A3C	0x25227	
+0x4A3D	0x25228	
+0x4A3E	0x253F1	
+0x4A40	0x25523	
+0x4A41	0x25512	
+0x4A43	0x25513	
+0x4A44	0x25514	
+0x4A45	0x25515	
+0x4A46	0x25516	
+0x4A47	0x25517	
+0x4A48	0x25518	
+0x4A49	0x25519	
+0x4A4A	0x2554B	
+0x4A4B	0x2551A	
+0x4A4C	0x2551B	
+0x4A4D	0x2551C	
+0x4A4F	0x2551D	
+0x4A50	0x2551E	
+0x4A51	0x2551F	
+0x4A52	0x25520	
+0x4A53	0x256CA	
+0x4A54	0x222AC	
+0x4A55	0x256CB	
+0x4A56	0x256CC	
+0x4A57	0x256CD	
+0x4A58	0x256CE	
+0x4A5A	0x256CF	
+0x4A5B	0x25810	
+0x4A5C	0x25811	
+0x4A5D	0x25812	
+0x4A5E	0x25813	
+0x4A5F	0x25814	
+0x4A60	0x2580F	
+0x4A61	0x25815	
+0x4A62	0x25816	
+0x4A63	0x25817	
+0x4A65	0x25818	
+0x4A66	0x259C6	
+0x4A67	0x25A9F	
+0x4A68	0x25AA0	
+0x4A69	0x25AA4	
+0x4A6A	0x25AA1	
+0x4A6B	0x25BB5	
+0x4A6C	0x25BB6	
+0x4A6D	0x25BB7	
+0x4A6E	0x25BB8	
+0x4A6F	0x25BB9	
+0x4A70	0x25BBA	
+0x4A71	0x25BD0	
+0x4A72	0x25BC6	
+0x4A73	0x25BBB	
+0x4A74	0x25BBC	
+0x4A75	0x25BBD	
+0x4A76	0x25BBE	
+0x4A77	0x25BBF	
+0x4A78	0x25BC0	
+0x4A79	0x25BC1	
+0x4A7A	0x25BC2	
+0x4A7B	0x2F960	
+0x4A7C	0x25EA7	
+0x4A7D	0x25EA8	
+0x4A7E	0x25EA9	
+0x4B21	0x25EAA	
+0x4B22	0x25EAB	
+0x4B23	0x25EAC	
+0x4B24	0x25EBC	
+0x4B25	0x25EAD	
+0x4B26	0x25EAE	
+0x4B28	0x25EAF	
+0x4B29	0x25EB0	
+0x4B2A	0x25EB1	
+0x4B2C	0x25EB4	
+0x4B2D	0x25EB2	
+0x4B2E	0x26066	
+0x4B2F	0x26067	
+0x4B30	0x26068	
+0x4B31	0x26069	
+0x4B32	0x2606A	
+0x4B33	0x2606B	
+0x4B34	0x2606C	
+0x4B35	0x2606D	
+0x4B36	0x2606E	
+0x4B37	0x2606F	
+0x4B39	0x2623E	
+0x4B3A	0x2623F	
+0x4B3B	0x26240	
+0x4B3C	0x262E8	
+0x4B3D	0x26452	
+0x4B3E	0x26453	
+0x4B3F	0x26454	
+0x4B40	0x26455	
+0x4B41	0x26591	
+0x4B42	0x26592	
+0x4B43	0x26593	
+0x4B44	0x26594	
+0x4B45	0x26595	
+0x4B46	0x26596	
+0x4B47	0x26597	
+0x4B48	0x26598	
+0x4B4A	0x26599	
+0x4B4B	0x2659A	
+0x4B4C	0x2659B	
+0x4B4D	0x267B7	
+0x4B4E	0x267B8	
+0x4B4F	0x267B9	
+0x4B51	0x267BA	
+0x4B52	0x267BB	
+0x4B53	0x267BD	
+0x4B55	0x267BC	
+0x4B56	0x2F988	
+0x4B57	0x2F987	
+0x4B58	0x268EB	
+0x4B59	0x268EC	
+0x4B5A	0x26916	
+0x4B5B	0x26944	
+0x4B5C	0x269E3	
+0x4B5D	0x26A58	
+0x4B5E	0x26A53	
+0x4B5F	0x26A54	
+0x4B60	0x26AE0	
+0x4B61	0x26DB1	
+0x4B62	0x26DB2	
+0x4B63	0x26DB3	
+0x4B64	0x26DEA	
+0x4B66	0x26DB4	
+0x4B67	0x26DF0	
+0x4B68	0x26DB5	
+0x4B69	0x26DB6	
+0x4B6A	0x26DB7	
+0x4B6B	0x26DB8	
+0x4B6C	0x26DB9	
+0x4B6D	0x26DBA	
+0x4B6E	0x26DBB	
+0x4B6F	0x26DBC	
+0x4B70	0x26DBD	
+0x4B71	0x26DBE	
+0x4B72	0x26DBF	
+0x4B73	0x26DC0	
+0x4B74	0x26DC1	
+0x4B75	0x26DC2	
+0x4B76	0x26DC3	
+0x4B78	0x26DC4	
+0x4B79	0x26DC5	
+0x4B7A	0x26DC6	
+0x4B7B	0x26DFC	
+0x4B7C	0x26DC7	
+0x4B7D	0x26DC8	
+0x4B7E	0x26DC9	
+0x4C21	0x26DCA	
+0x4C22	0x26DCB	
+0x4C23	0x26DCC	
+0x4C24	0x26E84	
+0x4C25	0x26DCD	
+0x4C26	0x26DCE	
+0x4C27	0x26DCF	
+0x4C28	0x26DD0	
+0x4C29	0x26DD1	
+0x4C2A	0x26DD2	
+0x4C2B	0x271CA	
+0x4C2C	0x271CB	
+0x4C2D	0x27336	
+0x4C2E	0x27337	
+0x4C2F	0x2739F	
+0x4C30	0x27338	
+0x4C31	0x27339	
+0x4C32	0x2733A	
+0x4C34	0x276BE	
+0x4C35	0x276F0	
+0x4C36	0x276BF	
+0x4C37	0x276C0	
+0x4C38	0x277F7	
+0x4C39	0x277F8	
+0x4C3A	0x277FA	
+0x4C3B	0x27843	
+0x4C3C	0x27844	
+0x4C3D	0x27A0F	
+0x4C3E	0x27A10	
+0x4C3F	0x27A11	
+0x4C40	0x27A12	
+0x4C42	0x27A13	
+0x4C43	0x27A14	
+0x4C44	0x27A15	
+0x4C45	0x27A16	
+0x4C48	0x27CD3	
+0x4C49	0x27CD7	
+0x4C4B	0x27DB0	
+0x4C4C	0x27D98	
+0x4C4D	0x27D90	
+0x4C4E	0x27D91	
+0x4C4F	0x27D92	
+0x4C50	0x27D97	
+0x4C51	0x27D93	
+0x4C52	0x27E64	
+0x4C53	0x27F01	
+0x4C54	0x27F02	
+0x4C55	0x27F03	
+0x4C56	0x27F04	
+0x4C57	0x27F05	
+0x4C58	0x27F06	
+0x4C59	0x27F07	
+0x4C5A	0x2805A	
+0x4C5B	0x2805B	
+0x4C5C	0x2824E	
+0x4C5D	0x2824F	
+0x4C5E	0x28250	
+0x4C5F	0x28319	
+0x4C60	0x2831A	
+0x4C61	0x2831B	
+0x4C63	0x2831C	
+0x4C65	0x28419	
+0x4C66	0x2841A	
+0x4C68	0x2898A	
+0x4C69	0x2856E	
+0x4C6A	0x2856F	
+0x4C6C	0x28570	
+0x4C6D	0x28571	
+0x4C6E	0x28572	
+0x4C6F	0x28573	
+0x4C70	0x28574	
+0x4C71	0x28575	
+0x4C72	0x28576	
+0x4C73	0x2883A	
+0x4C74	0x2883B	
+0x4C75	0x2883C	
+0x4C76	0x2885A	
+0x4C77	0x2883D	
+0x4C78	0x28842	
+0x4C79	0x2898B	
+0x4C7A	0x289A0	
+0x4C7B	0x2898C	
+0x4C7C	0x2898D	
+0x4C7D	0x2898E	
+0x4C7E	0x289AB	
+0x4D21	0x2898F	
+0x4D23	0x28990	
+0x4D24	0x28991	
+0x4D25	0x28992	
+0x4D26	0x289AA	
+0x4D28	0x28993	
+0x4D29	0x28994	
+0x4D2A	0x2899E	
+0x4D2B	0x289A8	
+0x4D2E	0x28F00	
+0x4D2F	0x28F01	
+0x4D30	0x28F02	
+0x4D31	0x28F03	
+0x4D32	0x28F04	
+0x4D33	0x28F05	
+0x4D34	0x28FC4	
+0x4D35	0x28FC5	
+0x4D37	0x290AE	
+0x4D38	0x290B2	
+0x4D3B	0x291F7	
+0x4D3C	0x29213	
+0x4D3D	0x2939E	
+0x4D3E	0x29485	
+0x4D3F	0x25380	
+0x4D40	0x294C8	
+0x4D41	0x29841	
+0x4D42	0x29881	
+0x4D43	0x29882	
+0x4D44	0x29883	
+0x4D45	0x29884	
+0x4D46	0x29AC4	
+0x4D47	0x29AC5	
+0x4D48	0x29AC6	
+0x4D49	0x29C95	
+0x4D4A	0x29C96	
+0x4D4B	0x29C97	
+0x4D4C	0x29D58	
+0x4D4D	0x29D59	
+0x4D4F	0x29FA9	
+0x4D50	0x29FAA	
+0x4D51	0x29FAB	
+0x4D52	0x2A28E	
+0x4D53	0x2A303	
+0x4D54	0x2A3B3	
+0x4D55	0x20B82	
+0x4D56	0x20053	
+0x4D57	0x20183	
+0x4D58	0x20184	
+0x4D59	0x20185	
+0x4D5A	0x203CC	
+0x4D5B	0x203CD	
+0x4D5C	0x203CE	
+0x4D5D	0x203CF	
+0x4D5E	0x203D0	
+0x4D60	0x203D1	
+0x4D61	0x203D2	
+0x4D62	0x203DA	
+0x4D63	0x204B3	
+0x4D64	0x204B4	
+0x4D66	0x20613	
+0x4D67	0x2060E	
+0x4D68	0x2066B	
+0x4D69	0x20903	
+0x4D6A	0x20961	
+0x4D6B	0x209C1	
+0x4D6C	0x209C2	
+0x4D6D	0x20AB5	
+0x4D6E	0x20140	
+0x4D6F	0x20F98	
+0x4D70	0x20F99	
+0x4D71	0x20F9A	
+0x4D72	0x20F9B	
+0x4D73	0x20F9C	
+0x4D74	0x20F9D	
+0x4D75	0x20F9E	
+0x4D76	0x20F9F	
+0x4D77	0x20FEE	
+0x4D78	0x20FA0	
+0x4D79	0x20FA1	
+0x4D7A	0x20F86	
+0x4D7B	0x21225	
+0x4D7C	0x21434	
+0x4D7D	0x21435	
+0x4D7E	0x21451	
+0x4E21	0x2142D	
+0x4E22	0x24362	
+0x4E23	0x21454	
+0x4E24	0x21452	
+0x4E26	0x21436	
+0x4E27	0x21437	
+0x4E28	0x21438	
+0x4E29	0x21439	
+0x4E2A	0x2143A	
+0x4E2B	0x2143B	
+0x4E2C	0x21468	
+0x4E2D	0x2143C	
+0x4E2F	0x21577	
+0x4E30	0x23296	
+0x4E31	0x2167E	
+0x4E32	0x2167F	
+0x4E33	0x21869	
+0x4E34	0x2186A	
+0x4E35	0x2186B	
+0x4E36	0x2186C	
+0x4E37	0x2186D	
+0x4E38	0x2186E	
+0x4E39	0x2186F	
+0x4E3A	0x2185D	
+0x4E3B	0x21870	
+0x4E3C	0x21885	
+0x4E3D	0x21871	
+0x4E3E	0x21872	
+0x4E3F	0x21873	
+0x4E40	0x21874	
+0x4E41	0x21875	
+0x4E42	0x21876	
+0x4E43	0x21884	
+0x4E44	0x21877	
+0x4E45	0x21883	
+0x4E46	0x2199A	
+0x4E47	0x21AA7	
+0x4E48	0x21AA8	
+0x4E49	0x21AA9	
+0x4E4A	0x21AAA	
+0x4E4B	0x21AAB	
+0x4E4C	0x21AAC	
+0x4E4D	0x21AB7	
+0x4E4E	0x21AAD	
+0x4E4F	0x21AAE	
+0x4E51	0x21B45	
+0x4E52	0x21CD3	
+0x4E53	0x21CD4	
+0x4E54	0x21CD5	
+0x4E55	0x21CD6	
+0x4E56	0x21CD7	
+0x4E57	0x21F26	
+0x4E58	0x21F27	
+0x4E59	0x21F28	
+0x4E5B	0x21F29	
+0x4E5C	0x21F2A	
+0x4E5D	0x22005	
+0x4E5F	0x221D0	
+0x4E60	0x222B7	
+0x4E62	0x222B8	
+0x4E63	0x222B9	
+0x4E64	0x22422	
+0x4E65	0x22423	
+0x4E66	0x22573	
+0x4E67	0x22574	
+0x4E68	0x2288F	
+0x4E69	0x22812	
+0x4E6A	0x22813	
+0x4E6B	0x22814	
+0x4E6C	0x22815	
+0x4E6D	0x22816	
+0x4E6E	0x22817	
+0x4E6F	0x22818	
+0x4E70	0x22861	
+0x4E71	0x22866	
+0x4E72	0x22867	
+0x4E73	0x22819	
+0x4E74	0x22868	
+0x4E75	0x2281A	
+0x4E76	0x22869	
+0x4E77	0x22A04	
+0x4E78	0x22A05	
+0x4E7A	0x22A06	
+0x4E7B	0x229FD	
+0x4E7C	0x22D50	
+0x4E7D	0x22D51	
+0x4E7E	0x22D52	
+0x4F21	0x22D53	
+0x4F22	0x22D54	
+0x4F23	0x22D55	
+0x4F24	0x22D63	
+0x4F25	0x2F8C4	
+0x4F26	0x22D56	
+0x4F27	0x22D57	
+0x4F28	0x22D58	
+0x4F29	0x22D59	
+0x4F2A	0x22D5A	
+0x4F2B	0x22D5B	
+0x4F2D	0x22D5C	
+0x4F2E	0x22D5D	
+0x4F2F	0x22D5E	
+0x4F30	0x22D5F	
+0x4F31	0x22FD7	
+0x4F33	0x23060	
+0x4F34	0x23061	
+0x4F35	0x23117	
+0x4F36	0x23139	
+0x4F37	0x2328F	
+0x4F38	0x232C8	
+0x4F39	0x23290	
+0x4F3A	0x23291	
+0x4F3B	0x23398	
+0x4F3C	0x23399	
+0x4F3D	0x23644	
+0x4F3E	0x23645	
+0x4F3F	0x23646	
+0x4F40	0x23659	
+0x4F41	0x236EE	
+0x4F43	0x23647	
+0x4F44	0x23648	
+0x4F46	0x23649	
+0x4F47	0x2364A	
+0x4F48	0x2364B	
+0x4F49	0x2364C	
+0x4F4A	0x2364D	
+0x4F4B	0x2364E	
+0x4F4C	0x2364F	
+0x4F4D	0x23650	
+0x4F4E	0x23651	
+0x4F4F	0x23652	
+0x4F50	0x23653	
+0x4F51	0x23654	
+0x4F52	0x23655	
+0x4F53	0x23656	
+0x4F54	0x23915	
+0x4F55	0x2399A	
+0x4F56	0x23A58	
+0x4F57	0x23AFC	
+0x4F58	0x23AFD	
+0x4F59	0x23F86	
+0x4F5A	0x23F87	
+0x4F5B	0x23F88	
+0x4F5C	0x23F89	
+0x4F5D	0x23F8A	
+0x4F5E	0x23F8B	
+0x4F5F	0x23F8C	
+0x4F61	0x2401F	
+0x4F62	0x23F8D	
+0x4F63	0x23F8E	
+0x4F64	0x23F8F	
+0x4F65	0x23F90	
+0x4F66	0x23F91	
+0x4F67	0x23F92	
+0x4F68	0x23F93	
+0x4F69	0x2F911	
+0x4F6A	0x23F94	
+0x4F6B	0x23F95	
+0x4F6C	0x23ECA	
+0x4F6D	0x23F18	
+0x4F6F	0x23F96	
+0x4F70	0x23F97	
+0x4F71	0x23F98	
+0x4F72	0x23F99	
+0x4F73	0x23F9A	
+0x4F74	0x23F9B	
+0x4F75	0x23F9C	
+0x4F76	0x23F9D	
+0x4F77	0x23F9E	
+0x4F78	0x23F9F	
+0x4F7B	0x23FA0	
+0x4F7C	0x23FA1	
+0x4F7E	0x23FB7	
+0x5022	0x24396	
+0x5023	0x24368	
+0x5024	0x24369	
+0x5025	0x2438C	
+0x5026	0x2436A	
+0x5027	0x2436B	
+0x5028	0x2436C	
+0x5029	0x2436D	
+0x502A	0x2436E	
+0x502B	0x2436F	
+0x502C	0x2437F	
+0x502D	0x24384	
+0x502E	0x24370	
+0x502F	0x24371	
+0x5030	0x24385	
+0x5031	0x24372	
+0x5032	0x24373	
+0x5033	0x24374	
+0x5034	0x24375	
+0x5035	0x24376	
+0x5037	0x24377	
+0x5038	0x24378	
+0x5039	0x24379	
+0x503A	0x2437A	
+0x503B	0x2437B	
+0x503C	0x2437C	
+0x503D	0x2F91E	
+0x503E	0x24594	
+0x503F	0x246D5	
+0x5040	0x24829	
+0x5041	0x24A2B	
+0x5042	0x24A2C	
+0x5043	0x24A2D	
+0x5044	0x24A2E	
+0x5045	0x24A2F	
+0x5046	0x24A30	
+0x5047	0x24A3E	
+0x5048	0x24A31	
+0x5049	0x24A32	
+0x504A	0x24A33	
+0x504B	0x24A34	
+0x504C	0x24A35	
+0x504D	0x24B11	
+0x504F	0x24CC0	
+0x5050	0x24E42	
+0x5051	0x24E43	
+0x5052	0x24E44	
+0x5053	0x24E45	
+0x5054	0x24E46	
+0x5055	0x2508C	
+0x5056	0x2508D	
+0x5057	0x2508E	
+0x5058	0x2508F	
+0x5059	0x25090	
+0x505A	0x25091	
+0x505B	0x25263	
+0x505C	0x25264	
+0x505D	0x25265	
+0x505F	0x2F94A	
+0x5061	0x253F6	
+0x5062	0x25536	
+0x5063	0x25537	
+0x5064	0x2552C	
+0x5065	0x25538	
+0x5066	0x25539	
+0x5068	0x2553A	
+0x5069	0x256E3	
+0x506A	0x256E2	
+0x506B	0x256F5	
+0x506C	0x25847	
+0x506E	0x25848	
+0x506F	0x25849	
+0x5070	0x2584A	
+0x5071	0x2584B	
+0x5072	0x2584C	
+0x5073	0x25AA8	
+0x5074	0x25AA9	
+0x5075	0x25AAA	
+0x5077	0x25C0B	
+0x5078	0x25C06	
+0x5079	0x25C73	
+0x507A	0x25C0C	
+0x507B	0x25C0D	
+0x507C	0x25C0E	
+0x507D	0x25C0F	
+0x507E	0x25C10	
+0x5122	0x25C11	
+0x5123	0x2F962	
+0x5124	0x25C12	
+0x5125	0x25C14	
+0x5126	0x25C15	
+0x5127	0x25C16	
+0x5129	0x25C13	
+0x512A	0x25C17	
+0x512B	0x25ED9	
+0x512C	0x25EDA	
+0x512D	0x25EDB	
+0x512F	0x25EDC	
+0x5130	0x260A6	
+0x5131	0x260A7	
+0x5132	0x260A8	
+0x5133	0x260A9	
+0x5134	0x260AA	
+0x5135	0x260AB	
+0x5137	0x2F96D	
+0x5138	0x260AC	
+0x5139	0x260AD	
+0x513A	0x260AE	
+0x513D	0x260AF	
+0x513E	0x260B0	
+0x513F	0x260B1	
+0x5140	0x26244	
+0x5141	0x26245	
+0x5142	0x262F7	
+0x5143	0x262F8	
+0x5144	0x2646B	
+0x5145	0x2646C	
+0x5146	0x26461	
+0x5147	0x26512	
+0x5148	0x265AF	
+0x5149	0x265B0	
+0x514A	0x265B1	
+0x514B	0x265B2	
+0x514C	0x265B3	
+0x514D	0x265B4	
+0x514E	0x265B5	
+0x514F	0x265B6	
+0x5150	0x26622	
+0x5151	0x267EA	
+0x5152	0x267EB	
+0x5153	0x267EC	
+0x5154	0x267ED	
+0x5156	0x268ED	
+0x5157	0x2691B	
+0x5158	0x26947	
+0x5159	0x269E8	
+0x515A	0x26AD0	
+0x515B	0x26AE7	
+0x515C	0x26AE8	
+0x515D	0x26AE9	
+0x515E	0x26E4E	
+0x515F	0x26E4F	
+0x5160	0x26E50	
+0x5161	0x26E72	
+0x5162	0x26E51	
+0x5163	0x26E52	
+0x5164	0x2F9A7	
+0x5166	0x26E53	
+0x5167	0x26E54	
+0x5168	0x26E55	
+0x5169	0x26E56	
+0x516A	0x26E57	
+0x516B	0x26E77	
+0x516C	0x26E58	
+0x516D	0x26E59	
+0x516E	0x26E5A	
+0x516F	0x26E5B	
+0x5170	0x26E5C	
+0x5171	0x26E6E	
+0x5172	0x26E5D	
+0x5175	0x26E5E	
+0x5177	0x26E5F	
+0x5179	0x271D7	
+0x517A	0x27389	
+0x517B	0x2738A	
+0x517D	0x2F9BE	
+0x517E	0x2738B	
+0x5221	0x2738C	
+0x5222	0x2738D	
+0x5223	0x2738E	
+0x5224	0x2F9BC	
+0x5225	0x2738F	
+0x5227	0x2739A	
+0x5228	0x27390	
+0x5229	0x27391	
+0x522A	0x27392	
+0x522B	0x27393	
+0x522C	0x27712	
+0x522D	0x276F1	
+0x522F	0x277FE	
+0x5230	0x277FB	
+0x5231	0x27857	
+0x5232	0x27A49	
+0x5233	0x27A4A	
+0x5234	0x27A4B	
+0x5235	0x27A4C	
+0x5237	0x27A4D	
+0x5238	0x27A59	
+0x5239	0x27A4E	
+0x523A	0x27A4F	
+0x523B	0x27BF4	
+0x523C	0x27C65	
+0x523D	0x27DA6	
+0x523E	0x27DA7	
+0x523F	0x27DA8	
+0x5240	0x27F22	
+0x5241	0x27F23	
+0x5242	0x2808B	
+0x5243	0x2808C	
+0x5244	0x2808D	
+0x5245	0x2808E	
+0x5246	0x28258	
+0x5248	0x28259	
+0x5249	0x2833B	
+0x524A	0x2833C	
+0x524B	0x2833D	
+0x524C	0x2833E	
+0x524D	0x28448	
+0x524E	0x28594	
+0x524F	0x28595	
+0x5250	0x28596	
+0x5251	0x28597	
+0x5252	0x28598	
+0x5253	0x2877D	
+0x5254	0x286FE	
+0x5255	0x2877E	
+0x5256	0x2877F	
+0x5258	0x2885B	
+0x5259	0x2885C	
+0x525A	0x289E4	
+0x525B	0x289C1	
+0x525C	0x289FD	
+0x525D	0x289C2	
+0x525E	0x289D6	
+0x525F	0x289C3	
+0x5260	0x289C4	
+0x5262	0x289DC	
+0x5263	0x289C5	
+0x5264	0x289C6	
+0x5265	0x289C7	
+0x5266	0x289E1	
+0x5267	0x289C8	
+0x5268	0x289C9	
+0x5269	0x289CA	
+0x526A	0x289CB	
+0x526C	0x289CC	
+0x526D	0x289CD	
+0x526E	0x28D35	
+0x526F	0x28D36	
+0x5270	0x28D47	
+0x5271	0x28D37	
+0x5272	0x28F1B	
+0x5273	0x28F1C	
+0x5274	0x28F1D	
+0x5275	0x28F1E	
+0x5276	0x28F1F	
+0x5277	0x28F20	
+0x5278	0x28F7B	
+0x5279	0x28F7A	
+0x527A	0x28FFE	
+0x527B	0x290C6	
+0x527C	0x290C7	
+0x527D	0x290C8	
+0x527E	0x290C9	
+0x5321	0x290CA	
+0x5323	0x294A0	
+0x5324	0x294A1	
+0x5325	0x295CC	
+0x5326	0x295CD	
+0x5327	0x296F1	
+0x5328	0x296D7	
+0x5329	0x29842	
+0x532A	0x29846	
+0x532B	0x298A3	
+0x532C	0x298A5	
+0x532D	0x298A6	
+0x532E	0x29ACB	
+0x532F	0x29ACC	
+0x5330	0x29B26	
+0x5331	0x29B27	
+0x5332	0x29B28	
+0x5333	0x29B29	
+0x5334	0x29CAE	
+0x5335	0x29CAF	
+0x5336	0x29CB0	
+0x5337	0x29D73	
+0x5339	0x29D7C	
+0x533A	0x29D74	
+0x533C	0x29F80	
+0x533D	0x29D75	
+0x5340	0x29FCF	
+0x5342	0x2A38F	
+0x5343	0x20670	
+0x5344	0x20085	
+0x5345	0x20397	
+0x5346	0x203F6	
+0x5347	0x203F7	
+0x5348	0x203F8	
+0x5349	0x203FA	
+0x534A	0x203FB	
+0x534B	0x204BA	
+0x534C	0x204BB	
+0x534D	0x204BC	
+0x534E	0x204BD	
+0x534F	0x20534	
+0x5350	0x20535	
+0x5351	0x205A2	
+0x5352	0x20614	
+0x5353	0x20611	
+0x5354	0x2066E	
+0x5355	0x2066F	
+0x5356	0x20808	
+0x5357	0x208B8	
+0x5358	0x20A09	
+0x5359	0x20ABD	
+0x535A	0x20ABE	
+0x535B	0x20B88	
+0x535C	0x20FFE	
+0x535E	0x20FFF	
+0x535F	0x21000	
+0x5360	0x21001	
+0x5361	0x21002	
+0x5362	0x21003	
+0x5363	0x21004	
+0x5364	0x21005	
+0x5365	0x21006	
+0x5367	0x21007	
+0x5368	0x21008	
+0x5369	0x21009	
+0x536A	0x2100A	
+0x536B	0x2100B	
+0x536C	0x2100C	
+0x536D	0x2100D	
+0x536E	0x2100E	
+0x536F	0x2100F	
+0x5373	0x2122C	
+0x5374	0x2146B	
+0x5376	0x2146C	
+0x5377	0x21487	
+0x5378	0x2146D	
+0x5379	0x21578	
+0x537A	0x2168B	
+0x537B	0x218A4	
+0x537C	0x218A5	
+0x537D	0x218A6	
+0x537E	0x218A7	
+0x5421	0x218BE	
+0x5422	0x218A8	
+0x5423	0x218A9	
+0x5424	0x218AA	
+0x5425	0x2188D	
+0x5426	0x218AB	
+0x5427	0x218AC	
+0x5428	0x218BF	
+0x542B	0x218AD	
+0x542C	0x218AE	
+0x542D	0x219A4	
+0x542E	0x219A5	
+0x542F	0x21AC7	
+0x5430	0x21AC8	
+0x5431	0x21AC9	
+0x5432	0x27DBC	
+0x5433	0x21ACA	
+0x5434	0x21ACB	
+0x5435	0x21ACC	
+0x5436	0x21ACD	
+0x5437	0x21ACE	
+0x5438	0x21C19	
+0x5439	0x21CE6	
+0x543A	0x21F4C	
+0x543B	0x21F4D	
+0x543C	0x21F4E	
+0x543D	0x22006	
+0x543F	0x222CD	
+0x5440	0x222CE	
+0x5441	0x222CF	
+0x5442	0x222D0	
+0x5444	0x22581	
+0x5445	0x22582	
+0x5446	0x20533	
+0x5447	0x2286A	
+0x5448	0x2286B	
+0x5449	0x228B2	
+0x544A	0x2286C	
+0x544B	0x2286D	
+0x544C	0x228CC	
+0x544D	0x228AE	
+0x544E	0x228B3	
+0x544F	0x22891	
+0x5451	0x2286E	
+0x5452	0x228B4	
+0x5453	0x2286F	
+0x5454	0x22DC9	
+0x5455	0x22DA7	
+0x5456	0x22DA8	
+0x5457	0x22DA9	
+0x5458	0x22DAA	
+0x5459	0x22DAB	
+0x545A	0x22DAC	
+0x545B	0x22DAD	
+0x545C	0x22DAE	
+0x545D	0x22DAF	
+0x545E	0x22DB0	
+0x545F	0x22D60	
+0x5460	0x22DB1	
+0x5461	0x22EE1	
+0x5462	0x22FE3	
+0x5463	0x22FF6	
+0x5465	0x232AF	
+0x5466	0x232B0	
+0x5467	0x232B1	
+0x5468	0x232BA	
+0x5469	0x232B2	
+0x546A	0x232B3	
+0x546B	0x2334C	
+0x546D	0x233A0	
+0x546E	0x233A1	
+0x546F	0x236B0	
+0x5470	0x236B1	
+0x5471	0x236B2	
+0x5472	0x236B3	
+0x5473	0x236B4	
+0x5474	0x2F8EB	
+0x5475	0x236B5	
+0x5476	0x236B6	
+0x5477	0x236B7	
+0x5478	0x236B8	
+0x5479	0x236B9	
+0x547A	0x236BA	
+0x547C	0x236BB	
+0x547D	0x236BC	
+0x547E	0x236BD	
+0x5521	0x236BE	
+0x5522	0x236BF	
+0x5523	0x236DF	
+0x5524	0x236C0	
+0x5525	0x236C1	
+0x5526	0x236C2	
+0x5527	0x236C3	
+0x5528	0x236C4	
+0x552B	0x236C5	
+0x552C	0x236C6	
+0x552D	0x236C7	
+0x552E	0x236C8	
+0x552F	0x236C9	
+0x5530	0x236CA	
+0x5531	0x2373C	
+0x5532	0x236CB	
+0x5533	0x236CC	
+0x5534	0x236CD	
+0x5535	0x236CE	
+0x5536	0x236CF	
+0x5537	0x236D0	
+0x5538	0x236D1	
+0x553A	0x2391D	
+0x553B	0x2391E	
+0x553C	0x23A64	
+0x553D	0x23A65	
+0x553E	0x23AC5	
+0x553F	0x23AC6	
+0x5540	0x23AC7	
+0x5541	0x23AFF	
+0x5542	0x23BFF	
+0x5543	0x23C00	
+0x5544	0x23C01	
+0x5545	0x23C02	
+0x5546	0x23FF5	
+0x5547	0x2405C	
+0x5548	0x23FF6	
+0x5549	0x23FF7	
+0x554A	0x23FB0	
+0x554B	0x23FF8	
+0x554C	0x23FF9	
+0x554D	0x2405D	
+0x554E	0x24050	
+0x554F	0x23FFA	
+0x5550	0x23FFB	
+0x5551	0x23FA2	
+0x5552	0x23FFC	
+0x5553	0x23FFD	
+0x5554	0x23FFE	
+0x5555	0x23FFF	
+0x5556	0x2F913	
+0x5557	0x24000	
+0x5558	0x2F91F	
+0x5559	0x243C1	
+0x555A	0x243C2	
+0x555B	0x243C3	
+0x555C	0x243C4	
+0x555D	0x243C5	
+0x555E	0x243C6	
+0x555F	0x243C7	
+0x5560	0x243C8	
+0x5561	0x243C9	
+0x5562	0x243CA	
+0x5563	0x243CB	
+0x5564	0x290EF	
+0x5565	0x243D7	
+0x5566	0x243CC	
+0x5567	0x243CD	
+0x5568	0x243CE	
+0x5569	0x24422	
+0x556A	0x243CF	
+0x556B	0x243D0	
+0x556D	0x243D1	
+0x556E	0x243D2	
+0x556F	0x243E9	
+0x5570	0x243D3	
+0x5571	0x243D4	
+0x5572	0x243D5	
+0x5573	0x24538	
+0x5574	0x2103B	
+0x5575	0x2487D	
+0x5576	0x2056F	
+0x5577	0x248A1	
+0x5578	0x24A53	
+0x5579	0x24A54	
+0x557B	0x24A55	
+0x557C	0x24A3C	
+0x557D	0x24A56	
+0x5621	0x24A66	
+0x5623	0x24A57	
+0x5624	0x24A58	
+0x5625	0x24A59	
+0x5626	0x24A5A	
+0x5627	0x24A5B	
+0x5628	0x24A67	
+0x5629	0x24A5C	
+0x562C	0x24A6A	
+0x562D	0x24A5D	
+0x562E	0x24A3D	
+0x562F	0x24A5E	
+0x5630	0x24A65	
+0x5631	0x24CE1	
+0x5632	0x24CCD	
+0x5633	0x2A011	
+0x5634	0x24E6F	
+0x5635	0x24E70	
+0x5636	0x2501A	
+0x5637	0x2509A	
+0x5638	0x2509B	
+0x5639	0x2509C	
+0x563A	0x2509E	
+0x563B	0x2509F	
+0x563C	0x2F93F	
+0x563D	0x2528E	
+0x563F	0x253FD	
+0x5641	0x2555E	
+0x5642	0x2555F	
+0x5643	0x25560	
+0x5644	0x25565	
+0x5645	0x25567	
+0x5646	0x25568	
+0x5647	0x25569	
+0x5649	0x2556A	
+0x564A	0x2558F	
+0x564B	0x2556B	
+0x564C	0x2556C	
+0x564D	0x2556D	
+0x564E	0x256F7	
+0x564F	0x256F8	
+0x5650	0x256F9	
+0x5651	0x256E4	
+0x5652	0x256FA	
+0x5653	0x258B1	
+0x5654	0x25875	
+0x5655	0x25876	
+0x5656	0x259FF	
+0x5657	0x25A00	
+0x5658	0x25A01	
+0x5659	0x25A02	
+0x565A	0x25A03	
+0x565B	0x25AAE	
+0x565C	0x25AAD	
+0x565D	0x25C51	
+0x565E	0x25C52	
+0x5660	0x25C53	
+0x5661	0x25C54	
+0x5662	0x25C55	
+0x5663	0x25C56	
+0x5664	0x25C57	
+0x5665	0x25C58	
+0x5666	0x25C59	
+0x5667	0x25C5A	
+0x5668	0x25C5B	
+0x5669	0x25C5C	
+0x566A	0x25C5D	
+0x566B	0x25C5E	
+0x566C	0x25C5F	
+0x566D	0x25C60	
+0x566E	0x25C61	
+0x566F	0x25C62	
+0x5670	0x25C63	
+0x5671	0x25C64	
+0x5672	0x25C4C	
+0x5673	0x25C66	
+0x5674	0x25EF1	
+0x5675	0x25EF2	
+0x5676	0x260F2	
+0x5677	0x260F3	
+0x5678	0x260F4	
+0x5679	0x260F5	
+0x567A	0x260F6	
+0x567B	0x260F7	
+0x567C	0x260F8	
+0x567D	0x260F9	
+0x567E	0x260FA	
+0x5721	0x2624C	
+0x5722	0x2624B	
+0x5723	0x2631B	
+0x5724	0x263CE	
+0x5725	0x263B3	
+0x5726	0x2647F	
+0x5727	0x2F979	
+0x5728	0x2F97C	
+0x5729	0x2651A	
+0x572A	0x265C4	
+0x572B	0x265C5	
+0x572C	0x265C6	
+0x572D	0x265C7	
+0x572E	0x265C8	
+0x572F	0x265C9	
+0x5731	0x26819	
+0x5732	0x2681C	
+0x5733	0x2681A	
+0x5734	0x2694C	
+0x5735	0x2698E	
+0x5736	0x26A7E	
+0x5737	0x26EEB	
+0x5738	0x26EEC	
+0x5739	0x26EED	
+0x573A	0x26EEE	
+0x573B	0x26EEF	
+0x573C	0x26EF0	
+0x573D	0x26EF1	
+0x573E	0x26ED8	
+0x573F	0x26ED9	
+0x5740	0x26EDA	
+0x5741	0x26EDB	
+0x5742	0x26EF2	
+0x5743	0x26EF3	
+0x5744	0x26EF4	
+0x5745	0x26F07	
+0x5747	0x2F9AC	
+0x5749	0x26EF5	
+0x574A	0x26F15	
+0x574C	0x26EF6	
+0x574D	0x26EF7	
+0x574E	0x26EF8	
+0x574F	0x26EF9	
+0x5750	0x26EFA	
+0x5751	0x26EFB	
+0x5752	0x26EFC	
+0x5753	0x26EFD	
+0x5754	0x26EFE	
+0x5755	0x26FA7	
+0x5756	0x26EFF	
+0x5757	0x26F00	
+0x5758	0x26F01	
+0x5759	0x26F02	
+0x575A	0x26F03	
+0x575B	0x26F04	
+0x575C	0x26F05	
+0x575D	0x271E9	
+0x575E	0x271EA	
+0x575F	0x271EB	
+0x5760	0x273DE	
+0x5761	0x273DF	
+0x5763	0x273E0	
+0x5764	0x273E1	
+0x5765	0x273E2	
+0x5766	0x273E3	
+0x5767	0x2773E	
+0x5768	0x2773F	
+0x5769	0x27740	
+0x576A	0x27741	
+0x576B	0x27871	
+0x576C	0x27872	
+0x576D	0x27873	
+0x576E	0x27A88	
+0x576F	0x27A89	
+0x5770	0x27A8A	
+0x5771	0x27A8B	
+0x5772	0x27A8C	
+0x5773	0x27A8D	
+0x5774	0x27A8E	
+0x5775	0x27A8F	
+0x5776	0x27A90	
+0x5777	0x27A91	
+0x5778	0x27A92	
+0x577A	0x27CF1	
+0x577B	0x27DBE	
+0x577C	0x27DBF	
+0x577D	0x27DC0	
+0x577E	0x27DC1	
+0x5821	0x27DC2	
+0x5822	0x27DC3	
+0x5823	0x27E6E	
+0x5824	0x27F37	
+0x5825	0x27F57	
+0x5826	0x27F38	
+0x5827	0x27F39	
+0x5828	0x27F3A	
+0x5829	0x27F3B	
+0x582A	0x27F3C	
+0x582B	0x27F3D	
+0x582C	0x27F3E	
+0x582D	0x27F27	
+0x582E	0x27F3F	
+0x5831	0x280C0	
+0x5832	0x280C1	
+0x5834	0x28267	
+0x5836	0x28268	
+0x5837	0x28358	
+0x5838	0x28365	
+0x5839	0x28359	
+0x583A	0x2835A	
+0x583B	0x28424	
+0x583C	0x285CD	
+0x583D	0x285CE	
+0x583E	0x285CF	
+0x583F	0x285D2	
+0x5840	0x2879F	
+0x5841	0x28722	
+0x5842	0x2887D	
+0x5843	0x2887E	
+0x5844	0x289FF	
+0x5845	0x28A25	
+0x5846	0x28A00	
+0x5847	0x28A01	
+0x5849	0x28A02	
+0x584A	0x28A03	
+0x584B	0x28A04	
+0x584D	0x28A05	
+0x584E	0x28A06	
+0x584F	0x28A07	
+0x5850	0x28A16	
+0x5851	0x28A08	
+0x5852	0x28A17	
+0x5853	0x28A09	
+0x5854	0x28A0A	
+0x5856	0x28A0B	
+0x5857	0x28A0C	
+0x5858	0x28A29	
+0x585A	0x28A0D	
+0x585C	0x28A0E	
+0x585D	0x28A10	
+0x585E	0x28A11	
+0x585F	0x28A1D	
+0x5860	0x28A12	
+0x5861	0x28A13	
+0x5863	0x28A14	
+0x5864	0x28A15	
+0x5865	0x28C8D	
+0x5866	0x28D54	
+0x5867	0x28D55	
+0x5868	0x28D56	
+0x5869	0x28F33	
+0x586A	0x28F34	
+0x586B	0x28F35	
+0x586C	0x28F36	
+0x586D	0x28FFA	
+0x586E	0x290E3	
+0x586F	0x290E6	
+0x5870	0x290ED	
+0x5871	0x290E7	
+0x5872	0x290E8	
+0x5873	0x290E9	
+0x5874	0x290EA	
+0x5875	0x290EB	
+0x5876	0x29227	
+0x5877	0x29220	
+0x5878	0x2F9F8	
+0x5879	0x2942A	
+0x587A	0x294C9	
+0x587C	0x294CA	
+0x587D	0x294CB	
+0x587E	0x294D9	
+0x5921	0x294CC	
+0x5922	0x294CD	
+0x5923	0x294CE	
+0x5925	0x295E1	
+0x5926	0x2971B	
+0x5927	0x2971C	
+0x5928	0x2971D	
+0x5929	0x2971E	
+0x592A	0x29847	
+0x592B	0x298D1	
+0x592C	0x298C9	
+0x592D	0x29AD0	
+0x592E	0x29AD1	
+0x592F	0x29B3F	
+0x5930	0x29B40	
+0x5931	0x29B41	
+0x5932	0x2FA09	
+0x5933	0x29B42	
+0x5934	0x29CC4	
+0x5935	0x29D9B	
+0x5936	0x29D92	
+0x5937	0x29D93	
+0x5939	0x29D94	
+0x593A	0x29D95	
+0x593D	0x29FF3	
+0x593E	0x29FF4	
+0x593F	0x29FF5	
+0x5940	0x29FF6	
+0x5941	0x2A260	
+0x5942	0x2A29E	
+0x5943	0x2A2A0	
+0x5944	0x2A2A1	
+0x5945	0x2A31C	
+0x5946	0x2A39F	
+0x5947	0x20056	
+0x5948	0x20412	
+0x5949	0x2041F	
+0x594A	0x20415	
+0x594B	0x20416	
+0x594C	0x20417	
+0x594D	0x2F80C	
+0x594E	0x20418	
+0x594F	0x204C2	
+0x5950	0x204C3	
+0x5951	0x204C4	
+0x5952	0x205A1	
+0x5953	0x2061B	
+0x5954	0x2061C	
+0x5955	0x20671	
+0x5956	0x20813	
+0x5957	0x20B17	
+0x5958	0x20B8F	
+0x5959	0x2105F	
+0x595A	0x21060	
+0x595B	0x210AC	
+0x595E	0x21061	
+0x595F	0x21062	
+0x5960	0x21063	
+0x5961	0x21064	
+0x5962	0x21065	
+0x5964	0x21499	
+0x5965	0x2149A	
+0x5966	0x2149B	
+0x5967	0x2149C	
+0x5968	0x2149D	
+0x5969	0x2149E	
+0x596A	0x2149F	
+0x596B	0x214A0	
+0x596C	0x218DA	
+0x596D	0x218DB	
+0x596E	0x218DC	
+0x596F	0x218DD	
+0x5970	0x218DE	
+0x5971	0x218DF	
+0x5972	0x21AD5	
+0x5973	0x21AD6	
+0x5974	0x21AD7	
+0x5975	0x21AD8	
+0x5976	0x21AE0	
+0x5977	0x21BB4	
+0x5979	0x21F6E	
+0x597A	0x21F6F	
+0x597B	0x21F70	
+0x597C	0x22163	
+0x597E	0x222D5	
+0x5A21	0x222D6	
+0x5A22	0x222D7	
+0x5A23	0x222D8	
+0x5A24	0x22430	
+0x5A25	0x228B5	
+0x5A26	0x228B6	
+0x5A27	0x228C1	
+0x5A28	0x228F7	
+0x5A2A	0x228CB	
+0x5A2B	0x228E8	
+0x5A2D	0x228E9	
+0x5A2E	0x228B7	
+0x5A2F	0x22A15	
+0x5A30	0x22DE6	
+0x5A31	0x22DE7	
+0x5A32	0x22DE8	
+0x5A33	0x22DE9	
+0x5A34	0x22DEA	
+0x5A35	0x22DEB	
+0x5A36	0x2F8CA	
+0x5A37	0x2300B	
+0x5A38	0x2300C	
+0x5A39	0x23064	
+0x5A3A	0x232D4	
+0x5A3B	0x232D5	
+0x5A3C	0x232D6	
+0x5A3D	0x232D8	
+0x5A3E	0x233A5	
+0x5A3F	0x2005B	
+0x5A40	0x2370F	
+0x5A41	0x23710	
+0x5A43	0x23711	
+0x5A44	0x23712	
+0x5A45	0x23713	
+0x5A46	0x23714	
+0x5A47	0x23715	
+0x5A48	0x23716	
+0x5A49	0x23717	
+0x5A4A	0x23718	
+0x5A4B	0x23719	
+0x5A4C	0x2371A	
+0x5A4D	0x2372F	
+0x5A4E	0x2371B	
+0x5A4F	0x2371C	
+0x5A50	0x2373F	
+0x5A51	0x2371D	
+0x5A52	0x2371E	
+0x5A53	0x2372C	
+0x5A54	0x2371F	
+0x5A55	0x23924	
+0x5A56	0x239A4	
+0x5A57	0x239A5	
+0x5A58	0x26251	
+0x5A59	0x23AFE	
+0x5A5A	0x23C11	
+0x5A5B	0x23C12	
+0x5A5C	0x23C13	
+0x5A5D	0x23C54	
+0x5A5E	0x2405E	
+0x5A5F	0x24021	
+0x5A60	0x2403F	
+0x5A61	0x24040	
+0x5A62	0x24041	
+0x5A63	0x24042	
+0x5A64	0x24043	
+0x5A65	0x24044	
+0x5A66	0x24020	
+0x5A67	0x24045	
+0x5A69	0x24046	
+0x5A6A	0x240B0	
+0x5A6B	0x24047	
+0x5A6C	0x24057	
+0x5A6D	0x24001	
+0x5A6E	0x240B1	
+0x5A6F	0x2405A	
+0x5A70	0x24048	
+0x5A71	0x24404	
+0x5A72	0x24405	
+0x5A74	0x2444F	
+0x5A75	0x24450	
+0x5A76	0x24406	
+0x5A77	0x24407	
+0x5A78	0x24408	
+0x5A79	0x24409	
+0x5A7A	0x2440A	
+0x5A7B	0x2440B	
+0x5A7C	0x2440C	
+0x5A7D	0x2440D	
+0x5A7E	0x2440E	
+0x5B21	0x2440F	
+0x5B22	0x24410	
+0x5B23	0x24411	
+0x5B24	0x24533	
+0x5B25	0x24534	
+0x5B26	0x24535	
+0x5B27	0x245FC	
+0x5B28	0x245FD	
+0x5B29	0x248B0	
+0x5B2A	0x248B1	
+0x5B2B	0x248B2	
+0x5B2C	0x248B3	
+0x5B2E	0x24A7B	
+0x5B2F	0x24A7C	
+0x5B30	0x24A7D	
+0x5B31	0x24A7E	
+0x5B32	0x24A7F	
+0x5B33	0x24A80	
+0x5B34	0x24A81	
+0x5B35	0x24A82	
+0x5B36	0x24BF9	
+0x5B37	0x24CDA	
+0x5B38	0x24EA1	
+0x5B3B	0x250AD	
+0x5B3C	0x250AE	
+0x5B3E	0x252C8	
+0x5B3F	0x252C9	
+0x5B40	0x252CA	
+0x5B41	0x25582	
+0x5B42	0x25583	
+0x5B43	0x25584	
+0x5B44	0x25585	
+0x5B45	0x25586	
+0x5B46	0x25587	
+0x5B47	0x25588	
+0x5B48	0x25589	
+0x5B49	0x2558A	
+0x5B4B	0x25707	
+0x5B4C	0x25708	
+0x5B4D	0x25701	
+0x5B4E	0x25709	
+0x5B4F	0x25702	
+0x5B50	0x2570A	
+0x5B51	0x2570B	
+0x5B52	0x2570C	
+0x5B53	0x258A7	
+0x5B54	0x25898	
+0x5B55	0x25899	
+0x5B56	0x2589A	
+0x5B57	0x2589B	
+0x5B58	0x2589C	
+0x5B5A	0x2589D	
+0x5B5B	0x25A1A	
+0x5B5C	0x25AB2	
+0x5B5D	0x25CB0	
+0x5B5E	0x25CB1	
+0x5B60	0x25CB2	
+0x5B61	0x25CB3	
+0x5B62	0x25CB4	
+0x5B63	0x25CB5	
+0x5B64	0x25CB6	
+0x5B65	0x25CC0	
+0x5B66	0x25CB7	
+0x5B67	0x25CB8	
+0x5B68	0x25CB9	
+0x5B69	0x25CBA	
+0x5B6A	0x25D1D	
+0x5B6B	0x25F0C	
+0x5B6C	0x25F0D	
+0x5B6D	0x25F0E	
+0x5B6E	0x25F35	
+0x5B6F	0x25F0F	
+0x5B70	0x25F10	
+0x5B71	0x25F11	
+0x5B72	0x25F12	
+0x5B73	0x26122	
+0x5B74	0x26123	
+0x5B75	0x26124	
+0x5B77	0x26125	
+0x5B78	0x26126	
+0x5B79	0x26127	
+0x5B7A	0x26128	
+0x5B7B	0x26129	
+0x5B7C	0x2612A	
+0x5B7D	0x2612B	
+0x5B7E	0x2612C	
+0x5C21	0x2612D	
+0x5C22	0x2612E	
+0x5C23	0x26252	
+0x5C24	0x26253	
+0x5C25	0x26319	
+0x5C26	0x263BF	
+0x5C27	0x2648B	
+0x5C28	0x2648C	
+0x5C29	0x26523	
+0x5C2A	0x26524	
+0x5C2B	0x265F1	
+0x5C2C	0x265D8	
+0x5C2D	0x2F97F	
+0x5C2E	0x2684E	
+0x5C2F	0x2684F	
+0x5C30	0x26855	
+0x5C31	0x26850	
+0x5C32	0x26851	
+0x5C33	0x26852	
+0x5C34	0x26853	
+0x5C35	0x26802	
+0x5C36	0x26854	
+0x5C37	0x268F1	
+0x5C38	0x26924	
+0x5C39	0x26AD1	
+0x5C3A	0x26F7C	
+0x5C3B	0x26F7D	
+0x5C3C	0x26F7E	
+0x5C3D	0x26F7F	
+0x5C3E	0x26F80	
+0x5C3F	0x26F9F	
+0x5C40	0x26F81	
+0x5C41	0x26F82	
+0x5C42	0x26F83	
+0x5C43	0x26F84	
+0x5C44	0x26F85	
+0x5C45	0x26F86	
+0x5C46	0x26F87	
+0x5C47	0x26F88	
+0x5C48	0x26F9B	
+0x5C49	0x26F89	
+0x5C4A	0x26F8A	
+0x5C4B	0x26F8B	
+0x5C4C	0x26F8C	
+0x5C4E	0x26FA1	
+0x5C4F	0x26F8D	
+0x5C50	0x26F8E	
+0x5C51	0x271F3	
+0x5C52	0x271F4	
+0x5C53	0x271F5	
+0x5C54	0x27424	
+0x5C55	0x27425	
+0x5C56	0x27426	
+0x5C57	0x27427	
+0x5C58	0x27428	
+0x5C59	0x27429	
+0x5C5A	0x2742A	
+0x5C5C	0x2742B	
+0x5C5D	0x275CD	
+0x5C5E	0x27601	
+0x5C5F	0x2258D	
+0x5C60	0x27770	
+0x5C61	0x27880	
+0x5C62	0x27881	
+0x5C63	0x27AC0	
+0x5C64	0x27AC1	
+0x5C65	0x27AC2	
+0x5C66	0x27AC3	
+0x5C67	0x27AC4	
+0x5C68	0x27AC5	
+0x5C69	0x27AC6	
+0x5C6A	0x27AC7	
+0x5C6B	0x27AC8	
+0x5C6C	0x27CFE	
+0x5C6E	0x27DD9	
+0x5C6F	0x27DDC	
+0x5C70	0x27DDA	
+0x5C71	0x27E75	
+0x5C72	0x27F58	
+0x5C73	0x27F59	
+0x5C74	0x27F5A	
+0x5C75	0x27F5B	
+0x5C76	0x27F5C	
+0x5C77	0x280EC	
+0x5C79	0x280F3	
+0x5C7A	0x28272	
+0x5C7B	0x28273	
+0x5C7C	0x28382	
+0x5C7D	0x28383	
+0x5C7E	0x2842A	
+0x5D21	0x2842B	
+0x5D22	0x2842C	
+0x5D23	0x2842D	
+0x5D24	0x285F6	
+0x5D25	0x28600	
+0x5D26	0x285F7	
+0x5D27	0x285F8	
+0x5D28	0x285F9	
+0x5D2A	0x28894	
+0x5D2B	0x28895	
+0x5D2C	0x28896	
+0x5D2D	0x2891B	
+0x5D2E	0x28A86	
+0x5D2F	0x28A4C	
+0x5D30	0x28A4D	
+0x5D31	0x28A83	
+0x5D33	0x28A82	
+0x5D34	0x28A4E	
+0x5D35	0x28A4F	
+0x5D36	0x28A50	
+0x5D37	0x28A51	
+0x5D38	0x28A81	
+0x5D3A	0x28A52	
+0x5D3B	0x28A53	
+0x5D3C	0x28A54	
+0x5D3D	0x28A55	
+0x5D3F	0x28A56	
+0x5D40	0x28A57	
+0x5D42	0x28A58	
+0x5D43	0x28A5B	
+0x5D44	0x28A5C	
+0x5D45	0x28A5D	
+0x5D46	0x28A5E	
+0x5D47	0x28A5F	
+0x5D48	0x28A60	
+0x5D49	0x28A61	
+0x5D4A	0x28A7C	
+0x5D4B	0x28A62	
+0x5D4E	0x28A63	
+0x5D4F	0x28A64	
+0x5D50	0x28D73	
+0x5D51	0x28F45	
+0x5D52	0x28F46	
+0x5D53	0x28F47	
+0x5D54	0x28F4C	
+0x5D55	0x29012	
+0x5D57	0x29013	
+0x5D58	0x29139	
+0x5D59	0x29103	
+0x5D5A	0x2910D	
+0x5D5B	0x29230	
+0x5D5C	0x292D5	
+0x5D5D	0x293C0	
+0x5D5E	0x294F2	
+0x5D5F	0x294F3	
+0x5D60	0x294F4	
+0x5D61	0x294F5	
+0x5D62	0x294F6	
+0x5D63	0x294F7	
+0x5D64	0x295FA	
+0x5D65	0x295FB	
+0x5D66	0x29745	
+0x5D67	0x29746	
+0x5D68	0x29849	
+0x5D69	0x298E7	
+0x5D6A	0x298E8	
+0x5D6B	0x29AD8	
+0x5D6C	0x29AD9	
+0x5D6D	0x29B55	
+0x5D6E	0x29B56	
+0x5D6F	0x29B57	
+0x5D70	0x29CDA	
+0x5D71	0x29CDB	
+0x5D72	0x29CDC	
+0x5D73	0x29DB8	
+0x5D74	0x29DB9	
+0x5D75	0x29DBA	
+0x5D77	0x29DBB	
+0x5D78	0x29F89	
+0x5D79	0x29DBC	
+0x5D7A	0x2A030	
+0x5D7B	0x2A031	
+0x5D7C	0x2A032	
+0x5D7D	0x2A033	
+0x5E21	0x2A034	
+0x5E22	0x2A035	
+0x5E23	0x2A036	
+0x5E25	0x2A037	
+0x5E26	0x2A2B2	
+0x5E27	0x2A390	
+0x5E28	0x2A326	
+0x5E29	0x2A3A2	
+0x5E2A	0x2A438	
+0x5E2C	0x2042E	
+0x5E2E	0x2042F	
+0x5E2F	0x20430	
+0x5E30	0x2042A	
+0x5E31	0x2042B	
+0x5E32	0x204C9	
+0x5E33	0x20537	
+0x5E34	0x20620	
+0x5E35	0x20672	
+0x5E36	0x2081F	
+0x5E37	0x20965	
+0x5E38	0x209CA	
+0x5E39	0x20AC0	
+0x5E3A	0x20AC1	
+0x5E3B	0x20AC2	
+0x5E3C	0x210B7	
+0x5E3D	0x210B8	
+0x5E3E	0x210B9	
+0x5E3F	0x210BA	
+0x5E40	0x210BB	
+0x5E43	0x210BC	
+0x5E44	0x210BD	
+0x5E45	0x210BE	
+0x5E46	0x210F2	
+0x5E47	0x214B5	
+0x5E48	0x214B7	
+0x5E49	0x214B8	
+0x5E4A	0x210DF	
+0x5E4B	0x214B9	
+0x5E4C	0x214D5	
+0x5E4D	0x214BA	
+0x5E4E	0x214BB	
+0x5E4F	0x2154A	
+0x5E50	0x218F2	
+0x5E51	0x218F3	
+0x5E52	0x218F4	
+0x5E53	0x218FA	
+0x5E54	0x218F5	
+0x5E55	0x21902	
+0x5E56	0x21AE2	
+0x5E57	0x21AE3	
+0x5E58	0x21F8E	
+0x5E59	0x21F8B	
+0x5E5A	0x222E4	
+0x5E5B	0x222EB	
+0x5E5C	0x222E5	
+0x5E5D	0x22435	
+0x5E5E	0x22593	
+0x5E5F	0x228EA	
+0x5E60	0x228EB	
+0x5E62	0x228EC	
+0x5E63	0x228ED	
+0x5E64	0x22917	
+0x5E65	0x228EE	
+0x5E66	0x228EF	
+0x5E67	0x228F0	
+0x5E68	0x22E0E	
+0x5E69	0x22E0F	
+0x5E6A	0x22E10	
+0x5E6B	0x22E19	
+0x5E6C	0x22E18	
+0x5E6D	0x22E11	
+0x5E6E	0x22E12	
+0x5E6F	0x22E13	
+0x5E70	0x2F8C7	
+0x5E71	0x22E14	
+0x5E72	0x22E15	
+0x5E74	0x22E16	
+0x5E75	0x23065	
+0x5E76	0x232EA	
+0x5E77	0x232EB	
+0x5E78	0x232EC	
+0x5E79	0x232ED	
+0x5E7B	0x232EE	
+0x5E7C	0x233AC	
+0x5E7D	0x237C2	
+0x5E7E	0x23769	
+0x5F21	0x23781	
+0x5F22	0x2376A	
+0x5F23	0x2376B	
+0x5F24	0x2376C	
+0x5F25	0x2376D	
+0x5F26	0x2376E	
+0x5F27	0x2376F	
+0x5F28	0x23770	
+0x5F2A	0x23771	
+0x5F2B	0x23772	
+0x5F2C	0x23773	
+0x5F2D	0x2378C	
+0x5F2E	0x23774	
+0x5F2F	0x23775	
+0x5F30	0x23776	
+0x5F31	0x23C24	
+0x5F32	0x23C2A	
+0x5F33	0x2408E	
+0x5F34	0x240AF	
+0x5F35	0x2408F	
+0x5F36	0x24090	
+0x5F37	0x24091	
+0x5F39	0x24092	
+0x5F3A	0x24093	
+0x5F3B	0x24094	
+0x5F3C	0x24095	
+0x5F3D	0x24096	
+0x5F3E	0x24097	
+0x5F3F	0x24098	
+0x5F40	0x24099	
+0x5F41	0x2409A	
+0x5F42	0x2409B	
+0x5F43	0x2409C	
+0x5F44	0x24439	
+0x5F45	0x2443B	
+0x5F46	0x2443A	
+0x5F47	0x2443C	
+0x5F48	0x2443D	
+0x5F49	0x2443E	
+0x5F4A	0x2443F	
+0x5F4B	0x24470	
+0x5F4C	0x24440	
+0x5F4D	0x24441	
+0x5F4E	0x248C0	
+0x5F4F	0x248C1	
+0x5F50	0x24AA4	
+0x5F51	0x24A97	
+0x5F52	0x24AA5	
+0x5F53	0x24A98	
+0x5F54	0x24A99	
+0x5F55	0x24A9A	
+0x5F57	0x24A9B	
+0x5F58	0x24AA6	
+0x5F59	0x24A9C	
+0x5F5A	0x24A9D	
+0x5F5B	0x24A9E	
+0x5F5C	0x24A9F	
+0x5F5D	0x28ACE	
+0x5F5E	0x24AC8	
+0x5F5F	0x24AA0	
+0x5F60	0x24B19	
+0x5F61	0x24C0D	
+0x5F62	0x250BF	
+0x5F63	0x252E9	
+0x5F64	0x252EA	
+0x5F65	0x255A2	
+0x5F66	0x255A3	
+0x5F67	0x255A4	
+0x5F68	0x255A5	
+0x5F69	0x255A6	
+0x5F6A	0x25715	
+0x5F6B	0x25717	
+0x5F6C	0x258BF	
+0x5F6D	0x258C0	
+0x5F6E	0x258C1	
+0x5F6F	0x258C2	
+0x5F70	0x258C3	
+0x5F71	0x258C4	
+0x5F72	0x258C5	
+0x5F73	0x2190D	
+0x5F74	0x25A23	
+0x5F75	0x25ABE	
+0x5F76	0x25D03	
+0x5F77	0x25D04	
+0x5F78	0x25D05	
+0x5F79	0x25D06	
+0x5F7A	0x25D07	
+0x5F7B	0x25D08	
+0x5F7C	0x25D09	
+0x5F7D	0x25D0A	
+0x5F7E	0x25D0B	
+0x6021	0x25D0C	
+0x6022	0x25D20	
+0x6023	0x25D0D	
+0x6024	0x25D0E	
+0x6025	0x25D0F	
+0x6027	0x25F26	
+0x6028	0x25F27	
+0x6029	0x25F28	
+0x602A	0x2615D	
+0x602B	0x2615E	
+0x602C	0x2615F	
+0x602D	0x26160	
+0x602E	0x26161	
+0x602F	0x26162	
+0x6030	0x26163	
+0x6031	0x26164	
+0x6032	0x26165	
+0x6033	0x26257	
+0x6034	0x263CF	
+0x6035	0x263D0	
+0x6036	0x26499	
+0x6037	0x2649A	
+0x6038	0x265EA	
+0x6039	0x265EB	
+0x603A	0x265EC	
+0x603B	0x2687E	
+0x603C	0x2687F	
+0x603D	0x26880	
+0x6040	0x26881	
+0x6041	0x26882	
+0x6042	0x268F3	
+0x6043	0x26925	
+0x6044	0x2699F	
+0x6045	0x269A0	
+0x6046	0x269F3	
+0x6047	0x26A00	
+0x6048	0x26FEB	
+0x6049	0x26FEC	
+0x604A	0x26FED	
+0x604B	0x26FEE	
+0x604C	0x26FEF	
+0x604F	0x26FF0	
+0x6050	0x26FF1	
+0x6051	0x26FF2	
+0x6052	0x26FF3	
+0x6053	0x26FF4	
+0x6054	0x26FF5	
+0x6055	0x26FF9	
+0x6056	0x26FFA	
+0x6057	0x26FFB	
+0x6058	0x26FFC	
+0x6059	0x26FFD	
+0x605A	0x26FFE	
+0x605B	0x26FFF	
+0x605C	0x27000	
+0x605D	0x2F9AE	
+0x605E	0x27001	
+0x605F	0x27002	
+0x6060	0x27203	
+0x6061	0x27486	
+0x6062	0x27479	
+0x6064	0x2747A	
+0x6065	0x2747B	
+0x6066	0x2747C	
+0x6067	0x27484	
+0x6068	0x2747D	
+0x6069	0x2747E	
+0x606A	0x2747F	
+0x606B	0x27786	
+0x606C	0x27787	
+0x606D	0x27800	
+0x606E	0x27801	
+0x606F	0x27888	
+0x6070	0x27889	
+0x6071	0x2788A	
+0x6072	0x27AF5	
+0x6074	0x27B25	
+0x6075	0x27AF6	
+0x6076	0x27DEB	
+0x6077	0x27DEC	
+0x6078	0x27DED	
+0x6079	0x27DEE	
+0x607B	0x27DEF	
+0x607C	0x27DF0	
+0x607D	0x27F6C	
+0x607E	0x28121	
+0x6121	0x28122	
+0x6122	0x28123	
+0x6123	0x28124	
+0x6124	0x28125	
+0x6125	0x28126	
+0x6126	0x2827B	
+0x6127	0x2827C	
+0x6128	0x28391	
+0x6129	0x28392	
+0x612A	0x28393	
+0x612B	0x2860E	
+0x612C	0x2860F	
+0x612D	0x28610	
+0x612E	0x288B3	
+0x612F	0x28936	
+0x6130	0x28AC6	
+0x6131	0x28AA1	
+0x6132	0x28AA2	
+0x6134	0x28AA3	
+0x6135	0x28ACC	
+0x6136	0x28AA4	
+0x6137	0x28AA5	
+0x6138	0x28AA6	
+0x6139	0x28ACB	
+0x613A	0x28AA7	
+0x613C	0x28AA8	
+0x613D	0x28AA9	
+0x613E	0x28AAA	
+0x6140	0x28AAB	
+0x6141	0x28AAC	
+0x6142	0x28AAD	
+0x6144	0x28AAE	
+0x6145	0x28AAF	
+0x6146	0x28AB0	
+0x6147	0x28D8C	
+0x6148	0x28D8D	
+0x6149	0x28D8E	
+0x614A	0x2F9F1	
+0x614B	0x28D92	
+0x614C	0x28D8F	
+0x614D	0x28F52	
+0x614E	0x28F53	
+0x614F	0x28F54	
+0x6150	0x28F55	
+0x6151	0x29129	
+0x6153	0x292F3	
+0x6154	0x292F4	
+0x6155	0x2950D	
+0x6156	0x2950E	
+0x6157	0x2950F	
+0x6158	0x29510	
+0x6159	0x29614	
+0x615A	0x29771	
+0x615B	0x29772	
+0x615C	0x2990F	
+0x615D	0x29904	
+0x615E	0x29906	
+0x6160	0x29907	
+0x6161	0x29ADC	
+0x6162	0x29ADD	
+0x6163	0x29B6D	
+0x6164	0x29B79	
+0x6165	0x29B6E	
+0x6167	0x29CEC	
+0x6168	0x29DDD	
+0x6169	0x29DDE	
+0x616A	0x29DDF	
+0x616B	0x29DE0	
+0x616C	0x29DE1	
+0x616D	0x29DE2	
+0x616E	0x29DE3	
+0x616F	0x29DE4	
+0x6170	0x29E3A	
+0x6171	0x29DE5	
+0x6173	0x29DE6	
+0x6174	0x2A06B	
+0x6175	0x2A06C	
+0x6176	0x2444E	
+0x6178	0x2A2BD	
+0x6179	0x2A2BE	
+0x617A	0x2A2BF	
+0x617B	0x2A334	
+0x617D	0x2A512	
+0x617E	0x20440	
+0x6221	0x20441	
+0x6222	0x21102	
+0x6223	0x21103	
+0x6224	0x21104	
+0x6225	0x21105	
+0x6226	0x21106	
+0x6227	0x214D7	
+0x6228	0x214CC	
+0x6229	0x21698	
+0x622A	0x21906	
+0x622B	0x21907	
+0x622C	0x219AF	
+0x622D	0x219B0	
+0x622E	0x21AEA	
+0x622F	0x21AF2	
+0x6230	0x21FA2	
+0x6231	0x21FA3	
+0x6232	0x21FA4	
+0x6233	0x22176	
+0x6234	0x222F5	
+0x6235	0x222F6	
+0x6236	0x222F7	
+0x6238	0x2293B	
+0x6239	0x22925	
+0x623A	0x2293A	
+0x623B	0x2293C	
+0x623C	0x2293D	
+0x623D	0x2293E	
+0x623E	0x22E37	
+0x623F	0x22E38	
+0x6240	0x22E39	
+0x6241	0x22E3A	
+0x6242	0x22E3B	
+0x6243	0x22E3C	
+0x6244	0x22E3D	
+0x6245	0x22E3E	
+0x6246	0x22E3F	
+0x6247	0x22E4B	
+0x6249	0x22E40	
+0x624A	0x23022	
+0x624B	0x23067	
+0x624C	0x230D3	
+0x624D	0x232FA	
+0x624F	0x237BC	
+0x6252	0x237A5	
+0x6254	0x237B6	
+0x6256	0x237A6	
+0x6257	0x237BB	
+0x6258	0x237A7	
+0x6259	0x237A8	
+0x625A	0x237A9	
+0x625B	0x237AA	
+0x625C	0x237AB	
+0x625D	0x237AC	
+0x625E	0x237BF	
+0x625F	0x237AD	
+0x6260	0x237AE	
+0x6261	0x237AF	
+0x6262	0x2392E	
+0x6263	0x23B00	
+0x6264	0x2409D	
+0x6265	0x2409E	
+0x6266	0x240CB	
+0x6267	0x240CC	
+0x6268	0x240CD	
+0x6269	0x240CE	
+0x626A	0x240CF	
+0x626C	0x2409F	
+0x626D	0x240D0	
+0x626E	0x240D1	
+0x626F	0x240D2	
+0x6270	0x240D3	
+0x6271	0x240D4	
+0x6274	0x2445D	
+0x6275	0x2445E	
+0x6276	0x2445F	
+0x6277	0x24460	
+0x6279	0x24ABA	
+0x627A	0x24ABC	
+0x627C	0x24AB5	
+0x627D	0x24ABD	
+0x627E	0x24AB6	
+0x6321	0x24AB7	
+0x6322	0x24AB8	
+0x6323	0x24AA8	
+0x6324	0x2F932	
+0x6325	0x24BFE	
+0x6326	0x24BFC	
+0x6327	0x24EE1	
+0x6328	0x250C4	
+0x6329	0x250C5	
+0x632A	0x25314	
+0x632B	0x255AE	
+0x632C	0x255AF	
+0x632D	0x255B0	
+0x632E	0x255B1	
+0x632F	0x255B9	
+0x6330	0x258E7	
+0x6331	0x25D46	
+0x6333	0x25D47	
+0x6334	0x25D48	
+0x6335	0x25D49	
+0x6336	0x25D1E	
+0x6337	0x25D1F	
+0x6338	0x25D4A	
+0x6339	0x25D4B	
+0x633A	0x25D4C	
+0x633B	0x25D4D	
+0x633C	0x25D4E	
+0x633E	0x25F46	
+0x633F	0x25F4B	
+0x6340	0x26190	
+0x6341	0x26191	
+0x6343	0x26192	
+0x6344	0x26193	
+0x6345	0x26194	
+0x6346	0x2625B	
+0x6347	0x265F2	
+0x6348	0x265F8	
+0x6349	0x265F9	
+0x634A	0x26894	
+0x634B	0x268A4	
+0x634C	0x26897	
+0x634D	0x26898	
+0x634E	0x26929	
+0x634F	0x269AE	
+0x6350	0x26AAF	
+0x6351	0x27059	
+0x6352	0x2705A	
+0x6354	0x2705B	
+0x6355	0x2705C	
+0x6356	0x2705D	
+0x6357	0x2705E	
+0x6358	0x2705F	
+0x6359	0x27060	
+0x635A	0x27061	
+0x635B	0x26FAA	
+0x635C	0x27062	
+0x635D	0x27063	
+0x635E	0x27064	
+0x635F	0x27065	
+0x6360	0x27066	
+0x6361	0x27067	
+0x6362	0x27068	
+0x6363	0x27069	
+0x6364	0x2706A	
+0x6365	0x2706B	
+0x6366	0x2706C	
+0x6367	0x2706D	
+0x6368	0x2706E	
+0x6369	0x2706F	
+0x636B	0x274B2	
+0x636C	0x274B3	
+0x636D	0x274B4	
+0x636F	0x274B5	
+0x6370	0x274B6	
+0x6371	0x274B7	
+0x6372	0x274B8	
+0x6373	0x274B9	
+0x6374	0x274BA	
+0x6375	0x274BB	
+0x6376	0x27788	
+0x6378	0x27B19	
+0x6379	0x27B1A	
+0x637A	0x27B1B	
+0x637B	0x27C16	
+0x637C	0x27E0C	
+0x637D	0x27E0D	
+0x637E	0x27E0E	
+0x6421	0x27E0F	
+0x6423	0x27F83	
+0x6424	0x27F84	
+0x6425	0x27F85	
+0x6426	0x28283	
+0x6427	0x28284	
+0x6428	0x283B0	
+0x642A	0x28626	
+0x642B	0x28627	
+0x642C	0x28636	
+0x642D	0x28628	
+0x642E	0x28629	
+0x6431	0x28AE7	
+0x6432	0x28AE8	
+0x6433	0x28AE9	
+0x6435	0x28AEA	
+0x6436	0x28AEB	
+0x6438	0x28AEC	
+0x6439	0x28AED	
+0x643A	0x28AEE	
+0x643B	0x28AEF	
+0x643C	0x28AF0	
+0x643D	0x28AF1	
+0x643E	0x28B0C	
+0x643F	0x28AF2	
+0x6440	0x28AF3	
+0x6441	0x28AF4	
+0x6442	0x28AF5	
+0x6443	0x28AF6	
+0x6444	0x28AF7	
+0x6445	0x28AF8	
+0x6446	0x28DA3	
+0x6447	0x28DA4	
+0x6448	0x28DA5	
+0x6449	0x28DA6	
+0x644A	0x28DA7	
+0x644C	0x28F5C	
+0x644E	0x2914B	
+0x644F	0x291E1	
+0x6450	0x29315	
+0x6452	0x29316	
+0x6453	0x29317	
+0x6454	0x2952C	
+0x6455	0x2952D	
+0x6456	0x29622	
+0x6457	0x29623	
+0x6458	0x29796	
+0x6459	0x29797	
+0x645B	0x2992E	
+0x645C	0x29930	
+0x645D	0x29931	
+0x645F	0x29ADF	
+0x6460	0x29B8B	
+0x6461	0x29B8C	
+0x6463	0x29B8D	
+0x6464	0x29CFC	
+0x6465	0x29CFD	
+0x6466	0x29CFE	
+0x6467	0x29CFF	
+0x6468	0x29E17	
+0x6469	0x29E2D	
+0x646A	0x29E18	
+0x646C	0x29E19	
+0x646E	0x29E12	
+0x646F	0x29E1A	
+0x6470	0x29E1B	
+0x6471	0x29E1C	
+0x6474	0x2A097	
+0x6476	0x2A098	
+0x6477	0x2A099	
+0x6479	0x2A3C4	
+0x647A	0x2044F	
+0x647B	0x204CD	
+0x647C	0x20AC7	
+0x647D	0x2111C	
+0x647E	0x2111D	
+0x6521	0x2111E	
+0x6522	0x214E7	
+0x6523	0x214E9	
+0x6524	0x214EA	
+0x6525	0x214EB	
+0x6526	0x21915	
+0x6527	0x21CF1	
+0x6528	0x21CF2	
+0x6529	0x21FB6	
+0x652A	0x225A0	
+0x652B	0x2294A	
+0x652C	0x22A20	
+0x652D	0x22E60	
+0x652E	0x22E61	
+0x652F	0x22E41	
+0x6530	0x22E62	
+0x6531	0x23303	
+0x6532	0x23304	
+0x6533	0x237D9	
+0x6534	0x237DA	
+0x6535	0x237DB	
+0x6536	0x237DC	
+0x6537	0x237DD	
+0x6539	0x237DE	
+0x653A	0x237DF	
+0x653B	0x237E0	
+0x653C	0x237E1	
+0x653D	0x237E2	
+0x653F	0x237E3	
+0x6541	0x23C31	
+0x6542	0x24105	
+0x6543	0x24106	
+0x6544	0x24107	
+0x6545	0x24472	
+0x6546	0x2448A	
+0x6547	0x2448B	
+0x6548	0x24488	
+0x654A	0x2448C	
+0x654B	0x2448D	
+0x654C	0x2448E	
+0x654D	0x2448F	
+0x654E	0x24490	
+0x654F	0x24542	
+0x6550	0x24543	
+0x6552	0x24AC1	
+0x6553	0x24AC2	
+0x6554	0x24AC3	
+0x6555	0x24AC4	
+0x6556	0x250CB	
+0x6557	0x25322	
+0x655A	0x255C3	
+0x655B	0x255C4	
+0x655C	0x255C5	
+0x655D	0x255C6	
+0x655E	0x2571E	
+0x655F	0x25725	
+0x6560	0x258F3	
+0x6561	0x258F4	
+0x6563	0x258F5	
+0x6564	0x25A38	
+0x6565	0x25A48	
+0x6566	0x25ACA	
+0x6568	0x25D7A	
+0x6569	0x25D7B	
+0x656A	0x25F55	
+0x656B	0x25F56	
+0x656C	0x261B1	
+0x656D	0x261B2	
+0x656E	0x261B3	
+0x6570	0x261B4	
+0x6571	0x261B5	
+0x6572	0x264A4	
+0x6573	0x26600	
+0x6574	0x26601	
+0x6575	0x26602	
+0x6576	0x268AC	
+0x6578	0x269B3	
+0x6579	0x270B6	
+0x657A	0x270B7	
+0x657B	0x270B8	
+0x657C	0x270B9	
+0x657D	0x270BA	
+0x657E	0x270BB	
+0x6621	0x270BC	
+0x6622	0x270BD	
+0x6623	0x270BE	
+0x6624	0x270BF	
+0x6625	0x270C0	
+0x6626	0x270C1	
+0x6627	0x270C2	
+0x6628	0x270C3	
+0x6629	0x270C4	
+0x662A	0x270C5	
+0x662B	0x270C6	
+0x662C	0x270C7	
+0x662D	0x274E3	
+0x662E	0x274E4	
+0x662F	0x274E5	
+0x6630	0x274E6	
+0x6631	0x274E7	
+0x6633	0x277B5	
+0x6634	0x277A1	
+0x6635	0x27895	
+0x6636	0x27B3B	
+0x6637	0x27B3C	
+0x6638	0x27B3D	
+0x6639	0x27B3E	
+0x663A	0x27C14	
+0x663B	0x27E20	
+0x663C	0x27E21	
+0x663D	0x27E22	
+0x663E	0x27E23	
+0x663F	0x27E24	
+0x6640	0x27F96	
+0x6641	0x27F97	
+0x6642	0x27F98	
+0x6643	0x28194	
+0x6644	0x28195	
+0x6645	0x28196	
+0x6646	0x28197	
+0x6647	0x28198	
+0x6648	0x2828F	
+0x6649	0x28290	
+0x664A	0x283BC	
+0x664B	0x2843B	
+0x664C	0x2863D	
+0x664E	0x288DF	
+0x664F	0x2891E	
+0x6650	0x28B23	
+0x6651	0x28B24	
+0x6652	0x28B49	
+0x6653	0x28B25	
+0x6654	0x28B26	
+0x6655	0x28B27	
+0x6656	0x28B28	
+0x6658	0x28B29	
+0x6659	0x28B2A	
+0x665A	0x28B2E	
+0x665B	0x28B2F	
+0x665C	0x28B4E	
+0x665D	0x28B30	
+0x665E	0x2F9EB	
+0x665F	0x28B31	
+0x6660	0x28B32	
+0x6661	0x28B33	
+0x6662	0x28B34	
+0x6663	0x28B35	
+0x6664	0x28B36	
+0x6666	0x28B37	
+0x6667	0x28B50	
+0x6668	0x28B38	
+0x666A	0x28B39	
+0x666B	0x28B3A	
+0x666C	0x28B3B	
+0x666D	0x28B3C	
+0x666E	0x28B3D	
+0x666F	0x28B3E	
+0x6670	0x28DB8	
+0x6671	0x28DB9	
+0x6672	0x28F62	
+0x6673	0x28F63	
+0x6674	0x29041	
+0x6675	0x2916D	
+0x6677	0x29352	
+0x6678	0x29337	
+0x6679	0x293DB	
+0x667A	0x2953F	
+0x667B	0x29634	
+0x667C	0x2985B	
+0x667D	0x29946	
+0x667E	0x2995A	
+0x6721	0x2995B	
+0x6722	0x29AE1	
+0x6723	0x29AE2	
+0x6724	0x29AE3	
+0x6725	0x29AE4	
+0x6726	0x29BA7	
+0x6727	0x29BA8	
+0x6728	0x29BA9	
+0x6729	0x29D0F	
+0x672A	0x29D2B	
+0x672B	0x29E56	
+0x672C	0x29E57	
+0x672D	0x29E58	
+0x672E	0x29E5E	
+0x672F	0x29E59	
+0x6730	0x29E5A	
+0x6731	0x29E5B	
+0x6732	0x29E5C	
+0x6734	0x29E68	
+0x6736	0x2A12C	
+0x6737	0x2A0E2	
+0x6738	0x2A0F3	
+0x6739	0x2A2D2	
+0x673A	0x2A356	
+0x673B	0x2A3CE	
+0x673C	0x2A461	
+0x673D	0x2A69B	
+0x673E	0x2A6B4	
+0x673F	0x2045C	
+0x6740	0x2F810	
+0x6741	0x204D2	
+0x6742	0x20571	
+0x6743	0x20673	
+0x6744	0x2082C	
+0x6745	0x20B94	
+0x6747	0x2113F	
+0x6748	0x21140	
+0x6749	0x214F9	
+0x674A	0x214FA	
+0x674B	0x214FD	
+0x674C	0x214FB	
+0x674D	0x2191C	
+0x674E	0x2191D	
+0x674F	0x21AFF	
+0x6750	0x21B00	
+0x6751	0x21CF7	
+0x6752	0x24CFE	
+0x6754	0x224B6	
+0x6755	0x22954	
+0x6756	0x22E77	
+0x6757	0x22E79	
+0x6758	0x22E7A	
+0x6759	0x22E7B	
+0x675A	0x23069	
+0x675B	0x23802	
+0x675C	0x23803	
+0x675D	0x23804	
+0x675E	0x23805	
+0x675F	0x23806	
+0x6760	0x23807	
+0x6761	0x23808	
+0x6762	0x23809	
+0x6763	0x2380A	
+0x6764	0x2380B	
+0x6765	0x23835	
+0x6767	0x23C39	
+0x6768	0x2411E	
+0x6769	0x2411F	
+0x676A	0x24120	
+0x676B	0x24121	
+0x676D	0x24122	
+0x676E	0x24123	
+0x676F	0x24124	
+0x6770	0x2412C	
+0x6771	0x244B3	
+0x6772	0x244B5	
+0x6773	0x244B6	
+0x6774	0x244B7	
+0x6775	0x244B8	
+0x6776	0x24AD0	
+0x6777	0x24CFA	
+0x6778	0x24F07	
+0x6779	0x24FBD	
+0x677A	0x250D7	
+0x677B	0x250D2	
+0x677C	0x255DB	
+0x677D	0x255D6	
+0x677E	0x2045D	
+0x6821	0x25A43	
+0x6822	0x25ACF	
+0x6823	0x25DA3	
+0x6824	0x25DA4	
+0x6825	0x25DA5	
+0x6826	0x25DA6	
+0x6827	0x25DA7	
+0x6828	0x25DA8	
+0x6829	0x25DA9	
+0x682A	0x25F5D	
+0x682B	0x25F5E	
+0x682C	0x261C9	
+0x682D	0x261CA	
+0x682E	0x261CB	
+0x682F	0x261CC	
+0x6830	0x26606	
+0x6831	0x26607	
+0x6833	0x268C5	
+0x6834	0x268F5	
+0x6835	0x269B4	
+0x6836	0x269B8	
+0x6837	0x269B5	
+0x6838	0x270FD	
+0x683A	0x270FE	
+0x683B	0x270FF	
+0x683C	0x27100	
+0x683D	0x27101	
+0x683E	0x27102	
+0x683F	0x27103	
+0x6840	0x27109	
+0x6841	0x27104	
+0x6842	0x27105	
+0x6843	0x27106	
+0x6844	0x27107	
+0x6845	0x27511	
+0x6846	0x27512	
+0x6847	0x27513	
+0x6848	0x27514	
+0x6849	0x27515	
+0x684B	0x27898	
+0x684C	0x27899	
+0x684D	0x27E3C	
+0x684E	0x27E2D	
+0x684F	0x27E2E	
+0x6851	0x281BB	
+0x6852	0x281BC	
+0x6854	0x2843D	
+0x6855	0x28647	
+0x6856	0x28648	
+0x6857	0x28649	
+0x6858	0x2864A	
+0x6859	0x287E1	
+0x685A	0x287E7	
+0x685B	0x288EB	
+0x685C	0x28920	
+0x685D	0x28938	
+0x685E	0x28B62	
+0x685F	0x28B67	
+0x6860	0x28B68	
+0x6861	0x28B69	
+0x6862	0x28B6A	
+0x6863	0x28B6B	
+0x6864	0x28B6D	
+0x6865	0x28B6E	
+0x6866	0x28B6F	
+0x6867	0x28B70	
+0x6868	0x28B71	
+0x6869	0x28B72	
+0x686A	0x28B8F	
+0x686B	0x28B73	
+0x686C	0x28B74	
+0x686D	0x28B75	
+0x686E	0x28B76	
+0x686F	0x28B77	
+0x6870	0x28DC9	
+0x6871	0x28DCA	
+0x6873	0x28DCB	
+0x6874	0x28DCC	
+0x6875	0x28DCD	
+0x6876	0x29051	
+0x6879	0x29245	
+0x687A	0x29559	
+0x687B	0x2955A	
+0x687C	0x2955B	
+0x687D	0x29640	
+0x687E	0x297CF	
+0x6921	0x2985E	
+0x6922	0x2997B	
+0x6923	0x29A93	
+0x6924	0x29BBC	
+0x6925	0x29D16	
+0x6926	0x29D30	
+0x6928	0x29E8D	
+0x6929	0x29E8E	
+0x692B	0x29E8F	
+0x692C	0x29E90	
+0x692D	0x29E91	
+0x692E	0x29E92	
+0x692F	0x29E93	
+0x6930	0x29E94	
+0x6931	0x29E95	
+0x6932	0x29E96	
+0x6933	0x2A123	
+0x6934	0x2A114	
+0x6935	0x2A2DB	
+0x6936	0x2A40A	
+0x6937	0x2A5CE	
+0x6938	0x20466	
+0x6939	0x20468	
+0x693A	0x20467	
+0x693B	0x204D3	
+0x693C	0x21163	
+0x693D	0x21504	
+0x693E	0x2169E	
+0x693F	0x21926	
+0x6940	0x2192A	
+0x6941	0x2296C	
+0x6942	0x22964	
+0x6943	0x22E8F	
+0x6944	0x22E90	
+0x6945	0x23034	
+0x6946	0x2330E	
+0x6947	0x23825	
+0x6948	0x23826	
+0x6949	0x23827	
+0x694B	0x23828	
+0x694E	0x23829	
+0x694F	0x2382A	
+0x6950	0x2382B	
+0x6951	0x2382C	
+0x6952	0x23C3E	
+0x6953	0x24142	
+0x6954	0x24143	
+0x6955	0x24133	
+0x6956	0x244C1	
+0x6957	0x244C2	
+0x6958	0x244C3	
+0x6959	0x24AD6	
+0x695A	0x24AD7	
+0x695B	0x255E1	
+0x695C	0x255E2	
+0x695D	0x2572B	
+0x695E	0x25AD1	
+0x695F	0x25DCC	
+0x6960	0x25DCD	
+0x6961	0x25DCE	
+0x6962	0x25DCF	
+0x6963	0x261DE	
+0x6964	0x261DF	
+0x6965	0x261E0	
+0x6966	0x261E1	
+0x6967	0x268F6	
+0x6968	0x2712C	
+0x696A	0x27154	
+0x696B	0x2712D	
+0x696C	0x2712E	
+0x696D	0x27541	
+0x696E	0x27542	
+0x696F	0x277C7	
+0x6970	0x278A0	
+0x6971	0x278A1	
+0x6972	0x27B70	
+0x6973	0x27B71	
+0x6974	0x27B72	
+0x6976	0x27E34	
+0x6977	0x27E35	
+0x6978	0x27E36	
+0x6979	0x27FA6	
+0x697A	0x281CC	
+0x697C	0x28299	
+0x697D	0x288F4	
+0x697E	0x28B9B	
+0x6A21	0x28B9E	
+0x6A22	0x28B9F	
+0x6A23	0x28BA0	
+0x6A24	0x28BA1	
+0x6A25	0x28BA2	
+0x6A26	0x28BA3	
+0x6A27	0x28BA4	
+0x6A28	0x28BA5	
+0x6A29	0x28BA6	
+0x6A2A	0x28BA7	
+0x6A2B	0x28BA8	
+0x6A2C	0x28DDB	
+0x6A2D	0x28DDC	
+0x6A2E	0x28DDD	
+0x6A2F	0x28DD7	
+0x6A30	0x28DDE	
+0x6A31	0x28DDF	
+0x6A32	0x29059	
+0x6A33	0x29446	
+0x6A34	0x29565	
+0x6A35	0x29649	
+0x6A37	0x297DD	
+0x6A38	0x29995	
+0x6A39	0x29996	
+0x6A3A	0x29997	
+0x6A3B	0x29BD4	
+0x6A3C	0x29BD6	
+0x6A3D	0x29D26	
+0x6A40	0x29EC8	
+0x6A41	0x29EC5	
+0x6A42	0x29EC6	
+0x6A43	0x29EC7	
+0x6A44	0x2A151	
+0x6A45	0x2A152	
+0x6A46	0x2A153	
+0x6A47	0x2A154	
+0x6A48	0x2A155	
+0x6A49	0x2A2DE	
+0x6A4B	0x2046D	
+0x6A4C	0x204D5	
+0x6A4D	0x21172	
+0x6A4E	0x221AE	
+0x6A4F	0x2230F	
+0x6A50	0x2296B	
+0x6A51	0x2296D	
+0x6A52	0x2296E	
+0x6A53	0x22978	
+0x6A54	0x22E98	
+0x6A55	0x22E99	
+0x6A56	0x22E9A	
+0x6A57	0x23844	
+0x6A58	0x2385C	
+0x6A59	0x23845	
+0x6A5A	0x23B01	
+0x6A5B	0x24158	
+0x6A5C	0x24159	
+0x6A5D	0x2415A	
+0x6A5F	0x244D9	
+0x6A60	0x244D6	
+0x6A61	0x24ADA	
+0x6A62	0x24ADF	
+0x6A63	0x24ADB	
+0x6A64	0x24D03	
+0x6A65	0x255EF	
+0x6A67	0x25733	
+0x6A68	0x25AD2	
+0x6A69	0x25DE1	
+0x6A6A	0x25F6F	
+0x6A6B	0x26264	
+0x6A6C	0x2660E	
+0x6A6D	0x27150	
+0x6A6E	0x27151	
+0x6A6F	0x27152	
+0x6A70	0x27556	
+0x6A71	0x27557	
+0x6A72	0x27558	
+0x6A74	0x27B81	
+0x6A75	0x27B82	
+0x6A76	0x27C1D	
+0x6A77	0x27C1E	
+0x6A78	0x27E43	
+0x6A79	0x27FAA	
+0x6A7A	0x288FD	
+0x6A7C	0x28BC6	
+0x6A7D	0x28BC7	
+0x6A7E	0x28BD9	
+0x6B21	0x28BD7	
+0x6B23	0x28BC8	
+0x6B24	0x28BC9	
+0x6B25	0x28BCA	
+0x6B26	0x28BCB	
+0x6B27	0x28BDA	
+0x6B29	0x28BCC	
+0x6B2A	0x28BCD	
+0x6B2B	0x28BCE	
+0x6B2C	0x28BCF	
+0x6B2D	0x28BD0	
+0x6B2E	0x28BD1	
+0x6B2F	0x28BBC	
+0x6B30	0x28DE1	
+0x6B31	0x28DE2	
+0x6B32	0x28DE3	
+0x6B33	0x291A9	
+0x6B34	0x2924E	
+0x6B35	0x29577	
+0x6B38	0x299AC	
+0x6B39	0x299AD	
+0x6B3A	0x29AB6	
+0x6B3B	0x29BE5	
+0x6B3C	0x29EF8	
+0x6B3D	0x29EEA	
+0x6B3E	0x29F8D	
+0x6B3F	0x29EEB	
+0x6B40	0x2A195	
+0x6B41	0x2046E	
+0x6B42	0x204D8	
+0x6B43	0x21183	
+0x6B44	0x216A3	
+0x6B45	0x21930	
+0x6B46	0x21B0F	
+0x6B47	0x22979	
+0x6B48	0x2297A	
+0x6B49	0x22EA7	
+0x6B4A	0x22EA8	
+0x6B4B	0x22EA9	
+0x6B4C	0x22EAA	
+0x6B4D	0x23319	
+0x6B4E	0x23850	
+0x6B4F	0x23851	
+0x6B50	0x23852	
+0x6B52	0x23868	
+0x6B53	0x23853	
+0x6B54	0x23854	
+0x6B55	0x248E2	
+0x6B56	0x24ADC	
+0x6B57	0x25915	
+0x6B58	0x25916	
+0x6B59	0x25A4F	
+0x6B5A	0x25DF5	
+0x6B5B	0x25DF6	
+0x6B5C	0x25DF7	
+0x6B5D	0x261F4	
+0x6B5E	0x264CC	
+0x6B5F	0x2660F	
+0x6B60	0x27166	
+0x6B61	0x27167	
+0x6B63	0x27168	
+0x6B64	0x278A4	
+0x6B65	0x27B8B	
+0x6B66	0x27B8C	
+0x6B67	0x281FA	
+0x6B68	0x28BE6	
+0x6B69	0x28BED	
+0x6B6A	0x28BEE	
+0x6B6B	0x28BEF	
+0x6B6C	0x28BF0	
+0x6B6D	0x28BFE	
+0x6B6E	0x28DE7	
+0x6B6F	0x28DE8	
+0x6B70	0x291B3	
+0x6B71	0x291E4	
+0x6B72	0x29583	
+0x6B73	0x29AEC	
+0x6B75	0x29F16	
+0x6B78	0x29F17	
+0x6B79	0x2A1C3	
+0x6B7A	0x2A1AC	
+0x6B7B	0x2A2ED	
+0x6B7E	0x2A5B4	
+0x6C22	0x2118A	
+0x6C23	0x2118B	
+0x6C24	0x21934	
+0x6C25	0x21B14	
+0x6C26	0x21FDF	
+0x6C27	0x224BB	
+0x6C28	0x2297F	
+0x6C29	0x22981	
+0x6C2A	0x22EAD	
+0x6C2B	0x22EAE	
+0x6C2C	0x23862	
+0x6C2D	0x2386E	
+0x6C2F	0x2416E	
+0x6C31	0x24717	
+0x6C32	0x24AE6	
+0x6C33	0x24C10	
+0x6C34	0x25919	
+0x6C36	0x26610	
+0x6C37	0x26AF2	
+0x6C38	0x27176	
+0x6C39	0x27177	
+0x6C3A	0x27B95	
+0x6C3B	0x27B96	
+0x6C3C	0x28C00	
+0x6C3D	0x28C01	
+0x6C3E	0x28C31	
+0x6C3F	0x2F9ED	
+0x6C40	0x28C1C	
+0x6C41	0x2906D	
+0x6C42	0x29BF4	
+0x6C43	0x29BF5	
+0x6C44	0x29D3D	
+0x6C45	0x29F32	
+0x6C46	0x29F33	
+0x6C47	0x2A2F4	
+0x6C49	0x20473	
+0x6C4A	0x21937	
+0x6C4C	0x23871	
+0x6C4D	0x25E0F	
+0x6C4F	0x25E0E	
+0x6C50	0x26611	
+0x6C51	0x27185	
+0x6C52	0x28C14	
+0x6C53	0x28C15	
+0x6C54	0x28C16	
+0x6C55	0x28C17	
+0x6C56	0x28C18	
+0x6C57	0x28C19	
+0x6C58	0x28C1A	
+0x6C59	0x291C3	
+0x6C5A	0x29F42	
+0x6C5B	0x29F43	
+0x6C5C	0x29F44	
+0x6C5D	0x29F48	
+0x6C5E	0x2A1FB	
+0x6C5F	0x216A5	
+0x6C60	0x219B8	
+0x6C61	0x22EB2	
+0x6C62	0x2303D	
+0x6C63	0x23872	
+0x6C64	0x244E7	
+0x6C65	0x244E8	
+0x6C66	0x25359	
+0x6C67	0x2573A	
+0x6C68	0x25E14	
+0x6C69	0x261FF	
+0x6C6A	0x269C0	
+0x6C6B	0x2718D	
+0x6C6D	0x2718E	
+0x6C6F	0x28C22	
+0x6C72	0x29C04	
+0x6C73	0x29C29	
+0x6C74	0x29F51	
+0x6C75	0x29F66	
+0x6C76	0x2A20E	
+0x6C77	0x2FA13	
+0x6C79	0x2119B	
+0x6C7A	0x2119C	
+0x6C7B	0x22316	
+0x6C7C	0x22986	
+0x6C7D	0x22987	
+0x6D21	0x28C2C	
+0x6D22	0x28C30	
+0x6D23	0x28C28	
+0x6D24	0x2965F	
+0x6D26	0x2417E	
+0x6D27	0x25E19	
+0x6D28	0x2820A	
+0x6D29	0x28C36	
+0x6D2A	0x28DFC	
+0x6D2B	0x29F6D	
+0x6D2C	0x29F6E	
+0x6D2D	0x2A6C6	
+0x6D2F	0x2387B	
+0x6D30	0x26206	
+0x6D31	0x2759F	
+0x6D32	0x2A232	
+0x6D33	0x2820D	
+0x6D34	0x2298B	
+0x6D35	0x28C3B	
+0x6D37	0x2A23D	
+0x6D38	0x28C3C	
+0x6D39	0x28C3D	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,71 @@
+0x2144	0x2000B
+0x214F	0x2F817
+0x216F	0x201A9
+0x217C	0x2F850
+0x2225	0x2F82A
+0x227B	0x2F815
+0x2329	0x2F82C
+0x233C	0x2F83B
+0x2359	0x21D46
+0x2424	0x23C86
+0x2429	0x2F835
+0x2441	0x2F81B
+0x2452	0x2F80E
+0x257E	0x225D7
+0x2627	0x2F8B2
+0x272A	0x2F98F
+0x274E	0x20209
+0x2753	0x2F80F
+0x2754	0x2F811
+0x275C	0x206EC
+0x2A39	0x2233F
+0x2A45	0x2592E
+0x2C40	0x2F87A
+0x2C51	0x2F899
+0x2D35	0x2F8DF
+0x2D52	0x2F8FE
+0x2E56	0x2F96A
+0x2E5A	0x25133
+0x3023	0x2F841
+0x3053	0x2172E
+0x315C	0x2F8E1
+0x3350	0x2F983
+0x3460	0x20DAE
+0x3470	0x2F855
+0x347E	0x21637
+0x355F	0x2F88D
+0x3565	0x2F89C
+0x3628	0x2F8BA
+0x3640	0x2F8CB
+0x3675	0x2F907
+0x3977	0x20564
+0x3A26	0x2F833
+0x3A4F	0x21364
+0x3C3A	0x2F8E5
+0x3D3F	0x2F934
+0x3F6D	0x28CDD
+0x4043	0x2F823
+0x407E	0x2F87E
+0x416E	0x2F8E8
+0x4333	0x2F94E
+0x4425	0x2F98D
+0x446D	0x2F9DB
+0x4670	0x2F8A6
+0x4731	0x230BA
+0x474B	0x235F3
+0x4826	0x24A0F
+0x486A	0x2F96C
+0x5039	0x20B89
+0x5460	0x2F8AF
+0x553A	0x24039
+0x5545	0x2F921
+0x5678	0x2F9F5
+0x5736	0x29937
+0x584F	0x25CD1
+0x5863	0x265DF
+0x5A33	0x2F86A
+0x5A36	0x2F870
+0x5B26	0x2F9B6
+0x5B2D	0x2F9C1
+0x5C2F	0x2FA19
+0x607C	0x2F9D6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,3476 @@
+0x2121	0x20086
+0x2125	0x21FE8
+0x2128	0x2010E
+0x2129	0x20627
+0x212D	0x2053C
+0x212E	0x20675
+0x212F	0x2F828
+0x2133	0x2193C
+0x2134	0x2F875
+0x2135	0x2F878
+0x213F	0x2F819
+0x2140	0x206A5
+0x2141	0x206AA
+0x2142	0x2090F
+0x2143	0x20A0E
+0x2146	0x20B9C
+0x2147	0x20B9B
+0x2148	0x2123C
+0x214A	0x21BC2
+0x214E	0x233B4
+0x2156	0x20065
+0x2158	0x201B2
+0x215C	0x20477
+0x215D	0x20542
+0x215F	0x20633
+0x2162	0x206AF
+0x2163	0x20836
+0x2168	0x20B22
+0x216E	0x211A3
+0x2174	0x21C25
+0x2175	0x21C24
+0x2177	0x22052
+0x2178	0x22189
+0x2179	0x224BF
+0x217D	0x233B5
+0x217E	0x2574C
+0x2222	0x28E14
+0x2223	0x28E12
+0x2225	0x200A3
+0x2226	0x200A2
+0x2229	0x201B6
+0x222B	0x201B5
+0x222C	0x201B4
+0x222F	0x201C2
+0x2230	0x201B8
+0x2232	0x20479
+0x2235	0x20508
+0x2237	0x2057A
+0x2238	0x205B6
+0x2239	0x206BD
+0x223A	0x206B7
+0x223B	0x206BC
+0x223D	0x206C4
+0x223E	0x206C9
+0x2243	0x20930
+0x2244	0x20983
+0x2245	0x20985
+0x2246	0x20A12
+0x2247	0x20A34
+0x2249	0x20AE4
+0x224A	0x20ADE
+0x224B	0x20B2A
+0x224D	0x20BAF
+0x224E	0x20BB4
+0x224F	0x20BB3
+0x2250	0x20BB1
+0x2254	0x215DE
+0x2257	0x216B8
+0x2258	0x216B0
+0x225A	0x219C2
+0x225E	0x21C2A
+0x2262	0x21FE9
+0x2264	0x22057
+0x2267	0x221B6
+0x2268	0x221D7
+0x2269	0x221DE
+0x226E	0x224C2
+0x226F	0x225AB
+0x2272	0x2298F
+0x2276	0x22A6D
+0x2277	0x22EB5
+0x227A	0x233C0
+0x227B	0x233BF
+0x227D	0x239B9
+0x227E	0x23B1C
+0x2323	0x23C80
+0x2324	0x24184
+0x2325	0x24185
+0x2328	0x24724
+0x232C	0x2634C
+0x232E	0x26AF6
+0x2331	0x28670
+0x2333	0x28675
+0x2334	0x28E17
+0x2338	0x201F1
+0x233A	0x201DA
+0x233C	0x205B9
+0x2341	0x206CE
+0x2342	0x206D2
+0x2343	0x206D0
+0x2345	0x20843
+0x2349	0x2084D
+0x234A	0x20934
+0x234C	0x209D9
+0x234E	0x20A18
+0x2350	0x20B38
+0x2352	0x20BD7
+0x2355	0x20BDC
+0x2356	0x20BCB
+0x2357	0x20BD6
+0x2358	0x20BD8
+0x235A	0x20BD1
+0x235B	0x2F83E
+0x235C	0x2F83C
+0x235D	0x20BD2
+0x2360	0x21259
+0x2363	0x215E5
+0x2364	0x215E6
+0x2366	0x215E8
+0x2368	0x216BD
+0x236B	0x216BE
+0x236C	0x21949
+0x236E	0x219CD
+0x2372	0x21B5E
+0x2373	0x21BD0
+0x2375	0x21D06
+0x237C	0x21D7C
+0x237D	0x21D71
+0x237E	0x21FEF
+0x2426	0x2218D
+0x2427	0x221B7
+0x242A	0x22333
+0x242B	0x2237F
+0x242D	0x225F2
+0x2434	0x22A2A
+0x2435	0x22A8B
+0x2437	0x22A83
+0x2438	0x22A8A
+0x243B	0x22A8E
+0x243D	0x22EB6
+0x2442	0x230D8
+0x2444	0x23156
+0x2445	0x233D2
+0x2447	0x2F8DB
+0x2449	0x233C2
+0x244A	0x23887
+0x244B	0x23881
+0x244C	0x239C2
+0x244D	0x239BC
+0x244E	0x23B23
+0x2450	0x23C93
+0x2453	0x2418D
+0x2454	0x2418E
+0x2457	0x2473B
+0x2458	0x2474D
+0x245A	0x24734
+0x245B	0x24731
+0x245C	0x248F2
+0x245D	0x248F0
+0x245F	0x24C15
+0x2460	0x24D28
+0x2463	0x24F25
+0x2464	0x250E7
+0x2466	0x250E9
+0x2467	0x25417
+0x246A	0x2626C
+0x246B	0x26280
+0x246C	0x2634B
+0x2471	0x268DE
+0x2472	0x268FB
+0x2474	0x26951
+0x2477	0x26B01
+0x2478	0x26B02
+0x247A	0x26B05
+0x247C	0x26B03
+0x247E	0x28451
+0x2524	0x28453
+0x2525	0x2867A
+0x2526	0x28678
+0x2527	0x28676
+0x2528	0x28679
+0x2529	0x2868F
+0x252A	0x2867C
+0x252C	0x28E1B
+0x252D	0x28E1C
+0x252F	0x23D92
+0x2532	0x2012E
+0x2533	0x2012C
+0x2535	0x2020C
+0x2537	0x2020B
+0x253A	0x20205
+0x253D	0x2F805
+0x2541	0x205C2
+0x2542	0x205C3
+0x2544	0x20648
+0x2546	0x20646
+0x2549	0x206EA
+0x254B	0x206EB
+0x254D	0x206EE
+0x2552	0x208D8
+0x2553	0x24C1E
+0x2554	0x209DF
+0x2555	0x209DE
+0x2558	0x20A4F
+0x255B	0x20C0D
+0x255C	0x20C08
+0x255E	0x20C09
+0x2561	0x20C12
+0x2562	0x20C65
+0x2567	0x21289
+0x256A	0x21284
+0x256B	0x2129E
+0x256C	0x2128B
+0x256F	0x21562
+0x2574	0x215F9
+0x2576	0x215F7
+0x2579	0x21606
+0x257A	0x216DD
+0x257C	0x216D9
+0x257D	0x216DF
+0x257E	0x216E2
+0x2624	0x200F1
+0x262B	0x21C3F
+0x262C	0x21C3E
+0x262D	0x21D0B
+0x2630	0x21D83
+0x2633	0x21D86
+0x2635	0x2207C
+0x2639	0x221F7
+0x263E	0x221FB
+0x263F	0x2233B
+0x2644	0x225F9
+0x2645	0x225CA
+0x2647	0x225FF
+0x264A	0x22609
+0x264B	0x22603
+0x2651	0x22610
+0x2652	0x2299A
+0x2653	0x2299F
+0x2657	0x22A87
+0x265A	0x22EB7
+0x265C	0x22F08
+0x265D	0x22EF9
+0x2660	0x22EF4
+0x2664	0x26657
+0x2666	0x233D6
+0x2668	0x2F8DE
+0x266B	0x233D4
+0x266E	0x23890
+0x266F	0x2388D
+0x2672	0x23960
+0x2673	0x239CE
+0x2674	0x239CF
+0x2677	0x239D1
+0x267C	0x23CCA
+0x2721	0x23CB7
+0x2723	0x23CB2
+0x2724	0x23CBB
+0x2725	0x23CB9
+0x2728	0x2419E
+0x272A	0x241B2
+0x272D	0x2456F
+0x272E	0x245AC
+0x2730	0x24623
+0x2735	0x2476C
+0x2737	0x24732
+0x2738	0x2475E
+0x273C	0x248FB
+0x273D	0x24B29
+0x273E	0x24BBD
+0x273F	0x24C1F
+0x2741	0x22341
+0x2742	0x24C1D
+0x2744	0x24D31
+0x2745	0x24D2F
+0x2747	0x25043
+0x2749	0x25041
+0x274B	0x250F5
+0x2750	0x250F2
+0x2754	0x2541E
+0x2755	0x25754
+0x2757	0x25756
+0x2758	0x25929
+0x2759	0x25927
+0x275A	0x25928
+0x275D	0x26279
+0x275E	0x2627E
+0x275F	0x264B6
+0x2760	0x264B7
+0x2768	0x2F981
+0x276B	0x2664D
+0x2770	0x26A09
+0x2771	0x26A08
+0x2774	0x26B1E
+0x2775	0x26B1A
+0x2776	0x26B23
+0x2777	0x26B15
+0x2778	0x26B19
+0x2779	0x26B16
+0x277C	0x26B14
+0x277D	0x26B18
+0x2822	0x2721F
+0x2823	0x275DD
+0x2824	0x275DF
+0x2825	0x28469
+0x2828	0x2846C
+0x282A	0x28693
+0x282C	0x28695
+0x282D	0x28694
+0x282E	0x28691
+0x282F	0x28697
+0x2830	0x28E30
+0x2834	0x2FA18
+0x2836	0x20231
+0x283B	0x20236
+0x2841	0x205C9
+0x2842	0x205CA
+0x2844	0x20718
+0x2845	0x20712
+0x2846	0x20719
+0x2847	0x20710
+0x2848	0x20716
+0x284A	0x2085F
+0x284C	0x208DF
+0x284D	0x20917
+0x284F	0x2093C
+0x2851	0x209EA
+0x2852	0x209E9
+0x2853	0x20A1C
+0x2854	0x20A58
+0x2855	0x20A64
+0x2856	0x20AF3
+0x2858	0x20C97
+0x285A	0x20C5A
+0x285B	0x20C59
+0x285D	0x20C8E
+0x285F	0x212BC
+0x2862	0x2160D
+0x2863	0x215FC
+0x2864	0x2160C
+0x2865	0x21707
+0x2866	0x2170A
+0x2868	0x21702
+0x286A	0x21726
+0x286B	0x21708
+0x286C	0x2171D
+0x286F	0x2194E
+0x2871	0x219ED
+0x2872	0x219EE
+0x2873	0x219EF
+0x2876	0x21C50
+0x2877	0x21C4C
+0x287A	0x21C4F
+0x287C	0x21DD4
+0x287E	0x21DB0
+0x2926	0x220A5
+0x2927	0x22209
+0x292F	0x223F3
+0x2930	0x223D7
+0x2933	0x224DC
+0x2938	0x2260B
+0x2942	0x2263A
+0x2943	0x2260D
+0x2944	0x22611
+0x2946	0x22620
+0x2947	0x22601
+0x2949	0x22637
+0x294A	0x2F8A3
+0x294C	0x229AA
+0x294F	0x22AE7
+0x2950	0x22AE8
+0x2953	0x22AF5
+0x2957	0x22B35
+0x2958	0x22AE6
+0x295A	0x22AF8
+0x295C	0x22AF1
+0x295E	0x22F14
+0x295F	0x22F15
+0x2960	0x22F09
+0x2966	0x2317B
+0x2968	0x2317E
+0x2969	0x23366
+0x296A	0x23367
+0x296B	0x2340A
+0x2975	0x2389C
+0x2976	0x23962
+0x2977	0x239E1
+0x2978	0x239DE
+0x2979	0x239DF
+0x297A	0x239E9
+0x297C	0x23CE4
+0x297D	0x23CF7
+0x2A22	0x23CEA
+0x2A23	0x23CF6
+0x2A24	0x23D12
+0x2A25	0x2F901
+0x2A29	0x241D9
+0x2A2B	0x2455F
+0x2A2D	0x24573
+0x2A30	0x2463F
+0x2A31	0x24778
+0x2A33	0x2477D
+0x2A36	0x24912
+0x2A3B	0x24B2F
+0x2A3E	0x24B30
+0x2A3F	0x24BDB
+0x2A42	0x24C29
+0x2A44	0x2F936
+0x2A45	0x24D40
+0x2A47	0x24D3D
+0x2A48	0x24D3E
+0x2A4B	0x24D38
+0x2A4D	0x24F48
+0x2A4F	0x24FD0
+0x2A5B	0x2510E
+0x2A5C	0x25109
+0x2A5E	0x25107
+0x2A60	0x2535F
+0x2A61	0x25360
+0x2A63	0x2542A
+0x2A65	0x25429
+0x2A68	0x2564D
+0x2A6D	0x2576C
+0x2A70	0x25767
+0x2A73	0x25939
+0x2A74	0x25934
+0x2A75	0x25A59
+0x2A78	0x26223
+0x2A7A	0x26282
+0x2A7C	0x26283
+0x2A7D	0x262A8
+0x2A7E	0x26355
+0x2B21	0x263F9
+0x2B22	0x263F8
+0x2B23	0x263FC
+0x2B24	0x263FA
+0x2B26	0x2F97A
+0x2B2B	0x26674
+0x2B2D	0x2666B
+0x2B2E	0x26671
+0x2B30	0x26676
+0x2B31	0x26A0E
+0x2B34	0x26A10
+0x2B35	0x26A0F
+0x2B37	0x26B38
+0x2B38	0x26B39
+0x2B39	0x26B3A
+0x2B3B	0x26B37
+0x2B3C	0x26B3E
+0x2B3F	0x2719C
+0x2B40	0x2722A
+0x2B41	0x2723A
+0x2B42	0x2722B
+0x2B43	0x27228
+0x2B44	0x275AA
+0x2B45	0x2760F
+0x2B47	0x27610
+0x2B48	0x277E6
+0x2B4A	0x27D25
+0x2B4B	0x27E8E
+0x2B4F	0x2848B
+0x2B51	0x2848C
+0x2B52	0x2849A
+0x2B55	0x286B3
+0x2B57	0x286B2
+0x2B5C	0x28E44
+0x2B5F	0x20158
+0x2B60	0x202A7
+0x2B63	0x20263
+0x2B66	0x2026A
+0x2B67	0x20265
+0x2B68	0x2026B
+0x2B6A	0x204ED
+0x2B6B	0x205D9
+0x2B6C	0x2073B
+0x2B6D	0x20732
+0x2B6F	0x20735
+0x2B70	0x20731
+0x2B71	0x2073E
+0x2B72	0x20743
+0x2B73	0x20736
+0x2B74	0x2086D
+0x2B76	0x208E4
+0x2B79	0x209F4
+0x2B7B	0x20A69
+0x2B7C	0x20A6B
+0x2C22	0x20CBF
+0x2C23	0x20CC3
+0x2C24	0x20CAE
+0x2C27	0x20CB1
+0x2C2A	0x20CBB
+0x2C2B	0x20CAF
+0x2C2C	0x20CB0
+0x2C30	0x212EF
+0x2C32	0x212ED
+0x2C34	0x212F0
+0x2C35	0x21593
+0x2C36	0x21634
+0x2C37	0x2162B
+0x2C43	0x21A04
+0x2C44	0x21A03
+0x2C45	0x21A02
+0x2C47	0x21A05
+0x2C4A	0x21A00
+0x2C4B	0x21B74
+0x2C4F	0x21C65
+0x2C50	0x21C63
+0x2C52	0x21DD7
+0x2C56	0x21DE8
+0x2C58	0x21DDB
+0x2C59	0x21DD8
+0x2C5D	0x21E09
+0x2C62	0x21DE5
+0x2C63	0x21DE7
+0x2C65	0x2203F
+0x2C67	0x220C0
+0x2C69	0x220B9
+0x2C6A	0x220BA
+0x2C6E	0x22220
+0x2C6F	0x2234F
+0x2C73	0x22491
+0x2C74	0x22490
+0x2C75	0x224EE
+0x2C76	0x224F3
+0x2C77	0x224EC
+0x2C78	0x224F1
+0x2C79	0x224EB
+0x2C7A	0x224F2
+0x2C7B	0x224F4
+0x2C7C	0x224ED
+0x2C7D	0x22641
+0x2C7E	0x22648
+0x2D21	0x22645
+0x2D26	0x2267F
+0x2D27	0x2268B
+0x2D29	0x2263B
+0x2D2A	0x2264E
+0x2D2E	0x2267C
+0x2D34	0x22AF0
+0x2D35	0x22B36
+0x2D36	0x22B3F
+0x2D37	0x22B43
+0x2D38	0x22B31
+0x2D39	0x22B34
+0x2D3A	0x22B46
+0x2D3D	0x22B2F
+0x2D3E	0x22EC3
+0x2D41	0x22F36
+0x2D45	0x22F21
+0x2D46	0x2F8C8
+0x2D48	0x23073
+0x2D4A	0x230E6
+0x2D50	0x2343F
+0x2D53	0x2346B
+0x2D5A	0x23471
+0x2D5C	0x2F8E2
+0x2D5F	0x238B0
+0x2D63	0x239F3
+0x2D65	0x2F8F5
+0x2D68	0x23B61
+0x2D69	0x23B5F
+0x2D6D	0x23D28
+0x2D6E	0x23D1E
+0x2D6F	0x23D29
+0x2D70	0x2F902
+0x2D71	0x23CEB
+0x2D72	0x23D66
+0x2D74	0x241F6
+0x2D77	0x24560
+0x2D78	0x24577
+0x2D79	0x245BB
+0x2D7B	0x245BC
+0x2E23	0x247A2
+0x2E24	0x247B2
+0x2E25	0x2479E
+0x2E28	0x2493A
+0x2E29	0x24938
+0x2E2E	0x24C4D
+0x2E30	0x24C5E
+0x2E32	0x24D17
+0x2E3D	0x24D64
+0x2E3E	0x24D67
+0x2E42	0x24F59
+0x2E44	0x24FDA
+0x2E48	0x25051
+0x2E4A	0x25055
+0x2E4B	0x2513B
+0x2E4C	0x25134
+0x2E4E	0x25137
+0x2E50	0x25131
+0x2E53	0x2513F
+0x2E54	0x25159
+0x2E56	0x25361
+0x2E59	0x25458
+0x2E5A	0x25462
+0x2E5B	0x25450
+0x2E5D	0x25451
+0x2E60	0x25446
+0x2E63	0x2562D
+0x2E66	0x25948
+0x2E67	0x25951
+0x2E68	0x2594A
+0x2E69	0x2594F
+0x2E6A	0x25950
+0x2E6B	0x25949
+0x2E6C	0x25A63
+0x2E6E	0x25A66
+0x2E6F	0x25A60
+0x2E74	0x25AF1
+0x2E76	0x25B07
+0x2E79	0x25F9B
+0x2E7A	0x25FA3
+0x2E7B	0x25F9D
+0x2F22	0x25FA9
+0x2F23	0x25FA7
+0x2F24	0x25FA4
+0x2F26	0x25FBA
+0x2F27	0x221C1
+0x2F28	0x26226
+0x2F2B	0x26294
+0x2F2C	0x26293
+0x2F31	0x26407
+0x2F32	0x2640D
+0x2F33	0x26402
+0x2F34	0x2640C
+0x2F35	0x26409
+0x2F36	0x26408
+0x2F37	0x26413
+0x2F39	0x264D2
+0x2F3B	0x2653E
+0x2F3C	0x2653C
+0x2F3D	0x26667
+0x2F3E	0x2669E
+0x2F40	0x266AD
+0x2F42	0x266D9
+0x2F43	0x26642
+0x2F44	0x266A3
+0x2F45	0x266A0
+0x2F48	0x2667C
+0x2F49	0x26904
+0x2F4B	0x26958
+0x2F4C	0x26960
+0x2F4D	0x269C9
+0x2F4E	0x269C8
+0x2F51	0x26A1C
+0x2F52	0x26A1A
+0x2F54	0x26B74
+0x2F56	0x26B6E
+0x2F57	0x26B6F
+0x2F58	0x26B79
+0x2F5B	0x26B77
+0x2F60	0x26B7C
+0x2F62	0x26B70
+0x2F65	0x26B7A
+0x2F66	0x26B82
+0x2F6A	0x27244
+0x2F6C	0x27243
+0x2F6E	0x27245
+0x2F70	0x27625
+0x2F71	0x2761F
+0x2F74	0x277E8
+0x2F77	0x27809
+0x2F78	0x278B7
+0x2F79	0x278B9
+0x2F7A	0x27964
+0x2F7B	0x27963
+0x3021	0x27962
+0x3022	0x27965
+0x3024	0x27BAC
+0x3026	0x27D2A
+0x3029	0x27E96
+0x302B	0x27FC2
+0x302C	0x2F9DE
+0x3031	0x284AA
+0x3032	0x284B0
+0x3035	0x286D4
+0x3036	0x286CD
+0x3037	0x286D6
+0x3039	0x287F0
+0x3043	0x29D4B
+0x3044	0x20162
+0x3046	0x202B7
+0x3048	0x202AC
+0x3049	0x202AB
+0x304B	0x202C1
+0x304E	0x205E8
+0x304F	0x20769
+0x3050	0x2075D
+0x3051	0x2075F
+0x3055	0x20764
+0x3056	0x20762
+0x305B	0x208F9
+0x305D	0x208EE
+0x3061	0x209AB
+0x3062	0x209AC
+0x3063	0x209AA
+0x3066	0x20A86
+0x3067	0x20A7A
+0x3069	0x20D28
+0x306E	0x20D31
+0x3075	0x20D2D
+0x3076	0x2F843
+0x3078	0x20D2B
+0x3079	0x20D32
+0x307C	0x21329
+0x307D	0x21326
+0x307E	0x21353
+0x3122	0x21333
+0x3123	0x21334
+0x3124	0x2159D
+0x3127	0x21641
+0x312A	0x21791
+0x312B	0x21769
+0x312D	0x21A22
+0x312F	0x21A34
+0x3130	0x2F86D
+0x3131	0x21B2E
+0x3134	0x21BF4
+0x3136	0x21E28
+0x3138	0x21E1C
+0x313A	0x21E11
+0x313B	0x21E24
+0x313C	0x21E15
+0x313E	0x21E16
+0x313F	0x21E54
+0x3140	0x21E23
+0x3141	0x21FFF
+0x3143	0x220CF
+0x3144	0x220D0
+0x3146	0x220CE
+0x314A	0x221C7
+0x314B	0x2225C
+0x314D	0x22236
+0x3150	0x22243
+0x3155	0x2252A
+0x3156	0x22501
+0x3158	0x2250B
+0x3159	0x2250F
+0x315F	0x226DF
+0x3161	0x226D2
+0x3165	0x226CD
+0x3169	0x226DB
+0x316D	0x226CF
+0x316F	0x229C0
+0x3172	0x22B81
+0x3173	0x22B82
+0x3174	0x22B8A
+0x3175	0x22BA8
+0x3176	0x22B8C
+0x317D	0x22B8E
+0x3222	0x22B8B
+0x3224	0x22B96
+0x3226	0x22BCC
+0x3229	0x22F4F
+0x322A	0x22F4A
+0x322D	0x22F4B
+0x322E	0x22F3D
+0x3230	0x22F44
+0x3231	0x22F49
+0x3232	0x2309E
+0x3233	0x230F3
+0x3235	0x230F5
+0x3238	0x231B3
+0x323C	0x231E5
+0x323D	0x231B6
+0x323E	0x2F8D8
+0x3240	0x23486
+0x3244	0x234B6
+0x3245	0x23485
+0x3247	0x234AB
+0x324B	0x23A0D
+0x324C	0x23A8B
+0x324D	0x23A8C
+0x3256	0x23B72
+0x3259	0x23D8F
+0x325B	0x23D79
+0x325D	0x23D77
+0x325F	0x23D90
+0x3260	0x23D88
+0x3261	0x23D80
+0x3262	0x23D9E
+0x3265	0x23D82
+0x3266	0x23D34
+0x3267	0x23D89
+0x3269	0x23D85
+0x326A	0x23D7E
+0x326B	0x23D7A
+0x326C	0x23DA6
+0x326E	0x23DB5
+0x326F	0x241F4
+0x3273	0x24229
+0x3274	0x24226
+0x3275	0x2422A
+0x3278	0x2457E
+0x327B	0x2465B
+0x327C	0x24661
+0x327D	0x24660
+0x3321	0x2479B
+0x3324	0x247C3
+0x3326	0x247CD
+0x3331	0x24954
+0x3332	0x24959
+0x3336	0x24AF5
+0x333D	0x24C69
+0x333E	0x24C65
+0x3341	0x24D7C
+0x3344	0x24D80
+0x3346	0x24F65
+0x3349	0x24FDF
+0x334A	0x25060
+0x334C	0x2505E
+0x3353	0x2518F
+0x3354	0x25161
+0x3355	0x2515A
+0x3358	0x25367
+0x335C	0x253BB
+0x3368	0x2579B
+0x336C	0x257A9
+0x336E	0x25966
+0x3373	0x25A72
+0x3374	0x25A76
+0x3375	0x25B14
+0x3379	0x25B0F
+0x337E	0x25E41
+0x3421	0x25E46
+0x3423	0x25E4B
+0x3424	0x25E43
+0x3428	0x25FC6
+0x342A	0x25FC7
+0x342C	0x25FCE
+0x342F	0x25FC9
+0x3431	0x25FCB
+0x3432	0x25FC5
+0x3439	0x26369
+0x343F	0x2641E
+0x3440	0x264BA
+0x3442	0x26552
+0x3443	0x26551
+0x3444	0x26553
+0x3445	0x2669F
+0x3446	0x266DB
+0x3449	0x266E3
+0x344E	0x266D7
+0x344F	0x266E9
+0x3454	0x266DE
+0x3455	0x266DC
+0x3456	0x2693C
+0x3457	0x2F98B
+0x3459	0x26A22
+0x345A	0x26A32
+0x345B	0x26A23
+0x345F	0x26BD4
+0x3460	0x26BC8
+0x3461	0x26BBC
+0x3464	0x26BCD
+0x3468	0x26BBE
+0x346A	0x26C40
+0x346B	0x26BD6
+0x346E	0x26BBD
+0x3470	0x26BBA
+0x3472	0x26BC0
+0x3473	0x2F99B
+0x3474	0x2F99D
+0x3475	0x26BC1
+0x3476	0x271A6
+0x3477	0x271A5
+0x3478	0x271A8
+0x347D	0x2725F
+0x347E	0x27270
+0x3521	0x2726A
+0x3522	0x27265
+0x3523	0x27267
+0x3524	0x2726F
+0x3525	0x27287
+0x3528	0x2763D
+0x3529	0x27643
+0x352B	0x27640
+0x3532	0x27818
+0x3536	0x27819
+0x3537	0x278C1
+0x353B	0x278BC
+0x353C	0x278C8
+0x353E	0x27971
+0x3540	0x2796E
+0x3542	0x27978
+0x3545	0x2F9CD
+0x3546	0x2797A
+0x3547	0x27BB1
+0x3548	0x27BAF
+0x3549	0x27BB0
+0x354E	0x27CA8
+0x354F	0x27CA6
+0x3552	0x27D48
+0x3553	0x27D45
+0x3557	0x27EA0
+0x3558	0x27EA4
+0x355A	0x27FD4
+0x355F	0x27FD2
+0x3560	0x28222
+0x3564	0x282B7
+0x3565	0x282CC
+0x3567	0x284E6
+0x356A	0x284C8
+0x356D	0x286F4
+0x356F	0x286ED
+0x3571	0x2867E
+0x3572	0x2F9E3
+0x3576	0x287F9
+0x3577	0x287FD
+0x3579	0x28807
+0x357E	0x28E78
+0x3621	0x28E7A
+0x3622	0x28E79
+0x3623	0x28F8A
+0x3625	0x2907B
+0x3626	0x291D5
+0x3627	0x291E9
+0x3629	0x291EB
+0x362F	0x2016C
+0x3635	0x202FA
+0x363B	0x20318
+0x363E	0x205F6
+0x3640	0x2078A
+0x3641	0x20789
+0x3643	0x2077F
+0x3644	0x20788
+0x3646	0x20783
+0x3647	0x20784
+0x3648	0x20798
+0x3649	0x20763
+0x364A	0x20787
+0x364C	0x2F827
+0x364E	0x208F5
+0x364F	0x20950
+0x3652	0x20A87
+0x3653	0x20A8A
+0x3654	0x20B65
+0x3655	0x20DB7
+0x3656	0x20DC1
+0x3657	0x20DC7
+0x365A	0x20DC5
+0x365B	0x20DCB
+0x365D	0x20DD1
+0x3661	0x20DB8
+0x3662	0x20DCA
+0x3664	0x20DDE
+0x3666	0x20DCE
+0x366A	0x21368
+0x366C	0x2136B
+0x3670	0x2136A
+0x3672	0x21366
+0x3673	0x21377
+0x3674	0x21396
+0x3675	0x2136E
+0x3676	0x2F856
+0x3678	0x21657
+0x367A	0x21656
+0x367B	0x2179C
+0x367C	0x2179E
+0x3721	0x217A1
+0x3723	0x21A42
+0x3725	0x21A46
+0x3726	0x21A3E
+0x3727	0x21B33
+0x372A	0x21BFA
+0x372C	0x21C97
+0x372D	0x21C9B
+0x372E	0x21CAA
+0x3730	0x21E73
+0x3731	0x21E7C
+0x3733	0x21E86
+0x3737	0x220F3
+0x3738	0x220F0
+0x373E	0x220EC
+0x373F	0x222AF
+0x3742	0x22264
+0x3743	0x22268
+0x3744	0x2235A
+0x3746	0x2251F
+0x3747	0x22525
+0x374B	0x226C6
+0x374C	0x226D6
+0x374D	0x226C3
+0x374F	0x2272C
+0x3751	0x2272E
+0x3752	0x2275E
+0x3753	0x22733
+0x3757	0x2272D
+0x3758	0x22746
+0x375A	0x226C1
+0x375B	0x2273A
+0x375C	0x229CC
+0x375D	0x22B9D
+0x375E	0x22B83
+0x375F	0x22BF6
+0x3763	0x22BF8
+0x3766	0x22BFE
+0x3767	0x22BF3
+0x3769	0x22BEB
+0x376A	0x22BFA
+0x376C	0x22C07
+0x376D	0x22BFC
+0x3772	0x22F72
+0x3773	0x22F73
+0x3774	0x22F74
+0x377A	0x22F5F
+0x377B	0x22F60
+0x377C	0x230AA
+0x377D	0x23134
+0x3821	0x231B4
+0x3823	0x231F0
+0x3826	0x2320D
+0x3827	0x231F3
+0x3828	0x2320F
+0x382B	0x234C9
+0x382E	0x234C5
+0x3830	0x234D7
+0x3831	0x234CC
+0x3833	0x234E7
+0x3836	0x234C1
+0x3838	0x234E8
+0x383A	0x238CB
+0x383D	0x238C8
+0x383E	0x2397A
+0x3840	0x23979
+0x3841	0x2397E
+0x3843	0x23A1B
+0x3847	0x23A1F
+0x3848	0x23A19
+0x384D	0x23B89
+0x3850	0x23B8B
+0x3853	0x23E09
+0x3854	0x23DFE
+0x3855	0x23E00
+0x3858	0x23E0B
+0x385D	0x23E4A
+0x3863	0x24279
+0x3866	0x2426C
+0x3867	0x24299
+0x3868	0x2F91B
+0x3869	0x24262
+0x386A	0x24514
+0x386D	0x245C8
+0x386E	0x245D7
+0x386F	0x2460C
+0x3871	0x24670
+0x3874	0x24671
+0x3875	0x247DF
+0x3876	0x247E4
+0x3878	0x247E7
+0x387C	0x24990
+0x3922	0x24B4C
+0x3927	0x24B4F
+0x3929	0x24C7D
+0x392A	0x24C7E
+0x392B	0x24C7C
+0x392D	0x24C8D
+0x392E	0x24D19
+0x3931	0x24DC0
+0x3937	0x24DB6
+0x3939	0x24DA8
+0x393B	0x24FEB
+0x393C	0x24FE7
+0x393D	0x2506F
+0x393E	0x251C7
+0x3940	0x2519F
+0x3944	0x251C4
+0x394E	0x2519B
+0x394F	0x25197
+0x3950	0x251C5
+0x3951	0x2536B
+0x3952	0x253CE
+0x3955	0x254B1
+0x3956	0x254AE
+0x3957	0x254B0
+0x395B	0x2573E
+0x395C	0x257B5
+0x395D	0x257BA
+0x395F	0x257B2
+0x3960	0x257B4
+0x3966	0x25977
+0x3968	0x25986
+0x3969	0x2597B
+0x396B	0x25A7E
+0x396C	0x25B2E
+0x396E	0x25B2F
+0x3970	0x25B37
+0x3973	0x25B32
+0x3977	0x25B36
+0x3978	0x25B39
+0x3979	0x25B35
+0x397A	0x25E5C
+0x397E	0x25E7B
+0x3A21	0x25E61
+0x3A22	0x25FEE
+0x3A23	0x25FEB
+0x3A24	0x25FEF
+0x3A25	0x26020
+0x3A29	0x26230
+0x3A2C	0x262BE
+0x3A2E	0x26367
+0x3A2F	0x2637C
+0x3A32	0x26424
+0x3A36	0x26429
+0x3A37	0x264EF
+0x3A3C	0x2670D
+0x3A46	0x26764
+0x3A48	0x26715
+0x3A50	0x26A35
+0x3A51	0x26A36
+0x3A52	0x26A34
+0x3A53	0x26A37
+0x3A54	0x26C47
+0x3A55	0x26C2B
+0x3A57	0x26C41
+0x3A58	0x26C43
+0x3A5A	0x26C42
+0x3A5D	0x26C32
+0x3A62	0x26C44
+0x3A63	0x26C4A
+0x3A66	0x2F9A0
+0x3A69	0x26C54
+0x3A6A	0x26C6E
+0x3A6B	0x26C52
+0x3A73	0x27292
+0x3A75	0x2F9B8
+0x3A77	0x272BF
+0x3A7C	0x27641
+0x3A7D	0x27669
+0x3A7E	0x27665
+0x3B24	0x27822
+0x3B25	0x2781D
+0x3B26	0x278D2
+0x3B27	0x278DA
+0x3B28	0x278DB
+0x3B2D	0x279A4
+0x3B2E	0x2799E
+0x3B32	0x2799D
+0x3B37	0x279AD
+0x3B38	0x279A6
+0x3B39	0x279A7
+0x3B3A	0x27BB3
+0x3B3B	0x27BE0
+0x3B3C	0x27C35
+0x3B3D	0x27C37
+0x3B40	0x27D4A
+0x3B44	0x27E5E
+0x3B46	0x27EC0
+0x3B4E	0x27FF9
+0x3B56	0x284F0
+0x3B58	0x284F3
+0x3B59	0x2851B
+0x3B5A	0x284F2
+0x3B5B	0x284FB
+0x3B5C	0x2871C
+0x3B5D	0x28713
+0x3B5F	0x2870F
+0x3B61	0x28816
+0x3B62	0x28811
+0x3B63	0x28812
+0x3B65	0x2880E
+0x3B68	0x28C67
+0x3B69	0x28CF2
+0x3B6A	0x28CDA
+0x3B6C	0x28CDC
+0x3B6E	0x28F94
+0x3B6F	0x28F9B
+0x3B70	0x28F92
+0x3B71	0x28F9A
+0x3B72	0x29088
+0x3B73	0x29086
+0x3B75	0x291EF
+0x3B78	0x2925E
+0x3B7A	0x29458
+0x3B7C	0x29456
+0x3B7D	0x29454
+0x3C21	0x2959B
+0x3C22	0x29696
+0x3C23	0x296A4
+0x3C26	0x2969A
+0x3C27	0x29A12
+0x3C2B	0x2036B
+0x3C2E	0x20337
+0x3C2F	0x2033C
+0x3C30	0x2F80A
+0x3C31	0x204F7
+0x3C33	0x20566
+0x3C35	0x207A9
+0x3C36	0x207AE
+0x3C37	0x207AD
+0x3C38	0x207C8
+0x3C39	0x207A5
+0x3C3A	0x207B0
+0x3C3B	0x20895
+0x3C3D	0x20925
+0x3C3F	0x20A99
+0x3C41	0x20B74
+0x3C42	0x20B70
+0x3C43	0x20B6F
+0x3C44	0x20E41
+0x3C45	0x20E54
+0x3C48	0x20E40
+0x3C49	0x20E38
+0x3C4D	0x20E52
+0x3C4E	0x20E3A
+0x3C4F	0x20E57
+0x3C50	0x2F84A
+0x3C51	0x20E59
+0x3C54	0x213B4
+0x3C55	0x213C0
+0x3C5A	0x21375
+0x3C5D	0x21660
+0x3C5E	0x21647
+0x3C60	0x217F0
+0x3C62	0x217EF
+0x3C65	0x217EC
+0x3C66	0x21983
+0x3C68	0x21984
+0x3C69	0x2198F
+0x3C6B	0x21A61
+0x3C6D	0x21A69
+0x3C70	0x21A62
+0x3C7A	0x21EAE
+0x3C7D	0x21EB2
+0x3D22	0x2210B
+0x3D24	0x22110
+0x3D25	0x2210D
+0x3D2B	0x2227F
+0x3D2C	0x22281
+0x3D31	0x2240B
+0x3D32	0x2254E
+0x3D35	0x227EA
+0x3D36	0x22745
+0x3D3F	0x22728
+0x3D40	0x2275D
+0x3D41	0x229DC
+0x3D44	0x229D4
+0x3D46	0x22C64
+0x3D47	0x22C68
+0x3D49	0x22C62
+0x3D4B	0x22C61
+0x3D4D	0x22C66
+0x3D51	0x22BF2
+0x3D52	0x22C69
+0x3D53	0x22C67
+0x3D55	0x22F9A
+0x3D56	0x22F9B
+0x3D57	0x22F85
+0x3D58	0x22F9C
+0x3D5A	0x22FA4
+0x3D5E	0x22F99
+0x3D5F	0x22F86
+0x3D60	0x22F90
+0x3D61	0x23081
+0x3D62	0x230AE
+0x3D66	0x23138
+0x3D6A	0x2353B
+0x3D70	0x2354C
+0x3D73	0x23547
+0x3D74	0x23535
+0x3D77	0x23533
+0x3D79	0x23582
+0x3D7A	0x23540
+0x3E25	0x23A36
+0x3E26	0x23B0E
+0x3E2A	0x23BAD
+0x3E2B	0x23BAA
+0x3E2C	0x23E17
+0x3E2E	0x23E67
+0x3E31	0x23E72
+0x3E33	0x2F90A
+0x3E34	0x23E61
+0x3E35	0x23EB0
+0x3E3A	0x23E6E
+0x3E3B	0x23E64
+0x3E3D	0x23E8C
+0x3E3E	0x23E66
+0x3E40	0x23E6B
+0x3E41	0x23E5F
+0x3E42	0x23E74
+0x3E43	0x23E65
+0x3E44	0x242BB
+0x3E45	0x242BE
+0x3E47	0x242B9
+0x3E4A	0x242EF
+0x3E4D	0x245DA
+0x3E50	0x24690
+0x3E51	0x247E9
+0x3E55	0x24811
+0x3E56	0x2480D
+0x3E57	0x247ED
+0x3E58	0x24821
+0x3E5A	0x24981
+0x3E5B	0x249B1
+0x3E5C	0x24B01
+0x3E5E	0x24B5E
+0x3E5F	0x24B62
+0x3E64	0x24B5B
+0x3E66	0x24C96
+0x3E67	0x24C93
+0x3E6A	0x24C92
+0x3E6C	0x2F939
+0x3E70	0x24DC4
+0x3E71	0x24DC7
+0x3E72	0x24DC3
+0x3E75	0x24DC8
+0x3E79	0x24DCA
+0x3E7B	0x24DC5
+0x3E7C	0x24DCF
+0x3E7D	0x24DDC
+0x3E7E	0x24F7C
+0x3F21	0x25001
+0x3F23	0x251D3
+0x3F24	0x251DC
+0x3F28	0x251D4
+0x3F2A	0x251CC
+0x3F2E	0x251D6
+0x3F2F	0x251DB
+0x3F31	0x251D5
+0x3F32	0x253D9
+0x3F34	0x253DD
+0x3F35	0x253DC
+0x3F36	0x253E0
+0x3F37	0x254CC
+0x3F41	0x254D2
+0x3F43	0x254D3
+0x3F48	0x2568D
+0x3F4E	0x257D8
+0x3F51	0x257BC
+0x3F56	0x25A8A
+0x3F58	0x25A8B
+0x3F59	0x25A8D
+0x3F5C	0x25B53
+0x3F5F	0x25B59
+0x3F64	0x25B56
+0x3F65	0x25B57
+0x3F68	0x25E73
+0x3F69	0x2601B
+0x3F6B	0x26021
+0x3F6C	0x26016
+0x3F6D	0x26018
+0x3F70	0x26044
+0x3F72	0x26026
+0x3F74	0x26236
+0x3F79	0x2643A
+0x3F7B	0x264F4
+0x3F7E	0x26762
+0x4021	0x2675B
+0x4022	0x2676A
+0x4024	0x26768
+0x402B	0x26781
+0x4031	0x26CE7
+0x4033	0x26CE6
+0x4034	0x26CD1
+0x4035	0x26D11
+0x4037	0x26CD0
+0x4038	0x26CD9
+0x4039	0x26D0A
+0x403B	0x26CDA
+0x403C	0x26CDD
+0x403D	0x26CC8
+0x403E	0x26CE2
+0x403F	0x26CE9
+0x4040	0x26CCB
+0x4042	0x26CCC
+0x4043	0x26CC1
+0x4045	0x26CDE
+0x404A	0x26D51
+0x404B	0x26D12
+0x404D	0x26CE0
+0x404E	0x26D2B
+0x404F	0x2F9B4
+0x4050	0x272D8
+0x4051	0x272D1
+0x4053	0x272D2
+0x4054	0x272CD
+0x4058	0x2733D
+0x405A	0x272CA
+0x405C	0x272CB
+0x405E	0x272D7
+0x405F	0x275F4
+0x4063	0x27687
+0x4064	0x2768B
+0x4065	0x27683
+0x4068	0x279C5
+0x4069	0x279D2
+0x406A	0x279C6
+0x406B	0x279D3
+0x406F	0x279F0
+0x4070	0x279CD
+0x4071	0x279CC
+0x4072	0x279DC
+0x4073	0x279D6
+0x4075	0x27BE6
+0x4076	0x27C41
+0x4077	0x27C3F
+0x4079	0x27CC5
+0x407A	0x27CC0
+0x407B	0x27CC6
+0x407C	0x27CBE
+0x407D	0x27CBF
+0x4122	0x27D63
+0x4123	0x27ED3
+0x4124	0x27EDA
+0x4125	0x27ED5
+0x412B	0x282EE
+0x412D	0x282FC
+0x412E	0x28414
+0x4130	0x28523
+0x4131	0x28522
+0x4132	0x28530
+0x4133	0x286B5
+0x4135	0x28738
+0x4137	0x2873F
+0x4144	0x28968
+0x4145	0x28967
+0x4147	0x28965
+0x414A	0x28C75
+0x414B	0x28CF7
+0x414C	0x28CF3
+0x414D	0x28CF6
+0x414F	0x28D00
+0x4151	0x28CFF
+0x4152	0x28CF5
+0x4158	0x29092
+0x4159	0x29206
+0x415B	0x29207
+0x415C	0x2926B
+0x415E	0x2926C
+0x4160	0x29393
+0x4162	0x29394
+0x4166	0x29462
+0x4167	0x29463
+0x4169	0x2945F
+0x416A	0x29464
+0x416B	0x2945B
+0x416C	0x29459
+0x416F	0x295A4
+0x4170	0x295AC
+0x4173	0x296B5
+0x4176	0x296AE
+0x4178	0x296C5
+0x417C	0x2983B
+0x4223	0x29ABF
+0x4224	0x29C2B
+0x4225	0x29C84
+0x4226	0x29C80
+0x4227	0x29D4D
+0x4228	0x29D4F
+0x422A	0x29D4C
+0x422B	0x29F92
+0x4230	0x203AE
+0x4231	0x20379
+0x4234	0x20371
+0x4236	0x203B3
+0x4238	0x2032C
+0x4239	0x20377
+0x423A	0x2052F
+0x423B	0x207C3
+0x423D	0x207CD
+0x4240	0x207C9
+0x4244	0x207CE
+0x4245	0x208A5
+0x4246	0x208A0
+0x4247	0x208FE
+0x4248	0x20959
+0x4249	0x20A9A
+0x424C	0x20EE4
+0x424D	0x20ED7
+0x424E	0x20EDC
+0x4250	0x20EE7
+0x4254	0x20EE5
+0x425A	0x21414
+0x425C	0x213F1
+0x4261	0x215B6
+0x4262	0x2166E
+0x4263	0x2166C
+0x4264	0x21681
+0x4265	0x21842
+0x426A	0x2181A
+0x426E	0x21827
+0x426F	0x21825
+0x4270	0x21817
+0x4271	0x2181C
+0x4272	0x2183D
+0x4273	0x21820
+0x4276	0x21A81
+0x427A	0x21C09
+0x427B	0x21CC6
+0x427C	0x21CC4
+0x427E	0x21CC5
+0x4323	0x21EEF
+0x4325	0x21EDF
+0x4326	0x21EDE
+0x4327	0x21EEE
+0x4328	0x21EF5
+0x4329	0x21EEC
+0x432B	0x21EDD
+0x4334	0x22122
+0x4337	0x22297
+0x4338	0x22295
+0x433C	0x224A9
+0x433E	0x22553
+0x4340	0x22556
+0x4341	0x22555
+0x4344	0x227E3
+0x4345	0x227E2
+0x434F	0x227A9
+0x4351	0x2F8AB
+0x4352	0x22833
+0x4353	0x2280A
+0x4355	0x22A59
+0x4357	0x22CBC
+0x4359	0x22CC4
+0x435A	0x22CC7
+0x435B	0x22CC6
+0x435F	0x22CB8
+0x4360	0x22CDA
+0x4362	0x22CB7
+0x4363	0x22CC0
+0x4365	0x22CCD
+0x4367	0x22FBC
+0x4368	0x22FAB
+0x436A	0x23086
+0x436C	0x2325A
+0x4370	0x23343
+0x4372	0x235AC
+0x4376	0x235BE
+0x437B	0x235AB
+0x4426	0x21B3E
+0x4429	0x238F9
+0x442B	0x238F3
+0x442C	0x238F7
+0x442E	0x23A45
+0x442F	0x23A48
+0x4434	0x23A44
+0x4436	0x23AAF
+0x4437	0x23AB1
+0x443B	0x23BCF
+0x443D	0x23BCB
+0x443E	0x23BCD
+0x4440	0x23C50
+0x4441	0x23EEC
+0x4442	0x23F1A
+0x4445	0x23ED8
+0x4447	0x23ED0
+0x4448	0x23ED1
+0x444B	0x23E7B
+0x444C	0x23ED2
+0x444E	0x23ED4
+0x444F	0x23EE7
+0x4450	0x23EDF
+0x4451	0x23EDE
+0x4453	0x23ED9
+0x4454	0x23ECF
+0x4455	0x2430D
+0x445D	0x24338
+0x4461	0x246A9
+0x446B	0x2483E
+0x446C	0x24846
+0x446D	0x249ED
+0x446E	0x2F930
+0x4472	0x24B6C
+0x447A	0x24CAC
+0x447D	0x24DC9
+0x4522	0x24E12
+0x4525	0x24DFD
+0x4526	0x24E01
+0x4527	0x24E11
+0x4529	0x24E89
+0x452A	0x24E05
+0x452B	0x24DFE
+0x452C	0x24E0B
+0x452D	0x24E20
+0x452E	0x24E04
+0x452F	0x24F88
+0x4531	0x25002
+0x4533	0x25003
+0x453A	0x25229
+0x453B	0x2523B
+0x453E	0x25206
+0x4545	0x25203
+0x4547	0x25378
+0x4548	0x25379
+0x4549	0x2537D
+0x454B	0x2537F
+0x4550	0x25532
+0x4552	0x25500
+0x4554	0x25522
+0x4556	0x256A9
+0x455C	0x25804
+0x455F	0x2F959
+0x4561	0x259B8
+0x4562	0x25A9B
+0x4567	0x25B92
+0x456C	0x25B8F
+0x456F	0x25B98
+0x4571	0x25BAE
+0x4573	0x25E9D
+0x4576	0x26049
+0x4577	0x26050
+0x4578	0x26046
+0x457A	0x2604E
+0x457D	0x26055
+0x4622	0x26064
+0x4624	0x26238
+0x4631	0x264FE
+0x463A	0x267A6
+0x4643	0x2679C
+0x4644	0x26799
+0x4648	0x267B5
+0x4649	0x267A3
+0x464A	0x267A0
+0x464B	0x267A7
+0x464C	0x2679B
+0x464D	0x269DF
+0x464E	0x269E1
+0x4652	0x26A4D
+0x4654	0x26DF3
+0x4655	0x26D6F
+0x4656	0x26D69
+0x4659	0x26D6B
+0x465A	0x26D78
+0x465B	0x26D87
+0x465D	0x26D85
+0x465E	0x26D82
+0x465F	0x26D90
+0x4662	0x26D80
+0x4663	0x26D67
+0x4666	0x26D61
+0x4668	0x26D93
+0x466A	0x26DF2
+0x466B	0x26D86
+0x466E	0x271CD
+0x466F	0x271C4
+0x4674	0x2730F
+0x4677	0x2730D
+0x467A	0x27373
+0x467C	0x2F9BA
+0x467D	0x2730A
+0x4721	0x27308
+0x4722	0x27313
+0x4724	0x275F8
+0x4728	0x276AB
+0x4729	0x276A8
+0x472C	0x276A5
+0x472F	0x276C3
+0x4730	0x276A4
+0x4732	0x276D4
+0x4733	0x276BA
+0x4734	0x277F1
+0x4737	0x2783F
+0x4739	0x278EA
+0x473B	0x279F7
+0x473E	0x279FA
+0x473F	0x279F5
+0x4741	0x279FE
+0x4744	0x27A00
+0x4747	0x27A02
+0x4748	0x279FB
+0x4749	0x27A07
+0x474B	0x27A1A
+0x474D	0x27BB8
+0x4750	0x27BE9
+0x4751	0x27BEB
+0x4752	0x27C50
+0x4753	0x27C4F
+0x4755	0x27D86
+0x4757	0x27D8E
+0x475C	0x27EF0
+0x475D	0x27EFB
+0x4760	0x28042
+0x4763	0x28085
+0x4768	0x28305
+0x476F	0x2874B
+0x4772	0x28763
+0x477A	0x28999
+0x477C	0x28C81
+0x477D	0x28D17
+0x477E	0x28D10
+0x4821	0x28D12
+0x4825	0x28EFA
+0x4826	0x28EF3
+0x4827	0x28EF2
+0x4828	0x28EF5
+0x4829	0x28EF6
+0x482A	0x28FBB
+0x482B	0x28FC2
+0x482C	0x290A7
+0x482F	0x290A8
+0x4830	0x290A3
+0x4832	0x290AA
+0x4836	0x291DC
+0x4839	0x2920F
+0x483C	0x29279
+0x483E	0x2927F
+0x483F	0x29285
+0x4845	0x2941B
+0x4848	0x29477
+0x4849	0x29476
+0x484A	0x29498
+0x484F	0x2947A
+0x4852	0x295BC
+0x4853	0x295BA
+0x4855	0x295B6
+0x4858	0x295B4
+0x485A	0x296CF
+0x4861	0x2987B
+0x4863	0x29A1C
+0x4864	0x29A21
+0x4865	0x29A1D
+0x4866	0x29AC0
+0x4868	0x29AFF
+0x486C	0x29D56
+0x486E	0x29FA1
+0x486F	0x29FA2
+0x4870	0x29FA6
+0x4871	0x2A256
+0x4872	0x2A257
+0x4875	0x2A301
+0x4876	0x2A3ED
+0x4877	0x2FA1C
+0x4878	0x2A5F2
+0x487A	0x203B8
+0x487C	0x203C0
+0x487E	0x203B7
+0x4921	0x203E1
+0x4924	0x207E8
+0x4926	0x208B2
+0x4928	0x20AAE
+0x492B	0x20F7E
+0x492F	0x20F76
+0x4932	0x20F96
+0x4934	0x21420
+0x4935	0x21421
+0x4936	0x21423
+0x4937	0x21429
+0x4938	0x21677
+0x4939	0x21851
+0x493B	0x21856
+0x493D	0x21888
+0x493E	0x21859
+0x493F	0x21855
+0x4941	0x21997
+0x4942	0x21998
+0x4947	0x21AA1
+0x4948	0x21AA3
+0x494E	0x21F0A
+0x4951	0x21F3D
+0x4952	0x21F0C
+0x4956	0x2213D
+0x4957	0x22139
+0x4958	0x222B0
+0x4959	0x222B2
+0x495A	0x222AE
+0x4960	0x22420
+0x4962	0x2256E
+0x4963	0x2256D
+0x4964	0x2256A
+0x4966	0x22832
+0x496A	0x22839
+0x496E	0x227A3
+0x4970	0x2287F
+0x4971	0x22835
+0x4972	0x2283D
+0x4973	0x229F4
+0x4974	0x229F5
+0x4977	0x22D48
+0x4978	0x22D28
+0x497B	0x22D27
+0x497C	0x22D32
+0x497D	0x22D2C
+0x4A21	0x22D2E
+0x4A25	0x22D23
+0x4A26	0x22D31
+0x4A27	0x2F8C5
+0x4A2C	0x22FC9
+0x4A2D	0x23089
+0x4A2F	0x230BB
+0x4A33	0x23397
+0x4A34	0x23393
+0x4A35	0x23628
+0x4A3B	0x23618
+0x4A3C	0x2363B
+0x4A3E	0x23627
+0x4A3F	0x23624
+0x4A40	0x2361B
+0x4A41	0x23631
+0x4A43	0x23626
+0x4A44	0x236A3
+0x4A45	0x2363F
+0x4A46	0x23622
+0x4A47	0x23619
+0x4A49	0x23641
+0x4A4A	0x2362B
+0x4A4D	0x2390C
+0x4A51	0x23A4E
+0x4A52	0x23AB9
+0x4A53	0x23AFA
+0x4A54	0x23BE9
+0x4A55	0x23BE8
+0x4A56	0x23BE4
+0x4A5A	0x23F5F
+0x4A5B	0x23F5D
+0x4A5C	0x23F52
+0x4A5E	0x23F74
+0x4A60	0x23F46
+0x4A63	0x23FAA
+0x4A65	0x23F4A
+0x4A66	0x23F59
+0x4A67	0x23F4B
+0x4A6B	0x24350
+0x4A70	0x246D0
+0x4A74	0x246CC
+0x4A78	0x24864
+0x4A79	0x24865
+0x4A7D	0x2485C
+0x4A7E	0x24A15
+0x4B28	0x24B79
+0x4B2B	0x24CC5
+0x4B2C	0x24CB8
+0x4B2D	0x24E2C
+0x4B30	0x24E37
+0x4B31	0x24E35
+0x4B32	0x24E31
+0x4B34	0x24E2F
+0x4B36	0x24E2B
+0x4B39	0x24E2D
+0x4B3A	0x24E2A
+0x4B3C	0x24F95
+0x4B3E	0x2523E
+0x4B40	0x25247
+0x4B41	0x25245
+0x4B46	0x25252
+0x4B48	0x25270
+0x4B49	0x25250
+0x4B4A	0x25258
+0x4B4B	0x25251
+0x4B4C	0x2523D
+0x4B4E	0x25241
+0x4B4F	0x2520C
+0x4B50	0x2523C
+0x4B51	0x25386
+0x4B52	0x25383
+0x4B53	0x25389
+0x4B54	0x253F3
+0x4B5A	0x2552D
+0x4B5F	0x256C5
+0x4B60	0x2F955
+0x4B67	0x25843
+0x4B69	0x25837
+0x4B6A	0x25845
+0x4B6D	0x259E5
+0x4B6E	0x25AA6
+0x4B6F	0x25BDB
+0x4B71	0x25BDA
+0x4B72	0x25BE6
+0x4B7C	0x25BF8
+0x4B7D	0x25BE9
+0x4C23	0x25BE8
+0x4C24	0x25BF6
+0x4C29	0x25BE7
+0x4C2F	0x25BD5
+0x4C32	0x25ED3
+0x4C33	0x25EC7
+0x4C34	0x25ED1
+0x4C36	0x25EC3
+0x4C38	0x26080
+0x4C39	0x26098
+0x4C3B	0x26084
+0x4C41	0x26097
+0x4C42	0x26083
+0x4C43	0x26081
+0x4C46	0x2608C
+0x4C47	0x26242
+0x4C48	0x263AB
+0x4C4A	0x263A3
+0x4C4B	0x263A6
+0x4C4C	0x2645C
+0x4C4D	0x26469
+0x4C4E	0x26467
+0x4C50	0x2658B
+0x4C51	0x265A8
+0x4C53	0x267D8
+0x4C56	0x2F989
+0x4C57	0x267DC
+0x4C59	0x267E0
+0x4C5A	0x267E5
+0x4C60	0x26918
+0x4C61	0x26919
+0x4C66	0x26A5F
+0x4C67	0x26A5E
+0x4C69	0x26E02
+0x4C75	0x26E12
+0x4C76	0x26E36
+0x4C79	0x2F9A8
+0x4C7B	0x26E23
+0x4C7C	0x26E03
+0x4C7E	0x26E00
+0x4D22	0x26E46
+0x4D23	0x26E61
+0x4D27	0x27384
+0x4D29	0x2736B
+0x4D2A	0x27362
+0x4D2B	0x27356
+0x4D2C	0x2736A
+0x4D2D	0x27352
+0x4D2E	0x27355
+0x4D32	0x27361
+0x4D33	0x2F9BB
+0x4D34	0x27358
+0x4D35	0x27377
+0x4D38	0x276D7
+0x4D3B	0x276DE
+0x4D3D	0x276DF
+0x4D41	0x276D1
+0x4D43	0x276E2
+0x4D44	0x276E1
+0x4D45	0x276DD
+0x4D49	0x2784B
+0x4D4B	0x2784E
+0x4D4D	0x278FC
+0x4D50	0x278FA
+0x4D52	0x278FB
+0x4D54	0x278FE
+0x4D57	0x27A31
+0x4D5D	0x27A38
+0x4D62	0x27A3A
+0x4D63	0x27BBB
+0x4D66	0x27C59
+0x4D69	0x27CDB
+0x4D6A	0x27CDF
+0x4D6B	0x27CE2
+0x4D6F	0x27D9E
+0x4D70	0x27DA1
+0x4D72	0x27F10
+0x4D7A	0x28076
+0x4D7B	0x2807F
+0x4D7C	0x2807D
+0x4E24	0x28082
+0x4E25	0x28257
+0x4E2C	0x2832E
+0x4E2F	0x2858B
+0x4E30	0x2858D
+0x4E34	0x28590
+0x4E36	0x286EC
+0x4E37	0x2876F
+0x4E38	0x2876B
+0x4E39	0x28771
+0x4E3A	0x28778
+0x4E42	0x289AD
+0x4E49	0x28D2F
+0x4E4B	0x28F78
+0x4E4D	0x291F8
+0x4E4E	0x29219
+0x4E50	0x2929B
+0x4E51	0x29294
+0x4E52	0x29297
+0x4E53	0x29299
+0x4E54	0x293A6
+0x4E55	0x293A4
+0x4E56	0x293A7
+0x4E58	0x29495
+0x4E5B	0x29490
+0x4E5E	0x2949B
+0x4E5F	0x295C4
+0x4E62	0x295C6
+0x4E68	0x296E3
+0x4E6A	0x296DF
+0x4E6B	0x296DD
+0x4E6C	0x296E7
+0x4E71	0x29A2D
+0x4E72	0x29A2C
+0x4E77	0x29A34
+0x4E78	0x29A38
+0x4E7A	0x29B1D
+0x4E7C	0x29B1A
+0x4E7D	0x29B1B
+0x4E7E	0x29B14
+0x4F22	0x29B17
+0x4F23	0x29C21
+0x4F26	0x29CAA
+0x4F27	0x29CA1
+0x4F2D	0x29D63
+0x4F2E	0x29D79
+0x4F2F	0x29D60
+0x4F31	0x29D62
+0x4F33	0x29D61
+0x4F36	0x29D70
+0x4F38	0x29D6A
+0x4F3A	0x29FC8
+0x4F3C	0x29FC5
+0x4F3D	0x29FBE
+0x4F3E	0x29FC2
+0x4F43	0x29FC7
+0x4F45	0x29FB0
+0x4F46	0x29FCA
+0x4F4E	0x2A30D
+0x4F4F	0x2A307
+0x4F50	0x2A396
+0x4F51	0x2A3EF
+0x4F54	0x2A41E
+0x4F55	0x2A41D
+0x4F57	0x2A590
+0x4F58	0x203EB
+0x4F5C	0x203EE
+0x4F5E	0x203EF
+0x4F5F	0x203EC
+0x4F60	0x207FA
+0x4F65	0x20904
+0x4F66	0x20FD3
+0x4F68	0x20FD1
+0x4F69	0x20FFA
+0x4F6E	0x20FC8
+0x4F70	0x20FD5
+0x4F72	0x20FCD
+0x4F73	0x20FD2
+0x4F74	0x20FFB
+0x4F75	0x2122A
+0x4F76	0x21488
+0x4F77	0x21461
+0x4F79	0x21463
+0x4F7A	0x21462
+0x4F7C	0x20057
+0x4F7D	0x218C8
+0x4F7E	0x21898
+0x5022	0x21AC1
+0x5023	0x21F3F
+0x5024	0x21F41
+0x5028	0x22152
+0x502A	0x2215E
+0x502D	0x222C7
+0x502F	0x22370
+0x5030	0x22427
+0x5032	0x22471
+0x5033	0x224B0
+0x5035	0x22842
+0x5036	0x22843
+0x503C	0x22857
+0x503D	0x2289D
+0x503E	0x22D89
+0x503F	0x22D8D
+0x5040	0x22D8B
+0x5041	0x22D80
+0x5042	0x22D92
+0x5043	0x22D8A
+0x5044	0x22DC8
+0x5046	0x22D8F
+0x5047	0x22D93
+0x5048	0x22D91
+0x504A	0x22FF2
+0x504B	0x22FDE
+0x504D	0x230C8
+0x5054	0x232A7
+0x5055	0x232A1
+0x5057	0x2368C
+0x5058	0x2367F
+0x505B	0x2367B
+0x505C	0x23695
+0x505D	0x23699
+0x505F	0x2368E
+0x5061	0x236DA
+0x5062	0x2368A
+0x5063	0x2369C
+0x5065	0x2367E
+0x5068	0x2391A
+0x5069	0x23A55
+0x506C	0x23A60
+0x5070	0x23BFB
+0x5073	0x23BFD
+0x5079	0x23FD0
+0x507C	0x23FC5
+0x507E	0x23FD2
+0x5121	0x24011
+0x5126	0x243AD
+0x5127	0x243A4
+0x5128	0x243A9
+0x5129	0x243B0
+0x512A	0x2439D
+0x512C	0x24598
+0x5131	0x24892
+0x5133	0x2488A
+0x5135	0x2488D
+0x5136	0x24896
+0x513B	0x24A45
+0x513C	0x24A4B
+0x513D	0x24B0F
+0x513E	0x24B16
+0x5140	0x24B8A
+0x5143	0x24CC9
+0x5145	0x24CC8
+0x5146	0x24CCA
+0x5147	0x24E64
+0x514B	0x24E5D
+0x514C	0x24E63
+0x5151	0x24E88
+0x5152	0x24F3A
+0x5153	0x24F39
+0x5158	0x25017
+0x5159	0x25093
+0x515B	0x25095
+0x515E	0x25276
+0x5162	0x25280
+0x5163	0x2527B
+0x5165	0x25248
+0x5166	0x252A8
+0x5167	0x25288
+0x5168	0x2538B
+0x5169	0x2538A
+0x516A	0x2538C
+0x516B	0x253FC
+0x516F	0x25558
+0x5171	0x25551
+0x5172	0x25555
+0x5173	0x25553
+0x5177	0x256DC
+0x517B	0x2585C
+0x517E	0x25865
+0x5221	0x2F95A
+0x5223	0x259EE
+0x5226	0x259F0
+0x5228	0x259F2
+0x522A	0x25C35
+0x522C	0x25C22
+0x522E	0x25C20
+0x5230	0x25C2D
+0x5231	0x25C28
+0x5232	0x25C26
+0x5233	0x25C3C
+0x5235	0x25C38
+0x523C	0x25C2A
+0x523E	0x25C1A
+0x523F	0x25C30
+0x5240	0x25BE3
+0x5241	0x25C19
+0x5242	0x25EE9
+0x5243	0x25EE7
+0x5245	0x260D6
+0x5246	0x260C4
+0x5248	0x26087
+0x524A	0x260C7
+0x524B	0x260D9
+0x524D	0x260DF
+0x5250	0x2630A
+0x5251	0x26301
+0x5252	0x263B1
+0x5254	0x263C1
+0x5257	0x26476
+0x5258	0x2650D
+0x5259	0x2650E
+0x525D	0x26807
+0x525F	0x26809
+0x5260	0x26816
+0x5265	0x2680E
+0x5268	0x26806
+0x5269	0x2691E
+0x526A	0x2694A
+0x5270	0x26EA6
+0x5271	0x26E91
+0x5274	0x26EB8
+0x5275	0x26E96
+0x5278	0x26EC5
+0x527D	0x26F0A
+0x5326	0x26EB2
+0x5328	0x26EB7
+0x5329	0x26EB4
+0x532A	0x26E89
+0x532B	0x26E8D
+0x532D	0x26E87
+0x532E	0x26EC2
+0x532F	0x26E9C
+0x5330	0x26E92
+0x5332	0x26ECA
+0x5334	0x26E8A
+0x5335	0x271E0
+0x5337	0x271E6
+0x5338	0x271E5
+0x533A	0x273A5
+0x533B	0x273B3
+0x533F	0x273B5
+0x5340	0x273AF
+0x5342	0x273B0
+0x5343	0x273CC
+0x5345	0x273A2
+0x5346	0x273BE
+0x5347	0x273C6
+0x5348	0x273AC
+0x5349	0x273AE
+0x534C	0x2F9C3
+0x534D	0x27708
+0x534E	0x27705
+0x5351	0x276FE
+0x5354	0x27700
+0x5357	0x27864
+0x5358	0x27868
+0x535D	0x2786A
+0x535E	0x27869
+0x535F	0x2790D
+0x5360	0x27912
+0x5363	0x2790F
+0x5365	0x27A67
+0x5366	0x27A79
+0x5367	0x27A72
+0x5368	0x27A66
+0x5369	0x27A7C
+0x536C	0x27A68
+0x536D	0x27A85
+0x536E	0x27A76
+0x536F	0x27A74
+0x5370	0x27A71
+0x5371	0x27A64
+0x5374	0x27BF8
+0x5376	0x27C6C
+0x5378	0x27CEB
+0x537C	0x27DB8
+0x5421	0x27F2D
+0x5422	0x27F2E
+0x5423	0x27F28
+0x5424	0x27F29
+0x5425	0x27F31
+0x5427	0x27F2F
+0x5428	0x27F2A
+0x542A	0x280A4
+0x542B	0x280B7
+0x542C	0x280BF
+0x5431	0x28263
+0x5435	0x28367
+0x5436	0x285BE
+0x5437	0x2F9E0
+0x5438	0x28795
+0x5439	0x2879C
+0x543E	0x28871
+0x543F	0x28872
+0x5441	0x2886F
+0x5444	0x289F1
+0x5447	0x289E8
+0x544A	0x2F9EA
+0x544D	0x28D49
+0x544E	0x28D64
+0x5450	0x28D48
+0x5454	0x28F2C
+0x5455	0x28FE1
+0x5456	0x28FEF
+0x5457	0x290C0
+0x545A	0x290D7
+0x545B	0x290D4
+0x545E	0x292AD
+0x5465	0x292AE
+0x5466	0x292AC
+0x546B	0x29427
+0x546C	0x294AE
+0x546E	0x294B0
+0x5471	0x294C0
+0x5472	0x294C4
+0x5479	0x29707
+0x547B	0x296FD
+0x5523	0x2FA04
+0x5524	0x2981B
+0x5525	0x2981C
+0x5527	0x298B2
+0x5528	0x298B4
+0x5529	0x298B7
+0x552A	0x298B1
+0x552B	0x298B3
+0x552C	0x298AE
+0x5533	0x29A3F
+0x5534	0x29B36
+0x5537	0x29B31
+0x5538	0x29B3B
+0x5539	0x29B35
+0x553A	0x29B3A
+0x553B	0x29B37
+0x553C	0x29C22
+0x553D	0x29C36
+0x553E	0x29C32
+0x5540	0x29CC0
+0x5546	0x29D85
+0x5549	0x29D89
+0x554C	0x29FE1
+0x5551	0x2A00A
+0x5553	0x2A009
+0x5556	0x29FE8
+0x555B	0x2A318
+0x5564	0x2A5C5
+0x5566	0x2040D
+0x5567	0x2040C
+0x5568	0x20421
+0x556A	0x20616
+0x556B	0x2080E
+0x556E	0x20817
+0x5571	0x21048
+0x5575	0x21055
+0x5576	0x21049
+0x5577	0x2104C
+0x5579	0x2104F
+0x557A	0x2103D
+0x557D	0x2148A
+0x557E	0x214A8
+0x5621	0x2168A
+0x5623	0x218CB
+0x5625	0x218D5
+0x5626	0x221D4
+0x5629	0x21F5C
+0x562A	0x21F75
+0x562C	0x22161
+0x562E	0x21696
+0x5630	0x2258A
+0x5631	0x228D0
+0x5634	0x22849
+0x5635	0x228CF
+0x5637	0x22DD6
+0x5638	0x22D7F
+0x563A	0x22DD2
+0x563B	0x22DCF
+0x563C	0x23006
+0x563D	0x23009
+0x5642	0x23706
+0x5643	0x236F1
+0x5644	0x23704
+0x5646	0x236FA
+0x5647	0x236F4
+0x564A	0x236F9
+0x564C	0x2368B
+0x564D	0x23703
+0x5650	0x239A2
+0x5654	0x23C0C
+0x5655	0x23C0B
+0x565A	0x24024
+0x565D	0x2F914
+0x565F	0x24025
+0x5661	0x243F6
+0x5663	0x243FB
+0x5665	0x24532
+0x5666	0x245FB
+0x5668	0x246F2
+0x5669	0x246F3
+0x566D	0x2489C
+0x566E	0x24A72
+0x5670	0x24A74
+0x5674	0x24B86
+0x5676	0x24B8E
+0x5677	0x24B90
+0x5679	0x24BCD
+0x567A	0x24BF7
+0x567B	0x24CD6
+0x567C	0x24E84
+0x567D	0x24E95
+0x567E	0x24E8A
+0x5723	0x24E97
+0x5727	0x24FA0
+0x5728	0x24FA1
+0x5729	0x25022
+0x572A	0x250A6
+0x572B	0x250A4
+0x5735	0x252AF
+0x5736	0x252B0
+0x5737	0x252BD
+0x573A	0x25576
+0x573C	0x2557B
+0x573D	0x25579
+0x5743	0x256EE
+0x5744	0x256F1
+0x5746	0x25894
+0x574A	0x25891
+0x574E	0x25A10
+0x5751	0x25AAF
+0x575C	0x25C7B
+0x575D	0x25C77
+0x5760	0x25C80
+0x5761	0x25CC6
+0x5763	0x25C7C
+0x5764	0x25C90
+0x5766	0x25CA3
+0x5767	0x25C7D
+0x5768	0x25CBD
+0x576C	0x25F13
+0x576F	0x26111
+0x5770	0x26144
+0x5771	0x2610D
+0x5774	0x26314
+0x5776	0x263B8
+0x5778	0x263B7
+0x5779	0x26483
+0x577C	0x26514
+0x577E	0x2651C
+0x5825	0x265D4
+0x5826	0x265D5
+0x5829	0x26843
+0x582A	0x26842
+0x582D	0x2F98A
+0x582E	0x26841
+0x582F	0x2694E
+0x5831	0x26A87
+0x5837	0x26F39
+0x5839	0x26F8F
+0x583A	0x26F2A
+0x583F	0x26F2B
+0x5841	0x26F50
+0x5843	0x26F6E
+0x5845	0x26F3B
+0x5846	0x26F53
+0x5847	0x26F5F
+0x5848	0x26F2F
+0x5849	0x26F30
+0x584A	0x26F38
+0x584B	0x26F4C
+0x584C	0x271F1
+0x5850	0x27407
+0x5851	0x27416
+0x5853	0x27414
+0x5855	0x273FB
+0x5859	0x273F8
+0x585A	0x27410
+0x585B	0x2741D
+0x585C	0x273FF
+0x585D	0x2740B
+0x585E	0x27404
+0x5860	0x273FE
+0x5861	0x275FF
+0x5866	0x27723
+0x586C	0x2792A
+0x586D	0x27AA0
+0x586E	0x27A98
+0x586F	0x27A9C
+0x5871	0x27A9E
+0x5872	0x27AA6
+0x5873	0x27AB5
+0x5874	0x27AB0
+0x5878	0x27CF9
+0x5879	0x27CF5
+0x587B	0x27DD2
+0x587E	0x27F50
+0x5921	0x27F4E
+0x5922	0x27F4B
+0x5923	0x27F52
+0x5924	0x27F4D
+0x5927	0x280E4
+0x5929	0x280DA
+0x592E	0x280DF
+0x592F	0x280E8
+0x5933	0x28370
+0x5934	0x28372
+0x5936	0x28377
+0x593A	0x285E6
+0x593B	0x287AA
+0x593E	0x2888C
+0x5940	0x28889
+0x5943	0x28A32
+0x5948	0x28A7A
+0x594A	0x28C9E
+0x594B	0x28CA0
+0x594C	0x28D70
+0x5950	0x28D6E
+0x5951	0x28D66
+0x5953	0x28D65
+0x5956	0x28F7F
+0x5957	0x28FE0
+0x5959	0x28FFF
+0x595A	0x290F6
+0x595B	0x290F7
+0x595C	0x290F5
+0x595E	0x290FC
+0x5961	0x290F9
+0x5965	0x292CA
+0x5966	0x292C3
+0x5967	0x292C6
+0x5969	0x293B8
+0x596A	0x293BD
+0x596C	0x293BC
+0x596D	0x29405
+0x596E	0x294E0
+0x596F	0x294E9
+0x5971	0x294DF
+0x5972	0x294EC
+0x5974	0x294E5
+0x5975	0x294DE
+0x5976	0x2FA00
+0x5978	0x294F0
+0x5979	0x294E3
+0x597B	0x295EC
+0x5A23	0x295F2
+0x5A24	0x295EF
+0x5A25	0x295E9
+0x5A26	0x296FB
+0x5A2B	0x29737
+0x5A2C	0x298DE
+0x5A2F	0x298DA
+0x5A32	0x29A4B
+0x5A34	0x29A49
+0x5A36	0x29AD5
+0x5A39	0x29B52
+0x5A3A	0x29B47
+0x5A3C	0x29B48
+0x5A3D	0x29CCC
+0x5A3E	0x29CD0
+0x5A46	0x29D86
+0x5A47	0x29DA7
+0x5A48	0x29DA3
+0x5A4A	0x29DB6
+0x5A4B	0x29DAD
+0x5A4C	0x2A013
+0x5A53	0x2A017
+0x5A54	0x2A022
+0x5A57	0x2A049
+0x5A58	0x2A026
+0x5A59	0x2FA0C
+0x5A5A	0x2A03C
+0x5A5B	0x2A028
+0x5A5C	0x2A2A8
+0x5A5E	0x2A3FB
+0x5A60	0x2A432
+0x5A61	0x2A4D6
+0x5A62	0x2A548
+0x5A65	0x2A5C6
+0x5A69	0x20425
+0x5A6A	0x20426
+0x5A6B	0x20424
+0x5A6C	0x20433
+0x5A6D	0x20570
+0x5A6F	0x20B90
+0x5A71	0x21095
+0x5A72	0x210A1
+0x5A73	0x21092
+0x5A74	0x2108F
+0x5A75	0x2109F
+0x5A76	0x21096
+0x5A77	0x21098
+0x5A78	0x2109D
+0x5A79	0x210A0
+0x5A7B	0x21697
+0x5A7C	0x218EB
+0x5A7E	0x21F87
+0x5B22	0x22432
+0x5B26	0x228D8
+0x5B27	0x228FB
+0x5B28	0x22906
+0x5B2A	0x228D1
+0x5B2C	0x2F8B0
+0x5B33	0x22DF6
+0x5B34	0x22E04
+0x5B35	0x22DFE
+0x5B37	0x22DFF
+0x5B38	0x22DF7
+0x5B39	0x23018
+0x5B3B	0x23014
+0x5B3C	0x230CD
+0x5B3D	0x23120
+0x5B3E	0x232DE
+0x5B42	0x23745
+0x5B43	0x23753
+0x5B45	0x2374B
+0x5B46	0x23755
+0x5B47	0x23741
+0x5B4B	0x2375C
+0x5B4C	0x23754
+0x5B4D	0x23A71
+0x5B4E	0x23AD0
+0x5B51	0x23C53
+0x5B52	0x24029
+0x5B53	0x2407E
+0x5B55	0x24079
+0x5B58	0x24070
+0x5B59	0x2406A
+0x5B5C	0x24085
+0x5B5D	0x24064
+0x5B5F	0x24078
+0x5B61	0x24432
+0x5B62	0x24427
+0x5B63	0x2442F
+0x5B68	0x248BA
+0x5B6A	0x24A71
+0x5B6B	0x24A8C
+0x5B6D	0x24B1A
+0x5B70	0x24B98
+0x5B71	0x24CE4
+0x5B76	0x24EC2
+0x5B78	0x24EBA
+0x5B7A	0x24EC8
+0x5C21	0x250B9
+0x5C22	0x250B8
+0x5C23	0x250A5
+0x5C24	0x252E2
+0x5C28	0x252D9
+0x5C2B	0x252AC
+0x5C2C	0x252DD
+0x5C30	0x2559D
+0x5C33	0x25711
+0x5C34	0x25703
+0x5C38	0x258EE
+0x5C3C	0x25CA4
+0x5C3D	0x25CD8
+0x5C3E	0x25CDD
+0x5C3F	0x25CDE
+0x5C41	0x25CE7
+0x5C45	0x25CD4
+0x5C47	0x25CCE
+0x5C4D	0x25CF1
+0x5C4E	0x25CD3
+0x5C52	0x25CCA
+0x5C53	0x25CE9
+0x5C57	0x25F1A
+0x5C58	0x25F41
+0x5C59	0x2F968
+0x5C5C	0x2613D
+0x5C5D	0x26140
+0x5C61	0x26143
+0x5C63	0x2613F
+0x5C64	0x2613C
+0x5C66	0x26321
+0x5C67	0x26320
+0x5C69	0x263C6
+0x5C6C	0x263D1
+0x5C6D	0x263CA
+0x5C6E	0x2648E
+0x5C6F	0x26491
+0x5C72	0x265E3
+0x5C73	0x26888
+0x5C75	0x26870
+0x5C77	0x2699D
+0x5C78	0x26A9D
+0x5C79	0x26A91
+0x5C7A	0x26A98
+0x5C7B	0x26A99
+0x5D22	0x26FBF
+0x5D24	0x26FAE
+0x5D25	0x26FB1
+0x5D26	0x26FCC
+0x5D27	0x27004
+0x5D29	0x27016
+0x5D2A	0x26FCD
+0x5D2D	0x26FE0
+0x5D2E	0x26FCB
+0x5D2F	0x26FD4
+0x5D30	0x26FC9
+0x5D31	0x271FF
+0x5D33	0x271FD
+0x5D34	0x27457
+0x5D35	0x27452
+0x5D36	0x27450
+0x5D37	0x27445
+0x5D38	0x2744D
+0x5D3A	0x27453
+0x5D3C	0x27482
+0x5D3D	0x27444
+0x5D3E	0x275CE
+0x5D3F	0x275CF
+0x5D40	0x275D2
+0x5D41	0x27602
+0x5D42	0x2774F
+0x5D43	0x27758
+0x5D45	0x27743
+0x5D47	0x27752
+0x5D4B	0x27749
+0x5D4C	0x27753
+0x5D4D	0x2774D
+0x5D4F	0x27884
+0x5D51	0x27883
+0x5D52	0x27932
+0x5D53	0x27AE2
+0x5D55	0x27AE4
+0x5D56	0x27AD3
+0x5D58	0x27AD5
+0x5D59	0x27ADD
+0x5D5C	0x27AEC
+0x5D5D	0x27AE6
+0x5D5E	0x27AD2
+0x5D5F	0x27AFA
+0x5D60	0x27ADA
+0x5D62	0x27C06
+0x5D63	0x27C04
+0x5D65	0x27C7B
+0x5D66	0x27D04
+0x5D67	0x27D02
+0x5D6B	0x27F60
+0x5D6F	0x28107
+0x5D70	0x28105
+0x5D71	0x2810C
+0x5D73	0x2815A
+0x5D76	0x2811A
+0x5D79	0x2838A
+0x5E21	0x2838C
+0x5E22	0x28609
+0x5E23	0x288A6
+0x5E25	0x288AC
+0x5E26	0x288A9
+0x5E28	0x28A8B
+0x5E2A	0x28A8C
+0x5E2D	0x28A88
+0x5E2E	0x28A89
+0x5E30	0x28A93
+0x5E33	0x28D83
+0x5E34	0x28F4F
+0x5E37	0x29120
+0x5E39	0x29236
+0x5E3A	0x292E2
+0x5E3D	0x292EE
+0x5E3F	0x292E7
+0x5E40	0x292E9
+0x5E44	0x292DF
+0x5E46	0x293C7
+0x5E48	0x29509
+0x5E4A	0x29501
+0x5E53	0x29605
+0x5E54	0x2960C
+0x5E55	0x29778
+0x5E56	0x2975D
+0x5E5C	0x2975E
+0x5E5D	0x29760
+0x5E5E	0x29767
+0x5E60	0x2FA05
+0x5E61	0x298F4
+0x5E64	0x298F1
+0x5E66	0x298FA
+0x5E69	0x298F8
+0x5E6A	0x298F9
+0x5E6B	0x29909
+0x5E6C	0x298FD
+0x5E6D	0x298F7
+0x5E6F	0x29A59
+0x5E71	0x29B60
+0x5E72	0x29B68
+0x5E78	0x29B6A
+0x5E79	0x29C14
+0x5E7A	0x29C3E
+0x5E7B	0x29CE4
+0x5F28	0x29DD2
+0x5F2D	0x2A058
+0x5F2E	0x2A050
+0x5F30	0x2A05C
+0x5F33	0x28119
+0x5F37	0x2FA0E
+0x5F41	0x2A4DF
+0x5F47	0x2A5D9
+0x5F4B	0x20966
+0x5F4E	0x210E1
+0x5F4F	0x210EF
+0x5F50	0x210E8
+0x5F51	0x21233
+0x5F53	0x218FE
+0x5F56	0x21AEF
+0x5F57	0x21AEC
+0x5F58	0x21CEC
+0x5F59	0x21F9C
+0x5F5B	0x21F99
+0x5F5C	0x22170
+0x5F5D	0x2216E
+0x5F5F	0x22441
+0x5F62	0x22902
+0x5F63	0x22901
+0x5F65	0x22A1B
+0x5F66	0x22E23
+0x5F67	0x22E25
+0x5F68	0x22E24
+0x5F69	0x22E26
+0x5F6A	0x22E33
+0x5F6B	0x22E2F
+0x5F6C	0x2308F
+0x5F6D	0x23356
+0x5F74	0x23799
+0x5F76	0x2F8ED
+0x5F78	0x23AD9
+0x5F7A	0x240B7
+0x5F7C	0x240B6
+0x6021	0x24454
+0x6022	0x24457
+0x6023	0x2447A
+0x6026	0x24A8E
+0x6028	0x24A90
+0x6029	0x24AB9
+0x602D	0x24CEF
+0x6031	0x24EE2
+0x6033	0x24ED6
+0x6034	0x24ED8
+0x6035	0x24EDA
+0x6036	0x24EDE
+0x603A	0x25308
+0x603B	0x25304
+0x603C	0x2530A
+0x603D	0x2530B
+0x603E	0x25302
+0x6040	0x255AA
+0x6041	0x255C1
+0x6043	0x258D7
+0x6044	0x258D9
+0x6046	0x258DE
+0x6047	0x258DA
+0x604A	0x25A2A
+0x604D	0x25D31
+0x604F	0x25D2B
+0x6050	0x25D2C
+0x6051	0x25D29
+0x6052	0x25D2E
+0x6054	0x25D27
+0x6055	0x25D28
+0x6057	0x25D5F
+0x6058	0x25D30
+0x6059	0x25D24
+0x605C	0x25F3A
+0x605E	0x25F39
+0x605F	0x25F40
+0x6060	0x26180
+0x6061	0x26184
+0x6064	0x26175
+0x6065	0x26176
+0x6067	0x2617C
+0x6069	0x26178
+0x606A	0x2619B
+0x606B	0x2617E
+0x606C	0x2625A
+0x606E	0x2632C
+0x6070	0x2649C
+0x6071	0x26847
+0x6072	0x2688A
+0x6075	0x26927
+0x6076	0x2704A
+0x6079	0x27027
+0x607C	0x2702E
+0x607D	0x27026
+0x607E	0x27208
+0x6122	0x274BD
+0x6123	0x27496
+0x6127	0x274BE
+0x6128	0x2748E
+0x6129	0x27774
+0x612B	0x27780
+0x6132	0x2793C
+0x6133	0x2793D
+0x6135	0x2793A
+0x6136	0x27942
+0x6138	0x27B24
+0x6139	0x27B06
+0x613C	0x27B15
+0x613E	0x27B02
+0x613F	0x27B0C
+0x6141	0x27B08
+0x6142	0x27B0A
+0x6143	0x27B05
+0x6144	0x27B1C
+0x6147	0x27C82
+0x6149	0x27C86
+0x614B	0x27E03
+0x614C	0x27F7B
+0x614E	0x27F7A
+0x6153	0x28180
+0x6155	0x28158
+0x615A	0x283AA
+0x615B	0x283AB
+0x615C	0x28436
+0x615D	0x2844A
+0x6160	0x287D6
+0x616A	0x28B03
+0x616B	0x28ACF
+0x616D	0x28D9F
+0x616E	0x28DA2
+0x616F	0x2902A
+0x6170	0x2902F
+0x6171	0x29144
+0x6172	0x29140
+0x6175	0x29311
+0x6176	0x2930F
+0x6178	0x2930D
+0x6179	0x29307
+0x617A	0x29303
+0x6221	0x29435
+0x6224	0x29504
+0x622A	0x29526
+0x622E	0x2951E
+0x6231	0x2960E
+0x6233	0x2961D
+0x6234	0x2961E
+0x6235	0x2961F
+0x6237	0x29788
+0x6239	0x2978D
+0x623A	0x29791
+0x623B	0x29780
+0x623D	0x29854
+0x623E	0x29855
+0x6242	0x29925
+0x6243	0x2991A
+0x624B	0x29B88
+0x624D	0x29B7A
+0x6250	0x29B80
+0x6251	0x29D1E
+0x6252	0x29DFC
+0x6253	0x29E25
+0x6258	0x29E0B
+0x625A	0x29E06
+0x625B	0x29E04
+0x625E	0x29DF9
+0x625F	0x29E00
+0x6263	0x29E02
+0x6265	0x29E07
+0x6269	0x2A0B5
+0x626B	0x2A087
+0x626D	0x2A093
+0x626E	0x2FA0F
+0x6270	0x2A0BE
+0x6271	0x2A266
+0x6273	0x2A2C7
+0x6274	0x2A2CF
+0x6278	0x2A33D
+0x627A	0x2A33C
+0x627B	0x2A347
+0x6322	0x2A3C3
+0x6325	0x2A51B
+0x6328	0x2A5C9
+0x632A	0x2A5DD
+0x632C	0x2A693
+0x632E	0x2043D
+0x6333	0x214E6
+0x6336	0x21AF7
+0x6337	0x21FB0
+0x6338	0x21FAE
+0x633D	0x2259F
+0x633E	0x2259E
+0x633F	0x22930
+0x6341	0x2294F
+0x6344	0x22927
+0x6345	0x22951
+0x6348	0x22E51
+0x6349	0x22E54
+0x634A	0x22E56
+0x634B	0x23027
+0x634D	0x23024
+0x6352	0x237EC
+0x6353	0x237C4
+0x6356	0x240F8
+0x6357	0x240F6
+0x6358	0x240F7
+0x6359	0x240ED
+0x635C	0x240F4
+0x635D	0x240EF
+0x6360	0x2447F
+0x6361	0x244A2
+0x6362	0x2447E
+0x6364	0x248C5
+0x636A	0x24EF1
+0x636B	0x24EF2
+0x636D	0x2502F
+0x6372	0x25323
+0x6373	0x25329
+0x6377	0x2571B
+0x6378	0x258EB
+0x637A	0x258EA
+0x637B	0x25A33
+0x637D	0x25D63
+0x6421	0x25D92
+0x6422	0x25D65
+0x6425	0x261A0
+0x6426	0x2F970
+0x6427	0x2625E
+0x6429	0x268AA
+0x642B	0x268A9
+0x642E	0x2709C
+0x6431	0x27092
+0x6435	0x27086
+0x6439	0x27083
+0x643F	0x2F9C2
+0x6442	0x274CE
+0x6445	0x27793
+0x6449	0x27B2E
+0x644A	0x27B27
+0x644B	0x27B28
+0x6450	0x27E18
+0x6451	0x27E16
+0x6452	0x27F8D
+0x6454	0x27F8E
+0x6457	0x27F90
+0x6458	0x27F8F
+0x6459	0x28181
+0x645C	0x2818A
+0x645D	0x2818C
+0x645E	0x2828D
+0x6462	0x283B2
+0x6464	0x287D9
+0x6468	0x28B0D
+0x646A	0x28B13
+0x646E	0x28B1B
+0x6470	0x28DAC
+0x6472	0x28DB3
+0x6474	0x2915E
+0x6476	0x29160
+0x6477	0x29168
+0x6478	0x29163
+0x6479	0x29169
+0x647A	0x29167
+0x647D	0x29328
+0x6521	0x2932E
+0x6522	0x29330
+0x6524	0x29326
+0x6525	0x29331
+0x6526	0x29341
+0x6528	0x293DA
+0x652A	0x2F9FA
+0x652B	0x2940B
+0x652D	0x29534
+0x652E	0x29533
+0x6532	0x29539
+0x6533	0x2953B
+0x6534	0x29540
+0x6535	0x29630
+0x6537	0x29632
+0x6538	0x29637
+0x653D	0x29781
+0x653E	0x2979F
+0x653F	0x297A7
+0x6542	0x29944
+0x6543	0x29947
+0x6544	0x29948
+0x6545	0x2993D
+0x6548	0x29949
+0x654A	0x29A80
+0x654B	0x29BA0
+0x654C	0x29B9D
+0x6550	0x29B9C
+0x6551	0x29C47
+0x6552	0x29D07
+0x6556	0x29E49
+0x6558	0x29E44
+0x655C	0x29EDF
+0x655E	0x29E4C
+0x6560	0x29E4F
+0x6563	0x2A0C1
+0x6565	0x2A0B9
+0x6566	0x2A0CB
+0x6567	0x2A0CF
+0x6568	0x2A0C4
+0x656D	0x2A0CA
+0x656E	0x2A0C3
+0x656F	0x2A2D0
+0x6570	0x2A351
+0x6573	0x2A3A8
+0x6574	0x2A3C7
+0x6575	0x2A3C6
+0x6577	0x2A3CA
+0x6578	0x2A402
+0x657A	0x2A45D
+0x657B	0x2A45A
+0x657E	0x2A459
+0x6622	0x2A4CC
+0x6623	0x2A51C
+0x6624	0x2A5CC
+0x6628	0x2A5E8
+0x6629	0x2A5EC
+0x662A	0x2A5EA
+0x662B	0x2A6AD
+0x662C	0x2A6B0
+0x662D	0x2045F
+0x662E	0x20458
+0x662F	0x20457
+0x6631	0x20B93
+0x6633	0x2113B
+0x6635	0x21134
+0x6636	0x214F2
+0x6638	0x21AFD
+0x6639	0x21C1D
+0x663C	0x22304
+0x663D	0x22448
+0x663E	0x22958
+0x663F	0x22E4F
+0x6641	0x22E6E
+0x6642	0x22E72
+0x6644	0x2302E
+0x6645	0x237FC
+0x6646	0x237F4
+0x6647	0x23C36
+0x6648	0x2410E
+0x664B	0x24114
+0x664D	0x24119
+0x664F	0x244A6
+0x6651	0x24AC9
+0x6652	0x24AC0
+0x6653	0x24ACC
+0x6654	0x24B1B
+0x6655	0x24BAA
+0x6656	0x24BA8
+0x6657	0x24F03
+0x665C	0x25035
+0x6662	0x255D9
+0x6666	0x25A3F
+0x6667	0x25A3D
+0x666B	0x25D8B
+0x6670	0x25D68
+0x6671	0x25D8A
+0x6672	0x25F58
+0x6673	0x25F57
+0x6674	0x261CE
+0x6675	0x261BC
+0x6676	0x261C0
+0x6677	0x261C1
+0x6678	0x261BF
+0x6679	0x261AB
+0x667A	0x2625F
+0x667C	0x264A6
+0x667E	0x26529
+0x6726	0x268B8
+0x6729	0x270DD
+0x672A	0x270D6
+0x672B	0x2F9B1
+0x672C	0x270D5
+0x672D	0x270E7
+0x672E	0x270D8
+0x672F	0x274EC
+0x6731	0x27500
+0x6732	0x27507
+0x6733	0x274FD
+0x6734	0x274F1
+0x6735	0x274FF
+0x6736	0x277AA
+0x6737	0x277B0
+0x6738	0x27B48
+0x673A	0x27B53
+0x673C	0x27B4D
+0x6742	0x27B43
+0x6743	0x27B50
+0x6746	0x27C8C
+0x6747	0x27E27
+0x6749	0x27F99
+0x674B	0x281B1
+0x674D	0x281B0
+0x674E	0x281AA
+0x674F	0x281AC
+0x6753	0x283C8
+0x6754	0x283CA
+0x6755	0x28642
+0x6756	0x287E0
+0x6757	0x288E7
+0x6758	0x288E8
+0x6759	0x288E6
+0x675D	0x28B5B
+0x675E	0x28B56
+0x6760	0x28B5A
+0x6764	0x28CB8
+0x6765	0x28DC5
+0x6768	0x29048
+0x6769	0x2917D
+0x676A	0x2917C
+0x676B	0x29181
+0x676C	0x29182
+0x676D	0x29162
+0x676F	0x29345
+0x6774	0x293E3
+0x6778	0x29550
+0x677A	0x2954F
+0x677D	0x29639
+0x6821	0x2963A
+0x6825	0x297C1
+0x6826	0x2994E
+0x6827	0x2996E
+0x682C	0x29971
+0x682E	0x29A8C
+0x682F	0x29A89
+0x6831	0x29AE5
+0x6832	0x29BB3
+0x6833	0x29BB6
+0x6834	0x29BB4
+0x6835	0x29C4D
+0x6837	0x29D13
+0x6838	0x29E78
+0x683F	0x29E72
+0x6845	0x2A275
+0x6846	0x2A2DA
+0x6847	0x2A2D7
+0x684F	0x2FA16
+0x6850	0x2A469
+0x6851	0x2A467
+0x6853	0x2A466
+0x6854	0x2A46F
+0x6855	0x2A471
+0x6857	0x2A4CF
+0x6858	0x2A523
+0x685B	0x2A5A5
+0x685D	0x2A5FE
+0x685E	0x2A5FB
+0x685F	0x2A5FD
+0x6864	0x2116D
+0x6866	0x21B05
+0x6867	0x21C20
+0x6869	0x21FC8
+0x686A	0x21FC9
+0x686D	0x23127
+0x686F	0x2381E
+0x6870	0x23936
+0x6872	0x2413D
+0x6874	0x248D7
+0x6876	0x24BAD
+0x6877	0x24D00
+0x6879	0x2533A
+0x687D	0x25726
+0x6923	0x25DB7
+0x6924	0x25DB6
+0x6925	0x25DC0
+0x6927	0x25D9B
+0x6929	0x261D8
+0x692F	0x268C0
+0x6931	0x268BF
+0x6932	0x26ABF
+0x6934	0x27120
+0x6935	0x270D0
+0x6936	0x2710E
+0x6938	0x2711D
+0x6939	0x2711E
+0x693A	0x27115
+0x693B	0x27114
+0x693C	0x2751E
+0x693D	0x2752C
+0x693F	0x277B9
+0x6940	0x277B8
+0x6941	0x277B6
+0x6942	0x2789E
+0x6943	0x2789C
+0x6944	0x2794D
+0x6946	0x27B6E
+0x6947	0x27B60
+0x6949	0x27B64
+0x694A	0x27B62
+0x694B	0x261E5
+0x694D	0x27FA3
+0x6950	0x283D2
+0x6951	0x283D5
+0x6957	0x29055
+0x6959	0x29193
+0x695D	0x29356
+0x695F	0x293E9
+0x6961	0x29445
+0x6964	0x2967C
+0x6966	0x297D3
+0x696C	0x2998E
+0x696D	0x29A97
+0x696F	0x29A9B
+0x6970	0x29A99
+0x6973	0x29BCF
+0x6975	0x29C59
+0x6978	0x29D20
+0x6979	0x29D23
+0x697A	0x29D2A
+0x6A22	0x29EB0
+0x6A24	0x2A12F
+0x6A28	0x2A132
+0x6A29	0x2A143
+0x6A2A	0x2A13F
+0x6A2B	0x2A139
+0x6A2D	0x2A130
+0x6A2E	0x2A2DD
+0x6A2F	0x2A3DA
+0x6A30	0x2A3DB
+0x6A32	0x2A484
+0x6A33	0x2A47F
+0x6A34	0x2A472
+0x6A35	0x2A480
+0x6A36	0x2A4EE
+0x6A38	0x2A52A
+0x6A39	0x2A522
+0x6A3A	0x2A571
+0x6A3B	0x2A5CD
+0x6A3E	0x2A60F
+0x6A3F	0x2A618
+0x6A40	0x2046A
+0x6A45	0x21B0C
+0x6A47	0x225A6
+0x6A4A	0x23037
+0x6A4D	0x23AE2
+0x6A4F	0x244BC
+0x6A52	0x24AD5
+0x6A56	0x24F12
+0x6A58	0x2534B
+0x6A59	0x25341
+0x6A5A	0x253A1
+0x6A5B	0x255EC
+0x6A5E	0x25DD4
+0x6A5F	0x25DD8
+0x6A60	0x25DD9
+0x6A62	0x25DDA
+0x6A63	0x25F6C
+0x6A64	0x25F6D
+0x6A67	0x261E7
+0x6A68	0x261EB
+0x6A69	0x261EC
+0x6A6A	0x26262
+0x6A6C	0x2652B
+0x6A6D	0x2660D
+0x6A6E	0x268CD
+0x6A6F	0x26AC3
+0x6A70	0x2713F
+0x6A71	0x2713C
+0x6A72	0x2713E
+0x6A73	0x2713D
+0x6A74	0x2713A
+0x6A75	0x27138
+0x6A76	0x27544
+0x6A77	0x27545
+0x6A79	0x27548
+0x6A7A	0x27550
+0x6A7D	0x27B78
+0x6A7E	0x27B79
+0x6B22	0x27E3E
+0x6B25	0x28654
+0x6B28	0x28BB9
+0x6B2B	0x2905F
+0x6B2E	0x29572
+0x6B2F	0x29575
+0x6B36	0x29AA3
+0x6B37	0x29AA5
+0x6B38	0x29BDC
+0x6B39	0x29BDD
+0x6B3A	0x29C5A
+0x6B3E	0x29EDB
+0x6B3F	0x29EDC
+0x6B41	0x2A1AB
+0x6B42	0x2A184
+0x6B43	0x2A176
+0x6B49	0x2A183
+0x6B4C	0x2A27F
+0x6B4F	0x2A373
+0x6B50	0x2A3AD
+0x6B51	0x2A3B0
+0x6B53	0x2A40F
+0x6B54	0x2A40C
+0x6B57	0x2A579
+0x6B59	0x2A577
+0x6B5A	0x2A57A
+0x6B5D	0x2A632
+0x6B5E	0x2A627
+0x6B5F	0x2A62A
+0x6B60	0x2A62C
+0x6B62	0x2A628
+0x6B63	0x2A629
+0x6B64	0x2A638
+0x6B65	0x2082F
+0x6B66	0x2117B
+0x6B67	0x21B0D
+0x6B69	0x21FD6
+0x6B6A	0x21FD5
+0x6B6B	0x22EA1
+0x6B6C	0x2384C
+0x6B73	0x24FC0
+0x6B77	0x25DF4
+0x6B7A	0x261F0
+0x6B7C	0x2633F
+0x6B7E	0x2755D
+0x6C21	0x27572
+0x6C22	0x27562
+0x6C24	0x27566
+0x6C27	0x27B88
+0x6C2A	0x281E8
+0x6C2B	0x281E4
+0x6C2F	0x288FF
+0x6C31	0x291AF
+0x6C32	0x291AE
+0x6C35	0x293F2
+0x6C36	0x29448
+0x6C37	0x29581
+0x6C38	0x2957E
+0x6C3B	0x29652
+0x6C3C	0x297EF
+0x6C3F	0x29AAD
+0x6C40	0x29BE6
+0x6C42	0x29BED
+0x6C44	0x29BE9
+0x6C45	0x29C61
+0x6C46	0x29C60
+0x6C47	0x29D33
+0x6C4B	0x29F0B
+0x6C4C	0x29F08
+0x6C4F	0x29F07
+0x6C53	0x2A1CA
+0x6C55	0x2A1C6
+0x6C57	0x2A284
+0x6C58	0x2A2EB
+0x6C59	0x2A37D
+0x6C5C	0x2A49B
+0x6C5D	0x2A4A2
+0x6C5E	0x2A4A1
+0x6C5F	0x2A4A0
+0x6C60	0x2A49C
+0x6C63	0x2A580
+0x6C65	0x2A640
+0x6C67	0x2A639
+0x6C68	0x2A63C
+0x6C6B	0x208CA
+0x6C6D	0x21189
+0x6C6F	0x2303C
+0x6C70	0x23940
+0x6C71	0x24163
+0x6C72	0x24169
+0x6C74	0x25353
+0x6C77	0x25917
+0x6C78	0x2591A
+0x6C79	0x25E00
+0x6C7E	0x2756F
+0x6D21	0x278AB
+0x6D23	0x27B91
+0x6D26	0x27FB1
+0x6D28	0x281EF
+0x6D29	0x28DF1
+0x6D2A	0x28DF2
+0x6D2B	0x291B7
+0x6D2C	0x291B5
+0x6D2E	0x29586
+0x6D2F	0x2965A
+0x6D31	0x299C6
+0x6D32	0x299CB
+0x6D34	0x29AB2
+0x6D36	0x29BF3
+0x6D38	0x29F27
+0x6D3B	0x2A1D5
+0x6D3C	0x2A1D8
+0x6D3E	0x2A1EC
+0x6D3F	0x2A287
+0x6D40	0x2A2F2
+0x6D45	0x2A4AD
+0x6D46	0x2A4B0
+0x6D47	0x2A4FD
+0x6D49	0x2A587
+0x6D4A	0x2A64A
+0x6D4D	0x2A64E
+0x6D4E	0x2A649
+0x6D4F	0x2A651
+0x6D50	0x2A64D
+0x6D52	0x20472
+0x6D54	0x21B16
+0x6D55	0x2386D
+0x6D56	0x23941
+0x6D58	0x24171
+0x6D59	0x24174
+0x6D5D	0x25F7C
+0x6D5F	0x2718A
+0x6D60	0x27956
+0x6D63	0x28BFA
+0x6D66	0x2965B
+0x6D6A	0x2A1F5
+0x6D6B	0x2A1F0
+0x6D6C	0x2A2F3
+0x6D6D	0x2A37F
+0x6D6E	0x2A413
+0x6D71	0x21B19
+0x6D72	0x22985
+0x6D73	0x22EB0
+0x6D74	0x24177
+0x6D75	0x255FF
+0x6D7A	0x27187
+0x6D7C	0x2718B
+0x6D7E	0x27B9E
+0x6E23	0x2958F
+0x6E26	0x29839
+0x6E27	0x299D4
+0x6E28	0x29AF1
+0x6E29	0x29C02
+0x6E2A	0x29C6B
+0x6E2B	0x29D40
+0x6E2E	0x2A210
+0x6E2F	0x2A4BE
+0x6E30	0x2A4B9
+0x6E32	0x2A664
+0x6E34	0x24AE9
+0x6E35	0x27190
+0x6E38	0x2721C
+0x6E3A	0x27592
+0x6E3B	0x278AE
+0x6E3C	0x27BA3
+0x6E3E	0x291C9
+0x6E40	0x299D8
+0x6E41	0x29D44
+0x6E42	0x2A224
+0x6E46	0x2A670
+0x6E47	0x2A6D3
+0x6E4A	0x2A4C3
+0x6E4E	0x25E21
+0x6E4F	0x26ACA
+0x6E50	0x2759C
+0x6E51	0x29C73
+0x6E52	0x2A386
+0x6E53	0x2A5C1
+0x6E54	0x29C09
+0x6E56	0x2A6D5
+0x6E5C	0x291D4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,8143 @@
+0x2121	0x200D1	
+0x2122	0x200CB	
+0x2123	0x200C9	
+0x2124	0x2010C	
+0x2125	0x20000	
+0x2126	0x20087	
+0x2127	0x2010D	
+0x2128	0x2010F	
+0x2129	0x2F81D	
+0x212A	0x22398	
+0x212B	0x200D2	
+0x212C	0x20111	
+0x212D	0x2007E	
+0x212E	0x20AD3	
+0x212F	0x21552	
+0x2130	0x21CFE	
+0x2131	0x225A9	
+0x2132	0x23942	
+0x2133	0x20009	
+0x2134	0x200D6	
+0x2135	0x204DD	
+0x2136	0x204DC	
+0x2137	0x20502	
+0x2138	0x20573	
+0x2139	0x20676	
+0x213A	0x206A7	
+0x213B	0x206A8	
+0x213C	0x20833	
+0x213D	0x208CC	
+0x213E	0x20A0D	
+0x213F	0x20A2C	
+0x2140	0x20B1B	
+0x2142	0x20B1D	
+0x2143	0x20B99	
+0x2144	0x2123E	
+0x2145	0x21D2D	
+0x2146	0x21D2F	
+0x2147	0x22399	
+0x2148	0x233B3	
+0x2149	0x239B6	
+0x214A	0x23B1B	
+0x214B	0x244EF	
+0x214C	0x248E9	
+0x214D	0x20014	
+0x214E	0x20094	
+0x214F	0x200E1	
+0x2150	0x20506	
+0x2151	0x2054A	
+0x2152	0x20544	
+0x2153	0x20631	
+0x2154	0x2067A	
+0x2155	0x206AD	
+0x2156	0x206AE	
+0x2157	0x206B1	
+0x2158	0x20838	
+0x2159	0x20837	
+0x215A	0x2097D	
+0x215B	0x2097E	
+0x215C	0x20A2D	
+0x215D	0x20A32	
+0x215E	0x20B23	
+0x215F	0x20B26	
+0x2160	0x2F83A	
+0x2161	0x20BA0	
+0x2162	0x216A8	
+0x2163	0x2193F	
+0x2164	0x219BC	
+0x2165	0x21BC4	
+0x2166	0x21D3B	
+0x2167	0x22019	
+0x2168	0x22018	
+0x2169	0x221B3	
+0x216A	0x223AA	
+0x216B	0x224BE	
+0x216C	0x225AC	
+0x216D	0x22A25	
+0x216E	0x22A66	
+0x216F	0x22A6B	
+0x2170	0x23943	
+0x2171	0x239B5	
+0x2172	0x23AEC	
+0x2173	0x23C76	
+0x2175	0x24614	
+0x2176	0x215DC	
+0x2177	0x2471C	
+0x2178	0x2471D	
+0x2179	0x264D0	
+0x217A	0x26612	
+0x217B	0x26AF3	
+0x217C	0x28669	
+0x217E	0x28E11	
+0x2221	0x28E15	
+0x2222	0x28E10	
+0x2223	0x28E13	
+0x2224	0x200A4	
+0x2225	0x200A5	
+0x2226	0x201D0	
+0x2227	0x201BA	
+0x2228	0x201CB	
+0x2229	0x2057B	
+0x222A	0x20686	
+0x222B	0x206BB	
+0x222C	0x206BA	
+0x222D	0x206C3	
+0x222E	0x206B9	
+0x222F	0x206C0	
+0x2231	0x20839	
+0x2232	0x2083B	
+0x2233	0x20841	
+0x2234	0x208D1	
+0x2235	0x208CF	
+0x2236	0x208D2	
+0x2237	0x2092E	
+0x2238	0x2096E	
+0x2239	0x2098C	
+0x223A	0x20988	
+0x223B	0x20A35	
+0x223D	0x20A3A	
+0x223E	0x20A3B	
+0x223F	0x20A38	
+0x2240	0x20A39	
+0x2241	0x20B2E	
+0x2242	0x20B2C	
+0x2243	0x20BC8	
+0x2244	0x20BB5	
+0x2245	0x20BAD	
+0x2246	0x20BB0	
+0x2247	0x20BAB	
+0x2248	0x211B3	
+0x2249	0x211A9	
+0x224A	0x216BB	
+0x224B	0x216B9	
+0x224C	0x21B5A	
+0x224D	0x21BCD	
+0x224E	0x21C2B	
+0x224F	0x21D05	
+0x2252	0x21D51	
+0x2253	0x21D4B	
+0x2254	0x21FEA	
+0x2255	0x21FED	
+0x2256	0x22036	
+0x2257	0x22062	
+0x2258	0x22056	
+0x2259	0x22055	
+0x225A	0x22064	
+0x225B	0x22058	
+0x225D	0x221DA	
+0x225E	0x221D8	
+0x225F	0x223AD	
+0x2260	0x223AB	
+0x2261	0x224C0	
+0x2262	0x224C3	
+0x2263	0x225B3	
+0x2264	0x225B7	
+0x2265	0x225BA	
+0x2268	0x225C7	
+0x2269	0x225B5	
+0x226A	0x2298E	
+0x226B	0x22A73	
+0x226C	0x22A6C	
+0x226D	0x22A74	
+0x226E	0x2F8B4	
+0x226F	0x22A72	
+0x2270	0x22A71	
+0x2271	0x22A82	
+0x2272	0x22A70	
+0x2273	0x2313F	
+0x2274	0x233BA	
+0x2275	0x233B8	
+0x2276	0x239B7	
+0x2277	0x24723	
+0x2278	0x24721	
+0x2279	0x2472B	
+0x227A	0x24726	
+0x227B	0x24722	
+0x227C	0x24D25	
+0x227D	0x250E4	
+0x227E	0x25415	
+0x2321	0x264E4	
+0x2322	0x26633	
+0x2323	0x2662A	
+0x2324	0x26632	
+0x2325	0x26629	
+0x2326	0x26AFB	
+0x2327	0x2795B	
+0x2328	0x2795C	
+0x2329	0x27C28	
+0x232A	0x2866F	
+0x232B	0x2866D	
+0x232C	0x2866B	
+0x232D	0x2866E	
+0x232E	0x28E16	
+0x232F	0x20022	
+0x2330	0x20116	
+0x2331	0x20148	
+0x2332	0x201D8	
+0x2333	0x20200	
+0x2335	0x20480	
+0x2336	0x204E4	
+0x2338	0x204E7	
+0x2339	0x2050C	
+0x233A	0x20553	
+0x233B	0x205B7	
+0x233C	0x20AE8	
+0x233D	0x206D1	
+0x233E	0x206E5	
+0x233F	0x206D8	
+0x2340	0x206D6	
+0x2341	0x206DA	
+0x2342	0x206D9	
+0x2343	0x206D5	
+0x2344	0x206E6	
+0x2345	0x206D4	
+0x2346	0x206D3	
+0x2347	0x20844	
+0x2348	0x208D6	
+0x2349	0x208D7	
+0x234A	0x20913	
+0x234C	0x20970	
+0x234D	0x20992	
+0x234E	0x209DB	
+0x234F	0x209DA	
+0x2350	0x20A41	
+0x2351	0x20A43	
+0x2352	0x20B33	
+0x2353	0x20BF6	
+0x2354	0x20BD4	
+0x2355	0x20BDD	
+0x2356	0x20BD0	
+0x2357	0x20C04	
+0x2358	0x20BD9	
+0x2359	0x20BDB	
+0x235A	0x20C05	
+0x235B	0x20BD3	
+0x235C	0x20BE1	
+0x235D	0x21280	
+0x235E	0x21277	
+0x235F	0x21281	
+0x2360	0x21282	
+0x2361	0x21283	
+0x2362	0x2F85C	
+0x2363	0x21561	
+0x2364	0x21560	
+0x2365	0x216D8	
+0x2366	0x216D6	
+0x2367	0x216D7	
+0x2368	0x24605	
+0x2369	0x2194D	
+0x236A	0x21948	
+0x236B	0x21BD6	
+0x236C	0x21BCF	
+0x236D	0x21BD9	
+0x236E	0x21BD8	
+0x236F	0x21C3D	
+0x2371	0x21D54	
+0x2372	0x21D5B	
+0x2373	0x21D5C	
+0x2375	0x21D59	
+0x2376	0x21D58	
+0x2377	0x21D5A	
+0x2378	0x21D55	
+0x2379	0x21D56	
+0x237A	0x21D82	
+0x237B	0x21FF0	
+0x237C	0x2201C	
+0x237D	0x2206A	
+0x237E	0x22069	
+0x2421	0x22071	
+0x2422	0x22067	
+0x2423	0x2206C	
+0x2424	0x2206E	
+0x2425	0x22079	
+0x2426	0x2218B	
+0x2427	0x221B8	
+0x2428	0x221E7	
+0x2429	0x221E8	
+0x242A	0x221E4	
+0x242B	0x221E6	
+0x242C	0x221E5	
+0x242D	0x221F0	
+0x242E	0x22383	
+0x242F	0x223B7	
+0x2430	0x223BB	
+0x2431	0x223B9	
+0x2432	0x223C5	
+0x2433	0x22453	
+0x2434	0x224C4	
+0x2435	0x224C6	
+0x2436	0x224CB	
+0x2437	0x225C8	
+0x2438	0x2F89F	
+0x2439	0x225C9	
+0x243A	0x225DB	
+0x243B	0x22994	
+0x243C	0x22A95	
+0x243D	0x22A88	
+0x243E	0x22A8D	
+0x243F	0x22EEC	
+0x2440	0x22EEE	
+0x2441	0x22EF1	
+0x2442	0x2312E	
+0x2443	0x23149	
+0x2444	0x2335F	
+0x2445	0x233D1	
+0x2446	0x233CB	
+0x2447	0x23885	
+0x2449	0x2394A	
+0x244A	0x23947	
+0x244B	0x2394B	
+0x244C	0x239BB	
+0x244D	0x239C4	
+0x244F	0x23B02	
+0x2450	0x23C82	
+0x2451	0x23C91	
+0x2452	0x23C8F	
+0x2453	0x23C92	
+0x2454	0x2418F	
+0x2455	0x24191	
+0x2456	0x241B4	
+0x2457	0x24192	
+0x2458	0x244F4	
+0x2459	0x245AA	
+0x245A	0x24735	
+0x245B	0x24737	
+0x245C	0x2473D	
+0x245D	0x2473C	
+0x245E	0x2472F	
+0x245F	0x24730	
+0x2460	0x248F8	
+0x2461	0x248EF	
+0x2462	0x24B26	
+0x2464	0x24D26	
+0x2465	0x24D27	
+0x2466	0x24F41	
+0x2467	0x24FC6	
+0x2468	0x24FC7	
+0x2469	0x250EB	
+0x246A	0x250E8	
+0x246B	0x250EA	
+0x246C	0x2541A	
+0x246D	0x25419	
+0x246F	0x25923	
+0x2470	0x25924	
+0x2471	0x25E25	
+0x2472	0x26635	
+0x2473	0x26634	
+0x2474	0x26A07	
+0x2475	0x2721D	
+0x2476	0x277E1	
+0x2477	0x27BAB	
+0x2478	0x28460	
+0x2479	0x28677	
+0x247A	0x2867D	
+0x247C	0x28E1E	
+0x247D	0x28E1A	
+0x247E	0x28E1D	
+0x2521	0x2006B	
+0x2522	0x2012D	
+0x2523	0x2014C	
+0x2524	0x2022A	
+0x2526	0x20215	
+0x2527	0x2022C	
+0x2528	0x20206	
+0x2529	0x20208	
+0x252A	0x2020A	
+0x252C	0x20556	
+0x252D	0x20584	
+0x252F	0x205C6	
+0x2530	0x206F5	
+0x2531	0x20709	
+0x2532	0x206F8	
+0x2533	0x206E8	
+0x2534	0x206FB	
+0x2535	0x206E9	
+0x2536	0x206F6	
+0x2539	0x20852	
+0x253C	0x20854	
+0x253D	0x20851	
+0x253E	0x20939	
+0x253F	0x2093A	
+0x2540	0x20998	
+0x2541	0x20A4E	
+0x2543	0x20C36	
+0x2544	0x20C0C	
+0x2545	0x20C10	
+0x2546	0x20C32	
+0x2547	0x20C11	
+0x2548	0x20C18	
+0x2549	0x20C1C	
+0x254A	0x20C1A	
+0x254B	0x20C19	
+0x254C	0x20C0B	
+0x254D	0x20C0F	
+0x254E	0x20C1D	
+0x254F	0x20C21	
+0x2550	0x20C13	
+0x2551	0x20C1B	
+0x2552	0x20C15	
+0x2554	0x211D1	
+0x2555	0x211C8	
+0x2556	0x2128D	
+0x2557	0x212B5	
+0x255A	0x215F8	
+0x255B	0x216E0	
+0x255C	0x216E1	
+0x255E	0x216DE	
+0x255F	0x216FE	
+0x2560	0x216DC	
+0x2561	0x21701	
+0x2562	0x216FD	
+0x2563	0x21700	
+0x2564	0x219D7	
+0x2565	0x219D6	
+0x2566	0x219D9	
+0x2567	0x21B65	
+0x2568	0x21BD2	
+0x2569	0x21BDC	
+0x256A	0x21BE1	
+0x256B	0x21BDE	
+0x256C	0x21C42	
+0x256D	0x21C4B	
+0x256F	0x21D8E	
+0x2570	0x21D91	
+0x2571	0x21D8B	
+0x2572	0x21D90	
+0x2573	0x21D88	
+0x2574	0x21D89	
+0x2575	0x21D84	
+0x2576	0x21DAA	
+0x2577	0x2208D	
+0x2578	0x2208F	
+0x2579	0x2207D	
+0x257A	0x2207F	
+0x257B	0x2207B	
+0x257C	0x22080	
+0x257D	0x2207E	
+0x257E	0x22083	
+0x2621	0x22081	
+0x2622	0x22086	
+0x2623	0x2208A	
+0x2624	0x221BD	
+0x2625	0x221BE	
+0x2627	0x221F4	
+0x2628	0x221F3	
+0x2629	0x22202	
+0x262A	0x221F6	
+0x262B	0x221F5	
+0x262C	0x221F2	
+0x262D	0x22204	
+0x262E	0x2233D	
+0x262F	0x223C6	
+0x2630	0x22489	
+0x2631	0x224D4	
+0x2632	0x224D6	
+0x2633	0x224D2	
+0x2634	0x225FA	
+0x2635	0x22606	
+0x2636	0x2260C	
+0x2637	0x2260A	
+0x2638	0x2260F	
+0x2639	0x22A2F	
+0x263B	0x22AB7	
+0x263C	0x22ABE	
+0x263D	0x22ABC	
+0x263E	0x22AE2	
+0x263F	0x22F06	
+0x2640	0x22EF7	
+0x2641	0x22F07	
+0x2642	0x22EF6	
+0x2643	0x23B35	
+0x2644	0x2315F	
+0x2645	0x23165	
+0x2646	0x23164	
+0x2647	0x23161	
+0x2648	0x2315A	
+0x2649	0x2315D	
+0x264A	0x2F8D7	
+0x264B	0x233D7	
+0x264C	0x233D5	
+0x264D	0x233DE	
+0x264E	0x233E1	
+0x264F	0x233E0	
+0x2650	0x233D9	
+0x2652	0x233DA	
+0x2653	0x233DF	
+0x2654	0x233F6	
+0x2655	0x23403	
+0x2657	0x23893	
+0x2658	0x2388B	
+0x2659	0x23891	
+0x265A	0x23892	
+0x265B	0x2388A	
+0x265C	0x23889	
+0x265D	0x2388F	
+0x265E	0x23956	
+0x265F	0x23959	
+0x2660	0x239CA	
+0x2661	0x239CC	
+0x2663	0x239D0	
+0x2664	0x239CD	
+0x2665	0x239D6	
+0x2666	0x239CB	
+0x2667	0x23A83	
+0x2668	0x23A82	
+0x2669	0x23B06	
+0x266A	0x23B2A	
+0x266B	0x23B2C	
+0x266C	0x23B2B	
+0x266D	0x23B29	
+0x266E	0x23CBD	
+0x266F	0x23CB3	
+0x2670	0x23CBE	
+0x2671	0x23CC0	
+0x2672	0x23CB5	
+0x2673	0x23CB6	
+0x2674	0x2419D	
+0x2675	0x2419F	
+0x2676	0x24620	
+0x2678	0x2461E	
+0x2679	0x2461C	
+0x267A	0x24632	
+0x267B	0x2461F	
+0x267C	0x2462B	
+0x267D	0x24621	
+0x267E	0x24626	
+0x2721	0x24624	
+0x2722	0x2461D	
+0x2723	0x24627	
+0x2724	0x2475B	
+0x2725	0x24759	
+0x2726	0x24780	
+0x2727	0x24755	
+0x2728	0x24750	
+0x2729	0x2475A	
+0x272A	0x24756	
+0x272B	0x24763	
+0x272C	0x24752	
+0x272D	0x24758	
+0x272F	0x24739	
+0x2730	0x248F9	
+0x2731	0x24B28	
+0x2733	0x24BBC	
+0x2734	0x24BD6	
+0x2735	0x24C05	
+0x2736	0x24C20	
+0x2738	0x24D33	
+0x2739	0x24F46	
+0x273A	0x24F42	
+0x273B	0x24F43	
+0x273C	0x24F47	
+0x273D	0x24FCB	
+0x273E	0x25042	
+0x273F	0x25045	
+0x2740	0x250FD	
+0x2741	0x250F4	
+0x2742	0x250F9	
+0x2743	0x250FA	
+0x2744	0x2535E	
+0x2745	0x2541D	
+0x2747	0x25758	
+0x2748	0x25755	
+0x2749	0x25A57	
+0x274A	0x25A58	
+0x274B	0x25AD9	
+0x274C	0x25ADC	
+0x274D	0x25ADB	
+0x274E	0x25E27	
+0x274F	0x25F85	
+0x2750	0x25F87	
+0x2751	0x25F8A	
+0x2752	0x2628B	
+0x2753	0x2634F	
+0x2754	0x26530	
+0x2755	0x2652F	
+0x2756	0x26668	
+0x2757	0x26649	
+0x2759	0x26648	
+0x275A	0x2663F	
+0x275B	0x2664B	
+0x275C	0x2665C	
+0x275D	0x26646	
+0x275E	0x26640	
+0x275F	0x26A0D	
+0x2760	0x26B1B	
+0x2761	0x26B1D	
+0x2762	0x26B17	
+0x2764	0x26B22	
+0x2765	0x275A7	
+0x2766	0x27608	
+0x2767	0x27806	
+0x2768	0x2847D	
+0x276A	0x28463	
+0x276B	0x28464	
+0x276C	0x2847F	
+0x276D	0x2846B	
+0x276E	0x2847C	
+0x276F	0x28468	
+0x2770	0x28465	
+0x2771	0x2846A	
+0x2772	0x28698	
+0x2773	0x28699	
+0x2774	0x286AE	
+0x2775	0x28E2B	
+0x2776	0x28E2D	
+0x2777	0x28E31	
+0x2778	0x28E2E	
+0x2779	0x28E2F	
+0x277A	0x2006D	
+0x277B	0x20131	
+0x277C	0x2022D	
+0x277D	0x20239	
+0x277E	0x20238	
+0x2822	0x2023A	
+0x2823	0x20235	
+0x2824	0x20262	
+0x2825	0x204EA	
+0x2826	0x204EB	
+0x2827	0x20515	
+0x2828	0x205CC	
+0x2829	0x205C8	
+0x282A	0x205CD	
+0x282B	0x205DB	
+0x282C	0x205CB	
+0x282D	0x20711	
+0x282E	0x20726	
+0x282F	0x20862	
+0x2830	0x2085E	
+0x2831	0x20861	
+0x2832	0x20941	
+0x2833	0x2093F	
+0x2834	0x20975	
+0x2835	0x23965	
+0x2836	0x20B49	
+0x2837	0x209EB	
+0x2838	0x20A1A	
+0x2839	0x20A57	
+0x283A	0x20C6B	
+0x283B	0x20CA9	
+0x283C	0x20C54	
+0x283D	0x20C62	
+0x283E	0x20CAA	
+0x283F	0x20C58	
+0x2840	0x20C72	
+0x2841	0x20C63	
+0x2842	0x20C73	
+0x2843	0x20C8B	
+0x2844	0x20C8C	
+0x2845	0x20C5C	
+0x2846	0x20C51	
+0x2847	0x20C16	
+0x2848	0x20C60	
+0x2849	0x20C61	
+0x284A	0x20C5E	
+0x284B	0x20C5D	
+0x284C	0x20C64	
+0x284D	0x20C53	
+0x284E	0x20C5F	
+0x284F	0x20C5B	
+0x2850	0x20C6E	
+0x2851	0x20C55	
+0x2852	0x20C52	
+0x2853	0x20C68	
+0x2854	0x211D2	
+0x2855	0x211D6	
+0x2856	0x211D3	
+0x2857	0x212B8	
+0x2858	0x212BB	
+0x2859	0x212EB	
+0x285A	0x212E8	
+0x285B	0x212B6	
+0x285C	0x212EA	
+0x285D	0x212E7	
+0x285E	0x212E9	
+0x285F	0x21591	
+0x2860	0x21610	
+0x2861	0x2160E	
+0x2862	0x2160F	
+0x2863	0x2170B	
+0x2864	0x21703	
+0x2865	0x2172B	
+0x2866	0x21709	
+0x2867	0x21728	
+0x2868	0x2172C	
+0x2869	0x21725	
+0x286A	0x21727	
+0x286B	0x2170F	
+0x286C	0x219E9	
+0x286D	0x219EC	
+0x286F	0x21B27	
+0x2870	0x21B73	
+0x2871	0x21BE2	
+0x2872	0x21BE6	
+0x2873	0x2F876	
+0x2874	0x21C61	
+0x2875	0x21C51	
+0x2876	0x21D12	
+0x2877	0x21D0E	
+0x2878	0x21DAD	
+0x2879	0x21DAF	
+0x287A	0x21DB1	
+0x287B	0x21DD3	
+0x287C	0x22094	
+0x287D	0x22092	
+0x287E	0x22090	
+0x2921	0x2209D	
+0x2922	0x22093	
+0x2923	0x22095	
+0x2924	0x22098	
+0x2925	0x22097	
+0x2927	0x2F88A	
+0x2928	0x22207	
+0x2929	0x2220B	
+0x292A	0x22208	
+0x292B	0x223D9	
+0x292C	0x223D5	
+0x292D	0x224D7	
+0x292E	0x224DF	
+0x2930	0x224DE	
+0x2931	0x224E3	
+0x2932	0x224E2	
+0x2934	0x22647	
+0x2936	0x2263D	
+0x2937	0x22638	
+0x2938	0x22A44	
+0x2939	0x22A3A	
+0x293A	0x22AB8	
+0x293B	0x22B2A	
+0x293C	0x22B00	
+0x293D	0x22AF3	
+0x293E	0x22AF2	
+0x293F	0x22AEB	
+0x2940	0x22AFA	
+0x2941	0x22AED	
+0x2942	0x22AEC	
+0x2943	0x22AFF	
+0x2944	0x22AFB	
+0x2946	0x22B4E	
+0x2947	0x22AEF	
+0x2948	0x22AF7	
+0x2949	0x22F10	
+0x294A	0x22F11	
+0x294B	0x22F0C	
+0x294C	0x22F0B	
+0x294D	0x230DD	
+0x294E	0x23130	
+0x2950	0x2317A	
+0x2951	0x23177	
+0x2952	0x23328	
+0x2953	0x23327	
+0x2954	0x23365	
+0x2955	0x2340E	
+0x2956	0x2340B	
+0x2957	0x23441	
+0x2958	0x23413	
+0x2959	0x2340F	
+0x295A	0x23412	
+0x295B	0x23430	
+0x295C	0x238A0	
+0x295D	0x238A3	
+0x295E	0x2389E	
+0x295F	0x23897	
+0x2960	0x238A1	
+0x2961	0x2389D	
+0x2962	0x2389B	
+0x2963	0x23963	
+0x2964	0x239E3	
+0x2965	0x239E4	
+0x2966	0x239E6	
+0x2967	0x239E7	
+0x2968	0x239DD	
+0x296A	0x239EC	
+0x296B	0x239E5	
+0x296C	0x239F1	
+0x296D	0x23B3B	
+0x296E	0x23B39	
+0x296F	0x23B3A	
+0x2970	0x23B3C	
+0x2971	0x23B3D	
+0x2972	0x23B47	
+0x2973	0x23B3F	
+0x2974	0x23B44	
+0x2975	0x23C48	
+0x2976	0x23C49	
+0x2977	0x23C60	
+0x2978	0x23CE3	
+0x2979	0x23CE9	
+0x297A	0x23CF0	
+0x297D	0x23CF2	
+0x297E	0x23CED	
+0x2A21	0x23CEC	
+0x2A22	0x23CE6	
+0x2A23	0x23D16	
+0x2A25	0x241BC	
+0x2A26	0x241BE	
+0x2A27	0x241C0	
+0x2A28	0x241E0	
+0x2A29	0x24500	
+0x2A2A	0x24502	
+0x2A2B	0x244FE	
+0x2A2C	0x2455E	
+0x2A2D	0x245B3	
+0x2A2E	0x245B7	
+0x2A2F	0x2463A	
+0x2A30	0x24639	
+0x2A31	0x2463E	
+0x2A32	0x24638	
+0x2A33	0x2463D	
+0x2A34	0x2464F	
+0x2A35	0x2476E	
+0x2A36	0x2475F	
+0x2A37	0x24781	
+0x2A38	0x24782	
+0x2A39	0x24771	
+0x2A3A	0x2477B	
+0x2A3B	0x24779	
+0x2A3C	0x24777	
+0x2A3D	0x24773	
+0x2A3E	0x2476F	
+0x2A3F	0x24797	
+0x2A40	0x2477E	
+0x2A41	0x248FC	
+0x2A42	0x24911	
+0x2A43	0x24932	
+0x2A44	0x24931	
+0x2A45	0x24910	
+0x2A46	0x24AEC	
+0x2A47	0x24AEB	
+0x2A48	0x24B2C	
+0x2A49	0x24B2D	
+0x2A4A	0x24BDA	
+0x2A4B	0x24C2E	
+0x2A4C	0x24C2C	
+0x2A4D	0x24C2A	
+0x2A4E	0x24C33	
+0x2A4F	0x24C4B	
+0x2A50	0x24D18	
+0x2A51	0x24D42	
+0x2A52	0x24D3B	
+0x2A53	0x24D3F	
+0x2A54	0x24D41	
+0x2A55	0x24D43	
+0x2A56	0x24D3C	
+0x2A57	0x24F4C	
+0x2A58	0x24F4A	
+0x2A59	0x24F49	
+0x2A5A	0x24F56	
+0x2A5B	0x24FCF	
+0x2A5C	0x25047	
+0x2A5D	0x25048	
+0x2A5E	0x25046	
+0x2A5F	0x2511B	
+0x2A60	0x25111	
+0x2A61	0x25114	
+0x2A62	0x2511D	
+0x2A63	0x25117	
+0x2A64	0x2511E	
+0x2A65	0x2510B	
+0x2A66	0x2511C	
+0x2A67	0x25112	
+0x2A68	0x25116	
+0x2A69	0x2510D	
+0x2A6A	0x25115	
+0x2A6B	0x25113	
+0x2A6C	0x25118	
+0x2A6E	0x253AC	
+0x2A6F	0x25444	
+0x2A70	0x2542C	
+0x2A71	0x25445	
+0x2A72	0x25766	
+0x2A73	0x2576E	
+0x2A74	0x25765	
+0x2A75	0x25768	
+0x2A76	0x25784	
+0x2A77	0x25938	
+0x2A78	0x2593B	
+0x2A79	0x2593A	
+0x2A7A	0x2593F	
+0x2A7B	0x25ADF	
+0x2A7C	0x25ADD	
+0x2A7D	0x25ADE	
+0x2A7E	0x25AE2	
+0x2B22	0x25E2C	
+0x2B23	0x25E2F	
+0x2B24	0x25F8F	
+0x2B25	0x25F90	
+0x2B26	0x25F8C	
+0x2B27	0x25F93	
+0x2B28	0x26225	
+0x2B29	0x26288	
+0x2B2A	0x262A7	
+0x2B2B	0x263F7	
+0x2B2C	0x264BB	
+0x2B2D	0x26538	
+0x2B2E	0x26539	
+0x2B2F	0x26537	
+0x2B30	0x26614	
+0x2B31	0x2666E	
+0x2B32	0x2667B	
+0x2B34	0x2666C	
+0x2B35	0x2667F	
+0x2B36	0x26678	
+0x2B37	0x2667A	
+0x2B38	0x2666F	
+0x2B3A	0x268FE	
+0x2B3B	0x26B48	
+0x2B3C	0x26B4B	
+0x2B3D	0x26B41	
+0x2B3E	0x26B49	
+0x2B3F	0x26B3B	
+0x2B40	0x2722D	
+0x2B41	0x275E3	
+0x2B42	0x2761A	
+0x2B43	0x2760D	
+0x2B44	0x27613	
+0x2B45	0x27611	
+0x2B46	0x2761C	
+0x2B48	0x278B5	
+0x2B4A	0x27C29	
+0x2B4B	0x27CA1	
+0x2B4C	0x27D24	
+0x2B4D	0x27FBB	
+0x2B4E	0x282A1	
+0x2B4F	0x28483	
+0x2B50	0x2848D	
+0x2B51	0x28487	
+0x2B52	0x28485	
+0x2B53	0x2848A	
+0x2B54	0x284A3	
+0x2B55	0x28489	
+0x2B56	0x28484	
+0x2B57	0x284A2	
+0x2B58	0x286B1	
+0x2B59	0x286B0	
+0x2B5A	0x286AF	
+0x2B5B	0x286B6	
+0x2B5C	0x286C9	
+0x2B5D	0x286CA	
+0x2B5E	0x286C8	
+0x2B5F	0x286B4	
+0x2B60	0x28C59	
+0x2B61	0x28CC9	
+0x2B62	0x28E41	
+0x2B63	0x28E4C	
+0x2B65	0x28E45	
+0x2B66	0x28E5A	
+0x2B67	0x200B9	
+0x2B68	0x20294	
+0x2B69	0x2026E	
+0x2B6A	0x202A2	
+0x2B6B	0x20267	
+0x2B6D	0x202A3	
+0x2B6E	0x20276	
+0x2B6F	0x2026C	
+0x2B70	0x20264	
+0x2B71	0x202A5	
+0x2B72	0x20230	
+0x2B73	0x202A6	
+0x2B74	0x20269	
+0x2B75	0x202A4	
+0x2B76	0x20490	
+0x2B77	0x2055F	
+0x2B78	0x20560	
+0x2B79	0x205DA	
+0x2B7A	0x205D8	
+0x2B7B	0x205DD	
+0x2B7D	0x20759	
+0x2B7E	0x2075B	
+0x2C21	0x2075A	
+0x2C22	0x20739	
+0x2C23	0x20734	
+0x2C24	0x20744	
+0x2C25	0x20733	
+0x2C26	0x2073C	
+0x2C27	0x20758	
+0x2C28	0x2076A	
+0x2C29	0x2086F	
+0x2C2A	0x20872	
+0x2C2B	0x20870	
+0x2C2C	0x20871	
+0x2C2D	0x2086E	
+0x2C2E	0x208F0	
+0x2C2F	0x208EB	
+0x2C30	0x20949	
+0x2C31	0x2094C	
+0x2C32	0x209F5	
+0x2C33	0x20A20	
+0x2C34	0x20A6A	
+0x2C35	0x20A72	
+0x2C36	0x20B4B	
+0x2C37	0x20B5D	
+0x2C38	0x20C50	
+0x2C39	0x20CF9	
+0x2C3A	0x20CFA	
+0x2C3B	0x20CFB	
+0x2C3C	0x20D23	
+0x2C3D	0x20CB7	
+0x2C3E	0x20D22	
+0x2C3F	0x20CB5	
+0x2C40	0x20CC4	
+0x2C41	0x20CB4	
+0x2C42	0x20CEF	
+0x2C44	0x20CCD	
+0x2C45	0x20CF0	
+0x2C46	0x20CB8	
+0x2C47	0x20CCB	
+0x2C48	0x20CF1	
+0x2C49	0x20CBA	
+0x2C4A	0x20D03	
+0x2C4B	0x20CF8	
+0x2C4C	0x20CB6	
+0x2C4D	0x20CBC	
+0x2C4E	0x20CB3	
+0x2C4F	0x20D21	
+0x2C50	0x20CF7	
+0x2C51	0x20CC2	
+0x2C52	0x20CBE	
+0x2C53	0x20CC9	
+0x2C54	0x20CBD	
+0x2C55	0x20CCE	
+0x2C56	0x20CB9	
+0x2C57	0x20CC7	
+0x2C58	0x20CCA	
+0x2C59	0x20CCC	
+0x2C5A	0x20D26	
+0x2C5B	0x211E4	
+0x2C5C	0x211E0	
+0x2C5D	0x211F0	
+0x2C5E	0x212EC	
+0x2C5F	0x21324	
+0x2C60	0x21318	
+0x2C61	0x2132F	
+0x2C62	0x21325	
+0x2C63	0x21528	
+0x2C64	0x21522	
+0x2C65	0x2156A	
+0x2C66	0x20157	
+0x2C67	0x21594	
+0x2C68	0x21592	
+0x2C69	0x2159C	
+0x2C6A	0x21622	
+0x2C6B	0x21630	
+0x2C6C	0x2161D	
+0x2C6D	0x21623	
+0x2C6E	0x21735	
+0x2C6F	0x21733	
+0x2C70	0x2172F	
+0x2C71	0x2174D	
+0x2C72	0x21731	
+0x2C73	0x2175B	
+0x2C74	0x2175A	
+0x2C75	0x21732	
+0x2C76	0x2175C	
+0x2C77	0x21759	
+0x2C78	0x2175D	
+0x2C79	0x21969	
+0x2C7A	0x2196D	
+0x2C7B	0x22232	
+0x2C7D	0x21A0A	
+0x2C7E	0x21A20	
+0x2D21	0x21A1F	
+0x2D22	0x21A0D	
+0x2D23	0x21BE8	
+0x2D24	0x21BEC	
+0x2D25	0x21C77	
+0x2D26	0x21C70	
+0x2D27	0x21C71	
+0x2D28	0x21DF8	
+0x2D29	0x21DD6	
+0x2D2A	0x21DD9	
+0x2D2B	0x21DDE	
+0x2D2C	0x21DD5	
+0x2D2D	0x21DE1	
+0x2D2F	0x21DE2	
+0x2D30	0x21DDD	
+0x2D31	0x21DE0	
+0x2D32	0x21E0E	
+0x2D33	0x21E08	
+0x2D34	0x21DDC	
+0x2D35	0x21E0A	
+0x2D36	0x21E0C	
+0x2D37	0x220B4	
+0x2D38	0x220B1	
+0x2D39	0x220B6	
+0x2D3A	0x220BC	
+0x2D3B	0x2221D	
+0x2D3C	0x22224	
+0x2D3D	0x22219	
+0x2D3E	0x2221B	
+0x2D3F	0x22222	
+0x2D40	0x2221A	
+0x2D41	0x2221C	
+0x2D42	0x22221	
+0x2D43	0x223E6	
+0x2D44	0x223E4	
+0x2D45	0x223E7	
+0x2D46	0x223EA	
+0x2D48	0x2F89B	
+0x2D49	0x224F0	
+0x2D4A	0x224F5	
+0x2D4B	0x224EF	
+0x2D4C	0x22642	
+0x2D4D	0x2266E	
+0x2D4E	0x2263C	
+0x2D4F	0x22697	
+0x2D50	0x2268C	
+0x2D51	0x22681	
+0x2D52	0x22671	
+0x2D53	0x226CE	
+0x2D54	0x226BA	
+0x2D55	0x2267A	
+0x2D56	0x2267E	
+0x2D58	0x22672	
+0x2D59	0x226BB	
+0x2D5B	0x22673	
+0x2D5C	0x22682	
+0x2D5E	0x229BA	
+0x2D5F	0x229B8	
+0x2D60	0x22A4B	
+0x2D61	0x22A48	
+0x2D62	0x22B2B	
+0x2D63	0x22AF4	
+0x2D64	0x22B2C	
+0x2D65	0x22B42	
+0x2D66	0x22B48	
+0x2D67	0x22B44	
+0x2D68	0x22B45	
+0x2D69	0x22B3C	
+0x2D6A	0x22B37	
+0x2D6B	0x22B33	
+0x2D6C	0x22B41	
+0x2D6D	0x22B32	
+0x2D6E	0x22B87	
+0x2D6F	0x22F27	
+0x2D70	0x22F23	
+0x2D71	0x22F2D	
+0x2D72	0x22F1F	
+0x2D73	0x22F2C	
+0x2D74	0x22F28	
+0x2D75	0x23075	
+0x2D76	0x23074	
+0x2D77	0x230E7	
+0x2D78	0x23132	
+0x2D79	0x23131	
+0x2D7A	0x23199	
+0x2D7B	0x23196	
+0x2D7C	0x23198	
+0x2D7D	0x2319D	
+0x2D7E	0x23192	
+0x2E21	0x23194	
+0x2E22	0x23195	
+0x2E23	0x23197	
+0x2E24	0x266B9	
+0x2E26	0x23411	
+0x2E27	0x2343B	
+0x2E28	0x23479	
+0x2E29	0x23442	
+0x2E2A	0x23443	
+0x2E2C	0x23478	
+0x2E2D	0x238AC	
+0x2E2F	0x238B1	
+0x2E30	0x238B4	
+0x2E31	0x238B3	
+0x2E32	0x238AF	
+0x2E33	0x238AA	
+0x2E34	0x238B2	
+0x2E35	0x23968	
+0x2E36	0x239F2	
+0x2E37	0x239FE	
+0x2E38	0x239F8	
+0x2E39	0x239F9	
+0x2E3A	0x239FF	
+0x2E3B	0x239F5	
+0x2E3C	0x239F7	
+0x2E3D	0x239FD	
+0x2E3E	0x23A00	
+0x2E3F	0x23A88	
+0x2E40	0x23B6E	
+0x2E41	0x23B5D	
+0x2E42	0x23B63	
+0x2E43	0x23B60	
+0x2E44	0x23C61	
+0x2E45	0x23D37	
+0x2E46	0x23D71	
+0x2E47	0x23D23	
+0x2E48	0x23D22	
+0x2E49	0x23D1F	
+0x2E4A	0x23D25	
+0x2E4B	0x241FD	
+0x2E4C	0x24211	
+0x2E4D	0x24223	
+0x2E4E	0x241F0	
+0x2E4F	0x241EF	
+0x2E50	0x2450E	
+0x2E51	0x2450C	
+0x2E52	0x245BA	
+0x2E54	0x24652	
+0x2E55	0x24655	
+0x2E56	0x24653	
+0x2E57	0x24654	
+0x2E58	0x24651	
+0x2E59	0x24658	
+0x2E5A	0x247B0	
+0x2E5B	0x2479F	
+0x2E5D	0x247A1	
+0x2E5E	0x2479A	
+0x2E5F	0x247BE	
+0x2E60	0x247A0	
+0x2E61	0x24937	
+0x2E63	0x24AF1	
+0x2E64	0x24AF2	
+0x2E65	0x24B34	
+0x2E66	0x24B37	
+0x2E67	0x24B35	
+0x2E68	0x2238C	
+0x2E69	0x24BDF	
+0x2E6A	0x24C4C	
+0x2E6B	0x24C4E	
+0x2E6C	0x24C64	
+0x2E6D	0x24C63	
+0x2E6E	0x24C36	
+0x2E6F	0x24D58	
+0x2E70	0x24D68	
+0x2E71	0x24D5B	
+0x2E72	0x24D5F	
+0x2E73	0x24D59	
+0x2E74	0x24D65	
+0x2E75	0x24D60	
+0x2E76	0x24D5E	
+0x2E77	0x24FD5	
+0x2E78	0x24FD6	
+0x2E79	0x2504E	
+0x2E7A	0x25052	
+0x2E7B	0x25135	
+0x2E7C	0x25139	
+0x2E7D	0x25158	
+0x2E7E	0x25141	
+0x2F21	0x25157	
+0x2F22	0x25138	
+0x2F23	0x2513D	
+0x2F24	0x25132	
+0x2F25	0x25144	
+0x2F26	0x2F944	
+0x2F27	0x25363	
+0x2F28	0x25362	
+0x2F29	0x253B8	
+0x2F2A	0x253B0	
+0x2F2B	0x253B1	
+0x2F2C	0x2544D	
+0x2F2D	0x25463	
+0x2F2E	0x25470	
+0x2F2F	0x2544B	
+0x2F30	0x2544F	
+0x2F31	0x2544E	
+0x2F32	0x25453	
+0x2F33	0x25447	
+0x2F35	0x25454	
+0x2F36	0x25452	
+0x2F37	0x25459	
+0x2F38	0x2547E	
+0x2F39	0x2562B	
+0x2F3A	0x2562E	
+0x2F3B	0x2577F	
+0x2F3C	0x2577E	
+0x2F3D	0x25781	
+0x2F3E	0x25783	
+0x2F3F	0x25947	
+0x2F40	0x25954	
+0x2F41	0x2594D	
+0x2F42	0x2594C	
+0x2F43	0x2594B	
+0x2F44	0x25957	
+0x2F45	0x25A65	
+0x2F46	0x25A64	
+0x2F47	0x25A61	
+0x2F48	0x25A62	
+0x2F49	0x25AF0	
+0x2F4A	0x25AF3	
+0x2F4B	0x25AF9	
+0x2F4C	0x25AF4	
+0x2F4D	0x25AF5	
+0x2F4E	0x25AEF	
+0x2F4F	0x25AF8	
+0x2F50	0x25AFC	
+0x2F51	0x25AF7	
+0x2F52	0x25AFD	
+0x2F53	0x25B17	
+0x2F54	0x25E34	
+0x2F55	0x25E36	
+0x2F56	0x25E38	
+0x2F57	0x25FAF	
+0x2F58	0x25FAE	
+0x2F59	0x25FAC	
+0x2F5A	0x25FA2	
+0x2F5B	0x26228	
+0x2F5C	0x22EC2	
+0x2F5D	0x2629C	
+0x2F5E	0x262B3	
+0x2F5F	0x26290	
+0x2F60	0x26406	
+0x2F61	0x26404	
+0x2F62	0x2640B	
+0x2F63	0x26405	
+0x2F64	0x26540	
+0x2F65	0x2654F	
+0x2F66	0x266AB	
+0x2F67	0x2669D	
+0x2F68	0x266B8	
+0x2F69	0x266B2	
+0x2F6A	0x266D2	
+0x2F6B	0x266CF	
+0x2F6C	0x266A2	
+0x2F6E	0x266A5	
+0x2F6F	0x266A9	
+0x2F70	0x266A7	
+0x2F71	0x266D0	
+0x2F72	0x26902	
+0x2F73	0x269CF	
+0x2F74	0x269D0	
+0x2F75	0x26A16	
+0x2F76	0x26A19	
+0x2F77	0x26B75	
+0x2F78	0x26B71	
+0x2F79	0x26B91	
+0x2F7A	0x26B72	
+0x2F7B	0x26B8E	
+0x2F7C	0x26B6D	
+0x2F7D	0x26B88	
+0x2F7E	0x26B73	
+0x3022	0x26B81	
+0x3023	0x26B76	
+0x3024	0x26B7B	
+0x3025	0x26B7F	
+0x3026	0x26B90	
+0x3027	0x26B78	
+0x3028	0x2724B	
+0x3029	0x27248	
+0x302A	0x2725B	
+0x302B	0x27251	
+0x302C	0x2723D	
+0x302D	0x27240	
+0x302E	0x27246	
+0x302F	0x2724D	
+0x3030	0x2723B	
+0x3031	0x2724A	
+0x3032	0x27241	
+0x3033	0x2723E	
+0x3034	0x2724E	
+0x3035	0x275AC	
+0x3036	0x275E6	
+0x3037	0x275E9	
+0x3038	0x27629	
+0x303A	0x27633	
+0x303B	0x2762E	
+0x303C	0x2761E	
+0x303E	0x2F9C5	
+0x303F	0x27622	
+0x3040	0x27627	
+0x3041	0x277E7	
+0x3042	0x2780B	
+0x3043	0x27966	
+0x3044	0x27BAD	
+0x3045	0x27BAE	
+0x3047	0x27C2B	
+0x3048	0x27C2A	
+0x3049	0x27D2C	
+0x304A	0x27D2D	
+0x304D	0x27E8F	
+0x304E	0x27E93	
+0x304F	0x27FC6	
+0x3050	0x27FC5	
+0x3051	0x28215	
+0x3052	0x28213	
+0x3053	0x282B1	
+0x3054	0x282A9	
+0x3056	0x284A8	
+0x3057	0x284AB	
+0x3058	0x284BE	
+0x3059	0x284AC	
+0x305A	0x284A9	
+0x305B	0x284A6	
+0x305C	0x284C1	
+0x305D	0x286CC	
+0x305E	0x286D1	
+0x305F	0x286D3	
+0x3060	0x286E4	
+0x3061	0x286CB	
+0x3062	0x286E1	
+0x3063	0x286D2	
+0x3064	0x286E3	
+0x3065	0x286CF	
+0x3066	0x286D0	
+0x3067	0x286E5	
+0x3068	0x2870E	
+0x3069	0x28CCC	
+0x306A	0x28CCA	
+0x306B	0x28CCB	
+0x306C	0x28E5C	
+0x306D	0x28E61	
+0x306E	0x28E5D	
+0x306F	0x28E59	
+0x3070	0x29077	
+0x3071	0x29684	
+0x3072	0x20041	
+0x3073	0x200FD	
+0x3074	0x2011A	
+0x3075	0x20163	
+0x3076	0x202B6	
+0x3077	0x202B2	
+0x3078	0x202E9	
+0x3079	0x202E7	
+0x307A	0x202D6	
+0x307B	0x20330	
+0x307C	0x202EC	
+0x307D	0x202DD	
+0x307E	0x202E8	
+0x3121	0x202B0	
+0x3122	0x202B5	
+0x3123	0x202E1	
+0x3124	0x20498	
+0x3125	0x20499	
+0x3127	0x20593	
+0x3128	0x205E5	
+0x312A	0x20760	
+0x312B	0x2075E	
+0x312D	0x2087B	
+0x312E	0x208F1	
+0x312F	0x208F3	
+0x3130	0x20A7F	
+0x3131	0x2F838	
+0x3132	0x20B57	
+0x3133	0x20B58	
+0x3134	0x20D39	
+0x3135	0x20DA7	
+0x3136	0x20D35	
+0x3137	0x20D60	
+0x3138	0x20D51	
+0x3139	0x20D62	
+0x313A	0x20D42	
+0x313B	0x20D3C	
+0x313C	0x20D43	
+0x313D	0x20DAB	
+0x313E	0x20DA9	
+0x313F	0x20DB4	
+0x3140	0x20D79	
+0x3141	0x20D6A	
+0x3142	0x20D3B	
+0x3143	0x20DAA	
+0x3144	0x20D33	
+0x3145	0x20D37	
+0x3146	0x20D27	
+0x3147	0x20DA8	
+0x3148	0x20D70	
+0x3149	0x20D2F	
+0x314A	0x20D36	
+0x314B	0x20DB5	
+0x314C	0x20D30	
+0x314D	0x20D3A	
+0x314E	0x20D38	
+0x314F	0x20DB1	
+0x3150	0x20DAC	
+0x3151	0x20D2E	
+0x3152	0x20D75	
+0x3153	0x20DB0	
+0x3154	0x211F7	
+0x3155	0x21200	
+0x3156	0x211F1	
+0x3157	0x211F3	
+0x3158	0x21360	
+0x3159	0x21361	
+0x315A	0x21332	
+0x315B	0x2132D	
+0x315C	0x2134A	
+0x315D	0x2132A	
+0x315E	0x21567	
+0x315F	0x215A2	
+0x3160	0x215A3	
+0x3161	0x2159E	
+0x3162	0x215A4	
+0x3163	0x21644	
+0x3164	0x21632	
+0x3165	0x2179B	
+0x3166	0x21798	
+0x3167	0x21799	
+0x3168	0x2179A	
+0x3169	0x21766	
+0x316A	0x21762	
+0x316B	0x2176B	
+0x316C	0x24562	
+0x316D	0x21767	
+0x316E	0x21A3B	
+0x316F	0x21A23	
+0x3170	0x21A29	
+0x3171	0x21B7E	
+0x3172	0x21BF3	
+0x3174	0x21BF5	
+0x3176	0x21C80	
+0x3177	0x21C7E	
+0x3178	0x21C7C	
+0x3179	0x21C7F	
+0x317A	0x21C7D	
+0x317B	0x21C81	
+0x317C	0x21E25	
+0x317D	0x21E29	
+0x317E	0x21E17	
+0x3221	0x21E63	
+0x3222	0x21E67	
+0x3223	0x21E65	
+0x3224	0x21E2A	
+0x3225	0x21E68	
+0x3226	0x21E26	
+0x3227	0x21E64	
+0x3228	0x21E1B	
+0x3229	0x21E62	
+0x322A	0x21E69	
+0x322B	0x21FFE	
+0x322C	0x22044	
+0x322D	0x22042	
+0x322E	0x220B7	
+0x322F	0x220D2	
+0x3230	0x220D4	
+0x3231	0x220D7	
+0x3232	0x220DC	
+0x3233	0x220D1	
+0x3234	0x220D5	
+0x3235	0x220CD	
+0x3236	0x220D8	
+0x3237	0x2219A	
+0x3238	0x22242	
+0x3239	0x22235	
+0x323A	0x22258	
+0x323B	0x22234	
+0x323C	0x2223C	
+0x323D	0x2223B	
+0x323E	0x2223E	
+0x323F	0x2223D	
+0x3240	0x2225A	
+0x3241	0x22241	
+0x3242	0x22238	
+0x3243	0x22245	
+0x3244	0x22233	
+0x3245	0x22326	
+0x3247	0x223F7	
+0x3248	0x223EF	
+0x3249	0x223F0	
+0x324A	0x223EE	
+0x324B	0x2249D	
+0x324C	0x22506	
+0x324D	0x22511	
+0x324E	0x22508	
+0x324F	0x22502	
+0x3250	0x2250A	
+0x3251	0x22507	
+0x3252	0x22691	
+0x3253	0x2268E	
+0x3254	0x22685	
+0x3255	0x226E8	
+0x3256	0x22717	
+0x3257	0x226D4	
+0x3259	0x226C4	
+0x325A	0x226D5	
+0x325C	0x226D8	
+0x325D	0x22680	
+0x325E	0x226DE	
+0x325F	0x22742	
+0x3260	0x229C7	
+0x3261	0x229BF	
+0x3262	0x22B8D	
+0x3263	0x22B89	
+0x3264	0x22B90	
+0x3265	0x22B9A	
+0x3266	0x22BC8	
+0x3267	0x22B92	
+0x3268	0x22BA1	
+0x3269	0x22B84	
+0x326A	0x22F57	
+0x326B	0x22F47	
+0x326C	0x22F77	
+0x326D	0x22F3A	
+0x326E	0x22F50	
+0x326F	0x22F42	
+0x3270	0x22F43	
+0x3271	0x22FA3	
+0x3272	0x23077	
+0x3273	0x231B2	
+0x3274	0x231E2	
+0x3275	0x231BD	
+0x3276	0x23374	
+0x3277	0x23482	
+0x3278	0x234B8	
+0x327A	0x234BA	
+0x327B	0x234B9	
+0x327C	0x234BB	
+0x327D	0x23487	
+0x327E	0x2F8E4	
+0x3321	0x23483	
+0x3322	0x234B7	
+0x3323	0x20043	
+0x3324	0x238CE	
+0x3325	0x238BA	
+0x3326	0x23973	
+0x3327	0x23A09	
+0x3328	0x23A0A	
+0x3329	0x23A0B	
+0x332A	0x23A07	
+0x332B	0x23A05	
+0x332C	0x23A0E	
+0x332D	0x23A97	
+0x332E	0x23B77	
+0x332F	0x23B7B	
+0x3330	0x23B7A	
+0x3331	0x23B74	
+0x3332	0x23B79	
+0x3333	0x23D86	
+0x3334	0x23DF5	
+0x3335	0x23DA5	
+0x3336	0x23D9D	
+0x3337	0x23DBE	
+0x3338	0x23D96	
+0x3339	0x23DE1	
+0x333A	0x23DA4	
+0x333B	0x23DA1	
+0x333C	0x23DF6	
+0x333E	0x23D8D	
+0x333F	0x23D8B	
+0x3340	0x23D78	
+0x3341	0x23D98	
+0x3342	0x23E0A	
+0x3343	0x2425D	
+0x3344	0x24227	
+0x3345	0x2425F	
+0x3346	0x245C0	
+0x3347	0x245C1	
+0x3348	0x2466D	
+0x3349	0x2465E	
+0x334A	0x2468A	
+0x334B	0x24662	
+0x334C	0x24664	
+0x334E	0x247C0	
+0x334F	0x247CA	
+0x3350	0x247D1	
+0x3352	0x247C7	
+0x3353	0x247CE	
+0x3355	0x247C5	
+0x3356	0x24936	
+0x3357	0x24957	
+0x3358	0x24977	
+0x3359	0x24AF6	
+0x335A	0x24AF7	
+0x335B	0x24B55	
+0x335C	0x24B44	
+0x335D	0x24B3E	
+0x335E	0x24B42	
+0x335F	0x24B52	
+0x3360	0x24BE1	
+0x3361	0x24C08	
+0x3362	0x24C68	
+0x3363	0x24C67	
+0x3365	0x2F937	
+0x3366	0x24D7E	
+0x3367	0x24D93	
+0x3368	0x24D79	
+0x3369	0x24D81	
+0x336A	0x24D7D	
+0x336B	0x24D7B	
+0x336C	0x24D94	
+0x336E	0x24F66	
+0x336F	0x24FD9	
+0x3370	0x24FE0	
+0x3371	0x2F93E	
+0x3372	0x2505F	
+0x3373	0x2515F	
+0x3374	0x2515E	
+0x3375	0x25168	
+0x3377	0x25188	
+0x3378	0x2516A	
+0x3379	0x2516C	
+0x337A	0x25166	
+0x337B	0x25167	
+0x337C	0x25189	
+0x337D	0x25160	
+0x337E	0x25185	
+0x3421	0x2032A	
+0x3422	0x25368	
+0x3423	0x253B9	
+0x3424	0x253BA	
+0x3425	0x253BE	
+0x3426	0x2546F	
+0x3427	0x25480	
+0x3428	0x25474	
+0x3429	0x25481	
+0x342A	0x2547A	
+0x342B	0x2549C	
+0x342C	0x25473	
+0x342D	0x25482	
+0x342E	0x2547F	
+0x342F	0x254A7	
+0x3430	0x25479	
+0x3431	0x25478	
+0x3432	0x2547D	
+0x3433	0x254A8	
+0x3434	0x2547C	
+0x3435	0x25668	
+0x3436	0x2564E	
+0x3437	0x2579E	
+0x343A	0x25798	
+0x343C	0x25785	
+0x343D	0x2579C	
+0x343E	0x257C5	
+0x343F	0x2579A	
+0x3440	0x25968	
+0x3441	0x25965	
+0x3442	0x25967	
+0x3443	0x25961	
+0x3444	0x25960	
+0x3447	0x25A7B	
+0x3449	0x25B19	
+0x344A	0x25B0E	
+0x344B	0x25B31	
+0x344C	0x25B12	
+0x344D	0x25B10	
+0x344E	0x25B15	
+0x344F	0x25B3F	
+0x3450	0x25B1D	
+0x3451	0x25B1E	
+0x3452	0x25E4D	
+0x3453	0x25E48	
+0x3454	0x25E45	
+0x3455	0x25E42	
+0x3456	0x25E49	
+0x3457	0x25E4A	
+0x3458	0x25E47	
+0x345A	0x25E4C	
+0x345B	0x25FCD	
+0x345C	0x25FD5	
+0x345D	0x25FC4	
+0x345E	0x25FCA	
+0x345F	0x25FC3	
+0x3461	0x26229	
+0x3462	0x262B4	
+0x3463	0x2636D	
+0x3464	0x26366	
+0x3465	0x2636A	
+0x3466	0x26415	
+0x3467	0x264D3	
+0x3468	0x264EC	
+0x3469	0x26555	
+0x346B	0x266D6	
+0x346C	0x266D8	
+0x346D	0x26751	
+0x346E	0x266E0	
+0x346F	0x26703	
+0x3470	0x26704	
+0x3471	0x266DA	
+0x3472	0x266EA	
+0x3473	0x26702	
+0x3474	0x266D3	
+0x3475	0x266E4	
+0x3476	0x266E5	
+0x3477	0x2693B	
+0x3478	0x26966	
+0x3479	0x26A2C	
+0x347A	0x26A21	
+0x347B	0x26A26	
+0x347C	0x26AD4	
+0x347D	0x26AD5	
+0x347E	0x26AD9	
+0x3521	0x26BD5	
+0x3522	0x26BEB	
+0x3523	0x26BC5	
+0x3525	0x26C27	
+0x3526	0x26BF0	
+0x3527	0x26BB9	
+0x3528	0x26C18	
+0x3529	0x26BEE	
+0x352B	0x26BB7	
+0x352C	0x26BBB	
+0x352D	0x26BEF	
+0x352E	0x26BB8	
+0x352F	0x26BDF	
+0x3530	0x26BDA	
+0x3531	0x26BE3	
+0x3532	0x26BC9	
+0x3533	0x26BEC	
+0x3534	0x271A4	
+0x3536	0x271A3	
+0x3537	0x2725E	
+0x3538	0x27261	
+0x3539	0x27262	
+0x353A	0x27263	
+0x353B	0x2728E	
+0x353C	0x27269	
+0x353D	0x2726B	
+0x353E	0x27285	
+0x353F	0x2728D	
+0x3540	0x27264	
+0x3541	0x2726D	
+0x3542	0x2764C	
+0x3543	0x27649	
+0x3544	0x27647	
+0x3545	0x27648	
+0x3546	0x27642	
+0x3547	0x27645	
+0x3548	0x2765B	
+0x3549	0x2765D	
+0x354A	0x27646	
+0x354B	0x27813	
+0x354C	0x2781A	
+0x354D	0x2780E	
+0x354E	0x2780F	
+0x354F	0x2781B	
+0x3550	0x27812	
+0x3551	0x278C3	
+0x3552	0x278BE	
+0x3553	0x278BD	
+0x3554	0x27979	
+0x3555	0x2797C	
+0x3558	0x27980	
+0x3559	0x27975	
+0x355A	0x2799B	
+0x355C	0x27974	
+0x355F	0x22041	
+0x3560	0x22494	
+0x3561	0x27C30	
+0x3562	0x27CA7	
+0x3563	0x27CA5	
+0x3564	0x27CA4	
+0x3565	0x27D3A	
+0x3566	0x27E5B	
+0x3567	0x27E9F	
+0x3568	0x27EA8	
+0x3569	0x27EB3	
+0x356A	0x27EA1	
+0x356B	0x27EA7	
+0x356C	0x27EB2	
+0x356D	0x27E9D	
+0x356E	0x27EA3	
+0x356F	0x27EA2	
+0x3570	0x27FEF	
+0x3571	0x27FD9	
+0x3573	0x27FD5	
+0x3574	0x27FDD	
+0x3575	0x27FDA	
+0x3576	0x27FEE	
+0x3577	0x27FD7	
+0x3578	0x2821A	
+0x3579	0x28219	
+0x357A	0x28218	
+0x357B	0x282B3	
+0x357C	0x282BF	
+0x357D	0x282BB	
+0x357E	0x282C0	
+0x3621	0x282B9	
+0x3622	0x282B8	
+0x3623	0x282D5	
+0x3624	0x28411	
+0x3625	0x28410	
+0x3626	0x284C3	
+0x3627	0x284C2	
+0x3628	0x284E9	
+0x3629	0x284CD	
+0x362A	0x284E5	
+0x362B	0x284CA	
+0x362C	0x284C7	
+0x362D	0x284E8	
+0x362E	0x286F1	
+0x362F	0x2870C	
+0x3630	0x286EF	
+0x3631	0x286EE	
+0x3632	0x286F3	
+0x3633	0x2870D	
+0x3634	0x286F6	
+0x3635	0x286F0	
+0x3637	0x287F5	
+0x3638	0x287F4	
+0x3639	0x287F8	
+0x363A	0x287FE	
+0x363B	0x28911	
+0x363C	0x28922	
+0x363D	0x28942	
+0x363E	0x28C5C	
+0x363F	0x28C5A	
+0x3640	0x28C5D	
+0x3641	0x28CD1	
+0x3642	0x28CD0	
+0x3643	0x28E75	
+0x3644	0x28E7B	
+0x3645	0x28F89	
+0x3646	0x2944D	
+0x3647	0x29689	
+0x3648	0x29692	
+0x3649	0x2968C	
+0x364A	0x29688	
+0x364B	0x29867	
+0x364C	0x29868	
+0x364D	0x20321	
+0x364E	0x202F2	
+0x364F	0x20309	
+0x3650	0x202F8	
+0x3651	0x202F0	
+0x3652	0x202F3	
+0x3653	0x202F5	
+0x3654	0x202FB	
+0x3655	0x202F7	
+0x3656	0x202EF	
+0x3657	0x2030B	
+0x3658	0x204A2	
+0x3659	0x205F5	
+0x365A	0x205F3	
+0x365B	0x205F4	
+0x365C	0x205F2	
+0x365D	0x20698	
+0x365E	0x20768	
+0x365F	0x20780	
+0x3660	0x20785	
+0x3661	0x2078E	
+0x3662	0x2078F	
+0x3663	0x202F4	
+0x3664	0x20786	
+0x3665	0x207A4	
+0x3666	0x20886	
+0x3667	0x20889	
+0x3668	0x20887	
+0x3669	0x20885	
+0x366B	0x20888	
+0x366C	0x20AFF	
+0x366D	0x20B66	
+0x366F	0x20DC3	
+0x3671	0x20DC4	
+0x3672	0x20E3B	
+0x3673	0x20DE7	
+0x3674	0x20DF8	
+0x3675	0x20DFB	
+0x3677	0x20DBE	
+0x3678	0x20DC6	
+0x367B	0x20DFC	
+0x367C	0x20DC0	
+0x367D	0x20E33	
+0x367E	0x20DC9	
+0x3721	0x20DFE	
+0x3722	0x20DDA	
+0x3723	0x20DCC	
+0x3724	0x20DBB	
+0x3725	0x20DFD	
+0x3726	0x20DDF	
+0x3727	0x20DCD	
+0x3728	0x20DC2	
+0x3729	0x20DC8	
+0x372A	0x20E32	
+0x372B	0x20E2D	
+0x372C	0x20DD2	
+0x372D	0x20E31	
+0x372E	0x20DD3	
+0x372F	0x20E2E	
+0x3730	0x20DCF	
+0x3731	0x211FF	
+0x3732	0x21209	
+0x3733	0x211FC	
+0x3734	0x21372	
+0x3735	0x213AA	
+0x3736	0x213AB	
+0x3737	0x213A7	
+0x3738	0x2137B	
+0x3739	0x21376	
+0x373A	0x213A8	
+0x373B	0x213AC	
+0x373E	0x215AA	
+0x373F	0x20A03	
+0x3740	0x215AC	
+0x3741	0x215AD	
+0x3742	0x215AB	
+0x3743	0x21650	
+0x3744	0x21658	
+0x3745	0x217DD	
+0x3747	0x217AE	
+0x3748	0x217A2	
+0x3749	0x217AB	
+0x374A	0x217E3	
+0x374B	0x217AF	
+0x374C	0x217E0	
+0x374D	0x217E4	
+0x374F	0x217A7	
+0x3750	0x217AA	
+0x3751	0x217E2	
+0x3752	0x217E1	
+0x3753	0x217DF	
+0x3754	0x217AD	
+0x3755	0x217E5	
+0x3756	0x217D1	
+0x3757	0x217AC	
+0x3758	0x217D5	
+0x3759	0x217A3	
+0x375A	0x2179F	
+0x375B	0x21979	
+0x375C	0x21976	
+0x375D	0x21A43	
+0x375E	0x21A3D	
+0x375F	0x21A47	
+0x3760	0x21A44	
+0x3761	0x21A3F	
+0x3762	0x21A5B	
+0x3763	0x21B7F	
+0x3764	0x21C9A	
+0x3765	0x21C9C	
+0x3767	0x21D1E	
+0x3768	0x21E88	
+0x3769	0x21E6A	
+0x376A	0x21E76	
+0x376B	0x21E72	
+0x376C	0x21E70	
+0x376D	0x21E7E	
+0x376E	0x21E6C	
+0x376F	0x21E6F	
+0x3770	0x21E75	
+0x3771	0x21E77	
+0x3772	0x21E78	
+0x3773	0x21E8A	
+0x3774	0x21E79	
+0x3775	0x21E94	
+0x3776	0x22001	
+0x3777	0x22105	
+0x3778	0x220F1	
+0x3779	0x220EE	
+0x377A	0x220EF	
+0x377B	0x22104	
+0x377D	0x220FA	
+0x377E	0x22107	
+0x3821	0x220F4	
+0x3822	0x220F5	
+0x3823	0x2219C	
+0x3824	0x2226D	
+0x3825	0x22269	
+0x3826	0x22266	
+0x3827	0x22262	
+0x3828	0x22246	
+0x382A	0x22265	
+0x382B	0x2225D	
+0x382C	0x2225E	
+0x382D	0x2225F	
+0x382E	0x2238E	
+0x382F	0x22402	
+0x3830	0x22406	
+0x3831	0x22404	
+0x3832	0x22403	
+0x3833	0x22462	
+0x3834	0x22527	
+0x3835	0x22521	
+0x3836	0x22520	
+0x3837	0x22524	
+0x3838	0x22529	
+0x3839	0x22531	
+0x383A	0x22523	
+0x383B	0x22522	
+0x383C	0x226DC	
+0x383D	0x2274D	
+0x383E	0x226E5	
+0x383F	0x226D3	
+0x3840	0x226EE	
+0x3841	0x226E6	
+0x3843	0x22736	
+0x3844	0x22740	
+0x3845	0x2283F	
+0x3846	0x2273D	
+0x3847	0x22744	
+0x3849	0x2275F	
+0x384A	0x22729	
+0x384B	0x22749	
+0x384C	0x2278A	
+0x384D	0x2272A	
+0x384E	0x22787	
+0x384F	0x2274C	
+0x3850	0x22731	
+0x3851	0x22748	
+0x3852	0x2272B	
+0x3853	0x2273B	
+0x3854	0x22741	
+0x3855	0x226C9	
+0x3856	0x22734	
+0x3857	0x22753	
+0x3858	0x22735	
+0x3859	0x22747	
+0x385A	0x22738	
+0x385B	0x229D1	
+0x385C	0x229D2	
+0x385D	0x22A51	
+0x385E	0x22A55	
+0x385F	0x22A52	
+0x3860	0x22A53	
+0x3861	0x22B8F	
+0x3862	0x22BF4	
+0x3863	0x22C47	
+0x3864	0x22C0D	
+0x3865	0x22C1C	
+0x3866	0x22BFB	
+0x3867	0x22C19	
+0x3868	0x22BF7	
+0x3869	0x22BF9	
+0x386A	0x22BF5	
+0x386B	0x22BE9	
+0x386C	0x22C0A	
+0x386D	0x22BEE	
+0x386E	0x22C0B	
+0x386F	0x22BFD	
+0x3870	0x22C06	
+0x3871	0x22C02	
+0x3872	0x22C16	
+0x3873	0x22C18	
+0x3874	0x22BF0	
+0x3875	0x22ED4	
+0x3876	0x22F66	
+0x3877	0x22F6A	
+0x3878	0x22F75	
+0x3879	0x22F76	
+0x387A	0x22F80	
+0x387B	0x22F6D	
+0x387D	0x22F69	
+0x387E	0x22F67	
+0x3921	0x22F68	
+0x3922	0x22F5D	
+0x3923	0x230A4	
+0x3924	0x230FE	
+0x3925	0x230FD	
+0x3926	0x231EC	
+0x3927	0x231E9	
+0x3928	0x23221	
+0x3929	0x231EB	
+0x392A	0x231E7	
+0x392B	0x231F2	
+0x392C	0x23220	
+0x392D	0x2337A	
+0x392E	0x2352D	
+0x392F	0x2352E	
+0x3930	0x234CA	
+0x3931	0x2352F	
+0x3932	0x234C8	
+0x3934	0x234CB	
+0x3935	0x234C3	
+0x3936	0x23484	
+0x3937	0x234D2	
+0x3938	0x234C6	
+0x393A	0x234CF	
+0x393B	0x234D5	
+0x393C	0x234D4	
+0x393D	0x234DD	
+0x393E	0x2352B	
+0x393F	0x235A3	
+0x3940	0x234DB	
+0x3941	0x2352C	
+0x3942	0x23513	
+0x3944	0x238D1	
+0x3945	0x238CC	
+0x3946	0x238D5	
+0x3947	0x238C9	
+0x3948	0x238CF	
+0x3949	0x238D2	
+0x394A	0x2397B	
+0x394B	0x2397C	
+0x394C	0x23A23	
+0x394D	0x23A1D	
+0x394E	0x23A1C	
+0x394F	0x23A1E	
+0x3950	0x23A22	
+0x3951	0x23A24	
+0x3952	0x23A20	
+0x3953	0x23A18	
+0x3954	0x23A21	
+0x3955	0x23B88	
+0x3956	0x23B8A	
+0x3957	0x23B94	
+0x3958	0x23B8F	
+0x3959	0x23B8E	
+0x395A	0x23B90	
+0x395C	0x23BA7	
+0x395D	0x23C64	
+0x395F	0x23E18	
+0x3960	0x23E14	
+0x3961	0x23E1D	
+0x3962	0x23E05	
+0x3963	0x23DFF	
+0x3964	0x23E1B	
+0x3965	0x23E1A	
+0x3966	0x23E19	
+0x3967	0x23E03	
+0x3968	0x23E0E	
+0x3969	0x23E47	
+0x396A	0x23E04	
+0x396B	0x23E5A	
+0x396C	0x23E07	
+0x396D	0x23E20	
+0x396E	0x2426A	
+0x396F	0x24266	
+0x3970	0x2427A	
+0x3971	0x24265	
+0x3972	0x242AF	
+0x3973	0x245CD	
+0x3974	0x245CF	
+0x3975	0x245D1	
+0x3976	0x245CE	
+0x3977	0x2465F	
+0x3978	0x24677	
+0x3979	0x24674	
+0x397A	0x24688	
+0x397B	0x24675	
+0x397C	0x24689	
+0x397D	0x24672	
+0x397E	0x247C6	
+0x3A21	0x247EA	
+0x3A22	0x247E0	
+0x3A23	0x24807	
+0x3A24	0x247E6	
+0x3A25	0x247E5	
+0x3A26	0x247DD	
+0x3A27	0x247E3	
+0x3A28	0x247DA	
+0x3A29	0x249AE	
+0x3A2A	0x2497E	
+0x3A2B	0x2497D	
+0x3A2C	0x2497F	
+0x3A2E	0x249D9	
+0x3A2F	0x24AFA	
+0x3A30	0x24AFB	
+0x3A31	0x24B4D	
+0x3A32	0x24B54	
+0x3A33	0x24B51	
+0x3A34	0x24B50	
+0x3A35	0x24D98	
+0x3A36	0x24D95	
+0x3A37	0x24D9D	
+0x3A38	0x24DC1	
+0x3A39	0x24D9A	
+0x3A3A	0x24D9B	
+0x3A3C	0x24D9C	
+0x3A3D	0x24DD7	
+0x3A3E	0x24DA4	
+0x3A3F	0x24D96	
+0x3A40	0x24DA0	
+0x3A41	0x24F31	
+0x3A42	0x24FE9	
+0x3A43	0x2506E	
+0x3A44	0x2519A	
+0x3A45	0x251A5	
+0x3A46	0x25194	
+0x3A47	0x251A6	
+0x3A48	0x25199	
+0x3A49	0x2518B	
+0x3A4A	0x25198	
+0x3A4B	0x25191	
+0x3A4C	0x2518C	
+0x3A4D	0x251A1	
+0x3A4E	0x251A3	
+0x3A4F	0x251C6	
+0x3A50	0x2536F	
+0x3A51	0x2536D	
+0x3A52	0x2536A	
+0x3A53	0x2536C	
+0x3A54	0x25371	
+0x3A55	0x2536E	
+0x3A56	0x253DF	
+0x3A57	0x254AC	
+0x3A58	0x254AA	
+0x3A5A	0x254B5	
+0x3A5B	0x254AD	
+0x3A5C	0x254B2	
+0x3A5D	0x254B3	
+0x3A5E	0x254AB	
+0x3A5F	0x254B6	
+0x3A60	0x254C7	
+0x3A61	0x254C6	
+0x3A62	0x2566C	
+0x3A63	0x25670	
+0x3A64	0x257B3	
+0x3A66	0x2598C	
+0x3A67	0x25981	
+0x3A68	0x25983	
+0x3A69	0x2597D	
+0x3A6A	0x25985	
+0x3A6B	0x25990	
+0x3A6C	0x259A2	
+0x3A6D	0x2598D	
+0x3A6E	0x2598F	
+0x3A6F	0x2597E	
+0x3A70	0x2598A	
+0x3A71	0x2597F	
+0x3A72	0x25976	
+0x3A73	0x25987	
+0x3A74	0x25978	
+0x3A75	0x25A80	
+0x3A76	0x25A82	
+0x3A77	0x25A81	
+0x3A78	0x25A83	
+0x3A79	0x25B5A	
+0x3A7A	0x25B34	
+0x3A7B	0x25B2C	
+0x3A7C	0x25B2A	
+0x3A7D	0x25B40	
+0x3A7E	0x25B2D	
+0x3B21	0x25B33	
+0x3B22	0x25B2B	
+0x3B23	0x25B4B	
+0x3B25	0x25B3C	
+0x3B26	0x25E5A	
+0x3B27	0x25E77	
+0x3B28	0x25E60	
+0x3B29	0x25FFA	
+0x3B2A	0x25FF9	
+0x3B2B	0x25FFC	
+0x3B2D	0x25FF5	
+0x3B2E	0x25FE8	
+0x3B2F	0x26009	
+0x3B30	0x25FE7	
+0x3B31	0x25FE6	
+0x3B32	0x25FE9	
+0x3B33	0x26232	
+0x3B34	0x2622C	
+0x3B35	0x262BD	
+0x3B36	0x262BC	
+0x3B37	0x2637A	
+0x3B38	0x2637E	
+0x3B39	0x26379	
+0x3B3B	0x26423	
+0x3B3C	0x26430	
+0x3B3D	0x26428	
+0x3B3E	0x264D4	
+0x3B3F	0x26ACE	
+0x3B40	0x264F1	
+0x3B41	0x264F0	
+0x3B42	0x26560	
+0x3B43	0x26565	
+0x3B44	0x266A8	
+0x3B45	0x2670A	
+0x3B46	0x2671B	
+0x3B47	0x26712	
+0x3B48	0x26707	
+0x3B49	0x2674F	
+0x3B4A	0x2670E	
+0x3B4B	0x26752	
+0x3B4C	0x26716	
+0x3B4E	0x26753	
+0x3B4F	0x26754	
+0x3B50	0x2F984	
+0x3B51	0x26756	
+0x3B52	0x2696D	
+0x3B53	0x26972	
+0x3B54	0x26A2F	
+0x3B55	0x26C2A	
+0x3B57	0x26C63	
+0x3B58	0x26C84	
+0x3B59	0x26CAF	
+0x3B5A	0x26C45	
+0x3B5B	0x26C70	
+0x3B5C	0x26C56	
+0x3B5D	0x26C16	
+0x3B5E	0x26C3D	
+0x3B5F	0x26C38	
+0x3B60	0x26C6F	
+0x3B61	0x26C77	
+0x3B62	0x26C2E	
+0x3B63	0x26C31	
+0x3B64	0x26C4C	
+0x3B65	0x26C5F	
+0x3B66	0x26C75	
+0x3B67	0x26C39	
+0x3B68	0x26C3A	
+0x3B69	0x26C2C	
+0x3B6A	0x26C2D	
+0x3B6B	0x26C3F	
+0x3B6C	0x26C2F	
+0x3B6D	0x26C30	
+0x3B6E	0x26C3E	
+0x3B71	0x271B2	
+0x3B72	0x272B7	
+0x3B73	0x2728F	
+0x3B75	0x27296	
+0x3B76	0x2729E	
+0x3B77	0x27297	
+0x3B78	0x27295	
+0x3B79	0x272A5	
+0x3B7A	0x27298	
+0x3B7C	0x272A3	
+0x3B7D	0x2729A	
+0x3B7E	0x272AD	
+0x3C21	0x272A6	
+0x3C22	0x272B6	
+0x3C23	0x27299	
+0x3C24	0x272AF	
+0x3C25	0x272AC	
+0x3C27	0x2729F	
+0x3C28	0x27294	
+0x3C29	0x275EB	
+0x3C2A	0x2766F	
+0x3C2B	0x2766D	
+0x3C2C	0x2767E	
+0x3C2D	0x2766C	
+0x3C2E	0x27661	
+0x3C2F	0x27663	
+0x3C30	0x2766B	
+0x3C31	0x2765E	
+0x3C32	0x2763E	
+0x3C33	0x27664	
+0x3C34	0x276AD	
+0x3C36	0x27820	
+0x3C37	0x278D1	
+0x3C38	0x278D5	
+0x3C39	0x279AE	
+0x3C3A	0x279AF	
+0x3C3B	0x2799F	
+0x3C3C	0x279A8	
+0x3C3D	0x279CA	
+0x3C3E	0x27BE1	
+0x3C3F	0x27C39	
+0x3C40	0x27C38	
+0x3C41	0x27C3B	
+0x3C42	0x27CAD	
+0x3C43	0x27CB5	
+0x3C44	0x27CAF	
+0x3C45	0x27CB1	
+0x3C46	0x27CAE	
+0x3C47	0x27CB4	
+0x3C48	0x27CB0	
+0x3C49	0x27D4B	
+0x3C4A	0x27D51	
+0x3C4B	0x27D4C	
+0x3C4D	0x27D60	
+0x3C4E	0x27EBE	
+0x3C4F	0x27EB9	
+0x3C50	0x27EB7	
+0x3C51	0x27EB6	
+0x3C53	0x27EBD	
+0x3C54	0x27EB8	
+0x3C55	0x27EC1	
+0x3C56	0x27FF7	
+0x3C57	0x27FF3	
+0x3C58	0x27FF4	
+0x3C59	0x27FFB	
+0x3C5A	0x27FFD	
+0x3C5B	0x27FF5	
+0x3C5D	0x27FFA	
+0x3C5E	0x28014	
+0x3C60	0x27FF2	
+0x3C61	0x27FFC	
+0x3C62	0x28000	
+0x3C64	0x2822B	
+0x3C65	0x28229	
+0x3C66	0x2822E	
+0x3C68	0x282D7	
+0x3C69	0x282DB	
+0x3C6A	0x282D9	
+0x3C6B	0x282D8	
+0x3C6C	0x282E6	
+0x3C6D	0x282D6	
+0x3C6E	0x282D1	
+0x3C6F	0x282E7	
+0x3C70	0x282D0	
+0x3C71	0x282DC	
+0x3C72	0x284ED	
+0x3C73	0x2851A	
+0x3C74	0x28519	
+0x3C75	0x28516	
+0x3C76	0x284EC	
+0x3C77	0x284EF	
+0x3C78	0x284EE	
+0x3C79	0x284F4	
+0x3C7A	0x2852F	
+0x3C7B	0x28730	
+0x3C7C	0x28719	
+0x3C7D	0x28718	
+0x3C7E	0x28711	
+0x3D21	0x28716	
+0x3D22	0x28712	
+0x3D23	0x28710	
+0x3D24	0x28714	
+0x3D25	0x2880C	
+0x3D26	0x2880D	
+0x3D27	0x28910	
+0x3D28	0x28929	
+0x3D29	0x28928	
+0x3D2A	0x28C65	
+0x3D2B	0x28C66	
+0x3D2C	0x28CDE	
+0x3D2D	0x28CDF	
+0x3D2E	0x28CE0	
+0x3D2F	0x28CD9	
+0x3D30	0x28CDB	
+0x3D31	0x28CD8	
+0x3D32	0x28CE3	
+0x3D33	0x28CD7	
+0x3D34	0x28EA6	
+0x3D35	0x28EA7	
+0x3D36	0x28EBF	
+0x3D37	0x28EA8	
+0x3D38	0x28E9F	
+0x3D39	0x28EA1	
+0x3D3A	0x28EA2	
+0x3D3B	0x28EAD	
+0x3D3C	0x28EA3	
+0x3D3D	0x28EA0	
+0x3D3E	0x29083	
+0x3D3F	0x29085	
+0x3D40	0x29082	
+0x3D41	0x29084	
+0x3D42	0x291EE	
+0x3D43	0x2925D	
+0x3D44	0x29392	
+0x3D45	0x29455	
+0x3D46	0x29453	
+0x3D47	0x2F9FC	
+0x3D48	0x29451	
+0x3D49	0x29452	
+0x3D4A	0x29450	
+0x3D4B	0x2959D	
+0x3D4C	0x29687	
+0x3D4D	0x29697	
+0x3D4E	0x2969B	
+0x3D4F	0x2969D	
+0x3D50	0x29869	
+0x3D51	0x29A11	
+0x3D53	0x29C7A	
+0x3D55	0x23244	
+0x3D56	0x200C6	
+0x3D57	0x20340	
+0x3D58	0x2032E	
+0x3D59	0x20368	
+0x3D5A	0x2032D	
+0x3D5B	0x20334	
+0x3D5C	0x20332	
+0x3D5D	0x20369	
+0x3D5E	0x20331	
+0x3D5F	0x2036A	
+0x3D60	0x2033E	
+0x3D61	0x2036F	
+0x3D62	0x20375	
+0x3D63	0x204F6	
+0x3D64	0x20520	
+0x3D65	0x20528	
+0x3D66	0x20567	
+0x3D67	0x205FB	
+0x3D68	0x205FE	
+0x3D69	0x205FC	
+0x3D6A	0x205FD	
+0x3D6B	0x205FF	
+0x3D6C	0x205FA	
+0x3D6D	0x207AC	
+0x3D6E	0x207AF	
+0x3D6F	0x207B1	
+0x3D71	0x207BF	
+0x3D72	0x207BE	
+0x3D73	0x207A7	
+0x3D74	0x207AA	
+0x3D75	0x20894	
+0x3D76	0x20893	
+0x3D77	0x20899	
+0x3D79	0x208FA	
+0x3D7A	0x20956	
+0x3D7B	0x20A22	
+0x3D7C	0x20A91	
+0x3D7D	0x20A92	
+0x3D7E	0x20B08	
+0x3E21	0x20B06	
+0x3E22	0x20DD6	
+0x3E23	0x20E37	
+0x3E24	0x20E4B	
+0x3E25	0x20ECE	
+0x3E26	0x20ED0	
+0x3E27	0x20E39	
+0x3E28	0x20E64	
+0x3E29	0x20ECF	
+0x3E2A	0x20E46	
+0x3E2B	0x20E66	
+0x3E2C	0x20E56	
+0x3E2D	0x20E43	
+0x3E2E	0x20E4A	
+0x3E2F	0x20E58	
+0x3E30	0x20E65	
+0x3E31	0x20E5A	
+0x3E32	0x20E5B	
+0x3E33	0x20E55	
+0x3E34	0x20E50	
+0x3E35	0x20E4C	
+0x3E36	0x20ECD	
+0x3E37	0x20E51	
+0x3E38	0x20E47	
+0x3E3A	0x20E53	
+0x3E3B	0x20E62	
+0x3E3C	0x20ECC	
+0x3E3E	0x20E7F	
+0x3E3F	0x20E4D	
+0x3E40	0x2120A	
+0x3E41	0x2120C	
+0x3E42	0x2120F	
+0x3E43	0x213BB	
+0x3E44	0x213B9	
+0x3E45	0x213EB	
+0x3E46	0x213AE	
+0x3E47	0x213C1	
+0x3E48	0x213EA	
+0x3E49	0x213BE	
+0x3E4A	0x213BF	
+0x3E4B	0x213BA	
+0x3E4C	0x213B7	
+0x3E4D	0x213B3	
+0x3E4E	0x213E9	
+0x3E4F	0x2156E	
+0x3E50	0x215AF	
+0x3E51	0x215B3	
+0x3E52	0x215B2	
+0x3E53	0x21668	
+0x3E54	0x21669	
+0x3E55	0x2166A	
+0x3E56	0x217DE	
+0x3E57	0x217EB	
+0x3E58	0x21811	
+0x3E59	0x217ED	
+0x3E5A	0x217E9	
+0x3E5B	0x217F7	
+0x3E5C	0x217F4	
+0x3E5D	0x217EA	
+0x3E5E	0x21812	
+0x3E5F	0x217E8	
+0x3E60	0x21813	
+0x3E61	0x2198E	
+0x3E62	0x21986	
+0x3E63	0x21A63	
+0x3E64	0x21A65	
+0x3E65	0x21B99	
+0x3E66	0x21CC2	
+0x3E67	0x21CAE	
+0x3E68	0x21CB0	
+0x3E69	0x21CAD	
+0x3E6A	0x21EB4	
+0x3E6B	0x21ED1	
+0x3E6C	0x21EAD	
+0x3E6E	0x21EBD	
+0x3E6F	0x21EB7	
+0x3E70	0x21EAB	
+0x3E71	0x21EAF	
+0x3E72	0x21EC1	
+0x3E73	0x21EB5	
+0x3E74	0x2210F	
+0x3E75	0x2210E	
+0x3E76	0x2211C	
+0x3E77	0x22113	
+0x3E78	0x2210A	
+0x3E79	0x2211E	
+0x3E7A	0x22114	
+0x3E7B	0x2211A	
+0x3E7C	0x221CB	
+0x3E7D	0x22287	
+0x3E7E	0x22293	
+0x3F22	0x22284	
+0x3F23	0x22285	
+0x3F24	0x22292	
+0x3F25	0x22280	
+0x3F26	0x2232B	
+0x3F27	0x22363	
+0x3F28	0x2240A	
+0x3F2A	0x22466	
+0x3F2B	0x22534	
+0x3F2C	0x22533	
+0x3F2D	0x2254D	
+0x3F2E	0x22789	
+0x3F2F	0x22757	
+0x3F31	0x2274A	
+0x3F33	0x22739	
+0x3F34	0x2273F	
+0x3F35	0x22790	
+0x3F36	0x2278F	
+0x3F37	0x227B2	
+0x3F38	0x2279F	
+0x3F39	0x22795	
+0x3F3A	0x227A1	
+0x3F3B	0x2279C	
+0x3F3C	0x2278E	
+0x3F3D	0x227A0	
+0x3F3E	0x227AE	
+0x3F3F	0x22796	
+0x3F40	0x227CA	
+0x3F41	0x227AC	
+0x3F43	0x227A6	
+0x3F44	0x22797	
+0x3F45	0x22793	
+0x3F46	0x203B6	
+0x3F47	0x229D6	
+0x3F48	0x229E0	
+0x3F49	0x229D8	
+0x3F4A	0x22A56	
+0x3F4B	0x22C6E	
+0x3F4C	0x22C7E	
+0x3F4D	0x22C74	
+0x3F4E	0x22C77	
+0x3F4F	0x22C80	
+0x3F50	0x22C7A	
+0x3F51	0x22C6B	
+0x3F52	0x22C5F	
+0x3F53	0x22C76	
+0x3F54	0x22CB0	
+0x3F55	0x22C63	
+0x3F56	0x22F92	
+0x3F57	0x22F82	
+0x3F58	0x22F9D	
+0x3F59	0x22F94	
+0x3F5A	0x22F83	
+0x3F5B	0x22F8B	
+0x3F5C	0x22F84	
+0x3F5D	0x23057	
+0x3F5E	0x23084	
+0x3F5F	0x230B5	
+0x3F60	0x23109	
+0x3F61	0x231E6	
+0x3F63	0x23225	
+0x3F64	0x23251	
+0x3F65	0x2333E	
+0x3F66	0x2F8DA	
+0x3F67	0x23385	
+0x3F68	0x2353F	
+0x3F69	0x23542	
+0x3F6A	0x23538	
+0x3F6B	0x2353A	
+0x3F6C	0x2354E	
+0x3F6D	0x23545	
+0x3F6E	0x23539	
+0x3F6F	0x23537	
+0x3F70	0x23544	
+0x3F71	0x2F8E7	
+0x3F72	0x235A4	
+0x3F73	0x2353D	
+0x3F74	0x23541	
+0x3F75	0x238DF	
+0x3F76	0x238DE	
+0x3F77	0x238CA	
+0x3F78	0x238E9	
+0x3F79	0x238E2	
+0x3F7A	0x238E0	
+0x3F7B	0x23989	
+0x3F7C	0x23987	
+0x3F7D	0x23A32	
+0x3F7E	0x23A33	
+0x4021	0x23AAC	
+0x4022	0x23AF9	
+0x4023	0x23B0D	
+0x4024	0x23BB9	
+0x4025	0x23E5E	
+0x4026	0x23E6A	
+0x4028	0x23E81	
+0x4029	0x23E69	
+0x402A	0x23EAC	
+0x402B	0x23E80	
+0x402C	0x23E75	
+0x402D	0x23E71	
+0x402E	0x23E76	
+0x402F	0x23E6F	
+0x4030	0x242B6	
+0x4031	0x24303	
+0x4032	0x242BF	
+0x4033	0x24301	
+0x4034	0x242B2	
+0x4035	0x242C4	
+0x4036	0x245DB	
+0x4037	0x245DC	
+0x4038	0x245D8	
+0x4039	0x29672	
+0x403A	0x246B5	
+0x403B	0x246A8	
+0x403C	0x2468F	
+0x403D	0x2469E	
+0x403E	0x2468E	
+0x403F	0x247DE	
+0x4040	0x247E2	
+0x4041	0x24820	
+0x4042	0x2481D	
+0x4043	0x2481A	
+0x4044	0x24819	
+0x4045	0x2482B	
+0x4046	0x24818	
+0x4047	0x24810	
+0x4048	0x2480E	
+0x4049	0x24824	
+0x404A	0x2481F	
+0x404B	0x24813	
+0x404C	0x24835	
+0x404D	0x24983	
+0x404F	0x249D7	
+0x4050	0x24B02	
+0x4051	0x24B03	
+0x4052	0x24B5C	
+0x4053	0x24B5F	
+0x4054	0x24BC7	
+0x4055	0x24C9A	
+0x4056	0x24C97	
+0x4057	0x24CA3	
+0x4058	0x24DF7	
+0x4059	0x24DC6	
+0x405A	0x24DCC	
+0x405B	0x24DD6	
+0x405C	0x24DCD	
+0x405D	0x24DF9	
+0x405E	0x24DD9	
+0x405F	0x24DD8	
+0x4061	0x24DD1	
+0x4062	0x24DCE	
+0x4063	0x24DD5	
+0x4065	0x24DD4	
+0x4066	0x24DF8	
+0x4067	0x24F7A	
+0x4068	0x24F79	
+0x4069	0x24F7F	
+0x406A	0x24FF3	
+0x406B	0x24FF5	
+0x406C	0x24FF6	
+0x406D	0x24FF4	
+0x406E	0x24FF7	
+0x4070	0x25079	
+0x4071	0x2519C	
+0x4072	0x251DF	
+0x4073	0x251F5	
+0x4074	0x251FF	
+0x4075	0x251D1	
+0x4076	0x251DA	
+0x4077	0x251CF	
+0x4078	0x251CD	
+0x4079	0x251DE	
+0x407A	0x251D8	
+0x407B	0x23AAD	
+0x407C	0x251E0	
+0x407D	0x251FE	
+0x407E	0x2519E	
+0x4121	0x25375	
+0x4122	0x25373	
+0x4123	0x25372	
+0x4124	0x253D8	
+0x4125	0x254D0	
+0x4126	0x254D6	
+0x4127	0x254D7	
+0x4128	0x254CA	
+0x4129	0x254CD	
+0x412A	0x2568A	
+0x412B	0x25689	
+0x412C	0x2568B	
+0x412D	0x257D3	
+0x412E	0x257DA	
+0x412F	0x257CE	
+0x4130	0x257D2	
+0x4132	0x257D4	
+0x4133	0x257D7	
+0x4134	0x257D5	
+0x4135	0x257FB	
+0x4136	0x257CD	
+0x4137	0x257FA	
+0x4138	0x257D6	
+0x413A	0x2599B	
+0x413B	0x2599E	
+0x413C	0x2599D	
+0x413D	0x259A4	
+0x413E	0x2599F	
+0x413F	0x259A5	
+0x4140	0x259A8	
+0x4141	0x25A8F	
+0x4142	0x25A8C	
+0x4143	0x25A95	
+0x4144	0x25B60	
+0x4145	0x25B55	
+0x4146	0x25B5C	
+0x4147	0x25B6F	
+0x4148	0x25B51	
+0x4149	0x25B61	
+0x414A	0x25BA7	
+0x414B	0x25B5E	
+0x414C	0x25B62	
+0x414D	0x25B54	
+0x414E	0x25B6E	
+0x414F	0x25B52	
+0x4150	0x25B58	
+0x4151	0x25B6D	
+0x4152	0x25B5F	
+0x4153	0x25B6C	
+0x4154	0x25B50	
+0x4155	0x25B5D	
+0x4156	0x25B8E	
+0x4157	0x25E72	
+0x4158	0x25E78	
+0x4159	0x25E75	
+0x415A	0x25E76	
+0x415B	0x25E7C	
+0x415C	0x25E7E	
+0x415D	0x25E7D	
+0x415E	0x26015	
+0x415F	0x26014	
+0x4160	0x2601D	
+0x4161	0x2601C	
+0x4162	0x26023	
+0x4163	0x26057	
+0x4164	0x262C8	
+0x4166	0x262C9	
+0x4167	0x262C5	
+0x4168	0x26387	
+0x4169	0x2638A	
+0x416A	0x26394	
+0x416B	0x26439	
+0x416C	0x26440	
+0x416D	0x2643E	
+0x416E	0x26438	
+0x416F	0x264D6	
+0x4171	0x26577	
+0x4172	0x26578	
+0x4173	0x2657D	
+0x4174	0x266DD	
+0x4175	0x2675E	
+0x4176	0x26777	
+0x4177	0x267D4	
+0x4178	0x26766	
+0x4179	0x2675F	
+0x417A	0x26773	
+0x417B	0x26772	
+0x417C	0x26797	
+0x417D	0x2675A	
+0x417E	0x26796	
+0x4221	0x2675D	
+0x4222	0x26765	
+0x4223	0x26770	
+0x4224	0x26775	
+0x4225	0x26774	
+0x4226	0x2675C	
+0x4227	0x26760	
+0x4229	0x2676D	
+0x422A	0x26941	
+0x422B	0x26A3C	
+0x422C	0x26A3E	
+0x422E	0x26A49	
+0x422F	0x26BE4	
+0x4230	0x26D0C	
+0x4231	0x26D15	
+0x4232	0x26D0E	
+0x4233	0x26CD4	
+0x4234	0x26CC7	
+0x4235	0x26D14	
+0x4236	0x26CDB	
+0x4237	0x26D5F	
+0x4238	0x26CED	
+0x4239	0x26D09	
+0x423A	0x26CCF	
+0x423B	0x26CFF	
+0x423C	0x26D1A	
+0x423D	0x26CF5	
+0x423E	0x26CEE	
+0x423F	0x26CE5	
+0x4240	0x26D0D	
+0x4241	0x26CDF	
+0x4242	0x26CEC	
+0x4243	0x26CD7	
+0x4244	0x26D2C	
+0x4245	0x26CCD	
+0x4246	0x26CE3	
+0x4247	0x26D00	
+0x4248	0x26CEB	
+0x4249	0x26CFD	
+0x424A	0x26D0F	
+0x424B	0x26D2D	
+0x424C	0x26D50	
+0x424D	0x26CFE	
+0x424E	0x26CC4	
+0x424F	0x26CE1	
+0x4250	0x26CF9	
+0x4251	0x271BB	
+0x4252	0x271BC	
+0x4255	0x271BA	
+0x4256	0x272D0	
+0x4257	0x272D6	
+0x4258	0x272CE	
+0x4259	0x272E1	
+0x425A	0x272D5	
+0x425B	0x272CF	
+0x425C	0x272D3	
+0x425E	0x272D4	
+0x425F	0x275B5	
+0x4260	0x27690	
+0x4261	0x276A1	
+0x4262	0x27681	
+0x4263	0x27685	
+0x4264	0x2766E	
+0x4265	0x27688	
+0x4266	0x27682	
+0x4267	0x27686	
+0x4268	0x2768F	
+0x4269	0x27689	
+0x426A	0x27680	
+0x426B	0x27684	
+0x426D	0x27829	
+0x426E	0x2782B	
+0x426F	0x2782A	
+0x4270	0x27830	
+0x4271	0x278E2	
+0x4272	0x278E3	
+0x4273	0x278E1	
+0x4274	0x279D5	
+0x4275	0x279C4	
+0x4276	0x279C9	
+0x4277	0x279E0	
+0x4278	0x279DF	
+0x4279	0x279CB	
+0x427A	0x279DD	
+0x427B	0x279E8	
+0x427C	0x279D4	
+0x427D	0x27A1C	
+0x427E	0x27BB5	
+0x4321	0x27BB6	
+0x4322	0x27BE5	
+0x4323	0x27C45	
+0x4324	0x27C49	
+0x4325	0x27C40	
+0x4326	0x27C46	
+0x4327	0x27C44	
+0x4328	0x27C4A	
+0x4329	0x27CC9	
+0x432A	0x27CC4	
+0x432B	0x27CC2	
+0x432C	0x27D68	
+0x432E	0x27D82	
+0x432F	0x27D6B	
+0x4330	0x27D67	
+0x4331	0x27D6C	
+0x4332	0x27D6D	
+0x4333	0x27D71	
+0x4335	0x27ED7	
+0x4336	0x27ED2	
+0x4337	0x27ED9	
+0x4339	0x27EBC	
+0x433A	0x27EDD	
+0x433B	0x27ED6	
+0x433D	0x27ED8	
+0x433E	0x28020	
+0x433F	0x28016	
+0x4340	0x28018	
+0x4341	0x28015	
+0x4342	0x28019	
+0x4343	0x28027	
+0x4344	0x28050	
+0x4345	0x2801D	
+0x4346	0x2802C	
+0x4347	0x2801C	
+0x4348	0x28029	
+0x4349	0x2802B	
+0x434A	0x28024	
+0x434C	0x28028	
+0x434D	0x28239	
+0x434E	0x282F2	
+0x434F	0x282F0	
+0x4351	0x282ED	
+0x4352	0x282EF	
+0x4353	0x282EA	
+0x4354	0x28301	
+0x4355	0x284BC	
+0x4356	0x2855C	
+0x4357	0x2855B	
+0x4358	0x2855A	
+0x4359	0x28526	
+0x435A	0x28743	
+0x435B	0x28733	
+0x435C	0x2873A	
+0x435D	0x28737	
+0x435E	0x28736	
+0x435F	0x2873C	
+0x4360	0x28734	
+0x4361	0x2874A	
+0x4362	0x2873B	
+0x4363	0x28735	
+0x4364	0x2873D	
+0x4365	0x28740	
+0x4366	0x2873E	
+0x4367	0x28717	
+0x4368	0x28826	
+0x4369	0x28824	
+0x436A	0x28810	
+0x436B	0x28836	
+0x436C	0x28825	
+0x436E	0x28966	
+0x436F	0x28C7F	
+0x4370	0x28C7A	
+0x4371	0x28CFB	
+0x4372	0x28CFD	
+0x4373	0x28CFC	
+0x4374	0x28CFA	
+0x4375	0x28ED6	
+0x4376	0x28ED2	
+0x4377	0x28EC8	
+0x4378	0x28EC2	
+0x4379	0x28EC7	
+0x437A	0x28ECD	
+0x437B	0x28EC1	
+0x437C	0x28EC6	
+0x437D	0x28ECC	
+0x437E	0x28FA1	
+0x4421	0x29095	
+0x4422	0x29094	
+0x4423	0x29097	
+0x4424	0x29096	
+0x4425	0x29093	
+0x4426	0x290A1	
+0x4427	0x29209	
+0x4428	0x29208	
+0x4429	0x29267	
+0x442A	0x29265	
+0x442B	0x29262	
+0x442C	0x29261	
+0x442D	0x29397	
+0x442E	0x29401	
+0x442F	0x29419	
+0x4430	0x29418	
+0x4431	0x2945C	
+0x4432	0x29467	
+0x4433	0x2946C	
+0x4435	0x2F9FD	
+0x4436	0x29466	
+0x4437	0x29461	
+0x4438	0x2946E	
+0x4439	0x2945D	
+0x443A	0x2945A	
+0x443B	0x295A2	
+0x443C	0x295A9	
+0x443D	0x295A5	
+0x443E	0x295A6	
+0x443F	0x295B2	
+0x4440	0x295A3	
+0x4441	0x296AC	
+0x4442	0x296AA	
+0x4443	0x296AF	
+0x4444	0x296AB	
+0x4445	0x296B1	
+0x4446	0x296C6	
+0x4447	0x296AD	
+0x4448	0x296B9	
+0x4449	0x29870	
+0x444B	0x29C0C	
+0x444C	0x29C81	
+0x444D	0x29C83	
+0x444E	0x29C7E	
+0x444F	0x29D51	
+0x4450	0x29F99	
+0x4451	0x29F94	
+0x4452	0x29F95	
+0x4453	0x2A2FE	
+0x4454	0x2A418	
+0x4455	0x20105	
+0x4456	0x20372	
+0x4458	0x20399	
+0x4459	0x204AD	
+0x445A	0x20606	
+0x445B	0x207C2	
+0x445C	0x207CB	
+0x445D	0x207D5	
+0x445E	0x207D2	
+0x445F	0x207CC	
+0x4460	0x207D7	
+0x4461	0x207C5	
+0x4462	0x207CA	
+0x4464	0x208A2	
+0x4465	0x208A3	
+0x4466	0x208A1	
+0x4468	0x208A6	
+0x4469	0x208A4	
+0x446A	0x208FF	
+0x446B	0x20900	
+0x446D	0x20A06	
+0x446E	0x20A25	
+0x446F	0x20A9F	
+0x4470	0x20B7F	
+0x4471	0x20EEA	
+0x4472	0x20EEB	
+0x4473	0x20EDE	
+0x4474	0x20F18	
+0x4475	0x20EE0	
+0x4476	0x20EE8	
+0x4477	0x20EDF	
+0x4478	0x20EF1	
+0x4479	0x20EEC	
+0x447A	0x20F1A	
+0x447B	0x20EE6	
+0x447C	0x20EE1	
+0x447D	0x20F5D	
+0x447E	0x20077	
+0x4521	0x20F1E	
+0x4523	0x20F80	
+0x4524	0x21217	
+0x4525	0x2141D	
+0x4526	0x213F7	
+0x4527	0x213EF	
+0x4528	0x213EE	
+0x4529	0x213ED	
+0x452A	0x213F5	
+0x452B	0x2141E	
+0x452C	0x215BD	
+0x452D	0x257FF	
+0x452E	0x215BE	
+0x452F	0x2166D	
+0x4530	0x21676	
+0x4531	0x2184C	
+0x4532	0x21819	
+0x4533	0x21848	
+0x4534	0x2181E	
+0x4535	0x2184A	
+0x4536	0x21849	
+0x4537	0x21826	
+0x4538	0x21995	
+0x4539	0x21A85	
+0x453A	0x21A7E	
+0x453B	0x21A97	
+0x453C	0x21A7D	
+0x453D	0x21B42	
+0x453E	0x21B9E	
+0x453F	0x21C0C	
+0x4540	0x21C0B	
+0x4541	0x21C0E	
+0x4542	0x21CCF	
+0x4543	0x21ED8	
+0x4544	0x21EE0	
+0x4545	0x21EE8	
+0x4546	0x21EE9	
+0x4547	0x21EE2	
+0x4548	0x21EE1	
+0x4549	0x21EDA	
+0x454A	0x21EE3	
+0x454B	0x21ED9	
+0x454C	0x21EF0	
+0x454D	0x21EE7	
+0x454E	0x21EE4	
+0x454F	0x22123	
+0x4550	0x22131	
+0x4551	0x22133	
+0x4552	0x2210C	
+0x4553	0x269E0	
+0x4554	0x22126	
+0x4555	0x22124	
+0x4556	0x22132	
+0x4557	0x22127	
+0x4558	0x22121	
+0x4559	0x22130	
+0x455A	0x221A2	
+0x455B	0x221CC	
+0x455C	0x22296	
+0x455D	0x2F88F	
+0x455E	0x22298	
+0x455F	0x2229C	
+0x4560	0x2229B	
+0x4561	0x2236B	
+0x4562	0x22412	
+0x4563	0x22414	
+0x4564	0x2255A	
+0x4565	0x22554	
+0x4566	0x22551	
+0x4567	0x2255E	
+0x4568	0x22558	
+0x456A	0x22559	
+0x456B	0x2279A	
+0x456C	0x227F2	
+0x456D	0x227AD	
+0x456E	0x22820	
+0x456F	0x227F1	
+0x4570	0x227F0	
+0x4571	0x227F3	
+0x4572	0x227F4	
+0x4573	0x227E9	
+0x4574	0x227FE	
+0x4575	0x2282E	
+0x4576	0x227E8	
+0x4577	0x227E7	
+0x4578	0x227FF	
+0x4579	0x227F5	
+0x457A	0x229E5	
+0x457B	0x229E7	
+0x457C	0x229E6	
+0x457D	0x229E9	
+0x457E	0x22A58	
+0x4621	0x22C6C	
+0x4622	0x22CD9	
+0x4624	0x22CCB	
+0x4626	0x22CBE	
+0x4627	0x22CB5	
+0x4628	0x22CD1	
+0x4629	0x22CC2	
+0x462A	0x22CB6	
+0x462B	0x22CD3	
+0x462C	0x2F8C2	
+0x462D	0x22EDA	
+0x462F	0x22FAE	
+0x4631	0x22FAC	
+0x4632	0x22FA9	
+0x4633	0x22FBA	
+0x4634	0x22FA7	
+0x4635	0x22FB3	
+0x4636	0x22FBD	
+0x4637	0x22FB1	
+0x4638	0x2310E	
+0x4639	0x23111	
+0x463A	0x2310F	
+0x463B	0x23252	
+0x463C	0x2326A	
+0x463D	0x23254	
+0x463E	0x23255	
+0x463F	0x23253	
+0x4640	0x23257	
+0x4641	0x2F8D0	
+0x4642	0x2325B	
+0x4643	0x23258	
+0x4644	0x23259	
+0x4646	0x235B8	
+0x4647	0x235B5	
+0x4648	0x235BF	
+0x4649	0x235C1	
+0x464A	0x235BB	
+0x464C	0x235C3	
+0x464D	0x235AD	
+0x464E	0x235A8	
+0x464F	0x235AE	
+0x4650	0x235AA	
+0x4651	0x235D0	
+0x4652	0x235B1	
+0x4653	0x235BC	
+0x4654	0x235B7	
+0x4655	0x235B0	
+0x4656	0x235FA	
+0x4657	0x235FB	
+0x4658	0x235B9	
+0x4659	0x23907	
+0x465A	0x238FC	
+0x465B	0x238FF	
+0x465C	0x238F2	
+0x465D	0x238F8	
+0x465E	0x238F4	
+0x4661	0x23AAE	
+0x4662	0x23B0F	
+0x4663	0x23B10	
+0x4664	0x29AC1	
+0x4665	0x23BC7	
+0x4666	0x23BC6	
+0x4667	0x23BCE	
+0x4669	0x23BDC	
+0x466A	0x23ED5	
+0x466B	0x23ED3	
+0x466C	0x23F20	
+0x466D	0x23EE2	
+0x466E	0x23EF1	
+0x466F	0x23EDB	
+0x4670	0x23EEA	
+0x4671	0x23EEB	
+0x4672	0x23EE1	
+0x4673	0x23EFF	
+0x4674	0x23ED6	
+0x4675	0x23EE0	
+0x4676	0x23ED7	
+0x4677	0x23EE5	
+0x4679	0x2431B	
+0x467A	0x24310	
+0x467B	0x2430F	
+0x467C	0x2430E	
+0x467D	0x24339	
+0x467E	0x2430A	
+0x4721	0x24314	
+0x4722	0x2430C	
+0x4723	0x24523	
+0x4724	0x2455A	
+0x4725	0x245E2	
+0x4726	0x24693	
+0x4727	0x246B0	
+0x4728	0x246AB	
+0x4729	0x246BD	
+0x472A	0x246B1	
+0x472B	0x2468D	
+0x472C	0x246AD	
+0x472D	0x246AA	
+0x472E	0x246AC	
+0x472F	0x246BC	
+0x4730	0x246C9	
+0x4731	0x24847	
+0x4732	0x24862	
+0x4733	0x24840	
+0x4734	0x24844	
+0x4735	0x2483F	
+0x4736	0x24843	
+0x4737	0x2483D	
+0x4738	0x24860	
+0x4739	0x2485F	
+0x473A	0x2483A	
+0x473B	0x24842	
+0x473C	0x2485E	
+0x473D	0x2485D	
+0x473E	0x249BC	
+0x473F	0x249E0	
+0x4740	0x249EE	
+0x4741	0x249EB	
+0x4742	0x24A0D	
+0x4743	0x24B09	
+0x4744	0x24B0C	
+0x4745	0x24B69	
+0x4746	0x24B74	
+0x4747	0x24B67	
+0x474A	0x24CAD	
+0x474B	0x24DFF	
+0x474C	0x24E16	
+0x474D	0x24E08	
+0x474E	0x24E09	
+0x474F	0x24E00	
+0x4750	0x24DFC	
+0x4751	0x24E13	
+0x4752	0x24E14	
+0x4753	0x24E0A	
+0x4754	0x2983E	
+0x4755	0x24E29	
+0x4756	0x24E17	
+0x4757	0x24E3B	
+0x4758	0x24DFB	
+0x475A	0x24E0E	
+0x475C	0x25008	
+0x475D	0x2521B	
+0x475E	0x2521A	
+0x475F	0x25219	
+0x4760	0x25202	
+0x4762	0x25217	
+0x4763	0x25207	
+0x4764	0x25213	
+0x4765	0x25209	
+0x4766	0x2520A	
+0x4767	0x25212	
+0x4768	0x252AA	
+0x4769	0x25238	
+0x476A	0x2537B	
+0x476B	0x2537C	
+0x476C	0x2537A	
+0x476D	0x253EA	
+0x476E	0x253EB	
+0x476F	0x253EF	
+0x4770	0x253F0	
+0x4771	0x25509	
+0x4772	0x25502	
+0x4773	0x25501	
+0x4774	0x2552B	
+0x4775	0x25507	
+0x4777	0x25528	
+0x4778	0x254FB	
+0x4779	0x2552A	
+0x477A	0x254FE	
+0x477B	0x25504	
+0x477C	0x25529	
+0x477D	0x2550A	
+0x4821	0x256C2	
+0x4823	0x256A6	
+0x4825	0x22FC6	
+0x4826	0x21C07	
+0x4827	0x2580A	
+0x4828	0x257FD	
+0x4829	0x25806	
+0x482A	0x2580D	
+0x482B	0x25809	
+0x482C	0x2580B	
+0x482D	0x25800	
+0x482E	0x25805	
+0x482F	0x2583D	
+0x4830	0x259D5	
+0x4831	0x259BF	
+0x4832	0x259BA	
+0x4833	0x259C7	
+0x4834	0x25A98	
+0x4835	0x25A9A	
+0x4837	0x25BA4	
+0x4838	0x25B9C	
+0x4839	0x25B9D	
+0x483A	0x25BA2	
+0x483B	0x25B96	
+0x483C	0x25B95	
+0x483D	0x25BA5	
+0x483E	0x25BAA	
+0x483F	0x25BAD	
+0x4840	0x25B9A	
+0x4841	0x25BA3	
+0x4842	0x25B97	
+0x4843	0x25B90	
+0x4844	0x25BAF	
+0x4845	0x25B8D	
+0x4847	0x25BA8	
+0x4848	0x25BEE	
+0x4849	0x25EA3	
+0x484A	0x25E99	
+0x484B	0x25EA1	
+0x484C	0x25E9C	
+0x484D	0x25EA4	
+0x484E	0x25ECB	
+0x484F	0x26056	
+0x4850	0x26048	
+0x4851	0x26059	
+0x4852	0x2604A	
+0x4853	0x2605C	
+0x4855	0x2604F	
+0x4856	0x2604D	
+0x4857	0x2605D	
+0x4858	0x2623A	
+0x4859	0x262E3	
+0x485A	0x262E1	
+0x485B	0x262DE	
+0x485C	0x26397	
+0x485D	0x2639A	
+0x485E	0x26448	
+0x485F	0x2644A	
+0x4860	0x2644C	
+0x4861	0x2644E	
+0x4862	0x2644F	
+0x4863	0x2644B	
+0x4864	0x2644D	
+0x4865	0x26447	
+0x4866	0x26451	
+0x4867	0x264DA	
+0x4868	0x264F9	
+0x4869	0x264FC	
+0x486A	0x264FB	
+0x486B	0x264FD	
+0x486C	0x264F8	
+0x486D	0x264FA	
+0x486E	0x2658A	
+0x486F	0x2658E	
+0x4870	0x26588	
+0x4871	0x26589	
+0x4872	0x2658D	
+0x4873	0x26590	
+0x4874	0x2F97E	
+0x4875	0x2671C	
+0x4876	0x267AB	
+0x4877	0x267A4	
+0x4878	0x267A8	
+0x4879	0x267AD	
+0x487A	0x2679F	
+0x487B	0x2679A	
+0x487C	0x267B0	
+0x487D	0x267A5	
+0x487E	0x267D5	
+0x4921	0x267A2	
+0x4922	0x267B2	
+0x4923	0x2679D	
+0x4924	0x267A1	
+0x4925	0x26915	
+0x4926	0x26942	
+0x4927	0x26973	
+0x4928	0x26984	
+0x4929	0x269DD	
+0x492A	0x26A5C	
+0x492B	0x26A4C	
+0x492D	0x26A4B	
+0x492E	0x26C67	
+0x492F	0x26DA8	
+0x4930	0x26D7F	
+0x4931	0x26D8D	
+0x4932	0x26D8B	
+0x4933	0x26DF7	
+0x4934	0x26DA9	
+0x4935	0x26DF4	
+0x4936	0x26D9A	
+0x4937	0x26D8C	
+0x4938	0x26D95	
+0x4939	0x26D7E	
+0x493A	0x26D77	
+0x493D	0x26D71	
+0x493E	0x26DFD	
+0x493F	0x26D88	
+0x4940	0x26D99	
+0x4941	0x26D6D	
+0x4942	0x26DD4	
+0x4943	0x26D91	
+0x4944	0x26D7D	
+0x4945	0x26D63	
+0x4946	0x26D75	
+0x4947	0x26DF9	
+0x4948	0x26D8E	
+0x4949	0x26D74	
+0x494A	0x26DD9	
+0x494B	0x26D66	
+0x494C	0x26DFA	
+0x494D	0x26DF5	
+0x494F	0x271C1	
+0x4950	0x271C9	
+0x4951	0x27303	
+0x4952	0x2732C	
+0x4953	0x27334	
+0x4954	0x27317	
+0x4955	0x27309	
+0x4956	0x27304	
+0x4957	0x27306	
+0x4958	0x2731A	
+0x4959	0x2730E	
+0x495A	0x27327	
+0x495B	0x27305	
+0x495C	0x27307	
+0x495D	0x27319	
+0x495E	0x27314	
+0x495F	0x2730C	
+0x4960	0x2731D	
+0x4961	0x27322	
+0x4962	0x27323	
+0x4963	0x275BB	
+0x4964	0x275BC	
+0x4965	0x275BA	
+0x4966	0x276A9	
+0x4967	0x276B5	
+0x4968	0x276AC	
+0x4969	0x276AA	
+0x496A	0x276AF	
+0x496B	0x276B7	
+0x496E	0x2783D	
+0x496F	0x27845	
+0x4970	0x27848	
+0x4971	0x2783C	
+0x4972	0x2783E	
+0x4973	0x278EC	
+0x4974	0x278ED	
+0x4975	0x278E9	
+0x4976	0x27A0A	
+0x4977	0x27A0B	
+0x4978	0x279F8	
+0x4979	0x27A04	
+0x497A	0x279F6	
+0x497B	0x279F9	
+0x497C	0x27C53	
+0x497D	0x27C52	
+0x497E	0x27C60	
+0x4A21	0x27C63	
+0x4A22	0x27CCE	
+0x4A23	0x27CCD	
+0x4A24	0x27CD0	
+0x4A25	0x27CCC	
+0x4A26	0x27D87	
+0x4A27	0x27D8D	
+0x4A28	0x27D9D	
+0x4A2A	0x27E63	
+0x4A2B	0x27EF4	
+0x4A2C	0x27EF1	
+0x4A2D	0x27EFF	
+0x4A2E	0x27EF5	
+0x4A2F	0x27EFC	
+0x4A30	0x27EF2	
+0x4A31	0x27EF6	
+0x4A33	0x27EFA	
+0x4A35	0x2802E	
+0x4A36	0x28045	
+0x4A37	0x28043	
+0x4A38	0x28051	
+0x4A39	0x2804C	
+0x4A3A	0x28073	
+0x4A3B	0x28047	
+0x4A3C	0x2804B	
+0x4A3D	0x2804F	
+0x4A3F	0x28044	
+0x4A40	0x2804D	
+0x4A41	0x2804E	
+0x4A42	0x2804A	
+0x4A43	0x28041	
+0x4A44	0x28052	
+0x4A45	0x2809F	
+0x4A46	0x28054	
+0x4A47	0x28059	
+0x4A48	0x280A2	
+0x4A49	0x2824B	
+0x4A4A	0x28248	
+0x4A4B	0x2830D	
+0x4A4C	0x2831F	
+0x4A4D	0x28308	
+0x4A4E	0x2830E	
+0x4A4F	0x2831D	
+0x4A50	0x28304	
+0x4A51	0x28418	
+0x4A52	0x2841B	
+0x4A53	0x28566	
+0x4A54	0x28562	
+0x4A55	0x28583	
+0x4A56	0x28567	
+0x4A57	0x28762	
+0x4A58	0x2874F	
+0x4A59	0x2874E	
+0x4A5A	0x28767	
+0x4A5B	0x28753	
+0x4A5C	0x2874D	
+0x4A5D	0x2874C	
+0x4A5E	0x28768	
+0x4A5F	0x28751	
+0x4A61	0x28758	
+0x4A62	0x2875B	
+0x4A63	0x28750	
+0x4A64	0x2876A	
+0x4A65	0x28839	
+0x4A66	0x28838	
+0x4A67	0x28982	
+0x4A68	0x28984	
+0x4A69	0x28986	
+0x4A6A	0x28C80	
+0x4A6B	0x28C86	
+0x4A6C	0x28D25	
+0x4A6D	0x28D11	
+0x4A6F	0x28D0E	
+0x4A70	0x28D15	
+0x4A71	0x28D0F	
+0x4A72	0x28D18	
+0x4A73	0x28D0D	
+0x4A74	0x28D13	
+0x4A75	0x28D16	
+0x4A76	0x28D19	
+0x4A77	0x28F08	
+0x4A78	0x28EF7	
+0x4A79	0x28EFB	
+0x4A7A	0x28EFC	
+0x4A7B	0x28FB4	
+0x4A7C	0x28FBE	
+0x4A7D	0x28FC1	
+0x4A7E	0x290A6	
+0x4B21	0x290A5	
+0x4B22	0x290A2	
+0x4B23	0x290A4	
+0x4B24	0x29212	
+0x4B25	0x2920E	
+0x4B26	0x2927A	
+0x4B27	0x29278	
+0x4B28	0x2927D	
+0x4B29	0x2927E	
+0x4B2A	0x29281	
+0x4B2B	0x29283	
+0x4B2C	0x29280	
+0x4B2D	0x29282	
+0x4B2E	0x2939B	
+0x4B2F	0x29399	
+0x4B30	0x2939C	
+0x4B31	0x2939A	
+0x4B32	0x293A1	
+0x4B33	0x2941A	
+0x4B34	0x2941C	
+0x4B35	0x2948A	
+0x4B36	0x29479	
+0x4B37	0x29473	
+0x4B38	0x29475	
+0x4B39	0x2947C	
+0x4B3A	0x29478	
+0x4B3B	0x29460	
+0x4B3C	0x29483	
+0x4B3D	0x29470	
+0x4B40	0x29487	
+0x4B41	0x29484	
+0x4B42	0x2947B	
+0x4B43	0x2947E	
+0x4B44	0x29474	
+0x4B45	0x295B9	
+0x4B46	0x295B8	
+0x4B47	0x295B7	
+0x4B48	0x295B5	
+0x4B49	0x296CC	
+0x4B4A	0x296CE	
+0x4B4B	0x296D1	
+0x4B4D	0x296CB	
+0x4B4F	0x2987E	
+0x4B50	0x2987A	
+0x4B51	0x29877	
+0x4B52	0x2988C	
+0x4B53	0x298E1	
+0x4B54	0x29A20	
+0x4B55	0x29A1E	
+0x4B56	0x29AC2	
+0x4B57	0x29B0F	
+0x4B58	0x29B00	
+0x4B5A	0x29B10	
+0x4B5B	0x29C0D	
+0x4B5C	0x29C0E	
+0x4B5D	0x29C8E	
+0x4B5E	0x29C8D	
+0x4B5F	0x29C8A	
+0x4B60	0x29C8B	
+0x4B61	0x29C8C	
+0x4B62	0x29C8F	
+0x4B63	0x29D57	
+0x4B65	0x29D55	
+0x4B66	0x29D5B	
+0x4B67	0x29FAC	
+0x4B68	0x29FA7	
+0x4B69	0x29FA0	
+0x4B6A	0x29F9E	
+0x4B6C	0x2A28D	
+0x4B6E	0x2A393	
+0x4B6F	0x2A394	
+0x4B70	0x2A392	
+0x4B71	0x20181	
+0x4B72	0x203D6	
+0x4B73	0x203C3	
+0x4B74	0x203E4	
+0x4B75	0x203E2	
+0x4B76	0x20409	
+0x4B77	0x203BF	
+0x4B78	0x203C8	
+0x4B79	0x203C7	
+0x4B7A	0x204B5	
+0x4B7B	0x204B2	
+0x4B7C	0x2060C	
+0x4B7D	0x2060B	
+0x4B7E	0x2060A	
+0x4C21	0x20605	
+0x4C22	0x207D3	
+0x4C23	0x207E6	
+0x4C24	0x207E9	
+0x4C25	0x207F0	
+0x4C26	0x207EA	
+0x4C27	0x207E7	
+0x4C28	0x208B1	
+0x4C29	0x208B3	
+0x4C2A	0x208B4	
+0x4C2B	0x208B0	
+0x4C2C	0x2095C	
+0x4C2D	0x2095D	
+0x4C2E	0x2095E	
+0x4C2F	0x209C0	
+0x4C30	0x20AAF	
+0x4C32	0x20B86	
+0x4C33	0x20B83	
+0x4C34	0x20B84	
+0x4C35	0x20F5C	
+0x4C36	0x20F70	
+0x4C37	0x20F8C	
+0x4C38	0x20F7B	
+0x4C39	0x20F66	
+0x4C3A	0x20F79	
+0x4C3B	0x20F63	
+0x4C3C	0x20FC5	
+0x4C3D	0x20F6B	
+0x4C3E	0x20F6D	
+0x4C3F	0x20F72	
+0x4C40	0x20F69	
+0x4C41	0x20F75	
+0x4C42	0x20F89	
+0x4C43	0x20FC6	
+0x4C44	0x20FA5	
+0x4C45	0x203E7	
+0x4C46	0x20F6A	
+0x4C47	0x20F97	
+0x4C48	0x2145A	
+0x4C49	0x2145C	
+0x4C4A	0x21459	
+0x4C4B	0x21424	
+0x4C4C	0x21425	
+0x4C4D	0x21430	
+0x4C4E	0x21458	
+0x4C4F	0x21431	
+0x4C50	0x21576	
+0x4C51	0x215C1	
+0x4C52	0x21685	
+0x4C53	0x2167D	
+0x4C54	0x21865	
+0x4C55	0x21887	
+0x4C56	0x21852	
+0x4C57	0x21854	
+0x4C58	0x2188A	
+0x4C59	0x21850	
+0x4C5A	0x21886	
+0x4C5B	0x2184F	
+0x4C5C	0x21868	
+0x4C5D	0x2199D	
+0x4C5E	0x21AA0	
+0x4C5F	0x21ABA	
+0x4C60	0x21ABD	
+0x4C61	0x21AB8	
+0x4C62	0x21BA6	
+0x4C64	0x21CDE	
+0x4C65	0x21CD8	
+0x4C66	0x21CD1	
+0x4C67	0x21F13	
+0x4C69	0x21F0E	
+0x4C6A	0x21F1B	
+0x4C6B	0x21F3A	
+0x4C6D	0x21F1C	
+0x4C6E	0x21F12	
+0x4C6F	0x21F16	
+0x4C70	0x21F1A	
+0x4C71	0x21448	
+0x4C72	0x2214B	
+0x4C73	0x22137	
+0x4C74	0x22136	
+0x4C75	0x22138	
+0x4C76	0x2213A	
+0x4C77	0x22149	
+0x4C78	0x2213C	
+0x4C79	0x2214A	
+0x4C7A	0x222B1	
+0x4C7B	0x222C2	
+0x4C7C	0x222B5	
+0x4C7D	0x222C4	
+0x4C7E	0x222B6	
+0x4D21	0x2241E	
+0x4D22	0x2241F	
+0x4D23	0x224AF	
+0x4D24	0x2256B	
+0x4D25	0x2256F	
+0x4D26	0x22792	
+0x4D27	0x227E4	
+0x4D28	0x2282C	
+0x4D29	0x227EF	
+0x4D2B	0x2284F	
+0x4D2C	0x22852	
+0x4D2D	0x22850	
+0x4D2E	0x2283A	
+0x4D2F	0x22837	
+0x4D30	0x22847	
+0x4D31	0x22864	
+0x4D32	0x22840	
+0x4D33	0x2283C	
+0x4D34	0x22845	
+0x4D35	0x22841	
+0x4D36	0x229F3	
+0x4D38	0x22CC1	
+0x4D39	0x22CB4	
+0x4D3B	0x22D2A	
+0x4D3C	0x22D22	
+0x4D3D	0x22D29	
+0x4D3F	0x22D3E	
+0x4D40	0x22D3C	
+0x4D41	0x22D30	
+0x4D42	0x22FC7	
+0x4D43	0x22FD5	
+0x4D44	0x22FD6	
+0x4D45	0x22FD3	
+0x4D46	0x22FCE	
+0x4D47	0x22FC8	
+0x4D48	0x2305C	
+0x4D49	0x2305F	
+0x4D4A	0x23062	
+0x4D4C	0x230BD	
+0x4D4D	0x230BF	
+0x4D4E	0x2325C	
+0x4D4F	0x232B6	
+0x4D51	0x2329D	
+0x4D52	0x2327F	
+0x4D54	0x23294	
+0x4D55	0x23281	
+0x4D56	0x23347	
+0x4D57	0x23346	
+0x4D59	0x23394	
+0x4D5A	0x23675	
+0x4D5B	0x2361A	
+0x4D5C	0x2362A	
+0x4D5D	0x23632	
+0x4D5E	0x23617	
+0x4D5F	0x23623	
+0x4D60	0x23674	
+0x4D62	0x23676	
+0x4D63	0x2362E	
+0x4D64	0x23625	
+0x4D65	0x23620	
+0x4D66	0x23671	
+0x4D67	0x23616	
+0x4D68	0x23670	
+0x4D69	0x2362C	
+0x4D6A	0x2362F	
+0x4D6B	0x2361F	
+0x4D6C	0x23664	
+0x4D6E	0x23908	
+0x4D6F	0x23914	
+0x4D70	0x2390A	
+0x4D71	0x2390B	
+0x4D72	0x23A4F	
+0x4D73	0x23A59	
+0x4D74	0x23A54	
+0x4D75	0x23A51	
+0x4D76	0x23AB6	
+0x4D77	0x23BEC	
+0x4D78	0x23BED	
+0x4D79	0x23BEA	
+0x4D7A	0x23EEE	
+0x4D7B	0x23F5A	
+0x4D7C	0x23F73	
+0x4D7D	0x23F65	
+0x4D7E	0x23F61	
+0x4E21	0x23F55	
+0x4E22	0x23F6B	
+0x4E23	0x23F64	
+0x4E24	0x23F5B	
+0x4E25	0x23F4C	
+0x4E26	0x23F6F	
+0x4E27	0x23F84	
+0x4E28	0x23F70	
+0x4E29	0x2435D	
+0x4E2A	0x24357	
+0x4E2B	0x24366	
+0x4E2C	0x24353	
+0x4E2D	0x24398	
+0x4E2E	0x24397	
+0x4E2F	0x24528	
+0x4E30	0x245EB	
+0x4E31	0x245EA	
+0x4E32	0x245E8	
+0x4E33	0x245EC	
+0x4E34	0x245EF	
+0x4E35	0x246D1	
+0x4E36	0x246CA	
+0x4E38	0x246CF	
+0x4E39	0x246CD	
+0x4E3A	0x246CE	
+0x4E3B	0x24870	
+0x4E3C	0x24867	
+0x4E3D	0x24873	
+0x4E3E	0x2486D	
+0x4E3F	0x24876	
+0x4E40	0x24879	
+0x4E41	0x2486A	
+0x4E42	0x2488B	
+0x4E43	0x24872	
+0x4E44	0x24871	
+0x4E45	0x2486E	
+0x4E46	0x2487A	
+0x4E47	0x24A16	
+0x4E48	0x24A39	
+0x4E49	0x24A3B	
+0x4E4A	0x24B10	
+0x4E4B	0x24B96	
+0x4E4C	0x24B7B	
+0x4E4D	0x24B7C	
+0x4E4E	0x24B7D	
+0x4E4F	0x24CBE	
+0x4E50	0x24E5C	
+0x4E51	0x24E38	
+0x4E52	0x24E39	
+0x4E53	0x24E2E	
+0x4E54	0x24E34	
+0x4E55	0x24E32	
+0x4E56	0x24E5B	
+0x4E57	0x24E33	
+0x4E58	0x24E3C	
+0x4E5A	0x2500E	
+0x4E5B	0x2500F	
+0x4E5C	0x25010	
+0x4E5D	0x25087	
+0x4E5E	0x2525B	
+0x4E5F	0x25253	
+0x4E61	0x2525C	
+0x4E62	0x2523F	
+0x4E63	0x25259	
+0x4E64	0x2524A	
+0x4E65	0x25244	
+0x4E66	0x2524C	
+0x4E67	0x25240	
+0x4E68	0x2525F	
+0x4E69	0x2525E	
+0x4E6A	0x2524E	
+0x4E6B	0x25254	
+0x4E6C	0x25243	
+0x4E6D	0x25287	
+0x4E6E	0x25382	
+0x4E6F	0x25385	
+0x4E70	0x25531	
+0x4E71	0x25547	
+0x4E72	0x2552E	
+0x4E73	0x2552F	
+0x4E74	0x25548	
+0x4E75	0x25534	
+0x4E77	0x2059F	
+0x4E78	0x25832	
+0x4E79	0x25836	
+0x4E7A	0x25833	
+0x4E7B	0x25831	
+0x4E7C	0x25840	
+0x4E7D	0x25841	
+0x4E7E	0x259DD	
+0x4F21	0x259D2	
+0x4F22	0x259D9	
+0x4F24	0x259DF	
+0x4F25	0x259DB	
+0x4F26	0x259D8	
+0x4F27	0x259D3	
+0x4F28	0x259DE	
+0x4F29	0x259E0	
+0x4F2A	0x259D4	
+0x4F2B	0x259D7	
+0x4F2C	0x259DA	
+0x4F2D	0x25AA7	
+0x4F2E	0x25BFE	
+0x4F2F	0x25BDD	
+0x4F30	0x25C40	
+0x4F31	0x25BE2	
+0x4F33	0x25BD6	
+0x4F34	0x25BDE	
+0x4F35	0x25BEF	
+0x4F37	0x25BEB	
+0x4F38	0x25BEA	
+0x4F39	0x25BE4	
+0x4F3A	0x25BD1	
+0x4F3C	0x25BEC	
+0x4F3D	0x25BFA	
+0x4F3E	0x25BD9	
+0x4F3F	0x25BF3	
+0x4F40	0x25BE1	
+0x4F41	0x25BDC	
+0x4F42	0x25BE5	
+0x4F43	0x25BDF	
+0x4F44	0x25BD4	
+0x4F46	0x25C05	
+0x4F47	0x25ED6	
+0x4F48	0x25ED5	
+0x4F49	0x25ED0	
+0x4F4A	0x25EC8	
+0x4F4B	0x25EC4	
+0x4F4C	0x25EC9	
+0x4F4D	0x25ECD	
+0x4F4E	0x25ED2	
+0x4F4F	0x25ECC	
+0x4F50	0x25ECA	
+0x4F51	0x260A0	
+0x4F52	0x26092	
+0x4F55	0x2608B	
+0x4F56	0x260A1	
+0x4F57	0x26095	
+0x4F58	0x26088	
+0x4F59	0x26086	
+0x4F5A	0x2608D	
+0x4F5B	0x26085	
+0x4F5C	0x26091	
+0x4F5D	0x26089	
+0x4F5E	0x260A2	
+0x4F5F	0x262F0	
+0x4F60	0x262F3	
+0x4F61	0x262F4	
+0x4F62	0x262EF	
+0x4F63	0x26306	
+0x4F64	0x263A2	
+0x4F65	0x2645E	
+0x4F66	0x26463	
+0x4F67	0x26460	
+0x4F68	0x2645B	
+0x4F69	0x2647B	
+0x4F6A	0x26458	
+0x4F6B	0x26459	
+0x4F6C	0x2645D	
+0x4F6D	0x26505	
+0x4F6E	0x26506	
+0x4F6F	0x26502	
+0x4F70	0x26503	
+0x4F71	0x26504	
+0x4F72	0x265A2	
+0x4F73	0x265A7	
+0x4F74	0x265A6	
+0x4F75	0x265A4	
+0x4F76	0x265AC	
+0x4F77	0x265A9	
+0x4F78	0x267E7	
+0x4F79	0x26801	
+0x4F7A	0x267DF	
+0x4F7B	0x267D9	
+0x4F7C	0x267E3	
+0x4F7D	0x2680F	
+0x4F7E	0x2691A	
+0x5021	0x26945	
+0x5022	0x26948	
+0x5023	0x2697B	
+0x5024	0x26985	
+0x5025	0x26986	
+0x5026	0x269FE	
+0x5027	0x269FF	
+0x5028	0x26A64	
+0x5029	0x26A71	
+0x502A	0x26A72	
+0x502B	0x26A61	
+0x502C	0x26A62	
+0x502D	0x26A6C	
+0x502E	0x26A60	
+0x502F	0x26A5D	
+0x5030	0x26A63	
+0x5031	0x26A67	
+0x5032	0x26E01	
+0x5033	0x26E2A	
+0x5034	0x26E30	
+0x5035	0x26E06	
+0x5036	0x26E7D	
+0x5037	0x26E22	
+0x5038	0x26EB9	
+0x5039	0x26E0A	
+0x503A	0x26E10	
+0x503B	0x26D8F	
+0x503C	0x26E80	
+0x503D	0x26E13	
+0x503E	0x26E2E	
+0x503F	0x26E18	
+0x5040	0x26E17	
+0x5041	0x26E1A	
+0x5042	0x26E14	
+0x5043	0x26E47	
+0x5044	0x26E63	
+0x5045	0x26E38	
+0x5047	0x26E7F	
+0x5048	0x26E21	
+0x5049	0x26E37	
+0x504A	0x26E31	
+0x504B	0x26E1B	
+0x504C	0x26EA5	
+0x504D	0x26F6C	
+0x504E	0x271D3	
+0x504F	0x27388	
+0x5050	0x2736E	
+0x5051	0x2735C	
+0x5052	0x27374	
+0x5053	0x27354	
+0x5054	0x27383	
+0x5056	0x27365	
+0x5057	0x27360	
+0x5058	0x27370	
+0x5059	0x2736F	
+0x505A	0x2736D	
+0x505B	0x27372	
+0x505C	0x2736C	
+0x505D	0x27376	
+0x505E	0x27375	
+0x505F	0x27359	
+0x5060	0x273C7	
+0x5061	0x275C1	
+0x5062	0x275F9	
+0x5063	0x276E3	
+0x5064	0x276E7	
+0x5065	0x276D6	
+0x5066	0x276CF	
+0x5067	0x276DA	
+0x5068	0x276E9	
+0x5069	0x276D2	
+0x506A	0x27855	
+0x506B	0x2784F	
+0x506C	0x2784D	
+0x506D	0x27851	
+0x506E	0x27856	
+0x506F	0x278F9	
+0x5070	0x278F8	
+0x5071	0x27906	
+0x5072	0x27903	
+0x5073	0x27909	
+0x5074	0x278F7	
+0x5075	0x278F5	
+0x5076	0x27A47	
+0x5077	0x27A45	
+0x5078	0x27A3E	
+0x5079	0x27A46	
+0x507A	0x27A29	
+0x507B	0x27A34	
+0x507C	0x27A3F	
+0x507D	0x27A44	
+0x507E	0x27A35	
+0x5121	0x27A5A	
+0x5122	0x27A2A	
+0x5123	0x27A33	
+0x5124	0x27A37	
+0x5125	0x27A43	
+0x5126	0x27A39	
+0x5127	0x27A30	
+0x5128	0x27A5D	
+0x5129	0x27A32	
+0x512A	0x27A27	
+0x512B	0x27BBD	
+0x512C	0x27BBA	
+0x512D	0x27BBC	
+0x512E	0x27BF1	
+0x512F	0x27BF0	
+0x5130	0x27C61	
+0x5131	0x27C5C	
+0x5132	0x27C58	
+0x5133	0x27C5D	
+0x5134	0x27CDA	
+0x5135	0x27CD9	
+0x5136	0x27CDD	
+0x5137	0x27CDC	
+0x5138	0x27CDE	
+0x513A	0x27DA0	
+0x513B	0x27DA2	
+0x513C	0x27F0F	
+0x513D	0x27F13	
+0x513E	0x27F12	
+0x513F	0x27F11	
+0x5140	0x27F14	
+0x5141	0x27F19	
+0x5142	0x27F0E	
+0x5143	0x27F17	
+0x5144	0x27F21	
+0x5145	0x27F20	
+0x5146	0x27F16	
+0x5147	0x28078	
+0x5149	0x28087	
+0x514A	0x28079	
+0x514B	0x28080	
+0x514C	0x28077	
+0x514D	0x28081	
+0x514E	0x28046	
+0x514F	0x2807A	
+0x5150	0x2809C	
+0x5151	0x28083	
+0x5152	0x28084	
+0x5153	0x280AD	
+0x5154	0x2809D	
+0x5155	0x2809E	
+0x5156	0x28255	
+0x5157	0x28336	
+0x5158	0x2832B	
+0x5159	0x28327	
+0x515A	0x28346	
+0x515B	0x2832C	
+0x515C	0x28345	
+0x515D	0x28333	
+0x515E	0x2832D	
+0x515F	0x28334	
+0x5160	0x28322	
+0x5162	0x2841F	
+0x5163	0x285B3	
+0x5164	0x2858C	
+0x5165	0x2858F	
+0x5166	0x285AF	
+0x5167	0x285AD	
+0x5168	0x2858E	
+0x5169	0x285AC	
+0x516A	0x285B0	
+0x516B	0x285B1	
+0x516C	0x285AE	
+0x516D	0x28599	
+0x516E	0x286EB	
+0x516F	0x28774	
+0x5170	0x28775	
+0x5171	0x2878E	
+0x5172	0x2876D	
+0x5173	0x28770	
+0x5174	0x2878C	
+0x5175	0x2884F	
+0x5176	0x28851	
+0x5177	0x28858	
+0x5178	0x2884C	
+0x5179	0x2884E	
+0x517A	0x28915	
+0x517B	0x289BE	
+0x517C	0x289DB	
+0x517D	0x289B3	
+0x517E	0x289AE	
+0x5221	0x28C87	
+0x5222	0x28C8A	
+0x5223	0x28C88	
+0x5224	0x28C8B	
+0x5225	0x28C8C	
+0x5226	0x28D44	
+0x5227	0x28D2D	
+0x5228	0x28D2A	
+0x5229	0x28D31	
+0x522A	0x28D2C	
+0x522B	0x28D45	
+0x522C	0x28D30	
+0x522D	0x28D29	
+0x522E	0x28D46	
+0x522F	0x28EF4	
+0x5230	0x28F14	
+0x5231	0x28F10	
+0x5232	0x28F0F	
+0x5233	0x28F12	
+0x5234	0x28F0B	
+0x5235	0x28F0C	
+0x5236	0x28F0A	
+0x5237	0x28F13	
+0x5238	0x28F0E	
+0x5239	0x28FD9	
+0x523A	0x28FD0	
+0x523C	0x290C1	
+0x523D	0x290BF	
+0x523E	0x290BD	
+0x523F	0x290BC	
+0x5240	0x290BA	
+0x5241	0x290BB	
+0x5242	0x290D1	
+0x5243	0x290BE	
+0x5244	0x290D0	
+0x5245	0x290B9	
+0x5246	0x2921A	
+0x5247	0x2921C	
+0x5248	0x2921B	
+0x5249	0x29291	
+0x524A	0x29296	
+0x524B	0x2929F	
+0x524C	0x2929C	
+0x524D	0x2929A	
+0x524E	0x2929D	
+0x524F	0x293AD	
+0x5250	0x293A5	
+0x5251	0x293AE	
+0x5252	0x29403	
+0x5253	0x29426	
+0x5254	0x29420	
+0x5255	0x29423	
+0x5256	0x29424	
+0x5257	0x29421	
+0x5258	0x29428	
+0x5259	0x29425	
+0x525A	0x2941E	
+0x525B	0x29494	
+0x525C	0x29493	
+0x525D	0x2948F	
+0x525E	0x2949A	
+0x525F	0x294AD	
+0x5261	0x295CA	
+0x5262	0x295C5	
+0x5263	0x296BB	
+0x5264	0x296E1	
+0x5265	0x296EA	
+0x5266	0x296E4	
+0x5267	0x296ED	
+0x5268	0x296E6	
+0x5269	0x296E0	
+0x526A	0x296E8	
+0x526B	0x296E5	
+0x526C	0x2981A	
+0x526D	0x29894	
+0x526E	0x29896	
+0x526F	0x2989E	
+0x5270	0x29895	
+0x5271	0x298A1	
+0x5272	0x2988E	
+0x5273	0x2989B	
+0x5274	0x29892	
+0x5275	0x29897	
+0x5276	0x29899	
+0x5277	0x29893	
+0x5278	0x29A32	
+0x5279	0x29A2F	
+0x527A	0x29A2E	
+0x527B	0x29A33	
+0x527C	0x29B1C	
+0x527D	0x29B1E	
+0x527E	0x29B11	
+0x5321	0x29B20	
+0x5322	0x29B1F	
+0x5323	0x29B19	
+0x5324	0x29B16	
+0x5325	0x29CAC	
+0x5326	0x29CB9	
+0x5327	0x29CB3	
+0x5328	0x29CA6	
+0x5329	0x29CA2	
+0x532A	0x29CA9	
+0x532B	0x29CA7	
+0x532C	0x29D6C	
+0x532D	0x29D6D	
+0x532E	0x29D69	
+0x532F	0x29D80	
+0x5330	0x29D66	
+0x5331	0x29D65	
+0x5332	0x29D71	
+0x5333	0x29D6B	
+0x5334	0x29FBD	
+0x5335	0x29FC1	
+0x5336	0x29FD3	
+0x5337	0x29FB6	
+0x5339	0x29FB9	
+0x533A	0x29FD4	
+0x533B	0x29FB7	
+0x533C	0x29FDB	
+0x533D	0x29FB8	
+0x533E	0x29FC0	
+0x533F	0x29FBC	
+0x5340	0x29FD5	
+0x5341	0x29FBF	
+0x5342	0x29FC3	
+0x5343	0x29FC9	
+0x5344	0x2A258	
+0x5345	0x2A290	
+0x5346	0x2A295	
+0x5347	0x2A297	
+0x5348	0x2A309	
+0x5349	0x2A308	
+0x534A	0x2A306	
+0x534B	0x2A305	
+0x534C	0x2A310	
+0x534D	0x2A397	
+0x534E	0x2A395	
+0x534F	0x2A3EE	
+0x5350	0x2A41F	
+0x5351	0x2FA1A	
+0x5352	0x21B4B	
+0x5353	0x2018E	
+0x5354	0x203E8	
+0x5355	0x203F0	
+0x5356	0x203F4	
+0x5357	0x20406	
+0x5358	0x203ED	
+0x535A	0x203E9	
+0x535B	0x20400	
+0x535C	0x204B8	
+0x535D	0x2056D	
+0x535E	0x20804	
+0x535F	0x20801	
+0x5360	0x20803	
+0x5361	0x20802	
+0x5364	0x20962	
+0x5365	0x20ABA	
+0x5366	0x20B13	
+0x5367	0x20FDE	
+0x5368	0x20FD7	
+0x5369	0x20FE4	
+0x536A	0x20FCE	
+0x536B	0x20FE3	
+0x536C	0x20FDD	
+0x536D	0x2103A	
+0x536E	0x20FDB	
+0x536F	0x20FD6	
+0x5370	0x20FE0	
+0x5371	0x20FD4	
+0x5372	0x20FCB	
+0x5373	0x20FE1	
+0x5374	0x20FC9	
+0x5375	0x20FDF	
+0x5376	0x2103C	
+0x5377	0x20FFC	
+0x5378	0x20FCF	
+0x5379	0x21479	
+0x537A	0x21476	
+0x537B	0x21478	
+0x537C	0x21687	
+0x537D	0x2189C	
+0x537E	0x218B1	
+0x5421	0x218C1	
+0x5422	0x2189A	
+0x5423	0x21892	
+0x5425	0x218C2	
+0x5426	0x21896	
+0x5427	0x218C0	
+0x5428	0x21891	
+0x5429	0x21895	
+0x542A	0x219A2	
+0x542B	0x21AC3	
+0x542C	0x21AC0	
+0x542D	0x21AC2	
+0x542E	0x20B8A	
+0x542F	0x21BB0	
+0x5430	0x21C16	
+0x5431	0x21F46	
+0x5432	0x21F4A	
+0x5433	0x21F3E	
+0x5434	0x21F45	
+0x5435	0x21F42	
+0x5437	0x21F5B	
+0x5438	0x21F44	
+0x5439	0x22004	
+0x543A	0x24022	
+0x543B	0x22155	
+0x543C	0x22157	
+0x543D	0x22151	
+0x543E	0x2214E	
+0x543F	0x2215A	
+0x5440	0x222C6	
+0x5441	0x222C3	
+0x5443	0x222C5	
+0x5444	0x222CC	
+0x5445	0x22371	
+0x5446	0x22426	
+0x5447	0x224B2	
+0x5448	0x2257A	
+0x5449	0x22584	
+0x544A	0x2257B	
+0x544B	0x22874	
+0x544C	0x2288C	
+0x544D	0x22851	
+0x544E	0x22848	
+0x544F	0x2288D	
+0x5450	0x22892	
+0x5451	0x22898	
+0x5452	0x22893	
+0x5453	0x228B0	
+0x5454	0x2284E	
+0x5455	0x22896	
+0x5456	0x22897	
+0x5457	0x2289C	
+0x5458	0x228CA	
+0x5459	0x22D33	
+0x545A	0x22D83	
+0x545B	0x22D84	
+0x545C	0x22D9A	
+0x545D	0x22D8C	
+0x545F	0x22D99	
+0x5460	0x22EE0	
+0x5461	0x22FE4	
+0x5462	0x22FF8	
+0x5463	0x22FED	
+0x5464	0x22FF3	
+0x5465	0x22FF4	
+0x5466	0x22FF5	
+0x5467	0x22FFD	
+0x5468	0x23119	
+0x5469	0x2329E	
+0x546A	0x232C4	
+0x546B	0x2329F	
+0x546C	0x2339B	
+0x546D	0x2339F	
+0x546E	0x2339A	
+0x546F	0x236AA	
+0x5470	0x2369D	
+0x5471	0x23692	
+0x5472	0x236A2	
+0x5473	0x236AF	
+0x5474	0x236EB	
+0x5475	0x236A0	
+0x5476	0x236A1	
+0x5477	0x23694	
+0x5478	0x23698	
+0x5479	0x2368F	
+0x547A	0x23687	
+0x547B	0x23684	
+0x547C	0x236A9	
+0x547D	0x2367C	
+0x547E	0x23918	
+0x5521	0x23A5F	
+0x5522	0x23A62	
+0x5523	0x23A61	
+0x5524	0x23AC0	
+0x5525	0x23B15	
+0x5526	0x23BFC	
+0x5527	0x23BF9	
+0x5528	0x23FC8	
+0x5529	0x23FC9	
+0x552A	0x23FDE	
+0x552B	0x23FCA	
+0x552C	0x23FE2	
+0x552F	0x24004	
+0x5530	0x23FCC	
+0x5531	0x23FDD	
+0x5532	0x23FE4	
+0x5533	0x23FD3	
+0x5534	0x23FC7	
+0x5535	0x23FC6	
+0x5537	0x24037	
+0x5538	0x243D8	
+0x5539	0x243EE	
+0x553A	0x243B2	
+0x553B	0x243A3	
+0x553C	0x243B3	
+0x553D	0x243ED	
+0x553E	0x243F8	
+0x553F	0x24531	
+0x5540	0x2455B	
+0x5541	0x24566	
+0x5542	0x24569	
+0x5543	0x24596	
+0x5544	0x2459B	
+0x5545	0x245F7	
+0x5546	0x245F3	
+0x5547	0x245F4	
+0x5548	0x245F5	
+0x5549	0x246E2	
+0x554A	0x246E7	
+0x554B	0x246E5	
+0x554C	0x246E9	
+0x554D	0x246E6	
+0x554E	0x246E3	
+0x554F	0x24874	
+0x5550	0x2487F	
+0x5551	0x2488F	
+0x5552	0x24890	
+0x5553	0x24897	
+0x5554	0x248A3	
+0x5555	0x2488E	
+0x5556	0x24898	
+0x5557	0x2488C	
+0x5558	0x24A42	
+0x5559	0x24A44	
+0x555A	0x24A69	
+0x555B	0x24A43	
+0x555C	0x24A68	
+0x555E	0x24B8D	
+0x555F	0x24B88	
+0x5560	0x24B8B	
+0x5561	0x24B89	
+0x5562	0x24CCC	
+0x5563	0x24D1F	
+0x5564	0x24E80	
+0x5565	0x24E5E	
+0x5566	0x24E67	
+0x5567	0x24E68	
+0x5568	0x24E65	
+0x556A	0x24E74	
+0x556B	0x24E69	
+0x556C	0x24E61	
+0x556D	0x24E62	
+0x556E	0x24E6C	
+0x556F	0x24E93	
+0x5570	0x24E86	
+0x5571	0x24F9D	
+0x5572	0x24F9B	
+0x5573	0x2501B	
+0x5574	0x25016	
+0x5575	0x25019	
+0x5576	0x25014	
+0x5577	0x25018	
+0x5578	0x25015	
+0x5579	0x25099	
+0x557A	0x25098	
+0x557B	0x2525D	
+0x557C	0x25289	
+0x557D	0x2527A	
+0x557E	0x2527D	
+0x5621	0x2524B	
+0x5623	0x25278	
+0x5624	0x2527F	
+0x5625	0x25277	
+0x5626	0x2527E	
+0x5627	0x25279	
+0x5628	0x252AB	
+0x5629	0x2527C	
+0x562A	0x25274	
+0x562B	0x25275	
+0x562C	0x252A7	
+0x562D	0x2538D	
+0x562E	0x2554E	
+0x562F	0x25566	
+0x5630	0x25561	
+0x5631	0x2554D	
+0x5632	0x2554F	
+0x5634	0x25554	
+0x5635	0x2557C	
+0x5636	0x256DA	
+0x5637	0x256DE	
+0x5638	0x256D8	
+0x5639	0x256DD	
+0x563A	0x256DF	
+0x563B	0x25866	
+0x563C	0x25862	
+0x563D	0x2585F	
+0x563E	0x25864	
+0x563F	0x25863	
+0x5640	0x25860	
+0x5641	0x25888	
+0x5642	0x2586A	
+0x5643	0x25867	
+0x5644	0x25887	
+0x5645	0x2583F	
+0x5646	0x2586C	
+0x5647	0x2586E	
+0x5648	0x258AD	
+0x5649	0x259F1	
+0x564A	0x259F4	
+0x564B	0x259F6	
+0x564C	0x259F5	
+0x564D	0x259F8	
+0x564E	0x259FB	
+0x564F	0x259EC	
+0x5650	0x259EF	
+0x5651	0x259ED	
+0x5653	0x259F7	
+0x5654	0x259F9	
+0x5655	0x259FD	
+0x5656	0x25AB1	
+0x5657	0x25C36	
+0x5658	0x25C1B	
+0x5659	0x25C32	
+0x565A	0x25C42	
+0x565B	0x25C4D	
+0x565C	0x25C1F	
+0x565D	0x25C21	
+0x565E	0x25C1C	
+0x565F	0x25C31	
+0x5660	0x25C2E	
+0x5661	0x25C47	
+0x5662	0x25C3B	
+0x5663	0x25C41	
+0x5664	0x25C18	
+0x5665	0x25C39	
+0x5666	0x25C1D	
+0x5667	0x25C27	
+0x5668	0x25C23	
+0x566A	0x25EEE	
+0x566B	0x25EE8	
+0x566C	0x25EE5	
+0x566D	0x25EEF	
+0x566E	0x25EE4	
+0x566F	0x25EEC	
+0x5670	0x25EF0	
+0x5671	0x260D7	
+0x5672	0x260D8	
+0x5673	0x260D4	
+0x5674	0x260CA	
+0x5675	0x260D2	
+0x5676	0x260CB	
+0x5677	0x260D3	
+0x5678	0x260E6	
+0x5679	0x260E2	
+0x567A	0x26249	
+0x567B	0x26248	
+0x567C	0x262FF	
+0x567D	0x26309	
+0x567E	0x263B0	
+0x5721	0x263AF	
+0x5722	0x2647C	
+0x5723	0x26478	
+0x5724	0x2647A	
+0x5725	0x26472	
+0x5726	0x26479	
+0x5727	0x2647E	
+0x5728	0x2650C	
+0x5729	0x2650B	
+0x572A	0x265CD	
+0x572B	0x265BE	
+0x572C	0x265BC	
+0x572D	0x265BF	
+0x572E	0x265C0	
+0x572F	0x265BD	
+0x5730	0x26838	
+0x5731	0x26808	
+0x5732	0x26805	
+0x5733	0x2683B	
+0x5734	0x26810	
+0x5735	0x2680C	
+0x5736	0x2680D	
+0x5737	0x26804	
+0x5738	0x2683A	
+0x5739	0x26813	
+0x573A	0x26837	
+0x573B	0x26839	
+0x573C	0x2691F	
+0x573D	0x2694B	
+0x573E	0x269EE	
+0x573F	0x26A75	
+0x5740	0x26A78	
+0x5741	0x26A7C	
+0x5742	0x26A74	
+0x5743	0x26A76	
+0x5744	0x26AEA	
+0x5745	0x26AEB	
+0x5746	0x26DFB	
+0x5747	0x26E19	
+0x5748	0x26EA7	
+0x5749	0x26E8C	
+0x574A	0x26EDC	
+0x574B	0x26E98	
+0x574C	0x26EBE	
+0x574D	0x26E9E	
+0x574E	0x26F0F	
+0x574F	0x26E9F	
+0x5750	0x26EDD	
+0x5751	0x26E93	
+0x5752	0x26EBB	
+0x5753	0x26EB6	
+0x5754	0x26E90	
+0x5755	0x26EA1	
+0x5756	0x26EBD	
+0x5757	0x26EDE	
+0x5758	0x26E3A	
+0x5759	0x26F22	
+0x575A	0x26E97	
+0x575B	0x26E94	
+0x575C	0x26EC3	
+0x575D	0x26E8E	
+0x575E	0x26EA8	
+0x575F	0x26E99	
+0x5760	0x26EAD	
+0x5761	0x26E9B	
+0x5762	0x26EA2	
+0x5763	0x26F21	
+0x5764	0x26EAC	
+0x5765	0x26F0E	
+0x5766	0x26F31	
+0x5767	0x271E1	
+0x5768	0x271DE	
+0x5769	0x271DF	
+0x576A	0x271DC	
+0x576B	0x271DD	
+0x576C	0x271EC	
+0x576D	0x271E7	
+0x576E	0x27369	
+0x576F	0x273B8	
+0x5770	0x273A1	
+0x5771	0x273A8	
+0x5772	0x273BA	
+0x5773	0x273C2	
+0x5774	0x273A6	
+0x5775	0x273A4	
+0x5776	0x273A3	
+0x5777	0x273AB	
+0x5778	0x273BC	
+0x5779	0x273B7	
+0x577A	0x273BF	
+0x577B	0x273AD	
+0x577C	0x273B1	
+0x577D	0x273CA	
+0x577E	0x273C4	
+0x5821	0x273B9	
+0x5822	0x275C8	
+0x5823	0x275C6	
+0x5824	0x275C7	
+0x5825	0x2770A	
+0x5826	0x2770D	
+0x5827	0x276FB	
+0x5828	0x27703	
+0x5829	0x27702	
+0x582A	0x276FC	
+0x582B	0x276F9	
+0x582C	0x276F8	
+0x582D	0x2786E	
+0x582E	0x27863	
+0x582F	0x27862	
+0x5830	0x27861	
+0x5831	0x2786B	
+0x5833	0x2786F	
+0x5834	0x27866	
+0x5835	0x2786C	
+0x5836	0x2790E	
+0x5837	0x27915	
+0x5838	0x27916	
+0x5839	0x27910	
+0x583A	0x27917	
+0x583B	0x27911	
+0x583C	0x27A6E	
+0x583D	0x27A6C	
+0x583E	0x27A87	
+0x583F	0x27A83	
+0x5840	0x27A63	
+0x5841	0x27ADC	
+0x5842	0x27BC0	
+0x5843	0x27BF7	
+0x5844	0x27BFA	
+0x5845	0x27C70	
+0x5846	0x27C6A	
+0x5847	0x27C68	
+0x5848	0x27C69	
+0x5849	0x27C84	
+0x584A	0x27CEC	
+0x584B	0x27CE7	
+0x584C	0x27CEE	
+0x584D	0x27DBA	
+0x584E	0x27DB2	
+0x584F	0x27DB5	
+0x5850	0x27DCB	
+0x5851	0x2080B	
+0x5852	0x27DD0	
+0x5853	0x27E6D	
+0x5854	0x27E6C	
+0x5856	0x27F45	
+0x5857	0x27F46	
+0x5858	0x27F34	
+0x5859	0x27F2C	
+0x585A	0x27F35	
+0x585B	0x27F44	
+0x585D	0x27F76	
+0x585E	0x280B1	
+0x585F	0x280AA	
+0x5860	0x280A1	
+0x5861	0x280B2	
+0x5863	0x280A6	
+0x5864	0x280B5	
+0x5865	0x280B4	
+0x5866	0x280B8	
+0x5867	0x280AF	
+0x5868	0x280B0	
+0x5869	0x280A3	
+0x586A	0x28262	
+0x586B	0x28264	
+0x586C	0x28356	
+0x586D	0x28351	
+0x586E	0x2834F	
+0x586F	0x28368	
+0x5870	0x2834C	
+0x5871	0x28350	
+0x5873	0x28348	
+0x5874	0x2834A	
+0x5875	0x28421	
+0x5876	0x285E3	
+0x5877	0x285B9	
+0x5878	0x285DE	
+0x5879	0x285B7	
+0x587A	0x285E1	
+0x587B	0x285B6	
+0x587C	0x285B5	
+0x587D	0x285DF	
+0x5921	0x28797	
+0x5922	0x2879A	
+0x5923	0x2879B	
+0x5924	0x28798	
+0x5925	0x28792	
+0x5926	0x28793	
+0x5927	0x287D7	
+0x5928	0x28773	
+0x5929	0x2886B	
+0x592A	0x28874	
+0x592B	0x28878	
+0x592C	0x2886D	
+0x592D	0x28918	
+0x592E	0x289E9	
+0x592F	0x289F5	
+0x5930	0x289EA	
+0x5931	0x28A2E	
+0x5932	0x289E7	
+0x5933	0x289FE	
+0x5934	0x289E5	
+0x5935	0x28A36	
+0x5936	0x289F0	
+0x5937	0x289E6	
+0x5938	0x28A2C	
+0x5939	0x28C89	
+0x593A	0x28C95	
+0x593B	0x28C93	
+0x593C	0x28D4D	
+0x593D	0x28D4A	
+0x593E	0x28D4F	
+0x593F	0x28D50	
+0x5940	0x28D4B	
+0x5941	0x28F2A	
+0x5942	0x28F2B	
+0x5943	0x28F2F	
+0x5944	0x28F2E	
+0x5945	0x28F7C	
+0x5946	0x28FED	
+0x5947	0x28FE2	
+0x5948	0x290E0	
+0x5949	0x290DC	
+0x594A	0x290DA	
+0x594B	0x290D6	
+0x594C	0x290F4	
+0x594D	0x290D9	
+0x594E	0x290D5	
+0x594F	0x29222	
+0x5950	0x29221	
+0x5951	0x29224	
+0x5952	0x29225	
+0x5953	0x29226	
+0x5954	0x29223	
+0x5955	0x292AA	
+0x5956	0x292AF	
+0x5957	0x292B0	
+0x5958	0x292AB	
+0x5959	0x293AF	
+0x595A	0x293B7	
+0x595B	0x293B5	
+0x595C	0x293B2	
+0x595D	0x293B3	
+0x595E	0x2942B	
+0x595F	0x294D8	
+0x5960	0x294C2	
+0x5961	0x294AF	
+0x5962	0x294BC	
+0x5963	0x294B8	
+0x5964	0x294BE	
+0x5965	0x294B7	
+0x5966	0x294B4	
+0x5967	0x294BF	
+0x5968	0x294B3	
+0x5969	0x294B1	
+0x596A	0x294BB	
+0x596B	0x294BD	
+0x596C	0x294D6	
+0x596D	0x294DD	
+0x596E	0x295D8	
+0x596F	0x295D3	
+0x5970	0x295D5	
+0x5971	0x295E3	
+0x5972	0x295E2	
+0x5973	0x295D9	
+0x5974	0x295DE	
+0x5975	0x295DF	
+0x5976	0x295DA	
+0x5977	0x295D4	
+0x5978	0x296F3	
+0x5979	0x296E2	
+0x597A	0x2970D	
+0x597B	0x29701	
+0x597C	0x29705	
+0x597D	0x2971A	
+0x597E	0x29703	
+0x5A21	0x2971F	
+0x5A22	0x29716	
+0x5A23	0x296FA	
+0x5A24	0x296FC	
+0x5A25	0x2970A	
+0x5A27	0x298BC	
+0x5A28	0x298CA	
+0x5A29	0x298B6	
+0x5A2A	0x298C7	
+0x5A2B	0x298BF	
+0x5A2D	0x298B9	
+0x5A2F	0x298B0	
+0x5A30	0x298B8	
+0x5A31	0x298BD	
+0x5A32	0x29891	
+0x5A33	0x298BB	
+0x5A34	0x298BE	
+0x5A35	0x29A3E	
+0x5A36	0x29A3D	
+0x5A37	0x29B38	
+0x5A38	0x29B3D	
+0x5A39	0x29B39	
+0x5A3A	0x29B33	
+0x5A3B	0x29C33	
+0x5A3C	0x29CBB	
+0x5A3D	0x29CC6	
+0x5A3E	0x29CC5	
+0x5A3F	0x29CC7	
+0x5A40	0x29CCB	
+0x5A41	0x29CA8	
+0x5A42	0x29CC8	
+0x5A43	0x29CBE	
+0x5A44	0x29CC1	
+0x5A45	0x29CBD	
+0x5A46	0x29D82	
+0x5A47	0x29D9E	
+0x5A48	0x29D81	
+0x5A49	0x29D84	
+0x5A4B	0x29D96	
+0x5A4C	0x29D8E	
+0x5A4D	0x29D88	
+0x5A4E	0x29D87	
+0x5A4F	0x29FE0	
+0x5A50	0x2A00D	
+0x5A51	0x29FDF	
+0x5A52	0x29FE4	
+0x5A53	0x29FE2	
+0x5A54	0x29FDD	
+0x5A55	0x29FEC	
+0x5A56	0x29FDE	
+0x5A57	0x29FE7	
+0x5A58	0x29FEA	
+0x5A59	0x29FE3	
+0x5A5A	0x2A25C	
+0x5A5C	0x2A25D	
+0x5A5D	0x2A29C	
+0x5A5E	0x2A31D	
+0x5A5F	0x2A39D	
+0x5A60	0x2A39E	
+0x5A61	0x2A39B	
+0x5A62	0x2A3B5	
+0x5A63	0x2A3B9	
+0x5A64	0x2A3B6	
+0x5A65	0x2A3F3	
+0x5A66	0x2A3F2	
+0x5A67	0x2A3F4	
+0x5A68	0x2A426	
+0x5A69	0x2A427	
+0x5A6A	0x2A425	
+0x5A6B	0x2A506	
+0x5A6C	0x2A50B	
+0x5A6D	0x2A53A	
+0x5A6E	0x2A53C	
+0x5A6F	0x2040A	
+0x5A70	0x2040B	
+0x5A71	0x204BF	
+0x5A72	0x204FD	
+0x5A73	0x20618	
+0x5A74	0x291DF	
+0x5A75	0x25390	
+0x5A76	0x2069E	
+0x5A77	0x207FC	
+0x5A78	0x20810	
+0x5A79	0x2080F	
+0x5A7A	0x2080D	
+0x5A7B	0x208B9	
+0x5A7C	0x208B7	
+0x5A7D	0x208BA	
+0x5A7E	0x2090A	
+0x5B21	0x21041	
+0x5B22	0x2108B	
+0x5B23	0x21046	
+0x5B24	0x21053	
+0x5B25	0x210E2	
+0x5B26	0x2103F	
+0x5B27	0x20F7C	
+0x5B28	0x2104B	
+0x5B29	0x2104E	
+0x5B2A	0x2108A	
+0x5B2B	0x21047	
+0x5B2C	0x21493	
+0x5B2D	0x27DCE	
+0x5B2E	0x2148C	
+0x5B2F	0x214AF	
+0x5B30	0x214C9	
+0x5B31	0x215C6	
+0x5B32	0x215C8	
+0x5B33	0x21691	
+0x5B34	0x218CF	
+0x5B35	0x218D4	
+0x5B36	0x218CE	
+0x5B37	0x21ADD	
+0x5B38	0x21AD4	
+0x5B39	0x21F49	
+0x5B3A	0x21F63	
+0x5B3B	0x21F5D	
+0x5B3D	0x21F67	
+0x5B3E	0x21FBB	
+0x5B3F	0x21F60	
+0x5B40	0x21F80	
+0x5B41	0x2215F	
+0x5B42	0x22160	
+0x5B43	0x222DA	
+0x5B44	0x222D2	
+0x5B45	0x222DD	
+0x5B46	0x2258E	
+0x5B47	0x22588	
+0x5B48	0x2256C	
+0x5B49	0x2289E	
+0x5B4A	0x228C9	
+0x5B4B	0x228A4	
+0x5B4D	0x228D9	
+0x5B4E	0x228D2	
+0x5B4F	0x228DA	
+0x5B50	0x228DD	
+0x5B51	0x228CE	
+0x5B52	0x228FC	
+0x5B53	0x22A14	
+0x5B54	0x22A60	
+0x5B55	0x22DD7	
+0x5B56	0x22DCB	
+0x5B57	0x22DCD	
+0x5B58	0x22DD5	
+0x5B59	0x22EE7	
+0x5B5A	0x23000	
+0x5B5B	0x2300A	
+0x5B5C	0x2300F	
+0x5B5D	0x23002	
+0x5B5E	0x23001	
+0x5B5F	0x2311D	
+0x5B60	0x232CA	
+0x5B61	0x232CB	
+0x5B62	0x232CD	
+0x5B63	0x2334F	
+0x5B64	0x2339C	
+0x5B65	0x23680	
+0x5B66	0x2370D	
+0x5B67	0x23702	
+0x5B69	0x23707	
+0x5B6A	0x236F7	
+0x5B6B	0x236F8	
+0x5B6C	0x236FD	
+0x5B6D	0x23724	
+0x5B6E	0x236FB	
+0x5B6F	0x23739	
+0x5B70	0x2373A	
+0x5B71	0x23922	
+0x5B73	0x23A6A	
+0x5B74	0x23A6D	
+0x5B75	0x23A74	
+0x5B76	0x23C0E	
+0x5B77	0x23FDF	
+0x5B78	0x2402B	
+0x5B79	0x23FE3	
+0x5B7A	0x24026	
+0x5B7B	0x2402A	
+0x5B7C	0x24023	
+0x5B7D	0x24035	
+0x5B7E	0x2404A	
+0x5C21	0x243FD	
+0x5C22	0x24400	
+0x5C23	0x2441E	
+0x5C24	0x243FF	
+0x5C25	0x2459E	
+0x5C26	0x245FA	
+0x5C27	0x246F1	
+0x5C28	0x24895	
+0x5C29	0x248A8	
+0x5C2A	0x248A6	
+0x5C2B	0x24A6E	
+0x5C2C	0x24A83	
+0x5C2D	0x24A6D	
+0x5C2E	0x24B8F	
+0x5C30	0x24CDF	
+0x5C31	0x24CD5	
+0x5C32	0x24CE0	
+0x5C33	0x24CD3	
+0x5C34	0x24CD8	
+0x5C35	0x24E8C	
+0x5C37	0x24E94	
+0x5C38	0x24E96	
+0x5C39	0x24E85	
+0x5C3A	0x24E8F	
+0x5C3B	0x24EA9	
+0x5C3C	0x24E8E	
+0x5C3D	0x24E90	
+0x5C3E	0x24EB8	
+0x5C3F	0x24EC3	
+0x5C40	0x24EBB	
+0x5C41	0x24FA5	
+0x5C42	0x24FA2	
+0x5C44	0x24FA3	
+0x5C45	0x250B5	
+0x5C46	0x250AC	
+0x5C47	0x250A8	
+0x5C48	0x252AD	
+0x5C49	0x252B8	
+0x5C4A	0x252B4	
+0x5C4B	0x252AE	
+0x5C4C	0x252B6	
+0x5C4E	0x252C1	
+0x5C4F	0x252BF	
+0x5C50	0x25392	
+0x5C51	0x25400	
+0x5C52	0x25401	
+0x5C53	0x25575	
+0x5C54	0x25572	
+0x5C55	0x25578	
+0x5C56	0x25570	
+0x5C57	0x2557E	
+0x5C58	0x2557D	
+0x5C59	0x2557F	
+0x5C5A	0x256EF	
+0x5C5B	0x2586D	
+0x5C5C	0x2588E	
+0x5C5D	0x2588F	
+0x5C5E	0x2588A	
+0x5C5F	0x2588D	
+0x5C60	0x25895	
+0x5C61	0x2588B	
+0x5C62	0x2588C	
+0x5C63	0x258B0	
+0x5C64	0x25893	
+0x5C65	0x259FC	
+0x5C66	0x25A15	
+0x5C67	0x25A0E	
+0x5C68	0x25A18	
+0x5C69	0x25A11	
+0x5C6A	0x25A0D	
+0x5C6B	0x25ABB	
+0x5C6C	0x25AB3	
+0x5C6E	0x25CA1	
+0x5C6F	0x25C9A	
+0x5C70	0x25C84	
+0x5C71	0x25CA0	
+0x5C72	0x25C86	
+0x5C73	0x25C9D	
+0x5C74	0x25CAA	
+0x5C75	0x25C78	
+0x5C76	0x25C8D	
+0x5C77	0x25C8A	
+0x5C78	0x25CA6	
+0x5C79	0x25C7A	
+0x5C7A	0x25C97	
+0x5C7B	0x25C88	
+0x5C7C	0x25C8E	
+0x5D21	0x25C76	
+0x5D22	0x25C81	
+0x5D23	0x25C85	
+0x5D24	0x25C75	
+0x5D25	0x25CA8	
+0x5D26	0x25C8F	
+0x5D27	0x25C91	
+0x5D28	0x25CA2	
+0x5D29	0x25C9C	
+0x5D2A	0x25C89	
+0x5D2B	0x25C7F	
+0x5D2C	0x25C96	
+0x5D2D	0x25C79	
+0x5D2E	0x25C9F	
+0x5D2F	0x25CA7	
+0x5D31	0x25C87	
+0x5D32	0x25C9B	
+0x5D33	0x25CA5	
+0x5D34	0x25C8B	
+0x5D35	0x25CC9	
+0x5D36	0x25EFF	
+0x5D37	0x25F03	
+0x5D38	0x25F00	
+0x5D39	0x25F02	
+0x5D3A	0x25F04	
+0x5D3B	0x25F05	
+0x5D3C	0x25EE6	
+0x5D3D	0x25F1F	
+0x5D3E	0x26114	
+0x5D40	0x2610C	
+0x5D41	0x2610F	
+0x5D42	0x26119	
+0x5D43	0x2610B	
+0x5D44	0x26113	
+0x5D45	0x260D5	
+0x5D47	0x2611C	
+0x5D48	0x26250	
+0x5D49	0x2624E	
+0x5D4A	0x26312	
+0x5D4B	0x263B9	
+0x5D4C	0x26485	
+0x5D4D	0x26488	
+0x5D4E	0x26490	
+0x5D4F	0x26513	
+0x5D50	0x265D0	
+0x5D51	0x265D1	
+0x5D52	0x265D2	
+0x5D53	0x265D7	
+0x5D54	0x265D6	
+0x5D55	0x265E5	
+0x5D56	0x26846	
+0x5D57	0x2686B	
+0x5D58	0x26845	
+0x5D59	0x2683F	
+0x5D5A	0x2683E	
+0x5D5C	0x2686A	
+0x5D5D	0x26868	
+0x5D5E	0x2684C	
+0x5D5F	0x26923	
+0x5D60	0x26922	
+0x5D61	0x26997	
+0x5D62	0x26991	
+0x5D63	0x25AB5	
+0x5D64	0x26998	
+0x5D65	0x2699C	
+0x5D66	0x26A89	
+0x5D68	0x26A8B	
+0x5D69	0x26A8A	
+0x5D6A	0x26A8D	
+0x5D6B	0x26A8E	
+0x5D6C	0x26A88	
+0x5D6D	0x26F4E	
+0x5D6E	0x26F44	
+0x5D6F	0x26F37	
+0x5D70	0x26F75	
+0x5D71	0x26F54	
+0x5D72	0x26F76	
+0x5D73	0x26F34	
+0x5D74	0x26F6B	
+0x5D75	0x26F32	
+0x5D76	0x26F57	
+0x5D77	0x26F52	
+0x5D78	0x26F45	
+0x5D7A	0x26EB1	
+0x5D7B	0x26F4B	
+0x5D7C	0x26F47	
+0x5D7D	0x26F33	
+0x5D7E	0x26F40	
+0x5E21	0x26F3C	
+0x5E22	0x26F43	
+0x5E23	0x26F4F	
+0x5E24	0x26F55	
+0x5E25	0x26F41	
+0x5E26	0x26FB2	
+0x5E27	0x26FC0	
+0x5E28	0x27434	
+0x5E29	0x273F9	
+0x5E2A	0x27419	
+0x5E2B	0x2740D	
+0x5E2C	0x273FA	
+0x5E2D	0x2741E	
+0x5E2E	0x2741F	
+0x5E2F	0x2740E	
+0x5E30	0x27440	
+0x5E31	0x27408	
+0x5E33	0x27413	
+0x5E34	0x2744C	
+0x5E36	0x275CC	
+0x5E37	0x275CB	
+0x5E38	0x27724	
+0x5E39	0x27725	
+0x5E3A	0x2773D	
+0x5E3B	0x27720	
+0x5E3C	0x27727	
+0x5E3D	0x27726	
+0x5E3E	0x2771D	
+0x5E3F	0x2771E	
+0x5E40	0x27732	
+0x5E41	0x2776C	
+0x5E42	0x27759	
+0x5E44	0x2787A	
+0x5E45	0x27879	
+0x5E46	0x2791B	
+0x5E47	0x2792E	
+0x5E48	0x27923	
+0x5E49	0x27920	
+0x5E4A	0x2791F	
+0x5E4B	0x27AB6	
+0x5E4C	0x27AB9	
+0x5E4D	0x27AA1	
+0x5E4E	0x27AA3	
+0x5E4F	0x27AA8	
+0x5E50	0x27AAF	
+0x5E51	0x27A9A	
+0x5E52	0x27A99	
+0x5E53	0x27AA2	
+0x5E54	0x27A9D	
+0x5E56	0x27AAB	
+0x5E57	0x27BC9	
+0x5E58	0x27BFE	
+0x5E59	0x27C00	
+0x5E5A	0x27BFC	
+0x5E5B	0x27C07	
+0x5E5C	0x27C75	
+0x5E5D	0x27C72	
+0x5E5E	0x27C73	
+0x5E5F	0x27C74	
+0x5E60	0x27CFA	
+0x5E61	0x27CFC	
+0x5E62	0x27CF8	
+0x5E63	0x27CF6	
+0x5E64	0x27CFB	
+0x5E65	0x27DCD	
+0x5E66	0x27DD1	
+0x5E67	0x27DCF	
+0x5E68	0x27E74	
+0x5E69	0x27E72	
+0x5E6A	0x27E73	
+0x5E6B	0x27F54	
+0x5E6C	0x27F51	
+0x5E6E	0x27F53	
+0x5E6F	0x27F49	
+0x5E70	0x27F4C	
+0x5E71	0x27F4A	
+0x5E72	0x27F4F	
+0x5E73	0x27F56	
+0x5E74	0x28100	
+0x5E75	0x280D5	
+0x5E76	0x280D7	
+0x5E77	0x280FF	
+0x5E78	0x280D9	
+0x5E79	0x280E3	
+0x5E7A	0x280D3	
+0x5E7C	0x280D8	
+0x5E7D	0x280D4	
+0x5E7E	0x280DE	
+0x5F21	0x28271	
+0x5F22	0x28374	
+0x5F23	0x28388	
+0x5F24	0x2837F	
+0x5F25	0x2836B	
+0x5F26	0x28387	
+0x5F27	0x28379	
+0x5F28	0x28378	
+0x5F29	0x28389	
+0x5F2A	0x28380	
+0x5F2B	0x28376	
+0x5F2C	0x28429	
+0x5F2D	0x28428	
+0x5F2E	0x2842F	
+0x5F2F	0x285E5	
+0x5F30	0x28604	
+0x5F31	0x28603	
+0x5F32	0x285F0	
+0x5F33	0x285E8	
+0x5F34	0x285EA	
+0x5F35	0x285F1	
+0x5F36	0x28601	
+0x5F37	0x28602	
+0x5F38	0x287A9	
+0x5F39	0x287AB	
+0x5F3A	0x287B7	
+0x5F3B	0x287B6	
+0x5F3D	0x288A0	
+0x5F3E	0x2888E	
+0x5F3F	0x28886	
+0x5F40	0x28887	
+0x5F41	0x28885	
+0x5F42	0x2888B	
+0x5F43	0x28888	
+0x5F44	0x28890	
+0x5F45	0x2891A	
+0x5F46	0x28934	
+0x5F47	0x28A37	
+0x5F48	0x28A2F	
+0x5F49	0x28A30	
+0x5F4A	0x28A39	
+0x5F4B	0x28A34	
+0x5F4C	0x28A33	
+0x5F4D	0x28A85	
+0x5F4E	0x28A84	
+0x5F4F	0x28A3A	
+0x5F50	0x28C9F	
+0x5F51	0x28D69	
+0x5F52	0x28D6C	
+0x5F53	0x28D6A	
+0x5F54	0x28D67	
+0x5F55	0x28D6B	
+0x5F56	0x28F3F	
+0x5F57	0x28F40	
+0x5F58	0x2900B	
+0x5F59	0x290D2	
+0x5F5A	0x290F8	
+0x5F5B	0x29101	
+0x5F5C	0x290FA	
+0x5F5D	0x29116	
+0x5F5E	0x2F9F6	
+0x5F5F	0x2922C	
+0x5F60	0x2922D	
+0x5F61	0x2922F	
+0x5F62	0x2922E	
+0x5F63	0x292C1	
+0x5F64	0x292F5	
+0x5F65	0x292C4	
+0x5F66	0x292DE	
+0x5F67	0x292CC	
+0x5F68	0x292D2	
+0x5F69	0x292C2	
+0x5F6A	0x292CD	
+0x5F6B	0x292CF	
+0x5F6C	0x292DD	
+0x5F6D	0x292C8	
+0x5F6E	0x293BA	
+0x5F6F	0x293BE	
+0x5F70	0x293BF	
+0x5F71	0x2942E	
+0x5F72	0x29430	
+0x5F73	0x294E7	
+0x5F74	0x294EE	
+0x5F75	0x294E8	
+0x5F76	0x294E6	
+0x5F77	0x294E2	
+0x5F78	0x294E4	
+0x5F79	0x294FB	
+0x5F7A	0x294FC	
+0x5F7B	0x294EA	
+0x5F7C	0x295ED	
+0x5F7D	0x295F6	
+0x5F7E	0x295F3	
+0x6021	0x295F4	
+0x6022	0x295F1	
+0x6023	0x295F7	
+0x6024	0x295F5	
+0x6025	0x295EA	
+0x6026	0x295EB	
+0x6027	0x29700	
+0x6028	0x2972C	
+0x6029	0x29712	
+0x602A	0x2973D	
+0x602B	0x29733	
+0x602D	0x29730	
+0x602E	0x29740	
+0x602F	0x29731	
+0x6030	0x29757	
+0x6032	0x29735	
+0x6033	0x29732	
+0x6034	0x2972D	
+0x6035	0x29736	
+0x6036	0x29738	
+0x6037	0x29762	
+0x6038	0x2975F	
+0x6039	0x2978A	
+0x603A	0x298D6	
+0x603B	0x298D8	
+0x603C	0x298DD	
+0x603D	0x298E4	
+0x603E	0x298E3	
+0x603F	0x29A4D	
+0x6040	0x29AD7	
+0x6041	0x29B4A	
+0x6042	0x29B4C	
+0x6043	0x29B50	
+0x6044	0x29B4B	
+0x6045	0x29B4E	
+0x6046	0x29B4F	
+0x6047	0x29C39	
+0x6048	0x29CD2	
+0x6049	0x29CCD	
+0x604A	0x29CD3	
+0x604B	0x29CE1	
+0x604C	0x29CCE	
+0x604D	0x29CD5	
+0x604E	0x29CDD	
+0x604F	0x29CD4	
+0x6050	0x29CCF	
+0x6051	0x29DCB	
+0x6052	0x29DA6	
+0x6053	0x29DC2	
+0x6054	0x29DA5	
+0x6055	0x29DA9	
+0x6056	0x29DA2	
+0x6057	0x29DA4	
+0x6058	0x29DB0	
+0x6059	0x29DCC	
+0x605A	0x29DAF	
+0x605B	0x29DBF	
+0x605C	0x2A024	
+0x605D	0x2A01A	
+0x605E	0x2A014	
+0x605F	0x2A03A	
+0x6060	0x2A020	
+0x6061	0x2A01B	
+0x6062	0x2A021	
+0x6063	0x2A025	
+0x6064	0x2A01E	
+0x6065	0x2A03F	
+0x6066	0x2A040	
+0x6067	0x2A018	
+0x6068	0x2A02C	
+0x6069	0x2A015	
+0x606A	0x2A02D	
+0x606B	0x2A01F	
+0x606C	0x2A029	
+0x606D	0x2A04B	
+0x606E	0x2A2B3	
+0x606F	0x2A2A5	
+0x6070	0x2A2A7	
+0x6071	0x2A2AB	
+0x6072	0x2A2A6	
+0x6073	0x2A2AA	
+0x6074	0x2A322	
+0x6075	0x2A323	
+0x6076	0x2A3A1	
+0x6077	0x2A3A3	
+0x6078	0x2A3A0	
+0x6079	0x2A3BD	
+0x607A	0x2A3BA	
+0x607B	0x2A3FA	
+0x607C	0x2A3F8	
+0x607D	0x2A3FC	
+0x607E	0x2A3F6	
+0x6121	0x2A434	
+0x6122	0x2A443	
+0x6124	0x2A4D4	
+0x6125	0x2A50D	
+0x6126	0x2A543	
+0x6127	0x2A541	
+0x6128	0x2A53D	
+0x6129	0x2A540	
+0x612A	0x2A53E	
+0x612B	0x2A53F	
+0x612C	0x2A546	
+0x612E	0x2A5D4	
+0x612F	0x20435	
+0x6130	0x20436	
+0x6131	0x20432	
+0x6132	0x2043A	
+0x6133	0x204C8	
+0x6134	0x20536	
+0x6135	0x2061E	
+0x6136	0x2061D	
+0x6137	0x2061F	
+0x6138	0x2081C	
+0x6139	0x2081D	
+0x613A	0x20820	
+0x613C	0x208C0	
+0x613D	0x2109A	
+0x613E	0x21093	
+0x613F	0x210DD	
+0x6141	0x210A3	
+0x6142	0x210A9	
+0x6143	0x2109C	
+0x6144	0x2109B	
+0x6146	0x21097	
+0x6147	0x214B1	
+0x6148	0x214CA	
+0x6149	0x214B3	
+0x614A	0x214CD	
+0x614B	0x218EA	
+0x614C	0x218EE	
+0x614D	0x218EF	
+0x614E	0x21ADF	
+0x614F	0x21B50	
+0x6150	0x21BBB	
+0x6151	0x21F88	
+0x6152	0x21F89	
+0x6153	0x21F8C	
+0x6154	0x21F85	
+0x6155	0x21F5E	
+0x6156	0x21F94	
+0x6157	0x21F95	
+0x6158	0x2216B	
+0x6159	0x2216A	
+0x615A	0x22169	
+0x615B	0x222E3	
+0x615C	0x222F1	
+0x615D	0x22437	
+0x615E	0x22433	
+0x615F	0x22591	
+0x6160	0x2258F	
+0x6161	0x22597	
+0x6162	0x228D4	
+0x6163	0x228DE	
+0x6164	0x228D3	
+0x6165	0x228E0	
+0x6166	0x22943	
+0x6167	0x2290B	
+0x6168	0x228FF	
+0x6169	0x22904	
+0x616A	0x22907	
+0x616B	0x22DF9	
+0x616C	0x22DFA	
+0x616D	0x22DFB	
+0x616E	0x22DF8	
+0x616F	0x23012	
+0x6170	0x23010	
+0x6171	0x2311F	
+0x6172	0x232DF	
+0x6173	0x232E3	
+0x6174	0x23352	
+0x6175	0x233A9	
+0x6176	0x23765	
+0x6177	0x23787	
+0x6178	0x23742	
+0x6179	0x23752	
+0x617A	0x2374C	
+0x617B	0x2369F	
+0x617C	0x23701	
+0x617D	0x23748	
+0x617E	0x2374F	
+0x6221	0x2377E	
+0x6222	0x2374D	
+0x6223	0x23758	
+0x6224	0x23747	
+0x6225	0x2375E	
+0x6226	0x23749	
+0x6227	0x2374E	
+0x6228	0x2375D	
+0x6229	0x2375A	
+0x622A	0x23786	
+0x622B	0x23751	
+0x622C	0x23929	
+0x622D	0x239A6	
+0x622E	0x239A7	
+0x622F	0x23A70	
+0x6230	0x23A6F	
+0x6231	0x23AD3	
+0x6232	0x23AD2	
+0x6233	0x23C28	
+0x6234	0x23C1B	
+0x6235	0x23C1A	
+0x6236	0x23C1C	
+0x6237	0x23C21	
+0x6238	0x24032	
+0x6239	0x24066	
+0x623A	0x2407D	
+0x623B	0x24073	
+0x623C	0x2407F	
+0x623D	0x24065	
+0x623E	0x24080	
+0x623F	0x24061	
+0x6240	0x24075	
+0x6241	0x2406E	
+0x6242	0x24067	
+0x6243	0x24071	
+0x6244	0x2406C	
+0x6245	0x24063	
+0x6246	0x24062	
+0x6247	0x24083	
+0x6248	0x240B2	
+0x6249	0x24081	
+0x624A	0x2406F	
+0x624B	0x2406B	
+0x624C	0x24082	
+0x624D	0x2408A	
+0x624E	0x24429	
+0x624F	0x24430	
+0x6250	0x24431	
+0x6251	0x24597	
+0x6252	0x24600	
+0x6253	0x245FF	
+0x6254	0x248B6	
+0x6255	0x248B5	
+0x6256	0x248C3	
+0x6257	0x24A8D	
+0x6258	0x24B18	
+0x6259	0x24B9C	
+0x625A	0x24B9A	
+0x625B	0x24B99	
+0x625C	0x24EB7	
+0x625D	0x24EC4	
+0x625E	0x24EC6	
+0x625F	0x24EC7	
+0x6260	0x24EBC	
+0x6261	0x24EC0	
+0x6262	0x24EC5	
+0x6263	0x24ECD	
+0x6264	0x24EC1	
+0x6265	0x24EBE	
+0x6266	0x24FA7	
+0x6267	0x24FB8	
+0x6268	0x25023	
+0x626A	0x252E8	
+0x626B	0x252DE	
+0x626C	0x252E3	
+0x626D	0x252EF	
+0x626E	0x252DC	
+0x626F	0x252E4	
+0x6270	0x252E1	
+0x6271	0x252E5	
+0x6272	0x25395	
+0x6273	0x25394	
+0x6274	0x25393	
+0x6275	0x2538E	
+0x6276	0x25598	
+0x6277	0x2559C	
+0x6278	0x25599	
+0x6279	0x255A0	
+0x627A	0x2559E	
+0x627B	0x25704	
+0x627C	0x258D3	
+0x627D	0x258B4	
+0x627E	0x258BB	
+0x6321	0x258B7	
+0x6322	0x258B8	
+0x6323	0x258BD	
+0x6324	0x258B6	
+0x6325	0x258B9	
+0x6326	0x258B5	
+0x6327	0x25A22	
+0x6328	0x25A21	
+0x6329	0x25AC3	
+0x632A	0x25ABC	
+0x632B	0x25CFF	
+0x632C	0x25CE5	
+0x632D	0x25CF7	
+0x632E	0x25CD2	
+0x632F	0x25D00	
+0x6330	0x25CDB	
+0x6331	0x25CF0	
+0x6332	0x25CE2	
+0x6333	0x25CCD	
+0x6335	0x25CE1	
+0x6336	0x25CF2	
+0x6337	0x25CDC	
+0x6338	0x25CCC	
+0x6339	0x25CD6	
+0x633A	0x25CF3	
+0x633B	0x25CFA	
+0x633C	0x25CF6	
+0x633D	0x25CEC	
+0x633E	0x25CEA	
+0x633F	0x25CE3	
+0x6340	0x25CD0	
+0x6342	0x25C95	
+0x6343	0x25CD5	
+0x6344	0x25CF4	
+0x6345	0x25CCB	
+0x6346	0x25CDA	
+0x6347	0x25CC8	
+0x6348	0x25CDF	
+0x6349	0x25CF5	
+0x634A	0x25CCF	
+0x634B	0x25CC7	
+0x634C	0x25CD7	
+0x634D	0x25F24	
+0x634F	0x25F1C	
+0x6350	0x25F21	
+0x6351	0x25F1E	
+0x6352	0x25F18	
+0x6353	0x25F1B	
+0x6355	0x26146	
+0x6356	0x2614B	
+0x6357	0x26148	
+0x6358	0x26147	
+0x6359	0x26167	
+0x635A	0x26154	
+0x635B	0x26315	
+0x635C	0x26322	
+0x635D	0x263C5	
+0x635E	0x26329	
+0x635F	0x263C7	
+0x6360	0x2648D	
+0x6361	0x2651B	
+0x6362	0x26520	
+0x6363	0x265E2	
+0x6364	0x265E7	
+0x6365	0x265E8	
+0x6366	0x265E1	
+0x6367	0x26872	
+0x6368	0x2687B	
+0x6369	0x26874	
+0x636A	0x26871	
+0x636B	0x26879	
+0x636C	0x26875	
+0x636D	0x26890	
+0x636E	0x26877	
+0x636F	0x2687D	
+0x6370	0x2694F	
+0x6371	0x26950	
+0x6372	0x269A3	
+0x6373	0x269A2	
+0x6374	0x269F4	
+0x6375	0x26A94	
+0x6376	0x26A9A	
+0x6377	0x26A9B	
+0x6378	0x26AA7	
+0x6379	0x26A97	
+0x637A	0x26A95	
+0x637B	0x26A92	
+0x637C	0x26A9C	
+0x637D	0x26A96	
+0x637E	0x26FB6	
+0x6421	0x26FB8	
+0x6422	0x26FB0	
+0x6423	0x27018	
+0x6424	0x26FC5	
+0x6425	0x26FB5	
+0x6426	0x26FC2	
+0x6427	0x27006	
+0x6428	0x27019	
+0x6429	0x26FB9	
+0x642A	0x27015	
+0x642B	0x26FD6	
+0x642C	0x26FAC	
+0x642E	0x26FC6	
+0x642F	0x26FB3	
+0x6430	0x26FC3	
+0x6431	0x26FCA	
+0x6432	0x26FCF	
+0x6433	0x26FBD	
+0x6434	0x26FCE	
+0x6435	0x27014	
+0x6436	0x26FBA	
+0x6437	0x2701A	
+0x6438	0x26FC1	
+0x6439	0x26FBB	
+0x643C	0x27201	
+0x643D	0x271FC	
+0x643E	0x2745A	
+0x643F	0x27454	
+0x6440	0x27461	
+0x6441	0x2745C	
+0x6442	0x27455	
+0x6443	0x2744A	
+0x6444	0x2744B	
+0x6445	0x27451	
+0x6446	0x27469	
+0x6447	0x2746B	
+0x6449	0x27466	
+0x644A	0x27458	
+0x644B	0x2745D	
+0x644C	0x27467	
+0x644D	0x27456	
+0x644E	0x27488	
+0x644F	0x27464	
+0x6450	0x2744E	
+0x6451	0x27757	
+0x6452	0x2775A	
+0x6453	0x27751	
+0x6454	0x2774A	
+0x6455	0x2774B	
+0x6457	0x27747	
+0x6458	0x2776F	
+0x6459	0x2776A	
+0x645A	0x2776B	
+0x645B	0x27746	
+0x645C	0x2776D	
+0x645D	0x27754	
+0x645E	0x2776E	
+0x645F	0x2774C	
+0x6460	0x27878	
+0x6461	0x27886	
+0x6462	0x27882	
+0x6464	0x27AE1	
+0x6465	0x27AE5	
+0x6466	0x27ADB	
+0x6467	0x27ADE	
+0x6468	0x27AD7	
+0x6469	0x27C03	
+0x646A	0x27C7C	
+0x646B	0x27C7E	
+0x646C	0x27D05	
+0x646D	0x27D07	
+0x646E	0x27DE6	
+0x646F	0x27DE1	
+0x6470	0x27DFB	
+0x6471	0x27DE5	
+0x6472	0x27DE7	
+0x6473	0x27DDF	
+0x6474	0x27DFF	
+0x6475	0x27E76	
+0x6476	0x27F63	
+0x6477	0x27F66	
+0x6478	0x27F65	
+0x6479	0x27F5E	
+0x647A	0x27F64	
+0x647B	0x27F6B	
+0x647C	0x27F5F	
+0x647D	0x27F67	
+0x647E	0x27F68	
+0x6521	0x28108	
+0x6522	0x28109	
+0x6523	0x28117	
+0x6524	0x28115	
+0x6525	0x2811B	
+0x6526	0x2810B	
+0x6527	0x28128	
+0x6528	0x2810E	
+0x6529	0x28118	
+0x652A	0x28153	
+0x652B	0x28145	
+0x652C	0x2810D	
+0x652D	0x2810A	
+0x652E	0x28113	
+0x652F	0x2814A	
+0x6530	0x28279	
+0x6531	0x283A1	
+0x6532	0x2838D	
+0x6533	0x283A2	
+0x6534	0x28390	
+0x6536	0x28431	
+0x6537	0x28430	
+0x6538	0x2861F	
+0x6539	0x28619	
+0x653A	0x2860C	
+0x653B	0x2861E	
+0x653C	0x2861D	
+0x653D	0x28607	
+0x653E	0x28766	
+0x653F	0x287C5	
+0x6540	0x287BA	
+0x6541	0x287BD	
+0x6542	0x287C2	
+0x6543	0x287C3	
+0x6544	0x287BF	
+0x6546	0x288A1	
+0x6547	0x288A2	
+0x6548	0x288A8	
+0x6549	0x288A3	
+0x654A	0x288AA	
+0x654B	0x288AF	
+0x654C	0x288B9	
+0x654D	0x28937	
+0x654E	0x28A8F	
+0x6550	0x28A8E	
+0x6551	0x28A87	
+0x6552	0x28A8A	
+0x6553	0x28A92	
+0x6554	0x28A97	
+0x6555	0x28A9F	
+0x6556	0x28B05	
+0x6557	0x28CA9	
+0x6558	0x28CA7	
+0x6559	0x28D8A	
+0x655A	0x28D82	
+0x655B	0x28D85	
+0x655C	0x28D8B	
+0x655D	0x28D89	
+0x655E	0x28D81	
+0x655F	0x28D80	
+0x6560	0x28D87	
+0x6561	0x28D86	
+0x6562	0x28F4D	
+0x6563	0x2901C	
+0x6564	0x2901F	
+0x6565	0x29121	
+0x6566	0x2911D	
+0x6567	0x29122	
+0x6568	0x290FE	
+0x6569	0x2911B	
+0x656A	0x2913A	
+0x656B	0x29137	
+0x656C	0x29117	
+0x656D	0x29138	
+0x656E	0x29126	
+0x656F	0x29118	
+0x6570	0x29234	
+0x6571	0x29235	
+0x6572	0x29232	
+0x6574	0x292E1	
+0x6575	0x292FD	
+0x6576	0x292E3	
+0x6577	0x292E8	
+0x6578	0x292F9	
+0x6579	0x292FF	
+0x657A	0x292FE	
+0x657C	0x292E0	
+0x657D	0x29300	
+0x6621	0x292EC	
+0x6622	0x292E4	
+0x6623	0x292EF	
+0x6624	0x292FA	
+0x6625	0x293CA	
+0x6626	0x29431	
+0x6627	0x29432	
+0x6628	0x29434	
+0x6629	0x29441	
+0x662A	0x29500	
+0x662B	0x29506	
+0x662C	0x29508	
+0x662D	0x29505	
+0x662E	0x29503	
+0x662F	0x2950B	
+0x6630	0x29502	
+0x6631	0x2950A	
+0x6632	0x295F0	
+0x6633	0x29613	
+0x6634	0x2960A	
+0x6635	0x2960F	
+0x6636	0x29611	
+0x6637	0x29608	
+0x6638	0x2960B	
+0x6639	0x29612	
+0x663A	0x2960D	
+0x663B	0x2975B	
+0x663C	0x29763	
+0x663D	0x29761	
+0x663E	0x29768	
+0x663F	0x2975A	
+0x6640	0x2984E	
+0x6641	0x2984D	
+0x6642	0x29850	
+0x6643	0x298FC	
+0x6644	0x29912	
+0x6645	0x298F5	
+0x6646	0x2991E	
+0x6647	0x298F0	
+0x6648	0x298F3	
+0x6649	0x298F2	
+0x664A	0x29901	
+0x664B	0x298EF	
+0x664C	0x298EE	
+0x664D	0x29916	
+0x664E	0x298F6	
+0x664F	0x298FB	
+0x6650	0x2991C	
+0x6652	0x29A5D	
+0x6653	0x29A60	
+0x6654	0x29A66	
+0x6655	0x29A5F	
+0x6656	0x29A61	
+0x6657	0x29A5B	
+0x6658	0x29A62	
+0x6659	0x29A57	
+0x665A	0x29B69	
+0x665B	0x29B6B	
+0x665C	0x29B61	
+0x665D	0x29B77	
+0x665E	0x29B5F	
+0x665F	0x29B63	
+0x6660	0x29B62	
+0x6661	0x29B65	
+0x6662	0x29CEF	
+0x6663	0x29CE2	
+0x6664	0x29D00	
+0x6665	0x29CE8	
+0x6666	0x29CF2	
+0x6667	0x29CE7	
+0x6669	0x29CE5	
+0x666A	0x29DD5	
+0x666B	0x29DD0	
+0x666C	0x29DDA	
+0x666D	0x29DD3	
+0x666F	0x29DD9	
+0x6670	0x29DCF	
+0x6671	0x29DD6	
+0x6672	0x29DD8	
+0x6673	0x29DF5	
+0x6674	0x29DCE	
+0x6675	0x29DD7	
+0x6676	0x29DF4	
+0x6677	0x29DCD	
+0x6678	0x29E01	
+0x667A	0x2A052	
+0x667B	0x2A055	
+0x667C	0x2A05A	
+0x667D	0x2A04D	
+0x667E	0x2A054	
+0x6721	0x2A053	
+0x6722	0x2A05E	
+0x6723	0x2A067	
+0x6724	0x2A065	
+0x6725	0x2A04E	
+0x6727	0x2A04F	
+0x6728	0x2A061	
+0x6729	0x2A06E	
+0x672A	0x2A051	
+0x672B	0x2A05B	
+0x672C	0x2A263	
+0x672D	0x2A2B7	
+0x672E	0x2A2B6	
+0x672F	0x2A2C3	
+0x6730	0x2A2BB	
+0x6731	0x2A2B5	
+0x6732	0x2A32E	
+0x6733	0x2A330	
+0x6734	0x2A333	
+0x6735	0x2A331	
+0x6736	0x2A3A4	
+0x6737	0x2A3C1	
+0x6738	0x2A3BB	
+0x6739	0x2A3BE	
+0x673A	0x2A400	
+0x673B	0x2A3FF	
+0x673C	0x2A440	
+0x673E	0x2A43F	
+0x673F	0x2A444	
+0x6742	0x2A4DB	
+0x6743	0x2A50F	
+0x6744	0x2A511	
+0x6745	0x2A54E	
+0x6746	0x2A54D	
+0x6747	0x2A54B	
+0x6748	0x2A54C	
+0x6749	0x2A595	
+0x674A	0x2043B	
+0x674B	0x20445	
+0x674C	0x20444	
+0x674D	0x2043E	
+0x674E	0x2043C	
+0x674F	0x2043F	
+0x6750	0x204CC	
+0x6751	0x204CE	
+0x6752	0x20622	
+0x6753	0x20623	
+0x6754	0x2069F	
+0x6755	0x208C5	
+0x6756	0x208C4	
+0x6757	0x210E9	
+0x6758	0x21099	
+0x675A	0x210E6	
+0x675B	0x210E7	
+0x675C	0x210F7	
+0x675D	0x214D2	
+0x675F	0x218FD	
+0x6760	0x2190C	
+0x6761	0x2190B	
+0x6762	0x21CED	
+0x6765	0x21F9B	
+0x6766	0x2200A	
+0x6767	0x2216F	
+0x6768	0x22175	
+0x6769	0x222F2	
+0x676A	0x222F8	
+0x676B	0x2243E	
+0x676C	0x22924	
+0x676D	0x2290E	
+0x676E	0x22916	
+0x676F	0x22918	
+0x6770	0x22910	
+0x6771	0x22931	
+0x6772	0x22944	
+0x6774	0x22929	
+0x6775	0x2292F	
+0x6776	0x2294B	
+0x6777	0x22936	
+0x6779	0x22E34	
+0x677A	0x22E00	
+0x677B	0x22E2B	
+0x677C	0x23020	
+0x677D	0x23021	
+0x677E	0x2301E	
+0x6821	0x2301D	
+0x6822	0x232F5	
+0x6823	0x232F2	
+0x6824	0x232F6	
+0x6825	0x23790	
+0x6826	0x2379D	
+0x6827	0x2379C	
+0x6828	0x23792	
+0x6829	0x23794	
+0x682A	0x237D1	
+0x682B	0x23793	
+0x682C	0x237B7	
+0x682D	0x23797	
+0x682E	0x237B0	
+0x682F	0x2379F	
+0x6830	0x237C9	
+0x6831	0x2392D	
+0x6832	0x2392C	
+0x6833	0x23A77	
+0x6834	0x23C2C	
+0x6835	0x240C0	
+0x6836	0x240B9	
+0x6837	0x24453	
+0x6838	0x24540	
+0x6839	0x24702	
+0x683A	0x246FB	
+0x683C	0x24A8B	
+0x683D	0x24AAE	
+0x683E	0x24AAB	
+0x683F	0x24BA1	
+0x6840	0x2A2CD	
+0x6841	0x24CEA	
+0x6842	0x24EDD	
+0x6843	0x24EDC	
+0x6844	0x24ED9	
+0x6845	0x24FAB	
+0x6846	0x24FAC	
+0x6847	0x24FAD	
+0x6848	0x24FB2	
+0x6849	0x2502C	
+0x684A	0x2502B	
+0x684B	0x250C2	
+0x684C	0x25300	
+0x684D	0x2530D	
+0x684E	0x25306	
+0x684F	0x252FF	
+0x6850	0x25303	
+0x6851	0x25301	
+0x6852	0x25310	
+0x6853	0x2530F	
+0x6854	0x25305	
+0x6855	0x25398	
+0x6856	0x25397	
+0x6857	0x25396	
+0x6858	0x25399	
+0x6859	0x255AC	
+0x685A	0x255AB	
+0x685B	0x25712	
+0x685C	0x258D8	
+0x685D	0x258DF	
+0x685E	0x258D6	
+0x685F	0x25A2D	
+0x6860	0x25A32	
+0x6861	0x25D3F	
+0x6862	0x25D2F	
+0x6863	0x25D26	
+0x6864	0x25D3A	
+0x6865	0x25D39	
+0x6867	0x25D3B	
+0x6868	0x25D35	
+0x6869	0x25D2A	
+0x686A	0x25D21	
+0x686B	0x25D38	
+0x686C	0x25D37	
+0x686D	0x25D34	
+0x686F	0x25D22	
+0x6870	0x25D36	
+0x6871	0x25D44	
+0x6872	0x25F45	
+0x6873	0x25F3B	
+0x6874	0x25F36	
+0x6875	0x25F42	
+0x6876	0x2617A	
+0x6877	0x26186	
+0x6878	0x2618B	
+0x6879	0x2617F	
+0x687A	0x26181	
+0x687B	0x2632A	
+0x687C	0x263D5	
+0x687D	0x2649F	
+0x687E	0x2649D	
+0x6921	0x26526	
+0x6922	0x265F4	
+0x6923	0x265F5	
+0x6924	0x26815	
+0x6925	0x2688E	
+0x6926	0x2688F	
+0x6927	0x26926	
+0x6928	0x269A7	
+0x6929	0x269AF	
+0x692A	0x26AAD	
+0x692B	0x26AAC	
+0x692C	0x26AAB	
+0x692D	0x26AAA	
+0x692E	0x2702F	
+0x692F	0x27021	
+0x6930	0x27023	
+0x6931	0x270A3	
+0x6932	0x27049	
+0x6933	0x2703A	
+0x6934	0x27048	
+0x6935	0x2702D	
+0x6936	0x27025	
+0x6937	0x27029	
+0x6938	0x27032	
+0x6939	0x27034	
+0x693A	0x27024	
+0x693B	0x2702C	
+0x693C	0x2704B	
+0x693D	0x2703B	
+0x693E	0x27020	
+0x693F	0x27028	
+0x6940	0x27498	
+0x6942	0x27497	
+0x6944	0x2749D	
+0x6945	0x274A8	
+0x6946	0x275D5	
+0x6947	0x27777	
+0x6948	0x27778	
+0x6949	0x27772	
+0x694A	0x27773	
+0x694B	0x27802	
+0x694C	0x2793B	
+0x694D	0x27AFE	
+0x694E	0x27B0B	
+0x694F	0x27AFF	
+0x6950	0x27B07	
+0x6953	0x27B30	
+0x6954	0x27BCD	
+0x6955	0x27BCF	
+0x6956	0x27C10	
+0x6957	0x27C0A	
+0x6958	0x27C83	
+0x6959	0x27D15	
+0x695A	0x27D0E	
+0x695B	0x27D0C	
+0x695C	0x27E02	
+0x695D	0x27DFE	
+0x695E	0x27E05	
+0x695F	0x27E15	
+0x6960	0x27E08	
+0x6961	0x27F7F	
+0x6962	0x27F77	
+0x6963	0x27F7C	
+0x6964	0x27F82	
+0x6965	0x27F7E	
+0x6966	0x27F78	
+0x6967	0x27F7D	
+0x6968	0x27F79	
+0x6969	0x27F81	
+0x696A	0x2814B	
+0x696B	0x28163	
+0x696C	0x28164	
+0x696D	0x28156	
+0x696E	0x28154	
+0x696F	0x2814E	
+0x6970	0x28110	
+0x6971	0x2814F	
+0x6972	0x28157	
+0x6973	0x2815E	
+0x6974	0x28151	
+0x6975	0x2816A	
+0x6976	0x28169	
+0x6977	0x283AD	
+0x6978	0x283A4	
+0x6979	0x283AC	
+0x697A	0x283A9	
+0x697B	0x283AE	
+0x697C	0x2044C	
+0x697D	0x28650	
+0x697E	0x28635	
+0x6A21	0x28632	
+0x6A22	0x287D8	
+0x6A23	0x287D1	
+0x6A24	0x287CF	
+0x6A25	0x287BE	
+0x6A26	0x288D5	
+0x6A27	0x288C1	
+0x6A28	0x288C6	
+0x6A29	0x288C3	
+0x6A2A	0x288C2	
+0x6A2B	0x288C0	
+0x6A2C	0x288C5	
+0x6A2D	0x288C7	
+0x6A2E	0x288BF	
+0x6A2F	0x288C4	
+0x6A30	0x288D4	
+0x6A31	0x28A90	
+0x6A32	0x28AD2	
+0x6A34	0x28AD4	
+0x6A35	0x28CAF	
+0x6A36	0x28CAE	
+0x6A37	0x28CB2	
+0x6A38	0x28CAD	
+0x6A39	0x28D9C	
+0x6A3A	0x28DA0	
+0x6A3B	0x28DB6	
+0x6A3C	0x28F3D	
+0x6A3D	0x28F56	
+0x6A3E	0x28F82	
+0x6A3F	0x29028	
+0x6A40	0x2902B	
+0x6A41	0x2913C	
+0x6A42	0x2913E	
+0x6A43	0x2913F	
+0x6A44	0x29142	
+0x6A45	0x2913D	
+0x6A46	0x29141	
+0x6A47	0x2913B	
+0x6A48	0x29149	
+0x6A49	0x29143	
+0x6A4A	0x29239	
+0x6A4B	0x29238	
+0x6A4C	0x29322	
+0x6A4D	0x29308	
+0x6A4E	0x2930C	
+0x6A4F	0x29306	
+0x6A50	0x29313	
+0x6A51	0x29304	
+0x6A52	0x29320	
+0x6A53	0x2931D	
+0x6A54	0x29305	
+0x6A55	0x2930A	
+0x6A56	0x293D6	
+0x6A57	0x293D7	
+0x6A58	0x29436	
+0x6A59	0x29437	
+0x6A5A	0x29523	
+0x6A5B	0x29522	
+0x6A5C	0x29520	
+0x6A5D	0x2951A	
+0x6A5E	0x2951D	
+0x6A5F	0x2961C	
+0x6A60	0x29620	
+0x6A61	0x29677	
+0x6A62	0x2977F	
+0x6A63	0x2978B	
+0x6A64	0x2977D	
+0x6A65	0x29799	
+0x6A66	0x29784	
+0x6A67	0x29789	
+0x6A68	0x29785	
+0x6A69	0x29783	
+0x6A6A	0x29786	
+0x6A6B	0x2979E	
+0x6A6C	0x29853	
+0x6A6D	0x29917	
+0x6A6F	0x29919	
+0x6A70	0x29920	
+0x6A71	0x2991F	
+0x6A72	0x29923	
+0x6A73	0x29918	
+0x6A74	0x29921	
+0x6A75	0x29929	
+0x6A76	0x29924	
+0x6A77	0x29926	
+0x6A78	0x29A5E	
+0x6A79	0x29A6F	
+0x6A7A	0x29A6E	
+0x6A7B	0x29A74	
+0x6A7C	0x29A72	
+0x6A7D	0x29A73	
+0x6A7E	0x29B7D	
+0x6B21	0x29B7E	
+0x6B22	0x29B85	
+0x6B23	0x29B7F	
+0x6B24	0x29B84	
+0x6B25	0x29C44	
+0x6B26	0x29CF5	
+0x6B27	0x29CF8	
+0x6B28	0x29D03	
+0x6B29	0x29CF6	
+0x6B2A	0x29E28	
+0x6B2C	0x29E39	
+0x6B2D	0x29DFB	
+0x6B2E	0x29E0E	
+0x6B2F	0x29DFD	
+0x6B30	0x29E1F	
+0x6B32	0x29E03	
+0x6B34	0x29E10	
+0x6B36	0x29E0D	
+0x6B37	0x29E27	
+0x6B38	0x29E41	
+0x6B39	0x2A072	
+0x6B3A	0x2A078	
+0x6B3B	0x2A080	
+0x6B3D	0x2A085	
+0x6B3E	0x2A07B	
+0x6B40	0x2A07D	
+0x6B41	0x2A091	
+0x6B42	0x2A088	
+0x6B43	0x2A0AA	
+0x6B44	0x2A08D	
+0x6B45	0x2A089	
+0x6B46	0x2A095	
+0x6B47	0x2A09B	
+0x6B48	0x2A08C	
+0x6B49	0x2A09E	
+0x6B4A	0x2A07C	
+0x6B4B	0x2A086	
+0x6B4C	0x2A084	
+0x6B4D	0x2A268	
+0x6B4E	0x2A2C5	
+0x6B4F	0x2A2C4	
+0x6B50	0x2A2C9	
+0x6B51	0x2A2C6	
+0x6B52	0x2A342	
+0x6B53	0x2A345	
+0x6B54	0x2A341	
+0x6B55	0x2A344	
+0x6B56	0x2A3A6	
+0x6B57	0x2A3C2	
+0x6B58	0x2A442	
+0x6B59	0x2A449	
+0x6B5A	0x2A448	
+0x6B5B	0x2A44A	
+0x6B5C	0x2A44C	
+0x6B5D	0x2A44B	
+0x6B5E	0x2A517	
+0x6B5F	0x2A518	
+0x6B60	0x2A515	
+0x6B61	0x2A552	
+0x6B62	0x2A554	
+0x6B63	0x2A553	
+0x6B64	0x2A59A	
+0x6B65	0x2A59B	
+0x6B66	0x2A5DC	
+0x6B67	0x2A5E4	
+0x6B68	0x2A691	
+0x6B6A	0x2A6BA	
+0x6B6B	0x20451	
+0x6B6C	0x2045B	
+0x6B6D	0x204CF	
+0x6B6E	0x23305	
+0x6B6F	0x21113	
+0x6B70	0x21115	
+0x6B71	0x21114	
+0x6B72	0x21123	
+0x6B74	0x21111	
+0x6B75	0x21112	
+0x6B77	0x214F0	
+0x6B78	0x2169B	
+0x6B79	0x21912	
+0x6B7A	0x21916	
+0x6B7B	0x21917	
+0x6B7C	0x219B5	
+0x6B7D	0x21CF4	
+0x6B7E	0x21FB1	
+0x6C21	0x22179	
+0x6C22	0x222FF	
+0x6C23	0x222FC	
+0x6C24	0x222FB	
+0x6C25	0x2243F	
+0x6C26	0x22444	
+0x6C27	0x2259D	
+0x6C28	0x22932	
+0x6C29	0x2294C	
+0x6C2A	0x2292B	
+0x6C2B	0x2295A	
+0x6C2C	0x22A1F	
+0x6C2D	0x22E01	
+0x6C2E	0x22E2D	
+0x6C2F	0x22E27	
+0x6C30	0x22E59	
+0x6C31	0x22E5A	
+0x6C32	0x22E4D	
+0x6C33	0x22E58	
+0x6C34	0x23023	
+0x6C35	0x23025	
+0x6C36	0x2302B	
+0x6C37	0x232FF	
+0x6C38	0x233AE	
+0x6C39	0x237CB	
+0x6C3A	0x237CA	
+0x6C3B	0x237D0	
+0x6C3C	0x237CE	
+0x6C3D	0x237CC	
+0x6C3E	0x237D8	
+0x6C3F	0x237C6	
+0x6C40	0x237D2	
+0x6C41	0x237CF	
+0x6C42	0x237C8	
+0x6C43	0x23B17	
+0x6C45	0x240C4	
+0x6C46	0x29240	
+0x6C47	0x240E9	
+0x6C48	0x240F2	
+0x6C49	0x240FC	
+0x6C4A	0x240EA	
+0x6C4B	0x240EB	
+0x6C4C	0x240FD	
+0x6C4D	0x24478	
+0x6C4E	0x24477	
+0x6C4F	0x24473	
+0x6C50	0x2449E	
+0x6C51	0x24479	
+0x6C52	0x245A2	
+0x6C53	0x24603	
+0x6C54	0x24704	
+0x6C55	0x24705	
+0x6C56	0x248CE	
+0x6C57	0x24ABF	
+0x6C58	0x24EF6	
+0x6C59	0x24EF7	
+0x6C5A	0x25031	
+0x6C5B	0x25030	
+0x6C5C	0x250C9	
+0x6C5D	0x250C7	
+0x6C5E	0x2531C	
+0x6C5F	0x25328	
+0x6C60	0x2531A	
+0x6C61	0x2531E	
+0x6C62	0x2531B	
+0x6C63	0x2531F	
+0x6C64	0x255BF	
+0x6C65	0x255BB	
+0x6C66	0x255BC	
+0x6C67	0x255C0	
+0x6C68	0x2571A	
+0x6C69	0x258EF	
+0x6C6A	0x258EC	
+0x6C6B	0x258E9	
+0x6C6C	0x258F0	
+0x6C6D	0x258FE	
+0x6C6E	0x25A34	
+0x6C6F	0x25D6A	
+0x6C70	0x25D95	
+0x6C71	0x25D6C	
+0x6C72	0x25D72	
+0x6C73	0x25D67	
+0x6C74	0x25D60	
+0x6C75	0x25D6B	
+0x6C76	0x25D5E	
+0x6C77	0x25D6F	
+0x6C78	0x25D66	
+0x6C7A	0x25D62	
+0x6C7B	0x25D5D	
+0x6C7C	0x25D5C	
+0x6C7D	0x2F965	
+0x6C7E	0x25F50	
+0x6D21	0x2619F	
+0x6D23	0x2619E	
+0x6D24	0x261A6	
+0x6D25	0x26335	
+0x6D26	0x26338	
+0x6D27	0x26336	
+0x6D28	0x2633A	
+0x6D29	0x263DC	
+0x6D2A	0x2687C	
+0x6D2B	0x268AB	
+0x6D2D	0x268A8	
+0x6D2E	0x268A7	
+0x6D2F	0x2692B	
+0x6D30	0x2692C	
+0x6D31	0x26928	
+0x6D32	0x2092B	
+0x6D33	0x269A9	
+0x6D34	0x269AA	
+0x6D35	0x269AB	
+0x6D36	0x269F8	
+0x6D37	0x26AB1	
+0x6D38	0x26AF0	
+0x6D39	0x26AEF	
+0x6D3A	0x270A8	
+0x6D3B	0x2708B	
+0x6D3C	0x27094	
+0x6D3D	0x2709E	
+0x6D3E	0x2708F	
+0x6D3F	0x27088	
+0x6D40	0x2707E	
+0x6D41	0x27081	
+0x6D42	0x27030	
+0x6D43	0x2709B	
+0x6D44	0x27082	
+0x6D45	0x27090	
+0x6D46	0x27085	
+0x6D47	0x2707F	
+0x6D48	0x270A9	
+0x6D49	0x270DE	
+0x6D4A	0x2720D	
+0x6D4C	0x274CF	
+0x6D4D	0x274CB	
+0x6D4E	0x274D8	
+0x6D4F	0x274DD	
+0x6D50	0x274D3	
+0x6D51	0x274D0	
+0x6D52	0x274D5	
+0x6D53	0x274D6	
+0x6D54	0x275D6	
+0x6D55	0x27792	
+0x6D56	0x27795	
+0x6D57	0x2A5CB	
+0x6D58	0x2778D	
+0x6D59	0x2779B	
+0x6D5A	0x2779D	
+0x6D5B	0x2778F	
+0x6D5C	0x2779E	
+0x6D5D	0x277A6	
+0x6D5E	0x27896	
+0x6D5F	0x27892	
+0x6D60	0x27B16	
+0x6D61	0x27B2A	
+0x6D62	0x27B29	
+0x6D63	0x27B2C	
+0x6D64	0x27C15	
+0x6D65	0x27C12	
+0x6D66	0x27C11	
+0x6D67	0x27C13	
+0x6D68	0x27C88	
+0x6D69	0x27C8B	
+0x6D6A	0x27C8A	
+0x6D6B	0x27C87	
+0x6D6C	0x27D17	
+0x6D6D	0x27D16	
+0x6D6E	0x27D1A	
+0x6D6F	0x27E19	
+0x6D70	0x27E17	
+0x6D71	0x27F91	
+0x6D72	0x27F94	
+0x6D73	0x2818B	
+0x6D74	0x28190	
+0x6D75	0x2818F	
+0x6D76	0x28186	
+0x6D77	0x28183	
+0x6D78	0x2818E	
+0x6D79	0x28187	
+0x6D7A	0x281A8	
+0x6D7B	0x28185	
+0x6D7C	0x281A6	
+0x6D7D	0x28182	
+0x6D7E	0x281A7	
+0x6E21	0x283B9	
+0x6E22	0x283B7	
+0x6E23	0x283B4	
+0x6E24	0x283B6	
+0x6E25	0x283B3	
+0x6E26	0x283C6	
+0x6E27	0x2863C	
+0x6E28	0x28640	
+0x6E29	0x28638	
+0x6E2A	0x28791	
+0x6E2B	0x287A6	
+0x6E2C	0x287DA	
+0x6E2D	0x288DA	
+0x6E2E	0x288D8	
+0x6E2F	0x288D9	
+0x6E30	0x288DB	
+0x6E31	0x288D7	
+0x6E32	0x28B16	
+0x6E33	0x28B12	
+0x6E34	0x28B1F	
+0x6E36	0x28B14	
+0x6E37	0x28B1A	
+0x6E38	0x28B10	
+0x6E39	0x28CB3	
+0x6E3A	0x28DAE	
+0x6E3B	0x28DC1	
+0x6E3C	0x28DB0	
+0x6E3D	0x28DAF	
+0x6E3E	0x28DB1	
+0x6E3F	0x28DAD	
+0x6E40	0x28DB2	
+0x6E41	0x28DC4	
+0x6E42	0x2903C	
+0x6E43	0x2903F	
+0x6E44	0x29161	
+0x6E45	0x29166	
+0x6E46	0x2923C	
+0x6E47	0x2923B	
+0x6E48	0x2932C	
+0x6E4A	0x2932A	
+0x6E4B	0x2933E	
+0x6E4C	0x2932F	
+0x6E4D	0x29332	
+0x6E4E	0x29327	
+0x6E4F	0x29329	
+0x6E50	0x29340	
+0x6E51	0x293DF	
+0x6E52	0x293DE	
+0x6E53	0x2943C	
+0x6E54	0x2943B	
+0x6E55	0x2943E	
+0x6E56	0x29521	
+0x6E57	0x29546	
+0x6E58	0x2953C	
+0x6E59	0x29536	
+0x6E5A	0x29538	
+0x6E5B	0x29535	
+0x6E5C	0x29631	
+0x6E5D	0x29636	
+0x6E5E	0x2962D	
+0x6E5F	0x29633	
+0x6E60	0x2962F	
+0x6E61	0x2962E	
+0x6E62	0x29635	
+0x6E63	0x297AC	
+0x6E64	0x297A9	
+0x6E65	0x297A6	
+0x6E67	0x2994C	
+0x6E68	0x29943	
+0x6E69	0x29941	
+0x6E6A	0x2994F	
+0x6E6B	0x29942	
+0x6E6C	0x29951	
+0x6E6E	0x29940	
+0x6E6F	0x29950	
+0x6E70	0x29945	
+0x6E71	0x2994A	
+0x6E72	0x2994B	
+0x6E73	0x29A83	
+0x6E74	0x29A82	
+0x6E75	0x29A81	
+0x6E76	0x29AE0	
+0x6E77	0x29B98	
+0x6E78	0x29B9F	
+0x6E79	0x29B9B	
+0x6E7A	0x29B9A	
+0x6E7B	0x29B99	
+0x6E7C	0x29B96	
+0x6E7D	0x29BAE	
+0x6E7E	0x29B9E	
+0x6F21	0x29D09	
+0x6F22	0x29D0D	
+0x6F23	0x29E4E	
+0x6F24	0x29E4A	
+0x6F25	0x29E4D	
+0x6F26	0x29E40	
+0x6F27	0x29E3E	
+0x6F28	0x29E48	
+0x6F29	0x29E42	
+0x6F2A	0x29E62	
+0x6F2B	0x29E45	
+0x6F2C	0x29E51	
+0x6F2D	0x2A0C6	
+0x6F2E	0x2A0D0	
+0x6F2F	0x2A0C0	
+0x6F30	0x2A0B7	
+0x6F31	0x2A0C2	
+0x6F32	0x2A0BC	
+0x6F33	0x2A0C5	
+0x6F34	0x2A0DC	
+0x6F35	0x2A0DB	
+0x6F36	0x2A0D2	
+0x6F37	0x2A0C7	
+0x6F38	0x2A0B6	
+0x6F39	0x2A0C9	
+0x6F3A	0x2A0CC	
+0x6F3B	0x2A0D1	
+0x6F3C	0x2A0CD	
+0x6F3D	0x2A0DA	
+0x6F3E	0x2A0BA	
+0x6F3F	0x2A0D3	
+0x6F40	0x2A0CE	
+0x6F41	0x2A0F6	
+0x6F42	0x2A0BD	
+0x6F43	0x2A0DD	
+0x6F44	0x2A0C8	
+0x6F45	0x2A10D	
+0x6F46	0x2A135	
+0x6F47	0x2A271	
+0x6F48	0x2A26E	
+0x6F49	0x2A26F	
+0x6F4A	0x2A2D6	
+0x6F4B	0x2A34C	
+0x6F4C	0x2A34F	
+0x6F4D	0x2A354	
+0x6F4E	0x2A353	
+0x6F4F	0x2A3C9	
+0x6F50	0x2A3C8	
+0x6F51	0x2A403	
+0x6F53	0x2A404	
+0x6F55	0x2A457	
+0x6F56	0x2A452	
+0x6F57	0x2A453	
+0x6F59	0x2A456	
+0x6F5A	0x2A45C	
+0x6F5B	0x2A455	
+0x6F5C	0x2A564	
+0x6F5D	0x2A55D	
+0x6F5E	0x2A55E	
+0x6F5F	0x2A5A2	
+0x6F60	0x2A5A3	
+0x6F62	0x2A5E7	
+0x6F63	0x2A5E6	
+0x6F64	0x2A698	
+0x6F65	0x2A6AC	
+0x6F66	0x2A6AF	
+0x6F67	0x2A6AE	
+0x6F68	0x20459	
+0x6F69	0x205A9	
+0x6F6A	0x2082A	
+0x6F6B	0x208C7	
+0x6F6C	0x21141	
+0x6F6D	0x21137	
+0x6F6E	0x21135	
+0x6F6F	0x21133	
+0x6F70	0x21139	
+0x6F71	0x21132	
+0x6F72	0x214FF	
+0x6F73	0x21501	
+0x6F74	0x214F8	
+0x6F75	0x2191B	
+0x6F76	0x21919	
+0x6F77	0x21BBF	
+0x6F78	0x21FBC	
+0x6F79	0x21FBE	
+0x6F7A	0x21FBD	
+0x6F7B	0x2217D	
+0x6F7C	0x22446	
+0x6F7D	0x22447	
+0x6F7E	0x225A4	
+0x7021	0x22A21	
+0x7022	0x22A62	
+0x7023	0x22E86	
+0x7025	0x2302F	
+0x7026	0x23031	
+0x7028	0x237F8	
+0x7029	0x237F5	
+0x702A	0x237F9	
+0x702B	0x237F2	
+0x702C	0x237FA	
+0x702D	0x237F3	
+0x702E	0x23814	
+0x702F	0x237FD	
+0x7030	0x2380F	
+0x7031	0x2380E	
+0x7032	0x23801	
+0x7033	0x23937	
+0x7034	0x23935	
+0x7035	0x23934	
+0x7036	0x23931	
+0x7037	0x23A7A	
+0x7038	0x23A7B	
+0x7039	0x23C37	
+0x703A	0x2412B	
+0x703B	0x240FB	
+0x703C	0x24116	
+0x703D	0x24113	
+0x703F	0x24111	
+0x7040	0x2410F	
+0x7041	0x2411B	
+0x7042	0x24138	
+0x7043	0x244A4	
+0x7044	0x24709	
+0x7045	0x24707	
+0x7046	0x2470B	
+0x7047	0x248D3	
+0x7048	0x248D1	
+0x7049	0x248D8	
+0x704A	0x24B1D	
+0x704B	0x24BA9	
+0x704C	0x24BD0	
+0x704D	0x27215	
+0x704E	0x24F02	
+0x704F	0x24F05	
+0x7050	0x24F01	
+0x7051	0x24F00	
+0x7052	0x2532E	
+0x7053	0x25330	
+0x7054	0x2532F	
+0x7055	0x25331	
+0x7056	0x255D2	
+0x7057	0x255D3	
+0x7058	0x25902	
+0x7059	0x25A40	
+0x705A	0x25A42	
+0x705B	0x25A3B	
+0x705C	0x25ACE	
+0x705D	0x25D98	
+0x705E	0x25D8F	
+0x705F	0x25D94	
+0x7060	0x25D91	
+0x7062	0x25DBA	
+0x7063	0x25D90	
+0x7064	0x25D86	
+0x7065	0x25D9A	
+0x7066	0x25D8C	
+0x7067	0x25D93	
+0x7068	0x25D87	
+0x7069	0x25D88	
+0x706A	0x25D97	
+0x706B	0x25D8D	
+0x706C	0x25D9C	
+0x706D	0x25DBD	
+0x706E	0x25F3C	
+0x706F	0x25F59	
+0x7071	0x261D1	
+0x7072	0x261BB	
+0x7073	0x261BE	
+0x7074	0x2625D	
+0x7075	0x263E2	
+0x7076	0x26605	
+0x7077	0x268BA	
+0x7079	0x268F4	
+0x707A	0x269B2	
+0x707B	0x269F9	
+0x707C	0x26AB7	
+0x707D	0x26AB6	
+0x707E	0x27089	
+0x7121	0x270F9	
+0x7122	0x270D9	
+0x7123	0x270E8	
+0x7124	0x270D4	
+0x7125	0x270DB	
+0x7126	0x270E2	
+0x7127	0x270DF	
+0x7128	0x270D1	
+0x7129	0x270E9	
+0x712A	0x270EA	
+0x712B	0x27213	
+0x712C	0x27211	
+0x712D	0x274FA	
+0x712E	0x274F8	
+0x712F	0x274F4	
+0x7130	0x274FB	
+0x7131	0x2750E	
+0x7132	0x27502	
+0x7133	0x2750F	
+0x7134	0x27790	
+0x7135	0x277AD	
+0x7136	0x277A9	
+0x7137	0x27948	
+0x7138	0x27B5A	
+0x7139	0x27B4F	
+0x713A	0x27B4E	
+0x713B	0x27B55	
+0x713C	0x27B54	
+0x713D	0x27B4A	
+0x713E	0x27BD5	
+0x713F	0x27C18	
+0x7140	0x27C8D	
+0x7141	0x27D1D	
+0x7142	0x27D19	
+0x7143	0x27E26	
+0x7144	0x27E28	
+0x7145	0x27E2B	
+0x7146	0x27E7D	
+0x7147	0x27FA0	
+0x7148	0x27F9A	
+0x7149	0x27F9B	
+0x714A	0x281B5	
+0x714B	0x281AD	
+0x714C	0x281B2	
+0x714D	0x28294	
+0x714E	0x283C9	
+0x714F	0x2864E	
+0x7150	0x2864F	
+0x7151	0x28644	
+0x7152	0x28652	
+0x7153	0x288E9	
+0x7154	0x28939	
+0x7157	0x28DC7	
+0x7158	0x28DD3	
+0x7159	0x28DC6	
+0x715A	0x28DC3	
+0x715C	0x28DD2	
+0x715D	0x28F66	
+0x715E	0x2917F	
+0x715F	0x29180	
+0x7160	0x29184	
+0x7161	0x29185	
+0x7162	0x291E3	
+0x7164	0x29241	
+0x7165	0x29244	
+0x7166	0x29243	
+0x7167	0x2934E	
+0x7168	0x2934F	
+0x716A	0x29349	
+0x716B	0x2934A	
+0x716C	0x2934B	
+0x716D	0x29343	
+0x716E	0x293E0	
+0x716F	0x293E5	
+0x7170	0x293E1	
+0x7171	0x293E6	
+0x7172	0x293E2	
+0x7173	0x2940C	
+0x7174	0x29440	
+0x7175	0x29549	
+0x7176	0x2954A	
+0x7177	0x29554	
+0x7178	0x2954C	
+0x7179	0x29555	
+0x717A	0x29556	
+0x717B	0x2963B	
+0x717C	0x2963D	
+0x717D	0x297A4	
+0x717E	0x297A8	
+0x7221	0x297C3	
+0x7222	0x297BF	
+0x7223	0x297C8	
+0x7224	0x297C2	
+0x7225	0x297CA	
+0x7226	0x297CC	
+0x7227	0x297C9	
+0x7228	0x297BE	
+0x7229	0x297CD	
+0x722A	0x297C7	
+0x722B	0x297C5	
+0x722C	0x2985D	
+0x722E	0x2996C	
+0x722F	0x2996B	
+0x7230	0x29970	
+0x7231	0x2996D	
+0x7232	0x2996F	
+0x7233	0x29989	
+0x7234	0x29984	
+0x7235	0x29A8D	
+0x7236	0x29A8A	
+0x7237	0x29A8E	
+0x7238	0x29A91	
+0x7239	0x29BB5	
+0x723A	0x29BB1	
+0x723B	0x29BAF	
+0x723C	0x29BB9	
+0x723D	0x29BB7	
+0x723E	0x29BB0	
+0x7240	0x29C17	
+0x7242	0x29C4F	
+0x7243	0x29D19	
+0x7244	0x29D10	
+0x7245	0x29D18	
+0x7246	0x29D11	
+0x7247	0x29D1C	
+0x7248	0x29D12	
+0x7249	0x29E76	
+0x724A	0x29E71	
+0x724C	0x29E7A	
+0x724D	0x29E7F	
+0x724F	0x29E73	
+0x7250	0x29EAB	
+0x7252	0x29E77	
+0x7253	0x29E74	
+0x7254	0x29E7E	
+0x7255	0x29E9B	
+0x7256	0x29E84	
+0x7257	0x29E7C	
+0x7258	0x2A129	
+0x7259	0x2A12B	
+0x725A	0x2A10E	
+0x725B	0x2A100	
+0x725C	0x2A10B	
+0x725D	0x2A0FE	
+0x725E	0x2A0FA	
+0x725F	0x2A117	
+0x7260	0x2A0FF	
+0x7261	0x2A10C	
+0x7262	0x2A10F	
+0x7264	0x2A102	
+0x7265	0x2A101	
+0x7266	0x2A0FC	
+0x7267	0x2A149	
+0x7268	0x2A106	
+0x7269	0x2A112	
+0x726A	0x2A113	
+0x726B	0x2A278	
+0x726C	0x2A35B	
+0x726D	0x2A362	
+0x726E	0x2A35F	
+0x726F	0x2A35D	
+0x7270	0x2A3AB	
+0x7271	0x2A3D5	
+0x7272	0x2A3D4	
+0x7273	0x2A3D3	
+0x7274	0x2A407	
+0x7275	0x2A46C	
+0x7276	0x2A470	
+0x7277	0x2A46E	
+0x7278	0x2A468	
+0x7279	0x2A46D	
+0x727A	0x2A477	
+0x727B	0x2A46A	
+0x727C	0x2A4CE	
+0x727D	0x2A4EC	
+0x727E	0x2A569	
+0x7321	0x2A568	
+0x7322	0x2A5A6	
+0x7323	0x2A5A9	
+0x7324	0x2A5AA	
+0x7325	0x2A600	
+0x7326	0x2A60D	
+0x7327	0x2A5F8	
+0x7328	0x2A5FC	
+0x7329	0x2A60A	
+0x732A	0x2A5F7	
+0x732B	0x2A601	
+0x732C	0x2A6B6	
+0x732D	0x2A6BB	
+0x732E	0x2A6B7	
+0x732F	0x2A6B9	
+0x7330	0x2A6CA	
+0x7331	0x20469	
+0x7332	0x20625	
+0x7333	0x21159	
+0x7334	0x21507	
+0x7335	0x21509	
+0x7336	0x21922	
+0x7337	0x21B07	
+0x7338	0x21B04	
+0x7339	0x2330F	
+0x733A	0x21CF8	
+0x733B	0x21FC7	
+0x733C	0x21FD1	
+0x733D	0x2217E	
+0x733E	0x22308	
+0x733F	0x2244A	
+0x7340	0x2F898	
+0x7341	0x224B9	
+0x7342	0x22E88	
+0x7343	0x22E91	
+0x7344	0x22E84	
+0x7345	0x22E73	
+0x7346	0x22E89	
+0x7347	0x22E85	
+0x7348	0x23033	
+0x7349	0x23313	
+0x734A	0x2381D	
+0x734B	0x2381F	
+0x734C	0x2381C	
+0x734D	0x23820	
+0x734E	0x2381A	
+0x734F	0x2381B	
+0x7350	0x23939	
+0x7351	0x239AF	
+0x7352	0x23AE5	
+0x7353	0x23C3C	
+0x7354	0x24137	
+0x7355	0x2413A	
+0x7356	0x244BB	
+0x7358	0x24710	
+0x7359	0x2470D	
+0x735A	0x24BAF	
+0x735B	0x24C11	
+0x735D	0x24F0D	
+0x735E	0x24F0C	
+0x735F	0x24F0B	
+0x7360	0x250D4	
+0x7361	0x2533D	
+0x7362	0x2533E	
+0x7363	0x2533B	
+0x7364	0x25343	
+0x7365	0x25340	
+0x7366	0x25346	
+0x7367	0x25411	
+0x7368	0x255DD	
+0x7369	0x255DF	
+0x736A	0x255EA	
+0x736B	0x2574A	
+0x736C	0x25906	
+0x736D	0x25DC1	
+0x736E	0x25DB9	
+0x736F	0x25DC6	
+0x7370	0x25DB8	
+0x7371	0x25DBB	
+0x7372	0x25DC8	
+0x7373	0x25DC5	
+0x7374	0x25DBF	
+0x7375	0x25DC7	
+0x7376	0x25DC4	
+0x7377	0x25F65	
+0x7378	0x25F67	
+0x7379	0x261D7	
+0x737A	0x261DB	
+0x737B	0x261D4	
+0x737C	0x261D6	
+0x737D	0x263E8	
+0x737E	0x2660A	
+0x7421	0x26ABD	
+0x7422	0x26ABE	
+0x7423	0x2711A	
+0x7424	0x2710D	
+0x7425	0x2710F	
+0x7426	0x2711B	
+0x7427	0x27110	
+0x7428	0x27111	
+0x7429	0x27113	
+0x742A	0x27218	
+0x742B	0x27520	
+0x742C	0x2751F	
+0x742D	0x27523	
+0x742E	0x2751D	
+0x742F	0x27537	
+0x7430	0x27525	
+0x7431	0x27524	
+0x7432	0x2752A	
+0x7433	0x27527	
+0x7434	0x27533	
+0x7435	0x27528	
+0x7436	0x27534	
+0x7437	0x277BA	
+0x7439	0x2789D	
+0x743A	0x2794C	
+0x743B	0x27B5C	
+0x743C	0x27B6A	
+0x743D	0x27B5D	
+0x743E	0x27B65	
+0x743F	0x27B63	
+0x7440	0x27B5E	
+0x7441	0x27C19	
+0x7442	0x27C97	
+0x7443	0x27E3F	
+0x7444	0x27E33	
+0x7445	0x27E32	
+0x7446	0x27FA1	
+0x7447	0x27FA5	
+0x7448	0x27FA4	
+0x7449	0x27FA2	
+0x744A	0x281C1	
+0x744C	0x281C7	
+0x744D	0x281C4	
+0x744E	0x281C6	
+0x744F	0x281C5	
+0x7450	0x281D4	
+0x7451	0x281CA	
+0x7452	0x28653	
+0x7453	0x288F1	
+0x7454	0x28921	
+0x7456	0x28BB7	
+0x7457	0x28B92	
+0x7458	0x28DD4	
+0x7459	0x28F44	
+0x745A	0x29198	
+0x745B	0x2919B	
+0x745C	0x29191	
+0x745D	0x29195	
+0x745E	0x2919A	
+0x745F	0x29192	
+0x7460	0x29353	
+0x7461	0x29357	
+0x7463	0x2935C	
+0x7464	0x2935D	
+0x7465	0x29364	
+0x7466	0x293EA	
+0x7467	0x293ED	
+0x7468	0x29442	
+0x7469	0x29443	
+0x746A	0x29564	
+0x746B	0x29561	
+0x746C	0x29560	
+0x746D	0x2967D	
+0x746E	0x297D4	
+0x746F	0x297D5	
+0x7470	0x297D9	
+0x7471	0x29987	
+0x7472	0x29999	
+0x7473	0x2998C	
+0x7474	0x2998A	
+0x7475	0x2998F	
+0x7477	0x2998B	
+0x7478	0x29982	
+0x7479	0x2999B	
+0x747B	0x29BC8	
+0x747C	0x29BC4	
+0x747D	0x29BCC	
+0x747E	0x29BC7	
+0x7521	0x29BC3	
+0x7522	0x29BC6	
+0x7523	0x29BCB	
+0x7524	0x29BCA	
+0x7525	0x29BC9	
+0x7526	0x29BCD	
+0x7527	0x29C53	
+0x7528	0x29D21	
+0x7529	0x29D29	
+0x752A	0x29D1D	
+0x752B	0x29D24	
+0x752C	0x29D28	
+0x752E	0x29EB1	
+0x752F	0x29EB2	
+0x7530	0x29EB5	
+0x7531	0x29ED6	
+0x7532	0x29EAF	
+0x7533	0x29ECA	
+0x7534	0x29EB8	
+0x7535	0x2FA12	
+0x7536	0x2FA11	
+0x7537	0x2A145	
+0x7538	0x2A147	
+0x7539	0x2A134	
+0x753A	0x2A16E	
+0x753B	0x2A142	
+0x753C	0x2A131	
+0x753D	0x2A12E	
+0x753E	0x2A156	
+0x753F	0x2A138	
+0x7540	0x2A137	
+0x7541	0x2A14B	
+0x7542	0x2A12D	
+0x7543	0x2A133	
+0x7544	0x2A136	
+0x7546	0x2A148	
+0x7547	0x2A2DC	
+0x7549	0x2A366	
+0x754A	0x2A36D	
+0x754B	0x2A363	
+0x754C	0x2A364	
+0x754E	0x2A367	
+0x754F	0x2A3D9	
+0x7550	0x2A40B	
+0x7551	0x2A47E	
+0x7552	0x2A48B	
+0x7553	0x2A526	
+0x7554	0x2A52C	
+0x7555	0x2A529	
+0x7556	0x2A56F	
+0x7557	0x2A56B	
+0x7558	0x2A56D	
+0x7559	0x2A56E	
+0x755A	0x2A61C	
+0x755B	0x2A611	
+0x755C	0x2A610	
+0x755D	0x2A624	
+0x755E	0x2A612	
+0x755F	0x2A615	
+0x7560	0x2A617	
+0x7562	0x2046F	
+0x7563	0x205AB	
+0x7564	0x2082E	
+0x7565	0x208C9	
+0x7566	0x20B96	
+0x7567	0x21185	
+0x7568	0x216A0	
+0x7569	0x2192B	
+0x756A	0x2230D	
+0x756B	0x23036	
+0x756F	0x233B1	
+0x7570	0x2384A	
+0x7571	0x23837	
+0x7572	0x2383C	
+0x7573	0x23838	
+0x7574	0x2383A	
+0x7575	0x2383E	
+0x7576	0x23849	
+0x7579	0x23A80	
+0x757A	0x23A7F	
+0x757B	0x23AE3	
+0x757C	0x23C3F	
+0x757D	0x24152	
+0x757E	0x2414E	
+0x7621	0x2414A	
+0x7622	0x2414B	
+0x7623	0x244D5	
+0x7624	0x24AD8	
+0x7625	0x24B20	
+0x7626	0x24BB3	
+0x7627	0x24BB1	
+0x7628	0x24BB0	
+0x7629	0x24F17	
+0x762A	0x250D9	
+0x762B	0x25349	
+0x762C	0x25413	
+0x762D	0x255ED	
+0x762E	0x255EB	
+0x762F	0x255EE	
+0x7630	0x2590A	
+0x7631	0x2590B	
+0x7632	0x25A4A	
+0x7633	0x25DD5	
+0x7634	0x25DD7	
+0x7635	0x25DDE	
+0x7636	0x25DDC	
+0x7637	0x25DEE	
+0x7638	0x25F70	
+0x763A	0x261D9	
+0x763B	0x263D7	
+0x763C	0x268CB	
+0x763D	0x268C7	
+0x763E	0x269FC	
+0x763F	0x2713B	
+0x7640	0x27139	
+0x7641	0x2714B	
+0x7642	0x27143	
+0x7643	0x27140	
+0x7644	0x27146	
+0x7645	0x2754D	
+0x7646	0x27543	
+0x7647	0x27547	
+0x7648	0x2754B	
+0x7649	0x27555	
+0x764A	0x27552	
+0x764B	0x27B5F	
+0x764D	0x27B7C	
+0x764E	0x27B7B	
+0x764F	0x27FA8	
+0x7650	0x27FA9	
+0x7651	0x281DE	
+0x7652	0x281D7	
+0x7653	0x281DD	
+0x7654	0x281D6	
+0x7655	0x281D8	
+0x7656	0x2829B	
+0x7657	0x283E0	
+0x7658	0x283E8	
+0x7659	0x283E6	
+0x765A	0x288F8	
+0x765B	0x288FB	
+0x765C	0x28BBB	
+0x765E	0x28BB8	
+0x7660	0x28CC1	
+0x7661	0x28CC0	
+0x7662	0x291A4	
+0x7663	0x291AB	
+0x7664	0x2924D	
+0x7665	0x29365	
+0x7666	0x29367	
+0x7667	0x2936A	
+0x7668	0x29366	
+0x7669	0x29369	
+0x766A	0x29573	
+0x766B	0x29580	
+0x766C	0x2956F	
+0x766D	0x29571	
+0x766E	0x297E4	
+0x766F	0x297E6	
+0x7670	0x297E7	
+0x7671	0x299A0	
+0x7672	0x299A4	
+0x7673	0x29AA2	
+0x7674	0x29AA7	
+0x7675	0x29AA4	
+0x7676	0x29BDE	
+0x7677	0x29BDB	
+0x7678	0x29C58	
+0x7679	0x29C5C	
+0x767A	0x29D2F	
+0x767B	0x29D2E	
+0x767C	0x29EDD	
+0x767D	0x29EE4	
+0x767E	0x29ED8	
+0x7721	0x29EE7	
+0x7722	0x29EDA	
+0x7723	0x29E75	
+0x7725	0x2A179	
+0x7726	0x2A180	
+0x7727	0x2A17F	
+0x7728	0x2A17C	
+0x7729	0x2A175	
+0x772A	0x2A17B	
+0x772B	0x2A182	
+0x772D	0x2A189	
+0x772E	0x2A174	
+0x772F	0x2A17D	
+0x7730	0x2A17A	
+0x7731	0x2A186	
+0x7732	0x2A1A8	
+0x7733	0x2A172	
+0x7735	0x2A18B	
+0x7736	0x2A191	
+0x7737	0x2A1B3	
+0x7738	0x2A181	
+0x7739	0x2A282	
+0x773A	0x2A2E1	
+0x773B	0x2A2E3	
+0x773C	0x2A2E2	
+0x773D	0x2A376	
+0x773E	0x2A374	
+0x773F	0x2A372	
+0x7740	0x2A375	
+0x7741	0x2A40E	
+0x7742	0x2A40D	
+0x7743	0x2A494	
+0x7744	0x2A492	
+0x7745	0x2A493	
+0x7746	0x2A491	
+0x7747	0x2A48F	
+0x7748	0x2A495	
+0x7749	0x2A4D0	
+0x774A	0x2A4F7	
+0x774B	0x2A576	
+0x774C	0x2A5AF	
+0x774E	0x2A626	
+0x774F	0x2A625	
+0x7750	0x2A62D	
+0x7751	0x2A6A0	
+0x7752	0x2A6C3	
+0x7753	0x204D7	
+0x7754	0x20ACC	
+0x7755	0x21179	
+0x7756	0x2117A	
+0x7757	0x21515	
+0x7758	0x21FDB	
+0x7759	0x22185	
+0x775A	0x22970	
+0x775B	0x2297B	
+0x775C	0x22EA5	
+0x775D	0x22E9F	
+0x775E	0x23317	
+0x775F	0x233B2	
+0x7760	0x23839	
+0x7761	0x23840	
+0x7762	0x2384E	
+0x7763	0x2393E	
+0x7764	0x23AE8	
+0x7765	0x23AE7	
+0x7766	0x24166	
+0x7767	0x24161	
+0x7768	0x244DA	
+0x7769	0x24714	
+0x776A	0x248DF	
+0x776B	0x24F18	
+0x776C	0x25039	
+0x776D	0x2503A	
+0x776E	0x25730	
+0x776F	0x25732	
+0x7770	0x2590E	
+0x7771	0x25A4C	
+0x7772	0x25DE8	
+0x7773	0x25DF1	
+0x7774	0x25DEB	
+0x7775	0x25DEC	
+0x7776	0x25F74	
+0x7777	0x25F73	
+0x7778	0x261F1	
+0x7779	0x26342	
+0x777A	0x2633E	
+0x777B	0x26341	
+0x777C	0x2652C	
+0x777D	0x268D2	
+0x777E	0x269BB	
+0x7821	0x27158	
+0x7822	0x27157	
+0x7823	0x27156	
+0x7824	0x2715A	
+0x7826	0x27561	
+0x7827	0x27568	
+0x7828	0x27565	
+0x7829	0x2755F	
+0x782A	0x27564	
+0x782B	0x2755E	
+0x782C	0x2755B	
+0x782D	0x27567	
+0x782E	0x277C3	
+0x782F	0x278A2	
+0x7830	0x27953	
+0x7831	0x27B7D	
+0x7832	0x27C20	
+0x7833	0x27FAE	
+0x7834	0x27FAF	
+0x7835	0x27FB0	
+0x7836	0x281E7	
+0x7837	0x281E6	
+0x7838	0x281E9	
+0x7839	0x283F1	
+0x783A	0x283EB	
+0x783B	0x283EA	
+0x783C	0x283E9	
+0x783D	0x28663	
+0x783E	0x28902	
+0x783F	0x288FE	
+0x7840	0x28BDE	
+0x7841	0x28CC2	
+0x7842	0x28DE6	
+0x7843	0x28F5D	
+0x7844	0x291AD	
+0x7845	0x29375	
+0x7846	0x29372	
+0x7847	0x29377	
+0x7849	0x29651	
+0x784A	0x297E8	
+0x784B	0x297ED	
+0x784C	0x297EE	
+0x784D	0x299B9	
+0x784E	0x299A1	
+0x784F	0x299B6	
+0x7850	0x29AAE	
+0x7851	0x29BE8	
+0x7853	0x29C1E	
+0x7854	0x29D31	
+0x7855	0x29D32	
+0x7857	0x29F0E	
+0x7858	0x29F12	
+0x7859	0x29F09	
+0x785A	0x29F05	
+0x785C	0x29F03	
+0x785D	0x29F1F	
+0x785E	0x29F0D	
+0x785F	0x29F0C	
+0x7860	0x29F04	
+0x7861	0x29F0A	
+0x7862	0x2A1C2	
+0x7863	0x2A1BF	
+0x7864	0x2A1C9	
+0x7865	0x2A1B2	
+0x7866	0x2A1C1	
+0x7867	0x2A1AF	
+0x7868	0x2A1B4	
+0x7869	0x2A1B0	
+0x786A	0x2A1B6	
+0x786B	0x2A1B7	
+0x786C	0x2A1BB	
+0x786D	0x2A1B1	
+0x786E	0x2A2F0	
+0x786F	0x2A378	
+0x7870	0x2A37A	
+0x7871	0x2A379	
+0x7872	0x2A3E4	
+0x7873	0x2A3E6	
+0x7874	0x2A49F	
+0x7875	0x2A49D	
+0x7876	0x2A498	
+0x7877	0x2A499	
+0x7878	0x2A4F9	
+0x7879	0x2A530	
+0x787A	0x2A582	
+0x787B	0x2A581	
+0x787C	0x2A5B3	
+0x787D	0x2A57F	
+0x787E	0x2A63A	
+0x7921	0x2A63E	
+0x7922	0x2A648	
+0x7923	0x21186	
+0x7924	0x21936	
+0x7925	0x21B13	
+0x7926	0x21C22	
+0x7927	0x21FDD	
+0x7928	0x225A7	
+0x7929	0x2297D	
+0x792B	0x2331C	
+0x792C	0x23865	
+0x792D	0x23860	
+0x792E	0x23867	
+0x7930	0x23B1A	
+0x7931	0x24AE3	
+0x7932	0x25734	
+0x7933	0x25918	
+0x7934	0x25A52	
+0x7935	0x25DFC	
+0x7936	0x25F79	
+0x7937	0x25F78	
+0x7938	0x25F76	
+0x7939	0x261FA	
+0x793A	0x261F8	
+0x793B	0x2652D	
+0x793C	0x268D6	
+0x793D	0x269BD	
+0x793E	0x269BF	
+0x793F	0x269BE	
+0x7940	0x27144	
+0x7941	0x27170	
+0x7942	0x27162	
+0x7943	0x2716E	
+0x7944	0x2756E	
+0x7945	0x2757C	
+0x7946	0x27574	
+0x7947	0x27578	
+0x7948	0x27570	
+0x7949	0x27579	
+0x794A	0x27571	
+0x794B	0x277CC	
+0x794C	0x278A7	
+0x794D	0x278A6	
+0x794E	0x27B93	
+0x794F	0x27C21	
+0x7950	0x27C9C	
+0x7951	0x2829D	
+0x7952	0x283F4	
+0x7953	0x283F3	
+0x7954	0x28DF0	
+0x7955	0x291B8	
+0x7956	0x291B6	
+0x7957	0x291BD	
+0x7958	0x29373	
+0x7959	0x29382	
+0x795A	0x29587	
+0x795B	0x29656	
+0x795C	0x29659	
+0x795D	0x297F6	
+0x795E	0x299C9	
+0x795F	0x299C5	
+0x7960	0x299C7	
+0x7961	0x299CA	
+0x7962	0x299C2	
+0x7963	0x299C4	
+0x7964	0x29BF2	
+0x7965	0x29BF0	
+0x7966	0x29D3B	
+0x7967	0x29D3A	
+0x7968	0x29F26	
+0x7969	0x29F28	
+0x796A	0x29F34	
+0x796B	0x29F2D	
+0x796C	0x2A1D7	
+0x796D	0x2A1D2	
+0x796E	0x2A1D6	
+0x796F	0x2A1DC	
+0x7970	0x2A1D3	
+0x7971	0x2A1D1	
+0x7972	0x2A286	
+0x7974	0x2A2EF	
+0x7975	0x2A2EE	
+0x7976	0x2A3E8	
+0x7977	0x2A4AC	
+0x7978	0x2A4A9	
+0x7979	0x2A4AA	
+0x797A	0x2A4AB	
+0x797B	0x2A4FB	
+0x797C	0x2A533	
+0x797D	0x2A588	
+0x797E	0x2A5B6	
+0x7A21	0x2A5B7	
+0x7A22	0x2A5D0	
+0x7A23	0x2A5CF	
+0x7A24	0x2A64F	
+0x7A25	0x2A659	
+0x7A26	0x2A64C	
+0x7A27	0x21B18	
+0x7A28	0x21FE0	
+0x7A29	0x23869	
+0x7A2A	0x24173	
+0x7A2B	0x24172	
+0x7A2C	0x24AE8	
+0x7A2D	0x255FB	
+0x7A2E	0x2591C	
+0x7A2F	0x25E09	
+0x7A30	0x25E0A	
+0x7A31	0x25E08	
+0x7A32	0x25F7D	
+0x7A33	0x25F7F	
+0x7A34	0x26267	
+0x7A35	0x2717A	
+0x7A36	0x2717B	
+0x7A37	0x277D1	
+0x7A38	0x2F9CB	
+0x7A39	0x27B9D	
+0x7A3A	0x27C9D	
+0x7A3B	0x281FC	
+0x7A3C	0x281FB	
+0x7A3D	0x281FD	
+0x7A3E	0x283F5	
+0x7A3F	0x283F6	
+0x7A40	0x28C0F	
+0x7A41	0x28C1D	
+0x7A42	0x291C7	
+0x7A43	0x291C1	
+0x7A44	0x291BF	
+0x7A45	0x29254	
+0x7A46	0x2937F	
+0x7A47	0x293F5	
+0x7A48	0x2958A	
+0x7A49	0x2958C	
+0x7A4A	0x2965C	
+0x7A4B	0x29865	
+0x7A4C	0x299CF	
+0x7A4D	0x299D0	
+0x7A4E	0x29AB8	
+0x7A4F	0x29BFA	
+0x7A50	0x29C66	
+0x7A51	0x29F40	
+0x7A52	0x29F41	
+0x7A54	0x2A1F7	
+0x7A55	0x2A1F3	
+0x7A56	0x2A1EF	
+0x7A57	0x2A1F4	
+0x7A58	0x2A1ED	
+0x7A59	0x2A1F2	
+0x7A5A	0x2A1F1	
+0x7A5B	0x2A1F9	
+0x7A5C	0x2A4B4	
+0x7A5D	0x2A4FC	
+0x7A5E	0x2A5BC	
+0x7A5F	0x2A65E	
+0x7A60	0x2A65B	
+0x7A61	0x2A65F	
+0x7A62	0x2A65D	
+0x7A63	0x2A6CF	
+0x7A64	0x2A6CE	
+0x7A65	0x2193A	
+0x7A66	0x21FE1	
+0x7A67	0x22315	
+0x7A68	0x22314	
+0x7A69	0x24178	
+0x7A6A	0x24179	
+0x7A6B	0x244E6	
+0x7A6C	0x24BB8	
+0x7A6D	0x24F22	
+0x7A6E	0x255FE	
+0x7A6F	0x268DB	
+0x7A70	0x26A06	
+0x7A71	0x26AC8	
+0x7A72	0x27189	
+0x7A73	0x27586	
+0x7A74	0x278AD	
+0x7A75	0x27B99	
+0x7A76	0x27BD8	
+0x7A77	0x27C23	
+0x7A78	0x27D23	
+0x7A79	0x27FB5	
+0x7A7A	0x283F9	
+0x7A7B	0x28907	
+0x7A7C	0x28C1E	
+0x7A7D	0x28DFB	
+0x7A7E	0x28F72	
+0x7B21	0x28F73	
+0x7B22	0x29387	
+0x7B23	0x29449	
+0x7B24	0x2965D	
+0x7B25	0x297F8	
+0x7B26	0x29C03	
+0x7B27	0x29F4E	
+0x7B28	0x29F4D	
+0x7B29	0x29F50	
+0x7B2A	0x29F55	
+0x7B2B	0x2A209	
+0x7B2C	0x2A207	
+0x7B2D	0x2A20C	
+0x7B2E	0x2A203	
+0x7B2F	0x2A206	
+0x7B30	0x2A20B	
+0x7B31	0x2A20A	
+0x7B32	0x2A289	
+0x7B33	0x2A4BB	
+0x7B34	0x2A4FF	
+0x7B35	0x2A536	
+0x7B36	0x2A58B	
+0x7B37	0x2A666	
+0x7B38	0x2A669	
+0x7B39	0x2A667	
+0x7B3A	0x2A6C2	
+0x7B3B	0x2A6D2	
+0x7B3C	0x21FE2	
+0x7B3E	0x22988	
+0x7B3F	0x2335B	
+0x7B40	0x23876	
+0x7B41	0x2417D	
+0x7B42	0x245A6	
+0x7B43	0x2535A	
+0x7B44	0x25E17	
+0x7B45	0x268DC	
+0x7B46	0x2718F	
+0x7B47	0x27594	
+0x7B48	0x27595	
+0x7B49	0x27FB6	
+0x7B4A	0x28204	
+0x7B4B	0x287EE	
+0x7B4C	0x2938A	
+0x7B4D	0x293F9	
+0x7B4E	0x29C07	
+0x7B4F	0x29C1F	
+0x7B50	0x29C2A	
+0x7B51	0x29D45	
+0x7B52	0x29F5C	
+0x7B53	0x29F5B	
+0x7B54	0x29F61	
+0x7B55	0x29F5D	
+0x7B56	0x2A218	
+0x7B57	0x2A21F	
+0x7B58	0x2A383	
+0x7B59	0x2A416	
+0x7B5A	0x2A414	
+0x7B5B	0x2A4BF	
+0x7B5C	0x2A4C0	
+0x7B5D	0x2A673	
+0x7B5E	0x2A6C0	
+0x7B5F	0x21517	
+0x7B60	0x22989	
+0x7B61	0x2591E	
+0x7B62	0x2591F	
+0x7B63	0x25A54	
+0x7B64	0x25E18	
+0x7B65	0x26205	
+0x7B66	0x27195	
+0x7B67	0x27598	
+0x7B68	0x2759B	
+0x7B69	0x27959	
+0x7B6A	0x28208	
+0x7B6B	0x28401	
+0x7B6C	0x291CE	
+0x7B6D	0x293FA	
+0x7B6E	0x29ABE	
+0x7B6F	0x29D47	
+0x7B70	0x29F6A	
+0x7B71	0x29F69	
+0x7B72	0x29F68	
+0x7B73	0x29F67	
+0x7B74	0x2A225	
+0x7B75	0x2A228	
+0x7B76	0x2A4C4	
+0x7B77	0x2A537	
+0x7B78	0x2A58D	
+0x7B79	0x2A58C	
+0x7B7B	0x2F920	
+0x7B7C	0x25E22	
+0x7B7D	0x25F82	
+0x7B7E	0x277D9	
+0x7C21	0x28C38	
+0x7C22	0x293FB	
+0x7C23	0x299E1	
+0x7C24	0x29C72	
+0x7C25	0x29D48	
+0x7C26	0x29F6C	
+0x7C27	0x29F70	
+0x7C28	0x2A231	
+0x7C29	0x2A230	
+0x7C2A	0x2A679	
+0x7C2B	0x25E23	
+0x7C2C	0x268F8	
+0x7C2D	0x29C74	
+0x7C2E	0x29F73	
+0x7C2F	0x2A234	
+0x7C30	0x2A387	
+0x7C31	0x2A3B2	
+0x7C32	0x2A5C2	
+0x7C33	0x2A67D	
+0x7C34	0x21FE5	
+0x7C35	0x2938C	
+0x7C36	0x29F77	
+0x7C37	0x29F75	
+0x7C38	0x2A238	
+0x7C39	0x2A23A	
+0x7C3A	0x2A683	
+0x7C3B	0x2A681	
+0x7C3C	0x24180	
+0x7C3D	0x27199	
+0x7C3F	0x2944A	
+0x7C40	0x29D4A	
+0x7C41	0x2A23C	
+0x7C42	0x2A6C8	
+0x7C43	0x25604	
+0x7C44	0x278AF	
+0x7C45	0x2A689	
+0x7C46	0x2A2FA	
+0x7C47	0x29661	
+0x7C48	0x2A23F	
+0x7C49	0x27193	
+0x7C4A	0x2A4C9	
+0x7C4B	0x277DE	
+0x7C4C	0x29391	
+0x7C4D	0x2A68E	
+0x7C4E	0x2A68D	
+0x7C4F	0x27198	
+0x7C50	0x269C5	
+0x7C51	0x2A6A5	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6158 @@
+0x2121	0x2F802
+0x2122	0x20062
+0x2124	0x20088
+0x2125	0x200D0
+0x2126	0x200CF
+0x2127	0x2011E
+0x2128	0x2011F
+0x2129	0x20120
+0x212A	0x2090E
+0x212B	0x2092C
+0x212C	0x20061
+0x212D	0x20004
+0x212E	0x20005
+0x212F	0x20003
+0x2131	0x2F801
+0x2132	0x2007D
+0x2133	0x2008D
+0x2134	0x201A3
+0x2135	0x201A4
+0x2136	0x204DB
+0x2137	0x20500
+0x2138	0x2F81E
+0x2139	0x206A3
+0x213A	0x20832
+0x213C	0x20AD4
+0x213D	0x20AD5
+0x213E	0x21C23
+0x213F	0x2232C
+0x2140	0x2237A
+0x2141	0x20503
+0x2142	0x20007
+0x2143	0x20008
+0x2144	0x2008F
+0x2145	0x2009C
+0x2146	0x200D5
+0x2147	0x20112
+0x2148	0x20113
+0x2149	0x20114
+0x214A	0x20121
+0x214B	0x201A8
+0x214C	0x201A6
+0x214D	0x20476
+0x214E	0x20501
+0x214F	0x2053D
+0x2150	0x2F814
+0x2151	0x2053E
+0x2152	0x20629
+0x2153	0x20677
+0x2154	0x20678
+0x2155	0x206A6
+0x2156	0x206A9
+0x2157	0x206AC
+0x2158	0x20834
+0x2159	0x20504
+0x215A	0x2097B
+0x215B	0x20A10
+0x215C	0x2062F
+0x215D	0x20AD7
+0x215E	0x20B1C
+0x215F	0x20B1F
+0x2160	0x20B1A
+0x2161	0x2F836
+0x2162	0x20B1E
+0x2163	0x20B9E
+0x2164	0x20B9A
+0x2165	0x211A0
+0x2166	0x211A1
+0x2167	0x215D2
+0x2168	0x215D3
+0x2169	0x219B9
+0x216A	0x21B1D
+0x216B	0x21B55
+0x216C	0x21CFF
+0x216D	0x21FE7
+0x216F	0x22011
+0x2170	0x22013
+0x2171	0x22012
+0x2172	0x221AF
+0x2173	0x221B1
+0x2174	0x2F890
+0x2175	0x2232D
+0x2176	0x2237B
+0x2177	0x2239D
+0x2178	0x2239A
+0x217A	0x2239F
+0x217B	0x223A0
+0x217C	0x2239C
+0x217D	0x224BD
+0x2221	0x225AA
+0x2222	0x2306C
+0x2223	0x23091
+0x2224	0x23C74
+0x2225	0x2456A
+0x2226	0x2F929
+0x2227	0x25605
+0x2228	0x2626B
+0x2229	0x2626A
+0x222A	0x200E0
+0x222B	0x20012
+0x222D	0x2007F
+0x222E	0x200A0
+0x222F	0x20099
+0x2230	0x20095
+0x2231	0x2009E
+0x2232	0x200DF
+0x2233	0x200DE
+0x2234	0x201AF
+0x2235	0x201AD
+0x2236	0x201B0
+0x2237	0x204DF
+0x2238	0x20543
+0x2239	0x20541
+0x223A	0x20548
+0x223B	0x20575
+0x223C	0x2F81A
+0x223D	0x20632
+0x223E	0x2067B
+0x223F	0x20679
+0x2240	0x206B3
+0x2242	0x20BA7
+0x2243	0x206B2
+0x2244	0x206B0
+0x2245	0x206B4
+0x2246	0x2F829
+0x2247	0x208CD
+0x2248	0x208CE
+0x2249	0x2F82B
+0x224A	0x20910
+0x224B	0x20980
+0x224C	0x209D3
+0x224D	0x20A30
+0x224E	0x20098
+0x224F	0x20A2F
+0x2250	0x20A31
+0x2251	0x20ADA
+0x2252	0x20AD9
+0x2253	0x20B27
+0x2254	0x20B28
+0x2255	0x20B21
+0x2256	0x20B25
+0x2257	0x20BA6
+0x2258	0x20BA2
+0x2259	0x20BA1
+0x225A	0x20BA4
+0x225B	0x2F839
+0x225C	0x20BAA
+0x225D	0x20BA5
+0x225E	0x20BA3
+0x225F	0x20064
+0x2260	0x2123F
+0x2261	0x21244
+0x2262	0x2151B
+0x2263	0x21553
+0x2264	0x21584
+0x2265	0x21586
+0x2266	0x215D5
+0x2267	0x2F860
+0x2268	0x2193E
+0x2269	0x21940
+0x226A	0x21BCA
+0x226B	0x21BC9
+0x226C	0x21C26
+0x226D	0x21D00
+0x226E	0x21D31
+0x226F	0x21D3C
+0x2270	0x21D30
+0x2271	0x21D33
+0x2272	0x21D32
+0x2273	0x21D38
+0x2274	0x22034
+0x2275	0x22053
+0x2276	0x22054
+0x2277	0x221B4
+0x2278	0x221B2
+0x2279	0x2232F
+0x227A	0x223A5
+0x227B	0x223A7
+0x227C	0x223A4
+0x227D	0x223A8
+0x227E	0x223A9
+0x2321	0x223A2
+0x2322	0x223A3
+0x2323	0x223A6
+0x2324	0x22481
+0x2325	0x22480
+0x2326	0x225AD
+0x2327	0x22A24
+0x2328	0x22A65
+0x2329	0x22A68
+0x232A	0x22A69
+0x232B	0x2313C
+0x232C	0x2313B
+0x232D	0x2335D
+0x232E	0x23944
+0x232F	0x24182
+0x2330	0x244F1
+0x2331	0x2456B
+0x2332	0x2471B
+0x2333	0x248EB
+0x2334	0x24BBA
+0x2335	0x24BD3
+0x2336	0x24D13
+0x2337	0x25922
+0x2338	0x26AF4
+0x2339	0x2820F
+0x233A	0x28210
+0x233B	0x20507
+0x233C	0x29C0B
+0x233D	0x29C0A
+0x233E	0x20019
+0x233F	0x2001A
+0x2340	0x20018
+0x2341	0x20066
+0x2342	0x20082
+0x2343	0x200A8
+0x2344	0x200E5
+0x2345	0x200E7
+0x2346	0x200E4
+0x2347	0x20115
+0x2348	0x20123
+0x2349	0x20124
+0x234A	0x20143
+0x234B	0x201C3
+0x234C	0x201BC
+0x234D	0x201BB
+0x234F	0x201B7
+0x2350	0x201B9
+0x2351	0x201CF
+0x2352	0x2F80D
+0x2353	0x2047A
+0x2354	0x2047B
+0x2355	0x204E1
+0x2356	0x204E0
+0x2357	0x20509
+0x2358	0x2054D
+0x2359	0x2F816
+0x235A	0x2054B
+0x235B	0x20579
+0x235C	0x205B1
+0x235D	0x20636
+0x235E	0x20635
+0x235F	0x20637
+0x2360	0x20638
+0x2361	0x2067F
+0x2362	0x20680
+0x2363	0x20681
+0x2364	0x26953
+0x2365	0x2067E
+0x2366	0x206CD
+0x2367	0x206BF
+0x2368	0x206BE
+0x2369	0x206C2
+0x236A	0x206B8
+0x236B	0x206C1
+0x236D	0x20931
+0x236E	0x2092F
+0x236F	0x2096F
+0x2370	0x20982
+0x2372	0x20987
+0x2373	0x20986
+0x2374	0x2098D
+0x2375	0x20994
+0x2376	0x209D7
+0x2377	0x209D4
+0x2378	0x209D8
+0x2379	0x20A16
+0x237A	0x20A14
+0x237B	0x20A2E
+0x237C	0x20A36
+0x237D	0x20A37
+0x237E	0x21FEE
+0x2421	0x20AE0
+0x2422	0x20AE5
+0x2423	0x20ADF
+0x2424	0x20B2B
+0x2425	0x20B29
+0x2426	0x20B2D
+0x2427	0x20B2F
+0x2428	0x20BB7
+0x2429	0x20BC9
+0x242A	0x20BC1
+0x242B	0x20BCA
+0x242C	0x20BB2
+0x242D	0x20BAC
+0x242E	0x20BAE
+0x242F	0x211B2
+0x2430	0x211A8
+0x2431	0x211B0
+0x2432	0x211A7
+0x2433	0x2F851
+0x2434	0x21252
+0x2435	0x2124A
+0x2436	0x21556
+0x2437	0x21555
+0x2438	0x2155F
+0x2439	0x2155E
+0x243A	0x21588
+0x243B	0x2F85D
+0x243C	0x215DD
+0x243D	0x215E2
+0x243E	0x215E1
+0x243F	0x215DF
+0x2440	0x215E0
+0x2441	0x216AF
+0x2442	0x216B1
+0x2443	0x216BA
+0x2444	0x21945
+0x2445	0x21943
+0x2446	0x219BD
+0x2447	0x219C8
+0x2448	0x2F86C
+0x2449	0x219BE
+0x244A	0x219BF
+0x244B	0x2F874
+0x244C	0x21B59
+0x244D	0x21C29
+0x244E	0x21C2C
+0x244F	0x21C2F
+0x2450	0x21C2D
+0x2451	0x21C2E
+0x2452	0x21D04
+0x2453	0x21D02
+0x2454	0x21D01
+0x2455	0x21D40
+0x2456	0x21D4A
+0x2457	0x21D3F
+0x2458	0x21D4F
+0x2459	0x21D41
+0x245A	0x21D4E
+0x245B	0x21FEB
+0x245C	0x21FEC
+0x245D	0x200AC
+0x245E	0x2205B
+0x245F	0x22063
+0x2460	0x2205A
+0x2461	0x22059
+0x2462	0x221DC
+0x2463	0x221DB
+0x2464	0x221D9
+0x2465	0x221E0
+0x2466	0x221DD
+0x2467	0x20020
+0x2468	0x223B0
+0x2469	0x223B1
+0x246A	0x223B2
+0x246B	0x223B6
+0x246C	0x22451
+0x246D	0x22452
+0x246E	0x22450
+0x246F	0x22484
+0x2471	0x22483
+0x2472	0x225C3
+0x2473	0x225B8
+0x2474	0x225B9
+0x2475	0x225B2
+0x2476	0x22990
+0x2477	0x22A26
+0x2478	0x22A29
+0x2479	0x22A6E
+0x247A	0x23140
+0x247B	0x2313E
+0x247C	0x23141
+0x247D	0x2335E
+0x247E	0x233BB
+0x2521	0x233BC
+0x2522	0x233B9
+0x2523	0x2F8EF
+0x2524	0x23880
+0x2526	0x23945
+0x2527	0x239BA
+0x2528	0x239BD
+0x2529	0x23C56
+0x252A	0x23C55
+0x252B	0x23C75
+0x252C	0x23C77
+0x252D	0x23C81
+0x252E	0x2F8FA
+0x252F	0x23C83
+0x2530	0x23C8B
+0x2531	0x23C84
+0x2532	0x24186
+0x2533	0x24183
+0x2534	0x2418B
+0x2535	0x2456D
+0x2536	0x24616
+0x2537	0x24728
+0x2538	0x248EA
+0x2539	0x24BD4
+0x253A	0x24C03
+0x253B	0x24D15
+0x253C	0x24F3D
+0x253D	0x24F3E
+0x253E	0x25416
+0x253F	0x2F94C
+0x2540	0x25606
+0x2541	0x2574D
+0x2542	0x26222
+0x2543	0x26273
+0x2544	0x2626D
+0x2545	0x2626E
+0x2546	0x264B1
+0x2547	0x2054E
+0x2548	0x2662D
+0x254A	0x268F9
+0x254B	0x26952
+0x254C	0x26B00
+0x254D	0x26AFC
+0x254E	0x26AFA
+0x2550	0x26AF7
+0x2551	0x26AF8
+0x2552	0x2F990
+0x2553	0x2F9C4
+0x2554	0x27C27
+0x2555	0x28211
+0x2556	0x200AE
+0x2557	0x28450
+0x2558	0x2844F
+0x2559	0x2844D
+0x255A	0x28671
+0x255B	0x2F9E2
+0x255C	0x28672
+0x255D	0x28E18
+0x255E	0x20A44
+0x255F	0x20021
+0x2560	0x20067
+0x2561	0x200AF
+0x2562	0x200B0
+0x2563	0x20029
+0x2564	0x20117
+0x2565	0x20122
+0x2566	0x2F803
+0x2567	0x20025
+0x2568	0x20128
+0x2569	0x201FF
+0x256A	0x201D9
+0x256B	0x201DB
+0x256C	0x201DE
+0x256D	0x201F2
+0x256E	0x201FE
+0x256F	0x201F4
+0x2570	0x201DD
+0x2572	0x2F804
+0x2573	0x20201
+0x2574	0x201DC
+0x2575	0x2047D
+0x2576	0x20481
+0x2577	0x2047E
+0x2578	0x2047F
+0x2579	0x204E5
+0x257A	0x2050F
+0x257C	0x2050A
+0x257E	0x2050B
+0x2621	0x20551
+0x2622	0x20552
+0x2623	0x20550
+0x2624	0x205B8
+0x2625	0x2063D
+0x2626	0x2063E
+0x2627	0x2063C
+0x2628	0x20687
+0x2629	0x206D7
+0x262A	0x206DB
+0x262B	0x206CF
+0x262C	0x206E0
+0x262D	0x2084C
+0x262E	0x20842
+0x262F	0x208D4
+0x2630	0x20911
+0x2631	0x20914
+0x2632	0x20915
+0x2633	0x20912
+0x2634	0x20933
+0x2635	0x20935
+0x2637	0x20971
+0x2639	0x20991
+0x263A	0x20993
+0x263B	0x20995
+0x263C	0x209DC
+0x263D	0x20A42
+0x263E	0x20A40
+0x263F	0x253A6
+0x2640	0x20AE6
+0x2641	0x2128F
+0x2642	0x20B32
+0x2643	0x2F837
+0x2644	0x20B31
+0x2645	0x20BF5
+0x2646	0x20BCD
+0x2647	0x20BDE
+0x2648	0x20BD5
+0x2649	0x20BDA
+0x264A	0x20BEE
+0x264B	0x20BEC
+0x264C	0x20BCF
+0x264D	0x20BCE
+0x264E	0x2F83D
+0x264F	0x20BCC
+0x2650	0x20BF3
+0x2651	0x211C1
+0x2652	0x211C4
+0x2653	0x211C6
+0x2654	0x211B4
+0x2655	0x211C3
+0x2656	0x211B8
+0x2657	0x211BB
+0x2658	0x211B7
+0x2659	0x211BC
+0x265A	0x211BF
+0x265B	0x211C7
+0x265C	0x211BE
+0x265D	0x21260
+0x265E	0x2125D
+0x265F	0x21276
+0x2660	0x2126C
+0x2661	0x21275
+0x2662	0x2125B
+0x2663	0x21271
+0x2664	0x21273
+0x2665	0x21261
+0x2666	0x2125A
+0x2667	0x21262
+0x2668	0x21272
+0x2669	0x2125F
+0x266A	0x21258
+0x266B	0x2151E
+0x266C	0x21558
+0x266D	0x2158B
+0x266E	0x2158A
+0x266F	0x215F4
+0x2670	0x215F0
+0x2671	0x216D2
+0x2672	0x216CD
+0x2673	0x216CE
+0x2674	0x216BC
+0x2675	0x216D0
+0x2676	0x21946
+0x2677	0x21947
+0x267B	0x219CE
+0x267C	0x219CF
+0x267D	0x219CC
+0x267E	0x219CB
+0x2721	0x2F872
+0x2722	0x21B60
+0x2723	0x21B5F
+0x2724	0x21B5D
+0x2725	0x21BD4
+0x2726	0x21C3A
+0x2727	0x21C38
+0x2728	0x21C3C
+0x2729	0x21C36
+0x272A	0x21D08
+0x272B	0x21D7E
+0x272C	0x21D5E
+0x272D	0x21D6E
+0x272E	0x21D53
+0x272F	0x21D70
+0x2730	0x21D57
+0x2731	0x21D5D
+0x2732	0x21D63
+0x2733	0x21D7A
+0x2734	0x21D79
+0x2735	0x21D93
+0x2736	0x2F881
+0x2737	0x2201D
+0x2738	0x22068
+0x2739	0x22073
+0x273A	0x22074
+0x273B	0x22066
+0x273C	0x2206F
+0x273D	0x22075
+0x273E	0x2207A
+0x273F	0x22070
+0x2740	0x2206D
+0x2741	0x22065
+0x2742	0x2218A
+0x2743	0x221ED
+0x2744	0x221E9
+0x2745	0x221E3
+0x2746	0x221EF
+0x2748	0x221EA
+0x2749	0x22331
+0x274A	0x2F891
+0x274B	0x22338
+0x274C	0x26B20
+0x274D	0x22335
+0x274E	0x2233A
+0x274F	0x22381
+0x2750	0x22380
+0x2751	0x223B8
+0x2752	0x223C1
+0x2753	0x223BA
+0x2754	0x22488
+0x2755	0x224CF
+0x2756	0x224CA
+0x2757	0x224C7
+0x2758	0x224C5
+0x2759	0x224C8
+0x275A	0x224D0
+0x275B	0x224C9
+0x275C	0x225BB
+0x275D	0x225B6
+0x275E	0x225BD
+0x275F	0x2F89D
+0x2760	0x225B4
+0x2761	0x225C1
+0x2762	0x225D1
+0x2763	0x225D2
+0x2764	0x225CC
+0x2765	0x225D4
+0x2766	0x225CB
+0x2767	0x225CE
+0x2768	0x225D5
+0x2769	0x225D8
+0x276A	0x22995
+0x276B	0x22993
+0x276C	0x22999
+0x276D	0x22996
+0x276F	0x22A89
+0x2770	0x22A94
+0x2771	0x22A91
+0x2772	0x22A8F
+0x2773	0x22A84
+0x2774	0x22A97
+0x2775	0x22A86
+0x2776	0x22A85
+0x2777	0x22A8C
+0x2778	0x22EF2
+0x2779	0x22EED
+0x277A	0x22EEF
+0x277B	0x230D9
+0x277C	0x23146
+0x277D	0x23147
+0x277E	0x2314B
+0x2821	0x23150
+0x2822	0x2314A
+0x2823	0x2314E
+0x2824	0x2314C
+0x2825	0x23148
+0x2826	0x23363
+0x2827	0x23361
+0x2828	0x23362
+0x2829	0x23360
+0x282A	0x233C3
+0x282B	0x233C5
+0x282C	0x233C1
+0x282D	0x233D0
+0x282E	0x2F8DC
+0x282F	0x23882
+0x2831	0x23886
+0x2832	0x23884
+0x2833	0x2394C
+0x2834	0x23948
+0x2835	0x239B8
+0x2836	0x239BF
+0x2837	0x239C1
+0x2838	0x239C6
+0x2839	0x239C5
+0x283A	0x239C7
+0x283B	0x239C0
+0x283C	0x239C3
+0x283D	0x23AED
+0x283E	0x23B03
+0x283F	0x23B22
+0x2840	0x23B21
+0x2841	0x23C9F
+0x2842	0x23C90
+0x2843	0x23C9E
+0x2845	0x23CA0
+0x2846	0x23C94
+0x2847	0x23C95
+0x2848	0x23CA1
+0x284B	0x2419A
+0x284C	0x24190
+0x284D	0x244F2
+0x284E	0x244F3
+0x284F	0x2456E
+0x2850	0x245AB
+0x2851	0x245A9
+0x2852	0x2461A
+0x2853	0x24618
+0x2854	0x2461B
+0x2855	0x24760
+0x2856	0x2474C
+0x2857	0x24742
+0x2858	0x24733
+0x2859	0x2473F
+0x285A	0x2473E
+0x285B	0x24738
+0x285C	0x24743
+0x285D	0x24746
+0x285E	0x24736
+0x285F	0x248EE
+0x2860	0x248F5
+0x2861	0x248F4
+0x2863	0x24C1B
+0x2865	0x24D2B
+0x2866	0x24D29
+0x2867	0x24D2A
+0x2868	0x24D2E
+0x2869	0x2503F
+0x286A	0x250E6
+0x286B	0x253A7
+0x286C	0x253A8
+0x286D	0x25418
+0x286E	0x25608
+0x286F	0x25750
+0x2870	0x25753
+0x2871	0x25A56
+0x2872	0x25A55
+0x2873	0x2626F
+0x2874	0x2627F
+0x2875	0x264B3
+0x2876	0x2663A
+0x2877	0x26638
+0x2878	0x26637
+0x2879	0x26636
+0x287A	0x20554
+0x287B	0x2F980
+0x287C	0x268DD
+0x287D	0x268FC
+0x287E	0x268FA
+0x2921	0x26933
+0x2922	0x26B04
+0x2923	0x26B07
+0x2924	0x26B08
+0x2925	0x26B06
+0x2926	0x26B09
+0x2927	0x2F991
+0x2928	0x2F993
+0x2929	0x2721E
+0x292A	0x2F9D2
+0x292B	0x2840B
+0x292C	0x28443
+0x292D	0x28452
+0x292E	0x28458
+0x292F	0x2845E
+0x2930	0x28668
+0x2931	0x2868D
+0x2932	0x28682
+0x2933	0x2867B
+0x2934	0x28C58
+0x2936	0x2F800
+0x2937	0x2002C
+0x2938	0x2002E
+0x2939	0x2160B
+0x293A	0x2002D
+0x293B	0x20069
+0x293C	0x200B2
+0x293D	0x200B6
+0x293E	0x200A9
+0x293F	0x200ED
+0x2940	0x20119
+0x2941	0x2014F
+0x2942	0x20216
+0x2943	0x20203
+0x2944	0x2020E
+0x2945	0x20204
+0x2946	0x20207
+0x2947	0x20210
+0x2948	0x20227
+0x2949	0x20228
+0x294A	0x2020D
+0x294B	0x20229
+0x294C	0x2020F
+0x294D	0x20222
+0x294E	0x20211
+0x294F	0x20485
+0x2950	0x20484
+0x2951	0x20483
+0x2952	0x2048A
+0x2953	0x20486
+0x2954	0x20510
+0x2955	0x20558
+0x2956	0x2055A
+0x2957	0x2070C
+0x2958	0x205C4
+0x2959	0x205C5
+0x295A	0x20647
+0x295B	0x20649
+0x295C	0x2064A
+0x295D	0x2064B
+0x295E	0x221BB
+0x295F	0x2068D
+0x2960	0x2068B
+0x2961	0x20707
+0x2962	0x20706
+0x2963	0x2F820
+0x2964	0x206EF
+0x2965	0x206F0
+0x2966	0x206ED
+0x2967	0x206F9
+0x2968	0x20702
+0x2969	0x206E7
+0x296A	0x206F4
+0x296B	0x206F7
+0x296C	0x206F1
+0x296D	0x20853
+0x296E	0x20855
+0x2970	0x208DA
+0x2971	0x208D9
+0x2973	0x20938
+0x2974	0x20999
+0x2975	0x209A2
+0x2976	0x2099C
+0x2977	0x2099A
+0x2978	0x2099B
+0x2979	0x209E5
+0x297A	0x209E3
+0x297B	0x209E1
+0x297C	0x209E0
+0x297D	0x209E2
+0x297E	0x209E4
+0x2A22	0x209E8
+0x2A23	0x2F82F
+0x2A24	0x20A13
+0x2A25	0x20A56
+0x2A26	0x20A4B
+0x2A27	0x20A4A
+0x2A28	0x20A4D
+0x2A29	0x20A4C
+0x2A2B	0x20AEA
+0x2A2C	0x20AE9
+0x2A2D	0x20AEB
+0x2A2E	0x20AEC
+0x2A2F	0x20B3A
+0x2A30	0x20B3C
+0x2A31	0x20B39
+0x2A32	0x20B3B
+0x2A33	0x20C14
+0x2A34	0x20C0E
+0x2A35	0x20C35
+0x2A36	0x20C0A
+0x2A37	0x20C3F
+0x2A38	0x20C38
+0x2A3A	0x20C4E
+0x2A3B	0x20C17
+0x2A3C	0x2F83F
+0x2A3D	0x20C1E
+0x2A3E	0x211B6
+0x2A3F	0x211CE
+0x2A40	0x211CA
+0x2A41	0x211CB
+0x2A42	0x211CC
+0x2A43	0x211C9
+0x2A44	0x212B4
+0x2A45	0x212AC
+0x2A46	0x21288
+0x2A47	0x21286
+0x2A48	0x2128C
+0x2A49	0x21293
+0x2A4A	0x2128A
+0x2A4B	0x212A4
+0x2A4C	0x21287
+0x2A4D	0x212A5
+0x2A4E	0x212A6
+0x2A4F	0x21285
+0x2A50	0x212A3
+0x2A51	0x2128E
+0x2A52	0x2151F
+0x2A53	0x21563
+0x2A54	0x2158D
+0x2A55	0x215FA
+0x2A56	0x215FB
+0x2A57	0x21609
+0x2A58	0x215FE
+0x2A59	0x215FF
+0x2A5A	0x21602
+0x2A5B	0x21604
+0x2A5C	0x215FD
+0x2A5D	0x21605
+0x2A5E	0x216F9
+0x2A5F	0x216F7
+0x2A60	0x216DB
+0x2A61	0x216DA
+0x2A62	0x21951
+0x2A63	0x21950
+0x2A64	0x21957
+0x2A65	0x219E2
+0x2A66	0x219D8
+0x2A67	0x219DA
+0x2A68	0x219DC
+0x2A69	0x21B20
+0x2A6A	0x21B1F
+0x2A6B	0x21B69
+0x2A6C	0x21BDD
+0x2A6D	0x21C40
+0x2A6E	0x21C41
+0x2A6F	0x21C43
+0x2A70	0x21D0D
+0x2A71	0x21D0C
+0x2A72	0x21D87
+0x2A73	0x21DA9
+0x2A74	0x21D92
+0x2A75	0x21D85
+0x2A77	0x21D8C
+0x2A78	0x21DA2
+0x2A79	0x21D8F
+0x2A7A	0x21D8A
+0x2A7C	0x21D8D
+0x2A7D	0x21FF1
+0x2A7E	0x22037
+0x2B21	0x2208B
+0x2B22	0x22087
+0x2B23	0x22082
+0x2B24	0x2218E
+0x2B25	0x221BC
+0x2B26	0x221F8
+0x2B27	0x221FA
+0x2B28	0x221EB
+0x2B29	0x221F9
+0x2B2A	0x221FC
+0x2B2B	0x22205
+0x2B2C	0x2231B
+0x2B2D	0x2231D
+0x2B2E	0x2231E
+0x2B2F	0x2F892
+0x2B30	0x2233C
+0x2B31	0x2233E
+0x2B32	0x22384
+0x2B33	0x223C8
+0x2B34	0x223C9
+0x2B35	0x223D3
+0x2B36	0x223C7
+0x2B37	0x223D2
+0x2B38	0x22455
+0x2B39	0x2F896
+0x2B3A	0x2248C
+0x2B3B	0x2248A
+0x2B3C	0x224D5
+0x2B3D	0x224D3
+0x2B3F	0x224D8
+0x2B40	0x225D0
+0x2B41	0x225EE
+0x2B42	0x225F1
+0x2B43	0x225FB
+0x2B44	0x225D3
+0x2B45	0x225EC
+0x2B46	0x225CD
+0x2B47	0x22615
+0x2B48	0x22626
+0x2B49	0x2260E
+0x2B4A	0x22627
+0x2B4B	0x2262A
+0x2B4C	0x22600
+0x2B4D	0x22604
+0x2B4E	0x22628
+0x2B4F	0x22608
+0x2B50	0x22614
+0x2B51	0x2299B
+0x2B53	0x229A1
+0x2B54	0x2299D
+0x2B55	0x229A0
+0x2B56	0x2299E
+0x2B57	0x229A2
+0x2B58	0x2299C
+0x2B59	0x22A32
+0x2B5A	0x22A34
+0x2B5B	0x22A93
+0x2B5C	0x22A96
+0x2B5D	0x22A90
+0x2B5E	0x22AB4
+0x2B5F	0x22AB5
+0x2B60	0x2F8B6
+0x2B61	0x22AB6
+0x2B62	0x22AC2
+0x2B63	0x2F8B5
+0x2B64	0x22ABA
+0x2B65	0x22A92
+0x2B66	0x22EFB
+0x2B67	0x22F05
+0x2B68	0x22EF3
+0x2B69	0x22EFE
+0x2B6A	0x22EFD
+0x2B6B	0x2455D
+0x2B6C	0x22EFA
+0x2B6D	0x23043
+0x2B6E	0x23095
+0x2B6F	0x23094
+0x2B71	0x2316F
+0x2B72	0x23173
+0x2B73	0x2315C
+0x2B74	0x2315B
+0x2B75	0x23166
+0x2B76	0x23174
+0x2B77	0x23163
+0x2B78	0x23167
+0x2B79	0x23160
+0x2B7A	0x23162
+0x2B7B	0x23171
+0x2B7C	0x23172
+0x2B7D	0x2315E
+0x2B7E	0x23323
+0x2C21	0x23326
+0x2C22	0x23364
+0x2C23	0x2F8D6
+0x2C24	0x233F2
+0x2C25	0x23401
+0x2C26	0x233DD
+0x2C27	0x233DC
+0x2C28	0x233DB
+0x2C29	0x233F3
+0x2C2A	0x233FD
+0x2C2B	0x233D8
+0x2C2C	0x233F8
+0x2C2D	0x233FB
+0x2C2E	0x23883
+0x2C2F	0x2388C
+0x2C30	0x2388E
+0x2C31	0x23949
+0x2C32	0x23954
+0x2C33	0x23952
+0x2C34	0x2394E
+0x2C35	0x23958
+0x2C36	0x23951
+0x2C37	0x23955
+0x2C38	0x23953
+0x2C39	0x23957
+0x2C3A	0x23950
+0x2C3B	0x2394F
+0x2C3C	0x2394D
+0x2C3D	0x239D2
+0x2C3E	0x239D3
+0x2C3F	0x239C9
+0x2C40	0x239D4
+0x2C41	0x23AEF
+0x2C42	0x2F8F8
+0x2C43	0x200B1
+0x2C44	0x23B05
+0x2C45	0x23B04
+0x2C46	0x23B2E
+0x2C47	0x23B2D
+0x2C48	0x23C45
+0x2C49	0x23C5B
+0x2C4A	0x23C5A
+0x2C4B	0x23C59
+0x2C4C	0x23C9D
+0x2C4D	0x23C8E
+0x2C4E	0x23CBC
+0x2C4F	0x23CDD
+0x2C50	0x23CBA
+0x2C51	0x2F8FD
+0x2C52	0x23CD8
+0x2C53	0x23CCB
+0x2C54	0x23CD9
+0x2C55	0x23CDA
+0x2C56	0x23CC4
+0x2C57	0x23CB8
+0x2C58	0x23CBF
+0x2C59	0x23CDB
+0x2C5A	0x23CC1
+0x2C5B	0x2F8FC
+0x2C5C	0x23CC5
+0x2C5D	0x2F919
+0x2C5E	0x241B1
+0x2C5F	0x241AF
+0x2C60	0x2F918
+0x2C61	0x244F7
+0x2C62	0x244F6
+0x2C63	0x244F8
+0x2C64	0x24550
+0x2C65	0x24551
+0x2C66	0x24571
+0x2C67	0x24570
+0x2C68	0x245B0
+0x2C69	0x245AF
+0x2C6A	0x245AE
+0x2C6B	0x245AD
+0x2C6C	0x24625
+0x2C6D	0x2462C
+0x2C6E	0x24622
+0x2C6F	0x24633
+0x2C70	0x24634
+0x2C72	0x2473A
+0x2C73	0x24740
+0x2C74	0x24768
+0x2C76	0x24764
+0x2C77	0x2475C
+0x2C78	0x24757
+0x2C79	0x24753
+0x2C7A	0x2474F
+0x2C7B	0x24751
+0x2C7C	0x24754
+0x2C7D	0x24766
+0x2D22	0x2490D
+0x2D23	0x24908
+0x2D24	0x2F92B
+0x2D25	0x248FA
+0x2D26	0x24AEA
+0x2D27	0x24B2A
+0x2D28	0x24BBB
+0x2D29	0x24BD5
+0x2D2A	0x24BD7
+0x2D2B	0x21DA4
+0x2D2C	0x200F0
+0x2D2D	0x200B5
+0x2D2E	0x24C06
+0x2D2F	0x24C28
+0x2D30	0x24C22
+0x2D31	0x24C21
+0x2D32	0x22456
+0x2D33	0x24C23
+0x2D34	0x211CD
+0x2D35	0x24D30
+0x2D36	0x24D34
+0x2D37	0x24FC9
+0x2D38	0x24FCA
+0x2D39	0x24FC8
+0x2D3A	0x2F93D
+0x2D3B	0x25044
+0x2D3C	0x250F3
+0x2D3D	0x2F941
+0x2D3E	0x250F8
+0x2D3F	0x250FC
+0x2D40	0x250F6
+0x2D41	0x250FB
+0x2D42	0x250F7
+0x2D43	0x25100
+0x2D44	0x25102
+0x2D45	0x2F940
+0x2D46	0x2F94D
+0x2D47	0x25424
+0x2D48	0x2560D
+0x2D4A	0x25762
+0x2D4B	0x25930
+0x2D4C	0x2592B
+0x2D4D	0x2592A
+0x2D4F	0x2592D
+0x2D50	0x25ADA
+0x2D51	0x25E28
+0x2D52	0x25F86
+0x2D53	0x26277
+0x2D54	0x2627C
+0x2D55	0x26350
+0x2D56	0x2634E
+0x2D57	0x263F2
+0x2D58	0x264B2
+0x2D59	0x264CE
+0x2D5A	0x264CF
+0x2D5B	0x264E5
+0x2D5C	0x23407
+0x2D5D	0x26535
+0x2D5E	0x26531
+0x2D5F	0x26613
+0x2D60	0x2662B
+0x2D61	0x2662C
+0x2D62	0x26645
+0x2D63	0x26660
+0x2D64	0x26641
+0x2D65	0x26658
+0x2D66	0x26647
+0x2D67	0x2665B
+0x2D68	0x26650
+0x2D69	0x2F982
+0x2D6A	0x2665F
+0x2D6B	0x2664A
+0x2D6C	0x26656
+0x2D6D	0x26643
+0x2D6E	0x26644
+0x2D6F	0x26651
+0x2D70	0x268FD
+0x2D71	0x26934
+0x2D72	0x26935
+0x2D73	0x26954
+0x2D74	0x26955
+0x2D75	0x26A0C
+0x2D76	0x26A0B
+0x2D77	0x26A0A
+0x2D78	0x26AF9
+0x2D79	0x26B35
+0x2D7A	0x26B24
+0x2D7B	0x26B13
+0x2D7C	0x26B1C
+0x2D7D	0x26B69
+0x2D7E	0x26B25
+0x2E21	0x26B21
+0x2E22	0x2F995
+0x2E23	0x2F996
+0x2E24	0x2F998
+0x2E25	0x27220
+0x2E26	0x275A9
+0x2E27	0x275A8
+0x2E28	0x275DE
+0x2E29	0x27609
+0x2E2A	0x2760A
+0x2E2B	0x2760B
+0x2E2C	0x277E3
+0x2E2D	0x27807
+0x2E2E	0x278B2
+0x2E2F	0x278B3
+0x2E30	0x2795D
+0x2E31	0x27E58
+0x2E32	0x27E86
+0x2E33	0x27E87
+0x2E34	0x27FB9
+0x2E35	0x27FB8
+0x2E36	0x2840C
+0x2E37	0x28444
+0x2E38	0x28466
+0x2E39	0x28480
+0x2E3A	0x28475
+0x2E3B	0x2846D
+0x2E3C	0x2847E
+0x2E3D	0x28467
+0x2E3E	0x28481
+0x2E3F	0x28477
+0x2E40	0x286A8
+0x2E41	0x286A2
+0x2E42	0x286A5
+0x2E43	0x2869B
+0x2E44	0x28C57
+0x2E45	0x28E0F
+0x2E46	0x28E32
+0x2E47	0x28E2C
+0x2E48	0x28E33
+0x2E49	0x291E7
+0x2E4A	0x2006E
+0x2E4B	0x200B7
+0x2E4C	0x200F6
+0x2E4D	0x200F2
+0x2E4E	0x200F3
+0x2E4F	0x20517
+0x2E50	0x20130
+0x2E51	0x20154
+0x2E52	0x20153
+0x2E53	0x20252
+0x2E54	0x2023D
+0x2E55	0x2023C
+0x2E56	0x20234
+0x2E57	0x20233
+0x2E58	0x20254
+0x2E59	0x2022F
+0x2E5B	0x20255
+0x2E5C	0x2023F
+0x2E5D	0x20237
+0x2E5E	0x20256
+0x2E5F	0x20261
+0x2E60	0x20258
+0x2E61	0x2F806
+0x2E62	0x2023B
+0x2E63	0x20232
+0x2E64	0x2022E
+0x2E65	0x2023E
+0x2E66	0x2003B
+0x2E67	0x2048C
+0x2E68	0x2048D
+0x2E69	0x20513
+0x2E6A	0x20516
+0x2E6B	0x20512
+0x2E6C	0x2055B
+0x2E6D	0x2058A
+0x2E6E	0x205D7
+0x2E6F	0x205CE
+0x2E70	0x20650
+0x2E71	0x20651
+0x2E72	0x2064F
+0x2E73	0x2068E
+0x2E74	0x2068F
+0x2E75	0x206F2
+0x2E76	0x2F821
+0x2E77	0x20728
+0x2E78	0x2071A
+0x2E79	0x20725
+0x2E7A	0x2071D
+0x2E7B	0x20714
+0x2E7C	0x20720
+0x2E7D	0x2071F
+0x2E7E	0x2071B
+0x2F21	0x20717
+0x2F22	0x20715
+0x2F23	0x2071C
+0x2F24	0x20713
+0x2F25	0x2F825
+0x2F26	0x20860
+0x2F28	0x20866
+0x2F29	0x208E3
+0x2F2A	0x208DE
+0x2F2B	0x208E0
+0x2F2C	0x208E1
+0x2F2D	0x2091A
+0x2F2E	0x2091B
+0x2F2F	0x20918
+0x2F30	0x2091C
+0x2F31	0x20919
+0x2F32	0x20942
+0x2F33	0x20940
+0x2F34	0x2093E
+0x2F35	0x20944
+0x2F36	0x20974
+0x2F37	0x20943
+0x2F38	0x2F82D
+0x2F39	0x209F2
+0x2F3A	0x20A1B
+0x2F3B	0x20A19
+0x2F3C	0x20A1E
+0x2F3D	0x2F830
+0x2F3E	0x20A5E
+0x2F3F	0x20A66
+0x2F40	0x20A5D
+0x2F41	0x20A5A
+0x2F42	0x20A5F
+0x2F43	0x20A60
+0x2F44	0x20A5B
+0x2F45	0x20A5C
+0x2F46	0x20A59
+0x2F47	0x20AF0
+0x2F48	0x20AF1
+0x2F49	0x20B43
+0x2F4A	0x20B40
+0x2F4B	0x20B42
+0x2F4C	0x20B41
+0x2F4D	0x20B3F
+0x2F4E	0x20C57
+0x2F4F	0x20C69
+0x2F50	0x20C6F
+0x2F51	0x20CAB
+0x2F52	0x20C71
+0x2F53	0x20C93
+0x2F54	0x20C56
+0x2F55	0x20C90
+0x2F56	0x20C6D
+0x2F57	0x20C6C
+0x2F58	0x20C70
+0x2F59	0x20C66
+0x2F5A	0x20C67
+0x2F5B	0x211D7
+0x2F5C	0x211B5
+0x2F5D	0x211DB
+0x2F5E	0x211D8
+0x2F5F	0x211D5
+0x2F60	0x211D4
+0x2F61	0x212BA
+0x2F62	0x212B7
+0x2F63	0x212BE
+0x2F64	0x212B9
+0x2F66	0x212E0
+0x2F67	0x212DD
+0x2F68	0x212DE
+0x2F69	0x24918
+0x2F6A	0x212D8
+0x2F6B	0x212BD
+0x2F6C	0x212DB
+0x2F6D	0x2151D
+0x2F6E	0x21525
+0x2F6F	0x21721
+0x2F70	0x2170C
+0x2F71	0x21729
+0x2F72	0x2172D
+0x2F73	0x2171B
+0x2F74	0x2170E
+0x2F75	0x2171F
+0x2F76	0x21704
+0x2F77	0x2171C
+0x2F78	0x21705
+0x2F79	0x21706
+0x2F7A	0x21720
+0x2F7B	0x2170D
+0x2F7C	0x2172A
+0x2F7D	0x21723
+0x2F7E	0x21711
+0x3021	0x2195C
+0x3022	0x21966
+0x3023	0x2195B
+0x3024	0x2194F
+0x3025	0x2195E
+0x3026	0x2195D
+0x3027	0x219F1
+0x3028	0x219EA
+0x3029	0x219F4
+0x302A	0x219EB
+0x302B	0x219F0
+0x302C	0x219FA
+0x302D	0x219FB
+0x302E	0x21B28
+0x302F	0x21B2C
+0x3030	0x21B6B
+0x3031	0x21B2A
+0x3032	0x21B6A
+0x3033	0x21B6F
+0x3034	0x21BDB
+0x3035	0x21BE0
+0x3036	0x24FD1
+0x3037	0x21BE3
+0x3038	0x21BE5
+0x3039	0x21BE7
+0x303A	0x21C4D
+0x303B	0x21C55
+0x303C	0x21C54
+0x303D	0x21C53
+0x303E	0x21C52
+0x303F	0x21C4E
+0x3040	0x21C60
+0x3041	0x221C0
+0x3042	0x21D0F
+0x3043	0x21D11
+0x3044	0x21D13
+0x3045	0x21DC6
+0x3046	0x21DB3
+0x3047	0x21DC7
+0x3048	0x21DD2
+0x3049	0x21DB8
+0x304A	0x21DAC
+0x304B	0x21DAE
+0x304C	0x21DCF
+0x304D	0x21DC5
+0x304E	0x2F87B
+0x304F	0x21DCC
+0x3050	0x21DAB
+0x3051	0x21DC9
+0x3052	0x21DB9
+0x3053	0x21FFB
+0x3054	0x21FF8
+0x3055	0x21FF7
+0x3056	0x21FF9
+0x3057	0x22020
+0x3058	0x2203B
+0x3059	0x22039
+0x305A	0x2209E
+0x305B	0x2209A
+0x305C	0x220AA
+0x305D	0x220AB
+0x305E	0x220AF
+0x305F	0x22096
+0x3060	0x220A9
+0x3061	0x220A6
+0x3062	0x22091
+0x3064	0x220AE
+0x3065	0x2209F
+0x3066	0x220AC
+0x3067	0x220A0
+0x3068	0x22192
+0x3069	0x22191
+0x306A	0x221BF
+0x306B	0x22217
+0x306C	0x2220A
+0x306D	0x2220C
+0x306E	0x2234A
+0x306F	0x22346
+0x3070	0x22334
+0x3071	0x22345
+0x3072	0x22343
+0x3073	0x22344
+0x3074	0x2F893
+0x3075	0x22387
+0x3076	0x22386
+0x3077	0x2238A
+0x3078	0x223DA
+0x3079	0x223D8
+0x307B	0x20518
+0x307C	0x20134
+0x307D	0x223D6
+0x307E	0x223D4
+0x3121	0x22454
+0x3122	0x22459
+0x3123	0x2245A
+0x3124	0x22457
+0x3126	0x224DD
+0x3127	0x224E9
+0x3128	0x224E0
+0x3129	0x22605
+0x312A	0x22612
+0x312B	0x22613
+0x312C	0x22607
+0x312D	0x22616
+0x312E	0x22623
+0x312F	0x22602
+0x3130	0x2F8A1
+0x3131	0x2264A
+0x3132	0x22636
+0x3133	0x22640
+0x3134	0x22656
+0x3135	0x22643
+0x3136	0x2F8A0
+0x3137	0x2264B
+0x3138	0x22646
+0x3139	0x2263E
+0x313A	0x22649
+0x313B	0x229A7
+0x313C	0x229B6
+0x313D	0x229A6
+0x313E	0x229A8
+0x313F	0x229AC
+0x3140	0x229A9
+0x3141	0x229AB
+0x3142	0x22A38
+0x3143	0x22A37
+0x3144	0x22A39
+0x3145	0x22A41
+0x3146	0x22A3E
+0x3147	0x22AC0
+0x3148	0x22ABB
+0x3149	0x22ABF
+0x314A	0x22ABD
+0x314B	0x22AFE
+0x314C	0x22B1E
+0x314D	0x22AEE
+0x314E	0x22AFC
+0x314F	0x2F8B7
+0x3150	0x22AF9
+0x3151	0x22B06
+0x3152	0x22AE4
+0x3153	0x22AE9
+0x3154	0x22AE5
+0x3155	0x22B03
+0x3156	0x22AFD
+0x3157	0x22B49
+0x3158	0x22EBE
+0x3159	0x22F0A
+0x315A	0x25626
+0x315B	0x22F18
+0x315C	0x22F0D
+0x315D	0x22F0F
+0x315E	0x22F0E
+0x315F	0x22F20
+0x3160	0x23071
+0x3161	0x23099
+0x3162	0x230E2
+0x3163	0x230DF
+0x3164	0x230DE
+0x3165	0x23178
+0x3166	0x23179
+0x3168	0x2317C
+0x3169	0x2317D
+0x316A	0x23184
+0x316B	0x2318B
+0x316C	0x2318A
+0x316D	0x2F8D2
+0x316E	0x23189
+0x316F	0x2332C
+0x3170	0x23329
+0x3171	0x2336C
+0x3173	0x23409
+0x3174	0x23408
+0x3175	0x2340C
+0x3176	0x2340D
+0x3177	0x23410
+0x3179	0x2389F
+0x317A	0x23898
+0x317B	0x238A2
+0x317C	0x2389A
+0x317D	0x239D5
+0x317E	0x239E2
+0x3221	0x239F0
+0x3222	0x239EA
+0x3223	0x239EB
+0x3224	0x239ED
+0x3225	0x239E8
+0x3226	0x239E0
+0x3227	0x23A85
+0x3228	0x23A86
+0x3229	0x23AF0
+0x322A	0x21E46
+0x322B	0x23B45
+0x322C	0x23B38
+0x322D	0x23B3E
+0x322E	0x23B42
+0x322F	0x23B40
+0x3230	0x23C47
+0x3231	0x23C5C
+0x3232	0x23C5E
+0x3233	0x23CB4
+0x3234	0x23CC2
+0x3235	0x23D14
+0x3236	0x23CE5
+0x3237	0x23D15
+0x3238	0x23D11
+0x3239	0x2F8FF
+0x323A	0x23CEE
+0x323B	0x23CE7
+0x323C	0x23CF5
+0x323D	0x23CF4
+0x323E	0x23CE8
+0x323F	0x23D01
+0x3240	0x23CEF
+0x3241	0x23CF1
+0x3242	0x2F900
+0x3243	0x241DB
+0x3244	0x241BF
+0x3245	0x241DA
+0x3246	0x241C7
+0x3247	0x241DD
+0x3248	0x2F91A
+0x3249	0x241EB
+0x324A	0x241E1
+0x324B	0x241C1
+0x324C	0x241BD
+0x324D	0x24507
+0x324E	0x244FD
+0x324F	0x24501
+0x3250	0x2450A
+0x3251	0x24503
+0x3252	0x24572
+0x3253	0x24574
+0x3254	0x24575
+0x3255	0x245B2
+0x3256	0x245B1
+0x3257	0x245B4
+0x3258	0x2464C
+0x3259	0x24642
+0x325A	0x24640
+0x325B	0x24649
+0x325C	0x2463C
+0x325D	0x2464D
+0x325E	0x2464A
+0x325F	0x2463B
+0x3260	0x24761
+0x3261	0x24774
+0x3262	0x2F926
+0x3263	0x2477F
+0x3264	0x2477A
+0x3265	0x24788
+0x3266	0x2477C
+0x3268	0x24770
+0x3269	0x2490F
+0x326A	0x24928
+0x326B	0x24913
+0x326C	0x2492A
+0x326D	0x24AED
+0x326E	0x24AEF
+0x326F	0x24B2E
+0x3270	0x24BC1
+0x3271	0x24BDD
+0x3272	0x20B47
+0x3273	0x24C2D
+0x3274	0x24C2B
+0x3275	0x24C35
+0x3276	0x24C2F
+0x3277	0x24C31
+0x3278	0x24C34
+0x3279	0x2F935
+0x327A	0x24C30
+0x327B	0x24D3A
+0x327C	0x24D39
+0x327D	0x24D37
+0x327E	0x24D4B
+0x3321	0x24D54
+0x3322	0x24D4D
+0x3323	0x24D51
+0x3324	0x24D47
+0x3325	0x24F27
+0x3326	0x24F50
+0x3327	0x24F4D
+0x3328	0x24F4E
+0x3329	0x24F54
+0x332A	0x24FD2
+0x332B	0x24FCE
+0x332C	0x2504B
+0x332D	0x25049
+0x332E	0x25105
+0x332F	0x2510F
+0x3330	0x25119
+0x3331	0x2F943
+0x3332	0x25106
+0x3333	0x2510C
+0x3334	0x25129
+0x3335	0x25104
+0x3336	0x25108
+0x3337	0x25125
+0x3339	0x25103
+0x333A	0x25127
+0x333B	0x25110
+0x333C	0x2510A
+0x333D	0x2F942
+0x333E	0x26B5D
+0x333F	0x253AA
+0x3340	0x253AB
+0x3341	0x253A9
+0x3342	0x25441
+0x3343	0x2543A
+0x3344	0x2543C
+0x3345	0x2542B
+0x3346	0x25449
+0x3347	0x25615
+0x3349	0x25616
+0x334A	0x2F953
+0x334B	0x25631
+0x334C	0x23C4A
+0x334D	0x2573C
+0x334E	0x2577C
+0x334F	0x2576D
+0x3350	0x2576A
+0x3351	0x25763
+0x3352	0x2576B
+0x3353	0x2577B
+0x3354	0x25764
+0x3355	0x2577A
+0x3356	0x25769
+0x3357	0x2576F
+0x3358	0x25937
+0x3359	0x25935
+0x335A	0x2593C
+0x335B	0x25936
+0x335C	0x2593D
+0x335D	0x2593E
+0x335E	0x25AE1
+0x335F	0x25AE0
+0x3360	0x25E2D
+0x3361	0x25E2B
+0x3362	0x25F8D
+0x3363	0x25F92
+0x3365	0x25F8E
+0x3366	0x2F96B
+0x3367	0x25F91
+0x3368	0x25F96
+0x3369	0x2627B
+0x336A	0x26278
+0x336B	0x26281
+0x336C	0x26296
+0x336D	0x262A3
+0x336E	0x26295
+0x336F	0x26297
+0x3370	0x26354
+0x3371	0x26352
+0x3372	0x263F5
+0x3373	0x26400
+0x3374	0x263FB
+0x3375	0x263F4
+0x3376	0x263F6
+0x3377	0x264E8
+0x3378	0x264EA
+0x3379	0x2663E
+0x337A	0x2663D
+0x337B	0x2663B
+0x337C	0x26680
+0x337E	0x26688
+0x3421	0x26681
+0x3422	0x26682
+0x3423	0x266CE
+0x3424	0x26683
+0x3425	0x26677
+0x3426	0x26679
+0x3427	0x26673
+0x3428	0x2666D
+0x3429	0x26670
+0x342A	0x2668D
+0x342B	0x26675
+0x342C	0x2668C
+0x342D	0x2666A
+0x342E	0x26691
+0x342F	0x26689
+0x3430	0x2668E
+0x3431	0x212DC
+0x3432	0x268FF
+0x3433	0x26959
+0x3434	0x269C7
+0x3435	0x26A12
+0x3436	0x26A14
+0x3437	0x26A13
+0x3438	0x26ACB
+0x3439	0x26B42
+0x343B	0x26B3D
+0x343D	0x26B40
+0x343E	0x26B44
+0x343F	0x26B62
+0x3440	0x26B43
+0x3441	0x26B3F
+0x3442	0x26B45
+0x3443	0x26B3C
+0x3444	0x2F997
+0x3445	0x26B46
+0x3446	0x26B47
+0x3447	0x2F9B3
+0x3448	0x2719E
+0x3449	0x2719D
+0x344A	0x2722C
+0x344B	0x27229
+0x344C	0x2722F
+0x344D	0x2722E
+0x344E	0x27230
+0x344F	0x275E1
+0x3450	0x275E2
+0x3451	0x2760E
+0x3452	0x27619
+0x3453	0x27612
+0x3454	0x278B4
+0x3455	0x27BDA
+0x3456	0x27D26
+0x3457	0x27E59
+0x3458	0x27E5A
+0x3459	0x27E88
+0x345A	0x27FC0
+0x345B	0x27FBA
+0x345C	0x282A0
+0x345D	0x2F9DD
+0x345E	0x282A2
+0x345F	0x28486
+0x3461	0x2849D
+0x3462	0x28488
+0x3463	0x2848F
+0x3464	0x2848E
+0x3465	0x2849B
+0x3466	0x286C1
+0x3467	0x286C3
+0x3468	0x286C4
+0x3469	0x28696
+0x346A	0x286C7
+0x346B	0x286C6
+0x346C	0x286BF
+0x346E	0x2890F
+0x346F	0x28E55
+0x3470	0x28E42
+0x3471	0x28E46
+0x3472	0x28E4B
+0x3473	0x28E43
+0x3474	0x28E53
+0x3475	0x28E48
+0x3476	0x28E49
+0x3477	0x28E4A
+0x3478	0x28E4E
+0x3479	0x24BDE
+0x347A	0x20691
+0x347B	0x2944B
+0x347C	0x29680
+0x347D	0x29681
+0x347E	0x29683
+0x3521	0x2028A
+0x3522	0x29682
+0x3523	0x22342
+0x3524	0x20922
+0x3525	0x20070
+0x3526	0x20071
+0x3527	0x200BC
+0x3528	0x21D18
+0x3529	0x200BE
+0x352A	0x200BA
+0x352B	0x200F8
+0x352C	0x20137
+0x352D	0x20135
+0x352E	0x20AFC
+0x352F	0x20156
+0x3530	0x20159
+0x3531	0x2015E
+0x3532	0x2026D
+0x3533	0x20291
+0x3534	0x20292
+0x3535	0x20268
+0x3536	0x20266
+0x3537	0x20273
+0x3539	0x20296
+0x353A	0x2028B
+0x353B	0x2028C
+0x353C	0x20496
+0x353D	0x204EE
+0x353E	0x2051C
+0x353F	0x2051A
+0x3540	0x20519
+0x3541	0x2051B
+0x3542	0x2055D
+0x3543	0x2055E
+0x3544	0x2F818
+0x3545	0x205DC
+0x3546	0x205E2
+0x3547	0x20652
+0x3548	0x20692
+0x3549	0x20730
+0x354A	0x20752
+0x354B	0x20742
+0x354C	0x20741
+0x354D	0x20745
+0x354E	0x20737
+0x354F	0x20740
+0x3550	0x2073F
+0x3551	0x2073D
+0x3552	0x20738
+0x3553	0x2073A
+0x3554	0x20749
+0x3555	0x2086B
+0x3556	0x20878
+0x3557	0x20879
+0x3558	0x2F826
+0x3559	0x2086C
+0x355A	0x208E9
+0x355B	0x208E6
+0x355C	0x208E5
+0x355D	0x208EA
+0x355E	0x208E7
+0x355F	0x208E8
+0x3560	0x2091F
+0x3561	0x2094B
+0x3562	0x2094A
+0x3563	0x20953
+0x3564	0x20976
+0x3565	0x209A3
+0x3566	0x209A4
+0x3567	0x209F6
+0x3568	0x209F3
+0x3569	0x209F9
+0x356A	0x209F7
+0x356B	0x209FC
+0x356C	0x20A1D
+0x356D	0x20A6D
+0x356E	0x20A71
+0x356F	0x20A6C
+0x3570	0x20A6E
+0x3571	0x20A70
+0x3572	0x20A6F
+0x3573	0x20A67
+0x3574	0x20A68
+0x3575	0x20AFA
+0x3576	0x20AF9
+0x3577	0x20B4E
+0x3579	0x20B4D
+0x357A	0x20B4F
+0x357B	0x20B4A
+0x357C	0x20B4C
+0x357E	0x2F842
+0x3621	0x20CEE
+0x3622	0x20CB2
+0x3623	0x20CC0
+0x3624	0x20CC1
+0x3625	0x20CF4
+0x3626	0x20CC8
+0x3627	0x20CC5
+0x3628	0x20CC6
+0x3629	0x20CAD
+0x362A	0x211E2
+0x362B	0x211EA
+0x362C	0x211E3
+0x362D	0x211E1
+0x362E	0x212F7
+0x362F	0x21301
+0x3630	0x21312
+0x3631	0x212F6
+0x3632	0x212F1
+0x3633	0x2131F
+0x3634	0x212EE
+0x3635	0x2F852
+0x3636	0x212F3
+0x3637	0x21315
+0x3638	0x21316
+0x3639	0x21317
+0x363A	0x212F8
+0x363B	0x21319
+0x363C	0x212F2
+0x363D	0x212F4
+0x363E	0x212F5
+0x363F	0x21313
+0x3640	0x21306
+0x3641	0x21526
+0x3642	0x21524
+0x3643	0x2155A
+0x3644	0x22EC8
+0x3645	0x21597
+0x3646	0x21595
+0x3647	0x2159A
+0x3648	0x2161F
+0x3649	0x20AFB
+0x364A	0x21629
+0x364B	0x21620
+0x364C	0x2F862
+0x364D	0x2F863
+0x364E	0x2174C
+0x364F	0x21730
+0x3650	0x21738
+0x3651	0x2173D
+0x3652	0x21751
+0x3653	0x2174F
+0x3654	0x2174A
+0x3655	0x21734
+0x3656	0x21736
+0x3658	0x2196A
+0x3659	0x21968
+0x365A	0x21A1C
+0x365B	0x21A0E
+0x365C	0x21A1E
+0x365E	0x21A09
+0x365F	0x21A08
+0x3660	0x21A13
+0x3661	0x21A01
+0x3662	0x21A0F
+0x3663	0x21A14
+0x3664	0x21A06
+0x3665	0x21A07
+0x3667	0x2F873
+0x3669	0x21B79
+0x366A	0x21BEA
+0x366B	0x21BED
+0x366C	0x21BE9
+0x366D	0x21BEE
+0x366E	0x21C68
+0x366F	0x21C64
+0x3670	0x21C67
+0x3671	0x21C72
+0x3672	0x21C62
+0x3673	0x21C74
+0x3674	0x21C79
+0x3675	0x21D19
+0x3676	0x21D17
+0x3677	0x21D15
+0x3678	0x21D16
+0x3679	0x21DE6
+0x367A	0x262A4
+0x367B	0x21DEE
+0x367D	0x21DDF
+0x367E	0x21DE4
+0x3721	0x21DDA
+0x3722	0x21DEA
+0x3723	0x21DED
+0x3724	0x21DE3
+0x3725	0x21DE9
+0x3726	0x21FFD
+0x3727	0x20657
+0x3728	0x22021
+0x3729	0x220C6
+0x372A	0x220B8
+0x372B	0x220CB
+0x372C	0x2F885
+0x372D	0x220BD
+0x372E	0x220B5
+0x372F	0x220BB
+0x3730	0x220BF
+0x3731	0x220BE
+0x3732	0x220B2
+0x3733	0x220C1
+0x3734	0x220C2
+0x3735	0x22199
+0x3736	0x221C6
+0x3737	0x2222C
+0x3738	0x2222D
+0x3739	0x22225
+0x373A	0x2221E
+0x373B	0x2221F
+0x373C	0x22223
+0x373D	0x22350
+0x373E	0x2234E
+0x373F	0x2234D
+0x3740	0x22352
+0x3741	0x223E9
+0x3742	0x223EC
+0x3743	0x223E8
+0x3744	0x22458
+0x3745	0x2245C
+0x3746	0x2245B
+0x3747	0x2248F
+0x3748	0x23972
+0x3749	0x224F6
+0x374A	0x22500
+0x374B	0x224FC
+0x374C	0x224F8
+0x374D	0x224EA
+0x374E	0x224FE
+0x374F	0x224F7
+0x3750	0x224FD
+0x3751	0x22670
+0x3752	0x22662
+0x3753	0x22644
+0x3755	0x2264D
+0x3756	0x2264C
+0x3757	0x2263F
+0x3758	0x22666
+0x3759	0x22635
+0x375B	0x22634
+0x375C	0x2268D
+0x375D	0x22684
+0x375F	0x22686
+0x3760	0x22689
+0x3761	0x22687
+0x3762	0x22683
+0x3763	0x22675
+0x3764	0x22679
+0x3765	0x226AF
+0x3766	0x226B0
+0x3767	0x229B7
+0x3768	0x229BB
+0x3769	0x229B9
+0x376A	0x22A46
+0x376B	0x22A47
+0x376C	0x22A45
+0x376D	0x22AEA
+0x376E	0x22AF6
+0x376F	0x22B68
+0x3770	0x22B39
+0x3771	0x2F8B9
+0x3772	0x22B3D
+0x3773	0x22B3B
+0x3774	0x22B4D
+0x3775	0x22B30
+0x3776	0x22B4A
+0x3777	0x22B3E
+0x3778	0x22B40
+0x3779	0x22B4C
+0x377A	0x22B47
+0x377B	0x22B38
+0x377C	0x22B52
+0x377D	0x22B3A
+0x377E	0x22B53
+0x3821	0x22EC4
+0x3822	0x22EC1
+0x3823	0x22F1C
+0x3824	0x22F1D
+0x3825	0x22F2A
+0x3826	0x22F1E
+0x3827	0x22F2F
+0x3828	0x22F22
+0x3829	0x22F2E
+0x382A	0x22F25
+0x382D	0x2304A
+0x382E	0x2304B
+0x382F	0x23076
+0x3831	0x230E8
+0x3832	0x230EF
+0x3833	0x230E9
+0x3835	0x230EA
+0x3836	0x2F8CC
+0x3838	0x2319B
+0x3839	0x2319E
+0x383A	0x23193
+0x383B	0x231A7
+0x383C	0x2319C
+0x383D	0x231A0
+0x383E	0x2319A
+0x383F	0x231AB
+0x3840	0x231BE
+0x3841	0x231A9
+0x3842	0x2332D
+0x3843	0x2336E
+0x3844	0x23444
+0x3845	0x2343D
+0x3846	0x2343A
+0x3847	0x23468
+0x3848	0x2343C
+0x3849	0x2346A
+0x384A	0x2F8E0
+0x384B	0x23438
+0x384C	0x23465
+0x384D	0x23439
+0x384E	0x2346D
+0x384F	0x23436
+0x3850	0x2F8E3
+0x3851	0x2343E
+0x3852	0x2347E
+0x3853	0x23437
+0x3854	0x23899
+0x3855	0x238A9
+0x3856	0x238AD
+0x3857	0x238A7
+0x3858	0x238A8
+0x3859	0x23966
+0x385A	0x23969
+0x385B	0x2396D
+0x385C	0x23967
+0x385D	0x2396B
+0x385E	0x2396A
+0x385F	0x239EE
+0x3860	0x23A01
+0x3861	0x23A03
+0x3862	0x239F4
+0x3863	0x239FB
+0x3865	0x239F6
+0x3866	0x239FC
+0x3867	0x23AF4
+0x3868	0x23B08
+0x3869	0x23B0A
+0x386A	0x23B09
+0x386B	0x23B6D
+0x386C	0x23B62
+0x386D	0x23B41
+0x386E	0x23B5E
+0x386F	0x23B5C
+0x3870	0x23CF3
+0x3871	0x23D26
+0x3873	0x23D39
+0x3874	0x2F904
+0x3875	0x23D6C
+0x3876	0x23D2B
+0x3877	0x23D2E
+0x3878	0x23D3B
+0x3879	0x23D5E
+0x387A	0x23DFB
+0x387B	0x23D27
+0x387C	0x23D24
+0x387D	0x23D69
+0x387E	0x23D30
+0x3921	0x2F905
+0x3922	0x23D62
+0x3923	0x23D38
+0x3924	0x23D35
+0x3925	0x23D2A
+0x3926	0x23D2C
+0x3927	0x23D68
+0x3928	0x23D31
+0x3929	0x23D2F
+0x392A	0x23D2D
+0x392B	0x23D3A
+0x392C	0x23D36
+0x392D	0x2F903
+0x392E	0x23D21
+0x392F	0x23D3C
+0x3930	0x23D20
+0x3931	0x23D64
+0x3932	0x23D3E
+0x3934	0x241F7
+0x3935	0x24212
+0x3936	0x241F1
+0x3937	0x241F5
+0x3938	0x24222
+0x3939	0x241F2
+0x393A	0x241DF
+0x393B	0x24215
+0x393C	0x24216
+0x393D	0x2457A
+0x393E	0x24576
+0x393F	0x245BE
+0x3941	0x245BD
+0x3942	0x24609
+0x3943	0x24608
+0x3944	0x24657
+0x3945	0x247A3
+0x3946	0x247BF
+0x3947	0x247B8
+0x3948	0x247AF
+0x3949	0x2479C
+0x394A	0x247A5
+0x394B	0x24772
+0x394C	0x24775
+0x394D	0x2479D
+0x394E	0x24799
+0x394F	0x247B9
+0x3950	0x2494E
+0x3951	0x24939
+0x3952	0x2493B
+0x3953	0x24935
+0x3954	0x2493C
+0x3955	0x24955
+0x3956	0x24AF0
+0x3957	0x24AF3
+0x3958	0x24AF4
+0x3959	0x24B3B
+0x395A	0x24B3C
+0x395B	0x24B3A
+0x395C	0x24B36
+0x395D	0x24C07
+0x395E	0x20CEB
+0x395F	0x24C55
+0x3960	0x24C50
+0x3961	0x24C4F
+0x3962	0x24C52
+0x3963	0x24C56
+0x3964	0x200BD
+0x3965	0x24C32
+0x3966	0x24D63
+0x3967	0x24D6B
+0x3968	0x24D66
+0x3969	0x24D57
+0x396A	0x24D5D
+0x396C	0x24D6D
+0x396D	0x24D61
+0x396E	0x24D69
+0x396F	0x24D5A
+0x3970	0x24D5C
+0x3971	0x24D62
+0x3972	0x24F2A
+0x3973	0x24F29
+0x3974	0x24F58
+0x3975	0x24F5A
+0x3976	0x24FD7
+0x3977	0x24FDB
+0x3978	0x24FDC
+0x3979	0x24FDD
+0x397A	0x24FD8
+0x397B	0x25054
+0x397C	0x2505B
+0x397D	0x2505C
+0x397E	0x25053
+0x3A21	0x2504F
+0x3A22	0x25056
+0x3A23	0x25050
+0x3A24	0x2505A
+0x3A25	0x2506B
+0x3A26	0x25136
+0x3A27	0x25153
+0x3A28	0x2513A
+0x3A29	0x2513C
+0x3A2A	0x2513E
+0x3A2B	0x25149
+0x3A2C	0x25140
+0x3A2D	0x2F946
+0x3A2E	0x2F947
+0x3A2F	0x25364
+0x3A30	0x25365
+0x3A31	0x253B5
+0x3A32	0x253B6
+0x3A33	0x253B2
+0x3A34	0x25448
+0x3A35	0x2544A
+0x3A36	0x25472
+0x3A37	0x25469
+0x3A38	0x2545A
+0x3A39	0x2544C
+0x3A3A	0x2562C
+0x3A3B	0x25630
+0x3A3C	0x2564B
+0x3A3D	0x25649
+0x3A3E	0x25642
+0x3A3F	0x25644
+0x3A40	0x2564A
+0x3A41	0x2564F
+0x3A42	0x25792
+0x3A43	0x2F957
+0x3A44	0x25797
+0x3A45	0x25780
+0x3A46	0x25782
+0x3A47	0x25786
+0x3A48	0x25953
+0x3A49	0x2595E
+0x3A4A	0x25952
+0x3A4B	0x2595B
+0x3A4C	0x2594E
+0x3A4D	0x25A6D
+0x3A4E	0x25A6E
+0x3A4F	0x25AFA
+0x3A50	0x25AF6
+0x3A51	0x25AFB
+0x3A52	0x25E33
+0x3A53	0x25E3D
+0x3A54	0x25E37
+0x3A55	0x25E3E
+0x3A56	0x25E35
+0x3A57	0x25F9A
+0x3A58	0x25FAB
+0x3A59	0x25FA6
+0x3A5A	0x25FB0
+0x3A5B	0x25F99
+0x3A5C	0x25FA0
+0x3A5D	0x25F9E
+0x3A5E	0x25FA8
+0x3A5F	0x25FA1
+0x3A60	0x25FAA
+0x3A61	0x25FAD
+0x3A62	0x25FBB
+0x3A63	0x25F9C
+0x3A64	0x25FA5
+0x3A65	0x200B3
+0x3A66	0x26227
+0x3A67	0x2628D
+0x3A68	0x2628E
+0x3A69	0x2628F
+0x3A6A	0x26292
+0x3A6C	0x26291
+0x3A6D	0x262AD
+0x3A6E	0x26357
+0x3A6F	0x26358
+0x3A70	0x2635E
+0x3A71	0x2635D
+0x3A72	0x2635C
+0x3A73	0x2635B
+0x3A75	0x2640A
+0x3A76	0x26403
+0x3A77	0x2640E
+0x3A78	0x264B8
+0x3A79	0x2654D
+0x3A7A	0x2653F
+0x3A7B	0x26547
+0x3A7C	0x2654B
+0x3A7D	0x2654A
+0x3A7E	0x2653D
+0x3B22	0x26541
+0x3B23	0x2654C
+0x3B25	0x26662
+0x3B26	0x26669
+0x3B27	0x26661
+0x3B29	0x266AA
+0x3B2A	0x266A6
+0x3B2B	0x266AC
+0x3B2C	0x266BD
+0x3B2D	0x266BB
+0x3B2E	0x266A4
+0x3B2F	0x266BA
+0x3B30	0x2669A
+0x3B32	0x266A1
+0x3B33	0x266C1
+0x3B34	0x268E0
+0x3B35	0x2690A
+0x3B36	0x26903
+0x3B37	0x26906
+0x3B38	0x26939
+0x3B39	0x2693A
+0x3B3A	0x26936
+0x3B3B	0x2695B
+0x3B3C	0x2695F
+0x3B3D	0x2695E
+0x3B3E	0x26967
+0x3B3F	0x26961
+0x3B40	0x26962
+0x3B41	0x2695D
+0x3B42	0x269CA
+0x3B43	0x269CC
+0x3B44	0x269CE
+0x3B45	0x26A18
+0x3B46	0x26A1D
+0x3B47	0x26A1F
+0x3B48	0x26A20
+0x3B49	0x26A17
+0x3B4A	0x26A15
+0x3B4B	0x26B1F
+0x3B4C	0x26B27
+0x3B4D	0x26B26
+0x3B4E	0x21E10
+0x3B4F	0x26B8B
+0x3B50	0x26BAE
+0x3B51	0x26B8A
+0x3B52	0x2F999
+0x3B53	0x26B92
+0x3B54	0x26B89
+0x3B55	0x26B87
+0x3B57	0x26B8F
+0x3B58	0x26B84
+0x3B59	0x26B83
+0x3B5A	0x26B8C
+0x3B5B	0x26B93
+0x3B5C	0x26B8D
+0x3B5D	0x26B98
+0x3B5E	0x26B7D
+0x3B5F	0x26B7E
+0x3B60	0x26BD2
+0x3B61	0x26B80
+0x3B62	0x26B99
+0x3B63	0x271AC
+0x3B64	0x27250
+0x3B65	0x27255
+0x3B66	0x27242
+0x3B67	0x2723F
+0x3B68	0x2723C
+0x3B6A	0x2724C
+0x3B6B	0x27249
+0x3B6C	0x27257
+0x3B6D	0x27258
+0x3B6E	0x2724F
+0x3B6F	0x2725C
+0x3B70	0x27247
+0x3B71	0x2F9B7
+0x3B72	0x275AB
+0x3B74	0x275AF
+0x3B75	0x275AD
+0x3B76	0x275E8
+0x3B77	0x275E7
+0x3B78	0x27630
+0x3B79	0x27626
+0x3B7A	0x2762F
+0x3B7B	0x27628
+0x3B7C	0x2762B
+0x3B7D	0x2761D
+0x3B7E	0x2762D
+0x3C21	0x27620
+0x3C22	0x2762A
+0x3C23	0x2762C
+0x3C24	0x27635
+0x3C25	0x27621
+0x3C26	0x27623
+0x3C27	0x27624
+0x3C28	0x27636
+0x3C29	0x27637
+0x3C2A	0x277E9
+0x3C2B	0x278BA
+0x3C2C	0x278B8
+0x3C2D	0x2F9CC
+0x3C2E	0x2796D
+0x3C2F	0x2796A
+0x3C30	0x27968
+0x3C31	0x27969
+0x3C32	0x2796B
+0x3C33	0x27961
+0x3C34	0x27BDC
+0x3C35	0x27BDB
+0x3C36	0x27C2D
+0x3C37	0x27C2C
+0x3C38	0x27CA2
+0x3C39	0x27D2B
+0x3C3A	0x27D32
+0x3C3B	0x2F9D7
+0x3C3C	0x27E94
+0x3C3D	0x27E92
+0x3C3E	0x27E90
+0x3C3F	0x27FC9
+0x3C40	0x27FC4
+0x3C41	0x27FC1
+0x3C42	0x27FC3
+0x3C43	0x27FCD
+0x3C44	0x28214
+0x3C45	0x282A7
+0x3C46	0x282AF
+0x3C47	0x282AA
+0x3C48	0x2840D
+0x3C49	0x28454
+0x3C4A	0x2845B
+0x3C4B	0x28461
+0x3C4C	0x284AE
+0x3C4D	0x284B3
+0x3C4E	0x284C0
+0x3C4F	0x284C4
+0x3C50	0x284BF
+0x3C51	0x284CB
+0x3C52	0x284AD
+0x3C53	0x284A7
+0x3C54	0x284A4
+0x3C55	0x284BD
+0x3C56	0x284AF
+0x3C57	0x284B2
+0x3C58	0x284A5
+0x3C59	0x286E7
+0x3C5A	0x286E0
+0x3C5B	0x286CE
+0x3C5C	0x286DE
+0x3C5D	0x286D5
+0x3C5E	0x286DF
+0x3C5F	0x286D9
+0x3C60	0x287F2
+0x3C61	0x28923
+0x3C62	0x28940
+0x3C64	0x2893E
+0x3C66	0x28CCF
+0x3C67	0x20B54
+0x3C68	0x28E5B
+0x3C69	0x28E58
+0x3C6A	0x28E62
+0x3C6B	0x28E5F
+0x3C6C	0x28E67
+0x3C6D	0x28E63
+0x3C6E	0x28E5E
+0x3C6F	0x28E60
+0x3C70	0x28F85
+0x3C71	0x28F86
+0x3C72	0x28F87
+0x3C73	0x291E8
+0x3C74	0x291E6
+0x3C75	0x29671
+0x3C76	0x29685
+0x3C77	0x2FA02
+0x3C78	0x29686
+0x3C79	0x29810
+0x3C7A	0x209F8
+0x3C7B	0x200BF
+0x3C7C	0x20B61
+0x3C7D	0x200FE
+0x3C7E	0x200FC
+0x3D21	0x20139
+0x3D22	0x20161
+0x3D23	0x20160
+0x3D24	0x202E2
+0x3D25	0x202EA
+0x3D26	0x202E3
+0x3D27	0x202B4
+0x3D28	0x202AE
+0x3D29	0x202BE
+0x3D2A	0x202B8
+0x3D2B	0x202A8
+0x3D2C	0x202AA
+0x3D2D	0x202A9
+0x3D2E	0x202B3
+0x3D2F	0x202D5
+0x3D30	0x202AD
+0x3D31	0x202B9
+0x3D32	0x202BB
+0x3D33	0x202B1
+0x3D34	0x202C2
+0x3D35	0x2F808
+0x3D36	0x202EB
+0x3D37	0x202BA
+0x3D38	0x202D2
+0x3D39	0x202D4
+0x3D3A	0x204F1
+0x3D3B	0x2051D
+0x3D3C	0x2F812
+0x3D3D	0x20562
+0x3D3E	0x2058C
+0x3D3F	0x205E6
+0x3D40	0x205E7
+0x3D41	0x2065A
+0x3D42	0x20658
+0x3D43	0x20659
+0x3D44	0x20696
+0x3D45	0x20697
+0x3D46	0x20761
+0x3D47	0x20767
+0x3D48	0x20771
+0x3D49	0x20765
+0x3D4A	0x2077D
+0x3D4B	0x2077E
+0x3D4C	0x2087D
+0x3D4D	0x20884
+0x3D4E	0x2087C
+0x3D4F	0x2087E
+0x3D50	0x2087F
+0x3D51	0x20880
+0x3D52	0x208EF
+0x3D53	0x208F4
+0x3D54	0x2091E
+0x3D55	0x2094E
+0x3D56	0x209FB
+0x3D57	0x209FA
+0x3D58	0x209FD
+0x3D59	0x2F831
+0x3D5A	0x2F832
+0x3D5B	0x20A79
+0x3D5C	0x20A7C
+0x3D5D	0x20A7D
+0x3D5E	0x20A84
+0x3D5F	0x20A7B
+0x3D60	0x20A78
+0x3D62	0x20B5E
+0x3D63	0x20B5A
+0x3D64	0x20B5C
+0x3D65	0x20B59
+0x3D66	0x20B55
+0x3D67	0x20B63
+0x3D68	0x20B56
+0x3D69	0x20B5F
+0x3D6A	0x20B60
+0x3D6B	0x20B5B
+0x3D6C	0x20D4A
+0x3D6D	0x20D65
+0x3D6E	0x20DB3
+0x3D6F	0x20D2C
+0x3D70	0x20D77
+0x3D71	0x20D3D
+0x3D72	0x20D52
+0x3D73	0x20D61
+0x3D74	0x20D2A
+0x3D75	0x20D3E
+0x3D76	0x20D34
+0x3D77	0x20D29
+0x3D78	0x20DB2
+0x3D79	0x20DAD
+0x3D7A	0x20D40
+0x3D7B	0x20D53
+0x3D7C	0x2F844
+0x3D7D	0x20D3F
+0x3D7E	0x20D41
+0x3E21	0x20D72
+0x3E22	0x211F6
+0x3E23	0x211F5
+0x3E24	0x211F4
+0x3E25	0x211F2
+0x3E26	0x211F9
+0x3E27	0x21327
+0x3E28	0x21354
+0x3E29	0x21355
+0x3E2A	0x2132E
+0x3E2B	0x2F854
+0x3E2C	0x2F853
+0x3E2D	0x2132C
+0x3E2E	0x21338
+0x3E2F	0x21339
+0x3E30	0x21331
+0x3E31	0x2134F
+0x3E32	0x21373
+0x3E33	0x21330
+0x3E34	0x2132B
+0x3E35	0x21351
+0x3E36	0x2152C
+0x3E37	0x2155B
+0x3E38	0x2155C
+0x3E39	0x21568
+0x3E3A	0x2156C
+0x3E3B	0x2156B
+0x3E3C	0x21569
+0x3E3D	0x2159F
+0x3E3E	0x21638
+0x3E3F	0x2163C
+0x3E40	0x2163A
+0x3E41	0x21635
+0x3E43	0x21639
+0x3E44	0x21636
+0x3E45	0x2163B
+0x3E46	0x21760
+0x3E47	0x21761
+0x3E48	0x21763
+0x3E49	0x21764
+0x3E4A	0x21794
+0x3E4B	0x21793
+0x3E4C	0x2175E
+0x3E4D	0x21768
+0x3E4E	0x2176A
+0x3E4F	0x21765
+0x3E50	0x2F866
+0x3E51	0x21790
+0x3E52	0x2175F
+0x3E53	0x21772
+0x3E54	0x2F865
+0x3E55	0x21A3C
+0x3E56	0x21A27
+0x3E57	0x21A24
+0x3E58	0x21A26
+0x3E59	0x21A25
+0x3E5B	0x21A28
+0x3E5C	0x21A36
+0x3E5D	0x21B31
+0x3E5E	0x21B30
+0x3E5F	0x21B34
+0x3E60	0x21B81
+0x3E61	0x21B7D
+0x3E62	0x21B82
+0x3E63	0x21B80
+0x3E65	0x202D3
+0x3E66	0x21BF2
+0x3E67	0x21C66
+0x3E68	0x21C8C
+0x3E69	0x21C7B
+0x3E6A	0x21C83
+0x3E6C	0x21C8E
+0x3E6D	0x21C7A
+0x3E6E	0x21C92
+0x3E6F	0x21C91
+0x3E70	0x21C82
+0x3E71	0x21D1B
+0x3E72	0x21D1C
+0x3E73	0x21E27
+0x3E74	0x21E21
+0x3E77	0x21E43
+0x3E79	0x21E18
+0x3E7A	0x21E7B
+0x3E7B	0x21E1A
+0x3E7C	0x21E4B
+0x3E7D	0x21E4A
+0x3E7E	0x21E4D
+0x3F21	0x21E4F
+0x3F22	0x21E19
+0x3F23	0x21E35
+0x3F24	0x21E13
+0x3F25	0x21E52
+0x3F26	0x21E14
+0x3F27	0x21E1E
+0x3F28	0x21E2C
+0x3F29	0x21E20
+0x3F2A	0x21E22
+0x3F2B	0x21E12
+0x3F2C	0x21E1F
+0x3F2D	0x22000
+0x3F2E	0x22023
+0x3F2F	0x22040
+0x3F30	0x22043
+0x3F31	0x220E4
+0x3F32	0x220DB
+0x3F33	0x220EA
+0x3F34	0x220DD
+0x3F35	0x220CC
+0x3F36	0x220D9
+0x3F37	0x220E8
+0x3F38	0x220F6
+0x3F39	0x220E3
+0x3F3A	0x220D3
+0x3F3B	0x220DA
+0x3F3C	0x220D6
+0x3F3D	0x220E7
+0x3F3E	0x2223A
+0x3F3F	0x2223F
+0x3F40	0x22240
+0x3F41	0x22248
+0x3F42	0x22259
+0x3F43	0x22237
+0x3F44	0x22244
+0x3F45	0x2F88C
+0x3F46	0x2F88B
+0x3F47	0x22255
+0x3F48	0x22239
+0x3F49	0x22354
+0x3F4A	0x22355
+0x3F4B	0x22356
+0x3F4C	0x22357
+0x3F4D	0x22358
+0x3F4E	0x22359
+0x3F4F	0x2238D
+0x3F50	0x223F2
+0x3F51	0x223F8
+0x3F52	0x223F5
+0x3F53	0x223F6
+0x3F54	0x223FC
+0x3F55	0x223FE
+0x3F56	0x223F1
+0x3F57	0x223FD
+0x3F58	0x2245E
+0x3F59	0x22496
+0x3F5A	0x22497
+0x3F5B	0x2249C
+0x3F5C	0x2249B
+0x3F5D	0x22495
+0x3F5E	0x2F89A
+0x3F5F	0x2251A
+0x3F60	0x22509
+0x3F61	0x22504
+0x3F62	0x2250E
+0x3F63	0x2251C
+0x3F64	0x22518
+0x3F65	0x2250D
+0x3F66	0x22510
+0x3F67	0x2250C
+0x3F68	0x22503
+0x3F69	0x2267B
+0x3F6A	0x226A6
+0x3F6B	0x22677
+0x3F6C	0x22688
+0x3F6D	0x22674
+0x3F6E	0x226DA
+0x3F6F	0x22676
+0x3F70	0x22678
+0x3F71	0x2268A
+0x3F72	0x2268F
+0x3F73	0x2267D
+0x3F74	0x22690
+0x3F75	0x226ED
+0x3F76	0x226D9
+0x3F77	0x226D0
+0x3F78	0x2271A
+0x3F79	0x226D7
+0x3F7A	0x226E2
+0x3F7B	0x226E1
+0x3F7C	0x226C5
+0x3F7D	0x226E0
+0x3F7E	0x226CA
+0x4021	0x22725
+0x4022	0x226CC
+0x4023	0x2F8B3
+0x4024	0x229C6
+0x4025	0x229C1
+0x4026	0x22A4D
+0x4027	0x22B4B
+0x4028	0x22B64
+0x4029	0x22B95
+0x402A	0x22B99
+0x402B	0x2F8BC
+0x402C	0x22B94
+0x402D	0x22BA2
+0x402E	0x22BAE
+0x402F	0x22B9E
+0x4030	0x22BA7
+0x4031	0x22B86
+0x4033	0x22BA4
+0x4034	0x22B91
+0x4035	0x22B93
+0x4036	0x2F8BB
+0x4037	0x22B88
+0x4038	0x22ECD
+0x4039	0x22ECA
+0x403A	0x22F3F
+0x403B	0x22F40
+0x403C	0x22F46
+0x403D	0x22F41
+0x403E	0x22F45
+0x403F	0x22F58
+0x4040	0x22F3B
+0x4041	0x22F48
+0x4042	0x2304E
+0x4043	0x23052
+0x4044	0x2304F
+0x4045	0x2307B
+0x4046	0x2307A
+0x4047	0x230A0
+0x4048	0x2309F
+0x4049	0x230FB
+0x404A	0x230F7
+0x404B	0x231B8
+0x404C	0x231B9
+0x404D	0x231BB
+0x404E	0x231B7
+0x4050	0x231BA
+0x4052	0x231DA
+0x4053	0x231B5
+0x4054	0x231BF
+0x4055	0x231BC
+0x4056	0x231C0
+0x4057	0x2F8D3
+0x4058	0x2F8D9
+0x4059	0x23375
+0x405A	0x23379
+0x405B	0x23376
+0x405C	0x23435
+0x405D	0x23440
+0x405E	0x234C0
+0x405F	0x23481
+0x4060	0x234AD
+0x4061	0x234AF
+0x4062	0x234AC
+0x4063	0x2348F
+0x4064	0x234A8
+0x4065	0x234AA
+0x4066	0x234A9
+0x4067	0x23488
+0x4068	0x2347F
+0x4069	0x23480
+0x406A	0x234BC
+0x406B	0x238AE
+0x406C	0x238BB
+0x406D	0x238BD
+0x406F	0x23978
+0x4070	0x23974
+0x4071	0x23A0C
+0x4072	0x23A11
+0x4073	0x23A08
+0x4074	0x23A06
+0x4075	0x23A10
+0x4076	0x23A8F
+0x4077	0x23A90
+0x4078	0x23A8D
+0x4079	0x23A8E
+0x407A	0x23A96
+0x407B	0x23A95
+0x407C	0x23B0B
+0x407D	0x23B0C
+0x407E	0x23B7C
+0x4121	0x23B73
+0x4122	0x23B75
+0x4123	0x23B76
+0x4124	0x23B7D
+0x4125	0x23B78
+0x4126	0x23B71
+0x4127	0x23C4B
+0x4128	0x23C4E
+0x4129	0x23D33
+0x412A	0x23D32
+0x412C	0x23D91
+0x412D	0x23DE7
+0x412E	0x23DE9
+0x412F	0x23DA2
+0x4130	0x23D94
+0x4131	0x23D87
+0x4132	0x23DA3
+0x4133	0x23DDD
+0x4134	0x23D7B
+0x4135	0x23D83
+0x4136	0x23D81
+0x4137	0x23DDF
+0x4138	0x23D7C
+0x4139	0x23DE4
+0x413A	0x23DE2
+0x413B	0x23D93
+0x413C	0x23D7D
+0x413D	0x23DBF
+0x413E	0x23D9B
+0x413F	0x23D8E
+0x4140	0x23D9F
+0x4142	0x23D8C
+0x4143	0x23D7F
+0x4144	0x23D9C
+0x4145	0x23D84
+0x4146	0x23D42
+0x4147	0x23DE6
+0x4148	0x24251
+0x4149	0x2424A
+0x414A	0x24264
+0x414B	0x24225
+0x414C	0x2422F
+0x414D	0x2422E
+0x414E	0x2422B
+0x414F	0x24228
+0x4150	0x24232
+0x4151	0x2422D
+0x4152	0x24231
+0x4153	0x24239
+0x4154	0x2422C
+0x4155	0x24261
+0x4156	0x24511
+0x4157	0x24510
+0x4158	0x24512
+0x4159	0x24553
+0x415A	0x24555
+0x415B	0x2457B
+0x415C	0x24581
+0x415D	0x2457D
+0x415E	0x2457C
+0x415F	0x245C2
+0x4160	0x245C5
+0x4161	0x2F922
+0x4162	0x245C4
+0x4163	0x2F923
+0x4164	0x2466B
+0x4165	0x24668
+0x4167	0x2465C
+0x4168	0x2465D
+0x4169	0x2466A
+0x416A	0x2F924
+0x416B	0x24C76
+0x416C	0x24776
+0x416E	0x247C4
+0x416F	0x247CB
+0x4170	0x247C8
+0x4171	0x247D4
+0x4172	0x247D5
+0x4173	0x247C9
+0x4174	0x247D7
+0x4176	0x24978
+0x4177	0x2495A
+0x4178	0x2495B
+0x4179	0x2495C
+0x417A	0x24956
+0x417B	0x24958
+0x417C	0x24971
+0x417D	0x269D4
+0x417E	0x24B40
+0x4221	0x2F933
+0x4222	0x24B3F
+0x4223	0x24B43
+0x4224	0x24B41
+0x4225	0x24BE2
+0x4226	0x24BE0
+0x4227	0x24BE3
+0x4228	0x24C66
+0x4229	0x24C73
+0x422A	0x24C6C
+0x422B	0x24C71
+0x422C	0x24C6A
+0x422D	0x24C6D
+0x422E	0x24C6E
+0x422F	0x24C6B
+0x4230	0x24D8C
+0x4231	0x24D77
+0x4232	0x2F93A
+0x4233	0x24D7F
+0x4234	0x24D89
+0x4235	0x24D7A
+0x4236	0x24D85
+0x4237	0x24D78
+0x4238	0x24D8A
+0x4239	0x24D86
+0x423A	0x24F2C
+0x423B	0x24F67
+0x423C	0x24F5B
+0x423D	0x24FE5
+0x423E	0x24FE1
+0x423F	0x25061
+0x4240	0x25069
+0x4241	0x2506A
+0x4242	0x25165
+0x4243	0x2516D
+0x4244	0x25163
+0x4245	0x25186
+0x4246	0x2515C
+0x4247	0x25162
+0x4248	0x2F948
+0x4249	0x25179
+0x424A	0x25169
+0x424B	0x25170
+0x424C	0x25176
+0x424D	0x2515D
+0x424E	0x25187
+0x424F	0x2516E
+0x4250	0x25171
+0x4251	0x2517C
+0x4252	0x25173
+0x4253	0x2515B
+0x4254	0x2516B
+0x4255	0x253BF
+0x4256	0x253C1
+0x4257	0x253BD
+0x4258	0x253C9
+0x4259	0x253BC
+0x425A	0x253C2
+0x425B	0x253C0
+0x425C	0x25492
+0x425D	0x254A9
+0x425E	0x2548F
+0x425F	0x25476
+0x4260	0x2547B
+0x4261	0x25475
+0x4262	0x254A4
+0x4263	0x25664
+0x4264	0x2573D
+0x4265	0x257AF
+0x4268	0x2579D
+0x4269	0x25799
+0x426A	0x257B1
+0x426B	0x25963
+0x426C	0x25962
+0x426D	0x25964
+0x426E	0x25969
+0x4270	0x25A75
+0x4271	0x25A73
+0x4272	0x25A71
+0x4273	0x25A74
+0x4274	0x25B0C
+0x4275	0x25B16
+0x4277	0x25B11
+0x4278	0x25B1F
+0x4279	0x25B1A
+0x427A	0x25B0D
+0x427B	0x25B1B
+0x427C	0x25B13
+0x427D	0x25E4E
+0x427E	0x25E55
+0x4321	0x25E50
+0x4323	0x25FD2
+0x4324	0x25FD3
+0x4325	0x25FD1
+0x4326	0x25FF1
+0x4327	0x25FDC
+0x4328	0x25FC8
+0x4329	0x25FCC
+0x432A	0x25FD0
+0x432B	0x25FCF
+0x432C	0x25FDF
+0x432D	0x2622B
+0x432E	0x2622E
+0x432F	0x2622D
+0x4330	0x2629D
+0x4331	0x2629E
+0x4332	0x2629F
+0x4333	0x262A9
+0x4334	0x262A0
+0x4335	0x26298
+0x4336	0x262A1
+0x4337	0x262AB
+0x4338	0x262AF
+0x4339	0x2636E
+0x433A	0x2635F
+0x433B	0x2635A
+0x433D	0x26365
+0x433E	0x26368
+0x433F	0x26372
+0x4340	0x26417
+0x4341	0x26416
+0x4342	0x26418
+0x4343	0x26419
+0x4344	0x2641A
+0x4345	0x26422
+0x4346	0x2641B
+0x4347	0x2641C
+0x4348	0x264BE
+0x4349	0x264EE
+0x434A	0x2655A
+0x434B	0x26550
+0x434C	0x26558
+0x434D	0x26554
+0x434E	0x26557
+0x434F	0x26556
+0x4350	0x26615
+0x4351	0x2669B
+0x4352	0x26693
+0x4353	0x26692
+0x4354	0x26672
+0x4355	0x26698
+0x4356	0x26699
+0x4357	0x266DF
+0x4359	0x266D5
+0x435B	0x266D4
+0x435C	0x266F3
+0x435D	0x266F4
+0x435E	0x266E7
+0x435F	0x266E1
+0x4360	0x266E6
+0x4361	0x266EB
+0x4362	0x266EC
+0x4363	0x202DB
+0x4365	0x2690D
+0x4366	0x2690C
+0x4367	0x21B2F
+0x4368	0x26968
+0x4369	0x26965
+0x436A	0x2696B
+0x436B	0x26969
+0x436C	0x269D1
+0x436D	0x269D3
+0x436E	0x26A27
+0x436F	0x26A28
+0x4372	0x26A24
+0x4373	0x26AD7
+0x4374	0x26BCA
+0x4375	0x26BC7
+0x4376	0x2F99E
+0x4377	0x26BD8
+0x4378	0x26BE1
+0x4379	0x26BC6
+0x437A	0x26BF8
+0x437B	0x26BC3
+0x437C	0x26BF4
+0x437D	0x26C17
+0x437E	0x26BEA
+0x4421	0x26BCB
+0x4422	0x26B86
+0x4423	0x26BC4
+0x4424	0x26BD9
+0x4425	0x26C19
+0x4426	0x26BC2
+0x4427	0x26BE2
+0x4429	0x26BDE
+0x442A	0x26BED
+0x442B	0x2F99C
+0x442D	0x26C1D
+0x442E	0x26BDD
+0x442F	0x26BDB
+0x4430	0x26BE8
+0x4431	0x26BE9
+0x4432	0x26BBF
+0x4433	0x26BE0
+0x4434	0x26BD1
+0x4435	0x26BDC
+0x4436	0x26BCE
+0x4437	0x26C1E
+0x4438	0x26BCC
+0x4439	0x26BF2
+0x443A	0x26BF3
+0x443B	0x2F99F
+0x443C	0x2F9A2
+0x443D	0x2F9A3
+0x443E	0x2F9A1
+0x443F	0x271AB
+0x4440	0x271AA
+0x4441	0x271A7
+0x4442	0x271A9
+0x4443	0x27288
+0x4444	0x27275
+0x4445	0x27260
+0x4446	0x2726C
+0x4447	0x27273
+0x4449	0x2726E
+0x444A	0x27274
+0x444B	0x27276
+0x444C	0x27268
+0x444D	0x27277
+0x444E	0x27286
+0x444F	0x275EA
+0x4450	0x27651
+0x4451	0x27650
+0x4452	0x27658
+0x4453	0x2764D
+0x4454	0x2764F
+0x4455	0x2764E
+0x4456	0x2765C
+0x4457	0x27652
+0x4458	0x27644
+0x4459	0x2764A
+0x445A	0x2764B
+0x445B	0x277EA
+0x445C	0x27810
+0x445D	0x27811
+0x445E	0x278CD
+0x445F	0x278BF
+0x4460	0x278C4
+0x4461	0x278D0
+0x4462	0x278CE
+0x4463	0x278C0
+0x4464	0x278C2
+0x4465	0x278CF
+0x4466	0x278C9
+0x4467	0x278BB
+0x4468	0x27997
+0x4469	0x27992
+0x446A	0x2796F
+0x446B	0x2797E
+0x446C	0x2799A
+0x446E	0x27986
+0x446F	0x27973
+0x4471	0x27977
+0x4472	0x2798F
+0x4473	0x27970
+0x4474	0x27981
+0x4475	0x27982
+0x4476	0x27999
+0x4477	0x2797D
+0x4478	0x2797F
+0x4479	0x2797B
+0x447A	0x27987
+0x447B	0x27BB2
+0x447C	0x27C2F
+0x447D	0x27C34
+0x447E	0x27C2E
+0x4521	0x27C32
+0x4523	0x27CAA
+0x4525	0x27CA9
+0x4526	0x27D38
+0x4527	0x27D36
+0x4528	0x27D37
+0x4529	0x27D47
+0x452A	0x27D33
+0x452B	0x27D39
+0x452C	0x27D35
+0x452D	0x27D44
+0x452E	0x27EA5
+0x452F	0x27EA6
+0x4530	0x27E9E
+0x4531	0x27FE3
+0x4532	0x27FDF
+0x4533	0x27FD3
+0x4534	0x27FF1
+0x4535	0x27FE4
+0x4536	0x27FE0
+0x4537	0x27FD6
+0x4539	0x27FE6
+0x453A	0x27FD8
+0x453B	0x27FDE
+0x453C	0x27FDB
+0x453D	0x27FDC
+0x453E	0x2821B
+0x453F	0x2821F
+0x4540	0x2821D
+0x4541	0x2821C
+0x4542	0x2821E
+0x4543	0x28220
+0x4544	0x28221
+0x4546	0x282B6
+0x4547	0x282BC
+0x4548	0x282C6
+0x4549	0x282C7
+0x454A	0x282BA
+0x454B	0x282BE
+0x454C	0x282BD
+0x454D	0x282B5
+0x454E	0x282B4
+0x454F	0x2840F
+0x4550	0x28462
+0x4551	0x284EB
+0x4552	0x284D9
+0x4553	0x284E4
+0x4554	0x284D7
+0x4555	0x284D8
+0x4556	0x284D6
+0x4557	0x284CE
+0x4558	0x284DD
+0x4559	0x284E7
+0x455A	0x284D2
+0x455B	0x284C5
+0x455C	0x284C9
+0x455D	0x284DB
+0x455E	0x28692
+0x455F	0x2868A
+0x4560	0x2868B
+0x4561	0x28689
+0x4562	0x28708
+0x4563	0x28703
+0x4564	0x28706
+0x4565	0x28705
+0x4566	0x286F5
+0x4567	0x2870B
+0x4568	0x286FB
+0x4569	0x287FC
+0x456A	0x28801
+0x456B	0x28802
+0x456C	0x287FA
+0x456D	0x28808
+0x456E	0x287F7
+0x456F	0x28800
+0x4570	0x287FF
+0x4571	0x28806
+0x4572	0x287F6
+0x4573	0x287FB
+0x4574	0x2880A
+0x4575	0x28925
+0x4576	0x28943
+0x4577	0x28944
+0x4578	0x28C64
+0x4579	0x28C62
+0x457A	0x28C5E
+0x457B	0x28C5B
+0x457C	0x28CD6
+0x457D	0x20072
+0x457E	0x200C2
+0x4621	0x28E77
+0x4622	0x28E82
+0x4623	0x28E7C
+0x4624	0x28E7D
+0x4625	0x28E86
+0x4626	0x28E81
+0x4627	0x28E84
+0x4628	0x28E76
+0x4629	0x28E83
+0x462A	0x28E7F
+0x462B	0x28E7E
+0x462C	0x28F88
+0x462D	0x28F8D
+0x462E	0x28F8B
+0x462F	0x28F91
+0x4630	0x28F8F
+0x4631	0x2907C
+0x4632	0x29079
+0x4633	0x2907A
+0x4634	0x291EA
+0x4635	0x2944C
+0x4636	0x29599
+0x4637	0x202D1
+0x4638	0x2968B
+0x4639	0x2968D
+0x463A	0x2968A
+0x463B	0x2968E
+0x463C	0x29811
+0x463D	0x22256
+0x463E	0x2FA15
+0x463F	0x20074
+0x4640	0x200C3
+0x4641	0x200C4
+0x4642	0x2011B
+0x4643	0x2015F
+0x4644	0x2016A
+0x4645	0x20169
+0x4646	0x2016B
+0x4647	0x2030C
+0x4648	0x202F6
+0x4649	0x202ED
+0x464A	0x20329
+0x464B	0x202FE
+0x464C	0x202F1
+0x464D	0x20317
+0x464E	0x202FF
+0x464F	0x202EE
+0x4650	0x202FD
+0x4651	0x2031C
+0x4652	0x202FC
+0x4653	0x20300
+0x4654	0x20320
+0x4656	0x202F9
+0x4657	0x20367
+0x4658	0x20308
+0x4659	0x2049E
+0x465A	0x204F3
+0x465B	0x20525
+0x465C	0x20527
+0x465D	0x2051F
+0x465E	0x20565
+0x465F	0x20563
+0x4660	0x20594
+0x4661	0x20597
+0x4662	0x205F1
+0x4663	0x2065F
+0x4664	0x20662
+0x4666	0x20660
+0x4667	0x2F822
+0x4668	0x2078C
+0x4669	0x20782
+0x466A	0x20790
+0x466B	0x2078B
+0x466C	0x2078D
+0x466D	0x20781
+0x466E	0x2079D
+0x466F	0x2088E
+0x4670	0x2088F
+0x4671	0x20892
+0x4672	0x20923
+0x4673	0x20952
+0x4674	0x2F82E
+0x4675	0x20A00
+0x4676	0x20A01
+0x4677	0x20A02
+0x4678	0x20A1F
+0x4679	0x20A8C
+0x467A	0x20A89
+0x467B	0x20A8B
+0x467C	0x20A88
+0x467D	0x20A8D
+0x467E	0x20A8F
+0x4721	0x26385
+0x4722	0x20B00
+0x4723	0x20B05
+0x4724	0x20B01
+0x4725	0x20B68
+0x4726	0x20B6E
+0x4727	0x20B67
+0x4728	0x20B75
+0x472A	0x2F845
+0x472B	0x20DD7
+0x472C	0x2F846
+0x472D	0x20048
+0x472E	0x20DD4
+0x472F	0x20DD8
+0x4730	0x2F847
+0x4731	0x2F848
+0x4732	0x20DBA
+0x4733	0x2F849
+0x4734	0x20DDB
+0x4735	0x20DBF
+0x4736	0x20E35
+0x4737	0x20DBC
+0x4738	0x20DD9
+0x473A	0x20DDD
+0x473B	0x20E00
+0x473C	0x20DD5
+0x473D	0x20E30
+0x473E	0x20DBD
+0x473F	0x20DDC
+0x4740	0x211FD
+0x4741	0x211FE
+0x4742	0x21207
+0x4743	0x24517
+0x4744	0x2136F
+0x4745	0x21369
+0x4746	0x21370
+0x4747	0x21367
+0x4748	0x213A9
+0x4749	0x21395
+0x474A	0x21390
+0x474B	0x2136C
+0x474C	0x21397
+0x474D	0x21371
+0x474F	0x21374
+0x4750	0x2136D
+0x4751	0x2138E
+0x4752	0x2152F
+0x4753	0x2A31B
+0x4754	0x215A9
+0x4755	0x2164E
+0x4756	0x2F85F
+0x4757	0x2165A
+0x4758	0x21648
+0x4759	0x21655
+0x475A	0x2164C
+0x475B	0x21649
+0x475C	0x2164F
+0x475D	0x2164A
+0x475E	0x217D6
+0x475F	0x217A0
+0x4760	0x217A9
+0x4761	0x2F867
+0x4762	0x2179D
+0x4763	0x217D4
+0x4764	0x217A4
+0x4765	0x217A8
+0x4766	0x217A6
+0x4767	0x217E6
+0x4768	0x2197D
+0x4769	0x21977
+0x476A	0x2197A
+0x476B	0x21A41
+0x476C	0x21A49
+0x476D	0x21A59
+0x476E	0x21A45
+0x476F	0x21A48
+0x4770	0x21A40
+0x4771	0x21B8E
+0x4772	0x21B95
+0x4773	0x21B90
+0x4774	0x21BF7
+0x4775	0x21BF8
+0x4776	0x21BF6
+0x4777	0x21BFB
+0x4778	0x21C9E
+0x4779	0x21C9D
+0x477A	0x21C99
+0x477B	0x2F877
+0x477C	0x21CA3
+0x477D	0x21CA9
+0x477E	0x21C98
+0x4821	0x21CA0
+0x4822	0x21C96
+0x4823	0x21C94
+0x4824	0x21C95
+0x4825	0x21C9F
+0x4826	0x21CA1
+0x4827	0x21D21
+0x4828	0x21D1D
+0x4829	0x21D1F
+0x482A	0x21E6D
+0x482B	0x2F87C
+0x482C	0x21E9A
+0x482D	0x21E92
+0x482E	0x21E7A
+0x482F	0x21E7D
+0x4830	0x21EA1
+0x4831	0x21E9D
+0x4832	0x21E99
+0x4833	0x21E6B
+0x4834	0x21E6E
+0x4835	0x2F87D
+0x4836	0x22045
+0x4837	0x2F884
+0x4838	0x220FB
+0x4839	0x220EB
+0x483A	0x220F2
+0x483B	0x220F9
+0x483C	0x2F886
+0x483D	0x220F8
+0x483E	0x220ED
+0x483F	0x22101
+0x4840	0x220F7
+0x4841	0x22106
+0x4842	0x2219B
+0x4843	0x221CA
+0x4846	0x2226B
+0x4847	0x2226C
+0x4848	0x22274
+0x4849	0x22267
+0x484A	0x2225B
+0x484B	0x22260
+0x484C	0x22276
+0x484D	0x22263
+0x484E	0x22261
+0x484F	0x22328
+0x4850	0x2235B
+0x4851	0x2235E
+0x4852	0x22360
+0x4853	0x2235D
+0x4854	0x2235C
+0x4855	0x223F4
+0x4856	0x22400
+0x4857	0x22408
+0x4858	0x22407
+0x4859	0x22401
+0x485A	0x22405
+0x485B	0x22464
+0x485C	0x22463
+0x485D	0x2249E
+0x485E	0x224A0
+0x485F	0x224A1
+0x4860	0x2249F
+0x4861	0x22526
+0x4862	0x2252D
+0x4863	0x22528
+0x4864	0x2251D
+0x4865	0x226EC
+0x4866	0x226E3
+0x4867	0x226EB
+0x4868	0x22716
+0x4869	0x226C8
+0x486A	0x2661B
+0x486B	0x226E9
+0x486C	0x226E4
+0x486D	0x22724
+0x486E	0x226D1
+0x4870	0x226DD
+0x4871	0x226C2
+0x4872	0x226CB
+0x4873	0x226C7
+0x4874	0x226E7
+0x4876	0x226EA
+0x4877	0x2274B
+0x4878	0x2F8A5
+0x4879	0x22760
+0x487A	0x2277D
+0x487B	0x2273E
+0x487C	0x2F8A4
+0x487D	0x22752
+0x487E	0x2274E
+0x4921	0x2273C
+0x4922	0x22732
+0x4923	0x22730
+0x4924	0x22723
+0x4925	0x229CA
+0x4926	0x229CB
+0x4927	0x229C9
+0x4928	0x229C8
+0x4929	0x229CD
+0x492A	0x22B98
+0x492B	0x22BA0
+0x492C	0x22B9F
+0x492D	0x22B9C
+0x492E	0x22BA3
+0x492F	0x22B97
+0x4930	0x2F8BE
+0x4931	0x22BF1
+0x4932	0x22C09
+0x4933	0x22C03
+0x4934	0x22BEA
+0x4935	0x22C45
+0x4936	0x22BED
+0x4937	0x22C05
+0x4938	0x22C1A
+0x4939	0x22C15
+0x493A	0x22C01
+0x493B	0x22BEC
+0x493C	0x22C0E
+0x493D	0x22C17
+0x493E	0x22C42
+0x493F	0x22C12
+0x4940	0x22C10
+0x4941	0x22BEF
+0x4942	0x22BFF
+0x4943	0x22C00
+0x4944	0x22C0C
+0x4945	0x22C0F
+0x4946	0x22C04
+0x4947	0x22C08
+0x4948	0x22C14
+0x4949	0x22C43
+0x494A	0x2F8BD
+0x494B	0x22C1B
+0x494C	0x22C11
+0x494D	0x22C13
+0x494E	0x22ECF
+0x494F	0x22ECE
+0x4950	0x22F6F
+0x4951	0x22F6E
+0x4952	0x22F7A
+0x4953	0x22F70
+0x4954	0x22F64
+0x4955	0x22F5E
+0x4956	0x22F6C
+0x4957	0x2F8C9
+0x4958	0x22F5B
+0x4959	0x22F61
+0x495A	0x22F65
+0x495B	0x2307F
+0x495C	0x23080
+0x495D	0x2307C
+0x495E	0x230A7
+0x495F	0x230A6
+0x4960	0x230A1
+0x4962	0x230A8
+0x4963	0x230A3
+0x4964	0x230A2
+0x4965	0x230AD
+0x4966	0x230A5
+0x4967	0x23101
+0x4968	0x230FF
+0x4969	0x230FC
+0x496A	0x23100
+0x496B	0x23135
+0x496C	0x231EE
+0x496D	0x231EF
+0x496E	0x231F6
+0x496F	0x231E8
+0x4970	0x231EA
+0x4971	0x231E3
+0x4972	0x2321F
+0x4974	0x231E4
+0x4975	0x231FA
+0x4976	0x231F1
+0x4977	0x231FB
+0x4978	0x2F8D4
+0x4979	0x2333D
+0x497A	0x2333C
+0x497C	0x23378
+0x497D	0x23377
+0x4A21	0x234D1
+0x4A22	0x234C7
+0x4A23	0x234DF
+0x4A24	0x234D0
+0x4A25	0x234E0
+0x4A26	0x234D6
+0x4A27	0x234D8
+0x4A28	0x23516
+0x4A29	0x2350E
+0x4A2A	0x234D9
+0x4A2B	0x2350F
+0x4A2C	0x23511
+0x4A2D	0x234CD
+0x4A2E	0x23489
+0x4A2F	0x234CE
+0x4A30	0x23514
+0x4A31	0x234DA
+0x4A32	0x23512
+0x4A33	0x234D3
+0x4A34	0x234C2
+0x4A35	0x234E1
+0x4A36	0x234E9
+0x4A37	0x234EA
+0x4A38	0x234DE
+0x4A39	0x23515
+0x4A3A	0x238D9
+0x4A3B	0x238D6
+0x4A3C	0x238CD
+0x4A3D	0x238D0
+0x4A3E	0x238D3
+0x4A3F	0x2F8F0
+0x4A40	0x23982
+0x4A41	0x23985
+0x4A42	0x2397F
+0x4A43	0x2397D
+0x4A44	0x23981
+0x4A45	0x23983
+0x4A46	0x23984
+0x4A47	0x284A0
+0x4A48	0x23A28
+0x4A49	0x23A0F
+0x4A4A	0x23A17
+0x4A4B	0x23A1A
+0x4A4C	0x23A25
+0x4A4D	0x2F8F7
+0x4A4E	0x23A9B
+0x4A4F	0x23A99
+0x4A50	0x23B92
+0x4A51	0x23B8C
+0x4A52	0x23B95
+0x4A53	0x23B8D
+0x4A54	0x23BA3
+0x4A55	0x23B93
+0x4A56	0x23B91
+0x4A57	0x23DDB
+0x4A58	0x23D99
+0x4A59	0x23D9A
+0x4A5A	0x23E08
+0x4A5B	0x23E4C
+0x4A5C	0x23E0D
+0x4A5D	0x23E01
+0x4A5E	0x23E4E
+0x4A5F	0x23E02
+0x4A60	0x23E4D
+0x4A61	0x23E21
+0x4A62	0x23DFC
+0x4A63	0x2F909
+0x4A64	0x23D8A
+0x4A65	0x2F908
+0x4A66	0x23D95
+0x4A67	0x23E11
+0x4A68	0x23E12
+0x4A69	0x23E46
+0x4A6A	0x23E1C
+0x4A6B	0x23E49
+0x4A6C	0x23E0C
+0x4A6E	0x23E13
+0x4A6F	0x23E16
+0x4A70	0x23DFD
+0x4A71	0x23E0F
+0x4A72	0x23E1F
+0x4A73	0x24230
+0x4A74	0x2426E
+0x4A75	0x2426B
+0x4A76	0x2429B
+0x4A77	0x2427B
+0x4A78	0x24263
+0x4A79	0x24297
+0x4A7A	0x2426D
+0x4A7B	0x2429C
+0x4A7C	0x24298
+0x4A7D	0x2426F
+0x4A7E	0x24267
+0x4B21	0x24269
+0x4B22	0x24515
+0x4B23	0x24563
+0x4B24	0x24586
+0x4B25	0x2458A
+0x4B26	0x24587
+0x4B27	0x24588
+0x4B28	0x24585
+0x4B29	0x24589
+0x4B2A	0x245CA
+0x4B2B	0x245C7
+0x4B2C	0x245CB
+0x4B2D	0x245CC
+0x4B2E	0x245C9
+0x4B2F	0x2460D
+0x4B30	0x24683
+0x4B31	0x24684
+0x4B32	0x24678
+0x4B33	0x24682
+0x4B34	0x24673
+0x4B35	0x24679
+0x4B36	0x2468C
+0x4B37	0x247D0
+0x4B38	0x247CF
+0x4B39	0x247D2
+0x4B3A	0x247D9
+0x4B3B	0x247CC
+0x4B3C	0x247EB
+0x4B3D	0x247FD
+0x4B3E	0x247EC
+0x4B3F	0x247E8
+0x4B40	0x247F8
+0x4B41	0x247FA
+0x4B42	0x2F927
+0x4B44	0x247E1
+0x4B45	0x247FB
+0x4B46	0x248E7
+0x4B47	0x2F92E
+0x4B48	0x249A5
+0x4B49	0x24991
+0x4B4A	0x249A6
+0x4B4B	0x2497C
+0x4B4C	0x24992
+0x4B4D	0x249A2
+0x4B4E	0x249A0
+0x4B4F	0x24AFC
+0x4B50	0x24AFE
+0x4B51	0x24B57
+0x4B52	0x24B53
+0x4B53	0x24B58
+0x4B54	0x24BE7
+0x4B55	0x24C8E
+0x4B56	0x2F938
+0x4B57	0x24C83
+0x4B58	0x24C8B
+0x4B59	0x24C84
+0x4B5B	0x24DA2
+0x4B5C	0x24DB7
+0x4B5D	0x24DA9
+0x4B5E	0x24DA5
+0x4B5F	0x24D9F
+0x4B60	0x24DAA
+0x4B61	0x24D97
+0x4B62	0x24DA1
+0x4B63	0x24D9E
+0x4B64	0x24DAB
+0x4B65	0x24D99
+0x4B66	0x24DA3
+0x4B67	0x24F30
+0x4B68	0x24F32
+0x4B69	0x24F2F
+0x4B6A	0x24F70
+0x4B6B	0x24F6C
+0x4B6C	0x24F6F
+0x4B6D	0x24FE8
+0x4B6E	0x24FEE
+0x4B6F	0x24FEA
+0x4B70	0x2506D
+0x4B71	0x25076
+0x4B72	0x25070
+0x4B73	0x25071
+0x4B74	0x2506C
+0x4B75	0x251EB
+0x4B76	0x251B5
+0x4B77	0x25196
+0x4B78	0x25190
+0x4B79	0x2518D
+0x4B7A	0x2F949
+0x4B7B	0x251A2
+0x4B7C	0x251B0
+0x4B7D	0x25192
+0x4B7E	0x251A0
+0x4C21	0x25193
+0x4C22	0x251C3
+0x4C23	0x2518E
+0x4C24	0x251B6
+0x4C25	0x2519D
+0x4C26	0x25195
+0x4C27	0x251B3
+0x4C28	0x251A4
+0x4C29	0x25370
+0x4C2A	0x253D4
+0x4C2C	0x253CF
+0x4C2D	0x20170
+0x4C2E	0x25494
+0x4C30	0x254C0
+0x4C31	0x254B4
+0x4C32	0x254C1
+0x4C34	0x254BD
+0x4C35	0x254AF
+0x4C36	0x25677
+0x4C37	0x25678
+0x4C38	0x2566B
+0x4C39	0x2566D
+0x4C3A	0x2566E
+0x4C3B	0x25672
+0x4C3C	0x2566F
+0x4C3D	0x25671
+0x4C3E	0x230AB
+0x4C3F	0x2568C
+0x4C40	0x2573F
+0x4C41	0x257B6
+0x4C42	0x257B7
+0x4C44	0x257BB
+0x4C45	0x257B8
+0x4C46	0x2079C
+0x4C47	0x257B9
+0x4C49	0x2598B
+0x4C4A	0x2597A
+0x4C4B	0x25984
+0x4C4C	0x25988
+0x4C4D	0x25991
+0x4C4E	0x25979
+0x4C4F	0x2598E
+0x4C50	0x25980
+0x4C51	0x25982
+0x4C52	0x2597C
+0x4C54	0x25A84
+0x4C55	0x25A7F
+0x4C57	0x25B3B
+0x4C58	0x25B71
+0x4C59	0x25B3D
+0x4C5A	0x25B30
+0x4C5C	0x25B3E
+0x4C5D	0x25B38
+0x4C5E	0x25E5E
+0x4C5F	0x25E64
+0x4C61	0x25E5D
+0x4C62	0x25E6D
+0x4C63	0x25E4F
+0x4C64	0x25E62
+0x4C65	0x25E5F
+0x4C66	0x25FEC
+0x4C67	0x25FF2
+0x4C68	0x25FF4
+0x4C69	0x25FF7
+0x4C6A	0x25FF6
+0x4C6B	0x26007
+0x4C6C	0x25FED
+0x4C6D	0x25FEA
+0x4C6E	0x25FF0
+0x4C6F	0x25FF8
+0x4C70	0x25FF3
+0x4C72	0x2F972
+0x4C73	0x26231
+0x4C74	0x2622F
+0x4C75	0x262B6
+0x4C76	0x262AE
+0x4C77	0x262AA
+0x4C78	0x262BF
+0x4C79	0x262CC
+0x4C7A	0x262C7
+0x4C7B	0x26C83
+0x4C7C	0x26380
+0x4C7D	0x2637B
+0x4C7E	0x2637F
+0x4D21	0x2637D
+0x4D22	0x26383
+0x4D23	0x2F978
+0x4D24	0x26446
+0x4D25	0x2642D
+0x4D26	0x26425
+0x4D27	0x26426
+0x4D28	0x2642C
+0x4D29	0x26437
+0x4D2A	0x26431
+0x4D2B	0x26433
+0x4D2C	0x26432
+0x4D2D	0x26427
+0x4D2E	0x2642A
+0x4D2F	0x2642E
+0x4D30	0x2642F
+0x4D31	0x264C0
+0x4D32	0x26571
+0x4D33	0x26561
+0x4D34	0x26562
+0x4D35	0x26566
+0x4D36	0x26618
+0x4D37	0x266C5
+0x4D38	0x266C3
+0x4D39	0x266C4
+0x4D3A	0x266C2
+0x4D3B	0x266AE
+0x4D3C	0x26710
+0x4D3D	0x26708
+0x4D3E	0x2671F
+0x4D3F	0x2673A
+0x4D40	0x2673B
+0x4D41	0x26736
+0x4D42	0x2670C
+0x4D43	0x26706
+0x4D44	0x2672A
+0x4D45	0x26757
+0x4D46	0x26750
+0x4D47	0x26720
+0x4D48	0x2F985
+0x4D49	0x2672C
+0x4D4A	0x26721
+0x4D4B	0x2670B
+0x4D4C	0x26719
+0x4D4D	0x26735
+0x4D4E	0x26718
+0x4D4F	0x2670F
+0x4D50	0x26713
+0x4D51	0x26755
+0x4D52	0x26739
+0x4D53	0x2671A
+0x4D55	0x26717
+0x4D56	0x268E4
+0x4D57	0x268E9
+0x4D58	0x2458B
+0x4D59	0x26910
+0x4D5A	0x26912
+0x4D5B	0x2693F
+0x4D5C	0x2696E
+0x4D5D	0x24518
+0x4D5E	0x2F98C
+0x4D5F	0x269D6
+0x4D60	0x269D5
+0x4D61	0x269D7
+0x4D62	0x20B02
+0x4D64	0x26A31
+0x4D65	0x26A30
+0x4D66	0x26A3A
+0x4D67	0x26B85
+0x4D68	0x26B6B
+0x4D69	0x26C48
+0x4D6A	0x26C4B
+0x4D6B	0x26C37
+0x4D6C	0x26C7B
+0x4D6D	0x26C6C
+0x4D6E	0x26C85
+0x4D6F	0x26C65
+0x4D70	0x26C36
+0x4D71	0x26C86
+0x4D72	0x26C34
+0x4D73	0x26C68
+0x4D74	0x26C5A
+0x4D75	0x26C58
+0x4D76	0x26C72
+0x4D77	0x26C6A
+0x4D78	0x26BD3
+0x4D79	0x26C3C
+0x4D7A	0x26C33
+0x4D7B	0x26C3B
+0x4D7C	0x26C4D
+0x4D7D	0x26C4F
+0x4D7E	0x26C7C
+0x4E21	0x26CB0
+0x4E22	0x26C5B
+0x4E23	0x26C55
+0x4E24	0x26C64
+0x4E25	0x26C6B
+0x4E26	0x26C53
+0x4E28	0x26C57
+0x4E29	0x26C5E
+0x4E2A	0x26C6D
+0x4E2B	0x26C35
+0x4E2C	0x26C69
+0x4E2D	0x26C59
+0x4E2E	0x26C66
+0x4E2F	0x26C50
+0x4E30	0x26C51
+0x4E31	0x26C5C
+0x4E32	0x26D5D
+0x4E33	0x26C87
+0x4E34	0x26C78
+0x4E35	0x26C49
+0x4E36	0x26C4E
+0x4E37	0x26BF1
+0x4E38	0x26C73
+0x4E39	0x26C88
+0x4E3A	0x26BCF
+0x4E3B	0x2F9A4
+0x4E3C	0x271B1
+0x4E3D	0x271B3
+0x4E3E	0x2729C
+0x4E3F	0x272A4
+0x4E40	0x27290
+0x4E41	0x272B8
+0x4E42	0x272A0
+0x4E43	0x2729D
+0x4E44	0x272A8
+0x4E45	0x272A9
+0x4E46	0x2F9B9
+0x4E47	0x272B1
+0x4E48	0x27293
+0x4E49	0x2729B
+0x4E4A	0x272A2
+0x4E4B	0x272A1
+0x4E4C	0x272B0
+0x4E4D	0x272A7
+0x4E4E	0x275B3
+0x4E50	0x275B4
+0x4E51	0x275F1
+0x4E52	0x275ED
+0x4E53	0x275EC
+0x4E54	0x27668
+0x4E55	0x27675
+0x4E56	0x2766A
+0x4E57	0x27662
+0x4E58	0x27667
+0x4E59	0x27660
+0x4E5A	0x27677
+0x4E5B	0x2765F
+0x4E5C	0x27679
+0x4E5D	0x27823
+0x4E5E	0x27821
+0x4E5F	0x2781C
+0x4E61	0x2781F
+0x4E62	0x2781E
+0x4E63	0x278D6
+0x4E64	0x278D3
+0x4E65	0x278D9
+0x4E66	0x278D7
+0x4E67	0x278D4
+0x4E68	0x278DC
+0x4E69	0x278D8
+0x4E6A	0x279A3
+0x4E6C	0x279BE
+0x4E6D	0x279A9
+0x4E6E	0x279A1
+0x4E6F	0x279A0
+0x4E70	0x279AB
+0x4E71	0x279A2
+0x4E72	0x279BA
+0x4E73	0x279C2
+0x4E74	0x2799C
+0x4E75	0x279BB
+0x4E76	0x279AA
+0x4E77	0x279AC
+0x4E78	0x279A5
+0x4E79	0x279C1
+0x4E7B	0x27BE2
+0x4E7C	0x27C36
+0x4E7D	0x27C3D
+0x4E7E	0x27C3A
+0x4F21	0x22461
+0x4F22	0x27C48
+0x4F23	0x27C3C
+0x4F24	0x27CB7
+0x4F25	0x27CAC
+0x4F26	0x27CB3
+0x4F27	0x27CB6
+0x4F28	0x27CB2
+0x4F2A	0x27D5D
+0x4F2B	0x27D49
+0x4F2C	0x27D4E
+0x4F2D	0x27D4F
+0x4F2E	0x27D4D
+0x4F2F	0x27D5C
+0x4F30	0x27E5D
+0x4F31	0x27EBB
+0x4F32	0x27ECE
+0x4F33	0x27EBF
+0x4F34	0x27EBA
+0x4F35	0x27EC3
+0x4F37	0x28006
+0x4F38	0x27FF8
+0x4F39	0x27FFE
+0x4F3A	0x28013
+0x4F3B	0x27FF6
+0x4F3D	0x28234
+0x4F3E	0x2822D
+0x4F3F	0x2822A
+0x4F40	0x28235
+0x4F41	0x2822C
+0x4F42	0x282D4
+0x4F43	0x282DA
+0x4F44	0x282D3
+0x4F45	0x282D2
+0x4F46	0x282CE
+0x4F47	0x282CF
+0x4F49	0x284FD
+0x4F4A	0x2850B
+0x4F4B	0x284FE
+0x4F4C	0x284F8
+0x4F4D	0x284F7
+0x4F4E	0x28517
+0x4F4F	0x284FA
+0x4F50	0x284F9
+0x4F51	0x28500
+0x4F52	0x284F5
+0x4F53	0x284F1
+0x4F54	0x28503
+0x4F55	0x28505
+0x4F56	0x2851C
+0x4F57	0x286AC
+0x4F58	0x2869A
+0x4F59	0x286AD
+0x4F5A	0x286A0
+0x4F5B	0x2871B
+0x4F5C	0x28725
+0x4F5D	0x28724
+0x4F5E	0x28726
+0x4F5F	0x28727
+0x4F60	0x28728
+0x4F61	0x2872A
+0x4F62	0x2871A
+0x4F63	0x2872E
+0x4F64	0x28715
+0x4F65	0x28815
+0x4F66	0x28814
+0x4F67	0x28817
+0x4F68	0x28818
+0x4F69	0x2880F
+0x4F6A	0x28813
+0x4F6B	0x2880B
+0x4F6C	0x28822
+0x4F6D	0x2137A
+0x4F6E	0x28926
+0x4F70	0x28951
+0x4F71	0x2894D
+0x4F72	0x2894E
+0x4F73	0x2894A
+0x4F74	0x2894B
+0x4F75	0x2894C
+0x4F76	0x28950
+0x4F77	0x28962
+0x4F78	0x2894F
+0x4F79	0x28952
+0x4F7A	0x28C68
+0x4F7B	0x28C69
+0x4F7C	0x28CE5
+0x4F7D	0x28CF0
+0x4F7E	0x28CE1
+0x5021	0x28CE2
+0x5022	0x2F9F2
+0x5023	0x28EA5
+0x5024	0x28EA9
+0x5025	0x28EA4
+0x5026	0x28EAF
+0x5027	0x28EAC
+0x5028	0x28EAE
+0x5029	0x28EAA
+0x502A	0x28F95
+0x502B	0x28F99
+0x502C	0x28F93
+0x502D	0x28F9D
+0x502E	0x28F98
+0x502F	0x28F9C
+0x5030	0x28F97
+0x5032	0x29089
+0x5033	0x29087
+0x5034	0x291D7
+0x5035	0x291ED
+0x5036	0x291F1
+0x5037	0x291F0
+0x5038	0x29205
+0x5039	0x29203
+0x503A	0x29204
+0x503B	0x2925F
+0x503C	0x29457
+0x503D	0x2959C
+0x503E	0x295A1
+0x503F	0x2959A
+0x5040	0x2968F
+0x5041	0x29693
+0x5042	0x2969E
+0x5043	0x296A3
+0x5044	0x29698
+0x5045	0x29699
+0x5046	0x29695
+0x5047	0x2986E
+0x5048	0x2986A
+0x5049	0x29AF4
+0x504A	0x29AF7
+0x504B	0x29C79
+0x504C	0x29F8F
+0x504D	0x29F91
+0x504E	0x2A00B
+0x504F	0x2A502
+0x5050	0x20084
+0x5051	0x20104
+0x5052	0x20180
+0x5053	0x2032F
+0x5054	0x2033F
+0x5055	0x2033B
+0x5056	0x20362
+0x5057	0x20344
+0x5058	0x20333
+0x5059	0x2035F
+0x505A	0x2032B
+0x505B	0x2F809
+0x505C	0x20339
+0x505D	0x20336
+0x505E	0x20348
+0x505F	0x20335
+0x5060	0x2036C
+0x5061	0x20358
+0x5062	0x2033A
+0x5063	0x204A8
+0x5064	0x204F4
+0x5065	0x20529
+0x5066	0x2059A
+0x5067	0x20600
+0x5068	0x207BB
+0x5069	0x207BD
+0x506A	0x207B7
+0x506B	0x207B2
+0x506D	0x207A8
+0x506E	0x207AB
+0x506F	0x207A6
+0x5070	0x207BC
+0x5071	0x20897
+0x5072	0x20896
+0x5073	0x208F8
+0x5075	0x20951
+0x5077	0x209B5
+0x5078	0x209B4
+0x5079	0x209B6
+0x507B	0x209B7
+0x507C	0x20A05
+0x507D	0x20A23
+0x507E	0x20A95
+0x5121	0x20A98
+0x5123	0x20A94
+0x5124	0x20A93
+0x5125	0x20B07
+0x5126	0x20B73
+0x5127	0x20B71
+0x5128	0x20B72
+0x5129	0x20B78
+0x512A	0x20E5F
+0x512B	0x20E6A
+0x512C	0x20E67
+0x512D	0x20E6B
+0x512E	0x20E69
+0x512F	0x20E8E
+0x5130	0x20E49
+0x5131	0x20E80
+0x5133	0x20E44
+0x5134	0x20E8F
+0x5135	0x20E45
+0x5136	0x2F84C
+0x5137	0x20E4F
+0x5138	0x20E63
+0x5139	0x20E36
+0x513A	0x20E48
+0x513B	0x20E5C
+0x513C	0x20E93
+0x513D	0x20E61
+0x513E	0x20E60
+0x513F	0x20E4E
+0x5140	0x20E5E
+0x5141	0x20E3F
+0x5142	0x20EA4
+0x5144	0x20E68
+0x5145	0x2120B
+0x5146	0x21211
+0x5147	0x2120D
+0x5148	0x2120E
+0x5149	0x213C2
+0x514A	0x2F857
+0x514B	0x213B0
+0x514C	0x213C3
+0x514D	0x213C8
+0x514E	0x21365
+0x514F	0x213D7
+0x5150	0x213BD
+0x5151	0x213B8
+0x5152	0x213B6
+0x5153	0x213C7
+0x5154	0x213BC
+0x5155	0x213B1
+0x5156	0x213AF
+0x5157	0x2F85B
+0x5158	0x21535
+0x5159	0x21530
+0x515A	0x2155D
+0x515B	0x20B76
+0x515C	0x2156F
+0x515D	0x215B0
+0x515E	0x2F85E
+0x515F	0x215B4
+0x5160	0x2165C
+0x5161	0x2165D
+0x5162	0x21808
+0x5163	0x217EE
+0x5164	0x2180B
+0x5165	0x217F2
+0x5166	0x217FD
+0x5167	0x217F1
+0x5168	0x21810
+0x5169	0x2F868
+0x516A	0x21814
+0x516B	0x2198B
+0x516C	0x2198C
+0x516D	0x21985
+0x516E	0x21A7A
+0x516F	0x21A6C
+0x5170	0x21A60
+0x5171	0x21A67
+0x5172	0x21A66
+0x5173	0x21A6A
+0x5174	0x21A5F
+0x5175	0x21A6D
+0x5176	0x21A68
+0x5177	0x21A64
+0x5178	0x21B3A
+0x5179	0x21B3B
+0x517A	0x21B39
+0x517B	0x21C02
+0x517C	0x21C04
+0x517D	0x21C03
+0x517E	0x21CB4
+0x5221	0x21CB3
+0x5222	0x21CBB
+0x5223	0x21CAC
+0x5224	0x21CB6
+0x5225	0x21CB1
+0x5226	0x21CAF
+0x5227	0x21CB5
+0x5228	0x21CBE
+0x5229	0x21CB2
+0x522A	0x21D24
+0x522B	0x21EB6
+0x522C	0x21EB9
+0x522D	0x21EAC
+0x522E	0x21EB0
+0x522F	0x21ED7
+0x5230	0x21EBB
+0x5231	0x21EFE
+0x5232	0x21ECB
+0x5233	0x2F87F
+0x5235	0x21EB3
+0x5236	0x21EBE
+0x5237	0x21ECD
+0x5238	0x21EBC
+0x5239	0x21EBA
+0x523A	0x21EC7
+0x523B	0x22116
+0x523C	0x2211B
+0x523D	0x22117
+0x523E	0x22115
+0x523F	0x2219F
+0x5240	0x2F88E
+0x5241	0x22282
+0x5242	0x22283
+0x5243	0x2228E
+0x5244	0x2226A
+0x5245	0x22289
+0x5246	0x22294
+0x5247	0x22286
+0x5248	0x22290
+0x5249	0x22362
+0x524A	0x22390
+0x524B	0x2240C
+0x524C	0x2240F
+0x524E	0x224A5
+0x524F	0x224A7
+0x5250	0x224A6
+0x5251	0x224A4
+0x5252	0x22535
+0x5253	0x22538
+0x5254	0x22536
+0x5255	0x22543
+0x5256	0x22547
+0x5257	0x22537
+0x5258	0x22743
+0x5259	0x227A2
+0x525A	0x22751
+0x525B	0x22772
+0x525C	0x2276D
+0x525D	0x2272F
+0x525E	0x22754
+0x525F	0x2276E
+0x5260	0x22755
+0x5261	0x22737
+0x5262	0x2274F
+0x5263	0x22750
+0x5265	0x2279E
+0x5266	0x2F8A8
+0x5267	0x227B3
+0x5268	0x227A7
+0x526A	0x227F9
+0x526B	0x22791
+0x526C	0x2F8A7
+0x526D	0x227B6
+0x526E	0x227DD
+0x526F	0x22799
+0x5270	0x229DF
+0x5271	0x229D5
+0x5272	0x247F5
+0x5273	0x22C28
+0x5274	0x22C40
+0x5275	0x22C71
+0x5276	0x22C98
+0x5277	0x22C95
+0x5278	0x22C65
+0x5279	0x22C78
+0x527A	0x22C7F
+0x527B	0x22C60
+0x527C	0x22C7C
+0x527D	0x22C96
+0x527E	0x22C6A
+0x5321	0x22C79
+0x5322	0x22C73
+0x5323	0x22C72
+0x5324	0x22C7B
+0x5325	0x22C70
+0x5326	0x22ED5
+0x5327	0x22ED7
+0x5328	0x22F8F
+0x5329	0x22F89
+0x532A	0x22F9E
+0x532B	0x22F87
+0x532C	0x22FA0
+0x532D	0x22F8D
+0x532E	0x22F88
+0x532F	0x22F7F
+0x5330	0x22F8C
+0x5331	0x22F93
+0x5332	0x23059
+0x5333	0x295B0
+0x5334	0x230B1
+0x5335	0x251F4
+0x5336	0x230AF
+0x5337	0x230B2
+0x5338	0x23108
+0x5339	0x2310A
+0x533A	0x23136
+0x533B	0x23137
+0x533C	0x2F8CF
+0x533E	0x23236
+0x533F	0x23229
+0x5340	0x2324A
+0x5341	0x23226
+0x5342	0x23228
+0x5343	0x23224
+0x5344	0x2322A
+0x5345	0x23248
+0x5346	0x23344
+0x5347	0x23384
+0x5348	0x2338C
+0x5349	0x234C4
+0x534A	0x234DC
+0x534B	0x23587
+0x534C	0x23553
+0x534D	0x2357F
+0x534E	0x23531
+0x534F	0x23551
+0x5350	0x2354B
+0x5351	0x23552
+0x5352	0x23580
+0x5353	0x235A5
+0x5354	0x23581
+0x5355	0x23543
+0x5356	0x23534
+0x5357	0x23536
+0x5358	0x23532
+0x5359	0x23548
+0x535A	0x23549
+0x535B	0x2353C
+0x535C	0x2354D
+0x535D	0x2354A
+0x535E	0x2F8E6
+0x535F	0x2358A
+0x5360	0x23546
+0x5361	0x2353E
+0x5362	0x23583
+0x5363	0x23550
+0x5364	0x235B4
+0x5365	0x238F0
+0x5366	0x238E4
+0x5367	0x238E3
+0x5368	0x238E5
+0x5369	0x238E6
+0x536A	0x238E7
+0x536B	0x238E1
+0x536C	0x238EF
+0x536D	0x238E8
+0x536E	0x238DD
+0x536F	0x23903
+0x5370	0x23988
+0x5371	0x23A26
+0x5372	0x23A16
+0x5373	0x23A3B
+0x5374	0x23A2F
+0x5375	0x23A39
+0x5376	0x23A34
+0x5377	0x2F8F4
+0x5378	0x23A35
+0x5379	0x23A31
+0x537A	0x23A38
+0x537B	0x20B81
+0x537C	0x23AAA
+0x537D	0x23AA3
+0x537E	0x23AA4
+0x5421	0x23AA0
+0x5422	0x23AA1
+0x5423	0x23AA9
+0x5424	0x23AA5
+0x5425	0x23BAF
+0x5426	0x23BB1
+0x5427	0x23BAB
+0x5428	0x23BAE
+0x5429	0x23BB0
+0x542A	0x23BB3
+0x542B	0x23BAC
+0x542C	0x23BA9
+0x542D	0x23BB2
+0x542E	0x23BA8
+0x542F	0x23BB4
+0x5430	0x23BC2
+0x5431	0x23C4F
+0x5432	0x23C66
+0x5433	0x23E1E
+0x5434	0x23E15
+0x5435	0x23E10
+0x5436	0x23E7F
+0x5437	0x23E7E
+0x5438	0x23E60
+0x5439	0x23ECC
+0x543A	0x23EB2
+0x543B	0x23E62
+0x543C	0x23E8D
+0x543D	0x23E8E
+0x543E	0x23E77
+0x543F	0x23E7C
+0x5440	0x23E8F
+0x5441	0x23E5D
+0x5442	0x23E6D
+0x5443	0x23E63
+0x5444	0x23EAF
+0x5445	0x23E90
+0x5446	0x23E7D
+0x5447	0x23E7A
+0x5448	0x23E06
+0x5449	0x2F90B
+0x544A	0x23E68
+0x544B	0x23EB4
+0x544C	0x23E78
+0x544D	0x23EB1
+0x544F	0x2F90C
+0x5451	0x242E8
+0x5452	0x242E9
+0x5453	0x242C0
+0x5455	0x242EA
+0x5456	0x242B7
+0x5457	0x242BA
+0x5458	0x242B5
+0x5459	0x2F91D
+0x545A	0x242B4
+0x545B	0x242BC
+0x545C	0x242C6
+0x545D	0x242B8
+0x545E	0x242BD
+0x545F	0x242C2
+0x5460	0x2434D
+0x5461	0x242F0
+0x5462	0x242C7
+0x5463	0x242C1
+0x5464	0x242C3
+0x5465	0x242F1
+0x5466	0x242EC
+0x5468	0x2451C
+0x5469	0x24520
+0x546A	0x24558
+0x546B	0x24565
+0x546C	0x24564
+0x546D	0x2458C
+0x546E	0x2458D
+0x546F	0x245D9
+0x5470	0x245E0
+0x5471	0x24610
+0x5472	0x24694
+0x5473	0x24692
+0x5474	0x24696
+0x5475	0x24695
+0x5476	0x246BF
+0x5477	0x246A0
+0x5479	0x247F4
+0x547A	0x247F6
+0x547B	0x247DC
+0x547D	0x24816
+0x547E	0x24815
+0x5521	0x2481C
+0x5522	0x2480F
+0x5523	0x2482C
+0x5524	0x24814
+0x5525	0x24825
+0x5526	0x24817
+0x5527	0x24812
+0x5528	0x2481E
+0x5529	0x24980
+0x552A	0x249A8
+0x552B	0x249AF
+0x552C	0x249D6
+0x552D	0x249E2
+0x552E	0x249B4
+0x552F	0x249B3
+0x5530	0x249B0
+0x5531	0x249B2
+0x5532	0x249A1
+0x5533	0x24B60
+0x5534	0x24B66
+0x5535	0x24B61
+0x5536	0x24B4E
+0x5537	0x24B5D
+0x5538	0x24B63
+0x5539	0x24BE6
+0x553A	0x24BEF
+0x553B	0x24BEC
+0x553C	0x24C98
+0x553D	0x24CA7
+0x553E	0x24C94
+0x553F	0x24C95
+0x5540	0x24C91
+0x5541	0x24C9D
+0x5542	0x24C99
+0x5543	0x24C9B
+0x5544	0x24C9C
+0x5545	0x24D1D
+0x5546	0x24D1C
+0x5547	0x24DD0
+0x5548	0x24DE0
+0x5549	0x24DCB
+0x554A	0x24DDB
+0x554B	0x24DDA
+0x554C	0x24DC2
+0x554D	0x24DD3
+0x554E	0x24DE5
+0x554F	0x24F7D
+0x5550	0x24F7B
+0x5551	0x24FFF
+0x5553	0x24FF9
+0x5554	0x25077
+0x5555	0x2507C
+0x5556	0x25078
+0x5557	0x2507B
+0x5558	0x2507A
+0x5559	0x251D2
+0x555A	0x251CB
+0x555B	0x251C9
+0x555C	0x251CE
+0x555D	0x251E4
+0x555E	0x251CA
+0x555F	0x251D0
+0x5560	0x22FA5
+0x5562	0x251D9
+0x5563	0x251EE
+0x5564	0x251DD
+0x5565	0x25200
+0x5566	0x251E1
+0x5567	0x253DE
+0x5568	0x253E2
+0x5569	0x253DA
+0x556A	0x254CE
+0x556B	0x2F94F
+0x556C	0x254CF
+0x556D	0x254DA
+0x556E	0x254D1
+0x556F	0x254D4
+0x5570	0x254ED
+0x5571	0x254CB
+0x5572	0x254D5
+0x5573	0x254F1
+0x5574	0x2569C
+0x5575	0x25688
+0x5576	0x25741
+0x5577	0x257D0
+0x5578	0x257F7
+0x5579	0x257CF
+0x557A	0x257D1
+0x557B	0x257DB
+0x557C	0x257DE
+0x557D	0x257F8
+0x557E	0x257DC
+0x5621	0x257D9
+0x5622	0x259A0
+0x5623	0x259B2
+0x5624	0x259A1
+0x5625	0x259AA
+0x5626	0x259A9
+0x5628	0x259A6
+0x5629	0x2599C
+0x562A	0x259B5
+0x562B	0x259A7
+0x562C	0x25A8E
+0x562D	0x25A90
+0x562E	0x25A91
+0x562F	0x25B85
+0x5630	0x25B5B
+0x5631	0x25B70
+0x5632	0x25B64
+0x5633	0x25B67
+0x5634	0x25B63
+0x5635	0x25B77
+0x5636	0x25B68
+0x5637	0x25B65
+0x5638	0x25B6A
+0x5639	0x25B78
+0x563A	0x25B66
+0x563B	0x25E88
+0x563C	0x25E9E
+0x563D	0x25E74
+0x563E	0x25E7A
+0x563F	0x25E79
+0x5640	0x25E8B
+0x5641	0x25E7F
+0x5642	0x26013
+0x5643	0x2601E
+0x5644	0x26017
+0x5645	0x2601A
+0x5646	0x26022
+0x5647	0x26043
+0x5648	0x26019
+0x5649	0x2601F
+0x564A	0x26027
+0x564B	0x26012
+0x564C	0x26024
+0x564D	0x26025
+0x564E	0x2035E
+0x564F	0x26235
+0x5650	0x26234
+0x5651	0x262D1
+0x5652	0x262C4
+0x5653	0x262CA
+0x5654	0x262C6
+0x5655	0x262CB
+0x5656	0x262CD
+0x5657	0x262E2
+0x5658	0x26389
+0x5659	0x2638B
+0x565A	0x26386
+0x565B	0x26388
+0x565C	0x2638D
+0x565D	0x2643B
+0x565E	0x2643C
+0x565F	0x2643D
+0x5660	0x264F5
+0x5661	0x26579
+0x5662	0x26575
+0x5663	0x26582
+0x5664	0x2657F
+0x5665	0x26585
+0x5666	0x26576
+0x5667	0x2657C
+0x5668	0x2657E
+0x5669	0x2657B
+0x566A	0x26580
+0x566B	0x2657A
+0x566C	0x22548
+0x566E	0x2661D
+0x566F	0x266F6
+0x5670	0x266F7
+0x5671	0x266F9
+0x5672	0x26763
+0x5673	0x2676C
+0x5674	0x2676E
+0x5675	0x26714
+0x5677	0x26767
+0x5678	0x2676F
+0x5679	0x26769
+0x567A	0x26776
+0x567B	0x26795
+0x567C	0x26771
+0x567D	0x26761
+0x567E	0x26778
+0x5721	0x2676B
+0x5722	0x26785
+0x5723	0x26784
+0x5724	0x26914
+0x5725	0x26976
+0x5726	0x259B6
+0x5727	0x26975
+0x5728	0x26974
+0x5729	0x269E2
+0x572A	0x26A3F
+0x572B	0x26A44
+0x572C	0x26A3D
+0x572D	0x26A47
+0x572E	0x26A48
+0x572F	0x26ADB
+0x5730	0x26ADC
+0x5731	0x26ADD
+0x5732	0x26BE5
+0x5733	0x26BE6
+0x5734	0x26CC2
+0x5735	0x26D2E
+0x5736	0x26D1D
+0x5737	0x26CF8
+0x5738	0x26CF0
+0x5739	0x26CF6
+0x573A	0x26CC5
+0x573B	0x26CC6
+0x573C	0x26CFC
+0x573D	0x26D52
+0x573E	0x26D2F
+0x573F	0x26D10
+0x5740	0x26CF3
+0x5741	0x26CD2
+0x5742	0x26CEA
+0x5743	0x26CDC
+0x5744	0x26D1B
+0x5745	0x26CFB
+0x5746	0x26CC3
+0x5747	0x26D16
+0x5748	0x26D07
+0x5749	0x26CC9
+0x574A	0x26CD8
+0x574B	0x26D30
+0x574C	0x26D13
+0x574D	0x26D31
+0x574E	0x26CFA
+0x574F	0x26CF2
+0x5750	0x26DE3
+0x5751	0x26CD5
+0x5752	0x26D01
+0x5753	0x26CF1
+0x5754	0x26D1C
+0x5755	0x26CD6
+0x5756	0x26D08
+0x5757	0x26D0B
+0x5758	0x26D17
+0x5759	0x26D20
+0x575A	0x26CCA
+0x575B	0x26D32
+0x575C	0x26D05
+0x575D	0x26CE4
+0x575E	0x26CCE
+0x575F	0x26D33
+0x5760	0x26D02
+0x5761	0x26D19
+0x5762	0x26D1E
+0x5763	0x26CD3
+0x5764	0x26CF7
+0x5765	0x26CE8
+0x5766	0x26D1F
+0x5767	0x26CF4
+0x5768	0x26DD8
+0x5769	0x271BF
+0x576A	0x271BE
+0x576B	0x271BD
+0x576C	0x272DC
+0x576D	0x272DD
+0x576E	0x272AB
+0x576F	0x272C9
+0x5770	0x272C8
+0x5771	0x272DF
+0x5772	0x272D9
+0x5773	0x272DB
+0x5774	0x272CC
+0x5775	0x272E0
+0x5776	0x272EF
+0x5777	0x272F3
+0x5778	0x272AE
+0x5779	0x27301
+0x577A	0x275B7
+0x577B	0x275B9
+0x577C	0x275B6
+0x577D	0x275B8
+0x577E	0x275F6
+0x5821	0x275F3
+0x5822	0x275F5
+0x5823	0x275F2
+0x5824	0x27691
+0x5825	0x2769D
+0x5826	0x2769B
+0x5827	0x27692
+0x5828	0x2768D
+0x5829	0x2769E
+0x582A	0x2768C
+0x582C	0x2F9C7
+0x582D	0x27695
+0x582E	0x2F9C6
+0x582F	0x2768A
+0x5830	0x2768E
+0x5831	0x2769C
+0x5832	0x277EF
+0x5833	0x2782D
+0x5834	0x27852
+0x5835	0x27835
+0x5836	0x27828
+0x5837	0x2782E
+0x5838	0x278E5
+0x5839	0x279EA
+0x583A	0x279F1
+0x583B	0x279EB
+0x583C	0x279D8
+0x583D	0x279D0
+0x583E	0x279F3
+0x583F	0x279DB
+0x5840	0x279CE
+0x5842	0x279DA
+0x5843	0x279D7
+0x5844	0x279E1
+0x5845	0x279F2
+0x5846	0x279C8
+0x5847	0x279D9
+0x5848	0x279DE
+0x5849	0x279D1
+0x584A	0x279E7
+0x584B	0x279CF
+0x584C	0x27BB7
+0x584D	0x27C47
+0x584E	0x27C42
+0x584F	0x27C43
+0x5850	0x2F9D3
+0x5851	0x27CC3
+0x5852	0x27CC1
+0x5853	0x27CC7
+0x5854	0x27D64
+0x5855	0x27D6A
+0x5856	0x27D66
+0x5857	0x27D50
+0x5858	0x27D6E
+0x5859	0x27D65
+0x585A	0x238EC
+0x585B	0x27D7F
+0x585C	0x2F9D5
+0x585D	0x27D9A
+0x585E	0x27D69
+0x585F	0x27D72
+0x5860	0x27D6F
+0x5861	0x27D7D
+0x5862	0x27D70
+0x5863	0x27E60
+0x5864	0x27EC2
+0x5865	0x27EE7
+0x5866	0x27ED1
+0x5867	0x27EEB
+0x5868	0x27ED4
+0x5869	0x27EDC
+0x586A	0x27EDB
+0x586B	0x28037
+0x586C	0x28025
+0x586D	0x2801F
+0x586E	0x2801E
+0x586F	0x28021
+0x5870	0x2801B
+0x5871	0x28017
+0x5872	0x28022
+0x5873	0x2802A
+0x5874	0x2801A
+0x5875	0x2802D
+0x5876	0x28023
+0x5877	0x28026
+0x5878	0x28036
+0x5879	0x27FFF
+0x587A	0x2823A
+0x587B	0x28240
+0x587C	0x28242
+0x587D	0x28238
+0x587E	0x2823B
+0x5921	0x2823C
+0x5922	0x28243
+0x5923	0x282E8
+0x5925	0x282F9
+0x5926	0x282EB
+0x5927	0x282F1
+0x5928	0x282E9
+0x5929	0x282EC
+0x592A	0x28415
+0x592B	0x28447
+0x592C	0x28446
+0x592D	0x28445
+0x592E	0x28524
+0x592F	0x28556
+0x5930	0x28521
+0x5931	0x28527
+0x5932	0x2854D
+0x5933	0x28531
+0x5934	0x2851E
+0x5935	0x2852C
+0x5936	0x2854F
+0x5937	0x2852B
+0x5938	0x28553
+0x5939	0x28551
+0x593A	0x28554
+0x593B	0x28529
+0x593C	0x28550
+0x593D	0x2851F
+0x593E	0x28532
+0x593F	0x2852A
+0x5940	0x2851D
+0x5941	0x28528
+0x5942	0x2852E
+0x5943	0x2852D
+0x5944	0x286BC
+0x5945	0x286BB
+0x5946	0x286BD
+0x5947	0x2F9E4
+0x5948	0x28747
+0x5949	0x28741
+0x594A	0x2F9E5
+0x594B	0x28749
+0x594D	0x2882E
+0x594E	0x28827
+0x594F	0x2896A
+0x5950	0x2897B
+0x5951	0x28973
+0x5952	0x28975
+0x5953	0x28969
+0x5954	0x28979
+0x5955	0x28972
+0x5956	0x28C76
+0x5957	0x28C77
+0x5958	0x28C74
+0x5959	0x28C73
+0x595A	0x28D02
+0x595B	0x28CFE
+0x595C	0x28D01
+0x595D	0x28CF9
+0x595E	0x28CF4
+0x595F	0x28ED3
+0x5960	0x28ED5
+0x5961	0x28ED8
+0x5962	0x28EC3
+0x5963	0x28ECA
+0x5964	0x28ED0
+0x5965	0x28ECB
+0x5966	0x28ECE
+0x5967	0x28EC5
+0x5968	0x28EE6
+0x5969	0x28EC4
+0x596A	0x28EC0
+0x596B	0x28ED4
+0x596C	0x28EE8
+0x596D	0x28F76
+0x596E	0x28FA2
+0x596F	0x28FAE
+0x5970	0x28FA8
+0x5971	0x28FA3
+0x5972	0x28FA7
+0x5973	0x28F96
+0x5974	0x28FA9
+0x5975	0x28FA5
+0x5976	0x28FAF
+0x5977	0x28FA4
+0x5978	0x28FAB
+0x5979	0x28FAA
+0x597A	0x28FA6
+0x597B	0x28FA0
+0x597C	0x29098
+0x597D	0x291DB
+0x597E	0x291F6
+0x5A21	0x291F5
+0x5A22	0x2920C
+0x5A23	0x2920A
+0x5A25	0x29268
+0x5A26	0x29263
+0x5A27	0x29266
+0x5A29	0x29264
+0x5A2A	0x2926A
+0x5A2B	0x29269
+0x5A2C	0x29395
+0x5A2D	0x29402
+0x5A2E	0x2946A
+0x5A2F	0x2945E
+0x5A30	0x29468
+0x5A31	0x29469
+0x5A32	0x29465
+0x5A33	0x2F9FE
+0x5A34	0x295A7
+0x5A35	0x295AE
+0x5A36	0x295A8
+0x5A37	0x295B3
+0x5A38	0x2969C
+0x5A39	0x296A9
+0x5A3A	0x296B6
+0x5A3B	0x296B3
+0x5A3C	0x296B2
+0x5A3D	0x2FA03
+0x5A3E	0x296B8
+0x5A3F	0x296C0
+0x5A40	0x296BF
+0x5A41	0x296BA
+0x5A42	0x296A8
+0x5A43	0x2983C
+0x5A44	0x29872
+0x5A45	0x29871
+0x5A46	0x29875
+0x5A47	0x29873
+0x5A48	0x29A17
+0x5A49	0x29A15
+0x5A4A	0x29A16
+0x5A4B	0x29A1B
+0x5A4C	0x29AFA
+0x5A4D	0x29AF9
+0x5A4E	0x29C2C
+0x5A4F	0x29C85
+0x5A50	0x29C82
+0x5A51	0x29C7F
+0x5A52	0x29C7D
+0x5A53	0x29C88
+0x5A54	0x242F3
+0x5A55	0x29D4E
+0x5A56	0x29D50
+0x5A57	0x29F93
+0x5A58	0x29F97
+0x5A59	0x29F98
+0x5A5A	0x29F9B
+0x5A5B	0x29F9C
+0x5A5C	0x29F96
+0x5A5D	0x2A28B
+0x5A5E	0x2A2FD
+0x5A5F	0x2A2FC
+0x5A60	0x2FA17
+0x5A61	0x2398B
+0x5A62	0x20108
+0x5A63	0x20107
+0x5A64	0x20373
+0x5A65	0x203A2
+0x5A66	0x203AF
+0x5A67	0x20382
+0x5A68	0x2037B
+0x5A69	0x20374
+0x5A6A	0x203B0
+0x5A6B	0x20376
+0x5A6C	0x203B9
+0x5A6D	0x2039E
+0x5A6E	0x203B1
+0x5A6F	0x203A1
+0x5A70	0x203B2
+0x5A71	0x2036E
+0x5A72	0x2F80B
+0x5A74	0x20378
+0x5A75	0x2037A
+0x5A76	0x20383
+0x5A77	0x2039A
+0x5A78	0x204F8
+0x5A79	0x20531
+0x5A7A	0x20569
+0x5A7B	0x20568
+0x5A7C	0x2059C
+0x5A7D	0x20604
+0x5A7E	0x20699
+0x5B21	0x207C7
+0x5B22	0x207C6
+0x5B23	0x207DC
+0x5B24	0x207C4
+0x5B25	0x207D8
+0x5B26	0x207D4
+0x5B27	0x207DF
+0x5B28	0x207D1
+0x5B29	0x207D0
+0x5B2A	0x207D6
+0x5B2B	0x207CF
+0x5B2C	0x208AD
+0x5B2D	0x208AF
+0x5B2E	0x208A7
+0x5B2F	0x208FD
+0x5B30	0x2095B
+0x5B31	0x2095A
+0x5B32	0x20A07
+0x5B33	0x20A9D
+0x5B34	0x20A9B
+0x5B35	0x20AAB
+0x5B36	0x20AA4
+0x5B37	0x20A9C
+0x5B38	0x20A9E
+0x5B39	0x20AA5
+0x5B3A	0x20AAA
+0x5B3B	0x20AA6
+0x5B3C	0x20B0E
+0x5B3D	0x20B7E
+0x5B3E	0x20B7C
+0x5B3F	0x20EEE
+0x5B40	0x20ED5
+0x5B41	0x20EE9
+0x5B42	0x20E42
+0x5B43	0x20EE2
+0x5B44	0x20F23
+0x5B45	0x20ED9
+0x5B46	0x20ED4
+0x5B47	0x20EE3
+0x5B48	0x20F15
+0x5B49	0x20EEF
+0x5B4A	0x20EF0
+0x5B4B	0x20ED6
+0x5B4C	0x20EDD
+0x5B4D	0x20EF6
+0x5B4E	0x20F1C
+0x5B4F	0x20ED8
+0x5B50	0x20EDB
+0x5B51	0x20EDA
+0x5B52	0x20EED
+0x5B53	0x21411
+0x5B54	0x21215
+0x5B55	0x21218
+0x5B56	0x2121A
+0x5B57	0x2121F
+0x5B58	0x21216
+0x5B59	0x2F84D
+0x5B5A	0x21219
+0x5B5B	0x2F84B
+0x5B5C	0x213F0
+0x5B5D	0x21409
+0x5B5E	0x2141B
+0x5B5F	0x27BE7
+0x5B60	0x213F6
+0x5B61	0x213F4
+0x5B62	0x213B5
+0x5B63	0x21410
+0x5B64	0x213F2
+0x5B65	0x21415
+0x5B66	0x213F3
+0x5B67	0x213F8
+0x5B68	0x21539
+0x5B69	0x2153B
+0x5B6A	0x21536
+0x5B6B	0x2140E
+0x5B6C	0x21572
+0x5B6D	0x21574
+0x5B6E	0x215B9
+0x5B6F	0x215B7
+0x5B70	0x215B8
+0x5B71	0x21672
+0x5B72	0x2166B
+0x5B73	0x2181D
+0x5B74	0x21837
+0x5B75	0x21822
+0x5B76	0x21843
+0x5B77	0x2184D
+0x5B78	0x21838
+0x5B79	0x2185B
+0x5B7A	0x21879
+0x5B7B	0x2181B
+0x5B7C	0x217F3
+0x5B7D	0x21991
+0x5B7E	0x21A7B
+0x5C21	0x21A94
+0x5C22	0x2F86F
+0x5C23	0x21A96
+0x5C24	0x21A7F
+0x5C25	0x21A8F
+0x5C26	0x21A84
+0x5C27	0x21A7C
+0x5C28	0x21A8E
+0x5C29	0x21A90
+0x5C2A	0x21A98
+0x5C2B	0x21A83
+0x5C2C	0x21A80
+0x5C2D	0x21A93
+0x5C2E	0x21A82
+0x5C30	0x21B3D
+0x5C31	0x21B41
+0x5C32	0x21BA1
+0x5C33	0x21B9F
+0x5C34	0x21C0A
+0x5C35	0x21C0D
+0x5C36	0x21CC8
+0x5C37	0x21CC9
+0x5C38	0x21CC7
+0x5C39	0x21CCD
+0x5C3A	0x21D25
+0x5C3B	0x21EB1
+0x5C3C	0x21EDC
+0x5C3D	0x2F880
+0x5C3E	0x21EE5
+0x5C3F	0x21EF4
+0x5C40	0x21EBF
+0x5C41	0x21EDB
+0x5C42	0x21EEA
+0x5C43	0x21EF2
+0x5C45	0x21EF1
+0x5C46	0x21EED
+0x5C47	0x21EE6
+0x5C48	0x22002
+0x5C49	0x2F882
+0x5C4A	0x22125
+0x5C4B	0x22118
+0x5C4C	0x2211F
+0x5C4D	0x22120
+0x5C4E	0x221CF
+0x5C4F	0x2229D
+0x5C50	0x22299
+0x5C51	0x222A8
+0x5C52	0x22368
+0x5C53	0x22366
+0x5C54	0x22367
+0x5C55	0x22391
+0x5C56	0x22413
+0x5C57	0x22415
+0x5C58	0x2241D
+0x5C59	0x22416
+0x5C5A	0x22419
+0x5C5B	0x2246B
+0x5C5C	0x22468
+0x5C5D	0x2246A
+0x5C5E	0x2246D
+0x5C5F	0x22469
+0x5C60	0x224AA
+0x5C61	0x22557
+0x5C62	0x22552
+0x5C63	0x22550
+0x5C64	0x2255F
+0x5C65	0x22567
+0x5C66	0x2254F
+0x5C68	0x2255B
+0x5C69	0x2255C
+0x5C6A	0x2255D
+0x5C6B	0x2281F
+0x5C6C	0x2279D
+0x5C6D	0x227B1
+0x5C6E	0x227B0
+0x5C6F	0x22794
+0x5C70	0x227C3
+0x5C71	0x227AF
+0x5C72	0x227A8
+0x5C73	0x227DC
+0x5C74	0x22798
+0x5C75	0x227C4
+0x5C76	0x227A4
+0x5C77	0x227AB
+0x5C78	0x227AA
+0x5C79	0x227A5
+0x5C7A	0x22821
+0x5C7B	0x227EB
+0x5C7C	0x227E6
+0x5C7D	0x227F7
+0x5C7E	0x227F8
+0x5D21	0x227FC
+0x5D22	0x227FA
+0x5D23	0x227E0
+0x5D24	0x2F8AA
+0x5D25	0x227F6
+0x5D26	0x2F8A9
+0x5D27	0x227E1
+0x5D28	0x229EC
+0x5D29	0x229E2
+0x5D2A	0x229E4
+0x5D2B	0x229F9
+0x5D2C	0x22C6F
+0x5D2D	0x23A4C
+0x5D2E	0x22CBB
+0x5D2F	0x22CE1
+0x5D30	0x22D00
+0x5D31	0x22CD8
+0x5D33	0x22CD6
+0x5D34	0x22CE2
+0x5D35	0x22CC3
+0x5D36	0x22CB3
+0x5D37	0x22CD2
+0x5D38	0x2F8C1
+0x5D39	0x22CCE
+0x5D3A	0x22CD0
+0x5D3B	0x22CD5
+0x5D3C	0x22CB9
+0x5D3D	0x22CBA
+0x5D3E	0x22CCF
+0x5D3F	0x22CBD
+0x5D40	0x22EDB
+0x5D41	0x22FAA
+0x5D42	0x22FAD
+0x5D43	0x22FB8
+0x5D44	0x22FB6
+0x5D45	0x22FB5
+0x5D46	0x22FAF
+0x5D47	0x22FB4
+0x5D48	0x22FB7
+0x5D49	0x22FA8
+0x5D4A	0x22FB9
+0x5D4B	0x22FBE
+0x5D4C	0x23082
+0x5D4D	0x230BC
+0x5D4E	0x230B8
+0x5D4F	0x230B6
+0x5D50	0x230B9
+0x5D52	0x23110
+0x5D53	0x23227
+0x5D54	0x23269
+0x5D55	0x23270
+0x5D56	0x23256
+0x5D57	0x2326B
+0x5D58	0x2327A
+0x5D59	0x2326C
+0x5D5A	0x2326D
+0x5D5B	0x2F8D5
+0x5D5C	0x267C1
+0x5D5D	0x2338D
+0x5D5E	0x23390
+0x5D5F	0x235B6
+0x5D60	0x23610
+0x5D61	0x23612
+0x5D62	0x235BA
+0x5D63	0x235BD
+0x5D64	0x23605
+0x5D65	0x235C2
+0x5D66	0x23607
+0x5D67	0x235F5
+0x5D68	0x2F8E9
+0x5D69	0x235AF
+0x5D6A	0x235F4
+0x5D6B	0x235F7
+0x5D6C	0x235F8
+0x5D6D	0x23611
+0x5D6E	0x238F6
+0x5D6F	0x238F5
+0x5D70	0x238FB
+0x5D71	0x23901
+0x5D72	0x23900
+0x5D73	0x23902
+0x5D74	0x238FE
+0x5D75	0x238FA
+0x5D76	0x238FD
+0x5D78	0x23A37
+0x5D79	0x23A49
+0x5D7A	0x23A4B
+0x5D7B	0x23A46
+0x5D7C	0x23A47
+0x5D7D	0x23AB3
+0x5D7E	0x23AB2
+0x5E21	0x23AB0
+0x5E22	0x23AB7
+0x5E23	0x23B11
+0x5E24	0x23BCC
+0x5E25	0x23BDF
+0x5E26	0x23BD3
+0x5E27	0x23BD5
+0x5E28	0x23BDB
+0x5E29	0x23BC5
+0x5E2A	0x23BC8
+0x5E2B	0x23BC9
+0x5E2C	0x23BE2
+0x5E2D	0x23BCA
+0x5E2E	0x23BD1
+0x5E2F	0x23BD2
+0x5E30	0x23BDD
+0x5E31	0x23E6C
+0x5E32	0x23E73
+0x5E33	0x23F21
+0x5E34	0x23EF0
+0x5E35	0x23F1F
+0x5E36	0x23F3B
+0x5E37	0x23F22
+0x5E38	0x23F23
+0x5E39	0x23EE8
+0x5E3A	0x23EDD
+0x5E3C	0x23F1B
+0x5E3D	0x23EED
+0x5E3E	0x2F90E
+0x5E3F	0x23EF2
+0x5E41	0x23EDC
+0x5E42	0x23EE9
+0x5E43	0x23F1D
+0x5E44	0x23EDA
+0x5E45	0x23EE6
+0x5E46	0x24313
+0x5E47	0x24315
+0x5E48	0x24316
+0x5E49	0x2433C
+0x5E4A	0x2430B
+0x5E4B	0x2431C
+0x5E4C	0x2433A
+0x5E4D	0x2433D
+0x5E4E	0x2439A
+0x5E4F	0x2431D
+0x5E50	0x24309
+0x5E51	0x24308
+0x5E52	0x2433B
+0x5E53	0x24522
+0x5E54	0x24526
+0x5E55	0x24525
+0x5E56	0x24524
+0x5E57	0x2039B
+0x5E58	0x2458F
+0x5E59	0x24590
+0x5E5A	0x245E6
+0x5E5B	0x245E3
+0x5E5C	0x245E5
+0x5E5D	0x24611
+0x5E5E	0x2F925
+0x5E5F	0x246AE
+0x5E60	0x246BE
+0x5E61	0x246B4
+0x5E62	0x246B3
+0x5E63	0x246AF
+0x5E64	0x24691
+0x5E65	0x246C2
+0x5E66	0x246B6
+0x5E67	0x246B2
+0x5E68	0x24857
+0x5E69	0x2483B
+0x5E6A	0x24858
+0x5E6B	0x24851
+0x5E6C	0x24841
+0x5E6D	0x24839
+0x5E6F	0x24859
+0x5E70	0x24845
+0x5E71	0x24861
+0x5E72	0x248E8
+0x5E73	0x249FA
+0x5E74	0x249EA
+0x5E75	0x249EF
+0x5E76	0x249F2
+0x5E77	0x249F0
+0x5E78	0x24B08
+0x5E79	0x24B70
+0x5E7A	0x24B6A
+0x5E7B	0x24B73
+0x5E7C	0x24B68
+0x5E7D	0x24BC8
+0x5E7E	0x24BF2
+0x5F21	0x20B7B
+0x5F22	0x24CAE
+0x5F23	0x24CAB
+0x5F24	0x24CB5
+0x5F25	0x24CAF
+0x5F26	0x24CB2
+0x5F27	0x24CB6
+0x5F28	0x24CB0
+0x5F29	0x24D1E
+0x5F2A	0x24E03
+0x5F2B	0x24E06
+0x5F2C	0x24E1F
+0x5F2E	0x24E0F
+0x5F2F	0x24E02
+0x5F30	0x24E19
+0x5F31	0x24E18
+0x5F32	0x24E22
+0x5F33	0x24E15
+0x5F34	0x24E07
+0x5F35	0x24E0D
+0x5F36	0x24E24
+0x5F37	0x24E0C
+0x5F38	0x24E1E
+0x5F39	0x24F89
+0x5F3A	0x24F8A
+0x5F3B	0x2500A
+0x5F3C	0x2500B
+0x5F3D	0x25007
+0x5F3E	0x25004
+0x5F3F	0x25009
+0x5F40	0x25084
+0x5F41	0x25083
+0x5F42	0x25218
+0x5F43	0x25214
+0x5F44	0x25205
+0x5F45	0x25216
+0x5F46	0x2520E
+0x5F47	0x25211
+0x5F48	0x25208
+0x5F49	0x2520B
+0x5F4A	0x25215
+0x5F4B	0x25085
+0x5F4C	0x25237
+0x5F4D	0x2522A
+0x5F4E	0x2520D
+0x5F4F	0x2520F
+0x5F50	0x2537E
+0x5F51	0x25376
+0x5F52	0x25377
+0x5F53	0x253EC
+0x5F54	0x254FC
+0x5F55	0x25508
+0x5F56	0x254FF
+0x5F57	0x25503
+0x5F58	0x25510
+0x5F59	0x25505
+0x5F5A	0x25506
+0x5F5B	0x254FA
+0x5F5C	0x256C7
+0x5F5D	0x256C0
+0x5F5E	0x256C3
+0x5F5F	0x256A7
+0x5F60	0x256A8
+0x5F61	0x256AB
+0x5F62	0x256C1
+0x5F63	0x256AA
+0x5F64	0x256C8
+0x5F65	0x25743
+0x5F66	0x25802
+0x5F67	0x2580E
+0x5F68	0x25801
+0x5F69	0x257FE
+0x5F6A	0x25803
+0x5F6C	0x25822
+0x5F6D	0x25821
+0x5F6E	0x25807
+0x5F6F	0x25808
+0x5F70	0x2580C
+0x5F71	0x259CA
+0x5F72	0x259BC
+0x5F73	0x259BE
+0x5F74	0x259BD
+0x5F75	0x2F95C
+0x5F76	0x259BB
+0x5F77	0x259B9
+0x5F79	0x259C5
+0x5F7A	0x25A99
+0x5F7B	0x25B6B
+0x5F7C	0x25B93
+0x5F7D	0x25B94
+0x5F7E	0x25BA9
+0x6021	0x25BA0
+0x6022	0x25BA6
+0x6023	0x2F961
+0x6024	0x25BAB
+0x6025	0x25B9E
+0x6026	0x25B9B
+0x6027	0x25B91
+0x6028	0x25B99
+0x6029	0x25EB6
+0x602A	0x25EB8
+0x602B	0x25E9A
+0x602D	0x25E98
+0x602E	0x25E9B
+0x602F	0x25EB3
+0x6030	0x25EA2
+0x6031	0x222AA
+0x6032	0x25EA0
+0x6033	0x25E9F
+0x6034	0x2605B
+0x6035	0x26070
+0x6036	0x26054
+0x6037	0x26071
+0x6038	0x26065
+0x6039	0x26051
+0x603A	0x2609D
+0x603B	0x26061
+0x603C	0x2605A
+0x603D	0x26074
+0x603E	0x2604C
+0x603F	0x2604B
+0x6040	0x2605E
+0x6041	0x26058
+0x6042	0x26053
+0x6043	0x26052
+0x6044	0x2623B
+0x6045	0x26239
+0x6046	0x262D6
+0x6047	0x262E7
+0x6048	0x262D7
+0x6049	0x262D8
+0x604A	0x262D9
+0x604B	0x262DA
+0x604C	0x262DB
+0x604D	0x262DC
+0x604E	0x262E0
+0x604F	0x262E4
+0x6050	0x262DD
+0x6051	0x262F5
+0x6052	0x262F1
+0x6053	0x26398
+0x6054	0x2639D
+0x6055	0x26399
+0x6056	0x26450
+0x6057	0x26449
+0x6059	0x26462
+0x605A	0x264D7
+0x605B	0x26501
+0x605C	0x264F7
+0x605D	0x2F97D
+0x605E	0x2658C
+0x605F	0x2659C
+0x6061	0x2661F
+0x6062	0x2661E
+0x6063	0x2673D
+0x6064	0x2673F
+0x6065	0x26711
+0x6066	0x26759
+0x6067	0x2673E
+0x6068	0x26758
+0x6069	0x26800
+0x606A	0x2679E
+0x606B	0x267B6
+0x606C	0x267AA
+0x606D	0x267AF
+0x606E	0x267AC
+0x6070	0x267C0
+0x6071	0x267A9
+0x6072	0x20B10
+0x6073	0x268EE
+0x6074	0x26977
+0x6075	0x26979
+0x6076	0x2697A
+0x6077	0x2697D
+0x6078	0x2697F
+0x6079	0x26983
+0x607A	0x26978
+0x607B	0x2697E
+0x607C	0x269E4
+0x607D	0x269E6
+0x607E	0x269E5
+0x6122	0x26A4E
+0x6123	0x26A59
+0x6125	0x2F98E
+0x6126	0x26A4F
+0x6127	0x26A4A
+0x6128	0x26AE3
+0x6129	0x26ADE
+0x612A	0x26AE2
+0x612B	0x26C74
+0x612C	0x26CAC
+0x612D	0x26C61
+0x612E	0x26C62
+0x612F	0x26C76
+0x6130	0x26C7A
+0x6131	0x26C79
+0x6132	0x26C60
+0x6133	0x26D64
+0x6134	0x26E81
+0x6135	0x26DDF
+0x6136	0x26D84
+0x6137	0x26D8A
+0x6138	0x26D92
+0x6139	0x26D79
+0x613A	0x26DDE
+0x613B	0x26D98
+0x613C	0x26D6C
+0x613D	0x26DE1
+0x613E	0x2F9A5
+0x613F	0x26D7C
+0x6140	0x26D72
+0x6141	0x26D81
+0x6142	0x26DE0
+0x6143	0x26D65
+0x6145	0x26D6A
+0x6146	0x26D97
+0x6147	0x26DAA
+0x6148	0x26DD3
+0x6149	0x26DAB
+0x614A	0x26D6E
+0x614B	0x26DAC
+0x614C	0x26D76
+0x614D	0x26D7B
+0x614E	0x26DAD
+0x614F	0x2F9A6
+0x6150	0x26D94
+0x6151	0x26DD7
+0x6152	0x26D70
+0x6153	0x26DD5
+0x6154	0x26DF1
+0x6155	0x26D7A
+0x6156	0x26D68
+0x6157	0x26D96
+0x6159	0x26D73
+0x615A	0x26DAE
+0x615B	0x26DDD
+0x615C	0x26DDA
+0x615D	0x26DAF
+0x615E	0x26DB0
+0x615F	0x26DDB
+0x6160	0x26D62
+0x6161	0x26DF8
+0x6162	0x271C2
+0x6163	0x271C7
+0x6164	0x271C8
+0x6165	0x271C5
+0x6166	0x271C3
+0x6167	0x271C6
+0x6168	0x272DE
+0x616A	0x27311
+0x616B	0x27315
+0x616C	0x27328
+0x616D	0x27321
+0x616E	0x2732D
+0x616F	0x27351
+0x6170	0x2732B
+0x6171	0x27316
+0x6172	0x27324
+0x6173	0x27335
+0x6174	0x2731F
+0x6175	0x27312
+0x6176	0x27310
+0x6177	0x27380
+0x6178	0x2733B
+0x6179	0x27329
+0x617A	0x2732A
+0x617B	0x2731B
+0x617C	0x27318
+0x617D	0x27320
+0x617E	0x2733F
+0x6221	0x2731C
+0x6222	0x27326
+0x6223	0x2730B
+0x6224	0x275BE
+0x6225	0x275C4
+0x6226	0x275BD
+0x6227	0x275FA
+0x6228	0x275FB
+0x6229	0x276B1
+0x622A	0x276B2
+0x622B	0x276B0
+0x622C	0x276B9
+0x622D	0x276A6
+0x622E	0x276BD
+0x622F	0x276B6
+0x6230	0x276B8
+0x6231	0x276B4
+0x6232	0x276B3
+0x6233	0x276A7
+0x6234	0x276AE
+0x6235	0x276BC
+0x6236	0x277F2
+0x6237	0x277F3
+0x6238	0x277F4
+0x6239	0x2783B
+0x623A	0x27840
+0x623B	0x27846
+0x623C	0x278F0
+0x623D	0x278EE
+0x623E	0x278E8
+0x623F	0x278F1
+0x6240	0x278EB
+0x6241	0x278EF
+0x6242	0x279FC
+0x6243	0x27A20
+0x6244	0x27A09
+0x6245	0x27A06
+0x6246	0x27A03
+0x6247	0x2F9CF
+0x6248	0x27A19
+0x6249	0x27A24
+0x624A	0x27A1B
+0x624B	0x27A1D
+0x624C	0x279FD
+0x624D	0x27A1E
+0x624E	0x279F4
+0x624F	0x27A01
+0x6250	0x27A08
+0x6251	0x27A05
+0x6252	0x27A23
+0x6253	0x279FF
+0x6254	0x27BEA
+0x6255	0x27C4D
+0x6256	0x27C4E
+0x6257	0x27C56
+0x6258	0x27C57
+0x6259	0x27C51
+0x625A	0x27C55
+0x625B	0x27C54
+0x625C	0x27CCB
+0x625D	0x27CD4
+0x625E	0x27CD1
+0x625F	0x27CCF
+0x6260	0x27CD2
+0x6261	0x27CCA
+0x6262	0x27CD6
+0x6263	0x27D8B
+0x6264	0x27D88
+0x6265	0x27D85
+0x6266	0x27D89
+0x6267	0x21A9B
+0x6268	0x27DBB
+0x6269	0x27D8C
+0x626B	0x27D99
+0x626C	0x27D8A
+0x626D	0x27EEC
+0x626E	0x27EEF
+0x626F	0x27EF9
+0x6270	0x27F09
+0x6271	0x27EF8
+0x6272	0x27EF3
+0x6273	0x27F00
+0x6274	0x27F1D
+0x6276	0x27EFD
+0x6277	0x28048
+0x6278	0x2805C
+0x6279	0x28055
+0x627A	0x2805E
+0x627B	0x28049
+0x627C	0x28063
+0x627D	0x28060
+0x627E	0x28053
+0x6321	0x28062
+0x6322	0x28040
+0x6323	0x28249
+0x6324	0x2824A
+0x6325	0x2824C
+0x6326	0x2824D
+0x6327	0x2830A
+0x6328	0x28306
+0x6329	0x2832F
+0x632A	0x28321
+0x632B	0x28307
+0x632C	0x28309
+0x632D	0x28302
+0x632E	0x28316
+0x632F	0x28303
+0x6330	0x2830B
+0x6331	0x2830F
+0x6332	0x28560
+0x6333	0x28568
+0x6334	0x2855E
+0x6335	0x2855D
+0x6336	0x28563
+0x6337	0x2855F
+0x6338	0x28564
+0x6339	0x28578
+0x633A	0x28561
+0x633B	0x28569
+0x633C	0x28565
+0x633D	0x286DA
+0x633E	0x286E6
+0x633F	0x286DB
+0x6340	0x286DC
+0x6341	0x28739
+0x6342	0x28757
+0x6343	0x28755
+0x6344	0x28765
+0x6345	0x28761
+0x6346	0x28754
+0x6347	0x28845
+0x6348	0x28841
+0x6349	0x2883E
+0x634A	0x28837
+0x634B	0x28912
+0x634C	0x28913
+0x634D	0x2892C
+0x634E	0x28996
+0x634F	0x2F9E9
+0x6350	0x2899C
+0x6351	0x2899D
+0x6352	0x28985
+0x6353	0x2F9E8
+0x6354	0x2899F
+0x6355	0x289A3
+0x6356	0x28C82
+0x6357	0x28C83
+0x6358	0x2F9EE
+0x6359	0x28D1D
+0x635A	0x28D14
+0x635B	0x28D1F
+0x635C	0x28D20
+0x635D	0x28E47
+0x635E	0x28E80
+0x635F	0x28EC9
+0x6360	0x28EF9
+0x6361	0x28F06
+0x6362	0x28EF0
+0x6363	0x28EF8
+0x6364	0x28EEF
+0x6365	0x28EFD
+0x6366	0x28EF1
+0x6367	0x28EFE
+0x6368	0x28FB8
+0x6369	0x28FC0
+0x636A	0x28FC3
+0x636B	0x28FB5
+0x636C	0x28FB6
+0x636D	0x28FC9
+0x636E	0x2F9F3
+0x636F	0x28FBD
+0x6370	0x28FBA
+0x6371	0x28FBF
+0x6372	0x28FB3
+0x6373	0x28FC6
+0x6374	0x28FB2
+0x6375	0x28FBC
+0x6376	0x28FB7
+0x6377	0x28FB9
+0x6378	0x28FC8
+0x6379	0x290B5
+0x637A	0x290B3
+0x637C	0x290AC
+0x637D	0x290A9
+0x637E	0x290AD
+0x6421	0x29211
+0x6422	0x2920D
+0x6423	0x29216
+0x6424	0x29289
+0x6425	0x2927C
+0x6426	0x2928B
+0x6427	0x2927B
+0x6428	0x29288
+0x6429	0x29284
+0x642A	0x2939D
+0x642B	0x29398
+0x642C	0x29488
+0x642D	0x29486
+0x642E	0x29482
+0x642F	0x2948B
+0x6430	0x2F9FF
+0x6431	0x29471
+0x6432	0x29472
+0x6433	0x29481
+0x6434	0x2948C
+0x6435	0x29480
+0x6436	0x29489
+0x6437	0x295BB
+0x6438	0x295C1
+0x6439	0x295BE
+0x643A	0x2FA01
+0x643B	0x295BD
+0x643C	0x296C1
+0x643D	0x296B4
+0x643E	0x296B7
+0x643F	0x296C8
+0x6441	0x296D3
+0x6442	0x296D0
+0x6443	0x296B0
+0x6444	0x296CA
+0x6445	0x296CD
+0x6446	0x29815
+0x6447	0x29819
+0x6448	0x29817
+0x6449	0x2983F
+0x644A	0x29840
+0x644B	0x29844
+0x644C	0x2987C
+0x644D	0x29878
+0x644E	0x29879
+0x644F	0x29888
+0x6450	0x2FA06
+0x6451	0x29889
+0x6452	0x2987D
+0x6453	0x29A23
+0x6454	0x29A24
+0x6455	0x29A26
+0x6456	0x29A22
+0x6457	0x29A27
+0x6458	0x29A1F
+0x6459	0x29AC9
+0x645A	0x29AC3
+0x645B	0x29B0A
+0x645C	0x29B0B
+0x645D	0x29B04
+0x645F	0x29B03
+0x6460	0x29B01
+0x6461	0x29B09
+0x6462	0x29C0F
+0x6463	0x29C2E
+0x6464	0x29C2D
+0x6465	0x29C91
+0x6466	0x29C99
+0x6467	0x29C9E
+0x6468	0x29C90
+0x6469	0x29C94
+0x646A	0x29C9D
+0x646B	0x29C98
+0x646C	0x29C9B
+0x646D	0x29C9C
+0x646E	0x29C9A
+0x646F	0x29D54
+0x6470	0x29F9D
+0x6471	0x29F9F
+0x6472	0x29FA3
+0x6473	0x29FA4
+0x6474	0x29FA5
+0x6475	0x2A302
+0x6476	0x2A417
+0x6477	0x2A41B
+0x6478	0x2A419
+0x6479	0x2A4D1
+0x647A	0x21537
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,6388 @@
+0x2121 0x20055
+0x2122 0x20182
+0x2123 0x20189
+0x2124 0x20187
+0x2125 0x203BE
+0x2126 0x203BD
+0x2127 0x203CA
+0x2128 0x203D4
+0x2129 0x203BC
+0x212A 0x203C4
+0x212B 0x203C1
+0x212C 0x203C2
+0x212D 0x203D7
+0x212E 0x20370
+0x212F 0x203BA
+0x2130 0x203E3
+0x2131 0x203BB
+0x2132 0x204B1
+0x2133 0x204B6
+0x2134 0x204B0
+0x2135 0x2056C
+0x2136 0x2060D
+0x2137 0x20607
+0x2138 0x207F1
+0x2139 0x207F5
+0x213A 0x207ED
+0x213B 0x207EF
+0x213C 0x207EB
+0x213D 0x207EC
+0x213E 0x207EE
+0x213F 0x20807
+0x2140 0x209C4
+0x2141 0x20A08
+0x2142 0x20AB3
+0x2143 0x20AAD
+0x2144 0x20AB0
+0x2145 0x20B11
+0x2146 0x2018A
+0x2147 0x20F83
+0x2148 0x20F7A
+0x2149 0x20F82
+0x214A 0x20F68
+0x214B 0x20F71
+0x214C 0x20FB0
+0x214D 0x20FAF
+0x214F 0x20F6C
+0x2150 0x20F6F
+0x2151 0x20F62
+0x2152 0x20F65
+0x2153 0x20F81
+0x2154 0x20F7F
+0x2155 0x20F64
+0x2156 0x20F73
+0x2157 0x20F6E
+0x2158 0x20F67
+0x2159 0x20F74
+0x215A 0x20F7D
+0x215B 0x20F78
+0x215C 0x20F85
+0x215D 0x20FAA
+0x215E 0x20F88
+0x215F 0x20FA6
+0x2160 0x2F84E
+0x2161 0x20F8A
+0x2162 0x20F84
+0x2164 0x21224
+0x2165 0x21222
+0x2166 0x21223
+0x2167 0x21432
+0x2168 0x2145B
+0x2169 0x2144F
+0x216B 0x21426
+0x216C 0x2143E
+0x216D 0x21442
+0x216E 0x21447
+0x216F 0x21422
+0x2170 0x2069B
+0x2171 0x2144A
+0x2172 0x2141F
+0x2173 0x21449
+0x2174 0x2142B
+0x2175 0x21433
+0x2176 0x2F858
+0x2177 0x2142A
+0x2178 0x21428
+0x2179 0x2153D
+0x217A 0x2153C
+0x217B 0x215BF
+0x217C 0x21679
+0x217D 0x21680
+0x217E 0x2167C
+0x2221 0x2167A
+0x2222 0x21678
+0x2223 0x21882
+0x2224 0x2185C
+0x2225 0x2185A
+0x2226 0x2184B
+0x2227 0x2187C
+0x2228 0x2187F
+0x2229 0x2181F
+0x222A 0x21889
+0x222B 0x2188B
+0x222C 0x21857
+0x222D 0x2187E
+0x222E 0x2187D
+0x222F 0x21853
+0x2230 0x21A9F
+0x2231 0x21ABC
+0x2232 0x21AA5
+0x2233 0x21A86
+0x2234 0x21ADC
+0x2235 0x21AA4
+0x2236 0x21AB6
+0x2237 0x21AA2
+0x2238 0x21AB4
+0x2239 0x21B48
+0x223A 0x21B46
+0x223B 0x21BA7
+0x223C 0x21C14
+0x223D 0x21C12
+0x223E 0x21C11
+0x223F 0x21CE1
+0x2240 0x21CD0
+0x2241 0x21D26
+0x2242 0x21D28
+0x2243 0x21D29
+0x2244 0x21F2F
+0x2245 0x21F0D
+0x2246 0x21F25
+0x2247 0x21F14
+0x2248 0x21F3C
+0x2249 0x21F0B
+0x224A 0x21F11
+0x224B 0x21F30
+0x224C 0x21F18
+0x224D 0x21F19
+0x224E 0x21F36
+0x224F 0x21F17
+0x2250 0x21F10
+0x2251 0x21F15
+0x2252 0x22003
+0x2253 0x22029
+0x2254 0x2204C
+0x2255 0x2213F
+0x2256 0x2213E
+0x2257 0x22134
+0x2258 0x22142
+0x2259 0x22135
+0x225A 0x207F3
+0x225B 0x221CD
+0x225C 0x221D1
+0x225D 0x221D2
+0x225E 0x222AD
+0x225F 0x222BA
+0x2260 0x222C1
+0x2261 0x222BB
+0x2262 0x222B4
+0x2263 0x222BC
+0x2264 0x2236C
+0x2265 0x22392
+0x2266 0x22421
+0x2267 0x22424
+0x2268 0x23F19
+0x2269 0x224AD
+0x226A 0x224AE
+0x226B 0x224AB
+0x226C 0x224AC
+0x226D 0x22570
+0x226E 0x22576
+0x226F 0x22571
+0x2270 0x22577
+0x2272 0x227EC
+0x2273 0x2281C
+0x2274 0x227FB
+0x2275 0x227EE
+0x2276 0x228E2
+0x2277 0x227FD
+0x2278 0x2281E
+0x2279 0x2283B
+0x227A 0x2284A
+0x227B 0x2F8AE
+0x227D 0x2287D
+0x227E 0x22856
+0x2321 0x22844
+0x2322 0x2284B
+0x2323 0x229FA
+0x2324 0x229E8
+0x2325 0x229F8
+0x2326 0x229FF
+0x2327 0x229F7
+0x2328 0x229F6
+0x2329 0x229FE
+0x232A 0x22A07
+0x232B 0x22A5D
+0x232C 0x22CD4
+0x232D 0x2F8C3
+0x232E 0x22CC8
+0x232F 0x22CC5
+0x2330 0x2F8C0
+0x2331 0x22CC9
+0x2332 0x22D4D
+0x2333 0x22D20
+0x2334 0x22D36
+0x2335 0x22D35
+0x2336 0x22D88
+0x2337 0x22D25
+0x2338 0x22D21
+0x2339 0x22D26
+0x233B 0x22D3F
+0x233C 0x22D3B
+0x233D 0x22D24
+0x233E 0x22D43
+0x233F 0x22D4E
+0x2340 0x22D4F
+0x2341 0x22D44
+0x2342 0x22D40
+0x2343 0x22D41
+0x2344 0x22D39
+0x2345 0x22D2B
+0x2346 0x22EDD
+0x2347 0x22EDE
+0x2348 0x22FCD
+0x2349 0x22FCB
+0x234A 0x22FDB
+0x234B 0x22FD8
+0x234C 0x22FD9
+0x234D 0x22FD2
+0x234E 0x22FCA
+0x234F 0x22FD1
+0x2350 0x22FD4
+0x2351 0x22FF9
+0x2352 0x22FD0
+0x2353 0x2305E
+0x2354 0x2305D
+0x2355 0x2308A
+0x2356 0x23114
+0x2357 0x23283
+0x2358 0x23284
+0x2359 0x2329B
+0x235A 0x23282
+0x235B 0x2327D
+0x235C 0x2327C
+0x235D 0x23299
+0x235E 0x2327E
+0x235F 0x2329A
+0x2360 0x23295
+0x2361 0x2327B
+0x2362 0x23286
+0x2363 0x23348
+0x2364 0x23392
+0x2365 0x235B2
+0x2366 0x23642
+0x2367 0x23672
+0x2368 0x23615
+0x2369 0x23630
+0x236A 0x23643
+0x236B 0x2365B
+0x236C 0x2361D
+0x236D 0x23673
+0x236E 0x2362D
+0x2370 0x23621
+0x2371 0x2361C
+0x2372 0x2F8EA
+0x2373 0x23629
+0x2374 0x2361E
+0x2375 0x23633
+0x2376 0x23910
+0x2377 0x2390E
+0x2378 0x2F8F1
+0x2379 0x2390D
+0x237A 0x23911
+0x237B 0x23912
+0x237C 0x23917
+0x237D 0x23909
+0x237E 0x2390F
+0x2421 0x23998
+0x2422 0x23994
+0x2423 0x23996
+0x2424 0x23999
+0x2425 0x23995
+0x2426 0x23997
+0x2427 0x23A50
+0x2428 0x23A52
+0x2429 0x23A4D
+0x242A 0x23A57
+0x242B 0x23A53
+0x242C 0x23A56
+0x242D 0x23AB8
+0x242E 0x23B12
+0x242F 0x23BF1
+0x2430 0x23BF0
+0x2431 0x23BEE
+0x2432 0x23BEF
+0x2433 0x23BE5
+0x2434 0x23BEB
+0x2435 0x23BE7
+0x2436 0x23BF2
+0x2437 0x23BE6
+0x2438 0x23BF7
+0x2439 0x23C09
+0x243A 0x23C6B
+0x243B 0x23C6A
+0x243C 0x23E79
+0x243D 0x23ECD
+0x243E 0x23EEF
+0x243F 0x23EE4
+0x2440 0x23EE3
+0x2441 0x23F6C
+0x2442 0x23F67
+0x2443 0x23F62
+0x2444 0x23F58
+0x2445 0x23F69
+0x2446 0x23FAB
+0x2447 0x23F57
+0x2448 0x23FAD
+0x2449 0x23F54
+0x244A 0x23FAE
+0x244B 0x23F76
+0x244C 0x23F49
+0x244D 0x23F45
+0x244E 0x23F4F
+0x244F 0x2F90F
+0x2450 0x23F50
+0x2451 0x23F7D
+0x2452 0x23F44
+0x2453 0x23F66
+0x2454 0x23F48
+0x2455 0x23FA3
+0x2456 0x23F51
+0x2457 0x23F53
+0x2458 0x2F910
+0x2459 0x23F60
+0x245A 0x23F47
+0x245B 0x23F5E
+0x245C 0x23F85
+0x245D 0x23FAC
+0x245E 0x23F6D
+0x245F 0x23F75
+0x2460 0x23FA8
+0x2462 0x23F43
+0x2463 0x23F4E
+0x2464 0x23F5C
+0x2465 0x23F56
+0x2466 0x23F6E
+0x2467 0x23F63
+0x2468 0x23F6A
+0x2469 0x24356
+0x246A 0x24312
+0x246B 0x2435C
+0x246C 0x24358
+0x246D 0x24355
+0x246E 0x2437E
+0x246F 0x243A8
+0x2470 0x24311
+0x2471 0x24359
+0x2472 0x2435A
+0x2473 0x24367
+0x2474 0x24354
+0x2475 0x2435B
+0x2476 0x243F0
+0x2477 0x24529
+0x2478 0x2452C
+0x2479 0x2452A
+0x247A 0x24527
+0x247B 0x24567
+0x247C 0x24568
+0x247D 0x24593
+0x247E 0x24595
+0x2521 0x2459A
+0x2522 0x245EE
+0x2523 0x245F1
+0x2524 0x245ED
+0x2525 0x245E9
+0x2526 0x246CB
+0x2527 0x246DF
+0x2528 0x246DB
+0x2529 0x2483C
+0x252A 0x2484E
+0x252B 0x2486C
+0x252C 0x2487B
+0x252D 0x2487C
+0x252E 0x24883
+0x252F 0x2486B
+0x2530 0x24866
+0x2531 0x24863
+0x2532 0x248A0
+0x2533 0x24885
+0x2534 0x24868
+0x2535 0x248A2
+0x2536 0x249EC
+0x2538 0x249E7
+0x2539 0x24A10
+0x253A 0x24A18
+0x253B 0x24A3A
+0x253C 0x24A1A
+0x253D 0x24A38
+0x253E 0x24A41
+0x253F 0x24A1B
+0x2540 0x24A14
+0x2541 0x24A1C
+0x2542 0x24A1D
+0x2543 0x24B12
+0x2544 0x24B0D
+0x2545 0x24B07
+0x2546 0x24B7E
+0x2547 0x24B7F
+0x2548 0x20AB9
+0x2549 0x24B80
+0x254A 0x24B7A
+0x254B 0x24BF3
+0x254C 0x24CB9
+0x254D 0x24CBB
+0x254E 0x24CBA
+0x254F 0x24CBD
+0x2550 0x24CB7
+0x2551 0x24CBF
+0x2552 0x24D21
+0x2553 0x24E3A
+0x2554 0x24E3D
+0x2555 0x24E36
+0x2556 0x24E49
+0x2557 0x24E81
+0x2559 0x24E3F
+0x255A 0x24E4D
+0x255B 0x24E3E
+0x255D 0x24E30
+0x255E 0x24E4F
+0x255F 0x24F37
+0x2560 0x24F98
+0x2561 0x24F99
+0x2562 0x25011
+0x2563 0x2500D
+0x2564 0x25088
+0x2565 0x2508A
+0x2566 0x2521C
+0x2567 0x25255
+0x2568 0x25256
+0x2569 0x25262
+0x256A 0x25257
+0x256B 0x25242
+0x256C 0x25210
+0x256D 0x2524D
+0x256E 0x2525A
+0x256F 0x25266
+0x2570 0x25246
+0x2571 0x2287E
+0x2572 0x2524F
+0x2573 0x262F9
+0x2574 0x25387
+0x2575 0x25384
+0x2576 0x253F4
+0x2577 0x253F5
+0x2578 0x253F2
+0x2579 0x253F7
+0x257A 0x25545
+0x257B 0x2F950
+0x257C 0x25549
+0x257D 0x25535
+0x257E 0x254FD
+0x2621 0x25530
+0x2622 0x25543
+0x2623 0x25546
+0x2625 0x25533
+0x2626 0x256C6
+0x2627 0x2F956
+0x2628 0x256D4
+0x2629 0x271D8
+0x262A 0x256E0
+0x262B 0x20FA7
+0x262C 0x25744
+0x262D 0x20398
+0x262E 0x25854
+0x262F 0x2583E
+0x2630 0x25835
+0x2631 0x2583A
+0x2633 0x25834
+0x2634 0x25839
+0x2635 0x25846
+0x2636 0x2585A
+0x2637 0x2585B
+0x2638 0x2583C
+0x2639 0x259DC
+0x263A 0x259D6
+0x263B 0x259D0
+0x263C 0x2F95E
+0x263D 0x25AAC
+0x263E 0x2F95D
+0x263F 0x25AA5
+0x2640 0x25BF4
+0x2641 0x25C24
+0x2642 0x25BE0
+0x2643 0x25BFD
+0x2644 0x25BF2
+0x2645 0x25BFC
+0x2646 0x25C02
+0x2647 0x25BF1
+0x2648 0x25BFF
+0x2649 0x25BD2
+0x264A 0x25BD8
+0x264B 0x25BD3
+0x264C 0x25BF9
+0x264D 0x2F963
+0x264E 0x25BED
+0x264F 0x25BF7
+0x2650 0x25BF0
+0x2651 0x25BD7
+0x2652 0x25C09
+0x2653 0x25BF5
+0x2654 0x25EC2
+0x2655 0x25EC5
+0x2656 0x25ECF
+0x2658 0x25EC1
+0x2659 0x25EC6
+0x265A 0x25ED4
+0x265B 0x25ECE
+0x265C 0x2609B
+0x265D 0x26099
+0x265E 0x2608F
+0x265F 0x260B7
+0x2660 0x26082
+0x2661 0x26093
+0x2662 0x260B4
+0x2663 0x260C1
+0x2664 0x26090
+0x2665 0x2609A
+0x2666 0x26094
+0x2667 0x2609C
+0x2668 0x260B5
+0x2669 0x2F96F
+0x266A 0x2F96E
+0x266B 0x2609F
+0x266C 0x2608E
+0x266D 0x2609E
+0x266E 0x2623C
+0x266F 0x26247
+0x2670 0x26241
+0x2671 0x262EB
+0x2672 0x262EC
+0x2673 0x262ED
+0x2674 0x262EE
+0x2675 0x262DF
+0x2676 0x262F2
+0x2677 0x2630D
+0x2678 0x2630E
+0x2679 0x20186
+0x267A 0x263A9
+0x267B 0x263A4
+0x267C 0x263A5
+0x267D 0x2645F
+0x267E 0x2645A
+0x2721 0x26466
+0x2722 0x26468
+0x2723 0x2646A
+0x2724 0x26464
+0x2725 0x26465
+0x2726 0x264C1
+0x2727 0x264D8
+0x2728 0x2F97B
+0x2729 0x264D9
+0x272A 0x26509
+0x272B 0x265AA
+0x272C 0x265A3
+0x272D 0x265B9
+0x272E 0x259E2
+0x272F 0x265A5
+0x2730 0x265AB
+0x2731 0x26620
+0x2732 0x26789
+0x2733 0x2678B
+0x2734 0x267DB
+0x2735 0x267E4
+0x2736 0x267EF
+0x2737 0x267E2
+0x2738 0x267E9
+0x2739 0x267F0
+0x273A 0x267F3
+0x273B 0x267DD
+0x273C 0x2681E
+0x273D 0x2691D
+0x273E 0x26946
+0x273F 0x2697C
+0x2740 0x26980
+0x2741 0x26981
+0x2742 0x26982
+0x2743 0x26987
+0x2744 0x26988
+0x2745 0x2698A
+0x2746 0x2698C
+0x2747 0x269E7
+0x2748 0x269EB
+0x2749 0x269EA
+0x274A 0x26A68
+0x274B 0x26A6B
+0x274C 0x26A69
+0x274D 0x26A66
+0x274E 0x26A6A
+0x274F 0x26A65
+0x2750 0x26AE5
+0x2751 0x26AE4
+0x2752 0x26AE6
+0x2753 0x26D18
+0x2754 0x26E24
+0x2755 0x26E48
+0x2756 0x26E2F
+0x2757 0x26E7E
+0x2758 0x26D89
+0x2759 0x26E1E
+0x275A 0x26E49
+0x275B 0x26E26
+0x275C 0x26E09
+0x275D 0x26E34
+0x275E 0x26E2D
+0x275F 0x26E4A
+0x2760 0x26E15
+0x2761 0x2F9A9
+0x2762 0x26E33
+0x2763 0x26E28
+0x2764 0x26E27
+0x2765 0x26E20
+0x2766 0x26E2B
+0x2767 0x26E29
+0x2768 0x26E6A
+0x2769 0x26E0B
+0x276A 0x26E0E
+0x276B 0x26E1C
+0x276C 0x26DFF
+0x276D 0x2F9AA
+0x276E 0x26E35
+0x276F 0x26E11
+0x2770 0x26E4B
+0x2771 0x26E4C
+0x2772 0x26E1F
+0x2773 0x26E0F
+0x2774 0x26E39
+0x2775 0x26E68
+0x2776 0x26E1D
+0x2777 0x26E08
+0x2778 0x26E0C
+0x2779 0x26E0D
+0x277A 0x26E62
+0x277B 0x26EAF
+0x277C 0x26E32
+0x277D 0x26E2C
+0x277E 0x26E64
+0x2821 0x26E04
+0x2822 0x26E16
+0x2823 0x26E4D
+0x2824 0x26E07
+0x2825 0x26EAE
+0x2826 0x271D4
+0x2827 0x271D1
+0x2828 0x271D5
+0x2829 0x271D0
+0x282A 0x27371
+0x282B 0x2735D
+0x282C 0x2735B
+0x282D 0x2737A
+0x282E 0x2F9BD
+0x282F 0x2737F
+0x2830 0x27379
+0x2831 0x27367
+0x2832 0x2739E
+0x2833 0x27394
+0x2834 0x27364
+0x2835 0x2735E
+0x2836 0x27381
+0x2837 0x2735A
+0x2838 0x27357
+0x2839 0x2737C
+0x283A 0x27398
+0x283B 0x27366
+0x283C 0x2737E
+0x283D 0x27382
+0x283E 0x27368
+0x283F 0x2735F
+0x2840 0x27363
+0x2841 0x27397
+0x2843 0x27353
+0x2844 0x2737B
+0x2845 0x2737D
+0x2846 0x27378
+0x2847 0x27406
+0x2848 0x275C0
+0x2849 0x275C2
+0x284A 0x275C3
+0x284B 0x276DC
+0x284C 0x276E6
+0x284D 0x276EC
+0x284E 0x276F2
+0x284F 0x276E8
+0x2850 0x276EB
+0x2851 0x276EA
+0x2852 0x276E5
+0x2853 0x276E0
+0x2854 0x276D0
+0x2855 0x276D8
+0x2856 0x276D5
+0x2857 0x276D3
+0x2858 0x276E4
+0x2859 0x276F3
+0x285A 0x276DB
+0x285B 0x2772F
+0x285C 0x277F9
+0x285D 0x2785D
+0x285E 0x2785B
+0x285F 0x2784C
+0x2860 0x27858
+0x2861 0x27860
+0x2862 0x27853
+0x2863 0x27850
+0x2864 0x27907
+0x2865 0x27908
+0x2866 0x278F4
+0x2867 0x278F6
+0x2868 0x27904
+0x2869 0x278FD
+0x286A 0x27905
+0x286B 0x27A28
+0x286C 0x27A56
+0x286D 0x27A42
+0x286E 0x27A5C
+0x286F 0x27A3D
+0x2870 0x27A2F
+0x2871 0x27A2B
+0x2872 0x27A58
+0x2873 0x27A61
+0x2874 0x27A2C
+0x2875 0x27A51
+0x2876 0x27A50
+0x2877 0x27A3C
+0x2878 0x27A36
+0x287A 0x27A60
+0x287B 0x27A5B
+0x287C 0x27A2E
+0x287D 0x27A40
+0x287E 0x27A5F
+0x2921 0x27A26
+0x2922 0x27A2D
+0x2923 0x27A5E
+0x2924 0x27A3B
+0x2925 0x27BEF
+0x2926 0x27BF3
+0x2927 0x27BEE
+0x2928 0x27BED
+0x2929 0x27C5A
+0x292A 0x27C62
+0x292B 0x27C5B
+0x292C 0x27C5F
+0x292D 0x27C5E
+0x292E 0x27C64
+0x292F 0x27CE0
+0x2930 0x27CE1
+0x2931 0x27CE5
+0x2932 0x27DA5
+0x2933 0x27D9B
+0x2934 0x27D9F
+0x2935 0x27D9C
+0x2937 0x27DAA
+0x2938 0x27DA4
+0x2939 0x27DA3
+0x293A 0x27E67
+0x293B 0x27F26
+0x293C 0x27F1A
+0x293E 0x27F1C
+0x293F 0x27F15
+0x2940 0x27F1B
+0x2941 0x27F18
+0x2942 0x27F1E
+0x2943 0x27F25
+0x2944 0x2F9DC
+0x2945 0x2807B
+0x2946 0x28075
+0x2947 0x28093
+0x2948 0x2808F
+0x2949 0x2807C
+0x294A 0x2809B
+0x294B 0x28088
+0x294C 0x28091
+0x294D 0x2807E
+0x294F 0x28086
+0x2950 0x2825B
+0x2951 0x28254
+0x2952 0x28335
+0x2953 0x28340
+0x2954 0x28337
+0x2955 0x28329
+0x2956 0x28326
+0x2957 0x28323
+0x2958 0x28330
+0x2959 0x28320
+0x295A 0x28328
+0x295B 0x28332
+0x295C 0x2832A
+0x295D 0x28331
+0x295E 0x28324
+0x295F 0x28341
+0x2960 0x28342
+0x2961 0x28343
+0x2962 0x28325
+0x2963 0x28338
+0x2964 0x2841C
+0x2965 0x2841D
+0x2966 0x2841E
+0x2967 0x284F6
+0x2968 0x285A5
+0x2969 0x28589
+0x296A 0x2859D
+0x296B 0x2858A
+0x296C 0x28587
+0x296D 0x285AB
+0x296E 0x28586
+0x296F 0x2859E
+0x2970 0x28593
+0x2971 0x285A1
+0x2972 0x28588
+0x2973 0x285A3
+0x2974 0x2859F
+0x2975 0x285A0
+0x2976 0x286FF
+0x2977 0x28700
+0x2978 0x28702
+0x2979 0x286F8
+0x297A 0x286F7
+0x297B 0x28701
+0x297C 0x28787
+0x297D 0x28789
+0x297E 0x28776
+0x2A21 0x2876E
+0x2A22 0x28777
+0x2A23 0x28782
+0x2A24 0x28785
+0x2A25 0x28783
+0x2A26 0x28784
+0x2A27 0x28857
+0x2A28 0x2884B
+0x2A29 0x28856
+0x2A2A 0x2885D
+0x2A2B 0x28860
+0x2A2C 0x2884D
+0x2A2D 0x28855
+0x2A2E 0x28854
+0x2A2F 0x28853
+0x2A30 0x28850
+0x2A31 0x28863
+0x2A32 0x28862
+0x2A33 0x28917
+0x2A34 0x28916
+0x2A35 0x2892D
+0x2A36 0x289D9
+0x2A37 0x289BF
+0x2A39 0x289B2
+0x2A3A 0x289AC
+0x2A3B 0x289B0
+0x2A3C 0x289CF
+0x2A3D 0x289B8
+0x2A3F 0x289D3
+0x2A40 0x289B1
+0x2A41 0x289AF
+0x2A42 0x289CE
+0x2A43 0x289B4
+0x2A44 0x289B7
+0x2A45 0x289D5
+0x2A47 0x28D38
+0x2A48 0x28D28
+0x2A49 0x28D3F
+0x2A4A 0x28D40
+0x2A4B 0x28D41
+0x2A4C 0x28D33
+0x2A4D 0x28D2B
+0x2A4E 0x28D2E
+0x2A4F 0x28F11
+0x2A50 0x28F18
+0x2A51 0x28F17
+0x2A52 0x28F19
+0x2A53 0x28F16
+0x2A55 0x28F0D
+0x2A56 0x28F26
+0x2A57 0x28F79
+0x2A58 0x28FD8
+0x2A59 0x28FF3
+0x2A5A 0x28FD7
+0x2A5B 0x28FCC
+0x2A5C 0x28FCF
+0x2A5D 0x28FCB
+0x2A5E 0x28FD1
+0x2A5F 0x28FCE
+0x2A60 0x28FD4
+0x2A61 0x28FD5
+0x2A62 0x28FD3
+0x2A63 0x28FD6
+0x2A64 0x28FCD
+0x2A65 0x28FDA
+0x2A66 0x28FD2
+0x2A67 0x28FDE
+0x2A68 0x290CC
+0x2A69 0x290B8
+0x2A6A 0x290B7
+0x2A6B 0x290C2
+0x2A6C 0x290C3
+0x2A6D 0x291FA
+0x2A6E 0x291F9
+0x2A6F 0x2921F
+0x2A70 0x2921D
+0x2A71 0x24382
+0x2A72 0x292A6
+0x2A73 0x29290
+0x2A74 0x2929E
+0x2A75 0x29298
+0x2A76 0x29293
+0x2A77 0x29292
+0x2A78 0x292A5
+0x2A79 0x29295
+0x2A7A 0x293A9
+0x2A7B 0x293A8
+0x2A7C 0x293AA
+0x2A7D 0x293AB
+0x2A7E 0x293AC
+0x2B21 0x2941F
+0x2B22 0x29422
+0x2B23 0x294AA
+0x2B24 0x29496
+0x2B25 0x29491
+0x2B26 0x294AB
+0x2B27 0x294A2
+0x2B28 0x294A4
+0x2B29 0x2949D
+0x2B2A 0x29497
+0x2B2B 0x2947D
+0x2B2C 0x2949F
+0x2B2D 0x2949C
+0x2B2E 0x29499
+0x2B2F 0x294A6
+0x2B30 0x29492
+0x2B31 0x294A7
+0x2B32 0x295C9
+0x2B33 0x295C8
+0x2B34 0x295C7
+0x2B35 0x295CB
+0x2B36 0x29674
+0x2B37 0x296C9
+0x2B39 0x296D2
+0x2B3A 0x296DB
+0x2B3B 0x296EB
+0x2B3C 0x296E9
+0x2B3D 0x296EF
+0x2B3E 0x296EE
+0x2B3F 0x296F9
+0x2B40 0x296DE
+0x2B41 0x29816
+0x2B42 0x29845
+0x2B43 0x2987F
+0x2B44 0x29898
+0x2B45 0x2989F
+0x2B46 0x29886
+0x2B47 0x29890
+0x2B48 0x2989A
+0x2B49 0x2989D
+0x2B4A 0x2988D
+0x2B4B 0x2989C
+0x2B4C 0x298A0
+0x2B4D 0x298A7
+0x2B4E 0x2988F
+0x2B4F 0x29A41
+0x2B50 0x29A35
+0x2B51 0x29A37
+0x2B52 0x29A30
+0x2B53 0x29A3A
+0x2B54 0x29A36
+0x2B55 0x2FA08
+0x2B56 0x29ACA
+0x2B57 0x29B12
+0x2B58 0x29B15
+0x2B59 0x29B22
+0x2B5A 0x29B13
+0x2B5B 0x29B18
+0x2B5C 0x29B21
+0x2B5D 0x29C10
+0x2B5E 0x29C20
+0x2B5F 0x29C2F
+0x2B60 0x29CA5
+0x2B61 0x29CA3
+0x2B62 0x29CB6
+0x2B63 0x29CAB
+0x2B64 0x29D68
+0x2B65 0x29D67
+0x2B66 0x29D6F
+0x2B67 0x29D77
+0x2B68 0x29D64
+0x2B69 0x29D78
+0x2B6B 0x29D76
+0x2B6C 0x29D6E
+0x2B6E 0x29FD0
+0x2B6F 0x29FB3
+0x2B70 0x29FCB
+0x2B71 0x29FD6
+0x2B72 0x29FB1
+0x2B73 0x29FB4
+0x2B74 0x29FD7
+0x2B75 0x29FC6
+0x2B76 0x29FBA
+0x2B77 0x29FD1
+0x2B78 0x29FD2
+0x2B79 0x29FB5
+0x2B7A 0x29FC4
+0x2B7B 0x29FCC
+0x2B7C 0x29FBB
+0x2B7D 0x29FB2
+0x2B7E 0x2A25B
+0x2C21 0x2A25A
+0x2C22 0x2A259
+0x2C23 0x2A299
+0x2C24 0x2A294
+0x2C25 0x2A296
+0x2C26 0x2A293
+0x2C27 0x2A291
+0x2C28 0x2A28F
+0x2C29 0x2A298
+0x2C2A 0x2A30C
+0x2C2B 0x2A30A
+0x2C2C 0x2A30E
+0x2C2D 0x2A312
+0x2C2E 0x2A311
+0x2C2F 0x2A30B
+0x2C30 0x2A39A
+0x2C32 0x2A3B4
+0x2C34 0x2A41C
+0x2C35 0x2A420
+0x2C36 0x2A421
+0x2C37 0x2A4D3
+0x2C38 0x2A4D2
+0x2C39 0x2A538
+0x2C3B 0x24CCF
+0x2C3C 0x2011D
+0x2C3D 0x20192
+0x2C3E 0x2018F
+0x2C3F 0x2018C
+0x2C40 0x203EA
+0x2C41 0x204B9
+0x2C42 0x2056E
+0x2C43 0x205A0
+0x2C44 0x291DD
+0x2C45 0x20612
+0x2C46 0x20617
+0x2C47 0x2066D
+0x2C48 0x20805
+0x2C49 0x207FB
+0x2C4A 0x207FD
+0x2C4B 0x20806
+0x2C4C 0x20800
+0x2C4D 0x207FF
+0x2C4E 0x207FE
+0x2C4F 0x208B6
+0x2C50 0x20905
+0x2C51 0x20907
+0x2C52 0x20ABC
+0x2C53 0x20ABB
+0x2C54 0x20B8B
+0x2C55 0x20B87
+0x2C56 0x27BFB
+0x2C57 0x20FE7
+0x2C58 0x20FE6
+0x2C59 0x20FE2
+0x2C5A 0x285D3
+0x2C5B 0x20FD9
+0x2C5C 0x20FCA
+0x2C5D 0x21012
+0x2C5E 0x21010
+0x2C5F 0x20FDC
+0x2C60 0x20FD0
+0x2C61 0x20F8B
+0x2C62 0x21013
+0x2C63 0x22A10
+0x2C64 0x20FDA
+0x2C65 0x2F84F
+0x2C66 0x20FFD
+0x2C67 0x20FE5
+0x2C68 0x20FCC
+0x2C69 0x21039
+0x2C6A 0x20FC7
+0x2C6B 0x20FD8
+0x2C6C 0x21460
+0x2C6D 0x21464
+0x2C6E 0x21486
+0x2C6F 0x2145E
+0x2C70 0x21466
+0x2C71 0x2145F
+0x2C72 0x21477
+0x2C73 0x21482
+0x2C74 0x21496
+0x2C75 0x2153E
+0x2C76 0x21579
+0x2C77 0x2157A
+0x2C78 0x21688
+0x2C79 0x21689
+0x2C7A 0x2168C
+0x2C7B 0x243E0
+0x2C7C 0x2167B
+0x2C7D 0x21686
+0x2C7E 0x21894
+0x2D21 0x21897
+0x2D22 0x218B7
+0x2D23 0x218B5
+0x2D24 0x218B8
+0x2D25 0x21893
+0x2D26 0x218B2
+0x2D27 0x218B4
+0x2D28 0x21899
+0x2D29 0x218C3
+0x2D2A 0x2189D
+0x2D2B 0x2189B
+0x2D2C 0x218A3
+0x2D2E 0x2199F
+0x2D2F 0x2199E
+0x2D30 0x219A3
+0x2D31 0x219A0
+0x2D32 0x219A1
+0x2D33 0x21AC5
+0x2D34 0x21AC6
+0x2D35 0x21ABE
+0x2D36 0x21AC4
+0x2D37 0x21ABF
+0x2D38 0x21B4C
+0x2D39 0x21B4A
+0x2D3A 0x21BB1
+0x2D3B 0x21C15
+0x2D3C 0x21C17
+0x2D3D 0x21C10
+0x2D3E 0x21C18
+0x2D3F 0x21CE0
+0x2D40 0x21CDF
+0x2D41 0x21D27
+0x2D42 0x21F43
+0x2D43 0x21F48
+0x2D44 0x21F1D
+0x2D45 0x21F50
+0x2D46 0x21F58
+0x2D47 0x21F47
+0x2D48 0x21F54
+0x2D49 0x21F53
+0x2D4A 0x21F40
+0x2D4B 0x21F55
+0x2D4D 0x21F5A
+0x2D4E 0x22470
+0x2D4F 0x2215B
+0x2D50 0x2214D
+0x2D51 0x22156
+0x2D52 0x2214F
+0x2D53 0x2F887
+0x2D54 0x22159
+0x2D55 0x2F888
+0x2D56 0x22154
+0x2D57 0x22153
+0x2D58 0x22150
+0x2D59 0x222B3
+0x2D5A 0x2236E
+0x2D5C 0x2236F
+0x2D5D 0x22393
+0x2D5E 0x22429
+0x2D5F 0x22425
+0x2D60 0x22428
+0x2D61 0x2246F
+0x2D62 0x232B8
+0x2D63 0x2F897
+0x2D64 0x224B3
+0x2D65 0x22579
+0x2D66 0x2257E
+0x2D67 0x2257C
+0x2D68 0x22583
+0x2D69 0x2F8AC
+0x2D6A 0x22800
+0x2D6B 0x22834
+0x2D6C 0x22865
+0x2D6D 0x22836
+0x2D6E 0x228A7
+0x2D6F 0x22859
+0x2D70 0x22858
+0x2D71 0x22831
+0x2D72 0x22862
+0x2D73 0x22838
+0x2D74 0x22873
+0x2D75 0x2283E
+0x2D76 0x22855
+0x2D77 0x22854
+0x2D78 0x22895
+0x2D79 0x2F8AD
+0x2D7A 0x228A5
+0x2D7B 0x22894
+0x2D7C 0x2289A
+0x2D7D 0x2289B
+0x2D7E 0x22899
+0x2E21 0x2289F
+0x2E22 0x22853
+0x2E23 0x22A12
+0x2E24 0x22A0A
+0x2E25 0x22A09
+0x2E26 0x22A0C
+0x2E27 0x22A0B
+0x2E28 0x22A0E
+0x2E29 0x22A0D
+0x2E2A 0x22A08
+0x2E2B 0x22D38
+0x2E2C 0x22D3A
+0x2E2D 0x22D37
+0x2E2E 0x22D3D
+0x2E2F 0x22D2D
+0x2E30 0x22D82
+0x2E31 0x22D95
+0x2E32 0x22D87
+0x2E33 0x22D9D
+0x2E34 0x22DB5
+0x2E35 0x22D81
+0x2E36 0x22DC7
+0x2E37 0x22D9B
+0x2E38 0x22D98
+0x2E39 0x22D94
+0x2E3A 0x22D86
+0x2E3B 0x22D90
+0x2E3C 0x22D34
+0x2E3D 0x22D8E
+0x2E3E 0x22D85
+0x2E3F 0x22DA6
+0x2E40 0x22D96
+0x2E41 0x22FEA
+0x2E42 0x22FDF
+0x2E43 0x232BD
+0x2E44 0x22FF7
+0x2E45 0x22FEB
+0x2E46 0x22FE0
+0x2E47 0x22FE8
+0x2E48 0x22FE1
+0x2E49 0x22FE9
+0x2E4A 0x22FEE
+0x2E4B 0x22FE5
+0x2E4C 0x22FEC
+0x2E4D 0x23063
+0x2E4E 0x230C6
+0x2E4F 0x230C2
+0x2E50 0x230C1
+0x2E51 0x230C0
+0x2E52 0x230C3
+0x2E53 0x23118
+0x2E54 0x232AE
+0x2E55 0x232A3
+0x2E56 0x232C5
+0x2E57 0x232A0
+0x2E58 0x232B4
+0x2E59 0x232A5
+0x2E5B 0x232A4
+0x2E5C 0x232A8
+0x2E5D 0x232A6
+0x2E5E 0x236A8
+0x2E5F 0x2368D
+0x2E60 0x23682
+0x2E61 0x2369E
+0x2E62 0x23689
+0x2E63 0x23683
+0x2E64 0x23691
+0x2E65 0x236A6
+0x2E66 0x2369A
+0x2E67 0x23690
+0x2E68 0x23685
+0x2E69 0x2367D
+0x2E6A 0x2F8EC
+0x2E6B 0x2369B
+0x2E6C 0x236A5
+0x2E6D 0x236F0
+0x2E6E 0x23696
+0x2E6F 0x23688
+0x2E70 0x236D6
+0x2E71 0x236D8
+0x2E72 0x23686
+0x2E73 0x236A4
+0x2E74 0x23697
+0x2E75 0x2391C
+0x2E76 0x23919
+0x2E77 0x2399E
+0x2E78 0x2399F
+0x2E79 0x2399D
+0x2E7A 0x2399C
+0x2E7B 0x23A5D
+0x2E7C 0x23A5E
+0x2E7D 0x23A73
+0x2E7E 0x23A63
+0x2F21 0x23ABE
+0x2F22 0x23AC1
+0x2F23 0x23ABC
+0x2F24 0x23ABF
+0x2F25 0x23ABB
+0x2F26 0x23ABD
+0x2F27 0x23B13
+0x2F28 0x23B14
+0x2F29 0x23BF8
+0x2F2A 0x23BFA
+0x2F2B 0x23C06
+0x2F2C 0x23BFE
+0x2F2D 0x23C51
+0x2F2E 0x2400B
+0x2F2F 0x23FF1
+0x2F30 0x23FA9
+0x2F31 0x23FD5
+0x2F32 0x23FDC
+0x2F33 0x23FCB
+0x2F34 0x23FF2
+0x2F35 0x2405F
+0x2F36 0x23FDB
+0x2F37 0x23FD6
+0x2F38 0x23FD9
+0x2F39 0x23FD1
+0x2F3A 0x23FCF
+0x2F3B 0x23FD8
+0x2F3C 0x23FE0
+0x2F3D 0x23FD4
+0x2F3E 0x23FF3
+0x2F3F 0x24005
+0x2F40 0x23FCE
+0x2F41 0x23FF4
+0x2F42 0x2F912
+0x2F43 0x23FDA
+0x2F44 0x2400E
+0x2F45 0x24006
+0x2F46 0x23FD7
+0x2F47 0x23FCD
+0x2F48 0x24007
+0x2F49 0x23FE1
+0x2F4A 0x24008
+0x2F4B 0x243BE
+0x2F4C 0x243EF
+0x2F4D 0x243D9
+0x2F4E 0x243DA
+0x2F50 0x243A0
+0x2F51 0x243DF
+0x2F52 0x2439E
+0x2F53 0x243BF
+0x2F54 0x243AF
+0x2F55 0x243A7
+0x2F56 0x243AA
+0x2F57 0x243F4
+0x2F58 0x243AE
+0x2F59 0x243B5
+0x2F5A 0x243B8
+0x2F5B 0x243DB
+0x2F5C 0x243C0
+0x2F5D 0x243B7
+0x2F5E 0x243A2
+0x2F5F 0x243DD
+0x2F60 0x243A1
+0x2F61 0x243A5
+0x2F62 0x243B4
+0x2F63 0x243A6
+0x2F64 0x243AB
+0x2F65 0x243AC
+0x2F66 0x2439F
+0x2F67 0x243B1
+0x2F68 0x243FC
+0x2F69 0x2452E
+0x2F6A 0x24530
+0x2F6B 0x24599
+0x2F6C 0x245F8
+0x2F6D 0x245F6
+0x2F6E 0x246F4
+0x2F6F 0x246EB
+0x2F70 0x246E1
+0x2F71 0x246E4
+0x2F72 0x24875
+0x2F73 0x24869
+0x2F75 0x24899
+0x2F76 0x2489E
+0x2F77 0x24894
+0x2F78 0x24893
+0x2F79 0x24891
+0x2F7A 0x24A19
+0x2F7B 0x24A17
+0x2F7C 0x24A49
+0x2F7D 0x24A47
+0x2F7E 0x24A48
+0x3021 0x24A52
+0x3022 0x24A40
+0x3023 0x24A63
+0x3024 0x24A46
+0x3025 0x24A5F
+0x3026 0x24B0E
+0x3027 0x24B85
+0x3028 0x24B87
+0x3029 0x24BCB
+0x302A 0x24BCC
+0x302B 0x24BC9
+0x302C 0x24CCB
+0x302D 0x21CE7
+0x302E 0x24D20
+0x302F 0x24E5F
+0x3030 0x24E60
+0x3031 0x24E6A
+0x3032 0x24E76
+0x3033 0x24E73
+0x3034 0x24E71
+0x3035 0x24E66
+0x3037 0x24E6B
+0x3038 0x24E79
+0x3039 0x24E7B
+0x303A 0x24F3C
+0x303B 0x24F9E
+0x303C 0x24F9C
+0x303D 0x2501C
+0x303E 0x2501E
+0x303F 0x25021
+0x3040 0x25096
+0x3041 0x250A1
+0x3042 0x250B6
+0x3043 0x250A0
+0x3044 0x25094
+0x3045 0x25097
+0x3046 0x25281
+0x3047 0x25286
+0x3048 0x252C0
+0x3049 0x2528A
+0x304A 0x2F94B
+0x304B 0x25285
+0x304C 0x25295
+0x304D 0x25249
+0x304E 0x25282
+0x304F 0x25284
+0x3050 0x22878
+0x3051 0x25290
+0x3052 0x252B1
+0x3053 0x253FE
+0x3054 0x253FB
+0x3055 0x25550
+0x3056 0x25556
+0x3057 0x2555A
+0x3058 0x2554C
+0x305A 0x25557
+0x305B 0x256E1
+0x305C 0x256D9
+0x305D 0x256DB
+0x305E 0x256F4
+0x305F 0x25745
+0x3060 0x25747
+0x3061 0x25874
+0x3062 0x2586B
+0x3063 0x25868
+0x3064 0x25869
+0x3065 0x25879
+0x3066 0x2F95B
+0x3067 0x25880
+0x3068 0x25881
+0x3069 0x25861
+0x306A 0x25870
+0x306B 0x2586F
+0x306C 0x25873
+0x306D 0x2585D
+0x306E 0x259FA
+0x3070 0x259F3
+0x3071 0x25A0A
+0x3072 0x25A17
+0x3073 0x2F95F
+0x3074 0x25AB0
+0x3075 0x25C3E
+0x3076 0x25C46
+0x3077 0x25C4F
+0x3078 0x25C44
+0x3079 0x25C69
+0x307A 0x25C33
+0x307B 0x25C2F
+0x307C 0x25C4E
+0x307D 0x25C3A
+0x307E 0x25C2B
+0x3121 0x25CA9
+0x3122 0x25C50
+0x3123 0x25C45
+0x3124 0x25C37
+0x3125 0x25C25
+0x3126 0x25C2C
+0x3127 0x25C3F
+0x3128 0x25C34
+0x3129 0x25C29
+0x312A 0x25C1E
+0x312B 0x25C3D
+0x312C 0x25EED
+0x312D 0x2F966
+0x312E 0x25EF3
+0x312F 0x25EEA
+0x3130 0x25EEB
+0x3131 0x260CC
+0x3132 0x260CE
+0x3133 0x260D0
+0x3134 0x260E3
+0x3135 0x260E0
+0x3136 0x260D1
+0x3137 0x260DC
+0x3138 0x260DD
+0x3139 0x260F0
+0x313A 0x260DB
+0x313B 0x260E5
+0x313C 0x260F1
+0x313D 0x260C9
+0x313E 0x260E8
+0x313F 0x260E7
+0x3140 0x260C8
+0x3141 0x260DE
+0x3142 0x260CD
+0x3143 0x260C5
+0x3144 0x260C6
+0x3145 0x260E4
+0x3146 0x260C3
+0x3147 0x262FB
+0x3148 0x262FC
+0x3149 0x262FE
+0x314A 0x26303
+0x314B 0x26300
+0x314C 0x262FD
+0x314D 0x26305
+0x314E 0x26313
+0x314F 0x263A7
+0x3150 0x263B4
+0x3151 0x26470
+0x3152 0x26474
+0x3153 0x26471
+0x3154 0x26475
+0x3155 0x2647D
+0x3156 0x26473
+0x3157 0x264C4
+0x3158 0x264C3
+0x3159 0x264DE
+0x315A 0x264DD
+0x315B 0x26511
+0x315C 0x2650F
+0x315D 0x26510
+0x315E 0x265C3
+0x315F 0x265C2
+0x3160 0x265CA
+0x3161 0x265C1
+0x3162 0x26623
+0x3163 0x267B1
+0x3164 0x26824
+0x3165 0x26811
+0x3166 0x26825
+0x3167 0x2680A
+0x3168 0x2681F
+0x3169 0x26820
+0x316A 0x26814
+0x316B 0x26828
+0x316C 0x26803
+0x316D 0x26812
+0x316E 0x2680B
+0x316F 0x26817
+0x3170 0x22A11
+0x3171 0x26949
+0x3172 0x26989
+0x3173 0x26990
+0x3174 0x2698F
+0x3175 0x26996
+0x3176 0x26995
+0x3177 0x26993
+0x3178 0x269ED
+0x3179 0x269F0
+0x317A 0x243DE
+0x317B 0x26A85
+0x317C 0x26A77
+0x317D 0x26A7A
+0x317E 0x26A84
+0x3221 0x26A79
+0x3222 0x26A7D
+0x3223 0x26A7B
+0x3224 0x26AED
+0x3225 0x26AEC
+0x3226 0x26DF6
+0x3227 0x26D9B
+0x3228 0x26E9D
+0x3229 0x26F11
+0x322A 0x26EC4
+0x322B 0x26EC8
+0x322C 0x26EDF
+0x322D 0x26EBF
+0x322E 0x26EB3
+0x322F 0x26EBA
+0x3230 0x26F10
+0x3231 0x26F06
+0x3232 0x26E88
+0x3233 0x26E9A
+0x3234 0x26EE0
+0x3235 0x26ECC
+0x3236 0x26EB5
+0x3237 0x26EE1
+0x3238 0x26EBC
+0x3239 0x26EC6
+0x323A 0x26F0B
+0x323B 0x26EA4
+0x323C 0x26E95
+0x323D 0x26EA3
+0x323E 0x26EE2
+0x323F 0x26ECD
+0x3240 0x26EE3
+0x3241 0x26EAB
+0x3242 0x26ECB
+0x3243 0x26E8F
+0x3244 0x2F9AB
+0x3245 0x26EA9
+0x3246 0x26F24
+0x3247 0x26EE4
+0x3248 0x26F12
+0x3249 0x26EE5
+0x324A 0x26F67
+0x324B 0x26EAA
+0x324C 0x26EA0
+0x324D 0x26EE6
+0x324E 0x26EC1
+0x324F 0x26EE7
+0x3250 0x26F0D
+0x3251 0x26E86
+0x3252 0x26EB0
+0x3253 0x26E8B
+0x3254 0x26EE8
+0x3255 0x26EC9
+0x3256 0x26F19
+0x3257 0x26EC0
+0x3258 0x26F0C
+0x3259 0x26EE9
+0x325A 0x26EEA
+0x325B 0x271ED
+0x325C 0x271E3
+0x325D 0x271E4
+0x325E 0x271E8
+0x325F 0x271D2
+0x3260 0x271E2
+0x3262 0x273CF
+0x3263 0x273D1
+0x3264 0x273C3
+0x3265 0x273C9
+0x3266 0x273EA
+0x3267 0x273B4
+0x3268 0x273DC
+0x3269 0x273BD
+0x326A 0x273E6
+0x326B 0x273C8
+0x326C 0x273EC
+0x326D 0x273B2
+0x326E 0x273A9
+0x326F 0x273D3
+0x3270 0x273C0
+0x3271 0x273E9
+0x3272 0x273D5
+0x3274 0x273C5
+0x3276 0x273CB
+0x3277 0x273D0
+0x3278 0x273D2
+0x3279 0x273E4
+0x327A 0x273E8
+0x327B 0x273CD
+0x327C 0x273B6
+0x327D 0x273AA
+0x327E 0x273D4
+0x3321 0x28449
+0x3322 0x273C1
+0x3323 0x273DD
+0x3324 0x273CE
+0x3325 0x275C9
+0x3326 0x275CA
+0x3327 0x276FD
+0x3328 0x276D9
+0x3329 0x276FF
+0x332A 0x27704
+0x332B 0x276FA
+0x332C 0x27706
+0x332D 0x27715
+0x332E 0x27711
+0x332F 0x27707
+0x3330 0x2770B
+0x3331 0x277FC
+0x3332 0x277FD
+0x3333 0x2786D
+0x3334 0x27865
+0x3335 0x27914
+0x3336 0x27913
+0x3337 0x2790C
+0x3338 0x2790B
+0x3339 0x27918
+0x333A 0x27922
+0x333B 0x27A7D
+0x333C 0x27A6F
+0x333D 0x27A75
+0x333E 0x27A7B
+0x333F 0x27A80
+0x3340 0x27A7F
+0x3341 0x27A96
+0x3342 0x27A6D
+0x3343 0x27A6B
+0x3344 0x27A86
+0x3345 0x27A73
+0x3346 0x27A62
+0x3347 0x27A77
+0x3348 0x27A81
+0x3349 0x27A69
+0x334A 0x27A82
+0x334B 0x27A97
+0x334C 0x27A84
+0x334E 0x27A78
+0x334F 0x2F9D0
+0x3350 0x27A7A
+0x3351 0x27A6A
+0x3352 0x27A65
+0x3353 0x27A7E
+0x3354 0x27A94
+0x3355 0x27BC2
+0x3356 0x27BC1
+0x3357 0x27BF9
+0x3358 0x27C71
+0x3359 0x27C6B
+0x335A 0x27C6D
+0x335B 0x27C6F
+0x335C 0x27C6E
+0x335D 0x27CF2
+0x335E 0x27CE8
+0x335F 0x27CEF
+0x3360 0x27CE9
+0x3361 0x27CEA
+0x3362 0x27CED
+0x3363 0x27CF3
+0x3364 0x27CE6
+0x3365 0x27DC9
+0x3366 0x27DB4
+0x3367 0x27DB3
+0x3368 0x27DB9
+0x3369 0x27DCA
+0x336A 0x27DB1
+0x336B 0x27DB6
+0x336C 0x27DC7
+0x336D 0x27DC4
+0x336E 0x27DB7
+0x336F 0x27E6F
+0x3370 0x27F33
+0x3371 0x27F32
+0x3372 0x27F1F
+0x3373 0x2F9D9
+0x3374 0x27F2B
+0x3375 0x27F30
+0x3376 0x27F36
+0x3377 0x27F42
+0x3378 0x27F41
+0x3379 0x2F9D8
+0x337A 0x280A5
+0x337B 0x280AB
+0x337C 0x280A9
+0x337D 0x280B3
+0x337E 0x280A7
+0x3421 0x280A0
+0x3422 0x280D2
+0x3423 0x280A8
+0x3424 0x280B6
+0x3425 0x280AC
+0x3426 0x280AE
+0x3427 0x280E6
+0x3428 0x28265
+0x3429 0x28347
+0x342A 0x28363
+0x342B 0x2834D
+0x342C 0x2835F
+0x342D 0x2834B
+0x342E 0x28360
+0x342F 0x28349
+0x3430 0x28353
+0x3431 0x2F9DF
+0x3433 0x28357
+0x3434 0x2834E
+0x3435 0x28352
+0x3436 0x28354
+0x3437 0x28420
+0x3438 0x28422
+0x3439 0x285C1
+0x343A 0x285D7
+0x343B 0x285D5
+0x343C 0x285C4
+0x343D 0x285D0
+0x343E 0x285BB
+0x343F 0x285E2
+0x3440 0x285CB
+0x3441 0x285B8
+0x3442 0x285BF
+0x3443 0x285D8
+0x3444 0x285C0
+0x3445 0x285BA
+0x3446 0x285B4
+0x3447 0x285BC
+0x3448 0x285D4
+0x3449 0x285ED
+0x344A 0x285C2
+0x344B 0x285D9
+0x344C 0x285CC
+0x344D 0x2872F
+0x344E 0x28723
+0x344F 0x28796
+0x3450 0x2878D
+0x3451 0x2879E
+0x3452 0x28799
+0x3453 0x28883
+0x3455 0x2886A
+0x3456 0x28869
+0x3457 0x28875
+0x3458 0x2886C
+0x3459 0x28880
+0x345A 0x2886E
+0x345B 0x28881
+0x345C 0x28877
+0x345D 0x28876
+0x345E 0x28873
+0x345F 0x28870
+0x3460 0x28884
+0x3461 0x28919
+0x3462 0x289F2
+0x3464 0x289EC
+0x3465 0x289EB
+0x3466 0x289F6
+0x3467 0x289EF
+0x3468 0x289F4
+0x3469 0x289EE
+0x346A 0x289F3
+0x346B 0x289ED
+0x346C 0x28C9B
+0x346D 0x28C98
+0x346E 0x28C94
+0x346F 0x2147A
+0x3470 0x28C9A
+0x3471 0x2F9F0
+0x3472 0x28D4C
+0x3474 0x28D57
+0x3475 0x28D51
+0x3476 0x28D62
+0x3477 0x28D52
+0x3478 0x28D5C
+0x3479 0x28D53
+0x347A 0x2F9EF
+0x347B 0x28E85
+0x347C 0x28F2D
+0x347D 0x28F3E
+0x347E 0x28F30
+0x3521 0x28F7D
+0x3522 0x28FE6
+0x3523 0x28FF6
+0x3524 0x28FE4
+0x3525 0x28FE9
+0x3526 0x28FEC
+0x3527 0x28FF2
+0x3528 0x28FE8
+0x3529 0x28FE3
+0x352A 0x28FEB
+0x352B 0x28FF0
+0x352C 0x28FEA
+0x352D 0x28FE7
+0x352E 0x28FFD
+0x352F 0x28FE5
+0x3530 0x28FEE
+0x3531 0x28FF5
+0x3532 0x28FF9
+0x3533 0x28FF1
+0x3534 0x28FF4
+0x3535 0x2F9F4
+0x3536 0x29011
+0x3537 0x290DE
+0x3538 0x290D8
+0x3539 0x290DD
+0x353A 0x290DB
+0x353B 0x290D3
+0x353C 0x290E1
+0x353D 0x291DE
+0x353E 0x291FC
+0x353F 0x29228
+0x3540 0x292B7
+0x3541 0x292B8
+0x3542 0x292C7
+0x3543 0x292B2
+0x3544 0x292A9
+0x3545 0x292B9
+0x3546 0x292BC
+0x3547 0x292B3
+0x3548 0x292D1
+0x3549 0x293B0
+0x354A 0x293B1
+0x354B 0x293B6
+0x354C 0x29404
+0x354D 0x2942C
+0x354E 0x294C1
+0x354F 0x2949E
+0x3550 0x294BA
+0x3552 0x294D1
+0x3553 0x294D3
+0x3554 0x294D4
+0x3555 0x294D5
+0x3556 0x294C5
+0x3557 0x294B6
+0x3558 0x294B2
+0x3559 0x294B5
+0x355A 0x294C3
+0x355B 0x294B9
+0x355C 0x294C6
+0x355D 0x295D6
+0x355E 0x295E0
+0x355F 0x295DB
+0x3560 0x295D7
+0x3561 0x295DD
+0x3562 0x29715
+0x3563 0x2970C
+0x3564 0x2970F
+0x3565 0x2970E
+0x3566 0x296FE
+0x3567 0x29704
+0x3568 0x2970B
+0x3569 0x29702
+0x356A 0x296FF
+0x356B 0x29708
+0x356C 0x29710
+0x356D 0x29717
+0x356E 0x29713
+0x356F 0x29706
+0x3570 0x29709
+0x3571 0x29824
+0x3572 0x29826
+0x3573 0x29825
+0x3574 0x29848
+0x3575 0x298B5
+0x3576 0x298D2
+0x3577 0x298D5
+0x3578 0x298C4
+0x3579 0x298AF
+0x357A 0x298AD
+0x357B 0x298C1
+0x357C 0x298C0
+0x357D 0x298CC
+0x357E 0x298CD
+0x3621 0x298C3
+0x3622 0x298C8
+0x3623 0x298C5
+0x3624 0x298BA
+0x3625 0x298D0
+0x3626 0x298C2
+0x3627 0x298CE
+0x3629 0x29A43
+0x362A 0x29A42
+0x362B 0x29A40
+0x362C 0x29A31
+0x362D 0x29ACF
+0x362E 0x29ACE
+0x362F 0x29B30
+0x3630 0x29B34
+0x3631 0x29B32
+0x3632 0x29B43
+0x3633 0x29B3C
+0x3634 0x29C11
+0x3635 0x29C35
+0x3636 0x29C34
+0x3637 0x29C37
+0x3638 0x29C31
+0x3639 0x29CBF
+0x363A 0x29CBC
+0x363B 0x29CC2
+0x363C 0x29CC9
+0x363D 0x29D83
+0x363E 0x29D8B
+0x363F 0x29DA0
+0x3640 0x29D8D
+0x3641 0x29D8C
+0x3642 0x29D9A
+0x3643 0x29D8A
+0x3644 0x29D91
+0x3645 0x29FF1
+0x3646 0x2A00F
+0x3647 0x2A001
+0x3648 0x2A007
+0x3649 0x2A00C
+0x364B 0x29FDC
+0x364C 0x29FEE
+0x364D 0x29FF7
+0x364E 0x29FF2
+0x364F 0x29FF8
+0x3650 0x29FEB
+0x3652 0x29FE6
+0x3653 0x29FED
+0x3654 0x29FE9
+0x3655 0x2A008
+0x3656 0x2A000
+0x3657 0x29FE5
+0x3658 0x29FFC
+0x3659 0x2A261
+0x365A 0x2A25E
+0x365B 0x2A25F
+0x365D 0x2A29B
+0x365E 0x2A316
+0x365F 0x2A315
+0x3660 0x2A320
+0x3661 0x2A314
+0x3662 0x2A31A
+0x3663 0x2A317
+0x3664 0x2A39C
+0x3666 0x2A3F1
+0x3668 0x2A3F0
+0x3669 0x2A428
+0x366A 0x2A424
+0x366B 0x2A42A
+0x366C 0x2A42B
+0x366D 0x2A4D5
+0x366E 0x2A504
+0x366F 0x2A505
+0x3670 0x2A591
+0x3671 0x2A592
+0x3672 0x2A6A6
+0x3673 0x20109
+0x3674 0x20422
+0x3675 0x2041A
+0x3676 0x2040E
+0x3677 0x2041B
+0x3678 0x20408
+0x3679 0x250B3
+0x367A 0x2F81C
+0x367B 0x2069D
+0x367C 0x20812
+0x367D 0x2081E
+0x367E 0x208BB
+0x3721 0x208BF
+0x3722 0x208BC
+0x3723 0x20908
+0x3724 0x20909
+0x3725 0x20963
+0x3726 0x209C8
+0x3727 0x23728
+0x3728 0x20B8E
+0x3729 0x20B8D
+0x372A 0x21043
+0x372B 0x2104D
+0x372C 0x2106D
+0x372D 0x21042
+0x372E 0x21052
+0x372F 0x21051
+0x3730 0x21069
+0x3731 0x21050
+0x3732 0x21056
+0x3733 0x2106C
+0x3734 0x21044
+0x3735 0x21045
+0x3736 0x2106B
+0x3738 0x21068
+0x3739 0x21057
+0x373A 0x2122E
+0x373B 0x21231
+0x373C 0x2122D
+0x373D 0x2148B
+0x373E 0x214B2
+0x373F 0x2148D
+0x3740 0x214A3
+0x3741 0x214A4
+0x3742 0x21490
+0x3743 0x21489
+0x3744 0x2148E
+0x3745 0x21492
+0x3746 0x2157B
+0x3747 0x21690
+0x3748 0x2168F
+0x3749 0x218E9
+0x374A 0x218CD
+0x374B 0x218C5
+0x374C 0x218D0
+0x374D 0x218C9
+0x374E 0x218D1
+0x374F 0x218C7
+0x3750 0x218D2
+0x3751 0x2185F
+0x3752 0x218E1
+0x3753 0x218CC
+0x3754 0x218C6
+0x3755 0x218E4
+0x3756 0x219A9
+0x3757 0x21AD3
+0x3758 0x21ADA
+0x3759 0x21AD2
+0x375A 0x21ADB
+0x375B 0x21B4D
+0x375C 0x21B4E
+0x375D 0x21C1C
+0x375E 0x21CE8
+0x375F 0x21F6C
+0x3760 0x21F5F
+0x3761 0x21F66
+0x3762 0x21F64
+0x3763 0x21F78
+0x3764 0x21F65
+0x3765 0x21F6D
+0x3766 0x21F61
+0x3767 0x21F7A
+0x3768 0x22007
+0x3769 0x22166
+0x376A 0x22168
+0x376B 0x22162
+0x376C 0x222D3
+0x376D 0x222D4
+0x376E 0x222D1
+0x376F 0x222DC
+0x3770 0x22373
+0x3771 0x22372
+0x3772 0x2242D
+0x3773 0x2242C
+0x3774 0x2242F
+0x3775 0x22472
+0x3776 0x224B4
+0x3777 0x22589
+0x3778 0x228CD
+0x3779 0x228A6
+0x377A 0x228A2
+0x377B 0x228A0
+0x377C 0x22846
+0x377D 0x228A1
+0x377E 0x26857
+0x3821 0x228A3
+0x3822 0x228B1
+0x3823 0x228DB
+0x3824 0x228F6
+0x3825 0x228DC
+0x3826 0x228D6
+0x3827 0x22A13
+0x3828 0x22D9C
+0x3829 0x22D97
+0x382A 0x22DD8
+0x382B 0x22DE4
+0x382C 0x22DD4
+0x382D 0x22DE5
+0x382E 0x22DDB
+0x382F 0x22DD0
+0x3830 0x22DDA
+0x3831 0x22DCC
+0x3832 0x22DDC
+0x3833 0x22DED
+0x3834 0x22DD3
+0x3835 0x22DD1
+0x3836 0x22DCE
+0x3837 0x22DD9
+0x3838 0x22DDD
+0x3839 0x2F8C6
+0x383A 0x22EE6
+0x383B 0x22EE5
+0x383C 0x22EE9
+0x383D 0x22FFF
+0x383E 0x22FFE
+0x383F 0x2300E
+0x3840 0x2308C
+0x3841 0x230CA
+0x3842 0x230CB
+0x3843 0x2311A
+0x3844 0x232D7
+0x3845 0x232CF
+0x3846 0x232D0
+0x3847 0x232C9
+0x3848 0x232CC
+0x3849 0x232D3
+0x384A 0x233A4
+0x384B 0x233A3
+0x384C 0x23681
+0x384D 0x23726
+0x384E 0x236F3
+0x384F 0x23727
+0x3850 0x236F2
+0x3851 0x236FF
+0x3852 0x236F5
+0x3853 0x236FC
+0x3854 0x2370E
+0x3856 0x236F6
+0x3857 0x23700
+0x3858 0x23723
+0x3859 0x23705
+0x385A 0x23725
+0x385B 0x23708
+0x385C 0x23750
+0x385D 0x23925
+0x385E 0x23920
+0x385F 0x23923
+0x3860 0x23921
+0x3861 0x239A1
+0x3862 0x23A69
+0x3863 0x23A6C
+0x3864 0x23A68
+0x3865 0x23A6B
+0x3866 0x23ACC
+0x3867 0x23ACD
+0x3868 0x23C10
+0x3869 0x23C0D
+0x386A 0x23C0A
+0x386B 0x23C16
+0x386C 0x23C14
+0x386D 0x23C52
+0x386E 0x24028
+0x386F 0x2402E
+0x3870 0x2402C
+0x3871 0x2404D
+0x3872 0x24049
+0x3873 0x24031
+0x3874 0x24030
+0x3875 0x24033
+0x3876 0x2402D
+0x3877 0x24036
+0x3878 0x2403E
+0x3879 0x2402F
+0x387A 0x24027
+0x387B 0x24034
+0x387C 0x2404C
+0x387D 0x243FE
+0x387E 0x24412
+0x3921 0x2441F
+0x3922 0x24417
+0x3923 0x243F5
+0x3924 0x24415
+0x3925 0x243F7
+0x3927 0x21F7D
+0x3928 0x243FA
+0x3929 0x243F9
+0x392A 0x2444B
+0x392B 0x2459C
+0x392C 0x2459D
+0x392E 0x246F0
+0x392F 0x246F6
+0x3930 0x246EF
+0x3931 0x2489D
+0x3932 0x2489A
+0x3933 0x248A7
+0x3934 0x248AF
+0x3935 0x248AA
+0x3936 0x24A64
+0x3937 0x24A86
+0x3938 0x24A75
+0x3939 0x24A70
+0x393A 0x24A84
+0x393B 0x24A6B
+0x393C 0x24A85
+0x393D 0x24A6C
+0x393E 0x24B17
+0x393F 0x24B94
+0x3940 0x24B93
+0x3941 0x24CD2
+0x3942 0x24CD7
+0x3943 0x24CD4
+0x3944 0x24EA6
+0x3945 0x24EA7
+0x3946 0x24E9C
+0x3947 0x24E8B
+0x3948 0x24E8D
+0x3949 0x24E98
+0x394A 0x24EB9
+0x394B 0x24E9B
+0x394C 0x24E9D
+0x394D 0x24E99
+0x394E 0x24EA8
+0x394F 0x24E91
+0x3950 0x24E87
+0x3951 0x24E9A
+0x3952 0x24FA6
+0x3953 0x2501F
+0x3954 0x250A7
+0x3955 0x250B1
+0x3956 0x250B2
+0x3957 0x250B7
+0x3958 0x252D0
+0x3959 0x252B3
+0x395A 0x252B5
+0x395B 0x252C4
+0x395C 0x252C3
+0x395D 0x252BC
+0x395E 0x252B2
+0x395F 0x252BA
+0x3960 0x252BB
+0x3961 0x252C2
+0x3962 0x252CD
+0x3963 0x252BE
+0x3964 0x252B7
+0x3965 0x2538F
+0x3966 0x25403
+0x3967 0x25404
+0x3968 0x25571
+0x3969 0x25577
+0x396A 0x25574
+0x396B 0x2558B
+0x396C 0x2557A
+0x396D 0x2F951
+0x396E 0x2558C
+0x396F 0x25573
+0x3970 0x256FF
+0x3971 0x256FB
+0x3972 0x256FD
+0x3973 0x256F0
+0x3974 0x256F3
+0x3975 0x256FC
+0x3976 0x256F2
+0x3977 0x25892
+0x3978 0x2589E
+0x3979 0x258AE
+0x397A 0x25896
+0x397B 0x25A14
+0x397C 0x25A12
+0x397D 0x25A13
+0x397E 0x25A16
+0x3A21 0x25A0F
+0x3A22 0x25AB6
+0x3A23 0x25ABD
+0x3A24 0x25C8C
+0x3A25 0x25CAE
+0x3A26 0x25CAC
+0x3A27 0x25CAB
+0x3A28 0x25C99
+0x3A29 0x25C92
+0x3A2A 0x25CBB
+0x3A2B 0x25C9E
+0x3A2C 0x25C7E
+0x3A2D 0x25CAF
+0x3A2E 0x25CBC
+0x3A2F 0x25C98
+0x3A30 0x25F01
+0x3A31 0x25F09
+0x3A32 0x25F06
+0x3A33 0x2F967
+0x3A34 0x25F07
+0x3A35 0x25F08
+0x3A36 0x260CF
+0x3A37 0x2610E
+0x3A38 0x26132
+0x3A3A 0x26112
+0x3A3B 0x26116
+0x3A3C 0x26117
+0x3A3D 0x2611B
+0x3A3E 0x26115
+0x3A3F 0x26131
+0x3A40 0x26118
+0x3A41 0x2611A
+0x3A42 0x26110
+0x3A43 0x2610A
+0x3A44 0x26109
+0x3A45 0x2624F
+0x3A46 0x2F973
+0x3A47 0x2630F
+0x3A48 0x26310
+0x3A49 0x2F975
+0x3A4A 0x26328
+0x3A4B 0x26311
+0x3A4C 0x26316
+0x3A4D 0x26317
+0x3A4E 0x26302
+0x3A4F 0x263BB
+0x3A50 0x263BA
+0x3A51 0x263C3
+0x3A52 0x263BC
+0x3A53 0x2648A
+0x3A54 0x26484
+0x3A55 0x26486
+0x3A56 0x264E0
+0x3A57 0x26517
+0x3A58 0x26518
+0x3A59 0x2651E
+0x3A5A 0x26515
+0x3A5B 0x265D3
+0x3A5C 0x265DA
+0x3A5D 0x265D9
+0x3A5E 0x267E6
+0x3A5F 0x267F4
+0x3A60 0x267E1
+0x3A61 0x26869
+0x3A62 0x26840
+0x3A63 0x26858
+0x3A64 0x2686C
+0x3A65 0x2684D
+0x3A66 0x26921
+0x3A67 0x26999
+0x3A68 0x269F1
+0x3A69 0x23F68
+0x3A6A 0x26A86
+0x3A6B 0x26F5B
+0x3A6C 0x26F5C
+0x3A6D 0x26F77
+0x3A6E 0x26F2C
+0x3A6F 0x2F9AD
+0x3A70 0x26F58
+0x3A71 0x26F64
+0x3A72 0x26F61
+0x3A73 0x26F48
+0x3A74 0x26F97
+0x3A75 0x26F59
+0x3A76 0x26F29
+0x3A77 0x26F62
+0x3A78 0x26F2E
+0x3A79 0x26F68
+0x3A7A 0x26F90
+0x3A7B 0x26F3A
+0x3A7C 0x26F3D
+0x3A7D 0x26F5E
+0x3A7E 0x26F46
+0x3B21 0x26F69
+0x3B22 0x26F65
+0x3B23 0x26F3E
+0x3B24 0x26F49
+0x3B25 0x26F56
+0x3B26 0x26FE1
+0x3B27 0x26F78
+0x3B28 0x26F79
+0x3B29 0x26F66
+0x3B2A 0x26F4A
+0x3B2B 0x26F35
+0x3B2C 0x26F7A
+0x3B2D 0x26F92
+0x3B2E 0x26F60
+0x3B2F 0x26F36
+0x3B30 0x26F51
+0x3B31 0x26F42
+0x3B33 0x26F3F
+0x3B34 0x26F7B
+0x3B35 0x26F5D
+0x3B36 0x26F94
+0x3B37 0x26F6A
+0x3B38 0x2F9B5
+0x3B39 0x271F2
+0x3B3A 0x273BB
+0x3B3B 0x2741B
+0x3B3C 0x2741A
+0x3B3D 0x27433
+0x3B3E 0x27417
+0x3B3F 0x2740A
+0x3B40 0x27415
+0x3B41 0x27412
+0x3B42 0x27401
+0x3B43 0x2742D
+0x3B44 0x273FD
+0x3B45 0x27423
+0x3B46 0x27405
+0x3B47 0x27411
+0x3B48 0x27400
+0x3B49 0x2741C
+0x3B4A 0x27435
+0x3B4B 0x2742E
+0x3B4C 0x27436
+0x3B4D 0x20ABF
+0x3B4E 0x2742F
+0x3B4F 0x2740C
+0x3B50 0x27409
+0x3B51 0x27431
+0x3B52 0x273FC
+0x3B53 0x2740F
+0x3B54 0x27418
+0x3B55 0x27402
+0x3B56 0x27600
+0x3B57 0x2771F
+0x3B58 0x27737
+0x3B5A 0x27738
+0x3B5B 0x2772B
+0x3B5C 0x2772E
+0x3B5D 0x27721
+0x3B5E 0x27730
+0x3B5F 0x27729
+0x3B60 0x27731
+0x3B61 0x2F9C9
+0x3B62 0x27701
+0x3B63 0x2772C
+0x3B64 0x27722
+0x3B65 0x277FF
+0x3B66 0x27877
+0x3B67 0x27867
+0x3B68 0x2787F
+0x3B69 0x2787D
+0x3B6A 0x2787B
+0x3B6B 0x2787E
+0x3B6C 0x2791E
+0x3B6D 0x2791C
+0x3B6E 0x27921
+0x3B6F 0x27926
+0x3B70 0x27927
+0x3B71 0x27929
+0x3B72 0x2792C
+0x3B73 0x2791D
+0x3B74 0x2792B
+0x3B75 0x27ABF
+0x3B76 0x27AA4
+0x3B77 0x27AAA
+0x3B78 0x27AAE
+0x3B79 0x27A9F
+0x3B7A 0x27AD0
+0x3B7B 0x27AB1
+0x3B7C 0x27AAD
+0x3B7D 0x27A9B
+0x3B7E 0x27AB2
+0x3C21 0x27AA9
+0x3C22 0x27AB3
+0x3C23 0x27AB4
+0x3C24 0x27ABA
+0x3C25 0x27AA5
+0x3C26 0x27AB7
+0x3C27 0x27AAC
+0x3C28 0x27ACB
+0x3C29 0x27ACF
+0x3C2A 0x27BC6
+0x3C2B 0x27C01
+0x3C2C 0x27BFF
+0x3C2D 0x27BFD
+0x3C2E 0x27C77
+0x3C2F 0x27C78
+0x3C30 0x27C76
+0x3C31 0x27CF7
+0x3C32 0x27DCC
+0x3C34 0x27DD4
+0x3C35 0x27DD7
+0x3C36 0x27DD5
+0x3C37 0x27DD6
+0x3C38 0x27DD3
+0x3C39 0x27F5D
+0x3C3A 0x27F55
+0x3C3B 0x280E0
+0x3C3C 0x28148
+0x3C3D 0x280EE
+0x3C3E 0x280DB
+0x3C3F 0x280E7
+0x3C40 0x280D6
+0x3C41 0x280E5
+0x3C42 0x280E1
+0x3C43 0x280DD
+0x3C44 0x280E2
+0x3C45 0x28270
+0x3C46 0x28266
+0x3C47 0x2826F
+0x3C48 0x2826E
+0x3C49 0x28381
+0x3C4A 0x28369
+0x3C4B 0x2836E
+0x3C4C 0x2836D
+0x3C4D 0x2836C
+0x3C4E 0x28384
+0x3C4F 0x28385
+0x3C50 0x28371
+0x3C51 0x28373
+0x3C52 0x2836A
+0x3C53 0x2836F
+0x3C54 0x2837B
+0x3C55 0x2856A
+0x3C56 0x2857C
+0x3C57 0x2857D
+0x3C58 0x28581
+0x3C59 0x285FA
+0x3C5A 0x28605
+0x3C5B 0x285EB
+0x3C5C 0x285FB
+0x3C5D 0x285E9
+0x3C5E 0x285EF
+0x3C5F 0x285FC
+0x3C60 0x285E7
+0x3C61 0x2F9E1
+0x3C62 0x285EE
+0x3C63 0x285FD
+0x3C64 0x28732
+0x3C65 0x287A7
+0x3C66 0x287B5
+0x3C67 0x287B1
+0x3C68 0x287B9
+0x3C69 0x287A8
+0x3C6A 0x287B3
+0x3C6B 0x2F9E6
+0x3C6C 0x2888A
+0x3C6D 0x28891
+0x3C6E 0x2888D
+0x3C6F 0x28899
+0x3C71 0x2889A
+0x3C72 0x2889B
+0x3C73 0x28892
+0x3C74 0x2888F
+0x3C75 0x288AB
+0x3C76 0x24CDB
+0x3C78 0x28A75
+0x3C79 0x28A31
+0x3C7A 0x28A38
+0x3C7C 0x28A35
+0x3C7D 0x28A69
+0x3C7E 0x28A3B
+0x3D21 0x28A3D
+0x3D22 0x28A6C
+0x3D23 0x28A79
+0x3D24 0x28A3C
+0x3D25 0x28A3E
+0x3D26 0x28C97
+0x3D27 0x28CA5
+0x3D28 0x28CA2
+0x3D29 0x28C9D
+0x3D2A 0x28CA1
+0x3D2B 0x28D68
+0x3D2C 0x28D6F
+0x3D2D 0x28D6D
+0x3D2E 0x28D72
+0x3D2F 0x28D75
+0x3D30 0x28D77
+0x3D31 0x28D79
+0x3D32 0x28EB5
+0x3D33 0x28EEA
+0x3D34 0x28EAB
+0x3D35 0x28F43
+0x3D36 0x28F41
+0x3D37 0x28F42
+0x3D38 0x29009
+0x3D39 0x29008
+0x3D3A 0x29006
+0x3D3B 0x29001
+0x3D3C 0x29003
+0x3D3D 0x29000
+0x3D3E 0x29004
+0x3D3F 0x2900A
+0x3D40 0x2900E
+0x3D41 0x2900D
+0x3D42 0x29007
+0x3D43 0x2900F
+0x3D44 0x29014
+0x3D45 0x29002
+0x3D46 0x29015
+0x3D47 0x2900C
+0x3D48 0x29010
+0x3D49 0x29005
+0x3D4A 0x290FD
+0x3D4B 0x290FF
+0x3D4C 0x29104
+0x3D4D 0x29100
+0x3D4E 0x29109
+0x3D4F 0x2922B
+0x3D50 0x2F9F7
+0x3D51 0x29231
+0x3D52 0x292DB
+0x3D53 0x292C5
+0x3D54 0x292D3
+0x3D55 0x292CE
+0x3D57 0x292C9
+0x3D58 0x292BF
+0x3D59 0x292CB
+0x3D5A 0x292C0
+0x3D5B 0x292D0
+0x3D5C 0x292D4
+0x3D5D 0x293C1
+0x3D5E 0x293B9
+0x3D5F 0x293BB
+0x3D60 0x293C3
+0x3D61 0x293C9
+0x3D62 0x29407
+0x3D63 0x2942D
+0x3D64 0x294F8
+0x3D65 0x294E1
+0x3D66 0x294FA
+0x3D67 0x294EF
+0x3D68 0x294FD
+0x3D6A 0x294EB
+0x3D6B 0x294F1
+0x3D6C 0x294ED
+0x3D6D 0x294FE
+0x3D6E 0x295F8
+0x3D6F 0x29603
+0x3D70 0x295EE
+0x3D71 0x295E8
+0x3D72 0x29601
+0x3D73 0x296EC
+0x3D74 0x29722
+0x3D75 0x29714
+0x3D76 0x29734
+0x3D77 0x2972F
+0x3D78 0x29739
+0x3D79 0x29741
+0x3D7A 0x2973C
+0x3D7B 0x29749
+0x3D7C 0x29758
+0x3D7D 0x2973A
+0x3D7E 0x29742
+0x3E21 0x2973F
+0x3E22 0x29822
+0x3E23 0x29823
+0x3E24 0x2984A
+0x3E25 0x298DC
+0x3E26 0x298D9
+0x3E27 0x298DB
+0x3E28 0x298E2
+0x3E29 0x2FA07
+0x3E2A 0x298DF
+0x3E2B 0x298E0
+0x3E2C 0x298D7
+0x3E2D 0x29A4F
+0x3E2E 0x29A46
+0x3E2F 0x29A53
+0x3E30 0x29A55
+0x3E31 0x29A4E
+0x3E32 0x29A4A
+0x3E33 0x29A4C
+0x3E34 0x29A63
+0x3E35 0x29B51
+0x3E36 0x29B53
+0x3E37 0x29B58
+0x3E38 0x29B4D
+0x3E39 0x29B5A
+0x3E3A 0x29B49
+0x3E3B 0x29B5D
+0x3E3C 0x29C12
+0x3E3D 0x29C3C
+0x3E3E 0x29CD1
+0x3E3F 0x29CDF
+0x3E40 0x29CD6
+0x3E41 0x29CD8
+0x3E42 0x29CE0
+0x3E43 0x29CD9
+0x3E44 0x29DB1
+0x3E45 0x29DAC
+0x3E46 0x29DAA
+0x3E47 0x29DEE
+0x3E48 0x29DBD
+0x3E4A 0x29DC3
+0x3E4B 0x29DA8
+0x3E4C 0x29DAE
+0x3E4D 0x29DAB
+0x3E4E 0x2A01D
+0x3E4F 0x2A027
+0x3E50 0x2A038
+0x3E51 0x2A012
+0x3E52 0x2A048
+0x3E53 0x2A02B
+0x3E54 0x2A016
+0x3E55 0x2A019
+0x3E56 0x2A03D
+0x3E57 0x2A023
+0x3E58 0x2A02A
+0x3E59 0x2A264
+0x3E5A 0x2A2AD
+0x3E5B 0x2A2AC
+0x3E5C 0x2FA14
+0x3E5D 0x2A2B1
+0x3E5E 0x2A2AF
+0x3E5F 0x2A32C
+0x3E60 0x2A324
+0x3E61 0x2A325
+0x3E62 0x2A328
+0x3E63 0x2A3F9
+0x3E64 0x2A3F7
+0x3E65 0x2A3FD
+0x3E66 0x2A3FE
+0x3E67 0x2A439
+0x3E68 0x2A433
+0x3E69 0x2A4D7
+0x3E6A 0x2A4D8
+0x3E6B 0x2A4E4
+0x3E6C 0x214A1
+0x3E6D 0x2A50E
+0x3E6E 0x2A53B
+0x3E6F 0x2A544
+0x3E70 0x2A542
+0x3E71 0x2A594
+0x3E72 0x2A593
+0x3E73 0x2A5D5
+0x3E74 0x2A6A7
+0x3E75 0x20431
+0x3E76 0x20423
+0x3E77 0x20428
+0x3E78 0x20427
+0x3E79 0x204C6
+0x3E7A 0x205A3
+0x3E7B 0x20621
+0x3E7C 0x2081B
+0x3E7E 0x208C1
+0x3F21 0x208C3
+0x3F22 0x2092A
+0x3F23 0x20969
+0x3F24 0x20A27
+0x3F25 0x210B6
+0x3F26 0x210A7
+0x3F27 0x210A4
+0x3F28 0x210A6
+0x3F29 0x21090
+0x3F2A 0x2109E
+0x3F2B 0x21094
+0x3F2C 0x210A8
+0x3F2D 0x210A5
+0x3F2E 0x210A2
+0x3F2F 0x21091
+0x3F31 0x214BC
+0x3F32 0x214BD
+0x3F33 0x214B4
+0x3F34 0x214B0
+0x3F35 0x214E4
+0x3F36 0x21545
+0x3F37 0x2154B
+0x3F38 0x2157E
+0x3F39 0x2157F
+0x3F3A 0x2157D
+0x3F3B 0x215C3
+0x3F3C 0x218FC
+0x3F3D 0x218F7
+0x3F3E 0x218F0
+0x3F3F 0x218ED
+0x3F40 0x218F1
+0x3F41 0x218F8
+0x3F42 0x21AE9
+0x3F43 0x21CEB
+0x3F45 0x21F90
+0x3F46 0x21F8D
+0x3F47 0x21F86
+0x3F48 0x21F91
+0x3F49 0x21F8A
+0x3F4A 0x22008
+0x3F4B 0x22050
+0x3F4C 0x222EA
+0x3F4D 0x222E6
+0x3F4E 0x222E2
+0x3F4F 0x222E7
+0x3F50 0x222ED
+0x3F51 0x222E1
+0x3F52 0x22434
+0x3F53 0x22476
+0x3F54 0x22475
+0x3F55 0x22473
+0x3F56 0x224B5
+0x3F57 0x22590
+0x3F58 0x22592
+0x3F59 0x228E1
+0x3F5A 0x228DF
+0x3F5B 0x228D5
+0x3F5C 0x228F2
+0x3F5D 0x228FE
+0x3F5E 0x22913
+0x3F5F 0x2292E
+0x3F60 0x22A19
+0x3F61 0x22E08
+0x3F63 0x22E05
+0x3F64 0x22E09
+0x3F65 0x22E06
+0x3F66 0x22E03
+0x3F67 0x22DFD
+0x3F68 0x22DFC
+0x3F69 0x22E02
+0x3F6A 0x22E42
+0x3F6B 0x2301A
+0x3F6C 0x23011
+0x3F6D 0x23015
+0x3F6E 0x23016
+0x3F6F 0x230CC
+0x3F70 0x230CF
+0x3F71 0x230D0
+0x3F72 0x23122
+0x3F73 0x2311E
+0x3F74 0x23121
+0x3F75 0x232E5
+0x3F77 0x23354
+0x3F78 0x232EF
+0x3F79 0x23353
+0x3F7A 0x23351
+0x3F7B 0x233AD
+0x3F7C 0x23767
+0x3F7D 0x23768
+0x3F7E 0x237A4
+0x4021 0x23777
+0x4022 0x23789
+0x4023 0x23744
+0x4024 0x2378B
+0x4025 0x23779
+0x4026 0x2375B
+0x4027 0x23743
+0x4028 0x23757
+0x4029 0x2374A
+0x402A 0x2377C
+0x402B 0x23746
+0x402C 0x2377B
+0x402D 0x23756
+0x402E 0x239A8
+0x402F 0x23A76
+0x4030 0x23A72
+0x4031 0x23AD6
+0x4032 0x23AD8
+0x4033 0x23AD1
+0x4034 0x23C22
+0x4035 0x23C20
+0x4036 0x23C23
+0x4037 0x23C1E
+0x4038 0x23C6E
+0x4039 0x240A3
+0x403A 0x24077
+0x403B 0x240A6
+0x403C 0x2406D
+0x403D 0x240A2
+0x403E 0x2407C
+0x403F 0x24084
+0x4040 0x24068
+0x4041 0x24074
+0x4042 0x24086
+0x4043 0x240A5
+0x4044 0x2407B
+0x4045 0x2407A
+0x4046 0x24069
+0x4047 0x24072
+0x4048 0x24076
+0x4049 0x2444A
+0x404A 0x24437
+0x404B 0x2442A
+0x404C 0x2442D
+0x404D 0x24446
+0x404E 0x24428
+0x404F 0x24426
+0x4050 0x24442
+0x4051 0x2442C
+0x4052 0x24438
+0x4053 0x2442B
+0x4054 0x24433
+0x4055 0x24445
+0x4056 0x24539
+0x4057 0x246F9
+0x4058 0x246FA
+0x4059 0x248B8
+0x405A 0x248B7
+0x405B 0x248BB
+0x405C 0x248B9
+0x405D 0x248B4
+0x405E 0x24A6F
+0x405F 0x24A87
+0x4060 0x24A8F
+0x4061 0x24AA2
+0x4062 0x24AA3
+0x4063 0x2F931
+0x4064 0x24B9B
+0x4065 0x24B9D
+0x4066 0x24BCE
+0x4068 0x24EBD
+0x4069 0x24EBF
+0x406A 0x24E92
+0x406C 0x24EEF
+0x406D 0x24EC9
+0x406E 0x24FA4
+0x406F 0x24FA8
+0x4070 0x24FAA
+0x4071 0x25028
+0x4072 0x25024
+0x4073 0x25025
+0x4074 0x25026
+0x4075 0x250A9
+0x4076 0x250BA
+0x4077 0x250BE
+0x4078 0x250BC
+0x4079 0x250C0
+0x407A 0x252F0
+0x407B 0x252DF
+0x407C 0x252E0
+0x407D 0x252ED
+0x407E 0x252DB
+0x4121 0x252FB
+0x4122 0x252B9
+0x4123 0x252DA
+0x4124 0x252EB
+0x4125 0x252EC
+0x4126 0x2559A
+0x4127 0x2559F
+0x4128 0x2559B
+0x4129 0x25597
+0x412A 0x255A1
+0x412B 0x2570F
+0x412C 0x25705
+0x412D 0x25748
+0x412F 0x258BC
+0x4130 0x258BA
+0x4131 0x25ABF
+0x4132 0x25D01
+0x4133 0x25CE8
+0x4134 0x25CEF
+0x4135 0x25CE4
+0x4136 0x25CE6
+0x4137 0x25D02
+0x4138 0x25CEB
+0x4139 0x25CE0
+0x413A 0x25CED
+0x413B 0x25CD9
+0x413C 0x2F964
+0x413D 0x25D14
+0x413E 0x25CEE
+0x4140 0x25D13
+0x4141 0x25CF9
+0x4142 0x25CF8
+0x4143 0x25F25
+0x4144 0x2F969
+0x4145 0x25F19
+0x4146 0x25F20
+0x4147 0x25F43
+0x4148 0x25F3F
+0x4149 0x26145
+0x414A 0x2614C
+0x414B 0x26149
+0x414C 0x2614F
+0x414D 0x26141
+0x414E 0x2613E
+0x414F 0x2614D
+0x4150 0x26152
+0x4151 0x2614A
+0x4152 0x2614E
+0x4153 0x26173
+0x4154 0x26142
+0x4155 0x26151
+0x4156 0x26155
+0x4157 0x26150
+0x4158 0x2616C
+0x415A 0x2616A
+0x415B 0x26153
+0x415C 0x26168
+0x415D 0x26255
+0x415E 0x26256
+0x415F 0x2631C
+0x4160 0x2631D
+0x4162 0x2631E
+0x4163 0x26323
+0x4164 0x2631F
+0x4165 0x263E1
+0x4166 0x263CD
+0x4167 0x263CB
+0x4168 0x263CC
+0x4169 0x263C8
+0x416A 0x263C9
+0x416B 0x2649B
+0x416C 0x26494
+0x416D 0x26492
+0x416E 0x26496
+0x416F 0x26493
+0x4170 0x26495
+0x4171 0x2648F
+0x4172 0x2651D
+0x4173 0x26522
+0x4174 0x26521
+0x4175 0x265E9
+0x4176 0x265EF
+0x4177 0x265E0
+0x4178 0x265E6
+0x4179 0x265E4
+0x417A 0x26829
+0x417B 0x2682C
+0x417C 0x26876
+0x417D 0x26883
+0x417E 0x26878
+0x4221 0x2683C
+0x4222 0x24443
+0x4223 0x2687A
+0x4225 0x268F2
+0x4226 0x2699E
+0x4227 0x2699B
+0x4228 0x2699A
+0x4229 0x269F6
+0x422A 0x269F5
+0x422B 0x26AA5
+0x422C 0x26A93
+0x422D 0x26AA4
+0x422E 0x26E82
+0x422F 0x26EC7
+0x4230 0x26FB7
+0x4231 0x2701D
+0x4232 0x26FE2
+0x4233 0x26FD7
+0x4234 0x26FE3
+0x4235 0x26FE4
+0x4236 0x26FBC
+0x4237 0x26FD3
+0x4239 0x26F5A
+0x423A 0x26FD2
+0x423B 0x26F2D
+0x423C 0x2F9AF
+0x423D 0x26FC4
+0x423E 0x26FD0
+0x423F 0x26FE5
+0x4240 0x27005
+0x4241 0x27007
+0x4242 0x26FE6
+0x4243 0x2701B
+0x4244 0x26FE7
+0x4245 0x26FD8
+0x4246 0x26FBE
+0x4247 0x27017
+0x4248 0x26FB4
+0x4249 0x26FD9
+0x424A 0x26FE8
+0x424B 0x26FAD
+0x424C 0x26FAF
+0x424D 0x26FC8
+0x424E 0x26FE9
+0x424F 0x26FEA
+0x4250 0x271FE
+0x4251 0x271FB
+0x4252 0x27200
+0x4253 0x27472
+0x4254 0x27470
+0x4255 0x27446
+0x4256 0x27459
+0x4257 0x2745E
+0x4258 0x27448
+0x4259 0x2744F
+0x425A 0x27471
+0x425B 0x27460
+0x425C 0x2745F
+0x425D 0x2746E
+0x425E 0x27473
+0x425F 0x2F9C0
+0x4260 0x2F9BF
+0x4261 0x27447
+0x4262 0x2746D
+0x4263 0x2746F
+0x4264 0x27481
+0x4265 0x2746C
+0x4266 0x27478
+0x4267 0x27483
+0x4268 0x27449
+0x4269 0x27468
+0x426A 0x27474
+0x426B 0x27463
+0x426C 0x2746A
+0x426D 0x26885
+0x426E 0x27465
+0x426F 0x27462
+0x4270 0x274C8
+0x4271 0x275D0
+0x4272 0x275D4
+0x4273 0x275D1
+0x4274 0x27603
+0x4275 0x27742
+0x4276 0x27763
+0x4277 0x27756
+0x4278 0x2775B
+0x4279 0x27755
+0x427A 0x27750
+0x427B 0x2772D
+0x427C 0x27744
+0x427D 0x27748
+0x427E 0x27745
+0x4321 0x27782
+0x4323 0x27762
+0x4324 0x27885
+0x4325 0x2788D
+0x4326 0x27936
+0x4327 0x2792F
+0x4328 0x27931
+0x4329 0x27937
+0x432A 0x27AA7
+0x432B 0x27AD9
+0x432C 0x27AF0
+0x432D 0x27AF2
+0x432E 0x27AFD
+0x432F 0x27AE8
+0x4330 0x27AEB
+0x4331 0x27AEE
+0x4332 0x27AE0
+0x4333 0x27AE9
+0x4334 0x27AED
+0x4335 0x27AD6
+0x4336 0x27AF8
+0x4337 0x27AD4
+0x4338 0x27ADF
+0x4339 0x27AE7
+0x433A 0x27AD8
+0x433B 0x27AE3
+0x433C 0x27AEF
+0x433D 0x27B0F
+0x433E 0x27BCA
+0x433F 0x21546
+0x4340 0x27C05
+0x4341 0x27C0C
+0x4342 0x27C0D
+0x4343 0x27C7F
+0x4344 0x27C80
+0x4345 0x27C81
+0x4346 0x27D01
+0x4347 0x27D03
+0x4348 0x27DF2
+0x4349 0x27DE2
+0x434A 0x27DE3
+0x434B 0x27DDE
+0x434C 0x27DE9
+0x434D 0x27DE8
+0x434E 0x27DE0
+0x434F 0x27E01
+0x4350 0x27DF5
+0x4351 0x27DE4
+0x4353 0x27E77
+0x4354 0x27F74
+0x4355 0x27F6F
+0x4356 0x27F62
+0x4357 0x27F61
+0x4358 0x27F6D
+0x4359 0x27F73
+0x435A 0x27F6A
+0x435B 0x27F69
+0x435C 0x28112
+0x435D 0x2812D
+0x435E 0x28114
+0x435F 0x2810F
+0x4360 0x28129
+0x4361 0x28116
+0x4362 0x28103
+0x4363 0x28146
+0x4364 0x2815C
+0x4365 0x28111
+0x4366 0x28106
+0x4367 0x280DC
+0x4368 0x2812B
+0x4369 0x2812A
+0x436A 0x2812C
+0x436B 0x28127
+0x436C 0x2827A
+0x436D 0x2839C
+0x436E 0x28399
+0x436F 0x28395
+0x4370 0x2838B
+0x4371 0x28398
+0x4372 0x28396
+0x4373 0x28432
+0x4374 0x285A4
+0x4375 0x285AA
+0x4376 0x2861B
+0x4378 0x2860D
+0x4379 0x2861C
+0x437A 0x2860A
+0x437B 0x28620
+0x437C 0x28608
+0x437D 0x2861A
+0x437E 0x28613
+0x4421 0x28611
+0x4422 0x2875D
+0x4423 0x2875F
+0x4424 0x2875E
+0x4425 0x28760
+0x4426 0x287BB
+0x4427 0x287BC
+0x4428 0x287C1
+0x4429 0x287C0
+0x442A 0x287C8
+0x442B 0x287CE
+0x442C 0x288A7
+0x442D 0x288B2
+0x442E 0x288B6
+0x442F 0x288A5
+0x4430 0x288BA
+0x4431 0x288B5
+0x4432 0x288AD
+0x4433 0x288A4
+0x4434 0x288D3
+0x4435 0x288B0
+0x4436 0x288B1
+0x4437 0x2891D
+0x4438 0x28A8D
+0x443A 0x28A91
+0x443B 0x28AB6
+0x443C 0x28AB7
+0x443D 0x28ABD
+0x443E 0x28ABC
+0x443F 0x28A96
+0x4440 0x28A94
+0x4441 0x28AA0
+0x4442 0x28CA8
+0x4443 0x28CA6
+0x4444 0x28D84
+0x4445 0x28D96
+0x4446 0x28D88
+0x4447 0x28D9A
+0x4448 0x28ED1
+0x4449 0x28ECF
+0x444A 0x28F50
+0x444B 0x28F51
+0x444C 0x28F4E
+0x444D 0x28F80
+0x444E 0x28F81
+0x444F 0x2901B
+0x4450 0x29017
+0x4451 0x29020
+0x4452 0x29019
+0x4453 0x2901A
+0x4454 0x29021
+0x4455 0x2901E
+0x4456 0x29018
+0x4457 0x2901D
+0x4459 0x2912D
+0x445A 0x29124
+0x445B 0x29127
+0x445C 0x2912E
+0x445D 0x29125
+0x445E 0x2911C
+0x445F 0x29119
+0x4461 0x29123
+0x4462 0x2911F
+0x4463 0x2911A
+0x4464 0x2912B
+0x4465 0x2911E
+0x4466 0x291E0
+0x4467 0x29233
+0x4468 0x292E6
+0x4469 0x292FC
+0x446A 0x292E5
+0x446B 0x292F8
+0x446C 0x292F6
+0x446D 0x292EA
+0x446E 0x292F2
+0x446F 0x292ED
+0x4470 0x292EB
+0x4471 0x292F0
+0x4472 0x292F1
+0x4473 0x293C6
+0x4474 0x293C8
+0x4475 0x293CE
+0x4476 0x293C5
+0x4478 0x293CB
+0x4479 0x29513
+0x447A 0x29514
+0x447B 0x29507
+0x447C 0x2950C
+0x447D 0x2961A
+0x4521 0x29617
+0x4522 0x29606
+0x4523 0x29616
+0x4524 0x29607
+0x4525 0x29610
+0x4526 0x29609
+0x4527 0x29619
+0x4528 0x29615
+0x4529 0x2976E
+0x452A 0x2973B
+0x452B 0x2973E
+0x452C 0x2976C
+0x452D 0x29765
+0x452E 0x29764
+0x452F 0x29759
+0x4530 0x2977C
+0x4531 0x29770
+0x4532 0x29779
+0x4533 0x2982C
+0x4534 0x29852
+0x4535 0x29851
+0x4536 0x2984C
+0x4537 0x29900
+0x4538 0x29910
+0x4539 0x29913
+0x453A 0x298FF
+0x453B 0x298FE
+0x453C 0x298ED
+0x453D 0x29A5A
+0x453E 0x29A58
+0x453F 0x29A5C
+0x4540 0x29ADA
+0x4541 0x29B78
+0x4542 0x29B5E
+0x4543 0x29B67
+0x4544 0x29B64
+0x4545 0x29C13
+0x4546 0x29C23
+0x4547 0x29C41
+0x4548 0x29C3F
+0x4549 0x29C40
+0x454A 0x29CED
+0x454B 0x29CE3
+0x454C 0x29CEA
+0x454D 0x29CF0
+0x454E 0x29CE6
+0x454F 0x29CE9
+0x4550 0x29CF1
+0x4551 0x29CEE
+0x4552 0x29DD4
+0x4553 0x29DD1
+0x4554 0x29DDC
+0x4555 0x29DEC
+0x4556 0x2A069
+0x4557 0x2A06D
+0x4558 0x2A057
+0x4559 0x2A066
+0x455A 0x2A0F9
+0x455B 0x2A04A
+0x455C 0x2A060
+0x455D 0x2A056
+0x455E 0x2A059
+0x455F 0x2A04C
+0x4560 0x2A06A
+0x4561 0x2A062
+0x4562 0x2A063
+0x4563 0x2A070
+0x4564 0x2A05F
+0x4565 0x2FA0D
+0x4566 0x2A064
+0x4567 0x2A05D
+0x4568 0x2A068
+0x4569 0x2A09F
+0x456A 0x2A2BA
+0x456B 0x2A2B8
+0x456C 0x2A2BC
+0x456D 0x2A2B9
+0x456E 0x2A2B4
+0x456F 0x2A33B
+0x4570 0x2A32D
+0x4571 0x2A338
+0x4572 0x2A32F
+0x4573 0x2A332
+0x4574 0x2A441
+0x4575 0x2A4CB
+0x4576 0x2A4DE
+0x4577 0x2A4DD
+0x4578 0x2A4DA
+0x4579 0x2A4DC
+0x457A 0x2A510
+0x457B 0x2A54F
+0x457C 0x2A549
+0x457D 0x2A598
+0x457E 0x2A596
+0x4621 0x2A597
+0x4622 0x2A5C7
+0x4623 0x2019C
+0x4624 0x2A5DA
+0x4625 0x2A5D8
+0x4626 0x2A6A8
+0x4627 0x2010A
+0x4628 0x2019D
+0x4629 0x204CB
+0x462A 0x20538
+0x462B 0x20539
+0x462C 0x205A6
+0x462D 0x20823
+0x462E 0x20822
+0x462F 0x20821
+0x4630 0x209CE
+0x4631 0x20B92
+0x4632 0x20B91
+0x4633 0x210EC
+0x4634 0x210E0
+0x4635 0x210ED
+0x4636 0x21108
+0x4637 0x210E5
+0x4638 0x210EE
+0x4639 0x210E4
+0x463A 0x210EB
+0x463B 0x210E3
+0x463C 0x210EA
+0x463D 0x2110A
+0x463E 0x2F859
+0x463F 0x214D1
+0x4640 0x214E3
+0x4641 0x214D4
+0x4642 0x214D0
+0x4643 0x214D9
+0x4646 0x214DA
+0x4647 0x214D3
+0x4648 0x2154C
+0x4649 0x2154D
+0x464A 0x2157C
+0x464B 0x21580
+0x464C 0x215CC
+0x464D 0x218FF
+0x464E 0x21908
+0x464F 0x2A508
+0x4650 0x21901
+0x4651 0x2F86B
+0x4652 0x21900
+0x4653 0x21AED
+0x4654 0x21AF3
+0x4655 0x21AEE
+0x4656 0x21AF1
+0x4657 0x21AF0
+0x4658 0x21ADE
+0x4659 0x21B51
+0x465A 0x21F82
+0x465B 0x21FA9
+0x465C 0x21F98
+0x465D 0x21F9D
+0x465E 0x21F9A
+0x465F 0x21F9E
+0x4660 0x21F9F
+0x4661 0x21FA6
+0x4662 0x21FA7
+0x4663 0x22009
+0x4664 0x2202F
+0x4665 0x22171
+0x4666 0x2216D
+0x4667 0x22172
+0x4668 0x222EF
+0x4669 0x222F0
+0x466A 0x2243B
+0x466B 0x22439
+0x466C 0x2243C
+0x466D 0x22438
+0x466E 0x24BFD
+0x466F 0x2243A
+0x4670 0x22478
+0x4671 0x22479
+0x4672 0x22477
+0x4673 0x22598
+0x4674 0x2259C
+0x4675 0x22599
+0x4676 0x2259A
+0x4677 0x22911
+0x4678 0x2290A
+0x4679 0x228FD
+0x467A 0x2290F
+0x467B 0x22919
+0x467C 0x22903
+0x467D 0x22915
+0x467E 0x2290C
+0x4721 0x22909
+0x4722 0x22912
+0x4723 0x22934
+0x4724 0x2292A
+0x4725 0x22908
+0x4726 0x2292D
+0x4727 0x22928
+0x4728 0x2F8B1
+0x4729 0x2292C
+0x472A 0x22926
+0x472B 0x22933
+0x472D 0x22A1A
+0x472E 0x22A1E
+0x472F 0x22E07
+0x4730 0x22E2C
+0x4731 0x22E32
+0x4732 0x22E28
+0x4733 0x22E31
+0x4734 0x22E29
+0x4735 0x22E30
+0x4736 0x22E2A
+0x4737 0x22E44
+0x4738 0x22E2E
+0x4739 0x230D1
+0x473A 0x23124
+0x473B 0x232F7
+0x473C 0x232F4
+0x473D 0x232F3
+0x473E 0x232F8
+0x473F 0x237B5
+0x4740 0x23796
+0x4741 0x23798
+0x4742 0x23795
+0x4743 0x23791
+0x4744 0x237B2
+0x4745 0x2379E
+0x4746 0x23759
+0x4747 0x237A3
+0x4748 0x2379A
+0x4749 0x2379B
+0x474B 0x26183
+0x474C 0x23ADA
+0x474D 0x23ADF
+0x474E 0x23B16
+0x474F 0x23C1F
+0x4750 0x23C2D
+0x4751 0x23C2E
+0x4752 0x23C2B
+0x4753 0x240B8
+0x4754 0x240BB
+0x4755 0x240BF
+0x4756 0x240BA
+0x4757 0x240D5
+0x4758 0x240E3
+0x4759 0x240C1
+0x475A 0x240BE
+0x475B 0x240BD
+0x475C 0x240B4
+0x475D 0x240C2
+0x475E 0x240A1
+0x475F 0x24087
+0x4760 0x240D7
+0x4761 0x240CA
+0x4762 0x240B5
+0x4763 0x240DA
+0x4764 0x240D9
+0x4765 0x240B3
+0x4766 0x240D8
+0x4767 0x24467
+0x4768 0x24471
+0x4769 0x24462
+0x476A 0x2445C
+0x476B 0x24468
+0x476C 0x24452
+0x476D 0x24456
+0x476E 0x21109
+0x476F 0x20442
+0x4770 0x245A0
+0x4771 0x24700
+0x4772 0x246FE
+0x4773 0x246FF
+0x4774 0x248CB
+0x4775 0x2F928
+0x4776 0x248CA
+0x4777 0x248A9
+0x4778 0x248C8
+0x4779 0x24AB4
+0x477A 0x24AAC
+0x477B 0x24AAA
+0x477C 0x24AA9
+0x477D 0x24C0E
+0x477E 0x24CE9
+0x4821 0x24CED
+0x4822 0x24CF2
+0x4823 0x24CEB
+0x4824 0x24CEE
+0x4825 0x24EE8
+0x4826 0x24EDB
+0x4827 0x24ED7
+0x4828 0x24EE3
+0x4829 0x24EE5
+0x482A 0x24EEE
+0x482B 0x24ED5
+0x482C 0x24FB3
+0x482D 0x2502D
+0x482E 0x250C1
+0x482F 0x250C3
+0x4830 0x2530C
+0x4831 0x2530E
+0x4832 0x25307
+0x4833 0x25317
+0x4834 0x25309
+0x4835 0x25316
+0x4836 0x2539A
+0x4837 0x2539C
+0x4838 0x255B4
+0x4839 0x255B7
+0x483A 0x255B3
+0x483B 0x2154E
+0x483C 0x25713
+0x483D 0x25714
+0x483E 0x258E6
+0x483F 0x258DC
+0x4840 0x258E8
+0x4841 0x258E5
+0x4842 0x25A2E
+0x4843 0x25A2C
+0x4844 0x25A2B
+0x4845 0x25ACD
+0x4846 0x25D3D
+0x4847 0x25D32
+0x4848 0x25D2D
+0x4849 0x25D45
+0x484A 0x25D3E
+0x484B 0x25D50
+0x484C 0x25D25
+0x484D 0x25D53
+0x484E 0x25D23
+0x484F 0x25F37
+0x4850 0x25F38
+0x4851 0x25F47
+0x4852 0x25F3D
+0x4853 0x25F3E
+0x4854 0x25F49
+0x4855 0x25F4A
+0x4856 0x25F1D
+0x4858 0x261A5
+0x4859 0x2618C
+0x485A 0x2618D
+0x485B 0x26189
+0x485C 0x26196
+0x485D 0x26185
+0x485E 0x2618F
+0x485F 0x26177
+0x4860 0x2618E
+0x4861 0x26182
+0x4862 0x2618A
+0x4863 0x26188
+0x4864 0x2617B
+0x4865 0x26197
+0x4866 0x2617D
+0x4867 0x26179
+0x4868 0x26259
+0x4869 0x26324
+0x486A 0x2632D
+0x486B 0x2632E
+0x486C 0x2632B
+0x486D 0x2F976
+0x486E 0x263DA
+0x486F 0x263D8
+0x4870 0x263D6
+0x4871 0x26487
+0x4872 0x264A0
+0x4873 0x26528
+0x4874 0x26525
+0x4875 0x2651F
+0x4876 0x265F3
+0x4877 0x265F7
+0x4878 0x265F6
+0x4879 0x2682B
+0x487A 0x2685B
+0x487B 0x26848
+0x487D 0x2685C
+0x487E 0x2686D
+0x4921 0x2689D
+0x4922 0x26899
+0x4923 0x2688C
+0x4924 0x26891
+0x4925 0x2689B
+0x4926 0x2689A
+0x4927 0x2689C
+0x4928 0x26895
+0x4929 0x2688D
+0x492A 0x26896
+0x492B 0x268A5
+0x492C 0x2692A
+0x492D 0x269A1
+0x492E 0x269A4
+0x492F 0x269AD
+0x4930 0x26AA9
+0x4931 0x26AAE
+0x4932 0x26AB0
+0x4933 0x2700D
+0x4934 0x26F63
+0x4935 0x26F71
+0x4936 0x27051
+0x4937 0x27054
+0x4938 0x2702A
+0x4939 0x27044
+0x493A 0x27055
+0x493B 0x27099
+0x493C 0x27039
+0x493D 0x2703F
+0x493E 0x2703E
+0x493F 0x2704F
+0x4940 0x2704D
+0x4941 0x27035
+0x4942 0x27040
+0x4943 0x27031
+0x4944 0x26FD5
+0x4945 0x2702B
+0x4946 0x27033
+0x4947 0x27041
+0x4948 0x27056
+0x4949 0x2704C
+0x494A 0x27046
+0x494B 0x2703C
+0x494C 0x27045
+0x494D 0x27043
+0x494E 0x2703D
+0x494F 0x27070
+0x4950 0x27057
+0x4951 0x27038
+0x4952 0x27058
+0x4954 0x27037
+0x4955 0x27207
+0x4956 0x27206
+0x4957 0x27209
+0x4958 0x274AB
+0x4959 0x27490
+0x495A 0x27493
+0x495B 0x274BC
+0x495C 0x274A9
+0x495D 0x2749E
+0x495E 0x274BF
+0x495F 0x274AA
+0x4960 0x27491
+0x4961 0x274A4
+0x4962 0x2749A
+0x4963 0x274A7
+0x4964 0x274A1
+0x4965 0x2749C
+0x4966 0x274A2
+0x4967 0x2749B
+0x4968 0x2749F
+0x4969 0x27494
+0x496A 0x2748F
+0x496B 0x272F0
+0x496C 0x27492
+0x496D 0x27495
+0x496E 0x274A5
+0x496F 0x274A6
+0x4970 0x27604
+0x4971 0x2779C
+0x4972 0x27779
+0x4973 0x2777A
+0x4974 0x2777E
+0x4975 0x2777B
+0x4976 0x27771
+0x4977 0x27781
+0x4978 0x2777F
+0x4979 0x2777C
+0x497A 0x2777D
+0x497B 0x27775
+0x497C 0x27776
+0x497D 0x2788E
+0x497E 0x2788F
+0x4A21 0x2793E
+0x4A22 0x2793F
+0x4A23 0x27940
+0x4A24 0x27941
+0x4A26 0x27B0D
+0x4A27 0x27B17
+0x4A28 0x27B10
+0x4A29 0x27B0E
+0x4A2A 0x27AEA
+0x4A2B 0x27B1D
+0x4A2C 0x27B03
+0x4A2D 0x27B22
+0x4A2E 0x27B04
+0x4A2F 0x27B00
+0x4A30 0x27B20
+0x4A31 0x27B21
+0x4A32 0x27B23
+0x4A33 0x27B13
+0x4A34 0x27B09
+0x4A35 0x27B11
+0x4A36 0x27BCB
+0x4A37 0x27BCE
+0x4A38 0x27BD0
+0x4A39 0x27BCC
+0x4A3A 0x27BD4
+0x4A3B 0x214DB
+0x4A3C 0x27C09
+0x4A3D 0x27C0B
+0x4A3E 0x27C85
+0x4A3F 0x27D06
+0x4A40 0x27D0D
+0x4A42 0x27D14
+0x4A43 0x27D0F
+0x4A44 0x27E09
+0x4A45 0x27E14
+0x4A46 0x27E0B
+0x4A47 0x27DFC
+0x4A48 0x27E04
+0x4A49 0x27E0A
+0x4A4A 0x27E00
+0x4A4B 0x27DFD
+0x4A4C 0x27E07
+0x4A4D 0x27E06
+0x4A4E 0x27E11
+0x4A4F 0x27E79
+0x4A50 0x27E78
+0x4A51 0x27F88
+0x4A52 0x27F80
+0x4A53 0x27F8B
+0x4A54 0x28159
+0x4A55 0x28161
+0x4A56 0x28175
+0x4A58 0x28155
+0x4A59 0x2815B
+0x4A5A 0x2815F
+0x4A5B 0x28152
+0x4A5C 0x28162
+0x4A5D 0x28172
+0x4A5E 0x2815D
+0x4A5F 0x28168
+0x4A60 0x28171
+0x4A61 0x28165
+0x4A62 0x28166
+0x4A63 0x28167
+0x4A64 0x28176
+0x4A65 0x2814C
+0x4A66 0x28160
+0x4A67 0x28174
+0x4A68 0x28150
+0x4A69 0x2828A
+0x4A6A 0x28281
+0x4A6B 0x28286
+0x4A6C 0x2827F
+0x4A6D 0x28280
+0x4A6E 0x283A5
+0x4A6F 0x283A7
+0x4A70 0x283A8
+0x4A71 0x283A6
+0x4A72 0x283AF
+0x4A73 0x26195
+0x4A74 0x283B1
+0x4A75 0x28435
+0x4A76 0x28439
+0x4A77 0x285C3
+0x4A78 0x28630
+0x4A79 0x2862A
+0x4A7A 0x2862B
+0x4A7B 0x2862D
+0x4A7C 0x2862E
+0x4A7D 0x2862C
+0x4A7E 0x28623
+0x4B21 0x28621
+0x4B22 0x28622
+0x4B23 0x2876C
+0x4B24 0x28781
+0x4B25 0x2878F
+0x4B26 0x28780
+0x4B27 0x287D0
+0x4B28 0x287CD
+0x4B29 0x287D5
+0x4B2A 0x287D4
+0x4B2B 0x288D1
+0x4B2C 0x288BE
+0x4B2D 0x288CB
+0x4B2E 0x288CE
+0x4B2F 0x288BD
+0x4B30 0x288D0
+0x4B31 0x28B04
+0x4B32 0x28AD5
+0x4B33 0x28AD0
+0x4B34 0x28AD3
+0x4B35 0x28AFB
+0x4B36 0x28AD8
+0x4B37 0x28AD1
+0x4B38 0x28AFD
+0x4B39 0x28AD9
+0x4B3A 0x28AD6
+0x4B3B 0x28AE6
+0x4B3C 0x28AF9
+0x4B3D 0x28DA1
+0x4B3E 0x28D9D
+0x4B3F 0x28D9E
+0x4B41 0x28EFF
+0x4B42 0x28F5F
+0x4B43 0x28F57
+0x4B44 0x28F60
+0x4B45 0x28F59
+0x4B46 0x2902C
+0x4B47 0x29025
+0x4B48 0x29027
+0x4B49 0x29030
+0x4B4A 0x29024
+0x4B4B 0x29026
+0x4B4C 0x2902D
+0x4B4D 0x2902E
+0x4B4E 0x29029
+0x4B4F 0x29031
+0x4B50 0x29145
+0x4B51 0x29147
+0x4B52 0x29152
+0x4B53 0x2914A
+0x4B54 0x29150
+0x4B55 0x29146
+0x4B56 0x2914F
+0x4B57 0x2914E
+0x4B58 0x29153
+0x4B59 0x29321
+0x4B5A 0x29309
+0x4B5B 0x2931A
+0x4B5C 0x2931B
+0x4B5D 0x25315
+0x4B5E 0x29310
+0x4B5F 0x2F9F9
+0x4B60 0x29314
+0x4B61 0x2930E
+0x4B62 0x29312
+0x4B63 0x2930B
+0x4B64 0x293CF
+0x4B65 0x293D2
+0x4B66 0x293D0
+0x4B67 0x293D4
+0x4B68 0x293D3
+0x4B69 0x293D1
+0x4B6A 0x20B18
+0x4B6B 0x2F9FB
+0x4B6C 0x29409
+0x4B6D 0x2951C
+0x4B6E 0x29527
+0x4B6F 0x29525
+0x4B70 0x2951B
+0x4B71 0x29529
+0x4B72 0x2951F
+0x4B73 0x29530
+0x4B74 0x29524
+0x4B75 0x29528
+0x4B76 0x29519
+0x4B77 0x2952F
+0x4B78 0x29624
+0x4B79 0x29621
+0x4B7A 0x29625
+0x4B7B 0x29626
+0x4B7C 0x29627
+0x4B7D 0x29676
+0x4B7E 0x29766
+0x4C21 0x29775
+0x4C22 0x29769
+0x4C23 0x2977E
+0x4C24 0x2978F
+0x4C25 0x29774
+0x4C26 0x27210
+0x4C27 0x297AD
+0x4C28 0x2982B
+0x4C29 0x2982A
+0x4C2A 0x29858
+0x4C2B 0x29922
+0x4C2C 0x2991D
+0x4C2D 0x2992B
+0x4C2E 0x2992C
+0x4C2F 0x2992D
+0x4C30 0x29933
+0x4C31 0x2991B
+0x4C32 0x29927
+0x4C33 0x2992A
+0x4C34 0x29928
+0x4C35 0x2993B
+0x4C36 0x29A7E
+0x4C37 0x29A71
+0x4C38 0x29A79
+0x4C39 0x29A78
+0x4C3A 0x29A70
+0x4C3B 0x29A6D
+0x4C3C 0x29A7D
+0x4C3D 0x29A75
+0x4C3E 0x29A76
+0x4C3F 0x29ADE
+0x4C40 0x29B66
+0x4C41 0x29B83
+0x4C42 0x29B87
+0x4C43 0x29B7B
+0x4C44 0x29B89
+0x4C45 0x29B86
+0x4C46 0x29B82
+0x4C47 0x29B7C
+0x4C48 0x29B81
+0x4C49 0x29C43
+0x4C4A 0x29C45
+0x4C4B 0x29CF7
+0x4C4C 0x29CF9
+0x4C4D 0x29CFA
+0x4C4E 0x29E05
+0x4C4F 0x29DFE
+0x4C50 0x29E0F
+0x4C51 0x29DFF
+0x4C52 0x29DFA
+0x4C53 0x29E09
+0x4C54 0x29E20
+0x4C55 0x29E0C
+0x4C56 0x29E3C
+0x4C57 0x29E22
+0x4C58 0x29DF8
+0x4C59 0x29E0A
+0x4C5A 0x29E08
+0x4C5B 0x29DF7
+0x4C5C 0x2A08E
+0x4C5D 0x2A077
+0x4C5E 0x2A08B
+0x4C5F 0x2A0B4
+0x4C60 0x2A08A
+0x4C61 0x2A09A
+0x4C62 0x2A079
+0x4C63 0x2A083
+0x4C64 0x2A07F
+0x4C65 0x2A0A1
+0x4C66 0x2A08F
+0x4C67 0x2A0A3
+0x4C68 0x2A081
+0x4C69 0x2A094
+0x4C6A 0x2A07E
+0x4C6B 0x2A082
+0x4C6C 0x2A090
+0x4C6D 0x2A0A5
+0x4C6E 0x2A0AD
+0x4C6F 0x2A09D
+0x4C70 0x2A267
+0x4C71 0x2A269
+0x4C72 0x2A2CB
+0x4C73 0x2A2C8
+0x4C74 0x2A2D1
+0x4C75 0x2A340
+0x4C76 0x2A34B
+0x4C77 0x2A349
+0x4C78 0x2A346
+0x4C79 0x2A33E
+0x4C7A 0x2A343
+0x4C7B 0x2A33F
+0x4C7C 0x2A3A5
+0x4C7D 0x2A3A7
+0x4C7E 0x2A44E
+0x4D21 0x2A44D
+0x4D22 0x2259B
+0x4D23 0x2A4E5
+0x4D24 0x2A4E1
+0x4D25 0x2A4E2
+0x4D26 0x2A516
+0x4D27 0x2A514
+0x4D28 0x2FA1B
+0x4D29 0x2A559
+0x4D2A 0x2A551
+0x4D2B 0x2A55F
+0x4D2C 0x2A54A
+0x4D2D 0x2A557
+0x4D2E 0x2A558
+0x4D2F 0x2A5CA
+0x4D30 0x2A5DB
+0x4D31 0x2A5DE
+0x4D32 0x2A5E0
+0x4D33 0x2A5E1
+0x4D34 0x2A5DF
+0x4D35 0x2A5E2
+0x4D36 0x2A5E3
+0x4D37 0x2A692
+0x4D38 0x2A6BF
+0x4D39 0x2A6BE
+0x4D3A 0x2010B
+0x4D3B 0x20452
+0x4D3C 0x2044E
+0x4D3E 0x2F813
+0x4D3F 0x205A7
+0x4D40 0x20826
+0x4D41 0x20827
+0x4D42 0x208C6
+0x4D43 0x2090B
+0x4D44 0x2096A
+0x4D45 0x20978
+0x4D46 0x2111A
+0x4D47 0x21116
+0x4D48 0x21119
+0x4D49 0x21117
+0x4D4A 0x2111B
+0x4D4B 0x21118
+0x4D4C 0x21120
+0x4D4D 0x21237
+0x4D4E 0x214EC
+0x4D4F 0x21581
+0x4D50 0x2923D
+0x4D51 0x2190F
+0x4D52 0x219AD
+0x4D53 0x21AFB
+0x4D54 0x21B52
+0x4D55 0x21FAF
+0x4D56 0x21FB7
+0x4D57 0x21FB2
+0x4D58 0x22178
+0x4D59 0x221AC
+0x4D5A 0x22300
+0x4D5B 0x222FE
+0x4D5C 0x22302
+0x4D5D 0x222FD
+0x4D5E 0x22303
+0x4D5F 0x22440
+0x4D60 0x22443
+0x4D61 0x22442
+0x4D62 0x224B7
+0x4D63 0x225A2
+0x4D64 0x22900
+0x4D65 0x22935
+0x4D66 0x22941
+0x4D67 0x22905
+0x4D68 0x20453
+0x4D69 0x22950
+0x4D6A 0x2294E
+0x4D6B 0x22953
+0x4D6C 0x22E53
+0x4D6D 0x22E50
+0x4D6E 0x22E57
+0x4D6F 0x22E5F
+0x4D70 0x22E55
+0x4D71 0x22EEA
+0x4D72 0x23026
+0x4D73 0x29830
+0x4D74 0x2302A
+0x4D75 0x23028
+0x4D76 0x2302C
+0x4D77 0x2302D
+0x4D78 0x230D4
+0x4D79 0x23307
+0x4D7A 0x23358
+0x4D7B 0x23359
+0x4D7C 0x237C5
+0x4D7D 0x237CD
+0x4D7E 0x237C7
+0x4E21 0x237E8
+0x4E23 0x23932
+0x4E24 0x2A697
+0x4E25 0x23ADE
+0x4E26 0x23C32
+0x4E27 0x20AC8
+0x4E28 0x2F915
+0x4E29 0x240F1
+0x4E2A 0x240F0
+0x4E2B 0x240EC
+0x4E2C 0x24109
+0x4E2D 0x240F9
+0x4E2E 0x240F5
+0x4E2F 0x240FE
+0x4E30 0x24474
+0x4E31 0x24481
+0x4E32 0x2447C
+0x4E33 0x24475
+0x4E34 0x24489
+0x4E35 0x24482
+0x4E36 0x24497
+0x4E37 0x24486
+0x4E38 0x2447D
+0x4E39 0x24493
+0x4E3A 0x2449C
+0x4E3B 0x24476
+0x4E3C 0x24480
+0x4E3D 0x24545
+0x4E3E 0x206A1
+0x4E3F 0x24703
+0x4E40 0x248C9
+0x4E41 0x248CD
+0x4E42 0x248D0
+0x4E43 0x24AAD
+0x4E44 0x24AC5
+0x4E45 0x24BA2
+0x4E46 0x24CEC
+0x4E47 0x24CF6
+0x4E48 0x24CF3
+0x4E49 0x24EF3
+0x4E4A 0x24EFA
+0x4E4B 0x24EF9
+0x4E4C 0x24EF5
+0x4E4D 0x24EF4
+0x4E4E 0x24EF8
+0x4E4F 0x24FB6
+0x4E50 0x24FB4
+0x4E51 0x25032
+0x4E52 0x250CD
+0x4E53 0x250C8
+0x4E54 0x250CE
+0x4E55 0x250CA
+0x4E56 0x2532A
+0x4E57 0x25321
+0x4E58 0x2531D
+0x4E59 0x255BD
+0x4E5A 0x255BE
+0x4E5B 0x255C2
+0x4E5D 0x255C9
+0x4E5E 0x2571F
+0x4E5F 0x258F1
+0x4E60 0x258ED
+0x4E61 0x258F2
+0x4E62 0x258E0
+0x4E63 0x258F7
+0x4E64 0x25A30
+0x4E65 0x25A37
+0x4E66 0x25A31
+0x4E67 0x25A36
+0x4E68 0x25AC8
+0x4E69 0x25D6D
+0x4E6A 0x25D69
+0x4E6B 0x25D7D
+0x4E6C 0x25D61
+0x4E6D 0x25D70
+0x4E6E 0x25D71
+0x4E6F 0x25D73
+0x4E70 0x25D76
+0x4E71 0x25D75
+0x4E72 0x25D78
+0x4E73 0x25D79
+0x4E74 0x25D64
+0x4E75 0x25D6E
+0x4E76 0x25F51
+0x4E77 0x25F4F
+0x4E78 0x25F22
+0x4E79 0x261AF
+0x4E7A 0x261AA
+0x4E7B 0x261A3
+0x4E7C 0x2619D
+0x4E7D 0x2619C
+0x4E7E 0x261A1
+0x4F21 0x261B6
+0x4F22 0x261AC
+0x4F23 0x261A2
+0x4F24 0x261A7
+0x4F25 0x261B0
+0x4F26 0x261A9
+0x4F27 0x261C3
+0x4F28 0x26331
+0x4F29 0x26332
+0x4F2A 0x26333
+0x4F2B 0x26334
+0x4F2C 0x26337
+0x4F2D 0x2633C
+0x4F2E 0x263D9
+0x4F2F 0x263DD
+0x4F30 0x263DE
+0x4F31 0x263DF
+0x4F32 0x263E0
+0x4F33 0x264A5
+0x4F34 0x264AA
+0x4F35 0x264A2
+0x4F36 0x264A3
+0x4F37 0x26604
+0x4F38 0x26603
+0x4F39 0x265FE
+0x4F3A 0x26628
+0x4F3B 0x268AF
+0x4F3C 0x268AD
+0x4F3D 0x268A6
+0x4F3E 0x269AC
+0x4F3F 0x269A5
+0x4F40 0x269B0
+0x4F41 0x269B1
+0x4F42 0x26A01
+0x4F43 0x26AB2
+0x4F44 0x26AD2
+0x4F45 0x26AF1
+0x4F46 0x26FD1
+0x4F47 0x27047
+0x4F48 0x270C9
+0x4F49 0x270A7
+0x4F4A 0x270C8
+0x4F4B 0x27095
+0x4F4C 0x2708E
+0x4F4D 0x27091
+0x4F4E 0x2707D
+0x4F4F 0x270EE
+0x4F50 0x2708D
+0x4F51 0x2708C
+0x4F52 0x270B0
+0x4F53 0x27096
+0x4F54 0x27042
+0x4F55 0x2707C
+0x4F56 0x270B1
+0x4F57 0x270B2
+0x4F58 0x27084
+0x4F59 0x2709D
+0x4F5A 0x270A1
+0x4F5B 0x27098
+0x4F5C 0x270B3
+0x4F5D 0x27022
+0x4F5E 0x2707B
+0x4F5F 0x2708A
+0x4F60 0x270CE
+0x4F61 0x27080
+0x4F62 0x27097
+0x4F63 0x270B4
+0x4F64 0x270B5
+0x4F65 0x2709A
+0x4F66 0x2709F
+0x4F67 0x27093
+0x4F68 0x27212
+0x4F69 0x2720B
+0x4F6A 0x2720E
+0x4F6B 0x274A3
+0x4F6C 0x274CC
+0x4F6D 0x274DC
+0x4F6E 0x274E1
+0x4F6F 0x274DE
+0x4F70 0x274D2
+0x4F71 0x274DB
+0x4F72 0x274D9
+0x4F73 0x274D7
+0x4F74 0x274D4
+0x4F75 0x274C9
+0x4F76 0x274EB
+0x4F77 0x274DA
+0x4F78 0x274D1
+0x4F79 0x27504
+0x4F7A 0x274CA
+0x4F7B 0x274E2
+0x4F7C 0x275D7
+0x4F7D 0x2778C
+0x4F7E 0x27799
+0x5021 0x277A2
+0x5022 0x27796
+0x5023 0x27794
+0x5024 0x2779F
+0x5026 0x2778E
+0x5027 0x27803
+0x5028 0x27894
+0x5029 0x27893
+0x502A 0x27944
+0x502B 0x27B2F
+0x502C 0x27B35
+0x502D 0x27B2B
+0x502E 0x27B32
+0x502F 0x27B2D
+0x5030 0x27B36
+0x5032 0x27B31
+0x5033 0x27B12
+0x5034 0x27B33
+0x5035 0x27B1F
+0x5036 0x27B34
+0x5037 0x27B40
+0x5038 0x27B3F
+0x5039 0x27B41
+0x503A 0x27BD3
+0x503B 0x27C89
+0x503C 0x27D18
+0x503D 0x27D10
+0x503E 0x27E1A
+0x503F 0x27E25
+0x5040 0x27E1E
+0x5041 0x27F92
+0x5042 0x27F95
+0x5043 0x27F93
+0x5044 0x28184
+0x5045 0x2819A
+0x5046 0x28189
+0x5047 0x2818D
+0x5048 0x28188
+0x5049 0x28191
+0x504A 0x2819B
+0x504B 0x2819C
+0x504C 0x29548
+0x504D 0x2828E
+0x504E 0x28292
+0x504F 0x283C5
+0x5050 0x283C1
+0x5051 0x283B8
+0x5052 0x283BE
+0x5053 0x283B5
+0x5054 0x283C7
+0x5055 0x2843C
+0x5057 0x285EC
+0x5058 0x2863F
+0x5059 0x28639
+0x505A 0x28637
+0x505B 0x287A1
+0x505C 0x28794
+0x505D 0x287A0
+0x505E 0x287DE
+0x505F 0x287DB
+0x5060 0x287DF
+0x5061 0x287DC
+0x5062 0x288D6
+0x5063 0x288DC
+0x5064 0x288DD
+0x5065 0x288E0
+0x5066 0x288E3
+0x5067 0x288E1
+0x5068 0x28B18
+0x5069 0x28B19
+0x506A 0x28B53
+0x506B 0x2F9EC
+0x506C 0x28B44
+0x506D 0x28B0E
+0x506E 0x28B0F
+0x506F 0x28B47
+0x5070 0x28B17
+0x5071 0x28B1D
+0x5072 0x28B11
+0x5073 0x28CB4
+0x5074 0x28CB6
+0x5075 0x28DB7
+0x5076 0x28DBE
+0x5077 0x28DC2
+0x5078 0x28DB4
+0x5079 0x28F31
+0x507A 0x28F15
+0x507B 0x28F83
+0x507C 0x2903B
+0x507D 0x29036
+0x507E 0x29042
+0x5121 0x29050
+0x5122 0x29040
+0x5123 0x29034
+0x5124 0x29038
+0x5125 0x2903D
+0x5126 0x2903E
+0x5127 0x29035
+0x5128 0x2903A
+0x5129 0x29046
+0x512A 0x29037
+0x512B 0x29039
+0x512C 0x29045
+0x512D 0x29177
+0x512E 0x2915D
+0x512F 0x2916A
+0x5130 0x29176
+0x5131 0x2916B
+0x5132 0x2916C
+0x5133 0x29165
+0x5134 0x29164
+0x5135 0x29171
+0x5136 0x2915F
+0x5137 0x29172
+0x5138 0x291FE
+0x5139 0x291FF
+0x513A 0x2923E
+0x513B 0x2932B
+0x513C 0x29336
+0x513D 0x2932D
+0x513E 0x29339
+0x513F 0x2933F
+0x5140 0x2933B
+0x5141 0x29333
+0x5142 0x29342
+0x5143 0x2933A
+0x5144 0x293D5
+0x5145 0x293D8
+0x5146 0x293D9
+0x5147 0x2940D
+0x5148 0x2940A
+0x5149 0x29439
+0x514A 0x2943A
+0x514B 0x2953D
+0x514C 0x29545
+0x514D 0x2953A
+0x514E 0x29537
+0x514F 0x2953E
+0x5150 0x29542
+0x5151 0x29787
+0x5152 0x2978C
+0x5153 0x29782
+0x5154 0x2976B
+0x5155 0x297A0
+0x5156 0x2979A
+0x5157 0x29790
+0x5158 0x2978E
+0x5159 0x297A1
+0x515A 0x297BD
+0x515B 0x297B2
+0x515C 0x297B5
+0x515D 0x297B7
+0x515E 0x297AA
+0x515F 0x297A2
+0x5160 0x297A5
+0x5161 0x297AE
+0x5162 0x297AB
+0x5163 0x297BC
+0x5164 0x29832
+0x5165 0x2985A
+0x5166 0x29964
+0x5167 0x2995C
+0x5168 0x2994D
+0x5169 0x2993F
+0x516A 0x2993E
+0x516B 0x29952
+0x516C 0x29958
+0x516D 0x29957
+0x516E 0x2995E
+0x516F 0x29953
+0x5170 0x29954
+0x5171 0x29956
+0x5172 0x28F65
+0x5173 0x29A84
+0x5174 0x29A85
+0x5175 0x29A86
+0x5176 0x29B97
+0x5177 0x29BA1
+0x5178 0x29BA2
+0x517A 0x2FA0A
+0x517B 0x29BA3
+0x517C 0x29BA6
+0x517E 0x29C15
+0x5221 0x29C24
+0x5222 0x29C4A
+0x5223 0x29C49
+0x5224 0x29C48
+0x5225 0x29C4B
+0x5226 0x29D0E
+0x5227 0x29962
+0x5228 0x29D0B
+0x5229 0x29D0A
+0x522A 0x29D08
+0x522B 0x29D06
+0x522C 0x29E43
+0x522D 0x29E47
+0x522E 0x29E3F
+0x522F 0x29E46
+0x5230 0x29E50
+0x5232 0x29E4B
+0x5234 0x29E52
+0x5235 0x2A0D7
+0x5236 0x2A0BF
+0x5237 0x2A0D8
+0x5238 0x2A0E0
+0x5239 0x2A0E7
+0x523A 0x2A0B8
+0x523B 0x2A0D5
+0x523C 0x2A0EF
+0x523D 0x2A0E6
+0x523E 0x2A0E4
+0x523F 0x2A0D4
+0x5240 0x2A0D6
+0x5241 0x2A0EA
+0x5243 0x2A0BB
+0x5244 0x2A0E9
+0x5245 0x2FA10
+0x5246 0x2A26D
+0x5247 0x2A270
+0x5248 0x2A273
+0x5249 0x2A272
+0x524A 0x2A2D4
+0x524B 0x2A2CE
+0x524C 0x2A2D5
+0x524D 0x2A35A
+0x524E 0x2A358
+0x524F 0x2A352
+0x5250 0x2A350
+0x5251 0x2A355
+0x5252 0x2A34E
+0x5253 0x2A34D
+0x5254 0x2A3CB
+0x5255 0x2A3CC
+0x5256 0x2A3CD
+0x5257 0x2A3D1
+0x5258 0x2A458
+0x5259 0x2A463
+0x525A 0x2A45E
+0x525B 0x2A454
+0x525C 0x2A45B
+0x525D 0x2A4E9
+0x525E 0x2A4E7
+0x525F 0x2A4E8
+0x5260 0x2A51D
+0x5261 0x2A567
+0x5262 0x2A55A
+0x5263 0x2A55C
+0x5264 0x2A55B
+0x5265 0x2A561
+0x5266 0x2A5A1
+0x5268 0x2A5A4
+0x5269 0x2A5E9
+0x526A 0x2A5EF
+0x526B 0x2A5E5
+0x526C 0x2A5F5
+0x526D 0x2A5EB
+0x526E 0x2A5ED
+0x526F 0x2A696
+0x5270 0x2A695
+0x5271 0x2A6B3
+0x5272 0x2A6B5
+0x5273 0x2A6B1
+0x5275 0x2044D
+0x5276 0x20624
+0x5277 0x2082B
+0x5278 0x209CF
+0x5279 0x20AC9
+0x527A 0x21136
+0x527B 0x21131
+0x527C 0x21154
+0x527D 0x2113A
+0x527E 0x21138
+0x5321 0x21239
+0x5322 0x21238
+0x5323 0x214F4
+0x5324 0x214F3
+0x5325 0x214F6
+0x5326 0x214FC
+0x5327 0x214F5
+0x5328 0x214F1
+0x5329 0x2169C
+0x532A 0x21918
+0x532B 0x2191A
+0x532C 0x21AFC
+0x532D 0x21AFE
+0x532E 0x21B03
+0x532F 0x21B53
+0x5330 0x21D2B
+0x5331 0x21FC6
+0x5332 0x21FC1
+0x5333 0x2217B
+0x5334 0x22306
+0x5335 0x22449
+0x5336 0x224B8
+0x5337 0x225A3
+0x5338 0x22952
+0x5339 0x2294D
+0x533A 0x2295F
+0x533B 0x2295E
+0x533C 0x22961
+0x533D 0x22A23
+0x533E 0x22E8C
+0x533F 0x22E6F
+0x5340 0x22E75
+0x5341 0x22E74
+0x5342 0x22E71
+0x5343 0x22E70
+0x5344 0x22E6C
+0x5345 0x23126
+0x5346 0x23308
+0x5348 0x237F0
+0x5349 0x237EF
+0x534A 0x237FB
+0x534B 0x23810
+0x534C 0x2380C
+0x534D 0x237F6
+0x534E 0x237FE
+0x534F 0x23A7C
+0x5350 0x23AE1
+0x5351 0x23C38
+0x5352 0x23C6F
+0x5353 0x24118
+0x5354 0x24115
+0x5355 0x2411C
+0x5356 0x24110
+0x5357 0x24135
+0x5358 0x2F917
+0x5359 0x24117
+0x535A 0x2411D
+0x535B 0x24126
+0x535C 0x24128
+0x535D 0x24129
+0x535E 0x2412A
+0x535F 0x2411A
+0x5360 0x2F916
+0x5361 0x22307
+0x5362 0x244AB
+0x5363 0x244AC
+0x5364 0x244A1
+0x5365 0x244AE
+0x5366 0x244A3
+0x5367 0x244A7
+0x5368 0x24548
+0x5369 0x24604
+0x536A 0x246FD
+0x536C 0x24708
+0x536D 0x248D2
+0x536E 0x24AC6
+0x536F 0x24ABE
+0x5370 0x24B1C
+0x5371 0x24BA6
+0x5372 0x24BA7
+0x5373 0x24BAB
+0x5374 0x24C00
+0x5375 0x24CFB
+0x5376 0x24CFC
+0x5377 0x24CF9
+0x5378 0x24D01
+0x5379 0x24F06
+0x537A 0x24F04
+0x537B 0x2F93C
+0x537C 0x25034
+0x537D 0x25336
+0x537E 0x25332
+0x5421 0x25342
+0x5422 0x2532D
+0x5423 0x25335
+0x5424 0x255D8
+0x5425 0x25723
+0x5426 0x25720
+0x5427 0x25901
+0x5428 0x25900
+0x5429 0x25903
+0x542A 0x2A6BC
+0x542B 0x25A3C
+0x542C 0x25A41
+0x542D 0x25A35
+0x542E 0x25AC9
+0x542F 0x25D8E
+0x5430 0x25D9E
+0x5431 0x25D99
+0x5432 0x25DB4
+0x5433 0x25DAA
+0x5434 0x25D9F
+0x5435 0x25D96
+0x5436 0x25D9D
+0x5437 0x25DC3
+0x5438 0x25D74
+0x5439 0x25DAB
+0x543B 0x25F63
+0x543C 0x25F5B
+0x543D 0x25F5A
+0x543E 0x261C5
+0x543F 0x261C4
+0x5440 0x261CF
+0x5441 0x261C8
+0x5442 0x261A4
+0x5443 0x261BD
+0x5444 0x261D3
+0x5445 0x26260
+0x5446 0x2633B
+0x5447 0x263E3
+0x5448 0x263E7
+0x5449 0x264A8
+0x544A 0x264AC
+0x544B 0x264A9
+0x544C 0x2652A
+0x544D 0x26608
+0x544E 0x26609
+0x544F 0x268B9
+0x5450 0x26AC1
+0x5451 0x26AC2
+0x5452 0x26AB8
+0x5453 0x270E1
+0x5454 0x270EB
+0x5455 0x270E5
+0x5456 0x270FA
+0x5457 0x270E4
+0x5458 0x2710B
+0x5459 0x270D7
+0x545A 0x270EF
+0x545B 0x270E0
+0x545C 0x270EC
+0x545D 0x270FB
+0x545E 0x2F9B0
+0x545F 0x270D3
+0x5460 0x270E6
+0x5461 0x270FC
+0x5462 0x270E3
+0x5463 0x270CF
+0x5464 0x270DA
+0x5465 0x270DC
+0x5466 0x270D2
+0x5467 0x270A4
+0x5469 0x27217
+0x546A 0x27216
+0x546B 0x274F2
+0x546C 0x274FC
+0x546D 0x27518
+0x546E 0x274F6
+0x546F 0x274FE
+0x5470 0x274F3
+0x5471 0x274F7
+0x5472 0x27501
+0x5473 0x274F9
+0x5474 0x27506
+0x5475 0x274F5
+0x5476 0x27510
+0x5477 0x274DF
+0x5478 0x27503
+0x5479 0x27508
+0x547A 0x275D8
+0x547B 0x27605
+0x547C 0x27797
+0x547D 0x277B3
+0x547E 0x277AE
+0x5521 0x277AF
+0x5522 0x277A7
+0x5523 0x277B1
+0x5524 0x277A8
+0x5525 0x277AC
+0x5526 0x277AB
+0x5527 0x27804
+0x5528 0x2789A
+0x5529 0x2794A
+0x552A 0x27B42
+0x552B 0x27B58
+0x552C 0x27B4B
+0x552D 0x27B45
+0x552E 0x27B49
+0x552F 0x27B4C
+0x5530 0x27B59
+0x5531 0x27B56
+0x5533 0x27B46
+0x5534 0x27B44
+0x5535 0x27B5B
+0x5536 0x27B69
+0x5537 0x27C8E
+0x5538 0x27C8F
+0x5539 0x27D1E
+0x553A 0x268BC
+0x553B 0x27E2F
+0x553C 0x27F9E
+0x553D 0x27F9D
+0x553E 0x27F9F
+0x553F 0x27F9C
+0x5540 0x281B4
+0x5541 0x281AE
+0x5542 0x281AB
+0x5543 0x281B3
+0x5544 0x281AF
+0x5545 0x281C2
+0x5546 0x28293
+0x5547 0x28295
+0x5548 0x28296
+0x5549 0x28297
+0x554A 0x283CF
+0x554B 0x283CE
+0x554C 0x283CB
+0x554D 0x2844B
+0x554E 0x28646
+0x554F 0x28643
+0x5550 0x28645
+0x5551 0x28651
+0x5552 0x287AE
+0x5553 0x287AF
+0x5554 0x287B0
+0x5555 0x287B8
+0x5556 0x287E2
+0x5557 0x287E3
+0x5558 0x287E6
+0x5559 0x288ED
+0x555A 0x288EA
+0x555B 0x2893A
+0x555C 0x28B59
+0x555D 0x28B84
+0x555E 0x28B5F
+0x555F 0x28B7C
+0x5560 0x28B5C
+0x5561 0x28B58
+0x5562 0x28B55
+0x5563 0x28B5D
+0x5564 0x28B7E
+0x5565 0x28B80
+0x5566 0x28B83
+0x5567 0x28B57
+0x5569 0x28B5E
+0x556A 0x28CBA
+0x556B 0x28DD5
+0x556C 0x28F58
+0x556D 0x28F68
+0x556E 0x28F67
+0x556F 0x2904A
+0x5570 0x2904C
+0x5571 0x29052
+0x5572 0x29049
+0x5573 0x2904E
+0x5574 0x29047
+0x5575 0x2904D
+0x5576 0x2904B
+0x5577 0x2904F
+0x5578 0x2917E
+0x5579 0x29187
+0x557A 0x29183
+0x557B 0x29189
+0x557C 0x24ACA
+0x557D 0x29186
+0x557E 0x29188
+0x5621 0x29247
+0x5622 0x29242
+0x5623 0x29249
+0x5624 0x29248
+0x5628 0x29344
+0x5629 0x29351
+0x562A 0x29346
+0x562B 0x29347
+0x562C 0x293E4
+0x562D 0x2940F
+0x562E 0x2943F
+0x562F 0x2954B
+0x5630 0x29557
+0x5631 0x29552
+0x5633 0x29551
+0x5634 0x29558
+0x5635 0x2955E
+0x5636 0x29553
+0x5637 0x2955D
+0x5638 0x2954D
+0x5639 0x2963C
+0x563A 0x2963F
+0x563B 0x29646
+0x563C 0x2963E
+0x563D 0x29644
+0x563E 0x29645
+0x563F 0x29641
+0x5640 0x29638
+0x5641 0x29642
+0x5642 0x29643
+0x5643 0x2967A
+0x5644 0x297A3
+0x5645 0x297BA
+0x5646 0x297C0
+0x5647 0x297C4
+0x5648 0x297C6
+0x5649 0x297CB
+0x564A 0x29861
+0x564B 0x2997A
+0x564C 0x29973
+0x564D 0x29972
+0x564E 0x29974
+0x564F 0x29980
+0x5650 0x29981
+0x5652 0x29A95
+0x5653 0x29A8F
+0x5654 0x29A90
+0x5655 0x29A92
+0x5656 0x29A94
+0x5657 0x29A8B
+0x5658 0x29AE6
+0x5659 0x29BB2
+0x565A 0x29BB8
+0x565B 0x29BBD
+0x565C 0x29BBE
+0x565D 0x29BCE
+0x565E 0x29BBA
+0x565F 0x29C16
+0x5660 0x29C26
+0x5661 0x29C25
+0x5662 0x29C4C
+0x5663 0x29C50
+0x5664 0x29C4E
+0x5665 0x29C51
+0x5666 0x29C52
+0x5667 0x29D14
+0x5668 0x29D15
+0x5669 0x29D1B
+0x566A 0x29E82
+0x566B 0x29E99
+0x566C 0x29E9A
+0x566D 0x29E7D
+0x566E 0x29E85
+0x566F 0x29E86
+0x5670 0x29E9C
+0x5671 0x29E79
+0x5672 0x29E7B
+0x5673 0x29E80
+0x5674 0x29E83
+0x5675 0x29E81
+0x5676 0x2A11E
+0x5677 0x2A11B
+0x5678 0x2A12A
+0x5679 0x2A0FB
+0x567A 0x2A105
+0x567B 0x2A120
+0x567C 0x2A111
+0x567D 0x2A104
+0x567E 0x2A0FD
+0x5721 0x2A103
+0x5722 0x2A110
+0x5723 0x2A118
+0x5724 0x2A10A
+0x5725 0x2A14E
+0x5726 0x2A109
+0x5727 0x2A107
+0x5728 0x2A11C
+0x572A 0x2A277
+0x572B 0x2A276
+0x572C 0x2A2D8
+0x572D 0x2A2D9
+0x572E 0x2A361
+0x572F 0x2A35C
+0x5730 0x2A35E
+0x5731 0x2A360
+0x5732 0x2A3AA
+0x5733 0x2A3D6
+0x5734 0x2A3D8
+0x5735 0x2A409
+0x5736 0x2A408
+0x5737 0x2A46B
+0x5738 0x2A465
+0x5739 0x2A473
+0x573A 0x2A474
+0x573B 0x2A4ED
+0x573C 0x2A524
+0x573D 0x2A525
+0x573E 0x2A56A
+0x573F 0x2A5A7
+0x5740 0x2A5A8
+0x5741 0x2A60B
+0x5742 0x2A5FA
+0x5743 0x2A5F9
+0x5744 0x2A5FF
+0x5745 0x2A604
+0x5746 0x2A5F6
+0x5747 0x2A605
+0x5748 0x2A699
+0x5749 0x2A6AB
+0x574A 0x2A6BD
+0x574B 0x2A6B8
+0x574D 0x20464
+0x574E 0x2045A
+0x574F 0x20572
+0x5750 0x2097A
+0x5751 0x20B95
+0x5752 0x2115F
+0x5753 0x21161
+0x5754 0x2115E
+0x5755 0x2115A
+0x5756 0x2115C
+0x5757 0x2115D
+0x5758 0x2116E
+0x5759 0x21157
+0x575A 0x21158
+0x575B 0x21502
+0x575C 0x2150B
+0x575D 0x21508
+0x575E 0x21551
+0x575F 0x21925
+0x5760 0x21928
+0x5761 0x21923
+0x5762 0x21921
+0x5763 0x21924
+0x5764 0x21929
+0x5765 0x21B06
+0x5766 0x21B0A
+0x5767 0x21FCA
+0x5768 0x21FCC
+0x5769 0x21FCB
+0x576A 0x21FCF
+0x576B 0x2217F
+0x576C 0x2217C
+0x576D 0x221D6
+0x576E 0x22309
+0x576F 0x2230B
+0x5770 0x22376
+0x5771 0x2247D
+0x5772 0x225A5
+0x5773 0x2295B
+0x5774 0x2295C
+0x5775 0x2295D
+0x5776 0x22965
+0x5777 0x22E6D
+0x5778 0x22E82
+0x5779 0x22E83
+0x577A 0x22E87
+0x577B 0x22E95
+0x577C 0x22E8A
+0x577D 0x230D6
+0x577E 0x23128
+0x5821 0x2330D
+0x5822 0x2382E
+0x5823 0x2F8EE
+0x5824 0x2382D
+0x5825 0x23821
+0x5826 0x23819
+0x5827 0x2393B
+0x5828 0x2393C
+0x5829 0x2393A
+0x582A 0x23A7E
+0x582B 0x23C3B
+0x582C 0x24147
+0x582D 0x24139
+0x582E 0x24134
+0x582F 0x24136
+0x5830 0x24146
+0x5831 0x2413B
+0x5832 0x24141
+0x5833 0x24145
+0x5834 0x244C0
+0x5835 0x244C4
+0x5836 0x244BA
+0x5837 0x244BD
+0x5838 0x244BE
+0x5839 0x245A3
+0x583A 0x2470C
+0x583B 0x248D9
+0x583C 0x24ACD
+0x583D 0x24BAE
+0x583E 0x24CFF
+0x583F 0x24D24
+0x5840 0x24FBB
+0x5841 0x24FBC
+0x5842 0x25036
+0x5843 0x250D5
+0x5844 0x250D3
+0x5845 0x250D6
+0x5846 0x2533C
+0x5847 0x2533F
+0x5848 0x255DE
+0x5849 0x255E3
+0x584A 0x25727
+0x584B 0x25729
+0x584D 0x25905
+0x584E 0x25907
+0x584F 0x2590C
+0x5850 0x25AD0
+0x5851 0x25DBE
+0x5852 0x25DBC
+0x5853 0x25DD0
+0x5854 0x25DC2
+0x5855 0x25DB5
+0x5856 0x25DC9
+0x5857 0x25F66
+0x5859 0x261D5
+0x585A 0x261E2
+0x585B 0x261DC
+0x585C 0x261E3
+0x585D 0x261DA
+0x585E 0x261C2
+0x585F 0x261E8
+0x5860 0x263E9
+0x5861 0x264AF
+0x5862 0x264AD
+0x5863 0x264AE
+0x5864 0x2660B
+0x5865 0x268C1
+0x5866 0x269B6
+0x5867 0x269B9
+0x5868 0x26AC0
+0x5869 0x270A5
+0x586A 0x27128
+0x586B 0x27122
+0x586C 0x27129
+0x586D 0x27118
+0x586E 0x2711F
+0x586F 0x2711C
+0x5870 0x27112
+0x5871 0x2712A
+0x5873 0x27121
+0x5874 0x2712B
+0x5875 0x27117
+0x5876 0x270F0
+0x5877 0x27116
+0x5878 0x27123
+0x5879 0x2752B
+0x587A 0x27526
+0x587B 0x2753D
+0x587C 0x27522
+0x587D 0x2753A
+0x587E 0x27531
+0x5921 0x27532
+0x5922 0x27554
+0x5923 0x27521
+0x5924 0x27535
+0x5926 0x2752E
+0x5927 0x27530
+0x5928 0x2752F
+0x5929 0x27536
+0x592A 0x275DA
+0x592B 0x275D9
+0x592C 0x277BB
+0x592D 0x277BC
+0x592E 0x277B7
+0x592F 0x277C2
+0x5930 0x277BD
+0x5931 0x277B2
+0x5933 0x25344
+0x5934 0x25DD1
+0x5935 0x27B52
+0x5936 0x27B6B
+0x5937 0x27B67
+0x5939 0x27B61
+0x593A 0x27B6C
+0x593B 0x27B51
+0x593C 0x27B74
+0x593D 0x27B77
+0x593E 0x27B6F
+0x593F 0x27B6D
+0x5940 0x27B68
+0x5941 0x2F9D1
+0x5942 0x27B84
+0x5943 0x27C90
+0x5944 0x27C92
+0x5945 0x27C93
+0x5946 0x27D1F
+0x5947 0x27E31
+0x5948 0x27E38
+0x5949 0x27E39
+0x594A 0x27E37
+0x594B 0x27FAB
+0x594C 0x281C3
+0x594D 0x281C8
+0x594E 0x281CB
+0x594F 0x281CF
+0x5950 0x28298
+0x5951 0x283D4
+0x5952 0x283D3
+0x5953 0x283D8
+0x5954 0x283D9
+0x5955 0x283DD
+0x5956 0x283D1
+0x5957 0x283D6
+0x5958 0x2843E
+0x5959 0x28658
+0x595A 0x28657
+0x595B 0x28655
+0x595C 0x287C4
+0x595D 0x287E4
+0x595E 0x288EE
+0x595F 0x288EF
+0x5960 0x288F3
+0x5961 0x288F2
+0x5962 0x288F0
+0x5963 0x28BAB
+0x5964 0x28B9A
+0x5965 0x28BAF
+0x5966 0x28B97
+0x5969 0x28BBF
+0x596A 0x28B94
+0x596B 0x28B93
+0x596C 0x28CBE
+0x596D 0x28CBB
+0x596E 0x28CBC
+0x596F 0x28DD9
+0x5970 0x28F6C
+0x5971 0x29053
+0x5972 0x29054
+0x5973 0x2905B
+0x5974 0x29058
+0x5975 0x29056
+0x5976 0x29057
+0x5977 0x2919F
+0x5978 0x29194
+0x5979 0x29196
+0x597A 0x29197
+0x597B 0x2924A
+0x597C 0x2924B
+0x597D 0x29355
+0x597E 0x2935A
+0x5A21 0x2935E
+0x5A22 0x2935F
+0x5A23 0x29359
+0x5A24 0x2935B
+0x5A25 0x29358
+0x5A26 0x29354
+0x5A27 0x293E8
+0x5A28 0x293EB
+0x5A29 0x293EC
+0x5A2A 0x29413
+0x5A2B 0x29566
+0x5A2C 0x2956B
+0x5A2D 0x29562
+0x5A2E 0x29569
+0x5A2F 0x29563
+0x5A30 0x2955F
+0x5A31 0x2954E
+0x5A32 0x29648
+0x5A33 0x2964A
+0x5A34 0x297E3
+0x5A35 0x297DB
+0x5A36 0x297D8
+0x5A37 0x297D6
+0x5A38 0x29986
+0x5A39 0x29990
+0x5A3A 0x29991
+0x5A3B 0x29988
+0x5A3C 0x29994
+0x5A3D 0x29983
+0x5A3F 0x2999C
+0x5A40 0x2998D
+0x5A41 0x29985
+0x5A42 0x29A98
+0x5A43 0x29A9A
+0x5A44 0x29A9C
+0x5A45 0x29AE7
+0x5A46 0x29BC5
+0x5A47 0x29BD0
+0x5A48 0x29BD1
+0x5A49 0x29C19
+0x5A4A 0x29C27
+0x5A4C 0x29C54
+0x5A4D 0x29D2D
+0x5A4E 0x29D22
+0x5A50 0x29D1F
+0x5A51 0x29EBD
+0x5A52 0x29EAE
+0x5A53 0x29EBB
+0x5A54 0x29EAD
+0x5A55 0x29EBC
+0x5A56 0x29EB9
+0x5A57 0x29EB4
+0x5A58 0x29ECB
+0x5A59 0x29EB7
+0x5A5A 0x29EB3
+0x5A5B 0x29EBA
+0x5A5C 0x29EB6
+0x5A5D 0x29ECD
+0x5A5E 0x29EBE
+0x5A5F 0x29EC9
+0x5A60 0x2FA0B
+0x5A61 0x2A15F
+0x5A62 0x2A13B
+0x5A63 0x2A161
+0x5A64 0x2A15C
+0x5A65 0x2A18A
+0x5A66 0x2A15A
+0x5A67 0x2A14D
+0x5A68 0x2A146
+0x5A69 0x2A144
+0x5A6A 0x2A13D
+0x5A6B 0x2A140
+0x5A6C 0x2A13C
+0x5A6D 0x2A18C
+0x5A6E 0x2A141
+0x5A6F 0x2A14C
+0x5A70 0x2A13E
+0x5A71 0x2A14A
+0x5A72 0x2A27C
+0x5A73 0x2A27A
+0x5A74 0x2A365
+0x5A75 0x2A36E
+0x5A76 0x2A369
+0x5A77 0x2A36A
+0x5A78 0x2A36F
+0x5A79 0x2A36C
+0x5A7A 0x2A370
+0x5A7B 0x2A368
+0x5A7C 0x2A36B
+0x5A7E 0x2A3AC
+0x5B21 0x2A3DE
+0x5B22 0x2A3DD
+0x5B23 0x2A3DC
+0x5B24 0x244C5
+0x5B25 0x2A48C
+0x5B26 0x2A483
+0x5B27 0x2A482
+0x5B28 0x2A488
+0x5B29 0x2A485
+0x5B2A 0x2A481
+0x5B2B 0x2A4F5
+0x5B2C 0x2A4EF
+0x5B2D 0x2A4F4
+0x5B2E 0x2A4F2
+0x5B2F 0x2A4F6
+0x5B30 0x2A4F3
+0x5B31 0x2A4F0
+0x5B32 0x2A4F1
+0x5B33 0x2A52B
+0x5B34 0x2A527
+0x5B35 0x2A528
+0x5B36 0x2A56C
+0x5B37 0x2A5AE
+0x5B38 0x2A60E
+0x5B39 0x2A61B
+0x5B3A 0x2A616
+0x5B3B 0x2A61F
+0x5B3C 0x2A622
+0x5B3D 0x2A620
+0x5B3E 0x2A621
+0x5B3F 0x2A614
+0x5B40 0x2A613
+0x5B41 0x2A69D
+0x5B42 0x2A69C
+0x5B43 0x2A69E
+0x5B44 0x2A69F
+0x5B45 0x2046B
+0x5B46 0x208C8
+0x5B47 0x21178
+0x5B48 0x21176
+0x5B49 0x21170
+0x5B4A 0x21171
+0x5B4B 0x2150A
+0x5B4C 0x2192C
+0x5B4D 0x22311
+0x5B4E 0x2247E
+0x5B4F 0x22957
+0x5B50 0x22966
+0x5B51 0x22969
+0x5B52 0x22967
+0x5B53 0x22968
+0x5B54 0x22971
+0x5B55 0x2296F
+0x5B56 0x2A3AE
+0x5B57 0x22E8B
+0x5B58 0x22E96
+0x5B59 0x23035
+0x5B5A 0x2303A
+0x5B5B 0x2306B
+0x5B5C 0x23316
+0x5B5D 0x23843
+0x5B5E 0x23846
+0x5B5F 0x2383F
+0x5B60 0x2383B
+0x5B61 0x2383D
+0x5B62 0x239B1
+0x5B63 0x239B2
+0x5B64 0x23AE4
+0x5B65 0x23C40
+0x5B66 0x2415D
+0x5B67 0x24151
+0x5B68 0x2414D
+0x5B69 0x2414C
+0x5B6A 0x2415B
+0x5B6B 0x244D4
+0x5B6C 0x244D2
+0x5B6D 0x244CA
+0x5B6E 0x244C8
+0x5B6F 0x244D0
+0x5B70 0x244C9
+0x5B71 0x24549
+0x5B72 0x245A4
+0x5B73 0x24712
+0x5B74 0x2470F
+0x5B75 0x24711
+0x5B76 0x248DB
+0x5B77 0x248DD
+0x5B78 0x248DC
+0x5B79 0x24AD4
+0x5B7A 0x24B21
+0x5B7B 0x24BB2
+0x5B7C 0x24D04
+0x5B7D 0x24D02
+0x5B7E 0x24F11
+0x5C21 0x24F16
+0x5C22 0x24F10
+0x5C23 0x24FBE
+0x5C24 0x2721A
+0x5C25 0x2534C
+0x5C26 0x2534A
+0x5C27 0x255F2
+0x5C28 0x255F1
+0x5C29 0x2572A
+0x5C2A 0x2572C
+0x5C2B 0x2572F
+0x5C2C 0x25731
+0x5C2D 0x25911
+0x5C2E 0x25912
+0x5C2F 0x25A4B
+0x5C30 0x25DDB
+0x5C31 0x25DD6
+0x5C32 0x25DDD
+0x5C33 0x25DE2
+0x5C34 0x25DE4
+0x5C35 0x25DE0
+0x5C36 0x25DDF
+0x5C37 0x25DE3
+0x5C38 0x25F6E
+0x5C39 0x25F71
+0x5C3A 0x261E9
+0x5C3B 0x261EA
+0x5C3C 0x26263
+0x5C3D 0x263EB
+0x5C3E 0x263EA
+0x5C3F 0x268BD
+0x5C40 0x268BB
+0x5C41 0x268C6
+0x5C42 0x268CC
+0x5C43 0x268C8
+0x5C44 0x244CF
+0x5C45 0x268C9
+0x5C46 0x268CA
+0x5C47 0x268CF
+0x5C48 0x268D0
+0x5C49 0x269BA
+0x5C4A 0x269FB
+0x5C4B 0x26A03
+0x5C4C 0x26AC4
+0x5C4D 0x27149
+0x5C4E 0x27153
+0x5C4F 0x27136
+0x5C50 0x2714A
+0x5C51 0x27141
+0x5C52 0x2714E
+0x5C53 0x27119
+0x5C54 0x2714D
+0x5C55 0x27145
+0x5C56 0x2714C
+0x5C57 0x27147
+0x5C58 0x27148
+0x5C59 0x2714F
+0x5C5A 0x27137
+0x5C5B 0x27142
+0x5C5C 0x2754A
+0x5C5D 0x27546
+0x5C5F 0x27549
+0x5C60 0x2754F
+0x5C61 0x27551
+0x5C62 0x2754C
+0x5C64 0x27606
+0x5C65 0x27951
+0x5C66 0x27B7A
+0x5C67 0x27B83
+0x5C68 0x27B7E
+0x5C69 0x27B7F
+0x5C6A 0x27B80
+0x5C6B 0x24BB5
+0x5C6C 0x27C91
+0x5C6D 0x27C94
+0x5C6E 0x27C95
+0x5C6F 0x27D21
+0x5C70 0x27D20
+0x5C71 0x27E3D
+0x5C72 0x27E40
+0x5C73 0x27E46
+0x5C74 0x27E84
+0x5C75 0x27FAC
+0x5C76 0x27FAD
+0x5C78 0x281DA
+0x5C79 0x281D9
+0x5C7A 0x283E2
+0x5C7B 0x283E1
+0x5C7C 0x283E3
+0x5C7D 0x283E4
+0x5C7E 0x283DE
+0x5D21 0x283DF
+0x5D22 0x28641
+0x5D23 0x28659
+0x5D24 0x2865C
+0x5D25 0x2865A
+0x5D26 0x287E8
+0x5D27 0x288F6
+0x5D28 0x288FC
+0x5D29 0x288F7
+0x5D2A 0x288FA
+0x5D2B 0x288F9
+0x5D2C 0x28BC4
+0x5D2D 0x28BBE
+0x5D2E 0x28BD2
+0x5D2F 0x28BBD
+0x5D30 0x28B95
+0x5D31 0x28BD4
+0x5D32 0x28DE4
+0x5D33 0x29061
+0x5D34 0x29062
+0x5D35 0x29063
+0x5D36 0x29064
+0x5D37 0x29060
+0x5D38 0x2905C
+0x5D39 0x2905D
+0x5D3A 0x2905E
+0x5D3B 0x291A5
+0x5D3C 0x291A6
+0x5D3D 0x2924C
+0x5D3E 0x29368
+0x5D3F 0x2936E
+0x5D40 0x29371
+0x5D41 0x2936B
+0x5D42 0x2936F
+0x5D43 0x293EE
+0x5D44 0x293F1
+0x5D45 0x293F0
+0x5D46 0x293EF
+0x5D47 0x29415
+0x5D48 0x29414
+0x5D49 0x28F6E
+0x5D4A 0x29447
+0x5D4B 0x2957C
+0x5D4C 0x2957A
+0x5D4D 0x29574
+0x5D4E 0x29576
+0x5D4F 0x2956E
+0x5D50 0x29578
+0x5D51 0x2956D
+0x5D52 0x2956C
+0x5D53 0x2964E
+0x5D54 0x297D7
+0x5D55 0x297EA
+0x5D56 0x297E5
+0x5D57 0x29864
+0x5D58 0x299B3
+0x5D59 0x299A3
+0x5D5A 0x299A5
+0x5D5B 0x299A7
+0x5D5C 0x299A2
+0x5D5D 0x2999F
+0x5D5E 0x299A6
+0x5D5F 0x2999E
+0x5D60 0x299A8
+0x5D61 0x29AA9
+0x5D62 0x29AA6
+0x5D63 0x29AAA
+0x5D64 0x29AAB
+0x5D65 0x29AA0
+0x5D66 0x29AA1
+0x5D67 0x29AA8
+0x5D68 0x29AE8
+0x5D69 0x29AE9
+0x5D6A 0x29AEA
+0x5D6B 0x29BE4
+0x5D6C 0x29BDF
+0x5D6D 0x29BE0
+0x5D6E 0x29C28
+0x5D6F 0x29C5D
+0x5D70 0x29C5B
+0x5D71 0x29C56
+0x5D72 0x29C57
+0x5D73 0x29C5F
+0x5D74 0x29C62
+0x5D75 0x29EE1
+0x5D76 0x29EE3
+0x5D77 0x29EDE
+0x5D78 0x29ED9
+0x5D79 0x29EE8
+0x5D7A 0x29EF2
+0x5D7B 0x29EF6
+0x5D7C 0x29EE6
+0x5D7D 0x29EF4
+0x5D7E 0x29EF5
+0x5E21 0x29EE5
+0x5E22 0x29EE2
+0x5E24 0x2A196
+0x5E25 0x2A1AA
+0x5E26 0x2A197
+0x5E27 0x2A170
+0x5E28 0x2A1A1
+0x5E29 0x2A19D
+0x5E2A 0x2A1A9
+0x5E2B 0x2A16F
+0x5E2C 0x2A17E
+0x5E2D 0x2A194
+0x5E2E 0x2A19A
+0x5E2F 0x2A173
+0x5E30 0x2A187
+0x5E31 0x2A171
+0x5E32 0x2A177
+0x5E33 0x2A188
+0x5E34 0x2A18D
+0x5E35 0x2A185
+0x5E36 0x2A178
+0x5E37 0x2A1AD
+0x5E38 0x2A280
+0x5E39 0x2A281
+0x5E3A 0x2A2E5
+0x5E3B 0x2A2E7
+0x5E3C 0x2A37C
+0x5E3D 0x2A3AF
+0x5E3E 0x2A3E1
+0x5E3F 0x2A496
+0x5E40 0x2A4A3
+0x5E41 0x2A490
+0x5E42 0x2A4F8
+0x5E43 0x2A52E
+0x5E44 0x2A575
+0x5E45 0x2A57E
+0x5E46 0x2A57D
+0x5E47 0x2A57B
+0x5E48 0x2A578
+0x5E49 0x2A5B0
+0x5E4A 0x2A634
+0x5E4B 0x2A636
+0x5E4C 0x2A630
+0x5E4D 0x2FA1D
+0x5E4E 0x2A62E
+0x5E4F 0x2A637
+0x5E50 0x20ACE
+0x5E51 0x20B97
+0x5E52 0x20B98
+0x5E53 0x2117C
+0x5E54 0x2117E
+0x5E55 0x2117D
+0x5E56 0x2117F
+0x5E57 0x2150F
+0x5E58 0x216A4
+0x5E59 0x21931
+0x5E5A 0x2192E
+0x5E5B 0x2192F
+0x5E5C 0x21932
+0x5E5D 0x21D2C
+0x5E5E 0x21FD4
+0x5E5F 0x21FDC
+0x5E60 0x21FD8
+0x5E61 0x2200E
+0x5E62 0x22183
+0x5E63 0x22184
+0x5E64 0x22312
+0x5E65 0x22972
+0x5E66 0x2297C
+0x5E67 0x2297E
+0x5E68 0x22EA6
+0x5E69 0x22EA0
+0x5E6A 0x22E9E
+0x5E6B 0x22EA2
+0x5E6C 0x2312A
+0x5E6D 0x23318
+0x5E6E 0x2384D
+0x5E6F 0x23858
+0x5E70 0x2385B
+0x5E71 0x25914
+0x5E72 0x2F8F2
+0x5E73 0x23AE6
+0x5E74 0x24164
+0x5E75 0x24168
+0x5E76 0x24160
+0x5E77 0x24162
+0x5E78 0x244D7
+0x5E79 0x2454B
+0x5E7A 0x248E0
+0x5E7B 0x24B22
+0x5E7C 0x24D05
+0x5E7D 0x24F19
+0x5E7E 0x24F1A
+0x5F21 0x24FC3
+0x5F22 0x250D8
+0x5F23 0x250DC
+0x5F24 0x2534F
+0x5F25 0x255F7
+0x5F26 0x255F4
+0x5F27 0x255F8
+0x5F28 0x25913
+0x5F29 0x25A50
+0x5F2A 0x25DF0
+0x5F2B 0x25DE9
+0x5F2C 0x25DEF
+0x5F2D 0x25DED
+0x5F2E 0x25DEA
+0x5F2F 0x25DF8
+0x5F30 0x25E05
+0x5F31 0x25DF2
+0x5F32 0x25F72
+0x5F34 0x261F9
+0x5F35 0x261F3
+0x5F36 0x261F6
+0x5F37 0x261F2
+0x5F38 0x261F7
+0x5F39 0x26266
+0x5F3A 0x26265
+0x5F3B 0x26340
+0x5F3C 0x2F977
+0x5F3D 0x268D1
+0x5F3E 0x268D3
+0x5F3F 0x26A04
+0x5F40 0x27159
+0x5F41 0x27160
+0x5F42 0x2715B
+0x5F43 0x2715D
+0x5F44 0x2715E
+0x5F45 0x27169
+0x5F46 0x2715C
+0x5F47 0x27161
+0x5F48 0x2716A
+0x5F49 0x2715F
+0x5F4A 0x2754E
+0x5F4B 0x2755C
+0x5F4C 0x27560
+0x5F4D 0x27563
+0x5F4E 0x275DB
+0x5F4F 0x277CA
+0x5F50 0x277C9
+0x5F51 0x277C8
+0x5F52 0x278A5
+0x5F53 0x278A3
+0x5F54 0x27B8E
+0x5F55 0x27B87
+0x5F56 0x27B89
+0x5F57 0x27B85
+0x5F58 0x27B86
+0x5F59 0x27B8F
+0x5F5A 0x27B8A
+0x5F5B 0x27B90
+0x5F5C 0x27C98
+0x5F5D 0x27C9B
+0x5F5E 0x27E47
+0x5F5F 0x27E49
+0x5F60 0x27E48
+0x5F61 0x281E5
+0x5F62 0x281EA
+0x5F63 0x281ED
+0x5F64 0x283F0
+0x5F65 0x283EF
+0x5F66 0x283F2
+0x5F67 0x283EC
+0x5F68 0x28440
+0x5F69 0x28660
+0x5F6A 0x2865F
+0x5F6B 0x287EB
+0x5F6C 0x287EC
+0x5F6D 0x28900
+0x5F6E 0x28901
+0x5F6F 0x28BE2
+0x5F70 0x28BDF
+0x5F71 0x28BE0
+0x5F72 0x28BE1
+0x5F73 0x28BE3
+0x5F74 0x28CC3
+0x5F75 0x28DEB
+0x5F76 0x28DEA
+0x5F77 0x28F61
+0x5F78 0x28F71
+0x5F79 0x2906B
+0x5F7A 0x29068
+0x5F7B 0x29069
+0x5F7C 0x29067
+0x5F7D 0x291B0
+0x5F7E 0x291B1
+0x6021 0x291B2
+0x6022 0x29251
+0x6023 0x29374
+0x6024 0x2957F
+0x6025 0x29584
+0x6026 0x29653
+0x6027 0x29654
+0x6028 0x297F0
+0x6029 0x297F4
+0x602A 0x297F1
+0x602B 0x29837
+0x602C 0x299BF
+0x602F 0x299BD
+0x6030 0x299BE
+0x6031 0x299B7
+0x6032 0x299C0
+0x6033 0x299BA
+0x6034 0x299B8
+0x6035 0x299BC
+0x6036 0x299BB
+0x6037 0x29AEB
+0x6038 0x29BE7
+0x6039 0x29C1D
+0x603A 0x29C1C
+0x603B 0x29C63
+0x603C 0x2244B
+0x603D 0x29D38
+0x603E 0x29D36
+0x603F 0x29D34
+0x6040 0x29D37
+0x6041 0x29F06
+0x6042 0x29F1C
+0x6043 0x29F02
+0x6044 0x29F1D
+0x6045 0x29F1E
+0x6046 0x29EE0
+0x6047 0x29F11
+0x6048 0x29F18
+0x6049 0x29F21
+0x604A 0x29F20
+0x604B 0x29F10
+0x604C 0x2A1BD
+0x604D 0x2A1AE
+0x604E 0x2A1B5
+0x604F 0x2A1B8
+0x6050 0x2A1B9
+0x6051 0x2A1BE
+0x6052 0x2A1C4
+0x6053 0x2A1BC
+0x6054 0x2A1BA
+0x6055 0x2A283
+0x6056 0x2A2EA
+0x6057 0x2A2EC
+0x6058 0x2A37E
+0x6059 0x2A37B
+0x605A 0x2A3E5
+0x605B 0x2A4A7
+0x605C 0x2A49E
+0x605D 0x2A49A
+0x605E 0x2A52F
+0x605F 0x2A531
+0x6060 0x2A583
+0x6061 0x2A5B5
+0x6062 0x2A646
+0x6063 0x2A641
+0x6064 0x2A643
+0x6065 0x2A63D
+0x6066 0x2A642
+0x6067 0x2A63B
+0x6068 0x2A647
+0x6069 0x2096B
+0x606A 0x209D0
+0x606B 0x2118E
+0x606C 0x21B11
+0x606D 0x2F871
+0x606E 0x2F889
+0x606F 0x2244C
+0x6070 0x2312B
+0x6071 0x2384F
+0x6072 0x2385E
+0x6073 0x23863
+0x6074 0x2386B
+0x6075 0x2393F
+0x6076 0x23AE9
+0x6077 0x2416D
+0x6078 0x2416B
+0x6079 0x2416A
+0x607A 0x29F2A
+0x607B 0x244E0
+0x607C 0x244DD
+0x607D 0x244E1
+0x607E 0x244DE
+0x6121 0x244DC
+0x6122 0x2454D
+0x6123 0x24716
+0x6124 0x248E3
+0x6125 0x24AE5
+0x6126 0x24AE4
+0x6127 0x24F1D
+0x6128 0x2574B
+0x6129 0x2A6C1
+0x612A 0x25A4E
+0x612B 0x25AD6
+0x612C 0x25DFD
+0x612D 0x25E07
+0x612E 0x25DFE
+0x612F 0x25E03
+0x6130 0x25E0B
+0x6131 0x25DFF
+0x6132 0x25F7A
+0x6133 0x25F77
+0x6134 0x261FB
+0x6135 0x26343
+0x6136 0x263ED
+0x6137 0x269BC
+0x6138 0x244DF
+0x6139 0x26A05
+0x613A 0x26AC6
+0x613B 0x26AC5
+0x613C 0x27174
+0x613D 0x27173
+0x613E 0x27172
+0x613F 0x27178
+0x6140 0x27573
+0x6141 0x2757A
+0x6142 0x24F1C
+0x6143 0x27576
+0x6144 0x27575
+0x6145 0x27577
+0x6146 0x277CF
+0x6147 0x277CE
+0x6148 0x277CD
+0x6149 0x278A8
+0x614A 0x27B98
+0x614B 0x27B92
+0x614C 0x27B94
+0x614D 0x27C9A
+0x614E 0x27FB4
+0x614F 0x281EB
+0x6150 0x281F4
+0x6151 0x281F3
+0x6152 0x281EE
+0x6153 0x281F2
+0x6154 0x281F0
+0x6155 0x28664
+0x6156 0x28C05
+0x6157 0x28BFB
+0x6158 0x28BFC
+0x6159 0x28DF3
+0x615A 0x2906C
+0x615B 0x291BA
+0x615C 0x29379
+0x615D 0x2937E
+0x615E 0x29378
+0x615F 0x293F4
+0x6160 0x29416
+0x6161 0x29657
+0x6162 0x299C8
+0x6163 0x299C3
+0x6164 0x299CE
+0x6165 0x29AB3
+0x6166 0x29AED
+0x6167 0x29AEE
+0x6168 0x29BF1
+0x6169 0x29BF8
+0x616B 0x29C64
+0x616C 0x29C65
+0x616D 0x29F35
+0x616E 0x29F29
+0x616F 0x29F2C
+0x6170 0x29F31
+0x6171 0x29F2B
+0x6172 0x29F2E
+0x6173 0x29F25
+0x6174 0x2A1DA
+0x6175 0x2A1E0
+0x6176 0x2A1D4
+0x6177 0x2A1E1
+0x6178 0x2A1DD
+0x6179 0x2A3E7
+0x617A 0x2A412
+0x617B 0x2A4AE
+0x617C 0x2A4AF
+0x617D 0x2A586
+0x617E 0x2A585
+0x6221 0x2A5D1
+0x6222 0x2A658
+0x6223 0x2A63F
+0x6224 0x2A652
+0x6225 0x2A64B
+0x6226 0x2A653
+0x6227 0x2A650
+0x6228 0x2A656
+0x6229 0x2A657
+0x622A 0x2A6CD
+0x622B 0x2A6CB
+0x622C 0x20831
+0x622D 0x20830
+0x622E 0x209D1
+0x6230 0x21192
+0x6231 0x21190
+0x6232 0x2118F
+0x6233 0x21193
+0x6234 0x21191
+0x6236 0x22313
+0x6237 0x2247F
+0x6238 0x22EAC
+0x6239 0x24170
+0x623A 0x244E5
+0x623B 0x24B23
+0x623C 0x24B24
+0x623D 0x24D08
+0x623E 0x24D07
+0x623F 0x24F1F
+0x6240 0x24F20
+0x6241 0x24F21
+0x6242 0x250E1
+0x6243 0x25354
+0x6244 0x25357
+0x6245 0x25355
+0x6246 0x255FA
+0x6247 0x25738
+0x6248 0x27186
+0x6249 0x25737
+0x624A 0x25A53
+0x624B 0x25F7E
+0x624C 0x25F7B
+0x624D 0x2F971
+0x624E 0x261FD
+0x624F 0x261FC
+0x6250 0x26346
+0x6251 0x26932
+0x6252 0x26AC7
+0x6253 0x27171
+0x6254 0x27183
+0x6255 0x2716F
+0x6256 0x2717E
+0x6257 0x2717D
+0x6258 0x27181
+0x6259 0x2717C
+0x625A 0x2758A
+0x625B 0x2757E
+0x625C 0x27580
+0x625D 0x2757D
+0x625E 0x2757F
+0x625F 0x27582
+0x6260 0x277D4
+0x6261 0x277D0
+0x6262 0x277D2
+0x6263 0x27955
+0x6264 0x27B9B
+0x6265 0x27B9A
+0x6266 0x27E4E
+0x6267 0x281F1
+0x6268 0x283F8
+0x6269 0x283FD
+0x626A 0x2865E
+0x626B 0x28666
+0x626C 0x28905
+0x626D 0x28C0A
+0x626E 0x28C0B
+0x626F 0x28C0E
+0x6270 0x28C0D
+0x6271 0x28C11
+0x6272 0x28C09
+0x6273 0x28C10
+0x6274 0x28C0C
+0x6275 0x28C12
+0x6276 0x28CC4
+0x6277 0x28DF7
+0x6278 0x28DF8
+0x6279 0x28F6A
+0x627A 0x28F6B
+0x627B 0x291C0
+0x627C 0x291C2
+0x627D 0x29385
+0x627E 0x29380
+0x6321 0x29384
+0x6322 0x29381
+0x6323 0x291C4
+0x6324 0x2958B
+0x6325 0x2958D
+0x6326 0x2958E
+0x6327 0x29AB7
+0x6328 0x29AB9
+0x6329 0x29AEF
+0x632A 0x29BFB
+0x632B 0x29BFF
+0x632C 0x29C67
+0x632D 0x29C68
+0x632E 0x29C69
+0x632F 0x29D3F
+0x6330 0x29F3C
+0x6331 0x29F4C
+0x6332 0x29F3D
+0x6333 0x29F3E
+0x6334 0x29F3F
+0x6335 0x29F3B
+0x6336 0x2A1FF
+0x6338 0x2A1F6
+0x6339 0x2A1EE
+0x633A 0x2A1FC
+0x633B 0x2A1F8
+0x633C 0x2A201
+0x633D 0x2A1FA
+0x633E 0x2A288
+0x633F 0x2A380
+0x6340 0x2A411
+0x6341 0x2A4FE
+0x6342 0x2A500
+0x6343 0x2A535
+0x6344 0x2503C
+0x6345 0x2A5BD
+0x6346 0x2A5BB
+0x6347 0x2A65C
+0x6348 0x2A65A
+0x6349 0x2A6D1
+0x634A 0x2A6D0
+0x634B 0x20A0B
+0x634C 0x23873
+0x634D 0x21939
+0x634E 0x21B1A
+0x634F 0x21FE3
+0x6350 0x22187
+0x6351 0x22377
+0x6352 0x22378
+0x6353 0x22EB1
+0x6354 0x2386A
+0x6355 0x23874
+0x6356 0x23AEB
+0x6357 0x2417B
+0x6358 0x245A5
+0x6359 0x248E4
+0x635A 0x24D0B
+0x635B 0x24D0E
+0x635C 0x24D0C
+0x635D 0x25739
+0x635E 0x25E10
+0x635F 0x25E11
+0x6360 0x25E16
+0x6361 0x25F81
+0x6362 0x25F80
+0x6363 0x261FE
+0x6364 0x26201
+0x6365 0x26200
+0x6366 0x26347
+0x6367 0x263EF
+0x6368 0x27188
+0x6369 0x2758B
+0x636A 0x2758D
+0x636B 0x27587
+0x636C 0x27585
+0x636D 0x2758F
+0x636E 0x27584
+0x636F 0x27588
+0x6370 0x2758E
+0x6371 0x2758C
+0x6372 0x277D7
+0x6373 0x277D6
+0x6374 0x27B9F
+0x6375 0x22188
+0x6376 0x28203
+0x6377 0x283FE
+0x6378 0x287EF
+0x6379 0x28909
+0x637A 0x28908
+0x637B 0x28C20
+0x637C 0x28C24
+0x637D 0x28C1F
+0x637E 0x29070
+0x6421 0x29256
+0x6422 0x293F7
+0x6423 0x293F8
+0x6424 0x293F6
+0x6425 0x29590
+0x6426 0x2965E
+0x6427 0x297F7
+0x6428 0x299D6
+0x6429 0x299D5
+0x642A 0x29ABB
+0x642B 0x29AF0
+0x642C 0x29C01
+0x642D 0x29C6C
+0x642E 0x29D41
+0x642F 0x29D42
+0x6430 0x29F4F
+0x6431 0x29F53
+0x6432 0x29F58
+0x6433 0x2A212
+0x6434 0x2A204
+0x6435 0x2A213
+0x6436 0x2A205
+0x6437 0x2A20D
+0x6438 0x2A382
+0x6439 0x2A381
+0x643A 0x2A4B5
+0x643B 0x2A4BA
+0x643C 0x2A5BE
+0x643D 0x2A665
+0x643E 0x2A663
+0x643F 0x2A66E
+0x6440 0x2A66A
+0x6441 0x2A66C
+0x6442 0x2A6C4
+0x6443 0x2096C
+0x6444 0x27BA5
+0x6445 0x21B12
+0x6446 0x2244D
+0x6447 0x2331F
+0x6448 0x23877
+0x6449 0x23878
+0x644A 0x23C44
+0x644B 0x2417C
+0x644C 0x244EB
+0x644D 0x244EA
+0x644E 0x244EC
+0x644F 0x245A7
+0x6450 0x24719
+0x6451 0x24F23
+0x6453 0x25601
+0x6454 0x25E1C
+0x6455 0x26203
+0x6456 0x26348
+0x6457 0x268DA
+0x6458 0x27191
+0x6459 0x27192
+0x645A 0x27596
+0x645B 0x27597
+0x645C 0x27591
+0x645D 0x27593
+0x645E 0x277D8
+0x645F 0x277D5
+0x6460 0x27957
+0x6461 0x27958
+0x6462 0x27BA2
+0x6463 0x28205
+0x6464 0x283FA
+0x6465 0x2890C
+0x6466 0x2890A
+0x6467 0x28C2E
+0x6468 0x28C29
+0x6469 0x28C2F
+0x646A 0x28CC5
+0x646B 0x29072
+0x646C 0x291C8
+0x646D 0x2925A
+0x646E 0x29259
+0x646F 0x29389
+0x6470 0x29388
+0x6471 0x299DB
+0x6472 0x299D9
+0x6473 0x299DA
+0x6474 0x29ABC
+0x6476 0x29C06
+0x6477 0x29C05
+0x6478 0x29C6F
+0x6479 0x29C6D
+0x647A 0x29C70
+0x647B 0x29F60
+0x647C 0x29F5E
+0x647D 0x29F63
+0x647E 0x29F5A
+0x6521 0x29F5F
+0x6522 0x2A219
+0x6523 0x2A21D
+0x6524 0x2A21B
+0x6525 0x2A222
+0x6526 0x2A21C
+0x6527 0x2A21E
+0x6528 0x2A2F7
+0x6529 0x2A384
+0x652A 0x2A415
+0x652B 0x2A4B8
+0x652C 0x2A4C1
+0x652D 0x2A501
+0x652E 0x2A50A
+0x652F 0x2A5D2
+0x6530 0x2A675
+0x6531 0x2A674
+0x6532 0x2A672
+0x6533 0x20AD0
+0x6534 0x21B1B
+0x6535 0x22010
+0x6536 0x22379
+0x6537 0x244ED
+0x6538 0x24BB9
+0x6539 0x24F24
+0x653A 0x24FC5
+0x653B 0x25603
+0x653C 0x2634A
+0x653D 0x268F7
+0x653E 0x269C1
+0x653F 0x269C2
+0x6540 0x27194
+0x6541 0x27599
+0x6542 0x2759A
+0x6543 0x2795A
+0x6544 0x27BA8
+0x6545 0x27C25
+0x6546 0x27C9E
+0x6547 0x28441
+0x6548 0x28C32
+0x6549 0x28C33
+0x654A 0x291CB
+0x654B 0x291CA
+0x654C 0x291CC
+0x654D 0x29593
+0x654E 0x299E0
+0x654F 0x29C71
+0x6550 0x29F6B
+0x6551 0x2A22B
+0x6552 0x2A229
+0x6553 0x2A21A
+0x6554 0x2A226
+0x6555 0x2A227
+0x6556 0x2A22A
+0x6557 0x2A2F8
+0x6558 0x2503D
+0x6559 0x2A676
+0x655A 0x21518
+0x655B 0x2387A
+0x655C 0x2417F
+0x655E 0x263F0
+0x655F 0x2719A
+0x6560 0x27196
+0x6561 0x2759E
+0x6562 0x2759D
+0x6563 0x275DC
+0x6564 0x277DA
+0x6565 0x2820B
+0x6566 0x28402
+0x6567 0x28442
+0x6568 0x28667
+0x6569 0x2938B
+0x656A 0x299E2
+0x656B 0x29F71
+0x656C 0x2A22F
+0x656D 0x2A22E
+0x656E 0x2A4C6
+0x656F 0x2A58E
+0x6570 0x2A67B
+0x6571 0x2A677
+0x6572 0x2A678
+0x6573 0x2A67C
+0x6574 0x2387C
+0x6575 0x26207
+0x6576 0x27197
+0x6577 0x27BD9
+0x6578 0x2890D
+0x6579 0x2890E
+0x657A 0x299E3
+0x657B 0x299E4
+0x657C 0x29AF3
+0x657D 0x29C75
+0x657E 0x2A237
+0x6621 0x2A235
+0x6622 0x2A58F
+0x6623 0x2A680
+0x6624 0x2A67F
+0x6625 0x2A6D4
+0x6626 0x22EB4
+0x6627 0x2A3EC
+0x6628 0x28F75
+0x6629 0x24D10
+0x662A 0x26269
+0x662B 0x275A4
+0x662C 0x277DB
+0x662D 0x291D1
+0x662E 0x2938D
+0x662F 0x29F76
+0x6630 0x2A239
+0x6631 0x2A684
+0x6632 0x2A682
+0x6633 0x20AD2
+0x6634 0x244EE
+0x6635 0x24D11
+0x6636 0x25F84
+0x6637 0x28F74
+0x6638 0x2938F
+0x6639 0x2938E
+0x663A 0x2A23B
+0x663B 0x208CB
+0x663C 0x2A688
+0x663D 0x2A686
+0x663E 0x2335C
+0x663F 0x253A4
+0x6640 0x29075
+0x6641 0x2A68B
+0x6642 0x21519
+0x6643 0x27C9F
+0x6644 0x299E5
+0x6645 0x2A240
+0x6646 0x24D12
+0x6647 0x2A2FB
+0x6648 0x2A68C
+0x6649 0x253A5
+0x664A 0x29C77
+0x664B 0x29C78
+0x664C 0x2A6D6
+0x664D 0x277DF
+0x664E 0x291D2
+0x664F 0x2151A
+0x6650 0x27BA9
+0x6651 0x291D3
+0x6652 0x2A4CA
+0x6653 0x269C4
+0x6654 0x278B1
+0x6655 0x29664
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/SurrogateTestHKSCS.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,1191 @@
+/*
+ * 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 4750497
+   @summary Check surrogate coverage of Big5-HKSCS (2001)
+ */
+
+/*
+ * Tests the HKSCS converter. Supplements the test for BMP
+ * mappings (and compatibility char->byte mappings) provided
+ * via ./test/sun/io/Converter/Big5-HKSCS.b2c and
+ * ./test/sun/io/Converter/Big5-HKSCS.c2b-irreversible
+ *
+ * Mappings available at :
+ * http://www.info.gov.hk/digital21/eng/hkscs/download.html
+ *
+ */
+
+import java.io.*;
+public class SurrogateTestHKSCS {
+
+    /**
+     * int array holding the supplementary character
+     * values (encoded as ints below) for full set of 1651
+     * supplementary chars / surrogate pairs which should
+     * be round-trip mappable within Big5-HKSCS 2001
+     *
+     */
+
+    static int[] suppValues = {
+        0x20021, 0x2003E, 0x20046, 0x2004E, 0x20068, 0x20086,
+        0x20087, 0x2008A, 0x20094, 0x200CA, 0x200CB, 0x200CC,
+        0x200CD, 0x200D1, 0x200EE, 0x2010C, 0x2010E, 0x20118,
+        0x201A9, 0x201AB, 0x201C1, 0x201D4, 0x201F2, 0x20204,
+        0x2020C, 0x20214, 0x2025B, 0x20274, 0x20275, 0x20299,
+        0x2029E, 0x202A0, 0x202B7, 0x202BF, 0x202C0, 0x202E5,
+        0x2030A, 0x20325, 0x20341, 0x20345, 0x20346, 0x20347,
+        0x2037E, 0x2037F, 0x20380, 0x203A0, 0x203A7, 0x203B5,
+        0x203C9, 0x203CB, 0x203F5, 0x203FC, 0x20413, 0x20414,
+        0x2041F, 0x20465, 0x20487, 0x2048E, 0x20491, 0x20492,
+        0x204A3, 0x204D7, 0x204FC, 0x204FE, 0x20547, 0x2058E,
+        0x205A5, 0x205B3, 0x205C3, 0x205CA, 0x205D0, 0x205D5,
+        0x205DF, 0x205E0, 0x205EB, 0x20611, 0x20615, 0x20619,
+        0x2061A, 0x20630, 0x20656, 0x20676, 0x2070E, 0x20731,
+        0x20779, 0x2082C, 0x20873, 0x208D5, 0x20916, 0x20923,
+        0x20954, 0x20979, 0x209E7, 0x20A11, 0x20A50, 0x20AB4,
+        0x20AC2, 0x20ACD, 0x20B0D, 0x20B8F, 0x20BA8, 0x20BA9,
+        0x20BBF, 0x20BC6, 0x20BCB, 0x20BE2, 0x20BEB, 0x20BFB,
+        0x20BFF, 0x20C0B, 0x20C0D, 0x20C20, 0x20C34, 0x20C3A,
+        0x20C3B, 0x20C41, 0x20C42, 0x20C43, 0x20C53, 0x20C65,
+        0x20C77, 0x20C78, 0x20C7C, 0x20C8D, 0x20C96, 0x20C9C,
+        0x20CB5, 0x20CB8, 0x20CCF, 0x20CD3, 0x20CD4, 0x20CD5,
+        0x20CD6, 0x20CDD, 0x20CED, 0x20CFF, 0x20D15, 0x20D28,
+        0x20D31, 0x20D32, 0x20D46, 0x20D47, 0x20D48, 0x20D49,
+        0x20D4C, 0x20D4D, 0x20D4E, 0x20D6F, 0x20D71, 0x20D74,
+        0x20D7C, 0x20D7E, 0x20D7F, 0x20D96, 0x20D9C, 0x20DA7,
+        0x20DB2, 0x20DC8, 0x20E04, 0x20E09, 0x20E0A, 0x20E0D,
+        0x20E0E, 0x20E0F, 0x20E10, 0x20E11, 0x20E16, 0x20E1D,
+        0x20E4C, 0x20E6D, 0x20E73, 0x20E75, 0x20E76, 0x20E77,
+        0x20E78, 0x20E79, 0x20E7A, 0x20E7B, 0x20E8C, 0x20E96,
+        0x20E98, 0x20E9D, 0x20EA2, 0x20EAA, 0x20EAB, 0x20EAC,
+        0x20EB6, 0x20ED7, 0x20ED8, 0x20EDD, 0x20EF8, 0x20EF9,
+        0x20EFA, 0x20EFB, 0x20F1D, 0x20F26, 0x20F2D, 0x20F2E,
+        0x20F30, 0x20F31, 0x20F3B, 0x20F4C, 0x20F64, 0x20F8D,
+        0x20F90, 0x20FAD, 0x20FB4, 0x20FB5, 0x20FB6, 0x20FBC,
+        0x20FDF, 0x20FEA, 0x20FEB, 0x20FEC, 0x20FED, 0x21014,
+        0x2101D, 0x2101E, 0x2104F, 0x2105C, 0x2106F, 0x21075,
+        0x21076, 0x21077, 0x21078, 0x2107B, 0x21088, 0x21096,
+        0x2109D, 0x210B4, 0x210BF, 0x210C0, 0x210C1, 0x210C7,
+        0x210C8, 0x210C9, 0x210CF, 0x210D3, 0x210E4, 0x210F4,
+        0x210F5, 0x210F6, 0x2112F, 0x2113B, 0x2113D, 0x21145,
+        0x21148, 0x2114F, 0x21180, 0x21187, 0x211D9, 0x2123C,
+        0x2124F, 0x2127C, 0x212A8, 0x212A9, 0x212B0, 0x212E3,
+        0x212FE, 0x21302, 0x21303, 0x21304, 0x21305, 0x21336,
+        0x2133A, 0x21375, 0x21376, 0x2138E, 0x21398, 0x2139C,
+        0x213C5, 0x213C6, 0x213ED, 0x213FE, 0x21413, 0x21416,
+        0x21424, 0x2143F, 0x21452, 0x21454, 0x21455, 0x2148A,
+        0x21497, 0x214B6, 0x214E8, 0x214FD, 0x21577, 0x21582,
+        0x21596, 0x2160A, 0x21613, 0x21619, 0x2163E, 0x21661,
+        0x21692, 0x216B8, 0x216BA, 0x216C0, 0x216C1, 0x216C2,
+        0x216D3, 0x216D5, 0x216DF, 0x216E6, 0x216E7, 0x216E8,
+        0x216FA, 0x216FB, 0x216FC, 0x216FE, 0x2170D, 0x21710,
+        0x21726, 0x2173A, 0x2173B, 0x2173C, 0x21757, 0x2176C,
+        0x2176D, 0x2176E, 0x2176F, 0x21770, 0x21771, 0x21773,
+        0x21774, 0x217AB, 0x217B0, 0x217B1, 0x217B2, 0x217B3,
+        0x217B4, 0x217B5, 0x217C3, 0x217C7, 0x217D9, 0x217DA,
+        0x217DB, 0x217DC, 0x217DF, 0x217EF, 0x217F5, 0x217F6,
+        0x217F8, 0x217F9, 0x217FA, 0x217FB, 0x217FC, 0x21820,
+        0x21828, 0x21829, 0x2182A, 0x2182D, 0x21839, 0x2183A,
+        0x2183B, 0x21840, 0x21845, 0x21852, 0x2185E, 0x21861,
+        0x21862, 0x21863, 0x21864, 0x21877, 0x2187B, 0x21883,
+        0x21884, 0x21885, 0x2189E, 0x2189F, 0x218A0, 0x218A1,
+        0x218A2, 0x218BE, 0x218BF, 0x218D1, 0x218D6, 0x218D7,
+        0x218D8, 0x218D9, 0x218FA, 0x21903, 0x21904, 0x21905,
+        0x21910, 0x21911, 0x21912, 0x21915, 0x2191C, 0x21922,
+        0x21927, 0x2193B, 0x21944, 0x21958, 0x2196A, 0x2197C,
+        0x21980, 0x21983, 0x21988, 0x21996, 0x219DB, 0x219F3,
+        0x21A2D, 0x21A34, 0x21A45, 0x21A4B, 0x21B44, 0x21BC1,
+        0x21BC2, 0x21C2A, 0x21C70, 0x21CA2, 0x21CA5, 0x21CAC,
+        0x21D46, 0x21D90, 0x21DB6, 0x21DBA, 0x21DCA, 0x21DD1,
+        0x21DEB, 0x21DF9, 0x21E1C, 0x21E37, 0x21E3D, 0x21E89,
+        0x21EA4, 0x21EA8, 0x21EC8, 0x21ED5, 0x21F0F, 0x21F15,
+        0x21F6A, 0x21F9E, 0x21FA1, 0x21FE8, 0x22045, 0x22049,
+        0x2207E, 0x2209A, 0x220C7, 0x220FC, 0x2212A, 0x2215B,
+        0x22173, 0x2217A, 0x221A1, 0x221C3, 0x22208, 0x2227C,
+        0x22321, 0x22325, 0x223BD, 0x223D0, 0x223D7, 0x223FA,
+        0x22465, 0x22471, 0x2248B, 0x22491, 0x224B0, 0x224ED,
+        0x22513, 0x2251B, 0x22530, 0x22554, 0x2258D, 0x225AF,
+        0x225BE, 0x2261B, 0x2261C, 0x2262B, 0x22668, 0x2267A,
+        0x22696, 0x22698, 0x226F4, 0x226F5, 0x226F6, 0x22712,
+        0x22714, 0x2271B, 0x2271F, 0x2272A, 0x22775, 0x22781,
+        0x227B4, 0x227B5, 0x227CD, 0x22803, 0x2285F, 0x22860,
+        0x22871, 0x228AD, 0x228C1, 0x228F7, 0x22926, 0x22939,
+        0x2294F, 0x22967, 0x2296B, 0x22980, 0x22993, 0x22A66,
+        0x22ACF, 0x22AD5, 0x22AE6, 0x22AE8, 0x22B0E, 0x22B22,
+        0x22B3F, 0x22B43, 0x22B6A, 0x22BCA, 0x22BCE, 0x22C26,
+        0x22C27, 0x22C38, 0x22C4C, 0x22C51, 0x22C55, 0x22C62,
+        0x22C88, 0x22C9B, 0x22CA1, 0x22CA9, 0x22CB2, 0x22CB7,
+        0x22CC2, 0x22CC6, 0x22CC9, 0x22D07, 0x22D08, 0x22D12,
+        0x22D44, 0x22D4C, 0x22D67, 0x22D8D, 0x22D95, 0x22DA0,
+        0x22DA3, 0x22DA4, 0x22DB7, 0x22DEE, 0x22E0D, 0x22E36,
+        0x22E42, 0x22E78, 0x22E8B, 0x22EB3, 0x22EEF, 0x22F74,
+        0x22FCC, 0x22FE3, 0x23033, 0x23044, 0x2304B, 0x23066,
+        0x2307D, 0x2307E, 0x2308E, 0x230B7, 0x230BC, 0x230DA,
+        0x23103, 0x2313D, 0x2317D, 0x23182, 0x231A4, 0x231A5,
+        0x231B3, 0x231C8, 0x231C9, 0x231F7, 0x231F8, 0x231F9,
+        0x2320F, 0x23225, 0x2322F, 0x23231, 0x23232, 0x23233,
+        0x23234, 0x23262, 0x23281, 0x23289, 0x2328A, 0x232AB,
+        0x232AC, 0x232AD, 0x232D2, 0x232E0, 0x232E1, 0x23300,
+        0x2330A, 0x2331F, 0x233B4, 0x233CC, 0x233DE, 0x233E6,
+        0x233F4, 0x233F5, 0x233F9, 0x233FA, 0x233FE, 0x23400,
+        0x2343F, 0x23450, 0x2346F, 0x23472, 0x234E5, 0x23519,
+        0x23530, 0x2355A, 0x23567, 0x23595, 0x23599, 0x2359C,
+        0x235CD, 0x235CE, 0x235CF, 0x235F3, 0x23600, 0x2361A,
+        0x2363C, 0x23640, 0x23659, 0x2365F, 0x23677, 0x236A6,
+        0x236AD, 0x236BA, 0x236DF, 0x236EE, 0x23703, 0x23716,
+        0x23720, 0x2372D, 0x2372F, 0x2373F, 0x23766, 0x23781,
+        0x237A2, 0x237BC, 0x237C2, 0x237D5, 0x237D6, 0x237D7,
+        0x2383A, 0x239C2, 0x23AA7, 0x23ADB, 0x23AEE, 0x23AFA,
+        0x23B5A, 0x23C63, 0x23C99, 0x23C9A, 0x23C9B, 0x23CB5,
+        0x23CB7, 0x23CC7, 0x23CC8, 0x23CC9, 0x23CFC, 0x23CFD,
+        0x23CFE, 0x23CFF, 0x23D40, 0x23D5B, 0x23D7E, 0x23D8F,
+        0x23DB6, 0x23DB7, 0x23DB8, 0x23DB9, 0x23DBA, 0x23DBB,
+        0x23DBC, 0x23DBD, 0x23DE3, 0x23DF8, 0x23E11, 0x23E2C,
+        0x23E2D, 0x23E2E, 0x23E2F, 0x23E30, 0x23E31, 0x23E39,
+        0x23E88, 0x23E89, 0x23E8A, 0x23E8B, 0x23EB9, 0x23EBF,
+        0x23ED7, 0x23EF7, 0x23EF8, 0x23EF9, 0x23EFA, 0x23EFB,
+        0x23EFC, 0x23F35, 0x23F41, 0x23F4A, 0x23F7F, 0x23F80,
+        0x23F81, 0x23F82, 0x23F8F, 0x23FB4, 0x23FB7, 0x23FC0,
+        0x23FC5, 0x23FEB, 0x23FEC, 0x23FED, 0x23FEE, 0x23FEF,
+        0x23FF0, 0x24011, 0x24039, 0x2403A, 0x2403B, 0x2403C,
+        0x2403D, 0x24057, 0x24085, 0x2408B, 0x2408C, 0x2408D,
+        0x24091, 0x240C9, 0x240E1, 0x24104, 0x2410F, 0x24119,
+        0x2413F, 0x24140, 0x24144, 0x2414E, 0x24155, 0x24156,
+        0x24157, 0x2415C, 0x2415F, 0x24177, 0x2417A, 0x241A3,
+        0x241A4, 0x241A5, 0x241AC, 0x241B5, 0x241CD, 0x241E2,
+        0x241FC, 0x2421B, 0x2424B, 0x24256, 0x24259, 0x24276,
+        0x24277, 0x24278, 0x24284, 0x24293, 0x24295, 0x242A5,
+        0x242C1, 0x242C9, 0x242CA, 0x242EE, 0x242FA, 0x2430D,
+        0x2431A, 0x24334, 0x24348, 0x24362, 0x24363, 0x24364,
+        0x24365, 0x2438C, 0x24396, 0x2439C, 0x243BD, 0x243C1,
+        0x243E9, 0x243EA, 0x243F2, 0x243F8, 0x24404, 0x24435,
+        0x24436, 0x2445A, 0x2445B, 0x24473, 0x24487, 0x24488,
+        0x244B9, 0x244BC, 0x244CE, 0x244D3, 0x244D6, 0x24505,
+        0x24521, 0x24578, 0x245C8, 0x24618, 0x2462A, 0x24665,
+        0x24674, 0x24697, 0x246D4, 0x24706, 0x24725, 0x2472F,
+        0x2478F, 0x247E0, 0x24812, 0x24823, 0x24882, 0x248E9,
+        0x248F0, 0x248F1, 0x248F2, 0x248F3, 0x248FB, 0x248FF,
+        0x24900, 0x24901, 0x2490C, 0x24916, 0x24917, 0x24919,
+        0x2492F, 0x24933, 0x24934, 0x2493E, 0x2493F, 0x24940,
+        0x24941, 0x24942, 0x24943, 0x24962, 0x24963, 0x24974,
+        0x24975, 0x24976, 0x2497B, 0x2497F, 0x24982, 0x24988,
+        0x24989, 0x2498A, 0x2498B, 0x2498C, 0x2498D, 0x2498E,
+        0x2498F, 0x24994, 0x249A4, 0x249A7, 0x249A9, 0x249AB,
+        0x249AC, 0x249AD, 0x249B7, 0x249B8, 0x249B9, 0x249BA,
+        0x249BB, 0x249C5, 0x249D0, 0x249DA, 0x249DE, 0x249DF,
+        0x249E3, 0x249E5, 0x249EC, 0x249ED, 0x249F6, 0x249F7,
+        0x249F8, 0x249F9, 0x249FB, 0x24A0E, 0x24A12, 0x24A13,
+        0x24A15, 0x24A21, 0x24A22, 0x24A23, 0x24A24, 0x24A25,
+        0x24A26, 0x24A27, 0x24A28, 0x24A29, 0x24A2A, 0x24A3E,
+        0x24A42, 0x24A45, 0x24A4A, 0x24A4E, 0x24A4F, 0x24A50,
+        0x24A51, 0x24A5D, 0x24A65, 0x24A66, 0x24A67, 0x24A71,
+        0x24A77, 0x24A78, 0x24A79, 0x24A7A, 0x24A8C, 0x24A93,
+        0x24A94, 0x24A95, 0x24A96, 0x24AA4, 0x24AA5, 0x24AA6,
+        0x24AA7, 0x24AB1, 0x24AB2, 0x24AB3, 0x24ABA, 0x24ABB,
+        0x24ABC, 0x24AC0, 0x24AC7, 0x24ACA, 0x24AD1, 0x24ADF,
+        0x24AE2, 0x24AE9, 0x24B6E, 0x24BF5, 0x24C09, 0x24C9E,
+        0x24C9F, 0x24CC9, 0x24CD9, 0x24D06, 0x24D13, 0x24DB8,
+        0x24DEA, 0x24DEB, 0x24E3B, 0x24E50, 0x24EA5, 0x24EA7,
+        0x24F0E, 0x24F5C, 0x24F82, 0x24F86, 0x24F97, 0x24F9A,
+        0x24FA9, 0x24FB8, 0x24FC2, 0x2502C, 0x25052, 0x2509D,
+        0x2512B, 0x25148, 0x2517D, 0x2517E, 0x251CD, 0x251E3,
+        0x251E6, 0x251E7, 0x25220, 0x25221, 0x25250, 0x25299,
+        0x252C7, 0x252D8, 0x2530E, 0x25311, 0x25313, 0x25419,
+        0x25425, 0x2542F, 0x25430, 0x25446, 0x2546C, 0x2546E,
+        0x25531, 0x25535, 0x2553F, 0x2555B, 0x2555C, 0x2555D,
+        0x2555E, 0x25562, 0x25565, 0x25566, 0x25581, 0x25584,
+        0x2558F, 0x255B9, 0x255D5, 0x255DB, 0x255E0, 0x25605,
+        0x25635, 0x25651, 0x25683, 0x25695, 0x256E3, 0x256F6,
+        0x25706, 0x2571D, 0x25725, 0x2573D, 0x25772, 0x257C7,
+        0x257DF, 0x257E0, 0x257E1, 0x25857, 0x2585D, 0x25872,
+        0x258C8, 0x258E1, 0x25903, 0x25946, 0x25956, 0x259AC,
+        0x259CC, 0x25A95, 0x25A9C, 0x25AAE, 0x25AAF, 0x25AE9,
+        0x25B74, 0x25B89, 0x25BB3, 0x25BB4, 0x25BC6, 0x25BE4,
+        0x25BE8, 0x25C01, 0x25C06, 0x25C21, 0x25C4A, 0x25C65,
+        0x25C91, 0x25CA4, 0x25CC0, 0x25CC1, 0x25CFE, 0x25D20,
+        0x25D30, 0x25D43, 0x25E0E, 0x25E49, 0x25E81, 0x25E82,
+        0x25E83, 0x25EA6, 0x25EBC, 0x25ED7, 0x25ED8, 0x25F1A,
+        0x25F4B, 0x25FE1, 0x25FE2, 0x26029, 0x26048, 0x26064,
+        0x26083, 0x26097, 0x260A4, 0x260A5, 0x26102, 0x26121,
+        0x26159, 0x2615A, 0x2615B, 0x2615C, 0x261AD, 0x261AE,
+        0x261B2, 0x261DD, 0x26258, 0x26261, 0x2626A, 0x2626B,
+        0x262D0, 0x26335, 0x2634B, 0x2634C, 0x26351, 0x263BE,
+        0x263F5, 0x263F8, 0x26402, 0x26410, 0x26411, 0x26412,
+        0x2644A, 0x26469, 0x26484, 0x26488, 0x26489, 0x2648D,
+        0x26498, 0x26512, 0x26572, 0x265A0, 0x265AD, 0x265BF,
+        0x26612, 0x26626, 0x266AF, 0x266B1, 0x266B5, 0x266DA,
+        0x266E8, 0x266FC, 0x26716, 0x26741, 0x26799, 0x267B3,
+        0x267B4, 0x267CC, 0x2681C, 0x26846, 0x2685E, 0x2686E,
+        0x26888, 0x2688A, 0x26893, 0x268C7, 0x2690E, 0x26911,
+        0x26926, 0x26939, 0x26951, 0x269A8, 0x269B5, 0x269F2,
+        0x269FA, 0x26A2D, 0x26A2E, 0x26A34, 0x26A42, 0x26A51,
+        0x26A52, 0x26B05, 0x26B0A, 0x26B13, 0x26B15, 0x26B28,
+        0x26B50, 0x26B51, 0x26B52, 0x26B53, 0x26B5B, 0x26B75,
+        0x26B82, 0x26B96, 0x26B97, 0x26B9D, 0x26BB3, 0x26BC0,
+        0x26BF7, 0x26C21, 0x26C40, 0x26C7E, 0x26C7F, 0x26C80,
+        0x26C81, 0x26C82, 0x26CA4, 0x26CB7, 0x26CB8, 0x26CBD,
+        0x26CC0, 0x26CC3, 0x26CD1, 0x26D22, 0x26D23, 0x26D24,
+        0x26D25, 0x26D26, 0x26D27, 0x26D28, 0x26D29, 0x26D2A,
+        0x26D51, 0x26D74, 0x26DA0, 0x26DA1, 0x26DA2, 0x26DA3,
+        0x26DA4, 0x26DA5, 0x26DA6, 0x26DA7, 0x26DAE, 0x26DDC,
+        0x26DEA, 0x26DEB, 0x26DF0, 0x26E00, 0x26E05, 0x26E07,
+        0x26E12, 0x26E42, 0x26E43, 0x26E44, 0x26E45, 0x26E6E,
+        0x26E72, 0x26E77, 0x26E84, 0x26E99, 0x26ED0, 0x26ED1,
+        0x26ED2, 0x26ED3, 0x26ED4, 0x26ED5, 0x26ED6, 0x26ED7,
+        0x26F26, 0x26F73, 0x26F74, 0x26F9F, 0x26FA1, 0x26FBE,
+        0x26FDE, 0x26FDF, 0x2700E, 0x2704B, 0x27052, 0x27053,
+        0x27088, 0x270AD, 0x270AE, 0x270AF, 0x270CD, 0x270F8,
+        0x27109, 0x2710C, 0x2710D, 0x27126, 0x27127, 0x27164,
+        0x27165, 0x27175, 0x271CD, 0x2721B, 0x27280, 0x27285,
+        0x2728B, 0x272B2, 0x272B6, 0x272E6, 0x2739A, 0x27422,
+        0x27450, 0x27484, 0x27486, 0x27574, 0x275A3, 0x275E0,
+        0x275E4, 0x275FD, 0x275FE, 0x27607, 0x2760C, 0x27632,
+        0x27639, 0x27655, 0x27656, 0x27657, 0x27694, 0x2770F,
+        0x27735, 0x27736, 0x27741, 0x2775E, 0x27784, 0x27785,
+        0x277CC, 0x27858, 0x27870, 0x2789D, 0x278B2, 0x278C8,
+        0x27924, 0x27967, 0x2797A, 0x279A0, 0x279DD, 0x279FD,
+        0x27A0A, 0x27A0E, 0x27A3E, 0x27A53, 0x27A59, 0x27A79,
+        0x27A84, 0x27ABD, 0x27ABE, 0x27AF4, 0x27B06, 0x27B0B,
+        0x27B18, 0x27B38, 0x27B39, 0x27B3A, 0x27B48, 0x27BF4,
+        0x27C12, 0x27D2F, 0x27D53, 0x27D54, 0x27D66, 0x27D73,
+        0x27D84, 0x27D8F, 0x27D98, 0x27DBD, 0x27DDC, 0x27E4D,
+        0x27E4F, 0x27FF9, 0x28002, 0x28009, 0x2801E, 0x28023,
+        0x28024, 0x28048, 0x28083, 0x28090, 0x280BD, 0x280BE,
+        0x280E8, 0x280E9, 0x280F4, 0x2812E, 0x2814F, 0x2815D,
+        0x2816F, 0x28189, 0x281AF, 0x281BC, 0x28207, 0x28218,
+        0x2821A, 0x28256, 0x2827C, 0x2829B, 0x282CD, 0x282E2,
+        0x28306, 0x28318, 0x2832F, 0x2833A, 0x28365, 0x2836D,
+        0x2837D, 0x2838A, 0x28412, 0x28468, 0x2846C, 0x28473,
+        0x28482, 0x28501, 0x2853C, 0x2853D, 0x2856C, 0x285E8,
+        0x285F4, 0x28600, 0x2860B, 0x28625, 0x2863B, 0x286AA,
+        0x286AB, 0x286BC, 0x286D8, 0x286E6, 0x2870F, 0x28713,
+        0x28804, 0x2882B, 0x28933, 0x28948, 0x28949, 0x28956,
+        0x28964, 0x28968, 0x2896C, 0x2897E, 0x28989, 0x289A8,
+        0x289AA, 0x289AB, 0x289B8, 0x289BC, 0x289C0, 0x289DC,
+        0x289DE, 0x289E1, 0x289E3, 0x289E4, 0x289E7, 0x289E8,
+        0x289F9, 0x289FA, 0x289FB, 0x289FC, 0x28A0F, 0x28A16,
+        0x28A25, 0x28A29, 0x28A32, 0x28A36, 0x28A44, 0x28A45,
+        0x28A46, 0x28A47, 0x28A48, 0x28A49, 0x28A4A, 0x28A4B,
+        0x28A59, 0x28A5A, 0x28A81, 0x28A82, 0x28A83, 0x28A9A,
+        0x28A9B, 0x28A9C, 0x28AC0, 0x28AC6, 0x28ACB, 0x28ACC,
+        0x28ACE, 0x28ADE, 0x28ADF, 0x28AE0, 0x28AE1, 0x28AE2,
+        0x28AE3, 0x28AE5, 0x28AEA, 0x28AFC, 0x28B0C, 0x28B13,
+        0x28B21, 0x28B22, 0x28B2B, 0x28B2C, 0x28B2D, 0x28B2F,
+        0x28B46, 0x28B4C, 0x28B4E, 0x28B50, 0x28B63, 0x28B64,
+        0x28B65, 0x28B66, 0x28B6C, 0x28B8F, 0x28B99, 0x28B9C,
+        0x28B9D, 0x28BC2, 0x28BC5, 0x28BD4, 0x28BD7, 0x28BD9,
+        0x28BDA, 0x28BE7, 0x28BE8, 0x28BE9, 0x28BEA, 0x28BEB,
+        0x28BEC, 0x28BF5, 0x28BFF, 0x28C03, 0x28C09, 0x28C1C,
+        0x28C1D, 0x28C23, 0x28C26, 0x28C2B, 0x28C30, 0x28C39,
+        0x28C3B, 0x28CCA, 0x28CCD, 0x28CD2, 0x28D34, 0x28D99,
+        0x28DB9, 0x28E0F, 0x28E36, 0x28E39, 0x28E65, 0x28E66,
+        0x28E97, 0x28EAC, 0x28EB2, 0x28EB3, 0x28ED9, 0x28EE7,
+        0x28FC5, 0x29088, 0x2908B, 0x29093, 0x290AF, 0x290B0,
+        0x290B1, 0x290C0, 0x290E4, 0x290E5, 0x290EC, 0x290ED,
+        0x2910D, 0x29110, 0x2913C, 0x2914D, 0x2915B, 0x2915E,
+        0x29170, 0x2919C, 0x291A8, 0x291D5, 0x291EB, 0x2941D,
+        0x29420, 0x29433, 0x2943F, 0x29448, 0x294D0, 0x294D9,
+        0x294DA, 0x294E5, 0x294E7, 0x2959E, 0x295B0, 0x295B8,
+        0x295D7, 0x295E9, 0x295F4, 0x29720, 0x29732, 0x297D4,
+        0x29810, 0x29857, 0x298A4, 0x298D1, 0x298EA, 0x298F1,
+        0x29903, 0x29905, 0x2992F, 0x29947, 0x29948, 0x29949,
+        0x2995D, 0x2996A, 0x2999D, 0x299C3, 0x299C9, 0x29A28,
+        0x29A4D, 0x29B05, 0x29B0E, 0x29BD5, 0x29C73, 0x29CAD,
+        0x29D3E, 0x29D5A, 0x29D7C, 0x29D98, 0x29D9B, 0x29DF6,
+        0x29E06, 0x29E2D, 0x29E68, 0x29EAC, 0x29EC3, 0x29EF8,
+        0x29F23, 0x29F30, 0x29FB7, 0x29FDE, 0x2A014, 0x2A087,
+        0x2A0B9, 0x2A0E1, 0x2A0ED, 0x2A0F3, 0x2A0F8, 0x2A0FE,
+        0x2A107, 0x2A123, 0x2A133, 0x2A134, 0x2A150, 0x2A192,
+        0x2A193, 0x2A1AB, 0x2A1B4, 0x2A1DF, 0x2A1F5, 0x2A220,
+        0x2A233, 0x2A293, 0x2A29F, 0x2A2B2, 0x2A2B4, 0x2A2B6,
+        0x2A2BA, 0x2A2BD, 0x2A2DF, 0x2A2FF, 0x2A3A9, 0x2A434,
+        0x2A45B, 0x2A5C6, 0x2A5CB, 0x2A601, 0x2A632, 0x2A64A,
+        0x2A65B, 0x2A6A9, 0x2F825, 0x2F83B, 0x2F840, 0x2F878,
+        0x2F894, 0x2F8A6, 0x2F8CD, 0x2F994, 0x2F9B2, 0x2F9BC,
+        0x2F9D4 };
+
+    /**
+     * Big5-HKSCS native encoded equivalent for the
+     * surrogate pair input provided above within the
+     * String constant "surrogates"
+     */
+
+    final static byte[] expectBytes = {
+        (byte)0x9C, (byte)0x71, (byte)0x93, (byte)0x75,
+        (byte)0x93, (byte)0x76, (byte)0x95, (byte)0x48,
+        (byte)0x8E, (byte)0xC6, (byte)0x8B, (byte)0xC5,
+        (byte)0x8B, (byte)0xFA, (byte)0xC8, (byte)0x7C,
+        (byte)0x9A, (byte)0xB4, (byte)0x88, (byte)0x4E,
+        (byte)0x88, (byte)0x4B, (byte)0xC8, (byte)0x7A,
+        (byte)0x88, (byte)0x48, (byte)0x88, (byte)0x47,
+        (byte)0xA0, (byte)0xF6, (byte)0x88, (byte)0x45,
+        (byte)0x88, (byte)0x53, (byte)0xFC, (byte)0xAD,
+        (byte)0x8A, (byte)0xAD, (byte)0x92, (byte)0x72,
+        (byte)0xFC, (byte)0x47, (byte)0x94, (byte)0xDF,
+        (byte)0x9F, (byte)0xD1, (byte)0xFB, (byte)0xCB,
+        (byte)0x92, (byte)0x7D, (byte)0x98, (byte)0xA4,
+        (byte)0x94, (byte)0xE7, (byte)0x90, (byte)0xCB,
+        (byte)0x92, (byte)0x7B, (byte)0x94, (byte)0xD8,
+        (byte)0xFC, (byte)0x5F, (byte)0xFA, (byte)0x54,
+        (byte)0x9A, (byte)0xB5, (byte)0x96, (byte)0xDA,
+        (byte)0x92, (byte)0x79, (byte)0xFA, (byte)0x74,
+        (byte)0x92, (byte)0x75, (byte)0x8D, (byte)0xFB,
+        (byte)0x8A, (byte)0x49, (byte)0x92, (byte)0xDF,
+        (byte)0x9B, (byte)0x7C, (byte)0xFA, (byte)0x63,
+        (byte)0xFA, (byte)0x60, (byte)0x92, (byte)0x6D,
+        (byte)0xFA, (byte)0x62, (byte)0x9A, (byte)0xB6,
+        (byte)0x97, (byte)0x6B, (byte)0xFD, (byte)0x6A,
+        (byte)0xFD, (byte)0x54, (byte)0x92, (byte)0x73,
+        (byte)0x97, (byte)0xD8, (byte)0x9F, (byte)0xBB,
+        (byte)0x93, (byte)0x42, (byte)0x92, (byte)0x76,
+        (byte)0xFA, (byte)0x65, (byte)0x92, (byte)0x6C,
+        (byte)0xFA, (byte)0x6E, (byte)0x9E, (byte)0xE0,
+        (byte)0x92, (byte)0xC0, (byte)0x92, (byte)0xBF,
+        (byte)0x92, (byte)0xBE, (byte)0x9A, (byte)0xBA,
+        (byte)0x8A, (byte)0xB3, (byte)0x97, (byte)0x75,
+        (byte)0xFA, (byte)0x40, (byte)0xFA, (byte)0x76,
+        (byte)0xFB, (byte)0xD0, (byte)0xFA, (byte)0x7B,
+        (byte)0xFE, (byte)0x6D, (byte)0x9B, (byte)0xB3,
+        (byte)0x89, (byte)0xCC, (byte)0x9A, (byte)0xBE,
+        (byte)0xFA, (byte)0x42, (byte)0x92, (byte)0xBC,
+        (byte)0x94, (byte)0x5C, (byte)0x9B, (byte)0xB5,
+        (byte)0x9A, (byte)0xBF, (byte)0x98, (byte)0xA7,
+        (byte)0x97, (byte)0xA4, (byte)0x90, (byte)0xFD,
+        (byte)0xFC, (byte)0x7B, (byte)0x9A, (byte)0xC0,
+        (byte)0x92, (byte)0xC3, (byte)0x8A, (byte)0xAA,
+        (byte)0x9B, (byte)0xD0, (byte)0x95, (byte)0x50,
+        (byte)0x92, (byte)0xC6, (byte)0x98, (byte)0xA6,
+        (byte)0x95, (byte)0x46, (byte)0xFD, (byte)0x63,
+        (byte)0xFA, (byte)0xC2, (byte)0x9E, (byte)0xC3,
+        (byte)0x89, (byte)0xB2, (byte)0x9C, (byte)0x66,
+        (byte)0x90, (byte)0x53, (byte)0x97, (byte)0xC1,
+        (byte)0x9A, (byte)0xC4, (byte)0x9A, (byte)0xC5,
+        (byte)0x8E, (byte)0xEF, (byte)0xFA, (byte)0xE9,
+        (byte)0x92, (byte)0x62, (byte)0x8A, (byte)0xF7,
+        (byte)0x9A, (byte)0xC6, (byte)0x92, (byte)0xE1,
+        (byte)0x9A, (byte)0xC9, (byte)0xFA, (byte)0xC6,
+        (byte)0x97, (byte)0xA5, (byte)0x9A, (byte)0xCB,
+        (byte)0xFA, (byte)0x72, (byte)0x8A, (byte)0x5E,
+        (byte)0x94, (byte)0xE0, (byte)0x92, (byte)0xCC,
+        (byte)0x8A, (byte)0xE5, (byte)0xFE, (byte)0x5C,
+        (byte)0x9A, (byte)0xCC, (byte)0x9D, (byte)0xF9,
+        (byte)0x8A, (byte)0x43, (byte)0x8A, (byte)0xA6,
+        (byte)0x9A, (byte)0xCD, (byte)0x9A, (byte)0xCE,
+        (byte)0xFA, (byte)0xEE, (byte)0x9B, (byte)0xCC,
+        (byte)0x9A, (byte)0xCF, (byte)0x9A, (byte)0xD1,
+        (byte)0x9D, (byte)0xFA, (byte)0x9D, (byte)0x7C,
+        (byte)0x9A, (byte)0xD3, (byte)0x97, (byte)0xA6,
+        (byte)0x99, (byte)0x5F, (byte)0xFB, (byte)0xF6,
+        (byte)0x9F, (byte)0xC5, (byte)0x8A, (byte)0x59,
+        (byte)0x8B, (byte)0x6B, (byte)0x9A, (byte)0xD4,
+        (byte)0x9A, (byte)0xD5, (byte)0x97, (byte)0xA2,
+        (byte)0x8A, (byte)0x44, (byte)0x9F, (byte)0x4A,
+        (byte)0x90, (byte)0xA1, (byte)0xFD, (byte)0xA4,
+        (byte)0x8A, (byte)0x64, (byte)0x8A, (byte)0xF2,
+        (byte)0x8A, (byte)0xF8, (byte)0x9D, (byte)0xD8,
+        (byte)0x94, (byte)0xD6, (byte)0xFA, (byte)0xFE,
+        (byte)0xFB, (byte)0xA7, (byte)0x9A, (byte)0xD6,
+        (byte)0x9F, (byte)0x4D, (byte)0xFA, (byte)0xF6,
+        (byte)0x8A, (byte)0x57, (byte)0x8B, (byte)0x43,
+        (byte)0x8B, (byte)0x44, (byte)0x8A, (byte)0xB6,
+        (byte)0x8A, (byte)0xC0, (byte)0x9E, (byte)0x54,
+        (byte)0x9A, (byte)0xD7, (byte)0x9A, (byte)0xD8,
+        (byte)0x9A, (byte)0xDC, (byte)0x8A, (byte)0xCA,
+        (byte)0x9E, (byte)0xA8, (byte)0x92, (byte)0x63,
+        (byte)0x9A, (byte)0xDD, (byte)0x8B, (byte)0x65,
+        (byte)0x8B, (byte)0x6F, (byte)0x8B, (byte)0x7E,
+        (byte)0x8F, (byte)0x43, (byte)0x92, (byte)0xD0,
+        (byte)0x8A, (byte)0xF4, (byte)0x9D, (byte)0xBE,
+        (byte)0x9A, (byte)0xE1, (byte)0xFC, (byte)0xDE,
+        (byte)0x9D, (byte)0xFD, (byte)0x8B, (byte)0x66,
+        (byte)0x8B, (byte)0x70, (byte)0x8B, (byte)0x75,
+        (byte)0x8A, (byte)0xE4, (byte)0x8B, (byte)0xA4,
+        (byte)0x8A, (byte)0xED, (byte)0x8A, (byte)0x5D,
+        (byte)0x8B, (byte)0x48, (byte)0x9D, (byte)0xED,
+        (byte)0x9E, (byte)0x40, (byte)0x8A, (byte)0xEF,
+        (byte)0x8A, (byte)0xF6, (byte)0x9E, (byte)0x76,
+        (byte)0x9E, (byte)0xE3, (byte)0x9A, (byte)0xDE,
+        (byte)0x8D, (byte)0xFE, (byte)0xFA, (byte)0xFC,
+        (byte)0x9C, (byte)0xB1, (byte)0x9E, (byte)0x77,
+        (byte)0x8B, (byte)0x64, (byte)0x8B, (byte)0x67,
+        (byte)0x97, (byte)0x4B, (byte)0x96, (byte)0x53,
+        (byte)0x9A, (byte)0xE0, (byte)0x8B, (byte)0x4A,
+        (byte)0x8A, (byte)0xF1, (byte)0x8A, (byte)0xD7,
+        (byte)0xA0, (byte)0xAB, (byte)0x8A, (byte)0xB5,
+        (byte)0x8A, (byte)0x5F, (byte)0x8A, (byte)0xEE,
+        (byte)0x9A, (byte)0xDF, (byte)0x8A, (byte)0xFE,
+        (byte)0x8A, (byte)0x58, (byte)0x8B, (byte)0xA3,
+        (byte)0x8B, (byte)0xA7, (byte)0x9A, (byte)0xE3,
+        (byte)0x92, (byte)0x61, (byte)0x9D, (byte)0xD7,
+        (byte)0x9E, (byte)0x7D, (byte)0x9E, (byte)0xA7,
+        (byte)0x9E, (byte)0xAB, (byte)0x90, (byte)0x42,
+        (byte)0x8B, (byte)0x79, (byte)0x8B, (byte)0x7A,
+        (byte)0x9A, (byte)0xE6, (byte)0x9A, (byte)0xE5,
+        (byte)0x8A, (byte)0x7E, (byte)0x9E, (byte)0x44,
+        (byte)0x9A, (byte)0xE7, (byte)0x8A, (byte)0x7C,
+        (byte)0x8B, (byte)0x71, (byte)0x9A, (byte)0xE9,
+        (byte)0x9A, (byte)0xEA, (byte)0x9A, (byte)0xEB,
+        (byte)0x8A, (byte)0xBD, (byte)0xFB, (byte)0x4E,
+        (byte)0x9A, (byte)0xED, (byte)0x8A, (byte)0xF9,
+        (byte)0x9E, (byte)0x63, (byte)0x8B, (byte)0x49,
+        (byte)0x8A, (byte)0xCE, (byte)0x8B, (byte)0x6E,
+        (byte)0x8A, (byte)0xE8, (byte)0x9A, (byte)0xEE,
+        (byte)0x92, (byte)0xCE, (byte)0x8A, (byte)0x5A,
+        (byte)0x8B, (byte)0x7B, (byte)0x8B, (byte)0x7C,
+        (byte)0x9A, (byte)0xEF, (byte)0x9A, (byte)0xF0,
+        (byte)0x8A, (byte)0xFA, (byte)0x89, (byte)0x41,
+        (byte)0x8B, (byte)0x72, (byte)0x8A, (byte)0xF3,
+        (byte)0x8B, (byte)0xA8, (byte)0x9E, (byte)0xAE,
+        (byte)0x9E, (byte)0x72, (byte)0xFB, (byte)0x73,
+        (byte)0xFB, (byte)0x5F, (byte)0x90, (byte)0xBA,
+        (byte)0x91, (byte)0xFE, (byte)0x9E, (byte)0xF6,
+        (byte)0x97, (byte)0xED, (byte)0x9A, (byte)0xF3,
+        (byte)0xA0, (byte)0xEE, (byte)0x96, (byte)0x7C,
+        (byte)0x93, (byte)0x45, (byte)0x98, (byte)0x6E,
+        (byte)0xFA, (byte)0x56, (byte)0x9A, (byte)0xF5,
+        (byte)0xFC, (byte)0x4B, (byte)0x9A, (byte)0xF4,
+        (byte)0xFE, (byte)0xDE, (byte)0xFC, (byte)0xB7,
+        (byte)0x97, (byte)0xF1, (byte)0x97, (byte)0xC7,
+        (byte)0x9C, (byte)0xCB, (byte)0x92, (byte)0x40,
+        (byte)0x9C, (byte)0xE8, (byte)0x91, (byte)0xFD,
+        (byte)0x97, (byte)0x4E, (byte)0xFB, (byte)0x68,
+        (byte)0x97, (byte)0x6C, (byte)0x8C, (byte)0xC2,
+        (byte)0x97, (byte)0xE8, (byte)0xFB, (byte)0x6A,
+        (byte)0x8B, (byte)0x74, (byte)0x8E, (byte)0xE7,
+        (byte)0xFD, (byte)0xC8, (byte)0x92, (byte)0x41,
+        (byte)0x96, (byte)0xA1, (byte)0x8E, (byte)0xF3,
+        (byte)0x9A, (byte)0xF7, (byte)0x8F, (byte)0xA6,
+        (byte)0xFA, (byte)0xD6, (byte)0x9C, (byte)0xC7,
+        (byte)0xFA, (byte)0xD7, (byte)0x9A, (byte)0xF8,
+        (byte)0xFB, (byte)0xA1, (byte)0x8E, (byte)0xC5,
+        (byte)0xFB, (byte)0xA4, (byte)0xFB, (byte)0xC2,
+        (byte)0x9A, (byte)0xC1, (byte)0x91, (byte)0xFA,
+        (byte)0xFE, (byte)0xDB, (byte)0x97, (byte)0xAB,
+        (byte)0x91, (byte)0x47, (byte)0xFB, (byte)0xB1,
+        (byte)0x8F, (byte)0xEA, (byte)0x94, (byte)0xD2,
+        (byte)0xFE, (byte)0x61, (byte)0xFA, (byte)0xCE,
+        (byte)0x92, (byte)0xED, (byte)0x91, (byte)0xF3,
+        (byte)0x93, (byte)0xC6, (byte)0x93, (byte)0x5A,
+        (byte)0xFA, (byte)0xFB, (byte)0x92, (byte)0xEF,
+        (byte)0xFA, (byte)0xC8, (byte)0x98, (byte)0x47,
+        (byte)0x93, (byte)0x66, (byte)0x98, (byte)0x55,
+        (byte)0x96, (byte)0xE6, (byte)0x9F, (byte)0x43,
+        (byte)0x9F, (byte)0xAA, (byte)0x94, (byte)0xDA,
+        (byte)0x92, (byte)0xEE, (byte)0xFC, (byte)0xAF,
+        (byte)0xFB, (byte)0xFB, (byte)0x8E, (byte)0xF9,
+        (byte)0x91, (byte)0xF6, (byte)0x93, (byte)0x64,
+        (byte)0x94, (byte)0xF5, (byte)0x9C, (byte)0xB6,
+        (byte)0xFB, (byte)0xAD, (byte)0x98, (byte)0x4E,
+        (byte)0x8F, (byte)0x44, (byte)0x96, (byte)0xFD,
+        (byte)0x9A, (byte)0xF9, (byte)0x9A, (byte)0xFA,
+        (byte)0x97, (byte)0x69, (byte)0x95, (byte)0xD4,
+        (byte)0x98, (byte)0x4B, (byte)0xFB, (byte)0xAA,
+        (byte)0x98, (byte)0x7C, (byte)0x91, (byte)0xEA,
+        (byte)0x9D, (byte)0xAF, (byte)0x9D, (byte)0xC5,
+        (byte)0x91, (byte)0xF1, (byte)0x8E, (byte)0xB1,
+        (byte)0x97, (byte)0xA9, (byte)0xFB, (byte)0xAC,
+        (byte)0xFC, (byte)0xB8, (byte)0x9C, (byte)0xB9,
+        (byte)0xFB, (byte)0xB0, (byte)0xFC, (byte)0xD2,
+        (byte)0x93, (byte)0xCB, (byte)0x9A, (byte)0xFD,
+        (byte)0x91, (byte)0xF4, (byte)0x8B, (byte)0xAC,
+        (byte)0xA0, (byte)0x55, (byte)0x95, (byte)0x74,
+        (byte)0x95, (byte)0xBE, (byte)0x97, (byte)0xAD,
+        (byte)0x8E, (byte)0xE9, (byte)0x92, (byte)0xF8,
+        (byte)0x97, (byte)0xBE, (byte)0x91, (byte)0x6C,
+        (byte)0x94, (byte)0xAA, (byte)0xFC, (byte)0x63,
+        (byte)0x9D, (byte)0xC6, (byte)0x97, (byte)0xB5,
+        (byte)0x92, (byte)0xB8, (byte)0x91, (byte)0xEF,
+        (byte)0xFE, (byte)0xA6, (byte)0x97, (byte)0x60,
+        (byte)0x93, (byte)0x58, (byte)0x95, (byte)0x76,
+        (byte)0x8F, (byte)0xAC, (byte)0x91, (byte)0xEC,
+        (byte)0x97, (byte)0xB4, (byte)0x91, (byte)0xF7,
+        (byte)0x97, (byte)0x4A, (byte)0xFB, (byte)0x49,
+        (byte)0x95, (byte)0x78, (byte)0x93, (byte)0xBC,
+        (byte)0x91, (byte)0xD6, (byte)0x93, (byte)0x55,
+        (byte)0x93, (byte)0x56, (byte)0x98, (byte)0x51,
+        (byte)0x8F, (byte)0xF8, (byte)0xFB, (byte)0xC0,
+        (byte)0x93, (byte)0xF2, (byte)0x90, (byte)0xD0,
+        (byte)0x9C, (byte)0x44, (byte)0x92, (byte)0x55,
+        (byte)0x93, (byte)0x63, (byte)0x91, (byte)0xA5,
+        (byte)0xA0, (byte)0xED, (byte)0xFD, (byte)0x6B,
+        (byte)0x9A, (byte)0xFE, (byte)0x93, (byte)0x51,
+        (byte)0x8C, (byte)0x57, (byte)0xFA, (byte)0x78,
+        (byte)0xFE, (byte)0xA8, (byte)0x93, (byte)0x50,
+        (byte)0xFA, (byte)0x4C, (byte)0x92, (byte)0xF7,
+        (byte)0x9B, (byte)0x40, (byte)0xFB, (byte)0xCE,
+        (byte)0x9B, (byte)0x41, (byte)0xFE, (byte)0xAD,
+        (byte)0xFB, (byte)0xD5, (byte)0x8B, (byte)0xC2,
+        (byte)0x9A, (byte)0x7C, (byte)0x9B, (byte)0x42,
+        (byte)0x9B, (byte)0x43, (byte)0x9E, (byte)0x79,
+        (byte)0xFB, (byte)0xD9, (byte)0x9B, (byte)0x44,
+        (byte)0xA0, (byte)0xA7, (byte)0x9B, (byte)0xF3,
+        (byte)0x8C, (byte)0x79, (byte)0x93, (byte)0x5E,
+        (byte)0x89, (byte)0xCB, (byte)0x9F, (byte)0x53,
+        (byte)0x93, (byte)0xD7, (byte)0xFB, (byte)0xE1,
+        (byte)0xFE, (byte)0xD0, (byte)0xFB, (byte)0xE2,
+        (byte)0xFC, (byte)0xE3, (byte)0x90, (byte)0x74,
+        (byte)0xFB, (byte)0xE6, (byte)0x9B, (byte)0xB7,
+        (byte)0x9B, (byte)0x45, (byte)0x9B, (byte)0x47,
+        (byte)0x9F, (byte)0x50, (byte)0x9B, (byte)0x48,
+        (byte)0xFC, (byte)0x5B, (byte)0x98, (byte)0xA9,
+        (byte)0x9C, (byte)0xFD, (byte)0x88, (byte)0x4C,
+        (byte)0x9B, (byte)0x4B, (byte)0xFB, (byte)0xEC,
+        (byte)0x8C, (byte)0x69, (byte)0x9B, (byte)0xA8,
+        (byte)0x8A, (byte)0xD5, (byte)0xFA, (byte)0x73,
+        (byte)0xFD, (byte)0x59, (byte)0x91, (byte)0xA2,
+        (byte)0xFB, (byte)0xED, (byte)0x9C, (byte)0xA9,
+        (byte)0x8A, (byte)0xA8, (byte)0x9B, (byte)0xC3,
+        (byte)0x8A, (byte)0xE1, (byte)0x9B, (byte)0x4E,
+        (byte)0x95, (byte)0xD0, (byte)0x90, (byte)0x5F,
+        (byte)0x97, (byte)0xEE, (byte)0xFC, (byte)0x4E,
+        (byte)0x9B, (byte)0x4F, (byte)0x9B, (byte)0x50,
+        (byte)0x9E, (byte)0xC6, (byte)0xFC, (byte)0x50,
+        (byte)0xFD, (byte)0x73, (byte)0xFD, (byte)0xA7,
+        (byte)0x9D, (byte)0xA2, (byte)0xFA, (byte)0x58,
+        (byte)0xFA, (byte)0x5E, (byte)0xA0, (byte)0x59,
+        (byte)0xFA, (byte)0x75, (byte)0xFB, (byte)0xBE,
+        (byte)0x9C, (byte)0xA2, (byte)0x93, (byte)0x70,
+        (byte)0x93, (byte)0x71, (byte)0x93, (byte)0x77,
+        (byte)0xFE, (byte)0xEF, (byte)0x93, (byte)0x6D,
+        (byte)0xFC, (byte)0x5D, (byte)0x90, (byte)0xB8,
+        (byte)0x8A, (byte)0xFC, (byte)0xFB, (byte)0x41,
+        (byte)0x9E, (byte)0x6B, (byte)0x94, (byte)0xE3,
+        (byte)0x8E, (byte)0xE2, (byte)0x8C, (byte)0x7D,
+        (byte)0x8E, (byte)0xD7, (byte)0x9C, (byte)0x4D,
+        (byte)0x96, (byte)0xA3, (byte)0x9B, (byte)0x51,
+        (byte)0x8A, (byte)0xC3, (byte)0x96, (byte)0xAA,
+        (byte)0xFC, (byte)0x68, (byte)0x8B, (byte)0x6D,
+        (byte)0xFD, (byte)0x67, (byte)0x8A, (byte)0xE9,
+        (byte)0xFC, (byte)0xA1, (byte)0x93, (byte)0x6C,
+        (byte)0x9B, (byte)0x52, (byte)0xFE, (byte)0x70,
+        (byte)0xFC, (byte)0xA8, (byte)0xFC, (byte)0xE9,
+        (byte)0x9C, (byte)0xB4, (byte)0x8A, (byte)0xEA,
+        (byte)0x9B, (byte)0x53, (byte)0x9B, (byte)0x55,
+        (byte)0x96, (byte)0xAB, (byte)0xFC, (byte)0xA7,
+        (byte)0x9B, (byte)0x56, (byte)0x8A, (byte)0xBC,
+        (byte)0x8A, (byte)0xCB, (byte)0x9B, (byte)0x57,
+        (byte)0x89, (byte)0xCD, (byte)0x9B, (byte)0x59,
+        (byte)0x9B, (byte)0x5B, (byte)0x93, (byte)0xA5,
+        (byte)0x9B, (byte)0x5D, (byte)0x9E, (byte)0x4F,
+        (byte)0x93, (byte)0xA3, (byte)0x8A, (byte)0x7B,
+        (byte)0x8B, (byte)0x42, (byte)0x97, (byte)0x50,
+        (byte)0x8F, (byte)0xB3, (byte)0x8A, (byte)0x50,
+        (byte)0x9B, (byte)0x60, (byte)0x8B, (byte)0x45,
+        (byte)0x8B, (byte)0x46, (byte)0x9D, (byte)0xFE,
+        (byte)0x9B, (byte)0x62, (byte)0x93, (byte)0x7B,
+        (byte)0x93, (byte)0xB1, (byte)0x8A, (byte)0x60,
+        (byte)0x8A, (byte)0xD8, (byte)0x9B, (byte)0x63,
+        (byte)0x8A, (byte)0x69, (byte)0x8A, (byte)0x47,
+        (byte)0x8A, (byte)0xCC, (byte)0x93, (byte)0x7C,
+        (byte)0x9B, (byte)0x65, (byte)0x9B, (byte)0x66,
+        (byte)0x8A, (byte)0x72, (byte)0x8A, (byte)0x7A,
+        (byte)0x93, (byte)0xAF, (byte)0x8A, (byte)0xB0,
+        (byte)0x9B, (byte)0x68, (byte)0x9E, (byte)0xA3,
+        (byte)0xFA, (byte)0xEC, (byte)0x8B, (byte)0x77,
+        (byte)0x9B, (byte)0x67, (byte)0x8B, (byte)0x59,
+        (byte)0xFC, (byte)0xB1, (byte)0xFC, (byte)0xBB,
+        (byte)0x9B, (byte)0x69, (byte)0x93, (byte)0xA8,
+        (byte)0x8A, (byte)0xE0, (byte)0x9E, (byte)0x51,
+        (byte)0x8F, (byte)0x5F, (byte)0x9B, (byte)0x6A,
+        (byte)0x9B, (byte)0x6B, (byte)0x97, (byte)0xEC,
+        (byte)0x9B, (byte)0x6C, (byte)0xFE, (byte)0x4E,
+        (byte)0xFD, (byte)0xC2, (byte)0x9B, (byte)0x6D,
+        (byte)0x91, (byte)0x67, (byte)0xFC, (byte)0xCC,
+        (byte)0x93, (byte)0xB6, (byte)0x90, (byte)0xE4,
+        (byte)0x90, (byte)0xE5, (byte)0x9E, (byte)0xF2,
+        (byte)0x93, (byte)0xCA, (byte)0x8B, (byte)0xBC,
+        (byte)0x8F, (byte)0x46, (byte)0x93, (byte)0xCF,
+        (byte)0xFC, (byte)0xDB, (byte)0xFC, (byte)0xDC,
+        (byte)0x93, (byte)0xC0, (byte)0xFC, (byte)0xE6,
+        (byte)0x96, (byte)0xE7, (byte)0xFC, (byte)0xD8,
+        (byte)0xFC, (byte)0xD9, (byte)0xFD, (byte)0xA6,
+        (byte)0x93, (byte)0xCE, (byte)0x95, (byte)0xF1,
+        (byte)0x9C, (byte)0xE9, (byte)0xFC, (byte)0xE4,
+        (byte)0x94, (byte)0xAF, (byte)0xFA, (byte)0x77,
+        (byte)0x93, (byte)0xCC, (byte)0x90, (byte)0x5A,
+        (byte)0x8C, (byte)0x54, (byte)0x93, (byte)0xBF,
+        (byte)0xFB, (byte)0x51, (byte)0x93, (byte)0xB9,
+        (byte)0xFE, (byte)0xD7, (byte)0x93, (byte)0xB7,
+        (byte)0x93, (byte)0xD9, (byte)0x93, (byte)0xBB,
+        (byte)0x93, (byte)0xDA, (byte)0x98, (byte)0xA3,
+        (byte)0x90, (byte)0xD1, (byte)0x9B, (byte)0x6E,
+        (byte)0xFA, (byte)0x70, (byte)0x9B, (byte)0xEB,
+        (byte)0x9B, (byte)0x6F, (byte)0xFC, (byte)0xFC,
+        (byte)0x8B, (byte)0x40, (byte)0xA0, (byte)0x7B,
+        (byte)0x8C, (byte)0xA1, (byte)0x97, (byte)0xF7,
+        (byte)0x93, (byte)0xE2, (byte)0xFC, (byte)0xD6,
+        (byte)0x95, (byte)0x59, (byte)0x93, (byte)0xA6,
+        (byte)0xFD, (byte)0x40, (byte)0x93, (byte)0x5F,
+        (byte)0x97, (byte)0xF2, (byte)0x9C, (byte)0x76,
+        (byte)0x8E, (byte)0xF8, (byte)0x8F, (byte)0x47,
+        (byte)0x9B, (byte)0x74, (byte)0x92, (byte)0xB4,
+        (byte)0x91, (byte)0xED, (byte)0x96, (byte)0xD2,
+        (byte)0xFD, (byte)0x46, (byte)0x8F, (byte)0x4F,
+        (byte)0x95, (byte)0x49, (byte)0x9B, (byte)0x75,
+        (byte)0xFA, (byte)0x5C, (byte)0x9B, (byte)0x79,
+        (byte)0xFD, (byte)0x4B, (byte)0x96, (byte)0xD3,
+        (byte)0xFD, (byte)0x58, (byte)0x94, (byte)0x5F,
+        (byte)0xA0, (byte)0xF5, (byte)0x92, (byte)0x43,
+        (byte)0x97, (byte)0xFA, (byte)0x9D, (byte)0xD9,
+        (byte)0x97, (byte)0xF4, (byte)0x92, (byte)0x4D,
+        (byte)0xFD, (byte)0x5B, (byte)0x9B, (byte)0x7A,
+        (byte)0x9E, (byte)0xD5, (byte)0xFA, (byte)0xAE,
+        (byte)0x9C, (byte)0xC9, (byte)0x92, (byte)0x58,
+        (byte)0x8E, (byte)0xC8, (byte)0x94, (byte)0xB4,
+        (byte)0x93, (byte)0xE1, (byte)0x93, (byte)0xDF,
+        (byte)0xFC, (byte)0xF0, (byte)0x93, (byte)0xEC,
+        (byte)0x97, (byte)0xF6, (byte)0x96, (byte)0xCF,
+        (byte)0x93, (byte)0xDE, (byte)0x8A, (byte)0xCF,
+        (byte)0x9B, (byte)0xA2, (byte)0xFD, (byte)0x69,
+        (byte)0x93, (byte)0x52, (byte)0x98, (byte)0xA2,
+        (byte)0xFD, (byte)0x6E, (byte)0x8C, (byte)0xA4,
+        (byte)0xFA, (byte)0x7C, (byte)0x93, (byte)0xFA,
+        (byte)0x90, (byte)0x7C, (byte)0x8F, (byte)0x67,
+        (byte)0x9D, (byte)0xB7, (byte)0xA0, (byte)0xE9,
+        (byte)0xFA, (byte)0x4E, (byte)0xFD, (byte)0xA1,
+        (byte)0x9E, (byte)0x74, (byte)0x9F, (byte)0xBF,
+        (byte)0x9E, (byte)0xCB, (byte)0x9B, (byte)0xB9,
+        (byte)0x9D, (byte)0xD4, (byte)0x97, (byte)0xB9,
+        (byte)0x8E, (byte)0xF1, (byte)0x95, (byte)0x7B,
+        (byte)0x9E, (byte)0xD2, (byte)0x97, (byte)0x53,
+        (byte)0x96, (byte)0xA4, (byte)0x8F, (byte)0xBE,
+        (byte)0x94, (byte)0xD9, (byte)0x90, (byte)0x58,
+        (byte)0xFD, (byte)0x79, (byte)0xFD, (byte)0x7B,
+        (byte)0x8E, (byte)0xDA, (byte)0x8E, (byte)0xFA,
+        (byte)0x9B, (byte)0xA5, (byte)0x9E, (byte)0xD9,
+        (byte)0x97, (byte)0xD4, (byte)0x90, (byte)0xBB,
+        (byte)0xFD, (byte)0xBC, (byte)0xFD, (byte)0xC6,
+        (byte)0x92, (byte)0x48, (byte)0x92, (byte)0xB5,
+        (byte)0x9D, (byte)0xC1, (byte)0x92, (byte)0xB9,
+        (byte)0x92, (byte)0xA6, (byte)0x8F, (byte)0x4B,
+        (byte)0x9B, (byte)0xA6, (byte)0x92, (byte)0xB6,
+        (byte)0x8E, (byte)0x40, (byte)0x9E, (byte)0xD8,
+        (byte)0x94, (byte)0x5E, (byte)0x98, (byte)0x5F,
+        (byte)0x94, (byte)0xCE, (byte)0x92, (byte)0x4A,
+        (byte)0xFD, (byte)0x70, (byte)0x94, (byte)0x67,
+        (byte)0x8D, (byte)0xEC, (byte)0x9B, (byte)0xD8,
+        (byte)0x94, (byte)0x48, (byte)0xFA, (byte)0xC1,
+        (byte)0x9C, (byte)0xF7, (byte)0xFD, (byte)0xBE,
+        (byte)0x8F, (byte)0xDA, (byte)0xFD, (byte)0xD9,
+        (byte)0xFC, (byte)0x7E, (byte)0x93, (byte)0xF9,
+        (byte)0xFA, (byte)0x43, (byte)0xFA, (byte)0xEB,
+        (byte)0xFA, (byte)0xC3, (byte)0x97, (byte)0xD3,
+        (byte)0x95, (byte)0xF9, (byte)0x9C, (byte)0x48,
+        (byte)0xFD, (byte)0xD8, (byte)0xA0, (byte)0xD8,
+        (byte)0xFD, (byte)0xD7, (byte)0xFB, (byte)0x4A,
+        (byte)0x9B, (byte)0xAF, (byte)0x94, (byte)0x4B,
+        (byte)0xFD, (byte)0xC9, (byte)0x8E, (byte)0xAC,
+        (byte)0xFD, (byte)0xB2, (byte)0x92, (byte)0x5A,
+        (byte)0xFC, (byte)0xBD, (byte)0x92, (byte)0xD9,
+        (byte)0xFD, (byte)0xD5, (byte)0x92, (byte)0xDD,
+        (byte)0x92, (byte)0x59, (byte)0x96, (byte)0xBA,
+        (byte)0x92, (byte)0x5B, (byte)0x9B, (byte)0xAB,
+        (byte)0xFD, (byte)0xDA, (byte)0xFD, (byte)0xDE,
+        (byte)0xFD, (byte)0xD3, (byte)0x8C, (byte)0x46,
+        (byte)0xFD, (byte)0xD6, (byte)0xFD, (byte)0xDC,
+        (byte)0xFD, (byte)0xDD, (byte)0x90, (byte)0xFE,
+        (byte)0xFE, (byte)0xA1, (byte)0x8B, (byte)0xAD,
+        (byte)0x9C, (byte)0xD8, (byte)0x9E, (byte)0x6D,
+        (byte)0xFD, (byte)0x7C, (byte)0xFB, (byte)0x61,
+        (byte)0x96, (byte)0xF8, (byte)0x96, (byte)0xF0,
+        (byte)0xFC, (byte)0xF4, (byte)0xFE, (byte)0x60,
+        (byte)0x98, (byte)0x52, (byte)0x96, (byte)0x4F,
+        (byte)0x91, (byte)0x6E, (byte)0x98, (byte)0x6D,
+        (byte)0x98, (byte)0x64, (byte)0x94, (byte)0x53,
+        (byte)0xFD, (byte)0xEC, (byte)0xFB, (byte)0x78,
+        (byte)0x95, (byte)0xBA, (byte)0x98, (byte)0x5D,
+        (byte)0x92, (byte)0xF9, (byte)0x98, (byte)0x5A,
+        (byte)0xFD, (byte)0xF6, (byte)0x93, (byte)0xD0,
+        (byte)0x98, (byte)0x62, (byte)0x9B, (byte)0xAD,
+        (byte)0x97, (byte)0x4F, (byte)0x9B, (byte)0xAE,
+        (byte)0x94, (byte)0x52, (byte)0x9B, (byte)0xB0,
+        (byte)0x91, (byte)0xD2, (byte)0x97, (byte)0xEA,
+        (byte)0xFB, (byte)0x6B, (byte)0x91, (byte)0xB1,
+        (byte)0xFD, (byte)0xF3, (byte)0x92, (byte)0xCB,
+        (byte)0x9B, (byte)0xB1, (byte)0xFC, (byte)0xEC,
+        (byte)0x98, (byte)0x6B, (byte)0x97, (byte)0x51,
+        (byte)0x98, (byte)0x71, (byte)0x95, (byte)0xEF,
+        (byte)0x9E, (byte)0xF3, (byte)0x91, (byte)0xE8,
+        (byte)0x9B, (byte)0xBA, (byte)0xFB, (byte)0x4C,
+        (byte)0x92, (byte)0x6A, (byte)0xFD, (byte)0xF8,
+        (byte)0x98, (byte)0x61, (byte)0x91, (byte)0xE7,
+        (byte)0x93, (byte)0xED, (byte)0x97, (byte)0x44,
+        (byte)0x91, (byte)0xE1, (byte)0xFB, (byte)0xF5,
+        (byte)0x98, (byte)0x69, (byte)0x8A, (byte)0x62,
+        (byte)0x9B, (byte)0xBB, (byte)0x8C, (byte)0xA8,
+        (byte)0x9C, (byte)0x55, (byte)0x8E, (byte)0x77,
+        (byte)0x8A, (byte)0xB2, (byte)0x9E, (byte)0xBC,
+        (byte)0x93, (byte)0xE6, (byte)0x93, (byte)0xA2,
+        (byte)0x9B, (byte)0xBD, (byte)0x94, (byte)0xB3,
+        (byte)0x93, (byte)0x7D, (byte)0x9E, (byte)0x66,
+        (byte)0x94, (byte)0x59, (byte)0x9B, (byte)0xBF,
+        (byte)0x94, (byte)0x58, (byte)0x9E, (byte)0xA5,
+        (byte)0x9B, (byte)0xC7, (byte)0xFE, (byte)0x54,
+        (byte)0x8E, (byte)0x74, (byte)0x8B, (byte)0xD6,
+        (byte)0x94, (byte)0xB6, (byte)0xFD, (byte)0x74,
+        (byte)0x98, (byte)0xC0, (byte)0x94, (byte)0xA5,
+        (byte)0x9B, (byte)0xC8, (byte)0x95, (byte)0xED,
+        (byte)0xFD, (byte)0x7E, (byte)0xFB, (byte)0xEB,
+        (byte)0xFD, (byte)0x7D, (byte)0x97, (byte)0x6F,
+        (byte)0x94, (byte)0x61, (byte)0x9F, (byte)0xC1,
+        (byte)0x95, (byte)0xD7, (byte)0xFA, (byte)0x52,
+        (byte)0x9C, (byte)0x58, (byte)0x9F, (byte)0x68,
+        (byte)0x9B, (byte)0xE7, (byte)0xFC, (byte)0xCE,
+        (byte)0x96, (byte)0xE8, (byte)0xFA, (byte)0x49,
+        (byte)0x97, (byte)0xA1, (byte)0x95, (byte)0x4D,
+        (byte)0x9E, (byte)0xF8, (byte)0xFE, (byte)0x49,
+        (byte)0x91, (byte)0xCE, (byte)0x97, (byte)0x71,
+        (byte)0x8C, (byte)0xCF, (byte)0xFD, (byte)0xB1,
+        (byte)0xFC, (byte)0x6E, (byte)0x9C, (byte)0xF2,
+        (byte)0x93, (byte)0xB8, (byte)0x90, (byte)0x43,
+        (byte)0x97, (byte)0x59, (byte)0x94, (byte)0xD7,
+        (byte)0xFE, (byte)0x66, (byte)0x94, (byte)0x7D,
+        (byte)0xFC, (byte)0x6F, (byte)0x92, (byte)0x46,
+        (byte)0xFA, (byte)0x6D, (byte)0x8E, (byte)0xF7,
+        (byte)0xFB, (byte)0xB7, (byte)0x94, (byte)0x7C,
+        (byte)0x92, (byte)0xCD, (byte)0x97, (byte)0xB2,
+        (byte)0xFE, (byte)0x65, (byte)0x96, (byte)0x7E,
+        (byte)0x97, (byte)0x58, (byte)0x9B, (byte)0x77,
+        (byte)0x91, (byte)0xCF, (byte)0x94, (byte)0xA4,
+        (byte)0x9C, (byte)0xAD, (byte)0x8B, (byte)0xAB,
+        (byte)0x96, (byte)0xD5, (byte)0xFC, (byte)0xB3,
+        (byte)0x93, (byte)0xAE, (byte)0x97, (byte)0x6D,
+        (byte)0x94, (byte)0x46, (byte)0x95, (byte)0xF7,
+        (byte)0x9C, (byte)0x46, (byte)0x95, (byte)0x5B,
+        (byte)0x91, (byte)0xD1, (byte)0x94, (byte)0xF4,
+        (byte)0xFE, (byte)0x67, (byte)0x92, (byte)0xA5,
+        (byte)0xFE, (byte)0xDF, (byte)0x8C, (byte)0xAB,
+        (byte)0x9B, (byte)0xC9, (byte)0xFC, (byte)0xED,
+        (byte)0xFD, (byte)0xFA, (byte)0xFC, (byte)0xC8,
+        (byte)0xFE, (byte)0x62, (byte)0x91, (byte)0xFC,
+        (byte)0xFE, (byte)0x6B, (byte)0xFD, (byte)0xF9,
+        (byte)0xFC, (byte)0xC7, (byte)0x91, (byte)0x4E,
+        (byte)0x9C, (byte)0xB8, (byte)0x97, (byte)0x67,
+        (byte)0x95, (byte)0xEE, (byte)0x9B, (byte)0xB2,
+        (byte)0x94, (byte)0x60, (byte)0x94, (byte)0xA2,
+        (byte)0x98, (byte)0x75, (byte)0x97, (byte)0xAC,
+        (byte)0x91, (byte)0xD3, (byte)0x98, (byte)0x7B,
+        (byte)0x8E, (byte)0xEB, (byte)0x97, (byte)0x6A,
+        (byte)0x96, (byte)0x5E, (byte)0x97, (byte)0xEB,
+        (byte)0x9F, (byte)0xF9, (byte)0x95, (byte)0xF8,
+        (byte)0xFE, (byte)0xA2, (byte)0x8F, (byte)0xE6,
+        (byte)0xFE, (byte)0x7E, (byte)0x9D, (byte)0xA4,
+        (byte)0x97, (byte)0x68, (byte)0x8E, (byte)0xEC,
+        (byte)0x94, (byte)0xBD, (byte)0x94, (byte)0x5B,
+        (byte)0x9C, (byte)0xF6, (byte)0xFA, (byte)0xA7,
+        (byte)0x9B, (byte)0xD9, (byte)0xFA, (byte)0x5D,
+        (byte)0x96, (byte)0x56, (byte)0x97, (byte)0x62,
+        (byte)0x94, (byte)0xBA, (byte)0xA0, (byte)0x4F,
+        (byte)0x92, (byte)0xD8, (byte)0x9B, (byte)0xCB,
+        (byte)0x94, (byte)0xBB, (byte)0x9D, (byte)0x5F,
+        (byte)0x90, (byte)0xCF, (byte)0x94, (byte)0x65,
+        (byte)0x9F, (byte)0x4C, (byte)0x90, (byte)0xD8,
+        (byte)0x9E, (byte)0xBE, (byte)0xFB, (byte)0x6D,
+        (byte)0x95, (byte)0xCA, (byte)0x9D, (byte)0xC2,
+        (byte)0x97, (byte)0xF8, (byte)0x8F, (byte)0xFC,
+        (byte)0x94, (byte)0x73, (byte)0x94, (byte)0x74,
+        (byte)0xFE, (byte)0xB7, (byte)0x8A, (byte)0x4B,
+        (byte)0x8A, (byte)0x55, (byte)0x8B, (byte)0x69,
+        (byte)0x8A, (byte)0xDC, (byte)0x8B, (byte)0x76,
+        (byte)0x9B, (byte)0xCE, (byte)0x8A, (byte)0x68,
+        (byte)0xA0, (byte)0xF8, (byte)0x98, (byte)0xDF,
+        (byte)0xFE, (byte)0xB5, (byte)0x9B, (byte)0xCF,
+        (byte)0x96, (byte)0xFB, (byte)0x9B, (byte)0xFB,
+        (byte)0x9E, (byte)0xCE, (byte)0x8E, (byte)0xE5,
+        (byte)0x9E, (byte)0x7B, (byte)0x9B, (byte)0xD2,
+        (byte)0x8A, (byte)0xA5, (byte)0xFE, (byte)0xCE,
+        (byte)0x8A, (byte)0x45, (byte)0x9D, (byte)0xFC,
+        (byte)0xFE, (byte)0xCF, (byte)0x8B, (byte)0xA5,
+        (byte)0x8C, (byte)0x4A, (byte)0x8A, (byte)0xEC,
+        (byte)0xFC, (byte)0xE0, (byte)0x94, (byte)0xAD,
+        (byte)0xFE, (byte)0xD5, (byte)0x94, (byte)0xAC,
+        (byte)0xFC, (byte)0x5A, (byte)0x9B, (byte)0xD6,
+        (byte)0x8A, (byte)0x6F, (byte)0x8B, (byte)0xA9,
+        (byte)0x8E, (byte)0x5F, (byte)0x9D, (byte)0xCB,
+        (byte)0xFC, (byte)0xE7, (byte)0x9B, (byte)0xD7,
+        (byte)0x93, (byte)0xC8, (byte)0x91, (byte)0xF0,
+        (byte)0x8F, (byte)0xE0, (byte)0x9B, (byte)0xDB,
+        (byte)0x90, (byte)0xED, (byte)0x9B, (byte)0xDC,
+        (byte)0xA0, (byte)0xEC, (byte)0x98, (byte)0xFA,
+        (byte)0x9B, (byte)0xE0, (byte)0x93, (byte)0xC7,
+        (byte)0x92, (byte)0x49, (byte)0x96, (byte)0xE1,
+        (byte)0x9B, (byte)0xE2, (byte)0x9B, (byte)0xE4,
+        (byte)0x8F, (byte)0xE1, (byte)0x9B, (byte)0xE5,
+        (byte)0x94, (byte)0xC0, (byte)0x93, (byte)0xC3,
+        (byte)0x93, (byte)0xC5, (byte)0x90, (byte)0x79,
+        (byte)0x97, (byte)0x7B, (byte)0x90, (byte)0x7E,
+        (byte)0xFE, (byte)0xE6, (byte)0xFE, (byte)0x46,
+        (byte)0x9D, (byte)0xB8, (byte)0x92, (byte)0x70,
+        (byte)0x95, (byte)0xA8, (byte)0x8C, (byte)0xB0,
+        (byte)0x94, (byte)0xC8, (byte)0x98, (byte)0xB9,
+        (byte)0x91, (byte)0x40, (byte)0xFC, (byte)0xBE,
+        (byte)0x91, (byte)0x57, (byte)0x8B, (byte)0xB2,
+        (byte)0xFA, (byte)0xDF, (byte)0x9B, (byte)0xE6,
+        (byte)0x96, (byte)0x43, (byte)0x8E, (byte)0x44,
+        (byte)0x9C, (byte)0x4F, (byte)0xFE, (byte)0xF4,
+        (byte)0x9B, (byte)0xE8, (byte)0x93, (byte)0xDC,
+        (byte)0x96, (byte)0x6F, (byte)0x8E, (byte)0x4A,
+        (byte)0x9B, (byte)0xED, (byte)0x92, (byte)0xF6,
+        (byte)0x9D, (byte)0xB9, (byte)0x8E, (byte)0x4E,
+        (byte)0xFB, (byte)0xCF, (byte)0x9E, (byte)0xC2,
+        (byte)0x94, (byte)0xE5, (byte)0x9B, (byte)0xF0,
+        (byte)0x94, (byte)0xE4, (byte)0x95, (byte)0x51,
+        (byte)0x8B, (byte)0xBB, (byte)0x9B, (byte)0xF1,
+        (byte)0x94, (byte)0xF0, (byte)0x8E, (byte)0x64,
+        (byte)0x94, (byte)0xEA, (byte)0x8F, (byte)0x61,
+        (byte)0x9B, (byte)0x64, (byte)0x8E, (byte)0x5B,
+        (byte)0x9B, (byte)0xF2, (byte)0x9F, (byte)0xBE,
+        (byte)0x9D, (byte)0xC9, (byte)0x8E, (byte)0x6C,
+        (byte)0x8F, (byte)0x73, (byte)0x8C, (byte)0xAF,
+        (byte)0x8F, (byte)0x75, (byte)0x8E, (byte)0x71,
+        (byte)0x8E, (byte)0x60, (byte)0x8E, (byte)0x6A,
+        (byte)0x8C, (byte)0x4C, (byte)0x95, (byte)0x52,
+        (byte)0x95, (byte)0x54, (byte)0x8A, (byte)0xD4,
+        (byte)0x9D, (byte)0xBB, (byte)0x95, (byte)0x43,
+        (byte)0x92, (byte)0xFE, (byte)0x94, (byte)0xF2,
+        (byte)0x94, (byte)0xF1, (byte)0xA0, (byte)0xEA,
+        (byte)0x9D, (byte)0xD2, (byte)0xA0, (byte)0xB1,
+        (byte)0x91, (byte)0xF8, (byte)0x94, (byte)0x62,
+        (byte)0x9B, (byte)0xA4, (byte)0x8E, (byte)0xAD,
+        (byte)0x9E, (byte)0xAD, (byte)0x96, (byte)0xD0,
+        (byte)0xFE, (byte)0xEE, (byte)0x8A, (byte)0xB4,
+        (byte)0x97, (byte)0x57, (byte)0x8A, (byte)0x77,
+        (byte)0x9B, (byte)0xF7, (byte)0x8E, (byte)0xB5,
+        (byte)0xA0, (byte)0x6D, (byte)0x8E, (byte)0xB6,
+        (byte)0x97, (byte)0x56, (byte)0x95, (byte)0x40,
+        (byte)0xA0, (byte)0xF3, (byte)0x94, (byte)0xBE,
+        (byte)0x9B, (byte)0xFA, (byte)0xFD, (byte)0xDF,
+        (byte)0x9D, (byte)0xBC, (byte)0x94, (byte)0xFE,
+        (byte)0x8B, (byte)0xDB, (byte)0xA0, (byte)0xFE,
+        (byte)0x8E, (byte)0xC0, (byte)0x9F, (byte)0x47,
+        (byte)0x8B, (byte)0xDE, (byte)0xA0, (byte)0xFB,
+        (byte)0x8E, (byte)0xC3, (byte)0x96, (byte)0x49,
+        (byte)0xFE, (byte)0xC2, (byte)0x95, (byte)0x4C,
+        (byte)0x9B, (byte)0xFD, (byte)0x90, (byte)0xCC,
+        (byte)0x9C, (byte)0x60, (byte)0x95, (byte)0x4B,
+        (byte)0x9B, (byte)0xFE, (byte)0x9C, (byte)0x70,
+        (byte)0x9C, (byte)0x43, (byte)0x9C, (byte)0x47,
+        (byte)0x8E, (byte)0xCC, (byte)0x8E, (byte)0x54,
+        (byte)0x8E, (byte)0xE4, (byte)0x9C, (byte)0x49,
+        (byte)0x8B, (byte)0x5E, (byte)0x95, (byte)0x5E,
+        (byte)0x95, (byte)0x5C, (byte)0x9C, (byte)0x4B,
+        (byte)0x8B, (byte)0xE1, (byte)0x8E, (byte)0xD9,
+        (byte)0x9D, (byte)0xB4, (byte)0x92, (byte)0x5F,
+        (byte)0x9C, (byte)0x4C, (byte)0x8A, (byte)0xA1,
+        (byte)0x8E, (byte)0xDB, (byte)0x9C, (byte)0x56,
+        (byte)0x8A, (byte)0xA2, (byte)0x97, (byte)0x54,
+        (byte)0x9C, (byte)0x5E, (byte)0x9E, (byte)0xD4,
+        (byte)0x95, (byte)0x68, (byte)0xA0, (byte)0xC3,
+        (byte)0x8A, (byte)0xE6, (byte)0xA0, (byte)0xF7,
+        (byte)0x9C, (byte)0x61, (byte)0x9C, (byte)0x5F,
+        (byte)0xFC, (byte)0x4D, (byte)0x9E, (byte)0x5B,
+        (byte)0x9E, (byte)0x69, (byte)0x9C, (byte)0x63,
+        (byte)0xFE, (byte)0xC7, (byte)0xFE, (byte)0xC6,
+        (byte)0x9C, (byte)0x67, (byte)0x9C, (byte)0x69,
+        (byte)0x8B, (byte)0xE2, (byte)0x91, (byte)0x65,
+        (byte)0x9C, (byte)0xE7, (byte)0x8A, (byte)0x54,
+        (byte)0x9C, (byte)0x6C, (byte)0x9C, (byte)0x6E,
+        (byte)0xFE, (byte)0x5D, (byte)0x9C, (byte)0x73,
+        (byte)0x95, (byte)0x6A, (byte)0x95, (byte)0x6D,
+        (byte)0x8E, (byte)0xF0, (byte)0x8F, (byte)0x4D,
+        (byte)0x8E, (byte)0xF6, (byte)0xFA, (byte)0xBC,
+        (byte)0x8C, (byte)0xD5, (byte)0xFB, (byte)0xDA,
+        (byte)0x8B, (byte)0x4C, (byte)0xFD, (byte)0x75,
+        (byte)0x9B, (byte)0xDD, (byte)0xFA, (byte)0xF5,
+        (byte)0x9C, (byte)0x74, (byte)0x95, (byte)0x45,
+        (byte)0x96, (byte)0xC6, (byte)0x8F, (byte)0x6A,
+        (byte)0x8F, (byte)0x4E, (byte)0x9C, (byte)0x78,
+        (byte)0xFA, (byte)0x55, (byte)0x97, (byte)0xE4,
+        (byte)0x9C, (byte)0x41, (byte)0x92, (byte)0x5C,
+        (byte)0x96, (byte)0xFA, (byte)0xFB, (byte)0x66,
+        (byte)0x8E, (byte)0x65, (byte)0x98, (byte)0x49,
+        (byte)0xFB, (byte)0xA8, (byte)0x98, (byte)0x42,
+        (byte)0x9C, (byte)0x7A, (byte)0x97, (byte)0xFB,
+        (byte)0x90, (byte)0xCA, (byte)0x9C, (byte)0x5B,
+        (byte)0x97, (byte)0x4D, (byte)0x8E, (byte)0xD3,
+        (byte)0x95, (byte)0x61, (byte)0x9F, (byte)0x4B,
+        (byte)0x9F, (byte)0xB5, (byte)0x93, (byte)0xD2,
+        (byte)0xFD, (byte)0xAA, (byte)0x98, (byte)0x40,
+        (byte)0x91, (byte)0x46, (byte)0x98, (byte)0x67,
+        (byte)0xFA, (byte)0x5A, (byte)0xFB, (byte)0xA9,
+        (byte)0x98, (byte)0x41, (byte)0x8C, (byte)0xD3,
+        (byte)0xFC, (byte)0xFD, (byte)0xFD, (byte)0xAB,
+        (byte)0x91, (byte)0xBD, (byte)0x8F, (byte)0x4C,
+        (byte)0x96, (byte)0xC9, (byte)0x8F, (byte)0x55,
+        (byte)0xFB, (byte)0xAE, (byte)0x95, (byte)0x6F,
+        (byte)0x9C, (byte)0x7D, (byte)0xA0, (byte)0xF0,
+        (byte)0x94, (byte)0x6F, (byte)0xFD, (byte)0xAC,
+        (byte)0x96, (byte)0xCB, (byte)0x96, (byte)0xCE,
+        (byte)0xA0, (byte)0x56, (byte)0x9C, (byte)0xE1,
+        (byte)0x96, (byte)0xC4, (byte)0x8F, (byte)0x5E,
+        (byte)0x8F, (byte)0x6C, (byte)0x8E, (byte)0xA3,
+        (byte)0xFB, (byte)0xB3, (byte)0xFC, (byte)0x53,
+        (byte)0xFD, (byte)0xB3, (byte)0x8F, (byte)0x6B,
+        (byte)0x96, (byte)0xCA, (byte)0x8F, (byte)0x79,
+        (byte)0x9E, (byte)0x6F, (byte)0xA0, (byte)0xC5,
+        (byte)0xFC, (byte)0x78, (byte)0x8E, (byte)0x42,
+        (byte)0x8F, (byte)0x5A, (byte)0x90, (byte)0xC2,
+        (byte)0x8E, (byte)0xA5, (byte)0x90, (byte)0x61,
+        (byte)0x92, (byte)0x4F, (byte)0x93, (byte)0x73,
+        (byte)0xFD, (byte)0xB5, (byte)0xFE, (byte)0xCC,
+        (byte)0xFB, (byte)0xBD, (byte)0x8C, (byte)0xD6,
+        (byte)0x98, (byte)0x43, (byte)0x96, (byte)0xC5,
+        (byte)0x89, (byte)0xBC, (byte)0x9C, (byte)0xA3,
+        (byte)0x92, (byte)0x4B, (byte)0x98, (byte)0x4A,
+        (byte)0x8F, (byte)0xA4, (byte)0xA0, (byte)0xF1,
+        (byte)0x9E, (byte)0xFB, (byte)0x9C, (byte)0xD2,
+        (byte)0x8F, (byte)0xA7, (byte)0xFC, (byte)0x5C,
+        (byte)0x98, (byte)0x45, (byte)0x90, (byte)0x46,
+        (byte)0x8C, (byte)0xD1, (byte)0xFE, (byte)0xFA,
+        (byte)0x95, (byte)0x60, (byte)0x9F, (byte)0x48,
+        (byte)0x92, (byte)0x47, (byte)0x90, (byte)0xFB,
+        (byte)0x9C, (byte)0xA4, (byte)0x95, (byte)0x71,
+        (byte)0x9C, (byte)0xA6, (byte)0x9C, (byte)0xA7,
+        (byte)0x9C, (byte)0xAA, (byte)0x9E, (byte)0xD3,
+        (byte)0x9E, (byte)0x70, (byte)0x9C, (byte)0xAC,
+        (byte)0x8F, (byte)0xAE, (byte)0x95, (byte)0x7D,
+        (byte)0x9C, (byte)0xB0, (byte)0x97, (byte)0xB6,
+        (byte)0xA0, (byte)0xBD, (byte)0x8A, (byte)0xDF,
+        (byte)0x9E, (byte)0xAA, (byte)0x8F, (byte)0xBD,
+        (byte)0x8F, (byte)0xBF, (byte)0x93, (byte)0x69,
+        (byte)0x9B, (byte)0xA7, (byte)0xC8, (byte)0xA4,
+        (byte)0xFE, (byte)0xEA, (byte)0x9B, (byte)0xE1,
+        (byte)0x8B, (byte)0x41, (byte)0x9D, (byte)0xB6,
+        (byte)0xA0, (byte)0xEB, (byte)0x9B, (byte)0xA3,
+        (byte)0x8B, (byte)0xA1, (byte)0x8F, (byte)0xC8,
+        (byte)0x89, (byte)0x4C, (byte)0x98, (byte)0x60,
+        (byte)0x94, (byte)0xC7, (byte)0x8B, (byte)0x58,
+        (byte)0x95, (byte)0xAB, (byte)0x95, (byte)0xAA,
+        (byte)0x9C, (byte)0xC3, (byte)0x9C, (byte)0xC4,
+        (byte)0x93, (byte)0xD6, (byte)0x9D, (byte)0xAC,
+        (byte)0x8B, (byte)0xE6, (byte)0x8A, (byte)0x71,
+        (byte)0x8F, (byte)0xD1, (byte)0x99, (byte)0xD5,
+        (byte)0x90, (byte)0xF4, (byte)0x8A, (byte)0xA3,
+        (byte)0x9C, (byte)0xCE, (byte)0x9C, (byte)0xD4,
+        (byte)0x9C, (byte)0xD5, (byte)0xFB, (byte)0xC8,
+        (byte)0x9D, (byte)0xB3, (byte)0xFC, (byte)0x70,
+        (byte)0x8F, (byte)0xD7, (byte)0x9B, (byte)0x73,
+        (byte)0xFA, (byte)0x5B, (byte)0x8F, (byte)0xD2,
+        (byte)0x90, (byte)0x64, (byte)0x98, (byte)0xB6,
+        (byte)0x96, (byte)0x68, (byte)0x9C, (byte)0xD6,
+        (byte)0x98, (byte)0xBD, (byte)0x8F, (byte)0xDC,
+        (byte)0xFE, (byte)0xF6, (byte)0x8F, (byte)0xD9,
+        (byte)0x95, (byte)0x41, (byte)0x97, (byte)0xF3,
+        (byte)0x9B, (byte)0xF8, (byte)0x9E, (byte)0x6C,
+        (byte)0x8F, (byte)0xF2, (byte)0x8F, (byte)0xEE,
+        (byte)0x9C, (byte)0xD7, (byte)0x9E, (byte)0x6E,
+        (byte)0x8A, (byte)0x40, (byte)0x8F, (byte)0xEF,
+        (byte)0x8F, (byte)0xF4, (byte)0x8F, (byte)0xF5,
+        (byte)0x95, (byte)0xC2, (byte)0x98, (byte)0x6A,
+        (byte)0x97, (byte)0xCF, (byte)0x9E, (byte)0x7C,
+        (byte)0x90, (byte)0x41, (byte)0x9C, (byte)0xDB,
+        (byte)0x94, (byte)0x41, (byte)0x9C, (byte)0xE6,
+        (byte)0x9D, (byte)0xB0, (byte)0x9C, (byte)0xEA,
+        (byte)0x9C, (byte)0xED, (byte)0x9C, (byte)0xFA,
+        (byte)0x8B, (byte)0x62, (byte)0x8A, (byte)0x4E,
+        (byte)0x9C, (byte)0xCA, (byte)0x8A, (byte)0x66,
+        (byte)0x9C, (byte)0xFB, (byte)0x9C, (byte)0xFC,
+        (byte)0x9C, (byte)0xFE, (byte)0x8A, (byte)0x53,
+        (byte)0x9C, (byte)0xE5, (byte)0x9D, (byte)0x40,
+        (byte)0x9D, (byte)0x41, (byte)0x90, (byte)0x45,
+        (byte)0x8B, (byte)0x73, (byte)0x97, (byte)0xCA,
+        (byte)0x9D, (byte)0x42, (byte)0x8A, (byte)0x61,
+        (byte)0x8B, (byte)0xAE, (byte)0x8A, (byte)0xD2,
+        (byte)0x8B, (byte)0xA2, (byte)0x9D, (byte)0xF2,
+        (byte)0x9D, (byte)0x43, (byte)0x9C, (byte)0xDF,
+        (byte)0x9D, (byte)0x44, (byte)0x8E, (byte)0xCA,
+        (byte)0x90, (byte)0x4E, (byte)0x8E, (byte)0xB3,
+        (byte)0x9F, (byte)0xF5, (byte)0x9D, (byte)0x45,
+        (byte)0x90, (byte)0x4F, (byte)0x9D, (byte)0x47,
+        (byte)0x89, (byte)0xCA, (byte)0x9C, (byte)0xB5,
+        (byte)0xFB, (byte)0xFE, (byte)0x90, (byte)0x5E,
+        (byte)0x90, (byte)0x63, (byte)0x90, (byte)0x57,
+        (byte)0x90, (byte)0x66, (byte)0x9B, (byte)0xC0,
+        (byte)0xFC, (byte)0xE5, (byte)0x91, (byte)0x62,
+        (byte)0x90, (byte)0x67, (byte)0x8F, (byte)0xA1,
+        (byte)0x8F, (byte)0xA2, (byte)0x9D, (byte)0x48,
+        (byte)0xFA, (byte)0xD3, (byte)0x90, (byte)0x5D,
+        (byte)0x90, (byte)0xB9, (byte)0x90, (byte)0x6B,
+        (byte)0x8C, (byte)0x5C, (byte)0x90, (byte)0x69,
+        (byte)0xFE, (byte)0x57, (byte)0xFE, (byte)0x55,
+        (byte)0x90, (byte)0x73, (byte)0x9B, (byte)0xEF,
+        (byte)0x9C, (byte)0xF0, (byte)0x9D, (byte)0x4B,
+        (byte)0xFE, (byte)0xD9, (byte)0xFE, (byte)0xDA,
+        (byte)0x91, (byte)0xE0, (byte)0x91, (byte)0xD8,
+        (byte)0x96, (byte)0x46, (byte)0x93, (byte)0x60,
+        (byte)0xFA, (byte)0x53, (byte)0x9C, (byte)0xD3,
+        (byte)0x9D, (byte)0x4E, (byte)0xFB, (byte)0x40,
+        (byte)0x8D, (byte)0xE2, (byte)0x94, (byte)0x42,
+        (byte)0x90, (byte)0x56, (byte)0x98, (byte)0x65,
+        (byte)0x8C, (byte)0x6C, (byte)0xFA, (byte)0x4A,
+        (byte)0x9D, (byte)0x50, (byte)0x9D, (byte)0x52,
+        (byte)0x95, (byte)0xAF, (byte)0x97, (byte)0x5A,
+        (byte)0x93, (byte)0x49, (byte)0x97, (byte)0x47,
+        (byte)0xA0, (byte)0xF4, (byte)0x97, (byte)0x78,
+        (byte)0x8F, (byte)0xCF, (byte)0xFC, (byte)0x60,
+        (byte)0x8C, (byte)0x4E, (byte)0xFC, (byte)0x56,
+        (byte)0x91, (byte)0xDC, (byte)0x96, (byte)0x61,
+        (byte)0x92, (byte)0xEC, (byte)0x93, (byte)0x5D,
+        (byte)0x8E, (byte)0xDE, (byte)0x96, (byte)0xFE,
+        (byte)0xFD, (byte)0x4F, (byte)0x95, (byte)0xDE,
+        (byte)0x98, (byte)0xB0, (byte)0xA0, (byte)0x40,
+        (byte)0x97, (byte)0xBD, (byte)0x97, (byte)0x7D,
+        (byte)0x97, (byte)0xF5, (byte)0x9B, (byte)0xAC,
+        (byte)0xFA, (byte)0xDA, (byte)0x92, (byte)0xC2,
+        (byte)0x97, (byte)0xB1, (byte)0x90, (byte)0x7B,
+        (byte)0x93, (byte)0xFE, (byte)0x94, (byte)0x7B,
+        (byte)0x97, (byte)0x77, (byte)0xFA, (byte)0xBE,
+        (byte)0xFD, (byte)0x43, (byte)0x90, (byte)0xC6,
+        (byte)0x90, (byte)0xA4, (byte)0x90, (byte)0xA8,
+        (byte)0x94, (byte)0xA9, (byte)0x90, (byte)0xA9,
+        (byte)0x8C, (byte)0x65, (byte)0x95, (byte)0xE0,
+        (byte)0x90, (byte)0x7D, (byte)0x92, (byte)0x65,
+        (byte)0xFD, (byte)0xBA, (byte)0x93, (byte)0xC4,
+        (byte)0xFE, (byte)0xED, (byte)0x9D, (byte)0xAB,
+        (byte)0xA0, (byte)0xE3, (byte)0x96, (byte)0x48,
+        (byte)0x9D, (byte)0x53, (byte)0x8A, (byte)0xA9,
+        (byte)0x9B, (byte)0xC5, (byte)0x96, (byte)0x5D,
+        (byte)0x97, (byte)0x5F, (byte)0x96, (byte)0x5F,
+        (byte)0x96, (byte)0x6E, (byte)0xFB, (byte)0x5D,
+        (byte)0x9D, (byte)0xB1, (byte)0xFE, (byte)0xA3,
+        (byte)0x9D, (byte)0xB2, (byte)0x95, (byte)0xAE,
+        (byte)0xFC, (byte)0xA3, (byte)0xA0, (byte)0xA2,
+        (byte)0x96, (byte)0x55, (byte)0x9D, (byte)0x54,
+        (byte)0x93, (byte)0x41, (byte)0x95, (byte)0xAD,
+        (byte)0x91, (byte)0xD5, (byte)0x97, (byte)0x7A,
+        (byte)0xFD, (byte)0xFC, (byte)0x8E, (byte)0x47,
+        (byte)0x93, (byte)0xFD, (byte)0x90, (byte)0xA5,
+        (byte)0x90, (byte)0xAC, (byte)0x95, (byte)0xAC,
+        (byte)0x90, (byte)0xAE, (byte)0xFE, (byte)0xA5,
+        (byte)0x9D, (byte)0x56, (byte)0x97, (byte)0xE3,
+        (byte)0x95, (byte)0xE2, (byte)0x94, (byte)0x66,
+        (byte)0x96, (byte)0x47, (byte)0x91, (byte)0xB8,
+        (byte)0x9C, (byte)0xEC, (byte)0x90, (byte)0xAD,
+        (byte)0x95, (byte)0xE3, (byte)0x8B, (byte)0x4F,
+        (byte)0x8A, (byte)0xE3, (byte)0x8B, (byte)0x4D,
+        (byte)0x95, (byte)0xEA, (byte)0x8B, (byte)0x4E,
+        (byte)0x8C, (byte)0xC1, (byte)0x8B, (byte)0xED,
+        (byte)0x91, (byte)0xD9, (byte)0xA0, (byte)0xA4,
+        (byte)0x95, (byte)0xF5, (byte)0x95, (byte)0xF4,
+        (byte)0x9F, (byte)0xB3, (byte)0xFE, (byte)0xAF,
+        (byte)0xFE, (byte)0x72, (byte)0x92, (byte)0x7A,
+        (byte)0xFE, (byte)0xAC, (byte)0x95, (byte)0xF3,
+        (byte)0x9D, (byte)0x58, (byte)0x93, (byte)0x72,
+        (byte)0x91, (byte)0xC5, (byte)0x96, (byte)0x42,
+        (byte)0x90, (byte)0xCD, (byte)0x95, (byte)0xFE,
+        (byte)0x91, (byte)0x59, (byte)0x9C, (byte)0x65,
+        (byte)0x97, (byte)0xCC, (byte)0x90, (byte)0xCE,
+        (byte)0x9D, (byte)0x59, (byte)0xFC, (byte)0xF5,
+        (byte)0xFE, (byte)0xFD, (byte)0x9D, (byte)0x5B,
+        (byte)0x9D, (byte)0x5C, (byte)0x93, (byte)0x7E,
+        (byte)0x98, (byte)0xAC, (byte)0x9D, (byte)0x5E,
+        (byte)0xFD, (byte)0xD0, (byte)0xFD, (byte)0x60,
+        (byte)0x9C, (byte)0xCF, (byte)0x90, (byte)0xDD,
+        (byte)0x90, (byte)0xE0, (byte)0x90, (byte)0xF3,
+        (byte)0x98, (byte)0xB1, (byte)0x90, (byte)0xF0,
+        (byte)0x93, (byte)0xBD, (byte)0x95, (byte)0xB7,
+        (byte)0x9F, (byte)0x46, (byte)0x8E, (byte)0x4B,
+        (byte)0x96, (byte)0x58, (byte)0x8A, (byte)0x4C,
+        (byte)0x9D, (byte)0x63, (byte)0x9E, (byte)0xCF,
+        (byte)0x9D, (byte)0x65, (byte)0x9D, (byte)0x66,
+        (byte)0x96, (byte)0x5A, (byte)0x9D, (byte)0x64,
+        (byte)0x8A, (byte)0x6C, (byte)0x8A, (byte)0xD9,
+        (byte)0x9D, (byte)0x67, (byte)0x8A, (byte)0x70,
+        (byte)0x8B, (byte)0xF3, (byte)0x91, (byte)0x50,
+        (byte)0x9C, (byte)0xC1, (byte)0x9D, (byte)0x68,
+        (byte)0x93, (byte)0xA7, (byte)0x96, (byte)0x74,
+        (byte)0xA0, (byte)0xEF, (byte)0x91, (byte)0x51,
+        (byte)0x96, (byte)0xC1, (byte)0x8C, (byte)0x64,
+        (byte)0x96, (byte)0x76, (byte)0x9D, (byte)0x69,
+        (byte)0xFC, (byte)0xA4, (byte)0x9D, (byte)0x6A,
+        (byte)0x92, (byte)0x4E, (byte)0x9D, (byte)0x6B,
+        (byte)0x9B, (byte)0xC1, (byte)0x9D, (byte)0x6C,
+        (byte)0x8A, (byte)0x65, (byte)0x91, (byte)0x5D,
+        (byte)0x9D, (byte)0x6D, (byte)0x91, (byte)0x5A,
+        (byte)0x8C, (byte)0x42, (byte)0x9C, (byte)0xC0,
+        (byte)0x91, (byte)0x6A, (byte)0x9D, (byte)0x6E,
+        (byte)0x9E, (byte)0xA6, (byte)0x9D, (byte)0xCD,
+        (byte)0x9D, (byte)0x6F, (byte)0x89, (byte)0xBB,
+        (byte)0x9E, (byte)0xF9, (byte)0x96, (byte)0xB4,
+        (byte)0x91, (byte)0x72, (byte)0x9E, (byte)0xC8,
+        (byte)0x8B, (byte)0x55, (byte)0x9D, (byte)0x71,
+        (byte)0x9D, (byte)0x72, (byte)0x9E, (byte)0xCC,
+        (byte)0x91, (byte)0x74, (byte)0x9E, (byte)0xD0,
+        (byte)0x90, (byte)0x5C, (byte)0x8E, (byte)0xD2,
+        (byte)0x91, (byte)0xA8, (byte)0x91, (byte)0x77,
+        (byte)0x96, (byte)0xBF, (byte)0x96, (byte)0xC0,
+        (byte)0x8F, (byte)0xB1, (byte)0x96, (byte)0xB7,
+        (byte)0x8C, (byte)0x55, (byte)0x91, (byte)0x78,
+        (byte)0x89, (byte)0xBE, (byte)0x91, (byte)0x7C,
+        (byte)0xFB, (byte)0x77, (byte)0x91, (byte)0x75,
+        (byte)0x91, (byte)0xA3, (byte)0x91, (byte)0x76,
+        (byte)0x96, (byte)0xBE, (byte)0x91, (byte)0x79,
+        (byte)0x96, (byte)0xB6, (byte)0x91, (byte)0xA4,
+        (byte)0x91, (byte)0xA6, (byte)0x9D, (byte)0x75,
+        (byte)0x90, (byte)0x52, (byte)0xA0, (byte)0x45,
+        (byte)0x91, (byte)0xA9, (byte)0x98, (byte)0xAA,
+        (byte)0x8C, (byte)0x5F, (byte)0x8B, (byte)0xAA,
+        (byte)0x9C, (byte)0xDD, (byte)0x9D, (byte)0x77,
+        (byte)0x89, (byte)0x40, (byte)0x9E, (byte)0xEC,
+        (byte)0x93, (byte)0xAA, (byte)0x94, (byte)0x78,
+        (byte)0x9D, (byte)0x7A, (byte)0x8A, (byte)0xC9,
+        (byte)0x8B, (byte)0x4B, (byte)0x9F, (byte)0xEC,
+        (byte)0x8A, (byte)0xE2, (byte)0x9E, (byte)0x75,
+        (byte)0x98, (byte)0x74, (byte)0x9A, (byte)0xC8,
+        (byte)0xA0, (byte)0x47, (byte)0x8B, (byte)0xC3,
+        (byte)0xFC, (byte)0x48, (byte)0xFC, (byte)0x77,
+        (byte)0x9C, (byte)0x52, (byte)0x8E, (byte)0xFD,
+        (byte)0x8F, (byte)0xA8, (byte)0x95, (byte)0x7A,
+        (byte)0x8F, (byte)0xF0 };
+
+
+    /*
+     * Tests the roundtrip integrity and expected encoding
+     * correctness for a String containing the 1651 surrogate
+     * pairs equivalent to 1651 supplementary characters whose
+     * mappings are covered by HKSCS (2001)
+     */
+
+    public static void main(String[] args) throws Exception {
+        char[] surrogatePair = new char[2];
+
+        for (int i=0, j=0 ; j < expectBytes.length ; i++, j+=2) {
+            surrogatePair[0] = (char) ((suppValues[i] - 0x10000) / 0x400 + 0xd800);
+            surrogatePair[1] = (char) ((suppValues[i] - 0x10000) % 0x400 + 0xdc00);
+            String testStr = new String(surrogatePair);
+            byte[] encodedBytes = testStr.getBytes("Big5-HKSCS");
+
+            if (encodedBytes[0] != expectBytes[j]
+                && encodedBytes[1] != expectBytes[j+1])
+                    throw new Exception("HKSCS Surrogate Encoder error");
+
+            String decoded = new String(encodedBytes, "Big5-HKSCS");
+
+            if (!decoded.equals(testStr)) {
+                throw new Exception("HKSCS Decoder error");
+            }
+        }
+     }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test4200310.sh	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,41 @@
+#
+# 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 4200310
+# @summary make sure class files are not duplicated between rt.jar,
+# charsets.jar, and localedata.jar
+# @author Norbert Lindenberg
+# @run shell Test4200310.sh
+
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/rt.jar" > class-list
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/charsets.jar" >> class-list
+2>1 $TESTJAVA/bin/jar -tf "$TESTJAVA/jre/lib/ext/localedata.jar" >> class-list
+duplicates=`grep '\.class$' class-list | sort | uniq -d`
+
+rm -f class-list
+if [ "$duplicates" != "" ]; then
+   echo FAILED: $duplicates are duplicated between rt.jar, charsets.jar, and localedata.jar
+   exit 1
+fi
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test4206507.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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 4206507
+   @summary verify that we can obtain and use a converter for encoding
+    ISO8859-9 in the Turkish locale.
+ */
+
+import java.util.Locale;
+import java.io.UnsupportedEncodingException;
+
+public class Test4206507 {
+    public static void main(String[] args) throws UnsupportedEncodingException {
+        Locale.setDefault(new Locale("tr", "TR"));
+        byte[] b = "".getBytes("ISO8859-9");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test6254467.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,38 @@
+/*
+ * 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 6254467
+   @summary Checks if Charset.forName() accepts legal IANA alias names
+            for charset IBM037.
+ */
+import java.nio.charset.Charset;
+
+public class Test6254467 {
+    public static void main (String[] args) throws Exception {
+            Charset ebcdic = Charset.forName("ebcdic-cp-us");
+            ebcdic = Charset.forName("ebcdic-cp-ca");
+            ebcdic = Charset.forName("ebcdic-cp-wt");
+            ebcdic = Charset.forName("ebcdic-cp-nl");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test6275027.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * 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 6275027
+   @summary Check if StreamEncoder works correctly when fed with unpaired
+            surrogates.
+ */
+
+import java.io.*;
+public class Test6275027 {
+    public static void main( String arg[] ) throws Exception {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        PrintStream ps = new PrintStream(baos);
+        ps.print("\uda00");
+        ps.print("\uda01");
+        ps.close();
+        if (!"??".equals(baos.toString()))
+            throw new Exception("failed");
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/Test6392804.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+
+/*
+   @bug 6392804
+   @summary Decoder fails to detect decoding error
+*/
+import java.nio.*;
+import java.nio.charset.*;
+
+public class Test6392804 {
+    public static void main(String[] args) throws Throwable {
+        test("ISO-2022-JP",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("ISO-2022-JP-2",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("x-windows-50220",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("x-windows-50221",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("x-windows-iso2022jp",
+             new byte[] {0x1b,(byte)0x8e, 0x24, 0x40, 0x0, 0x0});
+        test("EUC_TW",
+             new byte[] {(byte)0x8e, (byte)0xa8, (byte)0xad, (byte)0xe5});
+        //out of range second  byte
+        test("EUC_TW",
+             new byte[] {(byte)0x8e, (byte)0x92, (byte)0xa1, (byte)0xa1});
+        test("EUC_TW",
+             new byte[] {(byte)0x8e, (byte)0x98, (byte)0xa1, (byte)0xa1});
+    }
+
+    static void test(String csn, byte[] bytes) throws Throwable {
+        CharsetDecoder dec = Charset.forName(csn).newDecoder();
+        CharBuffer cb = CharBuffer.allocate(1024);
+        CoderResult cr = dec.decode(ByteBuffer.wrap(bytes), cb, true);
+        if (cr.isUnderflow())
+            throw new RuntimeException(csn + " failed cr=" + cr);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestCompoundTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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 6427981
+ * @summary Check the Compound_Text's canonical name and its aliases
+ */
+
+import java.nio.charset.*;
+import java.util.Set;
+
+public class TestCompoundTest {
+
+    public static void main(String args[]) throws Exception
+    {
+        if (System.getProperty("os.name").startsWith("Windows"))
+            return;
+        Charset cs = Charset.forName("COMPOUND_TEXT");
+        if (!cs.name().startsWith("x-"))
+            throw new RuntimeException("FAILED: name does not start with x-");
+        Set<String> aliases = cs.aliases();
+        if (!aliases.contains("COMPOUND_TEXT") ||
+            !aliases.contains("x-compound-text") ||
+            !aliases.contains("x11-compound_text"))
+            throw new RuntimeException("FAILED: alias name is missing");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,92 @@
+/*
+ * 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 4122961
+   @summary Verify that converters don't drop characters on buffer boundaries
+
+   This is a slightly modified version of the attachment supplied with the
+   bug report.
+ */
+import java.io.*;
+
+public class TestConverterDroppedCharacters {
+    public static void main(String args[])
+        throws java.io.IOException, java.io.UnsupportedEncodingException,
+               java.io.FileNotFoundException
+    {
+        /* Try misc. encodings, many are broken. */
+        tryEncoding("Big5");
+        tryEncoding("CNS11643");
+        tryEncoding("Cp1006");
+        tryEncoding("Cp1381");
+        tryEncoding("Cp33722");
+        tryEncoding("GB2312");
+        tryEncoding("KSC5601");
+        tryEncoding("SJIS");
+        tryEncoding("UTF8");
+    }
+
+    static void tryEncoding(String encoding)
+        throws java.io.IOException, java.io.UnsupportedEncodingException,
+               java.io.FileNotFoundException
+    {
+        String filename = "OUTPUT";
+        int goesBadAfter = 8193;
+        int i;
+        char data[] = new char[goesBadAfter+1];
+
+        System.out.println("Testing " + encoding);
+
+        /* Create some data */
+        for(i = 0; i < goesBadAfter; i++) {
+            data[i] = (char)((i % 0x7f) + 1);
+        }
+
+        /* Write the data out to a file. */
+        FileOutputStream fout = new FileOutputStream(filename);
+        OutputStreamWriter ow = new OutputStreamWriter(fout, encoding);
+        BufferedWriter fd     = new BufferedWriter(ow);
+        fd.write(data,0,goesBadAfter);
+        fd.close();
+
+        /* Now read it back with the same encoding. */
+        char buf[] = new char[goesBadAfter+1];
+        FileInputStream fin = new FileInputStream("OUTPUT");
+        InputStreamReader ir = new InputStreamReader(fin, encoding);
+        ir.read(buf,0,goesBadAfter);
+        ir.close();
+
+        /* And check to see if what we wrote is what we got back. */
+        for(i = 0; i < goesBadAfter; i++) {
+            if (data[i] != buf[i]) {
+                System.out.println("ERROR with encoding " + encoding
+                                   + ": Data wrong at position " + i + "   "
+                                   + "in: " + (int)data[i] + "   "
+                                   + "out: " + (int)buf[i]);
+                throw new RuntimeException();
+            }
+        }
+        System.out.println("Successfully tested " + encoding);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestCp834_SBCS.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,101 @@
+/*
+ * 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 6379808
+   @summary Check all Cp933 SBCS characters are not supported in Cp834
+ */
+
+import sun.io.*;
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestCp834_SBCS {
+    public static void main(String args[]) throws Exception {
+        // The correctness of 1:1 mapping is Coverted by CoderTest.java
+        // and TestConv.java, we only need to verify that SBCS characters
+        // are not supported by this charset.
+        CharToByteConverter cb834 = CharToByteConverter.getConverter("Cp834");
+        ByteToCharConverter bc834 = ByteToCharConverter.getConverter("Cp834");
+        CharsetEncoder enc834 = Charset.forName("Cp834")
+                                       .newEncoder()
+                                       .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                                       .onMalformedInput(CodingErrorAction.REPLACE);
+
+        CharsetDecoder dec834 = Charset.forName("Cp834")
+                                       .newDecoder()
+                                       .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                                       .onMalformedInput(CodingErrorAction.REPLACE);
+
+        CharsetDecoder dec933 = Charset.forName("Cp933")
+                                       .newDecoder()
+                                       .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                                       .onMalformedInput(CodingErrorAction.REPLACE);
+        byte[] ba = new byte[1];
+        byte[] ba2 = new byte[2];
+        ByteBuffer dbb = ByteBuffer.allocateDirect(10);
+        char[] ca = new char[1];
+        char c;
+        for (int i = 0; i <= 0xff; i++) {
+            if (i != 0xe && i != 0xf) {   // no SI/SO
+                ba[0] = (byte)i;
+                CharBuffer cb = dec933.decode(ByteBuffer.wrap(ba));
+                if ((c = cb.get()) != '\ufffd') {
+                    // OK, this is a SBCS character in Cp933
+                    if (dec834.decode(ByteBuffer.wrap(ba)).get() != '\ufffd')
+                        throw new Exception("SBCS is supported in IBM834 decoder");
+
+                    if (enc834.canEncode(c))
+                        throw new Exception("SBCS can be encoded in IBM834 encoder");
+
+                    ca[0] = c;
+                    ByteBuffer bb = enc834.encode(CharBuffer.wrap(ca));
+                    if (bb.get() != (byte)0xfe || bb.get() != (byte)0xfe)
+                        throw new Exception("SBCS is supported in IBM834 encoder");
+
+                    boolean isMalformed = false;
+                    int ret = 0;
+                    bc834.reset();
+                    try {
+                        ret = bc834.convert(ba, 0, 1, ca, 0, 1);
+                    } catch (sun.io.MalformedInputException x) { isMalformed = true; }
+                    if (!isMalformed && ret != 0 && ca[0] != '\ufffd') {
+                        // three scenarios (1)malformed (2)held as an incomplete
+                        // input or (3)return replacement all mean "no sbcs"
+                        throw new Exception("SBCS is supported in Cp834 b2c");
+                    }
+
+                    if (cb834.canConvert(c))
+                        throw new Exception("SBCS can be converted in Cp834 c2b ");
+
+                    ca[0] = c;
+                    if (cb834.convert(ca, 0, 1, ba2, 0, 2) != 2 ||
+                        ba2[0] != (byte)0xfe || ba2[1] != (byte)0xfe) {
+                        throw new Exception("SBCS is supported in Cp834 c2b");
+                    }
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestCp93xSISO.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * 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 4429358
+   @summary Remove illegal SI/SO char to byte mappings
+ */
+
+public class TestCp93xSISO {
+    public static void main ( String[] args) throws Exception {
+        int exceptionCount = 0;
+        String[] encName = {"Cp930", "Cp933", "Cp935", "Cp937", "Cp939" };
+
+        String s = "\u000e\u000f" ;
+
+        for ( int i=0; i < encName.length; i++) { // Test 2 converters.
+            try {
+                byte[] encoded = s.getBytes(encName[i]);
+                for (int j=0 ; j<encoded.length; j++) {
+                    if (encoded[j] != (byte)0x6f) // Expect to map to 0x6f
+                        exceptionCount++;
+                }
+            } catch (Throwable t) {
+                    System.err.println("error with converter " + encName[i]);
+                    exceptionCount++;
+            }
+        }
+
+        if (exceptionCount > 0)
+           throw new Exception ("bug4429369: Cp93x SI/SO Ch->Byte mappings incorrect");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestIBMBugs.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,146 @@
+/*
+ * 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 6371437 6371422 6371416 6371619 5058184 6371431
+   @summary Check if the problems reported in above bugs have been fixed
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestIBMBugs {
+
+    private static void bug6371437() throws Exception {
+        CharsetEncoder converter = Charset.forName("Cp933").newEncoder();
+        converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+        converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+        CharBuffer in = CharBuffer.wrap(new char[] { (char)4352 });
+        try {
+              ByteBuffer out = converter.encode(in);
+        } catch (CharacterCodingException e) { }
+    }
+
+    private static void bug6371422() throws Exception {
+        String[] charsets = { "Cp949", "Cp949C" };
+        for (int n = 0; n < charsets.length; n++) {
+            String charset = charsets[n];
+            CharsetEncoder converter = Charset.forName(charset).newEncoder();
+            converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+            converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+            int errors = 0;
+            for (int i = 1; i < 0x1ffff; i++) {
+                if (i >= 0x1100 && i <= 0x11f9)
+                    continue;  //Dont try leading consonant, vowel and trailing
+                               //consonant as a single char
+                char[] in = (i < 0x10000
+                         ? new char[] { (char)i }
+                             : new char[] { (char)(0xd800 + ((i - 0x10000) >> 10)),
+                              (char)(0xdc00 + ((i - 0x10000) & 0x3ff)) });
+
+                try {
+                    ByteBuffer out = converter.encode(CharBuffer.wrap(in));
+                    if (out.remaining() == 0 ||
+                        (out.remaining() == 1 && out.get(0) == 0x00)) {
+                    errors++;
+                    }
+                } catch (CharacterCodingException e) { }
+            }
+            if (errors > 0)
+                throw new Exception("Charset "+charset+": "+errors+" errors");
+        }
+    }
+
+    private static void bug6371416() throws Exception {
+        String[] charsets = { "Cp933", "Cp949", "Cp949C", "Cp970"};
+        for (int n = 0; n < charsets.length; n++) {
+            String charset = charsets[n];
+            CharsetEncoder converter = Charset.forName(charset).newEncoder();
+            converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+            converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+            int errors = 0;
+            for (int i = 0xd800; i < 0xe000; i++) {
+                char[] in = new char[] { (char)i };
+                try {
+                    ByteBuffer out = converter.encode(CharBuffer.wrap(in));
+                    if (out.remaining() == 0)
+                        errors++;
+                } catch (CharacterCodingException e) { }
+            }
+            if (errors > 0)
+                throw new Exception("Charset "+charset+": "+errors+" errors");
+        }
+    }
+
+    private static void bug6371619() throws Exception {
+        String encoding = "Cp964";
+        Charset charset = Charset.forName(encoding);
+        CharsetDecoder converter = charset.newDecoder();
+        converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+        converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+        int errors = 0;
+        for (int b = 0x80; b < 0x100; b++)
+            if (!(b == 0x8e ||  // 0x8e is a SS2
+                  (b >= 0x80 && b <= 0x8d) || (b >= 0x90 && b <= 0x9f))) {
+                ByteBuffer in = ByteBuffer.wrap(new byte[] { (byte)b });
+                try {
+                    CharBuffer out = converter.decode(in);
+                    if (out.length() == 0) {
+                        errors++;
+                    }
+                } catch (CharacterCodingException e) { }
+            }
+        if (errors > 0)
+            throw new Exception("Charset "+charset+": "+errors+" errors");
+    }
+
+
+    private static void bug6371431() throws Exception {
+        String encoding = "Cp33722";
+        Charset charset = Charset.forName(encoding);
+        CharsetDecoder converter = charset.newDecoder();
+        converter = converter.onMalformedInput(CodingErrorAction.REPORT);
+        converter = converter.onUnmappableCharacter(CodingErrorAction.REPORT);
+        int errors = 0;
+        for (int b = 0xa0; b < 0x100; b++) {
+            ByteBuffer in = ByteBuffer.wrap(new byte[] { (byte)b });
+            try {
+                CharBuffer out = converter.decode(in);
+                if (out.length() == 0) {
+                    errors++;
+                }
+            } catch (CharacterCodingException e) { }
+        }
+        if (errors > 0)
+            throw new Exception("Charset "+charset+": "+errors+" errors");
+    }
+
+    public static void main (String[] args) throws Exception {
+        bug6371437();
+        bug6371422();
+        bug6371416();
+        bug6371619();
+        bug6371431();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISCII91.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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 6431650
+   @summary Check charset ISCII91 and C2B/B2CISCII91 yield same encoding/decoding result
+ */
+
+
+import java.nio.*;
+import java.nio.charset.*;
+import sun.io.*;
+
+public class TestISCII91 {
+    public static void main(String[] args) throws Throwable{
+        CharToByteConverter c2b = new CharToByteISCII91();
+        ByteToCharConverter b2c = new ByteToCharISCII91();
+        Charset cs = Charset.forName("ISCII91");
+        String charsToEncode = getCharsForEncoding("ISCII91");
+
+        byte [] c2bBytes = c2b.convertAll(charsToEncode.toCharArray());
+        byte [] csBytes = cs.encode(charsToEncode).array();
+        for (int i = 0; i < c2bBytes.length; ++i) {
+            if (c2bBytes[i] != csBytes[i])
+                throw new RuntimeException("ISCII91 encoding failed!");
+        }
+
+        char[] c2bChars = b2c.convertAll(c2bBytes);
+        char[] csChars = cs.decode(ByteBuffer.wrap(csBytes)).array();
+        for (int i = 0; i < c2bChars.length; ++i) {
+            if (c2bChars[i] != csChars[i])
+                throw new RuntimeException("ISCII91 decoding failed!");
+        }
+    }
+
+
+    static String getCharsForEncoding(String encodingName)
+        throws CharacterCodingException{
+        Charset set = Charset.forName(encodingName);
+        CharBuffer chars = CharBuffer.allocate(300);
+        CharsetEncoder encoder = set.newEncoder();
+        for (int c = 0; chars.remaining() > 0 && c < Character.MAX_VALUE; ++c) {
+            if (Character.isDefined((char) c) && !Character.isISOControl((char) c) && encoder.canEncode((char) c)) {
+                chars.put((char) c);
+            }
+        }
+        chars.limit(chars.position());
+        chars.rewind();
+        return chars.toString();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISO2022CNDecoder.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,440 @@
+/*
+ * 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 4779029 4924625 6392664
+   @summary Test decoding of various permutations of valid ISO-2022-CN byte sequences
+ */
+
+/*
+ * Regression test for NIO ISO-2022-CN decoder. Passes various valid
+ * ISO-2022-CN byte sequences to the decoder using the java.io
+ * InputStreamReader API
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022CNDecoder
+{
+    private static String encodingName = "ISO2022CN";
+
+    //
+    // Positive tests -- test both output and input processing against
+    // various "known good" data
+    //
+    private static boolean decodeTest (
+        byte encoded[],
+        char decoded[],
+        String label)
+    {
+        boolean retval = true;
+        int i = 0;
+
+        try {
+            //
+            // Ensure that reading decodes correctly
+            //
+            ByteArrayInputStream in;
+            InputStreamReader reader;
+
+            in = new ByteArrayInputStream(encoded);
+            reader = new InputStreamReader(in, encodingName);
+
+            for (i = 0; i < decoded.length; i++) {
+                int c = reader.read();
+
+                if (c != decoded[i]) {
+                    System.err.print(label + ": read failed, char " + i);
+                    System.err.print(" ... expected 0x"
+                            + Integer.toHexString(decoded[i]));
+                    if (c == -1)
+                        System.err.println(", got EOF");
+                    else
+                        System.err.println(", got 0x"
+                            + Integer.toHexString(c));
+                    retval = false;
+                    if (c == -1)
+                        return retval;
+                }
+            }
+
+            int testChar;
+            if ((testChar = reader.read()) != -1) {
+                System.err.println(label + ": read failed, no EOF");
+                System.err.println("testChar is " +
+                        Integer.toHexString((int)testChar));
+                return false;
+            }
+            String decodedString = new String(encoded, "ISO2022CN");
+
+            for (i = 0; i < decodedString.length(); i++) {
+                if (decodedString.charAt(i) != decoded[i])
+                    System.err.println(label + ": read failed, char " + i);
+            }
+
+            CharsetDecoder dec = Charset.forName("ISO2022CN")
+                .newDecoder()
+                .onUnmappableCharacter(CodingErrorAction.REPLACE)
+                .onMalformedInput(CodingErrorAction.REPLACE);
+            ByteBuffer bb = ByteBuffer.allocateDirect(encoded.length).put(encoded);
+            bb.flip();
+            CharBuffer cb = ByteBuffer.allocateDirect(2*encoded.length*(int)dec.maxCharsPerByte())
+                                      .asCharBuffer();
+            if (bb.hasArray() || cb.hasArray()) {
+                System.err.println(label + ": directBuffer failed, ");
+                return false;
+            }
+            if (!dec.decode(bb, cb, true).isUnderflow()) {
+                System.err.println(label + ": decoder's decode() failed!");
+                return false;
+            }
+            cb.flip();
+            for (i = 0; i < cb.limit(); i++) {
+                if (cb.get() != decoded[i])
+                    System.err.println(label + ": decoder failed, char " + i);
+            }
+
+        } catch (Exception e) {
+            System.err.println(label + ": failed "
+                + "(i = " + i + "), "
+                + e.getClass().getName()
+                + ", " + e.getMessage());
+            e.printStackTrace();
+            return false;
+        }
+        return retval;
+    }
+
+    private static boolean equal(CoderResult a, CoderResult b) {
+        return (a == CoderResult.OVERFLOW && b == CoderResult.OVERFLOW) ||
+            (a == CoderResult.UNDERFLOW && b == CoderResult.UNDERFLOW) ||
+            ((a.isError() == b.isError()) &&
+             (a.isMalformed() == b.isMalformed()) &&
+             (a.isUnmappable() == b.isUnmappable()) &&
+             (a.length() == b.length()));
+    }
+
+    private static boolean decodeResultTest (byte encoded[],
+                                             CoderResult expected,
+                                             String label) {
+        CharsetDecoder dec = Charset.forName("ISO2022CN").newDecoder();
+        ByteBuffer bb = ByteBuffer.wrap(encoded);
+        CharBuffer cb = CharBuffer.allocate(encoded.length*(int)dec.maxCharsPerByte());
+        CoderResult result = dec.decode(bb, cb, true);
+        if (!equal(result, expected)) {
+            System.err.println(label + ": decoder's decode() failed!");
+            return false;
+        }
+
+        bb = ByteBuffer.allocateDirect(encoded.length).put(encoded);
+        bb.flip();
+        cb = ByteBuffer.allocateDirect(2*encoded.length*(int)dec.maxCharsPerByte())
+            .asCharBuffer();
+        if (bb.hasArray() || cb.hasArray()) {
+            System.err.println(label + ": directBuffer failed, ");
+            return false;
+        }
+        result = dec.reset().decode(bb, cb, true);
+        if (!equal(result, expected)) {
+            System.err.println(label + ": decoder's decode() - direct failed!");
+            return false;
+        }
+        return true;
+    }
+
+    //
+    // Negative tests -- only for input processing, make sure that
+    // invalid or corrupt characters are rejected.
+    //
+    private static boolean negative (byte encoded [], String label)
+    {
+        try {
+            ByteArrayInputStream in;
+            InputStreamReader reader;
+            int c;
+
+            in = new ByteArrayInputStream(encoded);
+            reader = new InputStreamReader(in, encodingName);
+
+            c = reader.read();
+            System.err.print (label + ": read failed, ");
+
+            if (c == -1)
+                System.err.println("reported EOF");
+            else
+                System.err.println("returned char 0x"
+                    + Integer.toHexString(c)
+                    + ", expected exception");
+            return false;
+
+        } catch (CharConversionException e) {
+            return true;
+
+        } catch (Throwable t) {
+            System.err.println(label + ": failed, threw "
+                + t.getClass().getName()
+                + ", " + t.getMessage());
+        }
+        return false;
+    }
+
+    private static boolean decodeTest6392664 () {
+        try {
+            CharsetDecoder dec = Charset.forName("ISO-2022-CN-GB").newDecoder();
+            dec.decode(ByteBuffer.wrap(new byte[] {(byte)0x0e, (byte)0x42, (byte)0x43 }));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+
+    //
+    // TEST #0: 7-bit unshifted values,
+    // shift-in of a valid decodable GB2312-80
+    // character and an unmappable GB2312-80 char
+    // This is a positive test.
+    //
+    private static byte test0_bytes[] = {
+        (byte)0x00,
+        (byte)0x01, (byte)0x02, (byte)0x03,
+        (byte)0x0E, (byte)0x21, (byte)0x2f,
+        (byte)0x0E, (byte)0xDD, (byte)0x9f
+    };
+
+    private static char test0_chars[] = {
+        0x0000,
+        0x0001, 0x0002, 0x0003,
+        0x2019,
+        0xFFFD
+    };
+
+    private static byte test1_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, (byte)0x21,
+        (byte)0x2f };
+
+    private static char test1_chars[] = {
+        0x21, 0x2f
+    };
+
+    private static byte test2_bytes[] = {
+        (byte)0x0e,
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test2_chars[] = {
+        0x2019
+    };
+
+    private static byte test3_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x0e,
+        (byte)0x21, (byte)0x2f };
+
+    private static byte test3a_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x41,
+        (byte)0x0e,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test3_chars[] = {
+        0x2019
+    };
+
+    private static byte test4_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x0f,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test4_chars[] = {
+        0x21, 0x2f
+    };
+
+    private static byte test5_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x0e, (byte)0x21, (byte)0x2e,
+        (byte)0x0f, (byte)0x21, (byte)0x2f };
+
+    private static char test5_chars[] = {
+        0x2018, 0x21, 0x2f
+    };
+
+    private static byte test6_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41,
+        (byte)0x0e, (byte)0x21, (byte)0x2e,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test6_chars[] = {
+        0x2018, 0x2019
+    };
+
+    private static byte test7_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)'G',
+        (byte)0x0e, (byte)0x21, (byte)0x2e,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test7_chars[] = {
+        0xFE50, 0xFE51
+    };
+
+    private static byte test8_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)'G',
+        (byte)0x0e, (byte)0x21, (byte)0x2e,
+        (byte)0x0f, (byte)0x21, (byte)0x2f };
+
+    private static char test8_chars[] = {
+        0xFE50, 0x21, 0x2f
+    };
+
+    private static byte test9_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x2a, (byte)'H',
+        (byte)0x1b, (byte)0x4e,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test9_chars[] = {
+        0x4e0e
+    };
+
+    /*
+     * Plane 3 support provided for compatibility with
+     * sun.io ISO2022_CN decoder. Officially ISO-2022-CN
+     * just handles planes 1/2 of CNS-11643 (1986)
+     * Test case data below verifies this compatibility
+     *
+     */
+
+    private static byte test10_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)'+', (byte)'I',
+        (byte)0x1b, (byte)0x4f,
+        (byte)0x21, (byte)0x2f };
+
+    private static char test10_chars[] = {
+        0x51e2
+    };
+
+    private static byte test11_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, //SO Designator
+        (byte)0x0e,                                     //SO
+        (byte)0x21, (byte)0x2e,                         //GB2312 char
+        (byte)0x1b, (byte)0x24, (byte)0x2a, (byte)'H',  //SS2 Designator
+        (byte)0x1b, (byte)0x4e,                         //SS2
+        (byte)0x21, (byte)0x2f,                         //CNS-P2 char
+        (byte)0x21, (byte)0x2f                          //GB2312 char
+    };
+
+    private static char test11_chars[] = {
+        0x2018,
+        0x4e0e,
+        0x2019
+    };
+
+    private static byte test12_bytes[] = {
+        (byte)0x1b, (byte)0x24, (byte)0x29, (byte)0x41, //SO Designator
+        (byte)0x0e,                                     //SO
+        (byte)0x21, (byte)0x2e,                         //GB2312 char
+        (byte)0x1b, (byte)0x24, (byte)'+', (byte)'I',  //SS3 Designator
+        (byte)0x1b, (byte)0x4f,                         //SS3
+        (byte)0x21, (byte)0x2f,                         //CNS-P2 char
+        (byte)0x21, (byte)0x2f                          //GB2312 char
+    };
+
+    private static char test12_chars[] = {
+        0x2018,
+        0x51e2,
+        0x2019
+    };
+
+
+    private static byte test13_bytes[] = {
+        (byte)0x0f0,   // byte with MSB
+    };
+
+    private static char test13_chars[] = {
+        0x00f0,
+    };
+
+    private static byte test14_bytes[] = {
+        (byte)0x0E, (byte)0x21, (byte)0x2f,
+        (byte)0x0E, (byte)0xDD, (byte)0x9f
+    };
+    private static CoderResult test14_result = CoderResult.unmappableForLength(2);
+
+    // Current ISO2022CN treats the "out of range" code points as "unmappable"
+    private static byte test15_bytes[] = {
+        (byte)0x1b, (byte)0x4f,      // SS3
+        (byte)0x20, (byte)0x2f,      // "out of range" CNS-P2 char
+    };
+    private static  CoderResult test15_result = CoderResult.unmappableForLength(4);
+
+    /**
+     * Main program to test ISO2022CN conformance
+     *
+     */
+    public static void main (String argv []) throws Exception
+    {
+        boolean pass = true;
+
+        System.out.println ("");
+        System.out.println ("------ checking ISO2022CN decoder -----");
+
+        // This regtest must be the first one.
+        pass &= decodeTest6392664();
+
+        try {
+            new InputStreamReader (System.in, "ISO2022CN");
+        } catch (Exception e) {
+            encodingName = "ISO2022CN";
+            System.out.println ("... requires nonstandard encoding name "
+                    + encodingName);
+            pass &= false;
+        }
+
+        //
+        // Positive tests -- good data is dealt with correctly
+        //
+        pass &= decodeTest(test0_bytes, test0_chars, "first batch");
+        pass &= decodeTest(test1_bytes, test1_chars, "escapes1");
+        pass &= decodeTest(test2_bytes, test2_chars, "escapes2");
+        pass &= decodeTest(test3_bytes, test3_chars, "escapes3");
+        pass &= decodeTest(test3a_bytes, test3_chars, "escapes3a");
+        pass &= decodeTest(test4_bytes, test4_chars, "escapes4");
+        pass &= decodeTest(test5_bytes, test5_chars, "escapes5");
+        pass &= decodeTest(test6_bytes, test6_chars, "escapes6");
+        pass &= decodeTest(test7_bytes, test7_chars, "escapes7");
+        pass &= decodeTest(test8_bytes, test8_chars, "escapes8");
+        pass &= decodeTest(test9_bytes, test9_chars, "escapes9");
+        pass &= decodeTest(test10_bytes, test10_chars, "escapes10");
+        pass &= decodeTest(test11_bytes, test11_chars, "escapes11");
+        pass &= decodeTest(test12_bytes, test12_chars, "escapes12");
+        pass &= decodeTest(test13_bytes, test13_chars, "escapes13");
+        pass &= decodeResultTest(test14_bytes, test14_result, "escapes14");
+        pass &= decodeResultTest(test15_bytes, test15_result, "escapes15");
+        // PASS/FAIL status is what the whole thing is about.
+        //
+        if (! pass) {
+            throw new Exception("FAIL -- incorrect ISO-2022-CN");
+        }
+
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISO2022JP.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,612 @@
+/*
+ * 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 4626545 4879522 4913711 4119445
+   @summary Check full coverage encode/decode for ISO-2022-JP
+ */
+
+/*
+ * Tests the NIO converter for J2RE >= 1.4.1
+ * since the default converter used by String
+ * API is the NIO converter sun.nio.cs.ext.ISO2022_JP
+ */
+
+import java.io.*;
+public class TestISO2022JP {
+
+    private final static String US_ASCII =
+        "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" +
+        "\b\t\n\u000B\f\r" +
+        "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" +
+        "\u0018\u0019\u001A\u001C\u001D\u001E\u001F" +
+        "\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\u00A5\u203E";
+
+     // Subset of chars sourced from JISX0208:1983
+
+     private final static String JISX0208SUBSET =
+        "u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A" +
+        "\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8" +
+        "\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003" +
+        "\u4EDD\u3005\u3006\u3007\u30FC\u2014\u2010\uFF0F" +
+        "\uFF3C\u301C\u2016\uFF5C\u2026\u2025\u2018\u2019" +
+        "\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28" +
+        "\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F" +
+        "\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91" +
+        "\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5" +
+        "\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C" +
+        "\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11" +
+        "\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E" +
+        "\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2" +
+        "\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9" +
+        "\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5" +
+        "\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44" +
+        "\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64" +
+        "\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1" +
+        "\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA" +
+        "\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3" +
+        "\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C" +
+        "\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48" +
+        "\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61" +
+        "\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88" +
+        "\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD" +
+        "\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3" +
+        "\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031" +
+        "\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350" +
+        "\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB" +
+        "\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369" +
+        "\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6" +
+        "\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D" +
+        "\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A" +
+        "\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2" +
+        "\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209" +
+        "\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4" +
+        "\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524" +
+        "\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B" +
+        "\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763" +
+        "\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B" +
+        "\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3" +
+        "\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9" +
+        "\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840" +
+        "\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877" +
+        "\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883" +
+        "\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D" +
+        "\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1" +
+        "\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904" +
+        "\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A" +
+        "\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978" +
+        "\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB" +
+        "\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D" +
+        "\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93" +
+        "\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85" +
+        "\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6" +
+        "\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9" +
+        "\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292" +
+        "\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4" +
+        "\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A" +
+        "\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA" +
+        "\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED" +
+        "\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D" +
+        "\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D" +
+        "\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE" +
+        "\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5" +
+        "\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC" +
+        "\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E" +
+        "\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66" +
+        "\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C" +
+        "\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199";
+
+    final static String JISX0202KATAKANA =
+        "\uFF61\uFF62\uFF63\uFF64" +
+        "\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C" +
+        "\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74" +
+        "\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C" +
+        "\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84" +
+        "\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C" +
+        "\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94" +
+        "\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C" +
+        "\uFF9D\uFF9E\uFF9F";
+
+
+    final static byte[] expectedBytes1 = {
+        (byte) 0x0, (byte) 0x1, (byte) 0x2, (byte) 0x3,
+        (byte) 0x4, (byte) 0x5, (byte) 0x6, (byte) 0x7,
+        (byte) 0x8, (byte) 0x9, (byte) 0xa, (byte) 0xb,
+        (byte) 0xc, (byte) 0xd,
+        (byte) 0x10, (byte) 0x11, (byte) 0x12, (byte) 0x13,
+        (byte) 0x14, (byte) 0x15, (byte) 0x16, (byte) 0x17,
+        (byte) 0x18, (byte) 0x19, (byte) 0x1a,
+        (byte) 0x1c, (byte) 0x1d, (byte) 0x1e, (byte) 0x1f,
+        (byte) 0x20, (byte) 0x21, (byte) 0x22, (byte) 0x23,
+        (byte) 0x24, (byte) 0x25, (byte) 0x26, (byte) 0x27,
+        (byte) 0x28, (byte) 0x29, (byte) 0x2a, (byte) 0x2b,
+        (byte) 0x2c, (byte) 0x2d, (byte) 0x2e, (byte) 0x2f,
+        (byte) 0x30, (byte) 0x31, (byte) 0x32, (byte) 0x33,
+        (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x37,
+        (byte) 0x38, (byte) 0x39, (byte) 0x3a, (byte) 0x3b,
+        (byte) 0x3c, (byte) 0x3d, (byte) 0x3e, (byte) 0x3f,
+        (byte) 0x40, (byte) 0x41, (byte) 0x42, (byte) 0x43,
+        (byte) 0x44, (byte) 0x45, (byte) 0x46, (byte) 0x47,
+        (byte) 0x48, (byte) 0x49, (byte) 0x4a, (byte) 0x4b,
+        (byte) 0x4c, (byte) 0x4d, (byte) 0x4e, (byte) 0x4f,
+        (byte) 0x50, (byte) 0x51, (byte) 0x52, (byte) 0x53,
+        (byte) 0x54, (byte) 0x55, (byte) 0x56, (byte) 0x57,
+        (byte) 0x58, (byte) 0x59, (byte) 0x5a, (byte) 0x5b,
+        (byte) 0x5c, (byte) 0x5d, (byte) 0x5e, (byte) 0x5f,
+        (byte) 0x60, (byte) 0x61, (byte) 0x62, (byte) 0x63,
+        (byte) 0x64, (byte) 0x65, (byte) 0x66, (byte) 0x67,
+        (byte) 0x68, (byte) 0x69, (byte) 0x6a, (byte) 0x6b,
+        (byte) 0x6c, (byte) 0x6d, (byte) 0x6e, (byte) 0x6f,
+        (byte) 0x70, (byte) 0x71, (byte) 0x72, (byte) 0x73,
+        (byte) 0x74, (byte) 0x75, (byte) 0x76, (byte) 0x77,
+        (byte) 0x78, (byte) 0x79, (byte) 0x7a, (byte) 0x7b,
+        (byte) 0x7c, (byte) 0x7d, (byte) 0x7e, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x4a, (byte) 0x5c, (byte) 0x7e,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x42, (byte) 0x75,
+        (byte) 0x33, (byte) 0x30, (byte) 0x30, (byte) 0x30,
+        (byte) 0x1b, (byte) 0x24, (byte) 0x42, (byte) 0x21,
+        (byte) 0x22, (byte) 0x21, (byte) 0x23, (byte) 0x21,
+        (byte) 0x24, (byte) 0x21, (byte) 0x25, (byte) 0x21,
+        (byte) 0x26, (byte) 0x21, (byte) 0x27, (byte) 0x21,
+        (byte) 0x28, (byte) 0x21, (byte) 0x29, (byte) 0x21,
+        (byte) 0x2a, (byte) 0x21, (byte) 0x2b, (byte) 0x21,
+        (byte) 0x2c, (byte) 0x21, (byte) 0x2d, (byte) 0x21,
+        (byte) 0x2e, (byte) 0x21, (byte) 0x2f, (byte) 0x21,
+        (byte) 0x30, (byte) 0x21, (byte) 0x31, (byte) 0x21,
+        (byte) 0x32, (byte) 0x21, (byte) 0x33, (byte) 0x21,
+        (byte) 0x34, (byte) 0x21, (byte) 0x35, (byte) 0x21,
+        (byte) 0x36, (byte) 0x21, (byte) 0x37, (byte) 0x21,
+        (byte) 0x38, (byte) 0x21, (byte) 0x39, (byte) 0x21,
+        (byte) 0x3a, (byte) 0x21, (byte) 0x3b, (byte) 0x21,
+        (byte) 0x3c, (byte) 0x21, (byte) 0x3d, (byte) 0x21,
+        (byte) 0x3e, (byte) 0x21, (byte) 0x3f, (byte) 0x21,
+        (byte) 0x40, (byte) 0x21, (byte) 0x41, (byte) 0x21,
+        (byte) 0x42, (byte) 0x21, (byte) 0x43, (byte) 0x21,
+        (byte) 0x44, (byte) 0x21, (byte) 0x45, (byte) 0x21,
+        (byte) 0x46, (byte) 0x21, (byte) 0x47, (byte) 0x55,
+        (byte) 0x71, (byte) 0x55, (byte) 0x72, (byte) 0x55,
+        (byte) 0x73, (byte) 0x55, (byte) 0x74, (byte) 0x55,
+        (byte) 0x75, (byte) 0x55, (byte) 0x76, (byte) 0x55,
+        (byte) 0x77, (byte) 0x55, (byte) 0x78, (byte) 0x55,
+        (byte) 0x79, (byte) 0x55, (byte) 0x7a, (byte) 0x55,
+        (byte) 0x7b, (byte) 0x55, (byte) 0x7c, (byte) 0x55,
+        (byte) 0x7d, (byte) 0x55, (byte) 0x7e, (byte) 0x56,
+        (byte) 0x21, (byte) 0x56, (byte) 0x22, (byte) 0x56,
+        (byte) 0x23, (byte) 0x56, (byte) 0x24, (byte) 0x56,
+        (byte) 0x25, (byte) 0x56, (byte) 0x26, (byte) 0x56,
+        (byte) 0x27, (byte) 0x56, (byte) 0x28, (byte) 0x56,
+        (byte) 0x29, (byte) 0x56, (byte) 0x2a, (byte) 0x56,
+        (byte) 0x2b, (byte) 0x56, (byte) 0x2c, (byte) 0x56,
+        (byte) 0x2d, (byte) 0x56, (byte) 0x2e, (byte) 0x56,
+        (byte) 0x2f, (byte) 0x56, (byte) 0x30, (byte) 0x56,
+        (byte) 0x31, (byte) 0x56, (byte) 0x32, (byte) 0x56,
+        (byte) 0x33, (byte) 0x56, (byte) 0x34, (byte) 0x56,
+        (byte) 0x35, (byte) 0x56, (byte) 0x36, (byte) 0x56,
+        (byte) 0x37, (byte) 0x56, (byte) 0x38, (byte) 0x56,
+        (byte) 0x39, (byte) 0x56, (byte) 0x3a, (byte) 0x56,
+        (byte) 0x3b, (byte) 0x56, (byte) 0x3c, (byte) 0x56,
+        (byte) 0x3d, (byte) 0x56, (byte) 0x3e, (byte) 0x56,
+        (byte) 0x3f, (byte) 0x56, (byte) 0x40, (byte) 0x56,
+        (byte) 0x41, (byte) 0x56, (byte) 0x42, (byte) 0x56,
+        (byte) 0x43, (byte) 0x56, (byte) 0x44, (byte) 0x56,
+        (byte) 0x45, (byte) 0x56, (byte) 0x46, (byte) 0x56,
+        (byte) 0x47, (byte) 0x56, (byte) 0x48, (byte) 0x56,
+        (byte) 0x49, (byte) 0x56, (byte) 0x4a, (byte) 0x56,
+        (byte) 0x4b, (byte) 0x56, (byte) 0x4c, (byte) 0x56,
+        (byte) 0x4d, (byte) 0x56, (byte) 0x4e, (byte) 0x56,
+        (byte) 0x4f, (byte) 0x56, (byte) 0x50, (byte) 0x56,
+        (byte) 0x51, (byte) 0x56, (byte) 0x52, (byte) 0x56,
+        (byte) 0x53, (byte) 0x56, (byte) 0x54, (byte) 0x56,
+        (byte) 0x55, (byte) 0x56, (byte) 0x56, (byte) 0x56,
+        (byte) 0x57, (byte) 0x56, (byte) 0x58, (byte) 0x56,
+        (byte) 0x59, (byte) 0x56, (byte) 0x5a, (byte) 0x56,
+        (byte) 0x5b, (byte) 0x56, (byte) 0x5c, (byte) 0x56,
+        (byte) 0x5d, (byte) 0x56, (byte) 0x5e, (byte) 0x56,
+        (byte) 0x5f, (byte) 0x56, (byte) 0x60, (byte) 0x56,
+        (byte) 0x61, (byte) 0x56, (byte) 0x62, (byte) 0x56,
+        (byte) 0x63, (byte) 0x56, (byte) 0x64, (byte) 0x56,
+        (byte) 0x65, (byte) 0x56, (byte) 0x66, (byte) 0x56,
+        (byte) 0x67, (byte) 0x56, (byte) 0x68, (byte) 0x56,
+        (byte) 0x69, (byte) 0x56, (byte) 0x6a, (byte) 0x56,
+        (byte) 0x6b, (byte) 0x56, (byte) 0x6c, (byte) 0x56,
+        (byte) 0x6d, (byte) 0x56, (byte) 0x6e, (byte) 0x56,
+        (byte) 0x6f, (byte) 0x56, (byte) 0x70, (byte) 0x56,
+        (byte) 0x71, (byte) 0x56, (byte) 0x72, (byte) 0x56,
+        (byte) 0x73, (byte) 0x56, (byte) 0x74, (byte) 0x56,
+        (byte) 0x75, (byte) 0x56, (byte) 0x76, (byte) 0x56,
+        (byte) 0x77, (byte) 0x56, (byte) 0x78, (byte) 0x56,
+        (byte) 0x79, (byte) 0x56, (byte) 0x7a, (byte) 0x56,
+        (byte) 0x7b, (byte) 0x56, (byte) 0x7c, (byte) 0x56,
+        (byte) 0x7d, (byte) 0x56, (byte) 0x7e, (byte) 0x57,
+        (byte) 0x21, (byte) 0x57, (byte) 0x22, (byte) 0x57,
+        (byte) 0x23, (byte) 0x57, (byte) 0x24, (byte) 0x57,
+        (byte) 0x25, (byte) 0x57, (byte) 0x26, (byte) 0x57,
+        (byte) 0x27, (byte) 0x57, (byte) 0x28, (byte) 0x57,
+        (byte) 0x29, (byte) 0x57, (byte) 0x2a, (byte) 0x57,
+        (byte) 0x2b, (byte) 0x57, (byte) 0x2c, (byte) 0x57,
+        (byte) 0x2d, (byte) 0x57, (byte) 0x2e, (byte) 0x57,
+        (byte) 0x2f, (byte) 0x57, (byte) 0x30, (byte) 0x57,
+        (byte) 0x31, (byte) 0x57, (byte) 0x32, (byte) 0x57,
+        (byte) 0x33, (byte) 0x57, (byte) 0x34, (byte) 0x57,
+        (byte) 0x35, (byte) 0x57, (byte) 0x36, (byte) 0x57,
+        (byte) 0x37, (byte) 0x57, (byte) 0x38, (byte) 0x57,
+        (byte) 0x39, (byte) 0x57, (byte) 0x3a, (byte) 0x57,
+        (byte) 0x3b, (byte) 0x57, (byte) 0x3c, (byte) 0x57,
+        (byte) 0x3d, (byte) 0x57, (byte) 0x3e, (byte) 0x57,
+        (byte) 0x3f, (byte) 0x57, (byte) 0x40, (byte) 0x57,
+        (byte) 0x41, (byte) 0x57, (byte) 0x42, (byte) 0x57,
+        (byte) 0x43, (byte) 0x57, (byte) 0x44, (byte) 0x57,
+        (byte) 0x45, (byte) 0x57, (byte) 0x46, (byte) 0x57,
+        (byte) 0x47, (byte) 0x57, (byte) 0x48, (byte) 0x57,
+        (byte) 0x49, (byte) 0x57, (byte) 0x4a, (byte) 0x57,
+        (byte) 0x4b, (byte) 0x57, (byte) 0x4c, (byte) 0x57,
+        (byte) 0x4d, (byte) 0x57, (byte) 0x4e, (byte) 0x57,
+        (byte) 0x4f, (byte) 0x57, (byte) 0x50, (byte) 0x57,
+        (byte) 0x51, (byte) 0x57, (byte) 0x52, (byte) 0x57,
+        (byte) 0x53, (byte) 0x57, (byte) 0x54, (byte) 0x57,
+        (byte) 0x55, (byte) 0x57, (byte) 0x56, (byte) 0x57,
+        (byte) 0x57, (byte) 0x57, (byte) 0x58, (byte) 0x57,
+        (byte) 0x59, (byte) 0x57, (byte) 0x5a, (byte) 0x57,
+        (byte) 0x5b, (byte) 0x57, (byte) 0x5c, (byte) 0x57,
+        (byte) 0x5d, (byte) 0x57, (byte) 0x5e, (byte) 0x57,
+        (byte) 0x5f, (byte) 0x57, (byte) 0x60, (byte) 0x57,
+        (byte) 0x61, (byte) 0x57, (byte) 0x62, (byte) 0x57,
+        (byte) 0x63, (byte) 0x57, (byte) 0x64, (byte) 0x59,
+        (byte) 0x49, (byte) 0x59, (byte) 0x4a, (byte) 0x59,
+        (byte) 0x4b, (byte) 0x59, (byte) 0x4c, (byte) 0x59,
+        (byte) 0x4d, (byte) 0x59, (byte) 0x4e, (byte) 0x59,
+        (byte) 0x4f, (byte) 0x59, (byte) 0x50, (byte) 0x59,
+        (byte) 0x51, (byte) 0x59, (byte) 0x52, (byte) 0x59,
+        (byte) 0x53, (byte) 0x59, (byte) 0x54, (byte) 0x59,
+        (byte) 0x55, (byte) 0x59, (byte) 0x56, (byte) 0x59,
+        (byte) 0x57, (byte) 0x59, (byte) 0x58, (byte) 0x59,
+        (byte) 0x59, (byte) 0x59, (byte) 0x5a, (byte) 0x59,
+        (byte) 0x5b, (byte) 0x59, (byte) 0x5c, (byte) 0x59,
+        (byte) 0x5d, (byte) 0x59, (byte) 0x5e, (byte) 0x59,
+        (byte) 0x5f, (byte) 0x59, (byte) 0x60, (byte) 0x59,
+        (byte) 0x61, (byte) 0x59, (byte) 0x62, (byte) 0x59,
+        (byte) 0x63, (byte) 0x59, (byte) 0x64, (byte) 0x59,
+        (byte) 0x65, (byte) 0x59, (byte) 0x66, (byte) 0x59,
+        (byte) 0x67, (byte) 0x59, (byte) 0x68, (byte) 0x59,
+        (byte) 0x69, (byte) 0x59, (byte) 0x6a, (byte) 0x59,
+        (byte) 0x6b, (byte) 0x59, (byte) 0x6c, (byte) 0x59,
+        (byte) 0x6d, (byte) 0x59, (byte) 0x6e, (byte) 0x59,
+        (byte) 0x6f, (byte) 0x59, (byte) 0x70, (byte) 0x59,
+        (byte) 0x71, (byte) 0x59, (byte) 0x72, (byte) 0x59,
+        (byte) 0x73, (byte) 0x59, (byte) 0x74, (byte) 0x59,
+        (byte) 0x75, (byte) 0x59, (byte) 0x76, (byte) 0x59,
+        (byte) 0x77, (byte) 0x59, (byte) 0x78, (byte) 0x59,
+        (byte) 0x79, (byte) 0x59, (byte) 0x7a, (byte) 0x59,
+        (byte) 0x7b, (byte) 0x59, (byte) 0x7c, (byte) 0x59,
+        (byte) 0x7d, (byte) 0x59, (byte) 0x7e, (byte) 0x5a,
+        (byte) 0x21, (byte) 0x5a, (byte) 0x22, (byte) 0x5a,
+        (byte) 0x23, (byte) 0x5a, (byte) 0x24, (byte) 0x5a,
+        (byte) 0x25, (byte) 0x5a, (byte) 0x26, (byte) 0x5a,
+        (byte) 0x27, (byte) 0x5a, (byte) 0x28, (byte) 0x5a,
+        (byte) 0x29, (byte) 0x5a, (byte) 0x2a, (byte) 0x5a,
+        (byte) 0x2b, (byte) 0x5a, (byte) 0x2c, (byte) 0x5a,
+        (byte) 0x2d, (byte) 0x5a, (byte) 0x2e, (byte) 0x5a,
+        (byte) 0x2f, (byte) 0x5a, (byte) 0x30, (byte) 0x5a,
+        (byte) 0x31, (byte) 0x5a, (byte) 0x32, (byte) 0x5a,
+        (byte) 0x33, (byte) 0x5a, (byte) 0x34, (byte) 0x5a,
+        (byte) 0x35, (byte) 0x5a, (byte) 0x36, (byte) 0x5a,
+        (byte) 0x37, (byte) 0x5a, (byte) 0x38, (byte) 0x5a,
+        (byte) 0x39, (byte) 0x5a, (byte) 0x3a, (byte) 0x5a,
+        (byte) 0x3b, (byte) 0x5a, (byte) 0x3c, (byte) 0x5a,
+        (byte) 0x3d, (byte) 0x5a, (byte) 0x3e, (byte) 0x5a,
+        (byte) 0x3f, (byte) 0x5a, (byte) 0x40, (byte) 0x5a,
+        (byte) 0x41, (byte) 0x5a, (byte) 0x42, (byte) 0x5b,
+        (byte) 0x35, (byte) 0x5b, (byte) 0x36, (byte) 0x5b,
+        (byte) 0x37, (byte) 0x5b, (byte) 0x38, (byte) 0x5b,
+        (byte) 0x39, (byte) 0x5b, (byte) 0x3a, (byte) 0x5b,
+        (byte) 0x3b, (byte) 0x5b, (byte) 0x3c, (byte) 0x5b,
+        (byte) 0x3d, (byte) 0x5b, (byte) 0x3e, (byte) 0x5b,
+        (byte) 0x3f, (byte) 0x5b, (byte) 0x40, (byte) 0x5b,
+        (byte) 0x41, (byte) 0x5b, (byte) 0x42, (byte) 0x5b,
+        (byte) 0x43, (byte) 0x5b, (byte) 0x44, (byte) 0x5b,
+        (byte) 0x45, (byte) 0x5b, (byte) 0x46, (byte) 0x5b,
+        (byte) 0x47, (byte) 0x5b, (byte) 0x48, (byte) 0x5b,
+        (byte) 0x49, (byte) 0x5b, (byte) 0x4a, (byte) 0x5b,
+        (byte) 0x4b, (byte) 0x5b, (byte) 0x4c, (byte) 0x5b,
+        (byte) 0x4d, (byte) 0x5b, (byte) 0x4e, (byte) 0x5b,
+        (byte) 0x4f, (byte) 0x5b, (byte) 0x50, (byte) 0x5b,
+        (byte) 0x51, (byte) 0x5b, (byte) 0x52, (byte) 0x5b,
+        (byte) 0x53, (byte) 0x5b, (byte) 0x54, (byte) 0x5b,
+        (byte) 0x55, (byte) 0x5b, (byte) 0x56, (byte) 0x5b,
+        (byte) 0x57, (byte) 0x5b, (byte) 0x58, (byte) 0x5b,
+        (byte) 0x59, (byte) 0x5b, (byte) 0x5a, (byte) 0x5b,
+        (byte) 0x5b, (byte) 0x5b, (byte) 0x5c, (byte) 0x5b,
+        (byte) 0x5d, (byte) 0x5b, (byte) 0x5e, (byte) 0x5b,
+        (byte) 0x5f, (byte) 0x5b, (byte) 0x60, (byte) 0x5b,
+        (byte) 0x61, (byte) 0x5b, (byte) 0x62, (byte) 0x5b,
+        (byte) 0x63, (byte) 0x5b, (byte) 0x64, (byte) 0x5b,
+        (byte) 0x65, (byte) 0x5b, (byte) 0x66, (byte) 0x5b,
+        (byte) 0x67, (byte) 0x5b, (byte) 0x68, (byte) 0x5b,
+        (byte) 0x69, (byte) 0x5b, (byte) 0x6a, (byte) 0x5b,
+        (byte) 0x6b, (byte) 0x5b, (byte) 0x6c, (byte) 0x5b,
+        (byte) 0x6d, (byte) 0x5b, (byte) 0x6e, (byte) 0x5b,
+        (byte) 0x6f, (byte) 0x5b, (byte) 0x70, (byte) 0x5b,
+        (byte) 0x71, (byte) 0x5b, (byte) 0x72, (byte) 0x5b,
+        (byte) 0x73, (byte) 0x5b, (byte) 0x74, (byte) 0x5b,
+        (byte) 0x75, (byte) 0x5b, (byte) 0x76, (byte) 0x5b,
+        (byte) 0x77, (byte) 0x5b, (byte) 0x78, (byte) 0x5b,
+        (byte) 0x79, (byte) 0x5b, (byte) 0x7a, (byte) 0x5b,
+        (byte) 0x7b, (byte) 0x5b, (byte) 0x7c, (byte) 0x5b,
+        (byte) 0x7d, (byte) 0x5b, (byte) 0x7e, (byte) 0x5c,
+        (byte) 0x21, (byte) 0x5c, (byte) 0x22, (byte) 0x5c,
+        (byte) 0x23, (byte) 0x5c, (byte) 0x24, (byte) 0x5c,
+        (byte) 0x25, (byte) 0x5c, (byte) 0x26, (byte) 0x5c,
+        (byte) 0x27, (byte) 0x5c, (byte) 0x28, (byte) 0x5c,
+        (byte) 0x29, (byte) 0x5c, (byte) 0x2a, (byte) 0x5c,
+        (byte) 0x2b, (byte) 0x5c, (byte) 0x2c, (byte) 0x5c,
+        (byte) 0x2d, (byte) 0x5c, (byte) 0x2e, (byte) 0x5c,
+        (byte) 0x2f, (byte) 0x5c, (byte) 0x30, (byte) 0x5c,
+        (byte) 0x31, (byte) 0x5c, (byte) 0x32, (byte) 0x5c,
+        (byte) 0x33, (byte) 0x5c, (byte) 0x34, (byte) 0x5c,
+        (byte) 0x35, (byte) 0x5c, (byte) 0x36, (byte) 0x5d,
+        (byte) 0x79, (byte) 0x5d, (byte) 0x7a, (byte) 0x5d,
+        (byte) 0x7b, (byte) 0x5d, (byte) 0x7c, (byte) 0x5d,
+        (byte) 0x7d, (byte) 0x5d, (byte) 0x7e, (byte) 0x5e,
+        (byte) 0x21, (byte) 0x5e, (byte) 0x22, (byte) 0x5e,
+        (byte) 0x23, (byte) 0x5e, (byte) 0x24, (byte) 0x5e,
+        (byte) 0x25, (byte) 0x5e, (byte) 0x26, (byte) 0x5e,
+        (byte) 0x27, (byte) 0x5e, (byte) 0x28, (byte) 0x5e,
+        (byte) 0x29, (byte) 0x5e, (byte) 0x2a, (byte) 0x5e,
+        (byte) 0x2b, (byte) 0x5e, (byte) 0x2c, (byte) 0x5e,
+        (byte) 0x2d, (byte) 0x5e, (byte) 0x2e, (byte) 0x5e,
+        (byte) 0x2f, (byte) 0x5e, (byte) 0x30, (byte) 0x5e,
+        (byte) 0x31, (byte) 0x5e, (byte) 0x32, (byte) 0x5e,
+        (byte) 0x33, (byte) 0x5e, (byte) 0x34, (byte) 0x5e,
+        (byte) 0x35, (byte) 0x5e, (byte) 0x36, (byte) 0x5e,
+        (byte) 0x37, (byte) 0x5e, (byte) 0x38, (byte) 0x5e,
+        (byte) 0x39, (byte) 0x5e, (byte) 0x3a, (byte) 0x5e,
+        (byte) 0x3b, (byte) 0x5e, (byte) 0x3c, (byte) 0x5e,
+        (byte) 0x3d, (byte) 0x5e, (byte) 0x3e, (byte) 0x5e,
+        (byte) 0x3f, (byte) 0x5e, (byte) 0x40, (byte) 0x5e,
+        (byte) 0x41, (byte) 0x5e, (byte) 0x42, (byte) 0x5e,
+        (byte) 0x43, (byte) 0x5e, (byte) 0x44, (byte) 0x5e,
+        (byte) 0x45, (byte) 0x5e, (byte) 0x46, (byte) 0x5e,
+        (byte) 0x47, (byte) 0x5e, (byte) 0x48, (byte) 0x5e,
+        (byte) 0x49, (byte) 0x5e, (byte) 0x4a, (byte) 0x60,
+        (byte) 0x30, (byte) 0x60, (byte) 0x31, (byte) 0x60,
+        (byte) 0x32, (byte) 0x60, (byte) 0x33, (byte) 0x60,
+        (byte) 0x34, (byte) 0x60, (byte) 0x35, (byte) 0x60,
+        (byte) 0x36, (byte) 0x60, (byte) 0x37, (byte) 0x60,
+        (byte) 0x38, (byte) 0x60, (byte) 0x39, (byte) 0x60,
+        (byte) 0x3a, (byte) 0x60, (byte) 0x3b, (byte) 0x60,
+        (byte) 0x3c, (byte) 0x60, (byte) 0x3d, (byte) 0x60,
+        (byte) 0x3e, (byte) 0x60, (byte) 0x3f, (byte) 0x73,
+        (byte) 0x26, (byte) 0x73, (byte) 0x27, (byte) 0x73,
+        (byte) 0x28, (byte) 0x73, (byte) 0x29, (byte) 0x73,
+        (byte) 0x2a, (byte) 0x73, (byte) 0x2b, (byte) 0x73,
+        (byte) 0x2c, (byte) 0x73, (byte) 0x2d, (byte) 0x73,
+        (byte) 0x2e, (byte) 0x73, (byte) 0x2f, (byte) 0x73,
+        (byte) 0x30, (byte) 0x73, (byte) 0x31, (byte) 0x73,
+        (byte) 0x32, (byte) 0x73, (byte) 0x33, (byte) 0x73,
+        (byte) 0x34, (byte) 0x73, (byte) 0x35, (byte) 0x73,
+        (byte) 0x36, (byte) 0x73, (byte) 0x37, (byte) 0x73,
+        (byte) 0x38, (byte) 0x73, (byte) 0x39, (byte) 0x73,
+        (byte) 0x3a, (byte) 0x73, (byte) 0x3b, (byte) 0x73,
+        (byte) 0x3c, (byte) 0x73, (byte) 0x3d, (byte) 0x73,
+        (byte) 0x3e, (byte) 0x73, (byte) 0x3f, (byte) 0x73,
+        (byte) 0x40, (byte) 0x73, (byte) 0x41, (byte) 0x73,
+        (byte) 0x42, (byte) 0x73, (byte) 0x43, (byte) 0x73,
+        (byte) 0x44, (byte) 0x73, (byte) 0x45, (byte) 0x73,
+        (byte) 0x46, (byte) 0x73, (byte) 0x47, (byte) 0x73,
+        (byte) 0x48, (byte) 0x73, (byte) 0x49, (byte) 0x73,
+        (byte) 0x4a, (byte) 0x73, (byte) 0x4b, (byte) 0x73,
+        (byte) 0x4c, (byte) 0x73, (byte) 0x4d, (byte) 0x73,
+        (byte) 0x4e, (byte) 0x73, (byte) 0x4f, (byte) 0x73,
+        (byte) 0x50, (byte) 0x73, (byte) 0x51, (byte) 0x73,
+        (byte) 0x52, (byte) 0x73, (byte) 0x53, (byte) 0x73,
+        (byte) 0x54, (byte) 0x73, (byte) 0x55, (byte) 0x73,
+        (byte) 0x56, (byte) 0x73, (byte) 0x57, (byte) 0x73,
+        (byte) 0x58, (byte) 0x73, (byte) 0x59, (byte) 0x73,
+        (byte) 0x5a, (byte) 0x73, (byte) 0x5b, (byte) 0x73,
+        (byte) 0x5c, (byte) 0x73, (byte) 0x5d, (byte) 0x73,
+        (byte) 0x5e, (byte) 0x73, (byte) 0x5f, (byte) 0x73,
+        (byte) 0x60, (byte) 0x73, (byte) 0x61, (byte) 0x73,
+        (byte) 0x62, (byte) 0x73, (byte) 0x63, (byte) 0x73,
+        (byte) 0x64, (byte) 0x73, (byte) 0x65, (byte) 0x73,
+        (byte) 0x66, (byte) 0x73, (byte) 0x67, (byte) 0x73,
+        (byte) 0x68, (byte) 0x73, (byte) 0x69, (byte) 0x73,
+        (byte) 0x6a, (byte) 0x73, (byte) 0x6b, (byte) 0x73,
+        (byte) 0x6c, (byte) 0x73, (byte) 0x6d, (byte) 0x73,
+        (byte) 0x6e, (byte) 0x73, (byte) 0x6f, (byte) 0x73,
+        (byte) 0x70, (byte) 0x73, (byte) 0x71, (byte) 0x73,
+        (byte) 0x72, (byte) 0x73, (byte) 0x73, (byte) 0x73,
+        (byte) 0x74, (byte) 0x73, (byte) 0x75, (byte) 0x73,
+        (byte) 0x76, (byte) 0x73, (byte) 0x77, (byte) 0x73,
+        (byte) 0x78, (byte) 0x73, (byte) 0x79, (byte) 0x73,
+        (byte) 0x7a, (byte) 0x73, (byte) 0x7b, (byte) 0x73,
+        (byte) 0x7c, (byte) 0x73, (byte) 0x7d, (byte) 0x73,
+        (byte) 0x7e, (byte) 0x74, (byte) 0x21, (byte) 0x74,
+        (byte) 0x22, (byte) 0x74, (byte) 0x23, (byte) 0x74,
+        (byte) 0x24, (byte) 0x74, (byte) 0x25, (byte) 0x74,
+        (byte) 0x26, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+        (byte) 0x21, (byte) 0x22, (byte) 0x23, (byte) 0x24,
+        (byte) 0x25, (byte) 0x26, (byte) 0x27, (byte) 0x28,
+        (byte) 0x29, (byte) 0x2a, (byte) 0x2b, (byte) 0x2c,
+        (byte) 0x2d, (byte) 0x2e, (byte) 0x2f, (byte) 0x30,
+        (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x34,
+        (byte) 0x35, (byte) 0x36, (byte) 0x37, (byte) 0x38,
+        (byte) 0x39, (byte) 0x3a, (byte) 0x3b, (byte) 0x3c,
+        (byte) 0x3d, (byte) 0x3e, (byte) 0x3f, (byte) 0x40,
+        (byte) 0x41, (byte) 0x42, (byte) 0x43, (byte) 0x44,
+        (byte) 0x45, (byte) 0x46, (byte) 0x47, (byte) 0x48,
+        (byte) 0x49, (byte) 0x4a, (byte) 0x4b, (byte) 0x4c,
+        (byte) 0x4d, (byte) 0x4e, (byte) 0x4f, (byte) 0x50,
+        (byte) 0x51, (byte) 0x52, (byte) 0x53, (byte) 0x54,
+        (byte) 0x55, (byte) 0x56, (byte) 0x57, (byte) 0x58,
+        (byte) 0x59, (byte) 0x5a, (byte) 0x5b, (byte) 0x5c,
+        (byte) 0x5d, (byte) 0x5e, (byte) 0x5f, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x42 };
+
+    private final static String MIXEDCONTENT =
+        "JA\u3000\u3002\u0062\uFF64PAN" +
+        "\uFF0C\uFF0E\u00A5\uFF65\uFF66X\u203E" +
+        "\u30FB\uFF67\u203E";
+
+    static byte[] mixedBytesExpected = {
+        (byte) 0x4a, (byte) 0x41, (byte) 0x1b, (byte) 0x24,
+        (byte) 0x42, (byte) 0x21, (byte) 0x21, (byte) 0x21,
+        (byte) 0x23, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+        (byte) 0x62, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+        (byte) 0x24, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+        (byte) 0x50, (byte) 0x41, (byte) 0x4e, (byte) 0x1b,
+        (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x24,
+        (byte) 0x21, (byte) 0x25, (byte) 0x1b, (byte) 0x28,
+        (byte) 0x4a, (byte) 0x5c, (byte) 0x1b, (byte) 0x28,
+        (byte) 0x49, (byte) 0x25, (byte) 0x26, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x42, (byte) 0x58, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x4a, (byte) 0x7e, (byte) 0x1b,
+        (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x26,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x49, (byte) 0x27,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x4a, (byte) 0x7e,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x42  };
+
+    static byte[] repeatingEscapes = {
+        (byte) 0x4a, (byte) 0x41, (byte) 0x1b, (byte) 0x24,
+        (byte) 0x42, (byte)0x1b, (byte)0x24, (byte)0x42,
+        (byte) 0x21, (byte) 0x21, (byte) 0x21,
+        (byte) 0x23, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+        // embedded repeated iso-2022 escapes (see bugID 4879522)
+        (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte) 0x62, (byte) 0x1b, (byte) 0x28, (byte) 0x49,
+        (byte)0x0f, (byte)0x0e, (byte)0x0f,
+        (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte) 0x24, (byte) 0x1b, (byte) 0x28, (byte) 0x42,
+        (byte) 0x50, (byte) 0x41, (byte) 0x4e,
+        // embedded shift chars (see bugID 4879522)
+        (byte)0x0e, (byte)0x0f,
+        (byte) 0x1b,
+        (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x24,
+        (byte) 0x21, (byte) 0x25, (byte) 0x1b, (byte) 0x28,
+        (byte) 0x4a, (byte) 0x5c, (byte) 0x1b, (byte) 0x28,
+        (byte) 0x49, (byte) 0x25, (byte) 0x26, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x42, (byte) 0x58, (byte) 0x1b,
+        (byte) 0x28, (byte) 0x4a, (byte) 0x7e, (byte) 0x1b,
+        (byte) 0x24, (byte) 0x42, (byte) 0x21, (byte) 0x26,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x49, (byte) 0x27,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x4a, (byte) 0x7e,
+        (byte) 0x1b, (byte) 0x28, (byte) 0x42  };
+
+
+    private static String JISX0212 =
+        "\u02d8\u6896\u9fa5";
+
+    private static byte[] expectedBytes_JISX0212 = {
+        (byte)0x1b, (byte)0x24, (byte)0x28, (byte)0x44,
+        (byte)0x22, (byte)0x2f, (byte)0x43, (byte)0x6f,
+        (byte)0x6d, (byte)0x63,
+        (byte)0x1b, (byte)0x28, (byte)0x42
+    };
+
+    /*
+     * Tests the roundtrip integrity and expected encoding
+     * correctness for a String containing a substantial
+     * subset of ISO-2022-JP/ISO-2022-JP-2 encodeable chars
+     */
+
+    private static void roundTrip(String testStr, byte[] expectBytes,
+                                  String csName)
+    throws Exception {
+        byte[] encodedBytes = testStr.getBytes(csName);
+
+        if (encodedBytes.length != expectBytes.length) {
+            throw new Exception(csName + " Encoder error");
+        }
+
+        for (int i = 0; i < expectBytes.length; i++) {
+            if (encodedBytes[i] != expectBytes[i])  {
+                throw new Exception(csName + " Encoder error");
+            }
+        }
+        String decoded = new String(encodedBytes, csName);
+
+        if (!decoded.equals(testStr)) {
+            throw new Exception(csName + " Decoder error");
+        }
+        String decoded2 = new String(repeatingEscapes, csName);
+        if (!decoded2.equals(MIXEDCONTENT)) {
+            throw new Exception(csName + " Decoder error");
+        }
+     }
+
+    public static void main(String[] args) throws Exception {
+
+        // Long String containing sequential chars
+        // ASCII/yen/tilde/jisx0208 chars/katakana chars
+
+        String testStr1 = US_ASCII +
+                        JISX0208SUBSET + JISX0202KATAKANA;
+        roundTrip(testStr1, expectedBytes1, "ISO-2022-JP");
+        roundTrip(testStr1, expectedBytes1, "ISO-2022-JP-2");
+        roundTrip(JISX0212, expectedBytes_JISX0212, "ISO-2022-JP-2");
+
+        // mixed chars which encode to the supported codesets
+        // of ISO-2022-JP/ISO-2022-JP-2
+
+        String testStr2 = MIXEDCONTENT;
+        roundTrip(testStr2 , mixedBytesExpected, "ISO-2022-JP");
+        roundTrip(testStr2 , mixedBytesExpected, "ISO-2022-JP-2");
+
+        String decoded2 = new String(repeatingEscapes, "ISO-2022-JP");
+        if (!decoded2.equals(MIXEDCONTENT)) {
+            throw new Exception("ISO-2022-JP Decoder error");
+        }
+
+        decoded2 = new String(repeatingEscapes, "ISO-2022-JP-2");
+        if (!decoded2.equals(MIXEDCONTENT)) {
+            throw new Exception("ISO-2022-JP-2 Decoder error");
+        }
+
+        // Test for bugID 4913711
+        // ISO-2022-JP encoding of a single input char yields
+        // 8 output bytes. Prior to fix for 4913711 the
+        // max bytes per char value was underspecified as 5.0
+        // and the code below would have thrown a BufferOverflow
+        // exception. This test validates the fix for 4913711
+
+        String testStr3 = "\u3042";
+        byte[] expected = { (byte)0x1b, (byte)0x24, (byte)0x42,
+                            (byte)0x24, (byte)0x22, (byte)0x1b,
+                            (byte)0x28, (byte)0x42 };
+        byte[] encoded = testStr3.getBytes("ISO-2022-JP");
+        for (int i = 0; i < expected.length; i++) {
+            if (encoded[i] != expected[i])
+               throw new Exception("ISO-2022-JP Decoder error");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISO2022JPEncoder.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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 4251646
+   @summary Make sure buffer boundary convert works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022JPEncoder {
+    static char[] inputChars = {'\u0020', '\u0020', '\u0020', '\u0020',
+                                '\u0020', '\u0020', '\u0020', '\u0020',
+                                '\u0020', '\u4e00'};
+    static byte[] expectedBytes1 = {0x20, 0x20, 0x20, 0x20, 0x20,
+                                    0x20, 0x20, 0x20, 0x20};
+    static byte[] expectedBytes2 = {0x1b, 0x24, 0x42, 0x30, 0x6c,
+                                    0x1b, 0x28, 0x42};
+    static byte[] outputBuff = new byte[10];
+
+    public static void main(String args[]) throws Exception {
+        CharsetEncoder enc = Charset.forName("ISO2022JP").newEncoder();
+        CharBuffer cb = CharBuffer.wrap(inputChars);
+        ByteBuffer bb = ByteBuffer.wrap(outputBuff);
+        CoderResult cr = enc.encode(cb, bb, false);
+        if (!cr.isOverflow())
+            throw new Exception("Expected CodeResult.OVERFLOW was not returned");
+        for (int i = 0; i < expectedBytes1.length; ++i) {
+            //System.out.println(expectedBytes1[i] + ":" + outputBuff[i]);
+            if (expectedBytes1[i] != outputBuff[i]) {
+                throw new Exception("Output bytes does not match at first conversion");
+            }
+        }
+        int nci = cb.position();
+        if (nci != expectedBytes1.length)
+            throw new Exception("Output length does not match at first conversion");
+        bb.clear();
+        cr = enc.encode(cb, bb, true);
+        enc.flush(bb);
+        //System.out.println(ret + "," + expectedBytes2.length);
+        bb.flip();
+        int len = bb.remaining();
+        if (len != expectedBytes2.length)
+            throw new Exception("Output length does not match at second conversion");
+        for (int i = 0; i < expectedBytes2.length; ++i) {
+            //System.out.println(expectedBytes2[i] + ":" + outputBuff[i]);
+            if (expectedBytes2[i] != outputBuff[i]) {
+                throw new Exception("Output bytes does not match at second conversion");
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,101 @@
+/*
+ * 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 4262894 6233303
+   @summary Testing substitute character Escape sequence
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestISO2022JPSubBytes {
+    /* \U2460 is not valid character in ISO2022JP and will be substituted
+     * with replacement character. If the replacement character is not the
+     * "current charset" character, correct escape sequence should be output
+     * for changing character set.
+     */
+    static char[][] in = { {'\u25cb', '\u2460', '\u25cb'},
+                           {'\u0061', '\u2460', '\u0061'},
+                           {'\u25cb', '\u2460', '\u25cb'},
+                           {'\u0061', '\u2460', '\u0061'},
+                         };
+    static byte[][] expected = { {0x1b, 0x24, 0x42, 0x21, 0x7b,
+                                  0x21, 0x29,
+                                  0x21, 0x7b,
+                                  0x1b, 0x28, 0x42},
+                                 {0x61,
+                                  0x1b, 0x24, 0x42, 0x21, 0x29,
+                                  0x1b, 0x28, 0x42, 0x61},
+                                 {0x1b, 0x24, 0x42, 0x21, 0x7b,
+                                  0x1b, 0x28, 0x42, 0x3f,
+                                  0x1b, 0x24, 0x42, 0x21, 0x7b,
+                                  0x1b, 0x28, 0x42},
+                                 {0x61,
+                                  0x3f,
+                                  0x61}
+                                };
+
+    public static void main(String args[]) throws Exception {
+        CharsetEncoder enc = Charset.forName("ISO2022JP")
+          .newEncoder()
+          .onUnmappableCharacter(CodingErrorAction.REPLACE);
+
+        test(enc, in[0], expected[0]);
+
+        enc.reset();
+        test(enc, in[1], expected[1]);
+
+        enc.reset();
+        enc.replaceWith(new byte[]{(byte)'?'});
+        test(enc, in[2], expected[2]);
+
+        enc.reset();
+        test(enc, in[3], expected[3]);
+    }
+
+    public static void test (CharsetEncoder enc,
+                             char[] inputChars,
+                             byte[] expectedBytes) throws Exception
+    {
+        ByteBuffer bb = ByteBuffer.allocate(expectedBytes.length);
+        enc.encode(CharBuffer.wrap(inputChars), bb, true);
+        enc.flush(bb);
+        bb.flip();
+        byte[] outputBuff = bb.array();
+        int outputLen = bb.limit();
+        if (outputLen != expectedBytes.length) {
+            throw new Exception("Output bytes does not match");
+        }
+        for (int i = 0; i < outputLen; ++i) {
+            System.out.printf("<%x:%x> ",
+                              expectedBytes[i] & 0xff,
+                              outputBuff[i] & 0xff);
+            if (expectedBytes[i] != outputBuff[i]) {
+                System.out.println("...");
+                throw new Exception("Output bytes does not match");
+            }
+        }
+        System.out.println();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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 4429369
+   @summary  ISO2022CN and ISO2022KR converters throw exception
+ */
+
+import java.io.*;
+import java.nio.charset.*;
+
+public class TestIllegalISO2022Esc {
+
+    public static void main ( String[] args) throws Exception {
+        int exceptionCount = 0;
+        String[] encName = {"ISO2022CN", "ISO2022KR" };
+        byte[]b= {
+                (byte)0x1b, //Illegal sequence for both converters.
+                (byte)')',
+                (byte)'x'
+        };
+
+        for ( int i=0; i < 2; i++) { // Test 2 converters.
+            try {
+                ByteArrayInputStream bais = new ByteArrayInputStream(b);
+                    InputStreamReader isr =
+                                new InputStreamReader(bais,encName[i]);
+                    char cc[] = new char[1];
+                    isr.read(cc,0,1); //attempt to read
+            } catch (MalformedInputException e) { } // Passes if thrown
+              catch (Throwable t) {
+                    System.err.println("error with converter " + encName[i]);
+                    exceptionCount++;
+            }
+        }
+
+        if (exceptionCount > 0)
+           throw new Exception ("Incorrect handling of illegal ISO2022 escapes");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestIllegalSJIS.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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 4117820
+   @summary Verify that SJIS.Decoder works properly for values between 0xA000 and 0xA0FC
+ */
+
+import java.nio.charset.*;
+import java.nio.*;
+
+public class TestIllegalSJIS {
+
+  public static void main(String[] args) throws Exception
+  {
+    CharsetDecoder dec = Charset.forName("SJIS").newDecoder()
+      .onUnmappableCharacter(CodingErrorAction.REPLACE)
+      .onMalformedInput(CodingErrorAction.REPLACE);
+    byte[] sjis      = {(byte)0xA0, (byte)0x00};
+
+    int b;
+    for (b = 0; b < 0xFD; b++) {
+      sjis[1] = (byte) b;
+      CharBuffer cb = dec.decode(ByteBuffer.wrap(sjis));
+      if (cb.charAt(0) != 0xFFFD) {
+        throw new Exception(Integer.toHexString(0xa000 + b) + " failed to convert to 0xFFFD");
+      }
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestJIS0208Decoder.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,61 @@
+/*
+ * 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 4179800
+ * @summary Make sure JIS0208.Decoder really works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestJIS0208Decoder {
+    static String outputString = "\u65e5\u672c\u8a9e\u30c6\u30ad\u30b9\u30c8";
+    static byte [] inputBytes = new byte[] {(byte)'F', (byte)'|', (byte)'K', (byte)'\\',
+                                     (byte)'8', (byte)'l', (byte)'%', (byte)'F',
+                                     (byte)'%', (byte)'-', (byte)'%', (byte)'9',
+                                     (byte)'%', (byte)'H'};
+
+    public static void main(String args[])
+        throws Exception
+    {
+        test();
+    }
+
+    private static void test()
+        throws Exception
+    {
+        CharsetDecoder dec = Charset.forName("JIS0208").newDecoder();
+        try {
+            String ret = dec.decode(ByteBuffer.wrap(inputBytes)).toString();
+            if (ret.length() != outputString.length()
+                || ! outputString.equals(ret)){
+                throw new Exception("ByteToCharJIS0208 does not work correctly");
+            }
+        }
+        catch (Exception e){
+            throw new Exception("ByteToCharJIS0208 does not work correctly");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestJIS0212Decoder.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,62 @@
+/*
+ * 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 4179800
+   @summary Make sure JIS0212.Decoder really works
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestJIS0212Decoder {
+    static String outputString = "\u4e02\u4e04\u4e05\u4e0c\u4e12\u4e1f\u4e23";
+    static char [] outputChars = new char[8];
+    static byte [] inputBytes = new byte[] {(byte)0x30, (byte)0x21, (byte)0x30, (byte)0x22,
+                                            (byte)0x30, (byte)0x23, (byte)0x30, (byte)0x24,
+                                            (byte)0x30, (byte)0x25, (byte)0x30, (byte)0x26,
+                                            (byte)0x30, (byte)0x27};
+
+    public static void main(String args[])
+        throws Exception
+    {
+        test();
+    }
+
+    private static void test()
+        throws Exception
+    {
+        CharsetDecoder dec = Charset.forName("JIS0212").newDecoder();
+        try {
+            String ret = dec.decode(ByteBuffer.wrap(inputBytes)).toString();
+            if (ret.length() != outputString.length()
+                || ! outputString.equals(ret)){
+                throw new Exception("ByteToCharJIS0212 does not work correctly");
+            }
+        }
+        catch (Exception e){
+            throw new Exception("ByteToCharJIS0212 does not work correctly");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestMS5022X.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,750 @@
+/*
+ * 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 6173388 6319716
+   @summary Check full coverage encode/decode for Microsoft
+            ISO2022_JP variants MS50220, MS50221 and MSISO2022JP
+ */
+
+import java.io.*;
+import java.nio.charset.*;
+public class TestMS5022X {
+
+    private static String US_ASCII =
+        "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007" +
+        "\b\t\n\u000B\f\r" +
+        "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017" +
+        "\u0018\u0019\u001A\u001C\u001D\u001E\u001F" +
+        "\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\u00A5\u203E";
+
+     // Subset of chars sourced from JISX0208:1983
+
+     private static String JISX0208SUBSET =
+        "\u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A" +
+        "\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8" +
+        "\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003" +
+        "\u4EDD\u3005\u3006\u3007\u30FC\u2015\u2010\uFF0F" +    //u2014->u2015
+        "\uFF3C\u301C\u2016\uFF5C\u2026\u2025\u2018\u2019" +
+        "\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28" +
+        "\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F" +
+        "\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91" +
+        "\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5" +
+        "\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C" +
+        "\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11" +
+        "\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E" +
+        "\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2" +
+        "\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9" +
+        "\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5" +
+        "\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44" +
+        "\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64" +
+        "\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1" +
+        "\u5EC2\u5EC8\u5ED0\u5ECF\u5ED6\u5EE3\u5EDD\u5EDA" +
+        "\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3" +
+        "\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C" +
+        "\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48" +
+        "\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61" +
+        "\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88" +
+        "\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD" +
+        "\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3" +
+        "\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031" +
+        "\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350" +
+        "\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB" +
+        "\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369" +
+        "\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6" +
+        "\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D" +
+        "\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A" +
+        "\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2" +
+        "\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209" +
+        "\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4" +
+        "\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524" +
+        "\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B" +
+        "\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763" +
+        "\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B" +
+        "\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3" +
+        "\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9" +
+        "\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840" +
+        "\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877" +
+        "\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883" +
+        "\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D" +
+        "\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1" +
+        "\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904" +
+        "\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A" +
+        "\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978" +
+        "\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB" +
+        "\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D" +
+        "\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93" +
+        "\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85" +
+        "\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6" +
+        "\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9" +
+        "\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292" +
+        "\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4" +
+        "\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A" +
+        "\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA" +
+        "\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED" +
+        "\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D" +
+        "\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D" +
+        "\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE" +
+        "\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5" +
+        "\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC" +
+        "\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E" +
+        "\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66" +
+        "\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C" +
+        "\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199";
+
+    private static String JISX0201KATAKANA =
+        "\uFF61\uFF62\uFF63\uFF64" +
+        "\uFF65\uFF66\uFF67\uFF68\uFF69\uFF6A\uFF6B\uFF6C" +
+        "\uFF6D\uFF6E\uFF6F\uFF70\uFF71\uFF72\uFF73\uFF74" +
+        "\uFF75\uFF76\uFF77\uFF78\uFF79\uFF7A\uFF7B\uFF7C" +
+        "\uFF7D\uFF7E\uFF7F\uFF80\uFF81\uFF82\uFF83\uFF84" +
+        "\uFF85\uFF86\uFF87\uFF88\uFF89\uFF8A\uFF8B\uFF8C" +
+        "\uFF8D\uFF8E\uFF8F\uFF90\uFF91\uFF92\uFF93\uFF94" +
+        "\uFF95\uFF96\uFF97\uFF98\uFF99\uFF9A\uFF9B\uFF9C" +
+        "\uFF9D\uFF9E\uFF9F";
+
+    private static String JISX0208NECROW13 =
+        "\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467" +
+        "\u2468\u2469\u246A\u246B\u246C\u246D\u246E\u246F" +
+        "\u2470\u2471\u2472\u2473\u2160\u2161\u2162\u2163" +
+        "\u2164\u2165\u2166\u2167\u2168\u2169\u3349\u3314" +
+        "\u3322\u334D\u3318\u3327\u3303\u3336\u3351\u3357" +
+        "\u330D\u3326\u3323\u332B\u334A\u333B\u339C\u339D" +
+        "\u339E\u338E\u338F\u33C4\u33A1\u337B\u301E\u301F" +
+        "\u2116\u33CD\u2121\u32A4\u32A5\u32A6\u32A7\u32A8" +
+        "\u3231\u3232\u3239\u337E\u337D\u337C" +
+        "\u222e\u2211\u221f\u22bf";
+
+    private static byte[] expectedBytes_US_ASCII = {
+        (byte)0x0, (byte)0x1, (byte)0x2, (byte)0x3,
+        (byte)0x4, (byte)0x5, (byte)0x6, (byte)0x7,
+        (byte)0x8, (byte)0x9, (byte)0xa, (byte)0xb,
+        (byte)0xc, (byte)0xd,
+        (byte)0x10, (byte)0x11, (byte)0x12, (byte)0x13,
+        (byte)0x14, (byte)0x15, (byte)0x16, (byte)0x17,
+        (byte)0x18, (byte)0x19, (byte)0x1a,
+        (byte)0x1c, (byte)0x1d, (byte)0x1e, (byte)0x1f,
+        (byte)0x20, (byte)0x21, (byte)0x22, (byte)0x23,
+        (byte)0x24, (byte)0x25, (byte)0x26, (byte)0x27,
+        (byte)0x28, (byte)0x29, (byte)0x2a, (byte)0x2b,
+        (byte)0x2c, (byte)0x2d, (byte)0x2e, (byte)0x2f,
+        (byte)0x30, (byte)0x31, (byte)0x32, (byte)0x33,
+        (byte)0x34, (byte)0x35, (byte)0x36, (byte)0x37,
+        (byte)0x38, (byte)0x39, (byte)0x3a, (byte)0x3b,
+        (byte)0x3c, (byte)0x3d, (byte)0x3e, (byte)0x3f,
+        (byte)0x40, (byte)0x41, (byte)0x42, (byte)0x43,
+        (byte)0x44, (byte)0x45, (byte)0x46, (byte)0x47,
+        (byte)0x48, (byte)0x49, (byte)0x4a, (byte)0x4b,
+        (byte)0x4c, (byte)0x4d, (byte)0x4e, (byte)0x4f,
+        (byte)0x50, (byte)0x51, (byte)0x52, (byte)0x53,
+        (byte)0x54, (byte)0x55, (byte)0x56, (byte)0x57,
+        (byte)0x58, (byte)0x59, (byte)0x5a, (byte)0x5b,
+        (byte)0x5c, (byte)0x5d, (byte)0x5e, (byte)0x5f,
+        (byte)0x60, (byte)0x61, (byte)0x62, (byte)0x63,
+        (byte)0x64, (byte)0x65, (byte)0x66, (byte)0x67,
+        (byte)0x68, (byte)0x69, (byte)0x6a, (byte)0x6b,
+        (byte)0x6c, (byte)0x6d, (byte)0x6e, (byte)0x6f,
+        (byte)0x70, (byte)0x71, (byte)0x72, (byte)0x73,
+        (byte)0x74, (byte)0x75, (byte)0x76, (byte)0x77,
+        (byte)0x78, (byte)0x79, (byte)0x7a, (byte)0x7b,
+        (byte)0x7c, (byte)0x7d, (byte)0x7e, (byte)0x1b,
+        (byte)0x28, (byte)0x4a, (byte)0x5c, (byte)0x7e
+    };
+
+    private static byte[] expectedBytes_JISX0208SUBSET =
+    {
+        (byte)0x1b, (byte)0x24, (byte)0x42, (byte)0x21,
+        (byte)0x21, (byte)0x21,
+        (byte)0x22, (byte)0x21, (byte)0x23, (byte)0x21,
+        (byte)0x24, (byte)0x21, (byte)0x25, (byte)0x21,
+        (byte)0x26, (byte)0x21, (byte)0x27, (byte)0x21,
+        (byte)0x28, (byte)0x21, (byte)0x29, (byte)0x21,
+        (byte)0x2a, (byte)0x21, (byte)0x2b, (byte)0x21,
+        (byte)0x2c, (byte)0x21, (byte)0x2d, (byte)0x21,
+        (byte)0x2e, (byte)0x21, (byte)0x2f, (byte)0x21,
+        (byte)0x30, (byte)0x21, (byte)0x31, (byte)0x21,
+        (byte)0x32, (byte)0x21, (byte)0x33, (byte)0x21,
+        (byte)0x34, (byte)0x21, (byte)0x35, (byte)0x21,
+        (byte)0x36, (byte)0x21, (byte)0x37, (byte)0x21,
+        (byte)0x38, (byte)0x21, (byte)0x39, (byte)0x21,
+        (byte)0x3a, (byte)0x21, (byte)0x3b, (byte)0x21,
+        (byte)0x3c, (byte)0x21, (byte)0x3d, (byte)0x21,
+        (byte)0x3e, (byte)0x21, (byte)0x3f, (byte)0x21,
+        (byte)0x40, (byte)0x21, (byte)0x41, (byte)0x21,
+        (byte)0x42, (byte)0x21, (byte)0x43, (byte)0x21,
+        (byte)0x44, (byte)0x21, (byte)0x45, (byte)0x21,
+        (byte)0x46, (byte)0x21, (byte)0x47, (byte)0x55,
+        (byte)0x71, (byte)0x55, (byte)0x72, (byte)0x55,
+        (byte)0x73, (byte)0x55, (byte)0x74, (byte)0x55,
+        (byte)0x75, (byte)0x55, (byte)0x76, (byte)0x55,
+        (byte)0x77, (byte)0x55, (byte)0x78, (byte)0x55,
+        (byte)0x79, (byte)0x55, (byte)0x7a, (byte)0x55,
+        (byte)0x7b, (byte)0x55, (byte)0x7c, (byte)0x55,
+        (byte)0x7d, (byte)0x55, (byte)0x7e, (byte)0x56,
+        (byte)0x21, (byte)0x56, (byte)0x22, (byte)0x56,
+        (byte)0x23, (byte)0x56, (byte)0x24, (byte)0x56,
+        (byte)0x25, (byte)0x56, (byte)0x26, (byte)0x56,
+        (byte)0x27, (byte)0x56, (byte)0x28, (byte)0x56,
+        (byte)0x29, (byte)0x56, (byte)0x2a, (byte)0x56,
+        (byte)0x2b, (byte)0x56, (byte)0x2c, (byte)0x56,
+        (byte)0x2d, (byte)0x56, (byte)0x2e, (byte)0x56,
+        (byte)0x2f, (byte)0x56, (byte)0x30, (byte)0x56,
+        (byte)0x31, (byte)0x56, (byte)0x32, (byte)0x56,
+        (byte)0x33, (byte)0x56, (byte)0x34, (byte)0x56,
+        (byte)0x35, (byte)0x56, (byte)0x36, (byte)0x56,
+        (byte)0x37, (byte)0x56, (byte)0x38, (byte)0x56,
+        (byte)0x39, (byte)0x56, (byte)0x3a, (byte)0x56,
+        (byte)0x3b, (byte)0x56, (byte)0x3c, (byte)0x56,
+        (byte)0x3d, (byte)0x56, (byte)0x3e, (byte)0x56,
+        (byte)0x3f, (byte)0x56, (byte)0x40, (byte)0x56,
+        (byte)0x41, (byte)0x56, (byte)0x42, (byte)0x56,
+        (byte)0x43, (byte)0x56, (byte)0x44, (byte)0x56,
+        (byte)0x45, (byte)0x56, (byte)0x46, (byte)0x56,
+        (byte)0x47, (byte)0x56, (byte)0x48, (byte)0x56,
+        (byte)0x49, (byte)0x56, (byte)0x4a, (byte)0x56,
+        (byte)0x4b, (byte)0x56, (byte)0x4c, (byte)0x56,
+        (byte)0x4d, (byte)0x56, (byte)0x4e, (byte)0x56,
+        (byte)0x4f, (byte)0x56, (byte)0x50, (byte)0x56,
+        (byte)0x51, (byte)0x56, (byte)0x52, (byte)0x56,
+        (byte)0x53, (byte)0x56, (byte)0x54, (byte)0x56,
+        (byte)0x55, (byte)0x56, (byte)0x56, (byte)0x56,
+        (byte)0x57, (byte)0x56, (byte)0x58, (byte)0x56,
+        (byte)0x59, (byte)0x56, (byte)0x5a, (byte)0x56,
+        (byte)0x5b, (byte)0x56, (byte)0x5c, (byte)0x56,
+        (byte)0x5d, (byte)0x56, (byte)0x5e, (byte)0x56,
+        (byte)0x5f, (byte)0x56, (byte)0x60, (byte)0x56,
+        (byte)0x61, (byte)0x56, (byte)0x62, (byte)0x56,
+        (byte)0x63, (byte)0x56, (byte)0x64, (byte)0x56,
+        (byte)0x65, (byte)0x56, (byte)0x66, (byte)0x56,
+        (byte)0x67, (byte)0x56, (byte)0x68, (byte)0x56,
+        (byte)0x69, (byte)0x56, (byte)0x6a, (byte)0x56,
+        (byte)0x6b, (byte)0x56, (byte)0x6c, (byte)0x56,
+        (byte)0x6d, (byte)0x56, (byte)0x6e, (byte)0x56,
+        (byte)0x6f, (byte)0x56, (byte)0x70, (byte)0x56,
+        (byte)0x71, (byte)0x56, (byte)0x72, (byte)0x56,
+        (byte)0x73, (byte)0x56, (byte)0x74, (byte)0x56,
+        (byte)0x75, (byte)0x56, (byte)0x76, (byte)0x56,
+        (byte)0x77, (byte)0x56, (byte)0x78, (byte)0x56,
+        (byte)0x79, (byte)0x56, (byte)0x7a, (byte)0x56,
+        (byte)0x7b, (byte)0x56, (byte)0x7c, (byte)0x56,
+        (byte)0x7d, (byte)0x56, (byte)0x7e, (byte)0x57,
+        (byte)0x21, (byte)0x57, (byte)0x22, (byte)0x57,
+        (byte)0x23, (byte)0x57, (byte)0x24, (byte)0x57,
+        (byte)0x25, (byte)0x57, (byte)0x26, (byte)0x57,
+        (byte)0x27, (byte)0x57, (byte)0x28, (byte)0x57,
+        (byte)0x29, (byte)0x57, (byte)0x2a, (byte)0x57,
+        (byte)0x2b, (byte)0x57, (byte)0x2c, (byte)0x57,
+        (byte)0x2d, (byte)0x57, (byte)0x2e, (byte)0x57,
+        (byte)0x2f, (byte)0x57, (byte)0x30, (byte)0x57,
+        (byte)0x31, (byte)0x57, (byte)0x32, (byte)0x57,
+        (byte)0x33, (byte)0x57, (byte)0x34, (byte)0x57,
+        (byte)0x35, (byte)0x57, (byte)0x36, (byte)0x57,
+        (byte)0x37, (byte)0x57, (byte)0x38, (byte)0x57,
+        (byte)0x39, (byte)0x57, (byte)0x3a, (byte)0x57,
+        (byte)0x3b, (byte)0x57, (byte)0x3c, (byte)0x57,
+        (byte)0x3d, (byte)0x57, (byte)0x3e, (byte)0x57,
+        (byte)0x3f, (byte)0x57, (byte)0x40, (byte)0x57,
+        (byte)0x41, (byte)0x57, (byte)0x42, (byte)0x57,
+        (byte)0x43, (byte)0x57, (byte)0x44, (byte)0x57,
+        (byte)0x45, (byte)0x57, (byte)0x46, (byte)0x57,
+        (byte)0x47, (byte)0x57, (byte)0x48, (byte)0x57,
+        (byte)0x49, (byte)0x57, (byte)0x4a, (byte)0x57,
+        (byte)0x4b, (byte)0x57, (byte)0x4c, (byte)0x57,
+        (byte)0x4d, (byte)0x57, (byte)0x4e, (byte)0x57,
+        (byte)0x4f, (byte)0x57, (byte)0x50, (byte)0x57,
+        (byte)0x51, (byte)0x57, (byte)0x52, (byte)0x57,
+        (byte)0x53, (byte)0x57, (byte)0x54, (byte)0x57,
+        (byte)0x55, (byte)0x57, (byte)0x56, (byte)0x57,
+        (byte)0x57, (byte)0x57, (byte)0x58, (byte)0x57,
+        (byte)0x59, (byte)0x57, (byte)0x5a, (byte)0x57,
+        (byte)0x5b, (byte)0x57, (byte)0x5c, (byte)0x57,
+        (byte)0x5d, (byte)0x57, (byte)0x5e, (byte)0x57,
+        (byte)0x5f, (byte)0x57, (byte)0x60, (byte)0x57,
+        (byte)0x61, (byte)0x57, (byte)0x62, (byte)0x57,
+        (byte)0x63, (byte)0x57, (byte)0x64, (byte)0x59,
+        (byte)0x49, (byte)0x59, (byte)0x4a, (byte)0x59,
+        (byte)0x4b, (byte)0x59, (byte)0x4c, (byte)0x59,
+        (byte)0x4d, (byte)0x59, (byte)0x4e, (byte)0x59,
+        (byte)0x4f, (byte)0x59, (byte)0x50, (byte)0x59,
+        (byte)0x51, (byte)0x59, (byte)0x52, (byte)0x59,
+        (byte)0x53, (byte)0x59, (byte)0x54, (byte)0x59,
+        (byte)0x55, (byte)0x59, (byte)0x56, (byte)0x59,
+        (byte)0x57, (byte)0x59, (byte)0x58, (byte)0x59,
+        (byte)0x59, (byte)0x59, (byte)0x5a, (byte)0x59,
+        (byte)0x5b, (byte)0x59, (byte)0x5c, (byte)0x59,
+        (byte)0x5d, (byte)0x59, (byte)0x5e, (byte)0x59,
+        (byte)0x5f, (byte)0x59, (byte)0x60, (byte)0x59,
+        (byte)0x61, (byte)0x59, (byte)0x62, (byte)0x59,
+        (byte)0x63, (byte)0x59, (byte)0x64, (byte)0x59,
+        (byte)0x65, (byte)0x59, (byte)0x66, (byte)0x59,
+        (byte)0x67, (byte)0x59, (byte)0x68, (byte)0x59,
+        (byte)0x69, (byte)0x59, (byte)0x6a, (byte)0x59,
+        (byte)0x6b, (byte)0x59, (byte)0x6c, (byte)0x59,
+        (byte)0x6d, (byte)0x59, (byte)0x6e, (byte)0x59,
+        (byte)0x6f, (byte)0x59, (byte)0x70, (byte)0x59,
+        (byte)0x71, (byte)0x59, (byte)0x72, (byte)0x59,
+        (byte)0x73, (byte)0x59, (byte)0x74, (byte)0x59,
+        (byte)0x75, (byte)0x59, (byte)0x76, (byte)0x59,
+        (byte)0x77, (byte)0x59, (byte)0x78, (byte)0x59,
+        (byte)0x79, (byte)0x59, (byte)0x7a, (byte)0x59,
+        (byte)0x7b, (byte)0x59, (byte)0x7c, (byte)0x59,
+        (byte)0x7d, (byte)0x59, (byte)0x7e, (byte)0x5a,
+        (byte)0x21, (byte)0x5a, (byte)0x22, (byte)0x5a,
+        (byte)0x23, (byte)0x5a, (byte)0x24, (byte)0x5a,
+        (byte)0x25, (byte)0x5a, (byte)0x26, (byte)0x5a,
+        (byte)0x27, (byte)0x5a, (byte)0x28, (byte)0x5a,
+        (byte)0x29, (byte)0x5a, (byte)0x2a, (byte)0x5a,
+        (byte)0x2b, (byte)0x5a, (byte)0x2c, (byte)0x5a,
+        (byte)0x2d, (byte)0x5a, (byte)0x2e, (byte)0x5a,
+        (byte)0x2f, (byte)0x5a, (byte)0x30, (byte)0x5a,
+        (byte)0x31, (byte)0x5a, (byte)0x32, (byte)0x5a,
+        (byte)0x33, (byte)0x5a, (byte)0x34, (byte)0x5a,
+        (byte)0x35, (byte)0x5a, (byte)0x36, (byte)0x5a,
+        (byte)0x37, (byte)0x5a, (byte)0x38, (byte)0x5a,
+        (byte)0x39, (byte)0x5a, (byte)0x3a, (byte)0x5a,
+        (byte)0x3b, (byte)0x5a, (byte)0x3c, (byte)0x5a,
+        (byte)0x3d, (byte)0x5a, (byte)0x3e, (byte)0x5a,
+        (byte)0x3f, (byte)0x5a, (byte)0x40, (byte)0x5a,
+        (byte)0x41, (byte)0x5a, (byte)0x42, (byte)0x5b,
+        (byte)0x35, (byte)0x5b, (byte)0x36, (byte)0x5b,
+        (byte)0x37, (byte)0x5b, (byte)0x38, (byte)0x5b,
+        (byte)0x39, (byte)0x5b, (byte)0x3a, (byte)0x5b,
+        (byte)0x3b, (byte)0x5b, (byte)0x3c, (byte)0x5b,
+        (byte)0x3d, (byte)0x5b, (byte)0x3e, (byte)0x5b,
+        (byte)0x3f, (byte)0x5b, (byte)0x40, (byte)0x5b,
+        (byte)0x41, (byte)0x5b, (byte)0x42, (byte)0x5b,
+        (byte)0x43, (byte)0x5b, (byte)0x44, (byte)0x5b,
+        (byte)0x45, (byte)0x5b, (byte)0x46, (byte)0x5b,
+        (byte)0x47, (byte)0x5b, (byte)0x48, (byte)0x5b,
+        (byte)0x49, (byte)0x5b, (byte)0x4a, (byte)0x5b,
+        (byte)0x4b, (byte)0x5b, (byte)0x4c, (byte)0x5b,
+        (byte)0x4d, (byte)0x5b, (byte)0x4e, (byte)0x5b,
+        (byte)0x4f, (byte)0x5b, (byte)0x50, (byte)0x5b,
+        (byte)0x51, (byte)0x5b, (byte)0x52, (byte)0x5b,
+        (byte)0x53, (byte)0x5b, (byte)0x54, (byte)0x5b,
+        (byte)0x55, (byte)0x5b, (byte)0x56, (byte)0x5b,
+        (byte)0x57, (byte)0x5b, (byte)0x58, (byte)0x5b,
+        (byte)0x59, (byte)0x5b, (byte)0x5a, (byte)0x5b,
+        (byte)0x5b, (byte)0x5b, (byte)0x5c, (byte)0x5b,
+        (byte)0x5d, (byte)0x5b, (byte)0x5e, (byte)0x5b,
+        (byte)0x5f, (byte)0x5b, (byte)0x60, (byte)0x5b,
+        (byte)0x61, (byte)0x5b, (byte)0x62, (byte)0x5b,
+        (byte)0x63, (byte)0x5b, (byte)0x64, (byte)0x5b,
+        (byte)0x65, (byte)0x5b, (byte)0x66, (byte)0x5b,
+        (byte)0x67, (byte)0x5b, (byte)0x68, (byte)0x5b,
+        (byte)0x69, (byte)0x5b, (byte)0x6a, (byte)0x5b,
+        (byte)0x6b, (byte)0x5b, (byte)0x6c, (byte)0x5b,
+        (byte)0x6d, (byte)0x5b, (byte)0x6e, (byte)0x5b,
+        (byte)0x6f, (byte)0x5b, (byte)0x70, (byte)0x5b,
+        (byte)0x71, (byte)0x5b, (byte)0x72, (byte)0x5b,
+        (byte)0x73, (byte)0x5b, (byte)0x74, (byte)0x5b,
+        (byte)0x75, (byte)0x5b, (byte)0x76, (byte)0x5b,
+        (byte)0x77, (byte)0x5b, (byte)0x78, (byte)0x5b,
+        (byte)0x79, (byte)0x5b, (byte)0x7a, (byte)0x5b,
+        (byte)0x7b, (byte)0x5b, (byte)0x7c, (byte)0x5b,
+        (byte)0x7d, (byte)0x5b, (byte)0x7e, (byte)0x5c,
+        (byte)0x21, (byte)0x5c, (byte)0x22, (byte)0x5c,
+        (byte)0x23, (byte)0x5c, (byte)0x24, (byte)0x5c,
+        (byte)0x25, (byte)0x5c, (byte)0x26, (byte)0x5c,
+        (byte)0x27, (byte)0x5c, (byte)0x28, (byte)0x5c,
+        (byte)0x29, (byte)0x5c, (byte)0x2a, (byte)0x5c,
+        (byte)0x2b, (byte)0x5c, (byte)0x2c, (byte)0x5c,
+        (byte)0x2d, (byte)0x5c, (byte)0x2e, (byte)0x5c,
+        (byte)0x2f, (byte)0x5c, (byte)0x30, (byte)0x5c,
+        (byte)0x31, (byte)0x5c, (byte)0x32, (byte)0x5c,
+        (byte)0x33, (byte)0x5c, (byte)0x34, (byte)0x5c,
+        (byte)0x35, (byte)0x5c, (byte)0x36, (byte)0x5d,
+        (byte)0x79, (byte)0x5d, (byte)0x7a, (byte)0x5d,
+        (byte)0x7b, (byte)0x5d, (byte)0x7c, (byte)0x5d,
+        (byte)0x7d, (byte)0x5d, (byte)0x7e, (byte)0x5e,
+        (byte)0x21, (byte)0x5e, (byte)0x22, (byte)0x5e,
+        (byte)0x23, (byte)0x5e, (byte)0x24, (byte)0x5e,
+        (byte)0x25, (byte)0x5e, (byte)0x26, (byte)0x5e,
+        (byte)0x27, (byte)0x5e, (byte)0x28, (byte)0x5e,
+        (byte)0x29, (byte)0x5e, (byte)0x2a, (byte)0x5e,
+        (byte)0x2b, (byte)0x5e, (byte)0x2c, (byte)0x5e,
+        (byte)0x2d, (byte)0x5e, (byte)0x2e, (byte)0x5e,
+        (byte)0x2f, (byte)0x5e, (byte)0x30, (byte)0x5e,
+        (byte)0x31, (byte)0x5e, (byte)0x32, (byte)0x5e,
+        (byte)0x33, (byte)0x5e, (byte)0x34, (byte)0x5e,
+        (byte)0x35, (byte)0x5e, (byte)0x36, (byte)0x5e,
+        (byte)0x37, (byte)0x5e, (byte)0x38, (byte)0x5e,
+        (byte)0x39, (byte)0x5e, (byte)0x3a, (byte)0x5e,
+        (byte)0x3b, (byte)0x5e, (byte)0x3c, (byte)0x5e,
+        (byte)0x3d, (byte)0x5e, (byte)0x3e, (byte)0x5e,
+        (byte)0x3f, (byte)0x5e, (byte)0x40, (byte)0x5e,
+        (byte)0x41, (byte)0x5e, (byte)0x42, (byte)0x5e,
+        (byte)0x43, (byte)0x5e, (byte)0x44, (byte)0x5e,
+        (byte)0x45, (byte)0x5e, (byte)0x46, (byte)0x5e,
+        (byte)0x47, (byte)0x5e, (byte)0x48, (byte)0x5e,
+        (byte)0x49, (byte)0x5e, (byte)0x4a, (byte)0x60,
+        (byte)0x30, (byte)0x60, (byte)0x31, (byte)0x60,
+        (byte)0x32, (byte)0x60, (byte)0x33, (byte)0x60,
+        (byte)0x34, (byte)0x60, (byte)0x35, (byte)0x60,
+        (byte)0x36, (byte)0x60, (byte)0x37, (byte)0x60,
+        (byte)0x38, (byte)0x60, (byte)0x39, (byte)0x60,
+        (byte)0x3a, (byte)0x60, (byte)0x3b, (byte)0x60,
+        (byte)0x3c, (byte)0x60, (byte)0x3d, (byte)0x60,
+        (byte)0x3e, (byte)0x60, (byte)0x3f, (byte)0x73,
+        (byte)0x26, (byte)0x73, (byte)0x27, (byte)0x73,
+        (byte)0x28, (byte)0x73, (byte)0x29, (byte)0x73,
+        (byte)0x2a, (byte)0x73, (byte)0x2b, (byte)0x73,
+        (byte)0x2c, (byte)0x73, (byte)0x2d, (byte)0x73,
+        (byte)0x2e, (byte)0x73, (byte)0x2f, (byte)0x73,
+        (byte)0x30, (byte)0x73, (byte)0x31, (byte)0x73,
+        (byte)0x32, (byte)0x73, (byte)0x33, (byte)0x73,
+        (byte)0x34, (byte)0x73, (byte)0x35, (byte)0x73,
+        (byte)0x36, (byte)0x73, (byte)0x37, (byte)0x73,
+        (byte)0x38, (byte)0x73, (byte)0x39, (byte)0x73,
+        (byte)0x3a, (byte)0x73, (byte)0x3b, (byte)0x73,
+        (byte)0x3c, (byte)0x73, (byte)0x3d, (byte)0x73,
+        (byte)0x3e, (byte)0x73, (byte)0x3f, (byte)0x73,
+        (byte)0x40, (byte)0x73, (byte)0x41, (byte)0x73,
+        (byte)0x42, (byte)0x73, (byte)0x43, (byte)0x73,
+        (byte)0x44, (byte)0x73, (byte)0x45, (byte)0x73,
+        (byte)0x46, (byte)0x73, (byte)0x47, (byte)0x73,
+        (byte)0x48, (byte)0x73, (byte)0x49, (byte)0x73,
+        (byte)0x4a, (byte)0x73, (byte)0x4b, (byte)0x73,
+        (byte)0x4c, (byte)0x73, (byte)0x4d, (byte)0x73,
+        (byte)0x4e, (byte)0x73, (byte)0x4f, (byte)0x73,
+        (byte)0x50, (byte)0x73, (byte)0x51, (byte)0x73,
+        (byte)0x52, (byte)0x73, (byte)0x53, (byte)0x73,
+        (byte)0x54, (byte)0x73, (byte)0x55, (byte)0x73,
+        (byte)0x56, (byte)0x73, (byte)0x57, (byte)0x73,
+        (byte)0x58, (byte)0x73, (byte)0x59, (byte)0x73,
+        (byte)0x5a, (byte)0x73, (byte)0x5b, (byte)0x73,
+        (byte)0x5c, (byte)0x73, (byte)0x5d, (byte)0x73,
+        (byte)0x5e, (byte)0x73, (byte)0x5f, (byte)0x73,
+        (byte)0x60, (byte)0x73, (byte)0x61, (byte)0x73,
+        (byte)0x62, (byte)0x73, (byte)0x63, (byte)0x73,
+        (byte)0x64, (byte)0x73, (byte)0x65, (byte)0x73,
+        (byte)0x66, (byte)0x73, (byte)0x67, (byte)0x73,
+        (byte)0x68, (byte)0x73, (byte)0x69, (byte)0x73,
+        (byte)0x6a, (byte)0x73, (byte)0x6b, (byte)0x73,
+        (byte)0x6c, (byte)0x73, (byte)0x6d, (byte)0x73,
+        (byte)0x6e, (byte)0x73, (byte)0x6f, (byte)0x73,
+        (byte)0x70, (byte)0x73, (byte)0x71, (byte)0x73,
+        (byte)0x72, (byte)0x73, (byte)0x73, (byte)0x73,
+        (byte)0x74, (byte)0x73, (byte)0x75, (byte)0x73,
+        (byte)0x76, (byte)0x73, (byte)0x77, (byte)0x73,
+        (byte)0x78, (byte)0x73, (byte)0x79, (byte)0x73,
+        (byte)0x7a, (byte)0x73, (byte)0x7b, (byte)0x73,
+        (byte)0x7c, (byte)0x73, (byte)0x7d, (byte)0x73,
+        (byte)0x7e, (byte)0x74, (byte)0x21, (byte)0x74,
+        (byte)0x22, (byte)0x74, (byte)0x23, (byte)0x74,
+        (byte)0x24, (byte)0x74, (byte)0x25, (byte)0x74,
+        (byte)0x26
+    };
+
+    private static byte[] expectedBytes_JISX0201KATAKANA1 =
+    {
+        (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte)0x21, (byte)0x22, (byte)0x23, (byte)0x24,
+        (byte)0x25, (byte)0x26, (byte)0x27, (byte)0x28,
+        (byte)0x29, (byte)0x2a, (byte)0x2b, (byte)0x2c,
+        (byte)0x2d, (byte)0x2e, (byte)0x2f, (byte)0x30,
+        (byte)0x31, (byte)0x32, (byte)0x33, (byte)0x34,
+        (byte)0x35, (byte)0x36, (byte)0x37, (byte)0x38,
+        (byte)0x39, (byte)0x3a, (byte)0x3b, (byte)0x3c,
+        (byte)0x3d, (byte)0x3e, (byte)0x3f, (byte)0x40,
+        (byte)0x41, (byte)0x42, (byte)0x43, (byte)0x44,
+        (byte)0x45, (byte)0x46, (byte)0x47, (byte)0x48,
+        (byte)0x49, (byte)0x4a, (byte)0x4b, (byte)0x4c,
+        (byte)0x4d, (byte)0x4e, (byte)0x4f, (byte)0x50,
+        (byte)0x51, (byte)0x52, (byte)0x53, (byte)0x54,
+        (byte)0x55, (byte)0x56, (byte)0x57, (byte)0x58,
+        (byte)0x59, (byte)0x5a, (byte)0x5b, (byte)0x5c,
+        (byte)0x5d, (byte)0x5e, (byte)0x5f
+    };
+
+    private static byte[] expectedBytes_JISX0201KATAKANA2 =
+    {
+        (byte)0x1b, (byte)0x24, (byte)0x42,
+        (byte)0x21, (byte)0x23, (byte)0x21, (byte)0x56,
+        (byte)0x21, (byte)0x57, (byte)0x21, (byte)0x22,
+        (byte)0x21, (byte)0x26, (byte)0x25, (byte)0x72,
+        (byte)0x25, (byte)0x21, (byte)0x25, (byte)0x23,
+        (byte)0x25, (byte)0x25, (byte)0x25, (byte)0x27,
+        (byte)0x25, (byte)0x29, (byte)0x25, (byte)0x63,
+        (byte)0x25, (byte)0x65, (byte)0x25, (byte)0x67,
+        (byte)0x25, (byte)0x43, (byte)0x21, (byte)0x3c,
+        (byte)0x25, (byte)0x22, (byte)0x25, (byte)0x24,
+        (byte)0x25, (byte)0x26, (byte)0x25, (byte)0x28,
+        (byte)0x25, (byte)0x2a, (byte)0x25, (byte)0x2b,
+        (byte)0x25, (byte)0x2d, (byte)0x25, (byte)0x2f,
+        (byte)0x25, (byte)0x31, (byte)0x25, (byte)0x33,
+        (byte)0x25, (byte)0x35, (byte)0x25, (byte)0x37,
+        (byte)0x25, (byte)0x39, (byte)0x25, (byte)0x3b,
+        (byte)0x25, (byte)0x3d, (byte)0x25, (byte)0x3f,
+        (byte)0x25, (byte)0x41, (byte)0x25, (byte)0x44,
+        (byte)0x25, (byte)0x46, (byte)0x25, (byte)0x48,
+        (byte)0x25, (byte)0x4a, (byte)0x25, (byte)0x4b,
+        (byte)0x25, (byte)0x4c, (byte)0x25, (byte)0x4d,
+        (byte)0x25, (byte)0x4e, (byte)0x25, (byte)0x4f,
+        (byte)0x25, (byte)0x52, (byte)0x25, (byte)0x55,
+        (byte)0x25, (byte)0x58, (byte)0x25, (byte)0x5b,
+        (byte)0x25, (byte)0x5e, (byte)0x25, (byte)0x5f,
+        (byte)0x25, (byte)0x60, (byte)0x25, (byte)0x61,
+        (byte)0x25, (byte)0x62, (byte)0x25, (byte)0x64,
+        (byte)0x25, (byte)0x66, (byte)0x25, (byte)0x68,
+        (byte)0x25, (byte)0x69, (byte)0x25, (byte)0x6a,
+        (byte)0x25, (byte)0x6b, (byte)0x25, (byte)0x6c,
+        (byte)0x25, (byte)0x6d, (byte)0x25, (byte)0x6f,
+        (byte)0x25, (byte)0x73, (byte)0x21, (byte)0x2b,
+        (byte)0x21, (byte)0x2c,
+        (byte)0x1b, (byte)0x28, (byte)0x42
+    };
+
+    private static byte[] expectedBytes_JISX0208NECROW13 =
+    {
+        (byte)0x1b, (byte)0x24, (byte)0x42,
+        (byte)0x2d, (byte)0x21, (byte)0x2d, (byte)0x22,
+        (byte)0x2d, (byte)0x23, (byte)0x2d, (byte)0x24,
+        (byte)0x2d, (byte)0x25, (byte)0x2d, (byte)0x26,
+        (byte)0x2d, (byte)0x27, (byte)0x2d, (byte)0x28,
+        (byte)0x2d, (byte)0x29, (byte)0x2d, (byte)0x2a,
+        (byte)0x2d, (byte)0x2b, (byte)0x2d, (byte)0x2c,
+        (byte)0x2d, (byte)0x2d, (byte)0x2d, (byte)0x2e,
+        (byte)0x2d, (byte)0x2f, (byte)0x2d, (byte)0x30,
+        (byte)0x2d, (byte)0x31, (byte)0x2d, (byte)0x32,
+        (byte)0x2d, (byte)0x33, (byte)0x2d, (byte)0x34,
+        (byte)0x2d, (byte)0x35, (byte)0x2d, (byte)0x36,
+        (byte)0x2d, (byte)0x37, (byte)0x2d, (byte)0x38,
+        (byte)0x2d, (byte)0x39, (byte)0x2d, (byte)0x3a,
+        (byte)0x2d, (byte)0x3b, (byte)0x2d, (byte)0x3c,
+        (byte)0x2d, (byte)0x3d, (byte)0x2d, (byte)0x3e,
+        (byte)0x2d, (byte)0x40, (byte)0x2d, (byte)0x41,
+        (byte)0x2d, (byte)0x42, (byte)0x2d, (byte)0x43,
+        (byte)0x2d, (byte)0x44, (byte)0x2d, (byte)0x45,
+        (byte)0x2d, (byte)0x46, (byte)0x2d, (byte)0x47,
+        (byte)0x2d, (byte)0x48, (byte)0x2d, (byte)0x49,
+        (byte)0x2d, (byte)0x4a, (byte)0x2d, (byte)0x4b,
+        (byte)0x2d, (byte)0x4c, (byte)0x2d, (byte)0x4d,
+        (byte)0x2d, (byte)0x4e, (byte)0x2d, (byte)0x4f,
+        (byte)0x2d, (byte)0x50, (byte)0x2d, (byte)0x51,
+        (byte)0x2d, (byte)0x52, (byte)0x2d, (byte)0x53,
+        (byte)0x2d, (byte)0x54, (byte)0x2d, (byte)0x55,
+        (byte)0x2d, (byte)0x56, (byte)0x2d, (byte)0x5f,
+        (byte)0x2d, (byte)0x60, (byte)0x2d, (byte)0x61,
+        (byte)0x2d, (byte)0x62, (byte)0x2d, (byte)0x63,
+        (byte)0x2d, (byte)0x64, (byte)0x2d, (byte)0x65,
+        (byte)0x2d, (byte)0x66, (byte)0x2d, (byte)0x67,
+        (byte)0x2d, (byte)0x68, (byte)0x2d, (byte)0x69,
+        (byte)0x2d, (byte)0x6a, (byte)0x2d, (byte)0x6b,
+        (byte)0x2d, (byte)0x6c, (byte)0x2d, (byte)0x6d,
+        (byte)0x2d, (byte)0x6e, (byte)0x2d, (byte)0x6f,
+        (byte)0x2d, (byte)0x73, (byte)0x2d, (byte)0x74,
+        (byte)0x2d, (byte)0x78, (byte)0x2d, (byte)0x79,
+        (byte)0x1b, (byte)0x28, (byte)0x42
+    };
+
+
+    private static String MIXEDCONTENT =
+        "JA\u3000\u3002\u0062\uFF64PAN" +
+        "\uFF0C\uFF0E\u00A5\uFF65\uFF66X\u203E" +
+        "\u30FB\uFF67\u203E";
+
+    static byte[] mixedBytesExpected = {
+        (byte)0x4a, (byte)0x41, (byte)0x1b, (byte)0x24,
+        (byte)0x42, (byte)0x21, (byte)0x21, (byte)0x21,
+        (byte)0x23, (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte)0x62, (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte)0x24, (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte)0x50, (byte)0x41, (byte)0x4e, (byte)0x1b,
+        (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x24,
+        (byte)0x21, (byte)0x25, (byte)0x1b, (byte)0x28,
+        (byte)0x4a, (byte)0x5c, (byte)0x1b, (byte)0x28,
+        (byte)0x49, (byte)0x25, (byte)0x26, (byte)0x1b,
+        (byte)0x28, (byte)0x42, (byte)0x58, (byte)0x1b,
+        (byte)0x28, (byte)0x4a, (byte)0x7e, (byte)0x1b,
+        (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x26,
+        (byte)0x1b, (byte)0x28, (byte)0x49, (byte)0x27,
+        (byte)0x1b, (byte)0x28, (byte)0x4a, (byte)0x7e,
+        (byte)0x1b, (byte)0x28, (byte)0x42  };
+
+    private static byte[] repeatingEscapes = {
+        (byte)0x4a, (byte)0x41, (byte)0x1b, (byte)0x24,
+        (byte)0x42, (byte)0x1b, (byte)0x24, (byte)0x42,
+        (byte)0x21, (byte)0x21, (byte)0x21,
+        (byte)0x23, (byte)0x1b, (byte)0x28, (byte)0x42,
+        // embedded repeated iso-2022 escapes (see bugID 4879522)
+        (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte)0x62, (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte)0x0f, (byte)0x0e, (byte)0x0f,
+        (byte)0x1b, (byte)0x28, (byte)0x49,
+        (byte)0x24, (byte)0x1b, (byte)0x28, (byte)0x42,
+        (byte)0x50, (byte)0x41, (byte)0x4e,
+        // embedded shift chars (see bugID 4879522)
+        (byte)0x0e, (byte)0x0f,
+        (byte)0x1b,
+        (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x24,
+        (byte)0x21, (byte)0x25, (byte)0x1b, (byte)0x28,
+        (byte)0x4a, (byte)0x5c, (byte)0x1b, (byte)0x28,
+        (byte)0x49, (byte)0x25, (byte)0x26, (byte)0x1b,
+        (byte)0x28, (byte)0x42, (byte)0x58, (byte)0x1b,
+        (byte)0x28, (byte)0x4a, (byte)0x7e, (byte)0x1b,
+        (byte)0x24, (byte)0x42, (byte)0x21, (byte)0x26,
+        (byte)0x1b, (byte)0x28, (byte)0x49, (byte)0x27,
+        (byte)0x1b, (byte)0x28, (byte)0x4a, (byte)0x7e,
+        (byte)0x1b, (byte)0x28, (byte)0x42  };
+
+    private static String JISX0212 =
+        "\u02d8\u6896\ue757";
+
+    private static byte[] expectedBytes_JISX0212 = {
+        (byte)0x1b, (byte)0x24, (byte)0x28, (byte)0x44,
+        (byte)0x22, (byte)0x2f, (byte)0x43, (byte)0x6f,
+        (byte)0x7e, (byte)0x7e,
+        (byte)0x1b, (byte)0x28, (byte)0x42
+    };
+
+    /*
+     * Tests the roundtrip integrity and expected encoding
+     * correctness for a String containing a substantial
+     * subset of MS5022X encodeable chars
+     */
+
+    private static void roundTrip(String name,
+                                  String testStr,
+                                  byte[] expectBytes)
+    throws Exception {
+        byte[] encodedBytes = testStr.getBytes(name);
+        if (encodedBytes.length != expectBytes.length) {
+            //System.out.printf("l1=%d, l2=%d\n",
+            //                  encodedBytes.length,expectBytes.length);
+            throw new Exception(name + " Encoder error");
+        }
+        for (int i = 0; i < expectBytes.length; i++) {
+
+            if (encodedBytes[i] != expectBytes[i])  {
+                //System.out.printf("--->");
+                //throw new Exception(name + " Encoder error");
+            }
+            //System.out.printf("%x, %x\n",
+            //encodedBytes[i],expectBytes[i]);
+        }
+        String decoded = new String(encodedBytes, name);
+        if (!decoded.equals(testStr)) {
+            throw new Exception(name + " Decoder error");
+        }
+        String decoded2 = new String(repeatingEscapes, name);
+        if (!decoded2.equals(MIXEDCONTENT)) {
+            throw new Exception(name + " Decoder error");
+        }
+     }
+
+    public static void main(String[] args) throws Exception {
+        String map = System.getProperty("sun.nio.cs.map");
+        if (map != null) {
+            map = map.toLowerCase(java.util.Locale.US);
+            Charset cs = Charset.forName("ISO-2022-JP");
+            if (map.indexOf("x-windows-50221/ISO-2022-jp") != -1 &&
+                !"x-windows-50220".equals(cs.name()) ||
+                map.indexOf("x-windows-50220/ISO-2022-jp") != -1 &&
+                !"x-windows-50220".equals(cs.name()) ||
+                map.indexOf("x-windows-iso2022jp/ISO-2022-jp") != -1 &&
+                !"x-windows-iso2022jp".equals(cs.name())) {
+                throw new Exception("Error: sun.nio.cs.map=" + map +
+                                    ", ISO-2022-JP=" + cs.name());
+            } else {
+                System.out.printf("ISO-2022-JP=%s\n", cs.name());
+            }
+        }
+
+        String testStr = US_ASCII +
+                         JISX0208SUBSET +
+                         JISX0201KATAKANA +
+                         JISX0208NECROW13;
+
+        byte[] expectedBytes= (new String(expectedBytes_US_ASCII, "ASCII") +
+                               new String(expectedBytes_JISX0208SUBSET, "ASCII") +
+                               new String(expectedBytes_JISX0201KATAKANA1, "ASCII") +
+                               new String(expectedBytes_JISX0208NECROW13, "ASCII")).
+          getBytes("ASCII");
+
+        //MS50221
+        roundTrip("MS50221", testStr, expectedBytes);
+        roundTrip("MS50221", JISX0212, expectedBytes_JISX0212);
+
+        //MS50220 without halfwidth kana
+        roundTrip("MS50220",
+                  US_ASCII + JISX0208SUBSET + JISX0208NECROW13,
+                  (new String(expectedBytes_US_ASCII, "ASCII") +
+                   new String(expectedBytes_JISX0208SUBSET, "ASCII") +
+                   new String(expectedBytes_JISX0208NECROW13,
+                              3,
+                              expectedBytes_JISX0208NECROW13.length - 3,
+                              "ASCII")).getBytes("ASCII"));
+        roundTrip("MS50220", JISX0212, expectedBytes_JISX0212);
+
+        // Try MS50220 with halfwidth kana encoding
+        byte[] encodedBytes = JISX0201KATAKANA.getBytes("MS50220");
+        if (encodedBytes.length != expectedBytes_JISX0201KATAKANA2.length) {
+            throw new Exception("MS50220 Encoder error");
+        }
+        for (int i = 0; i < expectedBytes_JISX0201KATAKANA2.length; i++) {
+            if (encodedBytes[i] != expectedBytes_JISX0201KATAKANA2[i])  {
+                throw new Exception("MS50220 Encoder error");
+            }
+        }
+
+        //x-windows-iso2022jp
+        testStr = testStr.replace('\u301E', '\u301D')
+                         .replace('\u301C', '\uFF4E')
+                         .replace('\u2016', '\u2225');
+        roundTrip("x-windows-iso2022jp",
+                  testStr,
+                  expectedBytes);
+
+        testStr = MIXEDCONTENT;
+        roundTrip("MS50221", testStr , mixedBytesExpected);
+
+        // Test for bugID 4913711
+        // ISO-2022-JP encoding of a single input char yields
+        // 8 output bytes. Prior to fix for 4913711 the
+        // max bytes per char value was underspecified as 5.0
+        // and the code below would have thrown a BufferOverflow
+        // exception. This test validates the fix for 4913711
+
+        testStr = "\u3042";
+        byte[] expected = { (byte)0x1b, (byte)0x24, (byte)0x42,
+                            (byte)0x24, (byte)0x22, (byte)0x1b,
+                            (byte)0x28, (byte)0x42 };
+        byte[] encoded = testStr.getBytes("MS50221");
+        for (int i = 0; i < expected.length; i++) {
+            if (encoded[i] != expected[i])
+               throw new Exception("MS50221 Decoder error");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestMiscEUC_JP.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,62 @@
+/*
+ * 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 4121376
+   @summary Verify that EUC_JP 0x8FA2B7 maps to \uFF5E
+ */
+
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestMiscEUC_JP {
+
+  public static void main(String[] args) throws Exception
+  {
+    Charset cs = Charset.forName("EUC_JP");
+    CharsetDecoder dec  = cs.newDecoder();
+    CharsetEncoder enc  = cs.newEncoder();
+    byte[] euc           = {(byte)0x8F, (byte)0xA2, (byte)0xB7};
+
+    CharBuffer cb = dec.decode(ByteBuffer.wrap(euc));
+    if (cb.charAt(0) != 0xFF5E) {
+      throw new Exception("Converted EUC_JP 0x8FA2B7 to: 0x"
+                          + Integer.toHexString((int)cb.charAt(0)));
+    }
+    ByteBuffer bb = enc.encode(cb);
+
+    if (!((bb.limit() == 3)
+          && (bb.get() == euc[0])
+          && (bb.get() == euc[1])
+          && (bb.get() == euc[2]))) {
+      cb.flip();
+      bb.flip();
+      throw new Exception("Roundrip failed for char 0x"
+                          + Integer.toHexString((int)cb.charAt(0)) + ": "
+                          + Integer.toHexString(bb.limit()) + " 0x"
+                          + Integer.toHexString((int)bb.get() & 0xff) + " "
+                          + Integer.toHexString((int)bb.get() & 0xff) + " "
+                          + Integer.toHexString((int)bb.get() & 0xff));
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestSJIS0213.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,116 @@
+/*
+ * 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 6529796 6710199
+   @summary Test SJIS/MS932_0213 charsets
+ */
+
+import java.util.Arrays;
+
+public class TestSJIS0213 {
+    private static String sjisStr = "\u2014\u301C\u2016\u2212\u00A2\u00A3\u00AC";
+    private static String winStr = "\u2015\uFF5E\u2225\uFF0D\uFFE0\uFFE1\uFFE2\u2252\u2261\u222B\u2211\u221A\u22A5\u2220\u2235\u2229\u222A";
+
+    private static String compStr = "\u304B\u309A\u304D\u309A\u304F\u309A\u3051\u309A\u3053\u309A\u30AB\u309A\u30AD\u309A\u30AF\u309A\u30B1\u309A\u30B3\u309A\u30BB\u309A\u30C4\u309A\u30C8\u309A\u31F7\u309A\u00E6\u0300\u0254\u0300\u0254\u0301\u028C\u0300\u028C\u0301\u0259\u0300\u0259\u0301\u025A\u0300\u025A\u0301\u02E9\u02E5\u02E5\u02E9";
+    private static byte[] compBytes = new byte[] {
+        (byte)0x82, (byte)0xf5,
+        (byte)0x82, (byte)0xf6,
+        (byte)0x82, (byte)0xf7,
+        (byte)0x82, (byte)0xf8,
+        (byte)0x82, (byte)0xf9,
+        (byte)0x83, (byte)0x97,
+        (byte)0x83, (byte)0x98,
+        (byte)0x83, (byte)0x99,
+        (byte)0x83, (byte)0x9a,
+        (byte)0x83, (byte)0x9b,
+        (byte)0x83, (byte)0x9c,
+        (byte)0x83, (byte)0x9d,
+        (byte)0x83, (byte)0x9e,
+        (byte)0x83, (byte)0xf6,
+        (byte)0x86, (byte)0x63,
+        (byte)0x86, (byte)0x67,
+        (byte)0x86, (byte)0x68,
+        (byte)0x86, (byte)0x69,
+        (byte)0x86, (byte)0x6a,
+        (byte)0x86, (byte)0x6b,
+        (byte)0x86, (byte)0x6c,
+        (byte)0x86, (byte)0x6d,
+        (byte)0x86, (byte)0x6e,
+        (byte)0x86, (byte)0x85,
+        (byte)0x86, (byte)0x86 };
+
+    private static String mixedStr = "\u002B\u0041\u007a\uff61\uff9f\u3000\u30a1\u4e00\u304B\u309A\u304b";
+    private static byte[] mixedBytes = new byte[] {
+         (byte)0x2b,
+         (byte)0x41, (byte)0x7a,
+         (byte)0xa1, (byte)0xdf,
+         (byte)0x81, (byte)0x40,
+         (byte)0x83, (byte)0x40,
+         (byte)0x88, (byte)0xea,
+         (byte)0x82, (byte)0xf5,   // composite
+         (byte)0x82, (byte)0xa9 }; // base without cc
+
+    //base + base + cc
+    private static String mixedCompStr = "\u304D\u304B\u309A";
+    private static byte[] mixedCompBytes = new byte[] {
+        (byte)0x82, (byte)0xab, (byte)0x82, (byte)0xf5};
+
+    private static char[] unmappableChars = new char[] {
+        0x80, 0xfffc, 0xfffd};
+
+    private static byte[] unmappableBytes = new byte[] {
+        0x3f, 0x3f, 0x3f};
+
+    public static void main(String[] args) throws Exception {
+        if (!winStr.equals(new String(winStr.getBytes("MS932"), "MS932_0213")))
+            throw new RuntimeException("MS932_0213 failed on special codepoints!");
+
+        if (!(Arrays.equals(compStr.getBytes("MS932_0213"), compBytes)) ||
+            !compStr.equals(new String(compBytes, "MS932_0213")))
+            throw new RuntimeException("MS932_0213 failed on composites!");
+
+        if (!(Arrays.equals(mixedStr.getBytes("MS932_0213"), mixedBytes)) ||
+            !mixedStr.equals(new String(mixedBytes, "MS932_0213")))
+            throw new RuntimeException("MS932_0213 failed on mixed!");
+
+        if (!sjisStr.equals(new String(sjisStr.getBytes("SJIS"), "SJIS_0213")))
+            throw new RuntimeException("SJIS_0213 failed on special codepoints!");
+
+        if (!(Arrays.equals(compStr.getBytes("SJIS_0213"), compBytes)) ||
+            !compStr.equals(new String(compBytes, "SJIS_0213")))
+            throw new RuntimeException("SJIS_0213 failed on composites!");
+
+        if (!(Arrays.equals(mixedStr.getBytes("SJIS_0213"), mixedBytes)) ||
+            !mixedStr.equals(new String(mixedBytes, "SJIS_0213")))
+            throw new RuntimeException("SJIS_0213 failed on mixed!");
+
+        if (!(Arrays.equals(mixedCompStr.getBytes("SJIS_0213"), mixedCompBytes)) ||
+            !mixedCompStr.equals(new String(mixedCompBytes, "SJIS_0213")))
+            throw new RuntimeException("SJIS_0213 failed on mixedComp!");
+
+        if (!Arrays.equals(new String(unmappableChars).getBytes("SJIS_0213"), unmappableBytes) ||
+            !Arrays.equals(new String(unmappableChars).getBytes("MS932_0213"), unmappableBytes))
+            throw new RuntimeException("SJIS/MS932_0213 failed on unmappable encoding!");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,65 @@
+/*
+ * 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 4697605 4741233
+   @summary Check decoder behaves correctly in ISO2022_JP
+ */
+
+import java.io.*;
+
+public class TestTrailingEscapesISO2022JP {
+
+    public static void main(String[] args) throws Exception {
+
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        int len;
+
+        InputStream in =
+            new FileInputStream(new File(System.getProperty("test.src", "."),
+                                        "ISO2022JP.trailEsc"));
+        try {
+            byte[] b = new byte[4096];
+            while ( ( len = in.read( b, 0, b.length ) ) != -1 ) {
+                out.write(b, 0, len);
+            }
+        } finally {
+            in.close();
+        }
+
+        Reader inR = new InputStreamReader(new ByteArrayInputStream(
+                                                        out.toByteArray()),
+                                                       "iso-2022-jp");
+
+        try {
+            char[] c = new char[4096];
+            while ( ( len = inR.read( c, 0, c.length ) ) != -1 ) {
+                System.out.println(len);
+                if (len == 0)
+                    throw new Exception("Read returned zero!");
+            }
+        } finally {
+            inR.close();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestUTF8BOM.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,92 @@
+/*
+ * 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 4508058 6378911
+   @summary Check if UTF8 decoder handles BOM correctly
+ */
+
+import java.io.IOException;
+import java.nio.BufferOverflowException;
+import java.nio.*;
+import java.nio.charset.*;
+
+/* The fix for 6378911 is to backout the change we made for 4508058,
+   so this regtest is modified accordingly to leave the beginning
+   BOM untouched during decoding.
+ */
+public class TestUTF8BOM {
+    private static ByteBuffer bf = ByteBuffer.allocateDirect(1000);
+    private static void testDecode(String expected, byte[] input)
+        throws Exception
+    {
+        String out = new String(input, "utf8");
+        if (!out.equals(expected)) {
+            failureReport (out, expected);
+            throw new Exception("UTF_8 Decoding test failed");
+        }
+
+        //try directBuffer.
+        bf.clear();
+        bf.put(input).flip();
+        out = Charset.forName("UTF-8")
+                     .decode(bf)
+                     .toString();
+        if (!out.equals(expected)) {
+            failureReport (out, expected);
+            throw new Exception("UTF_8 Decoding test failed(directbuffer)");
+        }
+    }
+
+    private static void failureReport(String testStr,
+                                      String expected) {
+
+        System.err.println ("Expected Characters:");
+        for (int i = 0; i < expected.length() ; i++) {
+            System.out.println("expected char[" + i + "] : " +
+                              Integer.toHexString((int)expected.charAt(i)) +
+                              "  obtained char[" + i + "] : " +
+                              Integer.toHexString((int)testStr.charAt(i)));
+        }
+    }
+
+    public static void main (String[] args) throws Exception {
+            // Test 1: with BOM at beginning
+            testDecode("\ufeff\u0092\u0093",
+                        new byte[] { (byte) 0xef, (byte) 0xbb, (byte) 0xbf,
+                                     (byte) 0xc2, (byte) 0x92,
+                                     (byte) 0xc2, (byte) 0x93 });
+            // Test 2: with BOM at middle
+            testDecode("\u9200\ufeff\u9300",
+                        new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80,
+                                     (byte) 0xef, (byte) 0xbb, (byte) 0xbf,
+                                     (byte) 0xe9, (byte) 0x8c, (byte) 0x80 });
+
+            // Test 3: with BOM at end
+            testDecode("\u9200\u9300\ufeff",
+                        new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80,
+                                     (byte) 0xe9, (byte) 0x8c, (byte) 0x80,
+                                     (byte) 0xef, (byte) 0xbb, (byte) 0xbf });
+            System.err.println ("\nPASSED UTF-8 decode BOM test");
+   }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestUTF_16.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,196 @@
+/*
+ * 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 4403848 6348426 6407730
+   @summary Check correctness of the UTF-16 converter in all its flavors
+ */
+
+import java.io.IOException;
+import java.nio.BufferOverflowException;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestUTF_16 {
+
+    private static void testDecode(String charset,
+                                   String expected,
+                                   byte[] input)
+    throws Exception
+    {
+        String out = new String(input, charset);
+        if (!out.equals(expected)) {
+            failureReport (out, expected);
+            throw new Exception("UTF_16 Decoding test failed " + charset);
+        }
+    }
+
+    private static void testEncode(String charset,
+                                   String input,
+                                   byte[] expected)
+    throws Exception
+    {
+        byte[] testBytes = input.getBytes(charset);
+        for (int i = 0; i< expected.length; i++)
+            if (testBytes[i] != expected[i])
+                throw new Exception("UTF_16 Encoding test failed " + charset);
+
+    }
+
+    private static void warn(String s) {
+        System.err.println("FAILED Test 4403848 UTF-16" +
+                            s) ;
+    }
+
+    private static void failureReport(String testStr,
+                                      String expected) {
+
+        System.err.println ("Expected Characters:");
+        for (int i = 0; i < expected.length() ; i++) {
+            warn("expected char[" + i + "] : " +
+                  Integer.toHexString((int)expected.charAt(i)) +
+                 "obtained char[" + i + "] : " +
+                  Integer.toHexString((int)testStr.charAt(i)));
+        }
+    }
+
+    /*
+    private static void checkResult(char[] expected,
+                                    String testStr,
+                                    String testName)
+    throws Exception
+    {
+        if (testStr.length() != expected.length)
+            failureReport(testStr, expected);
+
+        for (int i = 0; i < testStr.length(); i++) {
+            if (testStr.charAt(i) != expected[i]) {
+                failureReport(testStr, expected);
+                throw new Exception ("REGTEST TestUTF16 failed: "
+                                        + testName);
+            }
+        }
+        System.err.println ("Test " + testName + " PASSED");
+        return;
+    }
+    */
+
+    private static void test() throws Exception  {
+
+            // Tests: Check decoding of UTF-16.
+            //        Ensures correct endian polarity
+            //        of the decoders and appropriate
+            //        interpretation of BOM bytes where
+            //        they are required.
+
+            // Test 1: BigEndian UTF-16 Decoding
+
+            testDecode("UTF_16BE", "\u0092\u0093",
+                        new byte[] { (byte) 0x00, (byte) 0x92,
+                                     (byte) 0x00, (byte) 0x93 });
+
+            // Test 1a: BigEndian UTF-16 Decoding. BOM bytes provided.
+            testDecode("UTF_16BE", "\ufeff\u0092\u0093",
+                        new byte[] { (byte) 0xfe, (byte) 0xff,
+                                     (byte) 0x00, (byte) 0x92,
+                                     (byte) 0x00, (byte) 0x93 });
+
+            testDecode("UTF_16LE", "\u9200\u9300",
+                        new byte[] { (byte) 0x00, (byte) 0x92,
+                                     (byte) 0x00, (byte) 0x93 });
+
+            // Test 2a: LittleEndian  UTF-16 Decoding, BOM bytes provided.
+            testDecode("UTF_16LE", "\ufeff\u9200\u9300",
+                        new byte[] { (byte) 0xff, (byte) 0xfe,
+                                     (byte) 0x00, (byte) 0x92,
+                                     (byte) 0x00, (byte) 0x93 });
+
+            // Test 3: UTF-16 (with mandatory byte order mark) Decoding
+
+            testDecode("UTF-16", "\u9200\u9300",
+                        new byte[] { (byte) 0xfe, (byte) 0xff,
+                                     (byte) 0x92, (byte) 0x00,
+                                     (byte) 0x93, (byte) 0x00 });
+
+
+            // Test 3a: UTF-16 BOM omitted. This should decode OK.
+            testDecode("UTF-16", "\u9200\u9300",
+                        new byte[] { (byte) 0x92, (byte) 0x00,
+                                     (byte) 0x93, (byte) 0x00 });
+
+
+            // Test 4: encoding using UTF-16
+            // BOM must be emitted when encoding and must be BigEndian.
+
+            testEncode("UTF-16", "\u0123",
+                        new byte[] { (byte) 0xfe, (byte) 0xff,
+                                     (byte) 0x01, (byte) 0x23 });
+
+            // Test 5:
+            if (CoderResult.OVERFLOW !=
+                Charset.forName("UTF_16")
+                .newDecoder()
+                .decode((ByteBuffer)(ByteBuffer.allocate(4)
+                                     .put(new byte[]
+                                          {(byte)0xd8,(byte)0x00,
+                                           (byte)0xdc,(byte)0x01})
+                                     .flip()),
+                        CharBuffer.allocate(1),
+                        true)) {
+                throw new Exception ("REGTEST TestUTF16 Overflow test failed");
+            }
+
+            // Test 6: decoding using UTF_16LE_BOM/UnicodeLittle
+            // UnicodeLittle should accept non-BOM byte sequence
+
+            testDecode("UnicodeLittle", "Arial",
+                        new byte[] { 'A', 0, 'r', 0, 'i', 0, 'a', 0, 'l', 0});
+
+            System.err.println ("\nPASSED UTF-16 encoder test");
+
+        // Reversed BOM in middle of stream Negative test.
+
+        /*
+        boolean caughtException = false;
+        try {
+                String out = new String(new byte[] {(byte)0x00,
+                                            (byte)0x92,
+                                            (byte)0xff,
+                                            (byte)0xfe},
+                                            "UTF-16");
+        } catch (IOException e) { caughtException = true; }
+
+        if (caughtException == false)
+           throw new Exception ("Incorrectly parsed BOM in middle of input");
+        */
+
+            // Fixed included with bug 4403848 fixes buffer sizing
+            // issue due to non provision of additional 2 bytes
+            // headroom for initial BOM bytes for UTF-16 encoding.
+          System.err.println ("OVERALL PASS OF UTF-16 Test");
+   }
+
+   public static void main (String[] args) throws Exception {
+     test();
+   }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestUTF_32.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,197 @@
+/*
+ * 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.
+ */
+
+/*
+   @bug 6346419
+   @summary Check correctness of the UTF-32 and its variant charsets
+ */
+
+import java.io.*;
+import java.nio.*;
+import java.nio.charset.*;
+
+public class TestUTF_32 {
+    private static void testDecode(String charset,
+                                   String expected,
+                                   byte[] input)
+        throws Exception
+    {
+        String out = new String(input, charset);
+        if (!out.equals(expected)) {
+            failureReport (out, expected);
+            throw new Exception("UTF_32 Decoding test failed: " + charset);
+        }
+    }
+
+    private static void testEncode(String charset,
+                                   String input,
+                                   byte[] expected)
+        throws Exception
+    {
+        byte[] testBytes = input.getBytes(charset);
+        for (int i = 0; i< expected.length; i++)
+            if (testBytes[i] != expected[i])
+                throw new Exception("UTF_32 Encoding test failed: [" + i + "]"+ charset);
+
+    }
+
+    private static void warn(String s) {
+        System.err.println("FAILED Test UTF-32:" +
+                            s) ;
+    }
+
+    private static void failureReport(String testStr,
+                                      String expected) {
+        System.err.println ("Expected Characters:");
+        for (int i = 0; i < expected.length() ; i++) {
+            warn("expected char[" + i + "] : " +
+                  Integer.toHexString((int)expected.charAt(i)) +
+                 "obtained char[" + i + "] : " +
+                  Integer.toHexString((int)testStr.charAt(i)));
+        }
+    }
+
+    private static void writeInt(OutputStream os, int i, boolean isBig)
+        throws Exception
+    {
+        if (isBig) {
+            os.write((i>>24) & 0xff);
+            os.write((i>>16) & 0xff);
+            os.write((i>>8) & 0xff);
+            os.write(i & 0xff);
+        } else {
+            os.write(i & 0xff);
+            os.write((i>>8) & 0xff);
+            os.write((i>>16) & 0xff);
+            os.write((i>>24) & 0xff);
+        }
+    }
+
+    private static byte[] getBytes(boolean doBOM, boolean isBig)
+        throws Exception
+    {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024*1024);
+        if (doBOM)
+           writeInt(baos, 0xfeff, isBig);
+
+        for (int i = 0; i < 0xffff; i++) {
+            if (i < Character.MIN_SURROGATE ||
+                i > Character.MAX_SURROGATE)
+            writeInt(baos, i, isBig);
+        }
+        for (int i = 0x10000; i < 0x1ffff; i++) {
+            writeInt(baos, i, isBig);
+        }
+
+        for (int i = 0x100000; i < 0x10ffff; i++) {
+            writeInt(baos, i, isBig);
+        }
+        byte[] bb = baos.toByteArray();
+        baos.close();
+        return bb;
+    }
+
+    public static void main (String[] args) throws Exception {
+        byte[] bb;
+        String s;
+
+        // Test 1: UTF_32 BigEndian
+        bb = getBytes(false, true);
+        s = new String(bb, "UTF-32");
+        testDecode("UTF_32", s, bb);
+        testEncode("UTF_32", s, bb);
+
+        // Test 2: UTF_32 LittleEndian Decoding With BOM and
+        //         BigEndian Encoding
+        bb = getBytes(true, false);
+        s = new String(bb, "UTF-32");
+        bb = getBytes(false, true);
+        testDecode("UTF_32", s, bb);
+        testEncode("UTF_32", s, bb);
+
+
+        // Test 3: UTF_32BE
+        bb = getBytes(false, true);
+        s = new String(bb, "UTF-32BE");
+        testDecode("UTF_32BE", s, bb);
+        testEncode("UTF_32BE", s, bb);
+
+
+        // Test 4: UTF_32LE
+        bb = getBytes(false, false);
+        s = new String(bb, "UTF-32LE");
+        testDecode("UTF_32LE", s, bb);
+        testEncode("UTF_32LE", s, bb);
+
+        // Test 5: UTF_32BE_BOM
+        bb = getBytes(true, true);
+        s = new String(bb, "UTF-32BE-BOM");
+        testDecode("UTF_32BE_BOM", s, bb);
+        testEncode("UTF_32BE_BOM", s, bb);
+
+
+        // Test 6: UTF_32LE_BOM
+        bb = getBytes(true, false);
+        s = new String(bb, "UTF-32LE-BOM");
+        testDecode("UTF_32LE_BOM", s, bb);
+        testEncode("UTF_32LE_BOM", s, bb);
+
+        s = "\u4e00\ufffd\u4e01";
+        // Test 7: BigEndian with reverse BOM in middle
+        bb = new byte[] {
+            (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x00,
+            (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
+            (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x01
+        };
+        if (!s.equals(new String(bb, "UTF_32")) ||
+            !s.equals(new String(bb, "UTF_32BE")) ||
+            !s.equals(new String(bb, "UTF_32BE_BOM")))
+            throw new Exception("UTF_32 Decoding test failed: ");
+
+        // Test 7: LittleEndian with reverse BOM in middle
+        bb = new byte[] {
+            (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
+            (byte)0x00,(byte)0x4e,(byte)0x00,(byte)0x00,
+            (byte)0x00,(byte)0x00,(byte)0xfe,(byte)0xff,
+            (byte)0x01,(byte)0x4e,(byte)0x00,(byte)0x00
+        };
+        if (!s.equals(new String(bb, "UTF_32")) ||
+            !s.equals(new String(bb, "UTF_32LE")) ||
+            !s.equals(new String(bb, "UTF_32LE_BOM")))
+            throw new Exception("UTF_32 Decoding test failed: ");
+
+        // Test 8: Overflow
+        if (CoderResult.OVERFLOW !=
+            Charset.forName("UTF_32")
+            .newDecoder()
+            .decode((ByteBuffer)(ByteBuffer.allocate(4)
+                                 .put(new byte[]
+                                      {(byte)0,(byte)1, (byte)0,(byte)01})
+                                 .flip()),
+                    CharBuffer.allocate(1),
+                    true)) {
+            throw new Exception ("Test UTF-32 Overflow test failed");
+        }
+        System.err.println ("OVERALL PASS OF UTF-32 Test");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestUni2HKSCS.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,327 @@
+/*
+ * 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 4634811
+   @summary Check Unicode 2.1 --> Big5-HKSCS reverse compatible mappings
+ */
+
+/*
+ * Mappings sourced from www.info.gov.hk/digital21/eng/hkscs
+ */
+
+public class TestUni2HKSCS {
+    private static final String uni21String =
+        "\uF3F5\uF3F8\uF3FD\uF403\uF413\uF415\uF418\uF419\uF41A"+
+        "\uF424\uF426\uF428\uF42B\uF42C\uF42D\uF437\uF439"+
+        "\uF43A\uF43C\uF445\uF44A\uF44E\uF44F\uF464\uF468"+
+        "\uF46A\uF46B\uF473\uF47A\uF487\uF489\uF493\uF494"+
+        "\uF496\uF49D\uF4A2\uF4AB\uF4AC\uF4AE\uF4B5\uF4C6"+
+        "\uF4CB\uF4D6\uF4E1\uF4FA\uF502\uF504\uF51E\uF529"+
+        "\uF52D\uF52E\uF530\uF536\uF540\uF544\uF554\uF637"+
+        "\uF638\uF63B\uF63C\uF641\uF642\uF643\uF644\uF648"+
+        "\uF64C\uF651\uF653\uF658\uF65D\uF65F\uF662\uF664"+
+        "\uF666\uF669\uF66C\uF66D\uF66E\uF675\uF677\uF67C"+
+        "\uF67E\uF688\uF68D\uF69D\uF6A1\uF6A2\uF6A5\uF6A7"+
+        "\uF6AE\uF6AF\uE316\uE326\uE32A\uE33C\uE351\uE35E"+
+        "\uE368\uE376\uE378\uE387\uE39C\uE3AD\uE3B3\uE3BE"+
+        "\uE3C2\uE3C7\uE3CB\uE3D1\uE3D2\uE3DE\uE3E2\uE3E4"+
+        "\uE3E8\uE3EA\uE3F5\uE3F7\uE406\uE40E\uE427\uE437"+
+        "\uE43D\uE449\uE44F\uE460\uE46B\uE47A\uE493\uE4A0"+
+        "\uE4A5\uE4A9\uE4B2\uE4BE\uE4BF\uE4C0\uE4DE\uE4E3"+
+        "\uE4E5\uE4ED\uE4F7\uE500\uE507\uE50E\uE534\uE539"+
+        "\uE53A\uE53B\uE53D\uE541\uE553\uE569\uE574\uE578"+
+        "\uE57B\uE57F\uE591\uE596\uE597\uE598\uE59C\uE5AE"+
+        "\uE5B9\uE5BC\uE5E0\uE5EC\uE5F5\uE5FA\uE5FE\uE60C"+
+        "\uE61D\uE629\uE62D\uE639\uE63B\uE63D\uE651\uE664"+
+        "\uE675\uE681\uE682\uE68D\uE694\uE69D\uE6A0\uE6A4"+
+        "\uE6A9\uE6AB\uE6B6\uE6C8\uE6E2\uE6E3\uE6E8\uE6ED"+
+        "\uE6EF\uE6F1\uE6F4\uE6F8\uE6FD\uE6FE\uE700\uE712"+
+        "\uE716\uE719\uE726\uE72E\uE730\uE738\uE73A\uE73B"+
+        "\uE749\uE74C\uE760\uE776\uE77E\uE780\uE78F\uE7AA"+
+        "\uE7AC\uE7AD\uE7AE\uE7C0\uE7C1\uE7C7\uE7CB\uE7D0"+
+        "\uE7D5\uE7D9\uE7E6\uE7EA\uE7F0\uE7F6\uE7FA\uE806"+
+        "\uE815\uE81B\uE81D\uE822\uE824\uE82E\uE831\uE832"+
+        "\uE83D\uE83F\uE850\uE853\uE85F\uE86B\uE86D\uE876"+
+        "\uE880\uE88E\uE899\uE89B\uE89C\uE8B3\uE8B7\uE8BC"+
+        "\uE8D2\uE8E2\uE8E4\uE8EC\uE8EE\uE8F4\uE8F6\uE8F7"+
+        "\uE8F9\uE8FA\uE8FD\uE901\uE906\uE90B\uE90E\uE90F"+
+        "\uE910\uE911\uE912\uE915\uE91B\uE931\uE932\uE946"+
+        "\uE949\uE965\uE96C\uE979\uE98D\uE994\uE996\uE99C"+
+        "\uE99D\uE99E\uE99F\uE9A1\uE9A2\uE9A7\uE9AA\uE9AC"+
+        "\uE9AE\uE9B5\uE9B7\uE9B9\uE9BA\uE9BC\uE9BD\uE9C5"+
+        "\uE9CF\uE9D0\uE9D6\uE9D8\uE9DB\uE9DE\uE9E5\uE9E6"+
+        "\uE9E9\uE9EB\uE9F7\uE9FE\uEA03\uEA0A\uEA0B\uEA0F"+
+        "\uEA13\uEA15\uEA1B\uEA21\uEA2A\uEA31\uEA35\uEA3C"+
+        "\uEA3D\uEA4C\uEA4F\uEA57\uEA63\uEA66\uEA75\uEA76"+
+        "\uEA7D\uEA82\uEA85\uEA87\uEA89\uEA8D\uEA90\uEA9B"+
+        "\uEA9D\uEAA6\uEAA8\uEAC8\uEAF7\uEB17\uEB51\uEB52"+
+        "\uEB60\uEB66\uEB6A\uEB87\uEB8B\uEB92\uEB96\uEBB1"+
+        "\uEBC3\uEBD6\uEBE0\uEBE6\uEBEA\uEBFF\uEC00\uEC03"+
+        "\uEC0B\uEC0D\uEC16\uEC3D\uEC4A\uEC4D\uEC53\uEC55"+
+        "\uEC61\uEC77\uEC7C\uEC7F\uEC87\uEC8C\uEC8F\uEC97"+
+        "\uECAE\uECB0\uECD0\uECD5\uECF4\uED05\uED1B\uED1F"+
+        "\uED23\uED33\uED37\uED38\uED3A\uED44\uED48\uED4C"+
+        "\uED59\uED5C\uED5D\uED5E\uED64\uED66\uED6D\uED6F"+
+        "\uED7B\uEDAE\uEDC1\uEDF3\uEDF5\uEE2E\uEE43\uEE45"+
+        "\uEE4A\uEE53\uEE59\uEE65\uEE89\uEE93\uEE97\uEE9F"+
+        "\uEEB2\uF6DD\uF820\uF821\uF822\uF823\uF824\uF825"+
+        "\uF826\uF827\uF828\uF829\uF82A\uF82B\uF82C\uF82D"+
+        "\uF82E\uF82F\uF830\uF831\uF832\uF833\uF834\uF835"+
+        "\uF836\uF837\uF838\uF839\uF83A\uF83B\uE005\uE008"+
+        "\uE028\uE02B\uE043\uE06A\uE06B\uE06E\uE07E\uE086"+
+        "\uE098\uE09B\uE0A0\uE0A8\uE0BB\uE0C2\uE0CD\uE0D7"+
+        "\uE0DA\uE0F1\uE0F4\uE0FA\uE0FC\uE104\uE105\uE10E"+
+        "\uE117\uE125\uE12A\uE12B\uE13C\uE143\uE144\uE153"+
+        "\uE15E\uE15F\uE160\uE164\uE17E\uE18C\uE19A\uE19C"+
+        "\uE1A7\uE1A9\uE1C6\uE1CF\uE1E0\uE1E1\uE1E3\uE1E7"+
+        "\uE1EA\uE1F4\uE1F8\uE203\uE211\uE217\uE218\uE239"+
+        "\uE23F\uE243\uE246\uE25D\uE25E\uE281\uE28A\uE298"+
+        "\uE2A2\uE2AC\uE2B1\uE2C8\uE2D7\uE30D";
+
+    private static final byte[] expectedBytes =
+        {(byte)0x89,(byte)0xb7,(byte)0x89,(byte)0xba,(byte)0x89,
+        (byte)0xbf,(byte)0x89,(byte)0xc5,(byte)0x89,(byte)0xd5,
+        (byte)0x89,(byte)0xd7,(byte)0x89,(byte)0xda,(byte)0x89,
+        (byte)0xdb,(byte)0x89,(byte)0xdc,(byte)0x89,(byte)0xe6,
+        (byte)0x89,(byte)0xe8,(byte)0x89,(byte)0xea,(byte)0x89,
+        (byte)0xed,(byte)0x89,(byte)0xee,(byte)0x89,(byte)0xef,
+        (byte)0x89,(byte)0xf9,(byte)0x89,(byte)0xfb,(byte)0x89,
+        (byte)0xfc,(byte)0x89,(byte)0xfe,(byte)0x8a,(byte)0x48,
+        (byte)0x8a,(byte)0x4d,(byte)0x8a,(byte)0x51,(byte)0x8a,
+        (byte)0x52,(byte)0x8a,(byte)0x67,(byte)0x8a,(byte)0x6b,
+        (byte)0x8a,(byte)0x6d,(byte)0x8a,(byte)0x6e,(byte)0x8a,
+        (byte)0x76,(byte)0x8a,(byte)0x7d,(byte)0x8a,(byte)0xac,
+        (byte)0x8a,(byte)0xae,(byte)0x8a,(byte)0xb8,(byte)0x8a,
+        (byte)0xb9,(byte)0x8a,(byte)0xbb,(byte)0x8a,(byte)0xc2,
+        (byte)0x8a,(byte)0xc7,(byte)0x8a,(byte)0xd0,(byte)0x8a,
+        (byte)0xd1,(byte)0x8a,(byte)0xd3,(byte)0x8a,(byte)0xda,
+        (byte)0x8a,(byte)0xeb,(byte)0x8a,(byte)0xf0,(byte)0x8a,
+        (byte)0xfb,(byte)0x8b,(byte)0x47,(byte)0x8b,(byte)0x60,
+        (byte)0x8b,(byte)0x68,(byte)0x8b,(byte)0x6a,(byte)0x8b,
+        (byte)0xa6,(byte)0x8b,(byte)0xb1,(byte)0x8b,(byte)0xb5,
+        (byte)0x8b,(byte)0xb6,(byte)0x8b,(byte)0xb8,(byte)0x8b,
+        (byte)0xbe,(byte)0x8b,(byte)0xc8,(byte)0x8b,(byte)0xcc,
+        (byte)0x8b,(byte)0xdc,(byte)0x8d,(byte)0x63,(byte)0x8d,
+        (byte)0x64,(byte)0x8d,(byte)0x67,(byte)0x8d,(byte)0x68,
+        (byte)0x8d,(byte)0x6d,(byte)0x8d,(byte)0x6e,(byte)0x8d,
+        (byte)0x6f,(byte)0x8d,(byte)0x70,(byte)0x8d,(byte)0x74,
+        (byte)0x8d,(byte)0x78,(byte)0x8d,(byte)0x7d,(byte)0x8d,
+        (byte)0xa1,(byte)0x8d,(byte)0xa6,(byte)0x8d,(byte)0xab,
+        (byte)0x8d,(byte)0xad,(byte)0x8d,(byte)0xb0,(byte)0x8d,
+        (byte)0xb2,(byte)0x8d,(byte)0xb4,(byte)0x8d,(byte)0xb7,
+        (byte)0x8d,(byte)0xba,(byte)0x8d,(byte)0xbb,(byte)0x8d,
+        (byte)0xbc,(byte)0x8d,(byte)0xc3,(byte)0x8d,(byte)0xc5,
+        (byte)0x8d,(byte)0xca,(byte)0x8d,(byte)0xcc,(byte)0x8d,
+        (byte)0xd6,(byte)0x8d,(byte)0xdb,(byte)0x8d,(byte)0xeb,
+        (byte)0x8d,(byte)0xef,(byte)0x8d,(byte)0xf0,(byte)0x8d,
+        (byte)0xf3,(byte)0x8d,(byte)0xf5,(byte)0x8d,(byte)0xfc,
+        (byte)0x8d,(byte)0xfd,(byte)0x8e,(byte)0x45,(byte)0x8e,
+        (byte)0x55,(byte)0x8e,(byte)0x59,(byte)0x8e,(byte)0x6b,
+        (byte)0x8e,(byte)0xa2,(byte)0x8e,(byte)0xaf,(byte)0x8e,
+        (byte)0xb9,(byte)0x8e,(byte)0xc7,(byte)0x8e,(byte)0xc9,
+        (byte)0x8e,(byte)0xd8,(byte)0x8e,(byte)0xed,(byte)0x8e,
+        (byte)0xfe,(byte)0x8f,(byte)0x45,(byte)0x8f,(byte)0x50,
+        (byte)0x8f,(byte)0x54,(byte)0x8f,(byte)0x59,(byte)0x8f,
+        (byte)0x5d,(byte)0x8f,(byte)0x63,(byte)0x8f,(byte)0x64,
+        (byte)0x8f,(byte)0x70,(byte)0x8f,(byte)0x74,(byte)0x8f,
+        (byte)0x76,(byte)0x8f,(byte)0x7a,(byte)0x8f,(byte)0x7c,
+        (byte)0x8f,(byte)0xa9,(byte)0x8f,(byte)0xab,(byte)0x8f,
+        (byte)0xba,(byte)0x8f,(byte)0xc2,(byte)0x8f,(byte)0xdb,
+        (byte)0x8f,(byte)0xeb,(byte)0x8f,(byte)0xf1,(byte)0x8f,
+        (byte)0xfd,(byte)0x90,(byte)0x44,(byte)0x90,(byte)0x55,
+        (byte)0x90,(byte)0x60,(byte)0x90,(byte)0x6f,(byte)0x90,
+        (byte)0xaa,(byte)0x90,(byte)0xb7,(byte)0x90,(byte)0xbc,
+        (byte)0x90,(byte)0xc0,(byte)0x90,(byte)0xc9,(byte)0x90,
+        (byte)0xd5,(byte)0x90,(byte)0xd6,(byte)0x90,(byte)0xd7,
+        (byte)0x90,(byte)0xf5,(byte)0x90,(byte)0xfa,(byte)0x90,
+        (byte)0xfc,(byte)0x91,(byte)0x45,(byte)0x91,(byte)0x4f,
+        (byte)0x91,(byte)0x58,(byte)0x91,(byte)0x5f,(byte)0x91,
+        (byte)0x66,(byte)0x91,(byte)0xae,(byte)0x91,(byte)0xb3,
+        (byte)0x91,(byte)0xb4,(byte)0x91,(byte)0xb5,(byte)0x91,
+        (byte)0xb7,(byte)0x91,(byte)0xbb,(byte)0x91,(byte)0xcd,
+        (byte)0x91,(byte)0xe3,(byte)0x91,(byte)0xee,(byte)0x91,
+        (byte)0xf2,(byte)0x91,(byte)0xf5,(byte)0x91,(byte)0xf9,
+        (byte)0x92,(byte)0x4c,(byte)0x92,(byte)0x51,(byte)0x92,
+        (byte)0x52,(byte)0x92,(byte)0x53,(byte)0x92,(byte)0x57,
+        (byte)0x92,(byte)0x69,(byte)0x92,(byte)0x74,(byte)0x92,
+        (byte)0x77,(byte)0x92,(byte)0xbd,(byte)0x92,(byte)0xc9,
+        (byte)0x92,(byte)0xd2,(byte)0x92,(byte)0xd7,(byte)0x92,
+        (byte)0xdb,(byte)0x92,(byte)0xe9,(byte)0x92,(byte)0xfa,
+        (byte)0x93,(byte)0x47,(byte)0x93,(byte)0x4b,(byte)0x93,
+        (byte)0x57,(byte)0x93,(byte)0x59,(byte)0x93,(byte)0x5b,
+        (byte)0x93,(byte)0x6f,(byte)0x93,(byte)0xa4,(byte)0x93,
+        (byte)0xb5,(byte)0x93,(byte)0xc1,(byte)0x93,(byte)0xc2,
+        (byte)0x93,(byte)0xcd,(byte)0x93,(byte)0xd4,(byte)0x93,
+        (byte)0xdd,(byte)0x93,(byte)0xe0,(byte)0x93,(byte)0xe4,
+        (byte)0x93,(byte)0xe9,(byte)0x93,(byte)0xeb,(byte)0x93,
+        (byte)0xf6,(byte)0x94,(byte)0x49,(byte)0x94,(byte)0x63,
+        (byte)0x94,(byte)0x64,(byte)0x94,(byte)0x69,(byte)0x94,
+        (byte)0x6e,(byte)0x94,(byte)0x70,(byte)0x94,(byte)0x72,
+        (byte)0x94,(byte)0x75,(byte)0x94,(byte)0x79,(byte)0x94,
+        (byte)0x7e,(byte)0x94,(byte)0xa1,(byte)0x94,(byte)0xa3,
+        (byte)0x94,(byte)0xb5,(byte)0x94,(byte)0xb9,(byte)0x94,
+        (byte)0xbc,(byte)0x94,(byte)0xc9,(byte)0x94,(byte)0xd1,
+        (byte)0x94,(byte)0xd3,(byte)0x94,(byte)0xdb,(byte)0x94,
+        (byte)0xdd,(byte)0x94,(byte)0xde,(byte)0x94,(byte)0xec,
+        (byte)0x94,(byte)0xef,(byte)0x95,(byte)0x44,(byte)0x95,
+        (byte)0x5a,(byte)0x95,(byte)0x62,(byte)0x95,(byte)0x64,
+        (byte)0x95,(byte)0x73,(byte)0x95,(byte)0xb0,(byte)0x95,
+        (byte)0xb2,(byte)0x95,(byte)0xb3,(byte)0x95,(byte)0xb4,
+        (byte)0x95,(byte)0xc6,(byte)0x95,(byte)0xc7,(byte)0x95,
+        (byte)0xcd,(byte)0x95,(byte)0xd1,(byte)0x95,(byte)0xd6,
+        (byte)0x95,(byte)0xdb,(byte)0x95,(byte)0xdf,(byte)0x95,
+        (byte)0xec,(byte)0x95,(byte)0xf0,(byte)0x95,(byte)0xf6,
+        (byte)0x95,(byte)0xfc,(byte)0x96,(byte)0x41,(byte)0x96,
+        (byte)0x4d,(byte)0x96,(byte)0x5c,(byte)0x96,(byte)0x62,
+        (byte)0x96,(byte)0x64,(byte)0x96,(byte)0x69,(byte)0x96,
+        (byte)0x6b,(byte)0x96,(byte)0x75,(byte)0x96,(byte)0x78,
+        (byte)0x96,(byte)0x79,(byte)0x96,(byte)0xa6,(byte)0x96,
+        (byte)0xa8,(byte)0x96,(byte)0xb9,(byte)0x96,(byte)0xbc,
+        (byte)0x96,(byte)0xc8,(byte)0x96,(byte)0xd4,(byte)0x96,
+        (byte)0xd6,(byte)0x96,(byte)0xdf,(byte)0x96,(byte)0xe9,
+        (byte)0x96,(byte)0xf7,(byte)0x97,(byte)0x43,(byte)0x97,
+        (byte)0x45,(byte)0x97,(byte)0x46,(byte)0x97,(byte)0x5d,
+        (byte)0x97,(byte)0x61,(byte)0x97,(byte)0x66,(byte)0x97,
+        (byte)0x7c,(byte)0x97,(byte)0xae,(byte)0x97,(byte)0xb0,
+        (byte)0x97,(byte)0xb8,(byte)0x97,(byte)0xba,(byte)0x97,
+        (byte)0xc0,(byte)0x97,(byte)0xc2,(byte)0x97,(byte)0xc3,
+        (byte)0x97,(byte)0xc5,(byte)0x97,(byte)0xc6,(byte)0x97,
+        (byte)0xc9,(byte)0x97,(byte)0xcd,(byte)0x97,(byte)0xd2,
+        (byte)0x97,(byte)0xd7,(byte)0x97,(byte)0xda,(byte)0x97,
+        (byte)0xdb,(byte)0x97,(byte)0xdc,(byte)0x97,(byte)0xdd,
+        (byte)0x97,(byte)0xde,(byte)0x97,(byte)0xe1,(byte)0x97,
+        (byte)0xe7,(byte)0x97,(byte)0xfd,(byte)0x97,(byte)0xfe,
+        (byte)0x98,(byte)0x53,(byte)0x98,(byte)0x56,(byte)0x98,
+        (byte)0x72,(byte)0x98,(byte)0x79,(byte)0x98,(byte)0xa8,
+        (byte)0x98,(byte)0xbc,(byte)0x98,(byte)0xc3,(byte)0x98,
+        (byte)0xc5,(byte)0x98,(byte)0xcb,(byte)0x98,(byte)0xcc,
+        (byte)0x98,(byte)0xcd,(byte)0x98,(byte)0xce,(byte)0x98,
+        (byte)0xd0,(byte)0x98,(byte)0xd1,(byte)0x98,(byte)0xd6,
+        (byte)0x98,(byte)0xd9,(byte)0x98,(byte)0xdb,(byte)0x98,
+        (byte)0xdd,(byte)0x98,(byte)0xe4,(byte)0x98,(byte)0xe6,
+        (byte)0x98,(byte)0xe8,(byte)0x98,(byte)0xe9,(byte)0x98,
+        (byte)0xeb,(byte)0x98,(byte)0xec,(byte)0x98,(byte)0xf4,
+        (byte)0x98,(byte)0xfe,(byte)0x99,(byte)0x40,(byte)0x99,
+        (byte)0x46,(byte)0x99,(byte)0x48,(byte)0x99,(byte)0x4b,
+        (byte)0x99,(byte)0x4e,(byte)0x99,(byte)0x55,(byte)0x99,
+        (byte)0x56,(byte)0x99,(byte)0x59,(byte)0x99,(byte)0x5b,
+        (byte)0x99,(byte)0x67,(byte)0x99,(byte)0x6e,(byte)0x99,
+        (byte)0x73,(byte)0x99,(byte)0x7a,(byte)0x99,(byte)0x7b,
+        (byte)0x99,(byte)0xa1,(byte)0x99,(byte)0xa5,(byte)0x99,
+        (byte)0xa7,(byte)0x99,(byte)0xad,(byte)0x99,(byte)0xb3,
+        (byte)0x99,(byte)0xbc,(byte)0x99,(byte)0xc3,(byte)0x99,
+        (byte)0xc7,(byte)0x99,(byte)0xce,(byte)0x99,(byte)0xcf,
+        (byte)0x99,(byte)0xde,(byte)0x99,(byte)0xe1,(byte)0x99,
+        (byte)0xe9,(byte)0x99,(byte)0xf5,(byte)0x99,(byte)0xf8,
+        (byte)0x9a,(byte)0x48,(byte)0x9a,(byte)0x49,(byte)0x9a,
+        (byte)0x50,(byte)0x9a,(byte)0x55,(byte)0x9a,(byte)0x58,
+        (byte)0x9a,(byte)0x5a,(byte)0x9a,(byte)0x5c,(byte)0x9a,
+        (byte)0x60,(byte)0x9a,(byte)0x63,(byte)0x9a,(byte)0x6e,
+        (byte)0x9a,(byte)0x70,(byte)0x9a,(byte)0x79,(byte)0x9a,
+        (byte)0x7b,(byte)0x9a,(byte)0xbd,(byte)0x9a,(byte)0xec,
+        (byte)0x9b,(byte)0x4d,(byte)0x9b,(byte)0xa9,(byte)0x9b,
+        (byte)0xaa,(byte)0x9b,(byte)0xb8,(byte)0x9b,(byte)0xbe,
+        (byte)0x9b,(byte)0xc2,(byte)0x9b,(byte)0xdf,(byte)0x9b,
+        (byte)0xe3,(byte)0x9b,(byte)0xea,(byte)0x9b,(byte)0xee,
+        (byte)0x9c,(byte)0x4a,(byte)0x9c,(byte)0x5c,(byte)0x9c,
+        (byte)0x6f,(byte)0x9c,(byte)0x79,(byte)0x9c,(byte)0xa1,
+        (byte)0x9c,(byte)0xa5,(byte)0x9c,(byte)0xba,(byte)0x9c,
+        (byte)0xbb,(byte)0x9c,(byte)0xbe,(byte)0x9c,(byte)0xc6,
+        (byte)0x9c,(byte)0xc8,(byte)0x9c,(byte)0xd1,(byte)0x9c,
+        (byte)0xf8,(byte)0x9d,(byte)0x46,(byte)0x9d,(byte)0x49,
+        (byte)0x9d,(byte)0x4f,(byte)0x9d,(byte)0x51,(byte)0x9d,
+        (byte)0x5d,(byte)0x9d,(byte)0x73,(byte)0x9d,(byte)0x78,
+        (byte)0x9d,(byte)0x7b,(byte)0x9d,(byte)0xa5,(byte)0x9d,
+        (byte)0xaa,(byte)0x9d,(byte)0xad,(byte)0x9d,(byte)0xb5,
+        (byte)0x9d,(byte)0xcc,(byte)0x9d,(byte)0xce,(byte)0x9d,
+        (byte)0xee,(byte)0x9d,(byte)0xf3,(byte)0x9e,(byte)0x53,
+        (byte)0x9e,(byte)0x64,(byte)0x9e,(byte)0x7a,(byte)0x9e,
+        (byte)0x7e,(byte)0x9e,(byte)0xa4,(byte)0x9e,(byte)0xb4,
+        (byte)0x9e,(byte)0xb8,(byte)0x9e,(byte)0xb9,(byte)0x9e,
+        (byte)0xbb,(byte)0x9e,(byte)0xc5,(byte)0x9e,(byte)0xc9,
+        (byte)0x9e,(byte)0xcd,(byte)0x9e,(byte)0xda,(byte)0x9e,
+        (byte)0xdd,(byte)0x9e,(byte)0xde,(byte)0x9e,(byte)0xdf,
+        (byte)0x9e,(byte)0xe5,(byte)0x9e,(byte)0xe7,(byte)0x9e,
+        (byte)0xee,(byte)0x9e,(byte)0xf0,(byte)0x9e,(byte)0xfc,
+        (byte)0x9f,(byte)0x70,(byte)0x9f,(byte)0xa5,(byte)0x9f,
+        (byte)0xd7,(byte)0x9f,(byte)0xd9,(byte)0xa0,(byte)0x53,
+        (byte)0xa0,(byte)0x68,(byte)0xa0,(byte)0x6a,(byte)0xa0,
+        (byte)0x6f,(byte)0xa0,(byte)0x78,(byte)0xa0,(byte)0x7e,
+        (byte)0xa0,(byte)0xac,(byte)0xa0,(byte)0xd0,(byte)0xa0,
+        (byte)0xda,(byte)0xa0,(byte)0xde,(byte)0xa0,(byte)0xe6,
+        (byte)0xa0,(byte)0xf9,(byte)0xc6,(byte)0xcd,(byte)0xc8,
+        (byte)0xd6,(byte)0xc8,(byte)0xd7,(byte)0xc8,(byte)0xd8,
+        (byte)0xc8,(byte)0xd9,(byte)0xc8,(byte)0xda,(byte)0xc8,
+        (byte)0xdb,(byte)0xc8,(byte)0xdc,(byte)0xc8,(byte)0xdd,
+        (byte)0xc8,(byte)0xde,(byte)0xc8,(byte)0xdf,(byte)0xc8,
+        (byte)0xe0,(byte)0xc8,(byte)0xe1,(byte)0xc8,(byte)0xe2,
+        (byte)0xc8,(byte)0xe3,(byte)0xc8,(byte)0xe4,(byte)0xc8,
+        (byte)0xe5,(byte)0xc8,(byte)0xe6,(byte)0xc8,(byte)0xe7,
+        (byte)0xc8,(byte)0xe8,(byte)0xc8,(byte)0xe9,(byte)0xc8,
+        (byte)0xea,(byte)0xc8,(byte)0xeb,(byte)0xc8,(byte)0xec,
+        (byte)0xc8,(byte)0xed,(byte)0xc8,(byte)0xee,(byte)0xc8,
+        (byte)0xef,(byte)0xc8,(byte)0xf0,(byte)0xc8,(byte)0xf1,
+        (byte)0xfa,(byte)0x45,(byte)0xfa,(byte)0x48,(byte)0xfa,
+        (byte)0x68,(byte)0xfa,(byte)0x6b,(byte)0xfa,(byte)0xa5,
+        (byte)0xfa,(byte)0xcc,(byte)0xfa,(byte)0xcd,(byte)0xfa,
+        (byte)0xd0,(byte)0xfa,(byte)0xe0,(byte)0xfa,(byte)0xe8,
+        (byte)0xfa,(byte)0xfa,(byte)0xfa,(byte)0xfd,(byte)0xfb,
+        (byte)0x43,(byte)0xfb,(byte)0x4b,(byte)0xfb,(byte)0x5e,
+        (byte)0xfb,(byte)0x65,(byte)0xfb,(byte)0x70,(byte)0xfb,
+        (byte)0x7a,(byte)0xfb,(byte)0x7d,(byte)0xfb,(byte)0xb6,
+        (byte)0xfb,(byte)0xb9,(byte)0xfb,(byte)0xbf,(byte)0xfb,
+        (byte)0xc1,(byte)0xfb,(byte)0xc9,(byte)0xfb,(byte)0xca,
+        (byte)0xfb,(byte)0xd3,(byte)0xfb,(byte)0xdc,(byte)0xfb,
+        (byte)0xea,(byte)0xfb,(byte)0xef,(byte)0xfb,(byte)0xf0,
+        (byte)0xfc,(byte)0x42,(byte)0xfc,(byte)0x49,(byte)0xfc,
+        (byte)0x4a,(byte)0xfc,(byte)0x59,(byte)0xfc,(byte)0x64,
+        (byte)0xfc,(byte)0x65,(byte)0xfc,(byte)0x66,(byte)0xfc,
+        (byte)0x6a,(byte)0xfc,(byte)0xa6,(byte)0xfc,(byte)0xb4,
+        (byte)0xfc,(byte)0xc2,(byte)0xfc,(byte)0xc4,(byte)0xfc,
+        (byte)0xcf,(byte)0xfc,(byte)0xd1,(byte)0xfc,(byte)0xee,
+        (byte)0xfc,(byte)0xf7,(byte)0xfd,(byte)0x49,(byte)0xfd,
+        (byte)0x4a,(byte)0xfd,(byte)0x4c,(byte)0xfd,(byte)0x50,
+        (byte)0xfd,(byte)0x53,(byte)0xfd,(byte)0x5d,(byte)0xfd,
+        (byte)0x61,(byte)0xfd,(byte)0x6c,(byte)0xfd,(byte)0x7a,
+        (byte)0xfd,(byte)0xa2,(byte)0xfd,(byte)0xa3,(byte)0xfd,
+        (byte)0xc4,(byte)0xfd,(byte)0xca,(byte)0xfd,(byte)0xce,
+        (byte)0xfd,(byte)0xd1,(byte)0xfd,(byte)0xe8,(byte)0xfd,
+        (byte)0xe9,(byte)0xfe,(byte)0x4d,(byte)0xfe,(byte)0x56,
+        (byte)0xfe,(byte)0x64,(byte)0xfe,(byte)0x6e,(byte)0xfe,
+        (byte)0x78,(byte)0xfe,(byte)0x7d,(byte)0xfe,(byte)0xb6,
+        (byte)0xfe,(byte)0xc5,(byte)0xfe,(byte)0xfb };
+
+    public static void main(String[] args) throws Exception {
+        byte[] encodedBytes = new byte[1000];
+
+        encodedBytes = uni21String.getBytes("Big5-HKSCS");
+
+        for (int i = 0; i < encodedBytes.length - 1; i++) {
+            if (encodedBytes[i] != expectedBytes[i]
+                || encodedBytes[i+1] != expectedBytes[i+1]) {
+           throw new Exception("Unexpected char->byte HKSCS mappings");
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestX11JIS0201.java	Wed Jul 05 16:39:00 2017 +0200
@@ -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.
+ *
+ * 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 4195325
+ * @summary name() should return "X11JIS0201"
+ *
+ */
+
+import java.nio.charset.*;
+
+public class TestX11JIS0201 {
+
+    public static void main(String args[])
+        throws Exception
+    {
+        test();
+    }
+
+    private static void test()
+        throws Exception
+    {
+        Class cl = null;
+        try {
+            cl = Class.forName("sun.awt.motif.X11JIS0201");
+        } catch (Exception e){
+            return;
+        }
+        Charset cs = (Charset)cl.newInstance();
+        if (! cs.name().equals("X11JIS0201")){
+            throw new Exception("X11JIS0201 does not work correctly");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/UkrainianIsNotRussian.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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 4890726
+   @summary Check the correctness of KOI8_U by comparing to KOI8_R
+ */
+
+import java.util.*;
+import static java.lang.Character.UnicodeBlock;
+
+public class UkrainianIsNotRussian {
+    private static String decode(byte[] bytes, String encoding) throws Throwable {
+        String s = new String(bytes, encoding);
+        equal(s.length(), 1);
+        check(Arrays.equals(s.getBytes(encoding), bytes));
+        return s;
+    }
+
+    private static void realMain(String[] args) throws Throwable {
+        final byte[] bytes = new byte[1];
+        int differences = 0;
+        for (int i = 0; i < 0xff; i++) {
+            bytes[0] = (byte) i;
+            final String r = decode(bytes, "KOI8_R");
+            final String u = decode(bytes, "KOI8_U");
+            if (! r.equals(u)) {
+                differences++;
+                final char rc = r.charAt(0);
+                final char uc = u.charAt(0);
+                final UnicodeBlock rcb = UnicodeBlock.of(rc);
+                final UnicodeBlock ucb = UnicodeBlock.of(uc);
+                System.out.printf("%02x => %04x %s, %04x %s%n",
+                                  i, (int) rc, rcb, (int) uc, ucb);
+                check(rcb == UnicodeBlock.BOX_DRAWING &&
+                      ucb == UnicodeBlock.CYRILLIC);
+            }
+        }
+        equal(differences, 8);
+    }
+
+    //--------------------- Infrastructure ---------------------------
+    static volatile int passed = 0, failed = 0;
+    static void pass() {passed++;}
+    static void fail() {failed++; Thread.dumpStack();}
+    static void fail(String msg) {System.out.println(msg); fail();}
+    static void unexpected(Throwable t) {failed++; t.printStackTrace();}
+    static void check(boolean cond) {if (cond) pass(); else fail();}
+    static void equal(Object x, Object y) {
+        if (x == null ? y == null : x.equals(y)) pass();
+        else fail(x + " not equal to " + y);}
+    public static void main(String[] args) throws Throwable {
+        try {realMain(args);} catch (Throwable t) {unexpected(t);}
+        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
+        if (failed > 0) throw new AssertionError("Some tests failed");}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,52 @@
+/*
+ * 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 4522270
+   @summary Ensure that a zeroed byte array produces a valid String when EUC-TW  decoded
+
+ */
+
+public class ZeroedByteArrayEUCTWTest
+{
+    public static void main(String[] args) throws Exception {
+        test("cns11643");
+    }
+
+    public static void test(String encoding) throws Exception {
+        String result = null;
+        byte[] data = new byte[16];
+
+        for (int i = 0; i < 16; i++) {
+            data[i] = 0;
+        }
+
+        result = new String(data, encoding);
+        if (result.length() != 16)
+            throw new Exception ("EUC_TW regression test bugID 4522270 failed");
+
+        for (int i=0; i < 16; i++) {
+            data[i] = (byte)( 32 + i);
+        }
+    }
+}
--- a/langtools/.hgtags	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/.hgtags	Wed Jul 05 16:39:00 2017 +0200
@@ -4,3 +4,4 @@
 a17265993253d61becd04fe7d96d1fe8b4bd6dff jdk7-b27
 4ef4bd31856949554967fbf22783babb21a62a0e jdk7-b28
 dec081837b01d509dcc2b9de86a4299c1ec17e04 jdk7-b29
+eaf608c64fecf70f955dc9f29f94c055b183aeec jdk7-b30
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java	Wed Jul 05 16:39:00 2017 +0200
@@ -100,9 +100,12 @@
 
         boolean verboseDeprecated = lint.isEnabled(LintCategory.DEPRECATION);
         boolean verboseUnchecked = lint.isEnabled(LintCategory.UNCHECKED);
+        boolean enforceMandatoryWarnings = source.enforceMandatoryWarnings();
 
-        deprecationHandler = new MandatoryWarningHandler(log,verboseDeprecated, "deprecated");
-        uncheckedHandler = new MandatoryWarningHandler(log, verboseUnchecked, "unchecked");
+        deprecationHandler = new MandatoryWarningHandler(log, verboseDeprecated,
+                enforceMandatoryWarnings, "deprecated");
+        uncheckedHandler = new MandatoryWarningHandler(log, verboseUnchecked,
+                enforceMandatoryWarnings, "unchecked");
     }
 
     /** Switch: generics enabled?
@@ -1367,13 +1370,47 @@
                         types.isSameType(rt1, rt2) ||
                         rt1.tag >= CLASS && rt2.tag >= CLASS &&
                         (types.covariantReturnType(rt1, rt2, Warner.noWarnings) ||
-                         types.covariantReturnType(rt2, rt1, Warner.noWarnings));
+                         types.covariantReturnType(rt2, rt1, Warner.noWarnings)) ||
+                         checkCommonOverriderIn(s1,s2,site);
                     if (!compat) return s2;
                 }
             }
         }
         return null;
     }
+    //WHERE
+    boolean checkCommonOverriderIn(Symbol s1, Symbol s2, Type site) {
+        Map<TypeSymbol,Type> supertypes = new HashMap<TypeSymbol,Type>();
+        Type st1 = types.memberType(site, s1);
+        Type st2 = types.memberType(site, s2);
+        closure(site, supertypes);
+        for (Type t : supertypes.values()) {
+            for (Scope.Entry e = t.tsym.members().lookup(s1.name); e.scope != null; e = e.next()) {
+                Symbol s3 = e.sym;
+                if (s3 == s1 || s3 == s2 || s3.kind != MTH || (s3.flags() & (BRIDGE|SYNTHETIC)) != 0) continue;
+                Type st3 = types.memberType(site,s3);
+                if (types.overrideEquivalent(st3, st1) && types.overrideEquivalent(st3, st2)) {
+                    if (s3.owner == site.tsym) {
+                        return true;
+                    }
+                    List<Type> tvars1 = st1.getTypeArguments();
+                    List<Type> tvars2 = st2.getTypeArguments();
+                    List<Type> tvars3 = st3.getTypeArguments();
+                    Type rt1 = st1.getReturnType();
+                    Type rt2 = st2.getReturnType();
+                    Type rt13 = types.subst(st3.getReturnType(), tvars3, tvars1);
+                    Type rt23 = types.subst(st3.getReturnType(), tvars3, tvars2);
+                    boolean compat =
+                        rt13.tag >= CLASS && rt23.tag >= CLASS &&
+                        (types.covariantReturnType(rt13, rt1, Warner.noWarnings) &&
+                         types.covariantReturnType(rt23, rt2, Warner.noWarnings));
+                    if (compat)
+                        return true;
+                }
+            }
+        }
+        return false;
+    }
 
     /** Check that a given method conforms with any method it overrides.
      *  @param tree         The tree from which positions are extracted
--- a/langtools/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java	Wed Jul 05 16:39:00 2017 +0200
@@ -25,6 +25,7 @@
 
 package com.sun.tools.javac.file;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
@@ -36,6 +37,9 @@
 import static javax.tools.JavaFileObject.Kind.*;
 
 public abstract class BaseFileObject implements JavaFileObject {
+    protected BaseFileObject(JavacFileManager fileManager) {
+        this.fileManager = fileManager;
+    }
 
     public JavaFileObject.Kind getKind() {
         String n = getName();
@@ -76,4 +80,14 @@
         throw new UnsupportedOperationException();
     }
 
+    protected abstract String inferBinaryName(Iterable<? extends File> path);
+
+    protected static String removeExtension(String fileName) {
+        int lastDot = fileName.lastIndexOf(".");
+        return (lastDot == -1 ? fileName : fileName.substring(0, lastDot));
+    }
+
+    /** The file manager that created this JavaFileObject. */
+    protected final JavacFileManager fileManager;
+
 }
--- a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java	Wed Jul 05 16:39:00 2017 +0200
@@ -25,21 +25,16 @@
 
 package com.sun.tools.javac.file;
 
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 import java.io.OutputStreamWriter;
-import java.io.Writer;
 import java.lang.ref.SoftReference;
 import java.net.MalformedURLException;
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.nio.ByteBuffer;
@@ -56,13 +51,11 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
 import javax.lang.model.SourceVersion;
@@ -96,15 +89,6 @@
 
     boolean useZipFileIndex;
 
-    private static int symbolFilePrefixLength = 0;
-    static {
-        try {
-            symbolFilePrefixLength = symbolFilePrefix.getBytes("UTF-8").length;
-        } catch (java.io.UnsupportedEncodingException uee) {
-            // Can't happen...UTF-8 is always supported.
-        }
-    }
-
     private static boolean CHECK_ZIP_TIMESTAMP = false;
     private static Map<File, Boolean> isDirectory = new ConcurrentHashMap<File, Boolean>();
 
@@ -202,7 +186,7 @@
     }
 
     public JavaFileObject getRegularFile(File file) {
-        return new RegularFileObject(file);
+        return new RegularFileObject(this, file);
     }
 
     public JavaFileObject getFileForOutput(String classname,
@@ -405,7 +389,7 @@
                 } else {
                     if (isValidFile(fname, fileKinds)) {
                         JavaFileObject fe =
-                        new RegularFileObject(fname, new File(d, fname));
+                            new RegularFileObject(this, fname, new File(d, fname));
                         l.append(fe);
                     }
                 }
@@ -469,106 +453,13 @@
         Set<String> getSubdirectories();
     }
 
-    public class ZipArchive implements Archive {
-        protected final Map<String,List<String>> map;
-        protected final ZipFile zdir;
-        public ZipArchive(ZipFile zdir) throws IOException {
-            this.zdir = zdir;
-            this.map = new HashMap<String,List<String>>();
-            for (Enumeration<? extends ZipEntry> e = zdir.entries(); e.hasMoreElements(); ) {
-                ZipEntry entry;
-                try {
-                    entry = e.nextElement();
-                } catch (InternalError ex) {
-                    IOException io = new IOException();
-                    io.initCause(ex); // convenience constructors added in Mustang :-(
-                    throw io;
-                }
-                addZipEntry(entry);
-            }
-        }
-
-        void addZipEntry(ZipEntry entry) {
-            String name = entry.getName();
-            int i = name.lastIndexOf('/');
-            String dirname = name.substring(0, i+1);
-            String basename = name.substring(i+1);
-            if (basename.length() == 0)
-                return;
-            List<String> list = map.get(dirname);
-            if (list == null)
-                list = List.nil();
-            list = list.prepend(basename);
-            map.put(dirname, list);
-        }
-
-        public boolean contains(String name) {
-            int i = name.lastIndexOf('/');
-            String dirname = name.substring(0, i+1);
-            String basename = name.substring(i+1);
-            if (basename.length() == 0)
-                return false;
-            List<String> list = map.get(dirname);
-            return (list != null && list.contains(basename));
-        }
-
-        public List<String> getFiles(String subdirectory) {
-            return map.get(subdirectory);
-        }
-
-        public JavaFileObject getFileObject(String subdirectory, String file) {
-            ZipEntry ze = zdir.getEntry(subdirectory + file);
-            return new ZipFileObject(file, zdir, ze);
-        }
-
-        public Set<String> getSubdirectories() {
-            return map.keySet();
-        }
-
-        public void close() throws IOException {
-            zdir.close();
-        }
-    }
-
-    public class SymbolArchive extends ZipArchive {
-        final File origFile;
-        public SymbolArchive(File orig, ZipFile zdir) throws IOException {
-            super(zdir);
-            this.origFile = orig;
-        }
-
-        @Override
-        void addZipEntry(ZipEntry entry) {
-            // called from super constructor, may not refer to origFile.
-            String name = entry.getName();
-            if (!name.startsWith(symbolFilePrefix))
-                return;
-            name = name.substring(symbolFilePrefix.length());
-            int i = name.lastIndexOf('/');
-            String dirname = name.substring(0, i+1);
-            String basename = name.substring(i+1);
-            if (basename.length() == 0)
-                return;
-            List<String> list = map.get(dirname);
-            if (list == null)
-                list = List.nil();
-            list = list.prepend(basename);
-            map.put(dirname, list);
-        }
-
-        @Override
-        public JavaFileObject getFileObject(String subdirectory, String file) {
-            return super.getFileObject(symbolFilePrefix + subdirectory, file);
-        }
-    }
-
     public class MissingArchive implements Archive {
         final File zipFileName;
         public MissingArchive(File name) {
             zipFileName = name;
         }
         public boolean contains(String name) {
-              return false;
+            return false;
         }
 
         public void close() {
@@ -647,25 +538,30 @@
 
                 if (origZipFileName == zipFileName) {
                     if (!useZipFileIndex) {
-                        archive = new ZipArchive(zdir);
+                        archive = new ZipArchive(this, zdir);
                     } else {
-                        archive = new ZipFileIndexArchive(this, ZipFileIndex.getZipFileIndex(zipFileName, 0,
+                        archive = new ZipFileIndexArchive(this, ZipFileIndex.getZipFileIndex(zipFileName, null,
                                 usePreindexedCache, preindexCacheLocation, options.get("writezipindexfiles") != null));
                     }
                 }
                 else {
                     if (!useZipFileIndex) {
-                        archive = new SymbolArchive(origZipFileName, zdir);
+                        archive = new SymbolArchive(this, origZipFileName, zdir, symbolFilePrefix);
                     }
                     else {
-                        archive = new ZipFileIndexArchive(this, ZipFileIndex.getZipFileIndex(zipFileName, symbolFilePrefixLength,
-                                usePreindexedCache, preindexCacheLocation, options.get("writezipindexfiles") != null));
+                        archive = new ZipFileIndexArchive(this,
+                                ZipFileIndex.getZipFileIndex(zipFileName,
+                                symbolFilePrefix,
+                                usePreindexedCache,
+                                preindexCacheLocation,
+                                options.get("writezipindexfiles") != null));
                     }
                 }
             } catch (FileNotFoundException ex) {
                 archive = new MissingArchive(zipFileName);
             } catch (IOException ex) {
-                log.error("error.reading.file", zipFileName, ex.getLocalizedMessage());
+                if (zipFileName.exists())
+                    log.error("error.reading.file", zipFileName, ex.getLocalizedMessage());
                 archive = new MissingArchive(zipFileName);
             }
 
@@ -694,7 +590,17 @@
         }
     }
 
-    private Map<JavaFileObject, SoftReference<CharBuffer>> contentCache = new HashMap<JavaFileObject, SoftReference<CharBuffer>>();
+    CharBuffer getCachedContent(JavaFileObject file) {
+        SoftReference<CharBuffer> r = contentCache.get(file);
+        return (r == null ? null : r.get());
+    }
+
+    void cache(JavaFileObject file, CharBuffer cb) {
+        contentCache.put(file, new SoftReference<CharBuffer>(cb));
+    }
+
+    private final Map<JavaFileObject, SoftReference<CharBuffer>> contentCache
+            = new HashMap<JavaFileObject, SoftReference<CharBuffer>>();
 
     private String defaultEncodingName;
     private String getDefaultEncodingName() {
@@ -724,7 +630,7 @@
     /**
      * Make a byte buffer from an input stream.
      */
-    private ByteBuffer makeByteBuffer(InputStream in)
+    ByteBuffer makeByteBuffer(InputStream in)
         throws IOException {
         int limit = in.available();
         if (mmappedIO && in instanceof FileInputStream) {
@@ -750,6 +656,10 @@
         return (ByteBuffer)result.flip();
     }
 
+    void recycleByteBuffer(ByteBuffer bb) {
+        byteBufferCache.put(bb);
+    }
+
     /**
      * A single-element cache of direct byte buffers.
      */
@@ -768,9 +678,10 @@
             cached = x;
         }
     }
+
     private final ByteBufferCache byteBufferCache;
 
-    private CharsetDecoder getDecoder(String encodingName, boolean ignoreEncodingErrors) {
+    CharsetDecoder getDecoder(String encodingName, boolean ignoreEncodingErrors) {
         Charset charset = (this.charset == null)
             ? Charset.forName(encodingName)
             : this.charset;
@@ -790,7 +701,7 @@
     /**
      * Decode a ByteBuffer into a CharBuffer.
      */
-    private CharBuffer decode(ByteBuffer inbuf, boolean ignoreEncodingErrors) {
+    CharBuffer decode(ByteBuffer inbuf, boolean ignoreEncodingErrors) {
         String encodingName = getEncodingName();
         CharsetDecoder decoder;
         try {
@@ -900,48 +811,14 @@
         // Need to match the path semantics of list(location, ...)
         Iterable<? extends File> path = getLocation(location);
         if (path == null) {
-            //System.err.println("Path for " + location + " is null");
             return null;
         }
-        //System.err.println("Path for " + location + " is " + path);
 
-        if (file instanceof RegularFileObject) {
-            RegularFileObject r = (RegularFileObject) file;
-            String rPath = r.getPath();
-            //System.err.println("RegularFileObject " + file + " " +r.getPath());
-            for (File dir: path) {
-                //System.err.println("dir: " + dir);
-                String dPath = dir.getPath();
-                if (!dPath.endsWith(File.separator))
-                    dPath += File.separator;
-                if (rPath.regionMatches(true, 0, dPath, 0, dPath.length())
-                    && new File(rPath.substring(0, dPath.length())).equals(new File(dPath))) {
-                    String relativeName = rPath.substring(dPath.length());
-                    return removeExtension(relativeName).replace(File.separatorChar, '.');
-                }
-            }
-        } else if (file instanceof ZipFileObject) {
-            ZipFileObject z = (ZipFileObject) file;
-            String entryName = z.getZipEntryName();
-            if (entryName.startsWith(symbolFilePrefix))
-                entryName = entryName.substring(symbolFilePrefix.length());
-            return removeExtension(entryName).replace('/', '.');
-        } else if (file instanceof ZipFileIndexFileObject) {
-            ZipFileIndexFileObject z = (ZipFileIndexFileObject) file;
-            String entryName = z.getZipEntryName();
-            if (entryName.startsWith(symbolFilePrefix))
-                entryName = entryName.substring(symbolFilePrefix.length());
-            return removeExtension(entryName).replace(File.separatorChar, '.');
+        if (file instanceof BaseFileObject) {
+            return ((BaseFileObject) file).inferBinaryName(path);
         } else
             throw new IllegalArgumentException(file.getClass().getName());
-        // System.err.println("inferBinaryName failed for " + file);
-        return null;
     }
-    // where
-        private static String removeExtension(String fileName) {
-            int lastDot = fileName.lastIndexOf(".");
-            return (lastDot == -1 ? fileName : fileName.substring(0, lastDot));
-        }
 
     public boolean isSameFile(FileObject a, FileObject b) {
         nullCheck(a);
@@ -1028,7 +905,7 @@
             if (dir.isDirectory()) {
                 File f = new File(dir, name.replace('/', File.separatorChar));
                 if (f.exists())
-                    return new RegularFileObject(f);
+                    return new RegularFileObject(this, f);
             } else {
                 Archive a = openArchive(dir);
                 if (a.contains(name)) {
@@ -1090,7 +967,7 @@
                 if (sibling != null && sibling instanceof RegularFileObject) {
                     siblingDir = ((RegularFileObject)sibling).f.getParentFile();
                 }
-                return new RegularFileObject(new File(siblingDir, baseName(fileName)));
+                return new RegularFileObject(this, new File(siblingDir, baseName(fileName)));
             }
         } else if (location == SOURCE_OUTPUT) {
             dir = (getSourceOutDir() != null ? getSourceOutDir() : getClassOutDir());
@@ -1104,7 +981,7 @@
         }
 
         File file = (dir == null ? new File(fileName) : new File(dir, fileName));
-        return new RegularFileObject(file);
+        return new RegularFileObject(this, file);
 
     }
 
@@ -1117,7 +994,7 @@
         else
             result = new ArrayList<RegularFileObject>();
         for (File f: files)
-            result.add(new RegularFileObject(nullCheck(f)));
+            result.add(new RegularFileObject(this, nullCheck(f)));
         return result;
     }
 
@@ -1267,452 +1144,4 @@
             t.getClass(); // null check
         return it;
     }
-
-    /**
-     * A subclass of JavaFileObject representing regular files.
-     */
-    private class RegularFileObject extends BaseFileObject {
-        /** Have the parent directories been created?
-         */
-        private boolean hasParents=false;
-
-        /** The file's name.
-         */
-        private String name;
-
-        /** The underlying file.
-         */
-        final File f;
-
-        public RegularFileObject(File f) {
-            this(f.getName(), f);
-        }
-
-        public RegularFileObject(String name, File f) {
-            if (f.isDirectory())
-                throw new IllegalArgumentException("directories not supported");
-            this.name = name;
-            this.f = f;
-        }
-
-        public InputStream openInputStream() throws IOException {
-            return new FileInputStream(f);
-        }
-
-        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
-            return JavacFileManager.this.getDecoder(getEncodingName(), ignoreEncodingErrors);
-        }
-
-        public OutputStream openOutputStream() throws IOException {
-            ensureParentDirectoriesExist();
-            return new FileOutputStream(f);
-        }
-
-        public Writer openWriter() throws IOException {
-            ensureParentDirectoriesExist();
-            return new OutputStreamWriter(new FileOutputStream(f), getEncodingName());
-        }
-
-        private void ensureParentDirectoriesExist() throws IOException {
-            if (!hasParents) {
-                File parent = f.getParentFile();
-                if (parent != null && !parent.exists()) {
-                    if (!parent.mkdirs()) {
-                        // if the mkdirs failed, it may be because another process concurrently
-                        // created the directory, so check if the directory got created
-                        // anyway before throwing an exception
-                        if (!parent.exists() || !parent.isDirectory())
-                            throw new IOException("could not create parent directories");
-                    }
-                }
-                hasParents = true;
-            }
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getName() {
-            return name;
-        }
-
-        public boolean isNameCompatible(String cn, JavaFileObject.Kind kind) {
-            cn.getClass(); // null check
-            if (kind == Kind.OTHER && getKind() != kind)
-                return false;
-            String n = cn + kind.extension;
-            if (name.equals(n))
-                return true;
-            if (name.equalsIgnoreCase(n)) {
-                try {
-                    // allow for Windows
-                    return (f.getCanonicalFile().getName().equals(n));
-                } catch (IOException e) {
-                }
-            }
-            return false;
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getPath() {
-            return f.getPath();
-        }
-
-        public long getLastModified() {
-            return f.lastModified();
-        }
-
-        public boolean delete() {
-            return f.delete();
-        }
-
-        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
-            SoftReference<CharBuffer> r = contentCache.get(this);
-            CharBuffer cb = (r == null ? null : r.get());
-            if (cb == null) {
-                InputStream in = new FileInputStream(f);
-                try {
-                    ByteBuffer bb = makeByteBuffer(in);
-                    JavaFileObject prev = log.useSource(this);
-                    try {
-                        cb = decode(bb, ignoreEncodingErrors);
-                    } finally {
-                        log.useSource(prev);
-                    }
-                    byteBufferCache.put(bb); // save for next time
-                    if (!ignoreEncodingErrors)
-                        contentCache.put(this, new SoftReference<CharBuffer>(cb));
-                } finally {
-                    in.close();
-                }
-            }
-            return cb;
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof RegularFileObject))
-                return false;
-            RegularFileObject o = (RegularFileObject) other;
-            try {
-                return f.equals(o.f)
-                    || f.getCanonicalFile().equals(o.f.getCanonicalFile());
-            } catch (IOException e) {
-                return false;
-            }
-        }
-
-        @Override
-        public int hashCode() {
-            return f.hashCode();
-        }
-
-        public URI toUri() {
-            try {
-                // Do no use File.toURI to avoid file system access
-                String path = f.getAbsolutePath().replace(File.separatorChar, '/');
-                return new URI("file://" + path).normalize();
-            } catch (URISyntaxException ex) {
-                return f.toURI();
-            }
-        }
-
-    }
-
-    /**
-     * A subclass of JavaFileObject representing zip entries.
-     */
-    public class ZipFileObject extends BaseFileObject {
-
-        /** The entry's name.
-         */
-        private String name;
-
-        /** The zipfile containing the entry.
-         */
-        ZipFile zdir;
-
-        /** The underlying zip entry object.
-         */
-        ZipEntry entry;
-
-        public ZipFileObject(String name, ZipFile zdir, ZipEntry entry) {
-            this.name = name;
-            this.zdir = zdir;
-            this.entry = entry;
-        }
-
-        public InputStream openInputStream() throws IOException {
-            return zdir.getInputStream(entry);
-        }
-
-        public OutputStream openOutputStream() throws IOException {
-            throw new UnsupportedOperationException();
-        }
-
-        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
-            return JavacFileManager.this.getDecoder(getEncodingName(), ignoreEncodingErrors);
-        }
-
-        public Writer openWriter() throws IOException {
-            throw new UnsupportedOperationException();
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getName() {
-            return name;
-        }
-
-        public boolean isNameCompatible(String cn, JavaFileObject.Kind k) {
-            cn.getClass(); // null check
-            if (k == Kind.OTHER && getKind() != k)
-                return false;
-            return name.equals(cn + k.extension);
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getPath() {
-            return zdir.getName() + "(" + entry + ")";
-        }
-
-        public long getLastModified() {
-            return entry.getTime();
-        }
-
-        public boolean delete() {
-            throw new UnsupportedOperationException();
-        }
-
-        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
-            SoftReference<CharBuffer> r = contentCache.get(this);
-            CharBuffer cb = (r == null ? null : r.get());
-            if (cb == null) {
-                InputStream in = zdir.getInputStream(entry);
-                try {
-                    ByteBuffer bb = makeByteBuffer(in);
-                    JavaFileObject prev = log.useSource(this);
-                    try {
-                        cb = decode(bb, ignoreEncodingErrors);
-                    } finally {
-                        log.useSource(prev);
-                    }
-                    byteBufferCache.put(bb); // save for next time
-                    if (!ignoreEncodingErrors)
-                        contentCache.put(this, new SoftReference<CharBuffer>(cb));
-                } finally {
-                    in.close();
-                }
-            }
-            return cb;
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof ZipFileObject))
-                return false;
-            ZipFileObject o = (ZipFileObject) other;
-            return zdir.equals(o.zdir) || name.equals(o.name);
-        }
-
-        @Override
-        public int hashCode() {
-            return zdir.hashCode() + name.hashCode();
-        }
-
-        public String getZipName() {
-            return zdir.getName();
-        }
-
-        public String getZipEntryName() {
-            return entry.getName();
-        }
-
-        public URI toUri() {
-            String zipName = new File(getZipName()).toURI().normalize().getPath();
-            String entryName = getZipEntryName();
-            return URI.create("jar:" + zipName + "!" + entryName);
-        }
-
-    }
-
-    /**
-     * A subclass of JavaFileObject representing zip entries using the com.sun.tools.javac.zip.ZipFileIndex implementation.
-     */
-    public class ZipFileIndexFileObject extends BaseFileObject {
-
-            /** The entry's name.
-         */
-        private String name;
-
-        /** The zipfile containing the entry.
-         */
-        ZipFileIndex zfIndex;
-
-        /** The underlying zip entry object.
-         */
-        ZipFileIndexEntry entry;
-
-        /** The InputStream for this zip entry (file.)
-         */
-        InputStream inputStream = null;
-
-        /** The name of the zip file where this entry resides.
-         */
-        String zipName;
-
-        JavacFileManager defFileManager = null;
-
-        public ZipFileIndexFileObject(JavacFileManager fileManager, ZipFileIndex zfIndex, ZipFileIndexEntry entry, String zipFileName) {
-            super();
-            this.name = entry.getFileName();
-            this.zfIndex = zfIndex;
-            this.entry = entry;
-            this.zipName = zipFileName;
-            defFileManager = fileManager;
-        }
-
-        public InputStream openInputStream() throws IOException {
-
-            if (inputStream == null) {
-                inputStream = new ByteArrayInputStream(read());
-            }
-            return inputStream;
-        }
-
-        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
-            return JavacFileManager.this.getDecoder(getEncodingName(), ignoreEncodingErrors);
-        }
-
-        public OutputStream openOutputStream() throws IOException {
-            throw new UnsupportedOperationException();
-        }
-
-        public Writer openWriter() throws IOException {
-            throw new UnsupportedOperationException();
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getName() {
-            return name;
-        }
-
-        public boolean isNameCompatible(String cn, JavaFileObject.Kind k) {
-            cn.getClass(); // null check
-            if (k == Kind.OTHER && getKind() != k)
-                return false;
-            return name.equals(cn + k.extension);
-        }
-
-        /** @deprecated see bug 6410637 */
-        @Deprecated
-        public String getPath() {
-            return zipName + "(" + entry.getName() + ")";
-        }
-
-        public long getLastModified() {
-            return entry.getLastModified();
-        }
-
-        public boolean delete() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof ZipFileIndexFileObject))
-                return false;
-            ZipFileIndexFileObject o = (ZipFileIndexFileObject) other;
-            return entry.equals(o.entry);
-        }
-
-        @Override
-        public int hashCode() {
-            return zipName.hashCode() + (name.hashCode() << 10);
-        }
-
-        public String getZipName() {
-            return zipName;
-        }
-
-        public String getZipEntryName() {
-            return entry.getName();
-        }
-
-        public URI toUri() {
-            String zipName = new File(getZipName()).toURI().normalize().getPath();
-            String entryName = getZipEntryName();
-            if (File.separatorChar != '/') {
-                entryName = entryName.replace(File.separatorChar, '/');
-            }
-            return URI.create("jar:" + zipName + "!" + entryName);
-        }
-
-        private byte[] read() throws IOException {
-            if (entry == null) {
-                entry = zfIndex.getZipIndexEntry(name);
-                if (entry == null)
-                  throw new FileNotFoundException();
-            }
-            return zfIndex.read(entry);
-        }
-
-        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
-            SoftReference<CharBuffer> r = defFileManager.contentCache.get(this);
-            CharBuffer cb = (r == null ? null : r.get());
-            if (cb == null) {
-                InputStream in = new ByteArrayInputStream(zfIndex.read(entry));
-                try {
-                    ByteBuffer bb = makeByteBuffer(in);
-                    JavaFileObject prev = log.useSource(this);
-                    try {
-                        cb = decode(bb, ignoreEncodingErrors);
-                    } finally {
-                        log.useSource(prev);
-                    }
-                    byteBufferCache.put(bb); // save for next time
-                    if (!ignoreEncodingErrors)
-                        defFileManager.contentCache.put(this, new SoftReference<CharBuffer>(cb));
-                } finally {
-                    in.close();
-                }
-            }
-            return cb;
-        }
-    }
-
-    public class ZipFileIndexArchive implements Archive {
-        private final ZipFileIndex zfIndex;
-        private JavacFileManager fileManager;
-
-        public ZipFileIndexArchive(JavacFileManager fileManager, ZipFileIndex zdir) throws IOException {
-            this.fileManager = fileManager;
-            this.zfIndex = zdir;
-        }
-
-        public boolean contains(String name) {
-            return zfIndex.contains(name);
-        }
-
-        public com.sun.tools.javac.util.List<String> getFiles(String subdirectory) {
-              return zfIndex.getFiles(((subdirectory.endsWith("/") || subdirectory.endsWith("\\"))? subdirectory.substring(0, subdirectory.length() - 1) : subdirectory));
-        }
-
-        public JavaFileObject getFileObject(String subdirectory, String file) {
-            String fullZipFileName = subdirectory + file;
-            ZipFileIndexEntry entry = zfIndex.getZipIndexEntry(fullZipFileName);
-            JavaFileObject ret = new ZipFileIndexFileObject(fileManager, zfIndex, entry, zfIndex.getZipFile().getPath());
-            return ret;
-        }
-
-        public Set<String> getSubdirectories() {
-            return zfIndex.getAllDirectories();
-        }
-
-        public void close() throws IOException {
-            zfIndex.close();
-        }
-    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,204 @@
+/*
+ * 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
+ * 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 com.sun.tools.javac.file;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharsetDecoder;
+import javax.tools.JavaFileObject;
+
+/**
+ * A subclass of JavaFileObject representing regular files.
+ */
+class RegularFileObject extends BaseFileObject {
+
+    /** Have the parent directories been created?
+     */
+    private boolean hasParents = false;
+    private String name;
+    final File f;
+
+    public RegularFileObject(JavacFileManager fileManager, File f) {
+        this(fileManager, f.getName(), f);
+    }
+
+    public RegularFileObject(JavacFileManager fileManager, String name, File f) {
+        super(fileManager);
+        if (f.isDirectory()) {
+            throw new IllegalArgumentException("directories not supported");
+        }
+        this.name = name;
+        this.f = f;
+    }
+
+    public InputStream openInputStream() throws IOException {
+        return new FileInputStream(f);
+    }
+
+    protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
+        return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors);
+    }
+
+    public OutputStream openOutputStream() throws IOException {
+        ensureParentDirectoriesExist();
+        return new FileOutputStream(f);
+    }
+
+    public Writer openWriter() throws IOException {
+        ensureParentDirectoriesExist();
+        return new OutputStreamWriter(new FileOutputStream(f), fileManager.getEncodingName());
+    }
+
+    @Override
+    protected String inferBinaryName(Iterable<? extends File> path) {
+        String fPath = f.getPath();
+        //System.err.println("RegularFileObject " + file + " " +r.getPath());
+        for (File dir: path) {
+            //System.err.println("dir: " + dir);
+            String dPath = dir.getPath();
+            if (!dPath.endsWith(File.separator))
+                dPath += File.separator;
+            if (fPath.regionMatches(true, 0, dPath, 0, dPath.length())
+                && new File(fPath.substring(0, dPath.length())).equals(new File(dPath))) {
+                String relativeName = fPath.substring(dPath.length());
+                return removeExtension(relativeName).replace(File.separatorChar, '.');
+            }
+        }
+        return null;
+    }
+
+    private void ensureParentDirectoriesExist() throws IOException {
+        if (!hasParents) {
+            File parent = f.getParentFile();
+            if (parent != null && !parent.exists()) {
+                if (!parent.mkdirs()) {
+                    if (!parent.exists() || !parent.isDirectory()) {
+                        throw new IOException("could not create parent directories");
+                    }
+                }
+            }
+            hasParents = true;
+        }
+    }
+
+    @Deprecated
+    public String getName() {
+        return name;
+    }
+
+    public boolean isNameCompatible(String cn, JavaFileObject.Kind kind) {
+        cn.getClass();
+        // null check
+        if (kind == Kind.OTHER && getKind() != kind) {
+            return false;
+        }
+        String n = cn + kind.extension;
+        if (name.equals(n)) {
+            return true;
+        }
+        if (name.equalsIgnoreCase(n)) {
+            try {
+                // allow for Windows
+                return f.getCanonicalFile().getName().equals(n);
+            } catch (IOException e) {
+            }
+        }
+        return false;
+    }
+
+    @Deprecated
+    public String getPath() {
+        return f.getPath();
+    }
+
+    public long getLastModified() {
+        return f.lastModified();
+    }
+
+    public boolean delete() {
+        return f.delete();
+    }
+
+    public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
+        CharBuffer cb = fileManager.getCachedContent(this);
+        if (cb == null) {
+            InputStream in = new FileInputStream(f);
+            try {
+                ByteBuffer bb = fileManager.makeByteBuffer(in);
+                JavaFileObject prev = fileManager.log.useSource(this);
+                try {
+                    cb = fileManager.decode(bb, ignoreEncodingErrors);
+                } finally {
+                    fileManager.log.useSource(prev);
+                }
+                fileManager.recycleByteBuffer(bb);
+                if (!ignoreEncodingErrors) {
+                    fileManager.cache(this, cb);
+                }
+            } finally {
+                in.close();
+            }
+        }
+        return cb;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof RegularFileObject)) {
+            return false;
+        }
+        RegularFileObject o = (RegularFileObject) other;
+        try {
+            return f.equals(o.f) || f.getCanonicalFile().equals(o.f.getCanonicalFile());
+        } catch (IOException e) {
+            return false;
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return f.hashCode();
+    }
+
+    public URI toUri() {
+        try {
+            String path = f.getAbsolutePath().replace(File.separatorChar, '/');
+            return new URI("file://" + path).normalize();
+        } catch (URISyntaxException ex) {
+            return f.toURI();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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
+ * 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 com.sun.tools.javac.file;
+
+import com.sun.tools.javac.util.List;
+import java.io.File;
+import java.io.IOException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import javax.tools.JavaFileObject;
+
+public class SymbolArchive extends ZipArchive {
+
+    final File origFile;
+    final String prefix;
+
+    public SymbolArchive(JavacFileManager fileManager, File orig, ZipFile zdir, String prefix) throws IOException {
+        super(fileManager, zdir);
+        this.origFile = orig;
+        this.prefix = prefix;
+    }
+
+    @Override
+    void addZipEntry(ZipEntry entry) {
+        String name = entry.getName();
+        if (!name.startsWith(prefix)) {
+            return;
+        }
+        name = name.substring(prefix.length());
+        int i = name.lastIndexOf('/');
+        String dirname = name.substring(0, i + 1);
+        String basename = name.substring(i + 1);
+        if (basename.length() == 0) {
+            return;
+        }
+        List<String> list = map.get(dirname);
+        if (list == null) {
+            list = List.nil();
+        }
+        list = list.prepend(basename);
+        map.put(dirname, list);
+    }
+
+    @Override
+    public JavaFileObject getFileObject(String subdirectory, String file) {
+        return super.getFileObject(prefix + subdirectory, file);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipArchive.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,234 @@
+/*
+ * 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
+ * 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 com.sun.tools.javac.file;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import javax.tools.JavaFileObject;
+
+import com.sun.tools.javac.file.JavacFileManager.Archive;
+import com.sun.tools.javac.util.List;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharsetDecoder;
+
+public class ZipArchive implements Archive {
+
+    public ZipArchive(JavacFileManager fm, ZipFile zdir) throws IOException {
+        this.fileManager = fm;
+        this.zdir = zdir;
+        this.map = new HashMap<String,List<String>>();
+        for (Enumeration<? extends ZipEntry> e = zdir.entries(); e.hasMoreElements(); ) {
+            ZipEntry entry;
+            try {
+                entry = e.nextElement();
+            } catch (InternalError ex) {
+                IOException io = new IOException();
+                io.initCause(ex); // convenience constructors added in Mustang :-(
+                throw io;
+            }
+            addZipEntry(entry);
+        }
+    }
+
+    void addZipEntry(ZipEntry entry) {
+        String name = entry.getName();
+        int i = name.lastIndexOf('/');
+        String dirname = name.substring(0, i+1);
+        String basename = name.substring(i+1);
+        if (basename.length() == 0)
+            return;
+        List<String> list = map.get(dirname);
+        if (list == null)
+            list = List.nil();
+        list = list.prepend(basename);
+        map.put(dirname, list);
+    }
+
+    public boolean contains(String name) {
+        int i = name.lastIndexOf('/');
+        String dirname = name.substring(0, i+1);
+        String basename = name.substring(i+1);
+        if (basename.length() == 0)
+            return false;
+        List<String> list = map.get(dirname);
+        return (list != null && list.contains(basename));
+    }
+
+    public List<String> getFiles(String subdirectory) {
+        return map.get(subdirectory);
+    }
+
+    public JavaFileObject getFileObject(String subdirectory, String file) {
+        ZipEntry ze = zdir.getEntry(subdirectory + file);
+        return new ZipFileObject(this, file, ze);
+    }
+
+    public Set<String> getSubdirectories() {
+        return map.keySet();
+    }
+
+    public void close() throws IOException {
+        zdir.close();
+    }
+
+    protected JavacFileManager fileManager;
+    protected final Map<String,List<String>> map;
+    protected final ZipFile zdir;
+
+    /**
+     * A subclass of JavaFileObject representing zip entries.
+     */
+    public static class ZipFileObject extends BaseFileObject {
+
+        private String name;
+        ZipArchive zarch;
+        ZipEntry entry;
+
+        public ZipFileObject(ZipArchive zarch, String name, ZipEntry entry) {
+            super(zarch.fileManager);
+            this.zarch = zarch;
+            this.name = name;
+            this.entry = entry;
+        }
+
+        public InputStream openInputStream() throws IOException {
+            return zarch.zdir.getInputStream(entry);
+        }
+
+        public OutputStream openOutputStream() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
+            return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors);
+        }
+
+        public Writer openWriter() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        @Deprecated
+        public String getName() {
+            return name;
+        }
+
+        public boolean isNameCompatible(String cn, JavaFileObject.Kind k) {
+            cn.getClass();
+            // null check
+            if (k == Kind.OTHER && getKind() != k) {
+                return false;
+            }
+            return name.equals(cn + k.extension);
+        }
+
+        @Deprecated
+        public String getPath() {
+            return zarch.zdir.getName() + "(" + entry + ")";
+        }
+
+        public long getLastModified() {
+            return entry.getTime();
+        }
+
+        public boolean delete() {
+            throw new UnsupportedOperationException();
+        }
+
+        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
+            CharBuffer cb = fileManager.getCachedContent(this);
+            if (cb == null) {
+                InputStream in = zarch.zdir.getInputStream(entry);
+                try {
+                    ByteBuffer bb = fileManager.makeByteBuffer(in);
+                    JavaFileObject prev = fileManager.log.useSource(this);
+                    try {
+                        cb = fileManager.decode(bb, ignoreEncodingErrors);
+                    } finally {
+                        fileManager.log.useSource(prev);
+                    }
+                    fileManager.recycleByteBuffer(bb);
+                    if (!ignoreEncodingErrors) {
+                        fileManager.cache(this, cb);
+                    }
+                } finally {
+                    in.close();
+                }
+            }
+            return cb;
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (!(other instanceof ZipFileObject)) {
+                return false;
+            }
+            ZipFileObject o = (ZipFileObject) other;
+            return zarch.zdir.equals(o.zarch.zdir) || name.equals(o.name);
+        }
+
+        @Override
+        public int hashCode() {
+            return zarch.zdir.hashCode() + name.hashCode();
+        }
+
+        public String getZipName() {
+            return zarch.zdir.getName();
+        }
+
+        public String getZipEntryName() {
+            return entry.getName();
+        }
+
+        public URI toUri() {
+            String zipName = new File(getZipName()).toURI().normalize().getPath();
+            String entryName = getZipEntryName();
+            return URI.create("jar:" + zipName + "!" + entryName);
+        }
+
+        @Override
+        protected String inferBinaryName(Iterable<? extends File> path) {
+            String entryName = getZipEntryName();
+            if (zarch instanceof SymbolArchive) {
+                String prefix = ((SymbolArchive) zarch).prefix;
+                if (entryName.startsWith(prefix))
+                    entryName = entryName.substring(prefix.length());
+            }
+            return removeExtension(entryName).replace('/', '.');
+        }
+    }
+
+}
--- a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java	Wed Jul 05 16:39:00 2017 +0200
@@ -81,11 +81,12 @@
     private File zipFile;
     private long zipFileLastModified = NOT_MODIFIED;
     private RandomAccessFile zipRandomFile;
-    private ZipFileIndexEntry[] entries;
+    private Entry[] entries;
 
     private boolean readFromIndex = false;
     private File zipIndexFile = null;
     private boolean triedToReadIndex = false;
+    final String symbolFilePrefix;
     private int symbolFilePrefixLength = 0;
     private boolean hasPopulatedData = false;
     private long lastReferenceTimeStamp = NOT_MODIFIED;
@@ -141,14 +142,14 @@
         }
     }
 
-    public static ZipFileIndex getZipFileIndex(File zipFile, int symbolFilePrefixLen, boolean useCache, String cacheLocation, boolean writeIndex) throws IOException {
+    public static ZipFileIndex getZipFileIndex(File zipFile, String symbolFilePrefix, boolean useCache, String cacheLocation, boolean writeIndex) throws IOException {
         ZipFileIndex zi = null;
         lock.lock();
         try {
             zi = getExistingZipIndex(zipFile);
 
             if (zi == null || (zi != null && zipFile.lastModified() != zi.zipFileLastModified)) {
-                zi = new ZipFileIndex(zipFile, symbolFilePrefixLen, writeIndex,
+                zi = new ZipFileIndex(zipFile, symbolFilePrefix, writeIndex,
                         useCache, cacheLocation);
                 zipFileIndexCache.put(zipFile, zi);
             }
@@ -229,10 +230,12 @@
         }
     }
 
-    private ZipFileIndex(File zipFile, int symbolFilePrefixLen, boolean writeIndex,
+    private ZipFileIndex(File zipFile, String symbolFilePrefix, boolean writeIndex,
             boolean useCache, String cacheLocation) throws IOException {
         this.zipFile = zipFile;
-        this.symbolFilePrefixLength = symbolFilePrefixLen;
+        this.symbolFilePrefix = symbolFilePrefix;
+        this.symbolFilePrefixLength = (symbolFilePrefix == null ? 0 :
+            symbolFilePrefix.getBytes("UTF-8").length);
         this.writeIndex = writeIndex;
         this.usePreindexedCache = useCache;
         this.preindexedCacheLocation = cacheLocation;
@@ -312,7 +315,7 @@
 
     private void cleanupState() {
         // Make sure there is a valid but empty index if the file doesn't exist
-        entries = ZipFileIndexEntry.EMPTY_ARRAY;
+        entries = Entry.EMPTY_ARRAY;
         directories = Collections.<String, DirectoryEntry>emptyMap();
         zipFileLastModified = NOT_MODIFIED;
         allDirs = Collections.<String>emptySet();
@@ -342,7 +345,7 @@
     /**
      * Returns the ZipFileIndexEntry for an absolute path, if there is one.
      */
-    public ZipFileIndexEntry getZipIndexEntry(String path) {
+    Entry getZipIndexEntry(String path) {
         if (File.separatorChar != '/') {
             path = path.replace('/', File.separatorChar);
         }
@@ -493,7 +496,7 @@
     public long getLastModified(String path) throws IOException {
         lock.lock();
         try {
-            ZipFileIndexEntry entry = getZipIndexEntry(path);
+            Entry entry = getZipIndexEntry(path);
             if (entry == null)
                 throw new FileNotFoundException();
             return entry.getLastModified();
@@ -506,7 +509,7 @@
     public int length(String path) throws IOException {
         lock.lock();
         try {
-            ZipFileIndexEntry entry = getZipIndexEntry(path);
+            Entry entry = getZipIndexEntry(path);
             if (entry == null)
                 throw new FileNotFoundException();
 
@@ -530,7 +533,7 @@
     public byte[] read(String path) throws IOException {
         lock.lock();
         try {
-            ZipFileIndexEntry entry = getZipIndexEntry(path);
+            Entry entry = getZipIndexEntry(path);
             if (entry == null)
                 throw new FileNotFoundException(MessageFormat.format("Path not found in ZIP: {0}", path));
             return read(entry);
@@ -540,7 +543,7 @@
         }
     }
 
-    public byte[] read(ZipFileIndexEntry entry) throws IOException {
+    byte[] read(Entry entry) throws IOException {
         lock.lock();
         try {
             openFile();
@@ -556,7 +559,7 @@
     public int read(String path, byte[] buffer) throws IOException {
         lock.lock();
         try {
-            ZipFileIndexEntry entry = getZipIndexEntry(path);
+            Entry entry = getZipIndexEntry(path);
             if (entry == null)
                 throw new FileNotFoundException();
             return read(entry, buffer);
@@ -566,7 +569,7 @@
         }
     }
 
-    public int read(ZipFileIndexEntry entry, byte[] buffer)
+    int read(Entry entry, byte[] buffer)
             throws IOException {
         lock.lock();
         try {
@@ -578,7 +581,7 @@
         }
     }
 
-    private byte[] readBytes(ZipFileIndexEntry entry) throws IOException {
+    private byte[] readBytes(Entry entry) throws IOException {
         byte[] header = getHeader(entry);
         int csize = entry.compressedSize;
         byte[] cbuf = new byte[csize];
@@ -600,7 +603,7 @@
     /**
      *
      */
-    private int readBytes(ZipFileIndexEntry entry, byte[] buffer) throws IOException {
+    private int readBytes(Entry entry, byte[] buffer) throws IOException {
         byte[] header = getHeader(entry);
 
         // entry is not compressed?
@@ -633,7 +636,7 @@
     // Zip utilities
     //----------------------------------------------------------------------------
 
-    private byte[] getHeader(ZipFileIndexEntry entry) throws IOException {
+    private byte[] getHeader(Entry entry) throws IOException {
         zipRandomFile.seek(entry.offset);
         byte[] header = new byte[30];
         zipRandomFile.readFully(header);
@@ -746,11 +749,11 @@
         private void buildIndex() throws IOException {
             int entryCount = get2ByteLittleEndian(zipDir, 0);
 
-            entries = new ZipFileIndexEntry[entryCount];
+            entries = new Entry[entryCount];
             // Add each of the files
             if (entryCount > 0) {
                 directories = new HashMap<String, DirectoryEntry>();
-                ArrayList<ZipFileIndexEntry> entryList = new ArrayList<ZipFileIndexEntry>();
+                ArrayList<Entry> entryList = new ArrayList<Entry>();
                 int pos = 2;
                 for (int i = 0; i < entryCount; i++) {
                     pos = readEntry(pos, entryList, directories);
@@ -759,19 +762,19 @@
                 // Add the accumulated dirs into the same list
                 Iterator i = directories.keySet().iterator();
                 while (i.hasNext()) {
-                    ZipFileIndexEntry zipFileIndexEntry = new ZipFileIndexEntry( (String) i.next());
+                    Entry zipFileIndexEntry = new Entry( (String) i.next());
                     zipFileIndexEntry.isDir = true;
                     entryList.add(zipFileIndexEntry);
                 }
 
-                entries = entryList.toArray(new ZipFileIndexEntry[entryList.size()]);
+                entries = entryList.toArray(new Entry[entryList.size()]);
                 Arrays.sort(entries);
             } else {
                 cleanupState();
             }
         }
 
-        private int readEntry(int pos, List<ZipFileIndexEntry> entryList,
+        private int readEntry(int pos, List<Entry> entryList,
                 Map<String, DirectoryEntry> directories) throws IOException {
             if (get4ByteLittleEndian(zipDir, pos) != 0x02014b50) {
                 throw new ZipException("cannot read zip file entry");
@@ -838,7 +841,7 @@
 
             // For each dir create also a file
             if (fileStart != fileEnd) {
-                ZipFileIndexEntry entry = new ZipFileIndexEntry(directory,
+                Entry entry = new Entry(directory,
                         new String(zipDir, fileStart, fileEnd - fileStart, "UTF-8"));
 
                 entry.setNativeTime(get4ByteLittleEndian(zipDir, pos + 12));
@@ -873,6 +876,7 @@
     /** ------------------------------------------------------------------------
      *  DirectoryEntry class
      * -------------------------------------------------------------------------*/
+
     static class DirectoryEntry {
         private boolean filesInited;
         private boolean directoriesInited;
@@ -885,9 +889,9 @@
 
         private com.sun.tools.javac.util.List<String> zipFileEntriesFiles = com.sun.tools.javac.util.List.<String>nil();
         private com.sun.tools.javac.util.List<String> zipFileEntriesDirectories = com.sun.tools.javac.util.List.<String>nil();
-        private com.sun.tools.javac.util.List<ZipFileIndexEntry>  zipFileEntries = com.sun.tools.javac.util.List.<ZipFileIndexEntry>nil();
+        private com.sun.tools.javac.util.List<Entry>  zipFileEntries = com.sun.tools.javac.util.List.<Entry>nil();
 
-        private List<ZipFileIndexEntry> entries = new ArrayList<ZipFileIndexEntry>();
+        private List<Entry> entries = new ArrayList<Entry>();
 
         private ZipFileIndex zipFileIndex;
 
@@ -916,7 +920,7 @@
 
             initEntries();
 
-            for (ZipFileIndexEntry e : entries) {
+            for (Entry e : entries) {
                 if (!e.isDir) {
                     zipFileEntriesFiles = zipFileEntriesFiles.append(e.name);
                 }
@@ -932,7 +936,7 @@
 
             initEntries();
 
-            for (ZipFileIndexEntry e : entries) {
+            for (Entry e : entries) {
                 if (e.isDir) {
                     zipFileEntriesDirectories = zipFileEntriesDirectories.append(e.name);
                 }
@@ -943,7 +947,7 @@
             return zipFileEntriesDirectories;
         }
 
-        private com.sun.tools.javac.util.List<ZipFileIndexEntry> getEntries() {
+        private com.sun.tools.javac.util.List<Entry> getEntries() {
             if (zipFileEntriesInited) {
                 return zipFileEntries;
             }
@@ -951,7 +955,7 @@
             initEntries();
 
             zipFileEntries = com.sun.tools.javac.util.List.nil();
-            for (ZipFileIndexEntry zfie : entries) {
+            for (Entry zfie : entries) {
                 zipFileEntries = zipFileEntries.append(zfie);
             }
 
@@ -960,9 +964,9 @@
             return zipFileEntries;
         }
 
-        private ZipFileIndexEntry getEntry(String rootName) {
+        private Entry getEntry(String rootName) {
             initEntries();
-            int index = Collections.binarySearch(entries, new ZipFileIndexEntry(dirName, rootName));
+            int index = Collections.binarySearch(entries, new Entry(dirName, rootName));
             if (index < 0) {
                 return null;
             }
@@ -977,9 +981,9 @@
 
             if (!zipFileIndex.readFromIndex) {
                 int from = -Arrays.binarySearch(zipFileIndex.entries,
-                        new ZipFileIndexEntry(dirName, ZipFileIndex.MIN_CHAR)) - 1;
+                        new Entry(dirName, ZipFileIndex.MIN_CHAR)) - 1;
                 int to = -Arrays.binarySearch(zipFileIndex.entries,
-                        new ZipFileIndexEntry(dirName, MAX_CHAR)) - 1;
+                        new Entry(dirName, MAX_CHAR)) - 1;
 
                 boolean emptyList = false;
 
@@ -1016,7 +1020,7 @@
                             // Read java time stamp of the file in the real Jar/Zip file
                             long eJavaTimestamp = raf.readLong();
 
-                            ZipFileIndexEntry rfie = new ZipFileIndexEntry(dirName, eName);
+                            Entry rfie = new Entry(dirName, eName);
                             rfie.isDir = eIsDir;
                             rfie.offset = eOffset;
                             rfie.size = eSize;
@@ -1041,7 +1045,7 @@
             entriesInited = true;
         }
 
-        List<ZipFileIndexEntry> getEntriesAsCollection() {
+        List<Entry> getEntriesAsCollection() {
             initEntries();
 
             return entries;
@@ -1173,8 +1177,8 @@
                 raf.seek(currFP);
 
                 // Now write each of the files in the DirectoryEntry
-                List<ZipFileIndexEntry> entries = de.getEntriesAsCollection();
-                for (ZipFileIndexEntry zfie : entries) {
+                List<Entry> entries = de.getEntriesAsCollection();
+                for (Entry zfie : entries) {
                     // Write the name bytes
                     byte [] zfieNameBytes = zfie.name.getBytes("UTF-8");
                     int zfieNameBytesLen = zfieNameBytes.length;
@@ -1245,4 +1249,94 @@
     public File getZipFile() {
         return zipFile;
     }
+
+
+    static class Entry implements Comparable<Entry> {
+        public static final Entry[] EMPTY_ARRAY = {};
+
+        // Directory related
+        String dir;
+        boolean isDir;
+
+        // File related
+        String name;
+
+        int offset;
+        int size;
+        int compressedSize;
+        long javatime;
+
+        private int nativetime;
+
+        public Entry(String path) {
+            int separator = path.lastIndexOf(File.separatorChar);
+            if (separator == -1) {
+                dir = "".intern();
+                name = path;
+            } else {
+                dir = path.substring(0, separator).intern();
+                name = path.substring(separator + 1);
+            }
+        }
+
+        public Entry(String directory, String name) {
+            this.dir = directory.intern();
+            this.name = name;
+        }
+
+        public String getName() {
+            if (dir == null || dir.length() == 0) {
+                return name;
+            }
+
+            StringBuilder sb = new StringBuilder();
+            sb.append(dir);
+            sb.append(File.separatorChar);
+            sb.append(name);
+            return sb.toString();
+        }
+
+        public String getFileName() {
+            return name;
+        }
+
+        public long getLastModified() {
+            if (javatime == 0) {
+                    javatime = dosToJavaTime(nativetime);
+            }
+            return javatime;
+        }
+
+        // From java.util.zip
+        private static long dosToJavaTime(int nativetime) {
+            // Bootstrap build problems prevent me from using the code directly
+            // Convert the raw/native time to a long for now
+            return (long)nativetime;
+        }
+
+        void setNativeTime(int natTime) {
+            nativetime = natTime;
+        }
+
+        public boolean isDirectory() {
+            return isDir;
+        }
+
+        public int compareTo(Entry other) {
+            String otherD = other.dir;
+            if (dir != otherD) {
+                int c = dir.compareTo(otherD);
+                if (c != 0)
+                    return c;
+            }
+            return name.compareTo(other.name);
+        }
+
+
+        public String toString() {
+            return isDir ? ("Dir:" + dir + " : " + name) :
+                (dir + ":" + name);
+        }
+    }
+
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,233 @@
+/*
+ * 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
+ * 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 com.sun.tools.javac.file;
+
+import java.io.IOException;
+import java.util.Set;
+import javax.tools.JavaFileObject;
+
+import com.sun.tools.javac.file.JavacFileManager.Archive;
+import com.sun.tools.javac.util.List;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.net.URI;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharsetDecoder;
+
+public class ZipFileIndexArchive implements Archive {
+
+    private final ZipFileIndex zfIndex;
+    private JavacFileManager fileManager;
+
+    public ZipFileIndexArchive(JavacFileManager fileManager, ZipFileIndex zdir) throws IOException {
+        super();
+        this.fileManager = fileManager;
+        this.zfIndex = zdir;
+    }
+
+    public boolean contains(String name) {
+        return zfIndex.contains(name);
+    }
+
+    public List<String> getFiles(String subdirectory) {
+        return zfIndex.getFiles((subdirectory.endsWith("/") || subdirectory.endsWith("\\")) ? subdirectory.substring(0, subdirectory.length() - 1) : subdirectory);
+    }
+
+    public JavaFileObject getFileObject(String subdirectory, String file) {
+        String fullZipFileName = subdirectory + file;
+        ZipFileIndex.Entry entry = zfIndex.getZipIndexEntry(fullZipFileName);
+        JavaFileObject ret = new ZipFileIndexFileObject(fileManager, zfIndex, entry, zfIndex.getZipFile().getPath());
+        return ret;
+    }
+
+    public Set<String> getSubdirectories() {
+        return zfIndex.getAllDirectories();
+    }
+
+    public void close() throws IOException {
+        zfIndex.close();
+    }
+
+    /**
+     * A subclass of JavaFileObject representing zip entries using the com.sun.tools.javac.file.ZipFileIndex implementation.
+     */
+    public static class ZipFileIndexFileObject extends BaseFileObject {
+
+        /** The entry's name.
+         */
+        private String name;
+
+        /** The zipfile containing the entry.
+         */
+        ZipFileIndex zfIndex;
+
+        /** The underlying zip entry object.
+         */
+        ZipFileIndex.Entry entry;
+
+        /** The InputStream for this zip entry (file.)
+         */
+        InputStream inputStream = null;
+
+        /** The name of the zip file where this entry resides.
+         */
+        String zipName;
+
+
+        ZipFileIndexFileObject(JavacFileManager fileManager, ZipFileIndex zfIndex, ZipFileIndex.Entry entry, String zipFileName) {
+            super(fileManager);
+            this.name = entry.getFileName();
+            this.zfIndex = zfIndex;
+            this.entry = entry;
+            this.zipName = zipFileName;
+        }
+
+        public InputStream openInputStream() throws IOException {
+
+            if (inputStream == null) {
+                inputStream = new ByteArrayInputStream(read());
+            }
+            return inputStream;
+        }
+
+        protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) {
+            return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors);
+        }
+
+        public OutputStream openOutputStream() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        public Writer openWriter() throws IOException {
+            throw new UnsupportedOperationException();
+        }
+
+        /** @deprecated see bug 6410637 */
+        @Deprecated
+        public String getName() {
+            return name;
+        }
+
+        public boolean isNameCompatible(String cn, JavaFileObject.Kind k) {
+            cn.getClass(); // null check
+            if (k == Kind.OTHER && getKind() != k)
+                return false;
+            return name.equals(cn + k.extension);
+        }
+
+        /** @deprecated see bug 6410637 */
+        @Deprecated
+        public String getPath() {
+            return zipName + "(" + entry.getName() + ")";
+        }
+
+        public long getLastModified() {
+            return entry.getLastModified();
+        }
+
+        public boolean delete() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (!(other instanceof ZipFileIndexFileObject))
+                return false;
+            ZipFileIndexFileObject o = (ZipFileIndexFileObject) other;
+            return entry.equals(o.entry);
+        }
+
+        @Override
+        public int hashCode() {
+            return zipName.hashCode() + (name.hashCode() << 10);
+        }
+
+        public String getZipName() {
+            return zipName;
+        }
+
+        public String getZipEntryName() {
+            return entry.getName();
+        }
+
+        public URI toUri() {
+            String zipName = new File(getZipName()).toURI().normalize().getPath();
+            String entryName = getZipEntryName();
+            if (File.separatorChar != '/') {
+                entryName = entryName.replace(File.separatorChar, '/');
+            }
+            return URI.create("jar:" + zipName + "!" + entryName);
+        }
+
+        private byte[] read() throws IOException {
+            if (entry == null) {
+                entry = zfIndex.getZipIndexEntry(name);
+                if (entry == null)
+                  throw new FileNotFoundException();
+            }
+            return zfIndex.read(entry);
+        }
+
+        public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException {
+            CharBuffer cb = fileManager.getCachedContent(this);
+            if (cb == null) {
+                InputStream in = new ByteArrayInputStream(zfIndex.read(entry));
+                try {
+                    ByteBuffer bb = fileManager.makeByteBuffer(in);
+                    JavaFileObject prev = fileManager.log.useSource(this);
+                    try {
+                        cb = fileManager.decode(bb, ignoreEncodingErrors);
+                    } finally {
+                        fileManager.log.useSource(prev);
+                    }
+                    fileManager.recycleByteBuffer(bb); // save for next time
+                    if (!ignoreEncodingErrors)
+                        fileManager.cache(this, cb);
+                } finally {
+                    in.close();
+                }
+            }
+            return cb;
+        }
+
+        @Override
+        protected String inferBinaryName(Iterable<? extends File> path) {
+            String entryName = getZipEntryName();
+            if (zfIndex.symbolFilePrefix != null) {
+                String prefix = zfIndex.symbolFilePrefix;
+                if (entryName.startsWith(prefix))
+                    entryName = entryName.substring(prefix.length());
+            }
+            return removeExtension(entryName).replace(File.separatorChar, '.');
+        }
+    }
+
+}
--- a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexEntry.java	Wed Jul 05 16:38:26 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-/*
- * Copyright 2007-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 com.sun.tools.javac.file;
-
-import java.io.File;
-
-public final class ZipFileIndexEntry implements Comparable<ZipFileIndexEntry> {
-    public static final ZipFileIndexEntry[] EMPTY_ARRAY = {};
-
-    // Directory related
-    String dir;
-    boolean isDir;
-
-    // File related
-    String name;
-
-    int offset;
-    int size;
-    int compressedSize;
-    long javatime;
-
-    private int nativetime;
-
-    public ZipFileIndexEntry(String path) {
-        int separator = path.lastIndexOf(File.separatorChar);
-        if (separator == -1) {
-            dir = "".intern();
-            name = path;
-        } else {
-            dir = path.substring(0, separator).intern();
-            name = path.substring(separator + 1);
-        }
-    }
-
-    public ZipFileIndexEntry(String directory, String name) {
-        this.dir = directory.intern();
-        this.name = name;
-    }
-
-    public String getName() {
-        if (dir == null || dir.length() == 0) {
-            return name;
-        }
-
-        StringBuilder sb = new StringBuilder();
-        sb.append(dir);
-        sb.append(File.separatorChar);
-        sb.append(name);
-        return sb.toString();
-    }
-
-    public String getFileName() {
-        return name;
-    }
-
-    public long getLastModified() {
-        if (javatime == 0) {
-                javatime = dosToJavaTime(nativetime);
-        }
-        return javatime;
-    }
-
-    // From java.util.zip
-    private static long dosToJavaTime(int nativetime) {
-        // Bootstrap build problems prevent me from using the code directly
-        // Convert the raw/native time to a long for now
-        return (long)nativetime;
-    }
-
-    void setNativeTime(int natTime) {
-        nativetime = natTime;
-    }
-
-    public boolean isDirectory() {
-        return isDir;
-    }
-
-    public int compareTo(ZipFileIndexEntry other) {
-        String otherD = other.dir;
-        if (dir != otherD) {
-            int c = dir.compareTo(otherD);
-            if (c != 0)
-                return c;
-        }
-        return name.compareTo(other.name);
-    }
-
-
-    public String toString() {
-        return isDir ? ("Dir:" + dir + " : " + name) :
-            (dir + ":" + name);
-    }
-}
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java	Wed Jul 05 16:39:00 2017 +0200
@@ -1056,7 +1056,7 @@
     void readClassAttr(ClassSymbol c, Name attrName, int attrLen) {
         if (attrName == names.SourceFile) {
             Name n = readName(nextChar());
-            c.sourcefile = new SourceFileObject(n);
+            c.sourcefile = new SourceFileObject(n, c.flatname);
         } else if (attrName == names.InnerClasses) {
             readInnerClasses(c);
         } else if (allowGenerics && attrName == names.Signature) {
@@ -2221,9 +2221,12 @@
         /** The file's name.
          */
         private Name name;
+        private Name flatname;
 
-        public SourceFileObject(Name name) {
+        public SourceFileObject(Name name, Name flatname) {
+            super(null); // no file manager; never referenced for this file object
             this.name = name;
+            this.flatname = flatname;
         }
 
         public InputStream openInputStream() {
@@ -2285,5 +2288,9 @@
             throw new UnsupportedOperationException();
         }
 
+        @Override
+        protected String inferBinaryName(Iterable<? extends File> path) {
+            return flatname.toString();
+        }
     }
 }
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java	Wed Jul 05 16:39:00 2017 +0200
@@ -34,7 +34,6 @@
 import javax.tools.DiagnosticListener;
 import javax.tools.JavaFileObject;
 
-import com.sun.tools.javac.code.Source;
 import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.tree.JCTree;
 import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
@@ -86,10 +85,6 @@
      */
     public boolean emitWarnings;
 
-    /** Enforce mandatory warnings.
-     */
-    private boolean enforceMandatoryWarnings;
-
     /** Print stack trace on errors?
      */
     public boolean dumpOnError;
@@ -138,9 +133,6 @@
         DiagnosticListener<? super JavaFileObject> diagListener =
             context.get(DiagnosticListener.class);
         this.diagListener = diagListener;
-
-        Source source = Source.instance(context);
-        this.enforceMandatoryWarnings = source.enforceMandatoryWarnings();
     }
     // where
         private int getIntOption(Options options, String optionName, int defaultValue) {
@@ -473,10 +465,7 @@
      *  @param args   Fields of the warning message.
      */
     public void mandatoryWarning(DiagnosticPosition pos, String key, Object ... args) {
-        if (enforceMandatoryWarnings)
-            report(diags.mandatoryWarning(source, pos, key, args));
-        else
-            report(diags.warning(source, pos, key, args));
+        report(diags.mandatoryWarning(source, pos, key, args));
     }
 
     /** Report a warning that cannot be suppressed.
@@ -514,34 +503,43 @@
     }
 
     /** Provide a non-fatal notification, unless suppressed by the -nowarn option.
+     *  @param file   The file to which the note applies.
+     *  @param key    The key for the localized notification message.
+     *  @param args   Fields of the notification message.
+     */
+    public void note(JavaFileObject file, String key, Object ... args) {
+        report(diags.note(wrap(file), null, key, args));
+    }
+
+    /** Provide a non-fatal notification, unless suppressed by the -nowarn option.
      *  @param key    The key for the localized notification message.
      *  @param args   Fields of the notification message.
      */
     public void mandatoryNote(final JavaFileObject file, String key, Object ... args) {
-        JCDiagnostic.DiagnosticSource wrapper = null;
-        if (file != null) {
-            wrapper = new JCDiagnostic.DiagnosticSource() {
-                    public JavaFileObject getFile() {
-                        return file;
-                    }
-                    public CharSequence getName() {
-                        return JavacFileManager.getJavacBaseFileName(getFile());
-                    }
-                    public int getLineNumber(int pos) {
-                        return Log.this.getLineNumber(pos);
-                    }
-                    public int getColumnNumber(int pos) {
-                        return Log.this.getColumnNumber(pos);
-                    }
-                    public Map<JCTree, Integer> getEndPosTable() {
-                        return (endPosTables == null ? null : endPosTables.get(file));
-                    }
-                };
+        report(diags.mandatoryNote(wrap(file), key, args));
+    }
+
+    private JCDiagnostic.DiagnosticSource wrap(final JavaFileObject file) {
+        if (file == null) {
+            return null;
         }
-        if (enforceMandatoryWarnings)
-            report(diags.mandatoryNote(wrapper, key, args));
-        else
-            report(diags.note(wrapper, null, key, args));
+        return new JCDiagnostic.DiagnosticSource() {
+            public JavaFileObject getFile() {
+                return file;
+            }
+            public CharSequence getName() {
+                return JavacFileManager.getJavacBaseFileName(getFile());
+            }
+            public int getLineNumber(int pos) {
+                return Log.this.getLineNumber(pos);
+            }
+            public int getColumnNumber(int pos) {
+                return Log.this.getColumnNumber(pos);
+            }
+            public Map<JCTree, Integer> getEndPosTable() {
+                return (endPosTables == null ? null : endPosTables.get(file));
+            }
+        };
     }
 
     private DiagnosticPosition wrap(int pos) {
--- a/langtools/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java	Wed Jul 05 16:39:00 2017 +0200
@@ -101,13 +101,17 @@
      *                individual instances should be given, or whether an aggregate
      *                message should be generated at the end of the compilation.
      *                Typically set via  -Xlint:option.
+     * @param enforceMandatory
+     *                True if mandatory warnings and notes are being enforced.
      * @param prefix  A common prefix for the set of message keys for
      *                the messages that may be generated.
      */
-    public MandatoryWarningHandler(Log log, boolean verbose, String prefix) {
+    public MandatoryWarningHandler(Log log, boolean verbose,
+                                   boolean enforceMandatory, String prefix) {
         this.log = log;
         this.verbose = verbose;
         this.prefix = prefix;
+        this.enforceMandatory = enforceMandatory;
     }
 
     /**
@@ -122,7 +126,7 @@
 
             if (log.nwarnings < log.MaxWarnings) {
                 // generate message and remember the source file
-                log.mandatoryWarning(pos, msg, args);
+                logMandatoryWarning(pos, msg, args);
                 sourcesWithReportedWarnings.add(currentSource);
             } else if (deferredDiagnosticKind == null) {
                 // set up deferred message
@@ -163,12 +167,12 @@
     public void reportDeferredDiagnostic() {
         if (deferredDiagnosticKind != null) {
             if (deferredDiagnosticArg == null)
-                log.mandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix));
+                logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix));
             else
-                log.mandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix), deferredDiagnosticArg);
+                logMandatoryNote(deferredDiagnosticSource, deferredDiagnosticKind.getKey(prefix), deferredDiagnosticArg);
 
             if (!verbose)
-                log.mandatoryNote(deferredDiagnosticSource, prefix + ".recompile");
+                logMandatoryNote(deferredDiagnosticSource, prefix + ".recompile");
         }
     }
 
@@ -224,4 +228,32 @@
      * deferredDiagnosticKind is updated.
      */
     private Object deferredDiagnosticArg;
+
+    /**
+     * True if mandatory warnings and notes are being enforced.
+     */
+    private final boolean enforceMandatory;
+
+    /**
+     * Reports a mandatory warning to the log.  If mandatory warnings
+     * are not being enforced, treat this as an ordinary warning.
+     */
+    private void logMandatoryWarning(DiagnosticPosition pos, String msg,
+                                     Object... args) {
+        if (enforceMandatory)
+            log.mandatoryWarning(pos, msg, args);
+        else
+            log.warning(pos, msg, args);
+    }
+
+    /**
+     * Reports a mandatory note to the log.  If mandatory notes are
+     * not being enforced, treat this as an ordinary note.
+     */
+    private void logMandatoryNote(JavaFileObject file, String msg, Object... args) {
+        if (enforceMandatory)
+            log.mandatoryNote(file, msg, args);
+        else
+            log.note(file, msg, args);
+    }
 }
--- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java	Wed Jul 05 16:39:00 2017 +0200
@@ -27,7 +27,9 @@
 
 import com.sun.tools.javac.code.Symbol.PackageSymbol;
 import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.file.ZipArchive.ZipFileObject;
 import com.sun.tools.javac.file.Old199;
+import com.sun.tools.javac.file.ZipFileIndexArchive;
 import com.sun.tools.javac.jvm.ClassReader;
 import com.sun.tools.javac.util.Context;
 
@@ -82,16 +84,16 @@
     protected void extraFileActions(PackageSymbol pack, JavaFileObject fo) {
         CharSequence fileName = Old199.getName(fo);
         if (docenv != null && fileName.equals("package.html")) {
-            if (fo instanceof JavacFileManager.ZipFileObject) {
-                JavacFileManager.ZipFileObject zfo = (JavacFileManager.ZipFileObject) fo;
+            if (fo instanceof ZipFileObject) {
+                ZipFileObject zfo = (ZipFileObject) fo;
                 String zipName = zfo.getZipName();
                 String entryName = zfo.getZipEntryName();
                 int lastSep = entryName.lastIndexOf("/");
                 String classPathName = entryName.substring(0, lastSep + 1);
                 docenv.getPackageDoc(pack).setDocPath(zipName, classPathName);
             }
-            else if (fo instanceof JavacFileManager.ZipFileIndexFileObject) {
-                JavacFileManager.ZipFileIndexFileObject zfo = (JavacFileManager.ZipFileIndexFileObject) fo;
+            else if (fo instanceof ZipFileIndexArchive.ZipFileIndexFileObject) {
+                ZipFileIndexArchive.ZipFileIndexFileObject zfo = (ZipFileIndexArchive.ZipFileIndexFileObject) fo;
                 String zipName = zfo.getZipName();
                 String entryName = zfo.getZipEntryName();
                 if (File.separatorChar != '/') {
--- a/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java	Wed Jul 05 16:39:00 2017 +0200
@@ -25,16 +25,13 @@
 
 package com.sun.tools.javap;
 
-import java.io.File;
 import java.io.PrintWriter;
 import java.nio.charset.Charset;
-import javax.tools.Diagnostic;
 import javax.tools.DiagnosticListener;
 import javax.tools.JavaFileObject;
 
 import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.util.Context;
-import com.sun.tools.javac.util.JCDiagnostic;
 
 /**
  *  javap's implementation of JavaFileManager.
@@ -52,29 +49,8 @@
     static JavapFileManager create(final DiagnosticListener<? super JavaFileObject> dl, PrintWriter log, Options options) {
         Context javac_context = new Context();
 
-        if (dl != null) {
-            // Workaround bug 6625520: javac handles missing entries on classpath badly
-            // Ignore spurious errors for missing files
-            DiagnosticListener<JavaFileObject> wrapper = new DiagnosticListener<JavaFileObject>() {
-                public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
-                    if (diagnostic instanceof JCDiagnostic) {
-                        JCDiagnostic jcd = (JCDiagnostic) diagnostic;
-                        if (jcd.getCode().equals("compiler.err.error.reading.file")) {
-                            Object[] args = jcd.getArgs();
-                            if (args.length > 0 && args[0] != null && args[0].toString().length() > 0) {
-                                File f = new File(args[0].toString());
-                                if (!f.exists())
-                                    return;
-                            }
-                        }
-
-                    }
-                    dl.report(diagnostic);
-                }
-            };
-            javac_context.put(DiagnosticListener.class, wrapper);
-        }
-
+        if (dl != null)
+            javac_context.put(DiagnosticListener.class, dl);
         javac_context.put(com.sun.tools.javac.util.Log.outKey, log);
 
         return new JavapFileManager(javac_context, null);
--- a/langtools/test/tools/javac/T6358024.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/test/tools/javac/T6358024.java	Wed Jul 05 16:39:00 2017 +0200
@@ -36,6 +36,7 @@
 import com.sun.source.util.*;
 import com.sun.tools.javac.api.*;
 import com.sun.tools.javac.file.*;
+import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.main.*;
 import com.sun.tools.javac.util.*;
 
--- a/langtools/test/tools/javac/T6358166.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/test/tools/javac/T6358166.java	Wed Jul 05 16:39:00 2017 +0200
@@ -33,6 +33,7 @@
 import javax.lang.model.element.*;
 import javax.tools.*;
 import com.sun.tools.javac.file.*;
+import com.sun.tools.javac.file.JavacFileManager; // disambiguate
 import com.sun.tools.javac.main.JavaCompiler;
 import com.sun.tools.javac.main.*;
 import com.sun.tools.javac.util.*;
--- a/langtools/test/tools/javac/T6358168.java	Wed Jul 05 16:38:26 2017 +0200
+++ b/langtools/test/tools/javac/T6358168.java	Wed Jul 05 16:39:00 2017 +0200
@@ -34,6 +34,7 @@
 import javax.lang.model.element.*;
 import javax.tools.*;
 import com.sun.tools.javac.file.*;
+import com.sun.tools.javac.file.JavacFileManager;
 import com.sun.tools.javac.main.JavaCompiler;
 import com.sun.tools.javac.main.*;
 import com.sun.tools.javac.util.*;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T6625520.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.io.*;
+import java.util.*;
+import javax.tools.*;
+import com.sun.tools.javac.file.*;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.util.*;
+
+/*
+ * @test
+ * @bug 6625520
+ * @summary javac handles missing entries on classpath badly
+ */
+public class T6625520 {
+    public static void main(String[] args) throws Exception {
+        new T6625520().run();
+    }
+
+    void run() throws Exception {
+        Context c = new Context();
+        DiagnosticCollector<JavaFileObject> dc =
+            new DiagnosticCollector<JavaFileObject>();
+        c.put(DiagnosticListener.class, dc);
+        StandardJavaFileManager fm = new JavacFileManager(c, false, null);
+        fm.setLocation(StandardLocation.CLASS_PATH,
+                       Arrays.asList(new File("DOES_NOT_EXIST.jar")));
+        FileObject fo = fm.getFileForInput(StandardLocation.CLASS_PATH,
+                                           "p", "C.java");
+        System.err.println(fo + "\n" + dc.getDiagnostics());
+        if (dc.getDiagnostics().size() > 0)
+            throw new Exception("unexpected diagnostics found");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6294779/T6294779a.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,49 @@
+/*
+ * 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     6294779
+ * @summary Problem with interface inheritance and covariant return types
+ * @author  Maurizio Cimadamore
+ * @compile T6294779a.java
+ */
+
+public class T6294779a {
+
+    interface A {
+        A m();
+    }
+
+    interface B extends A {
+        B m();
+    }
+
+    interface C extends A {
+        C m();
+    }
+
+    interface D extends B, C {
+        D m();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6294779/T6294779b.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,49 @@
+/*
+ * 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     6294779
+ * @summary Problem with interface inheritance and covariant return types
+ * @author  Maurizio Cimadamore
+ * @compile T6294779b.java
+ */
+
+import java.util.*;
+
+class T6294779b {
+
+    interface I1<E> {
+        List<E> m();
+    }
+
+    interface I2<E> {
+        Queue<E> m();
+    }
+
+    interface I3<E> {
+        LinkedList<E> m();
+    }
+
+    interface I4<E> extends I1<E>, I2<E>, I3<E> {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6294779/T6294779c.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,53 @@
+/*
+ * 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     6294779
+ * @summary Problem with interface inheritance and covariant return types
+ * @author  Maurizio Cimadamore
+ * @compile/fail T6294779c.java
+ */
+
+public class T6294779c<X> {
+
+    interface A {}
+
+    interface B {}
+
+    interface C {}
+
+    interface I1 {
+        T6294779c<? extends A> get();
+    }
+
+    interface I2 {
+        T6294779c<? extends B> get();
+    }
+
+    interface I3 {
+        T6294779c<? extends C> get();
+    }
+
+    interface I4 extends I1, I2, I3 {}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/sourceOption/SourceOption.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2006 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     6507179
+ * @summary Ensure that "-source" option isn't ignored.
+ * @author  Scott Seligman
+ */
+
+import com.sun.javadoc.*;
+
+public class SourceOption extends Doclet {
+
+    public static void main(String[] args) {
+        if (com.sun.tools.javadoc.Main.execute(
+                "javadoc",
+                "SourceOption",
+                new String[] {"-source", "1.3", "p"}) != 0)
+            throw new Error("Javadoc encountered warnings or errors.");
+    }
+
+    public static boolean start(RootDoc root) {
+        root.classes();         // force parser into action
+        return true;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/sourceOption/p/A.java	Wed Jul 05 16:39:00 2017 +0200
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+package p;
+
+public class A {
+    boolean assert;     // illegal since 1.4
+    boolean enum;       // illegal since 5
+}
--- a/make/jprt.config	Wed Jul 05 16:38:26 2017 +0200
+++ b/make/jprt.config	Wed Jul 05 16:39:00 2017 +0200
@@ -142,9 +142,15 @@
 	solaris_arch=i386
     fi
 
-    # Get the SS11 compilers into path (make sure it matches ALT setting)
-    compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/SS11/bin
-    compiler_name=SS11
+    # Get the compilers into path (make sure it matches ALT setting)
+    if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then
+        compiler_name=${JPRT_SOLARIS_COMPILER_NAME}
+    else
+        # FIXUP: Change to SS12 when validated
+	#compiler_name=SS12
+	compiler_name=SS11
+    fi
+    compiler_path=${jdk_devtools}/${solaris_arch}/SUNWspro/${compiler_name}/bin
     ALT_COMPILER_PATH="${compiler_path}"
     export ALT_COMPILER_PATH
     dirMustExist "${compiler_path}" ALT_COMPILER_PATH