# HG changeset patch # User duke # Date 1499265540 -7200 # Node ID cd8b8f500face60d1566d850857a7fccadbd383a # Parent ef16801b95b180dbc68f0f9cb845fa57b32bea1a# Parent 7c47c40d4bd5106e2af81490df04824468cc9ee8 Merge diff -r 7c47c40d4bd5 -r cd8b8f500fac .hgtags-top-repo --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac corba/.hgtags --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/.hgignore --- 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/ diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/.hgtags --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java --- 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(); } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java --- 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. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java --- 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(""); } } 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) { diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/defs.make --- 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) diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/hotspot_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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/linux/Queens.class Binary file hotspot/make/linux/Queens.class has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/linux/makefiles/buildtree.make --- 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'; \ ) > $@ diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/linux/makefiles/gcc.make --- 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/$@)) diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/linux/makefiles/mapfile-vers-debug --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/linux/makefiles/mapfile-vers-product --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/linux/makefiles/rules.make --- 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 $< diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/pic.make --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/Queens.class Binary file hotspot/make/solaris/Queens.class has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/buildtree.make --- 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'; \ ) > $@ diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/jvmg.make --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/mapfile-vers --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_COMPILER1_i486 --- 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_; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_COMPILER1_sparc --- 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_; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_COMPILER2_amd64 --- 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_; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_COMPILER2_i486 --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_COMPILER2_sparc --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_COMPILER2_sparcv9 --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_TIERED_amd64 --- 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_; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_TIERED_i486 --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/reorder_TIERED_sparc --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/solaris/makefiles/rules.make --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/make/windows/makefiles/vm.make --- 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=\ diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/cpu/sparc/vm/sparc.ad --- 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 %{ diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/cpu/x86/vm/vm_version_x86_32.cpp --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/cpu/x86/vm/x86_32.ad --- 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)); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/cpu/x86/vm/x86_64.ad --- 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" %} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/os/linux/vm/hpi_linux.hpp --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/os/linux/vm/jvm_linux.cpp --- 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; }; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/os/linux/vm/os_linux.cpp --- 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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/os/linux/vm/os_linux.hpp --- 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; } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/os/solaris/vm/hpi_solaris.hpp --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/os/windows/vm/hpi_windows.hpp --- 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), diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.svg. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.svg + + + + com.sun.hotspot.igv.svg + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java --- /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; + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/layer.xml --- /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 @@ + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.bytecodes. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.bytecodes + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + org.jdesktop.layout + + + + 1 + 1.4 + + + + org.openide.explorer + + + + 6.11 + + + + org.openide.nodes + + + + 7.2.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java --- /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 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 selector = new Properties.PropertySelector(graph.getNodes()); + StringPropertyMatcher matcher = new StringPropertyMatcher("bci", bciValue); + List nodeList = selector.selectMultiple(matcher); + if (nodeList.size() > 0) { + nodes = new HashSet(); + 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 getCookie(Class aClass) { + if (aClass == SelectBytecodesCookie.class && nodes != null) { + return (T) (new SelectBytecodesCookie(nodes)); + } + return super.getCookie(aClass); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.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.form Wed Jul 05 16:39:00 2017 +0200 @@ -0,0 +1,26 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + +
diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java --- /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. + */ + // //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) + ); + }// //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(); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentSettings.xml --- /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 @@ + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponentWstcref.xml --- /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 @@ + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java --- /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()); + } + + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java --- /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 nodes; + + /** Creates a new instance of SelectBytecodesCookie */ + public SelectBytecodesCookie(Set nodes) { + this.nodes = nodes; + } + + public Set getNodes() { + return Collections.unmodifiableSet(nodes); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/bytecode.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/link.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/images/method.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/layer.xml --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.controlflow. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.controlflow + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.hierarchicallayout + + + + 1.0 + + + + com.sun.hotspot.igv.layout + + + + 1.0 + + + + org.jdesktop.layout + + + + 1 + 1.4 + + + + org.netbeans.api.visual + + + + 2.9 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java --- /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 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(); + } + + public InputBlockEdge getEdge() { + return edge; + } + + public Port getTo() { + return inputSlot; + } + + public Port getFrom() { + return outputSlot; + } + + public void setControlPoints(List p) { + this.points = p; + } + + @Override + public List getControlPoints() { + return points; + } + + @Override + public String toString() { + return "Connection[ " + from.toString() + " - " + to.toString() + "]"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java --- /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); + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java --- /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 implements SelectProvider, MoveProvider, RectangularSelectDecorator, RectangularSelectProvider { + + private Set selection; + private Hashtable 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(); + + 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 blocks = new ArrayList(this.getNodes()); + for (InputBlock b : blocks) { + removeNode(b); + } + + ArrayList edges = new ArrayList(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 inputNodes = new HashSet(); + 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))); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.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.form Wed Jul 05 16:39:00 2017 +0200 @@ -0,0 +1,26 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + +
diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java --- /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. + */ + // //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) + ); + }// //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(); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentSettings.xml --- /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 @@ + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponentWstcref.xml --- /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 @@ + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java --- /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 extends GraphLayout { + + 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 getControlPoints() { + return new ArrayList(); + } + + public void setControlPoints(List list) { + // Do nothing for now + } + } + + private class VertexWrapper implements Vertex { + + private N node; + private UniversalGraph graph; + private Port slot; + private Point position; + + public VertexWrapper(N node, UniversalGraph 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 graph) { + + Set links = new HashSet(); + Set vertices = new HashSet(); + Map vertexMap = new HashMap(); + + 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 graph, Collection nodes) { + throw new UnsupportedOperationException(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/layer.xml --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.coordinator. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.coordinator + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.difference + + + + 1.0 + + + + com.sun.hotspot.igv.settings + + + + 1.0 + + + + com.sun.hotspot.igv.util + + + + 1.0 + + + + org.netbeans.api.progress + + + + 1 + 1.10.0.1 + + + + org.openide.actions + + + + 6.6.1.1 + + + + org.openide.awt + + + + 6.11.0.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.explorer + + + + 6.11 + + + + org.openide.filesystems + + + + 7.3 + + + + org.openide.loaders + + + + 6.7 + + + + org.openide.nodes + + + + 7.2.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java --- /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>> structure; + private List 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> p = (Pair>) arg0; + if (p.getLeft().length() == 0) { + + List curNodes = new ArrayList(); + 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 subFolders, List groups) { + this(name, organizer, subFolders, groups, new FolderChildren(), new InstanceContent()); + } + + private FolderNode(String name, GroupOrganizer organizer, List oldSubFolders, final List 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 oldSubFolders, List groups) { + this.setDisplayName(name); + this.organizer = organizer; + this.subFolders = new ArrayList(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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java --- /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>> organize(List subFolders, List groups) { + + List>> result = new ArrayList>>(); + + if (subFolders.size() == 0) { + Map> map = new HashMap>(); + for (Group g : groups) { + Integer cur = g.getGraphs().size(); + if (!map.containsKey(cur)) { + map.put(cur, new ArrayList()); + } + map.get(cur).add(g); + } + + SortedSet keys = new TreeSet(map.keySet()); + for (Integer i : keys) { + result.add(new Pair>("Graph count " + i, map.get(i))); + } + + } else if (subFolders.size() == 1) { + for (Group g : groups) { + List children = new ArrayList(); + children.add(g); + Pair> p = new Pair>(); + p.setLeft(g.getName()); + p.setRight(children); + result.add(p); + } + } else if (subFolders.size() == 2) { + result.add(new Pair>("", groups)); + } + + return result; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java --- /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 getCookie(Class 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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.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.form Wed Jul 05 16:39:00 2017 +0200 @@ -0,0 +1,41 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java --- /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(), document.getGroups()); + manager.setRootContext(root); + ((BeanTreeView) this.jScrollPane1).setRootVisible(false); + + document.getChangedEvent().addListener(new ChangedListener() { + + 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 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(), 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. + */ + // //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); + }// //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 +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentSettings.xml --- /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 @@ + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponentWstcref.xml --- /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 @@ + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml --- /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 @@ + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java --- /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>> organize(List subFolders, List groups) { + + List>> result = new ArrayList>>(); + + if (groups.size() == 1 && subFolders.size() > 0) { + result.add(new Pair>("", groups)); + } else { + for (Group g : groups) { + List children = new ArrayList(); + children.add(g); + Pair> p = new Pair>(); + p.setLeft(g.getName()); + p.setRight(children); + result.add(p); + } + } + + return result; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/Bundle.properties --- /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... diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java --- /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); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java --- /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(); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java --- /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 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 organizersCollection = Lookup.getDefault().lookupAll(GroupOrganizer.class); + + List organizers = new ArrayList(organizersCollection); + Collections.sort(organizers, new Comparator() { + public int compare(GroupOrganizer a, GroupOrganizer b) { + return a.getName().compareTo(b.getName()); + } + }); + + map = new HashMap(); + + 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; + } + +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/customLeftWsmode.xml --- /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 @@ + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/diff.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/folder.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/graph.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/import.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/remove.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/removeall.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/save.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/saveall.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structure.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/images/structured.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.data. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.data + + + + com.sun.hotspot.igv.data + com.sun.hotspot.igv.data.serialization + com.sun.hotspot.igv.data.services + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java --- /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 extends Event> { + + private T object; + + public ChangedEvent() { + } + + public ChangedEvent(T object) { + this.object = object; + } + + protected void fire(ChangedListener l) { + l.changed(object); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java --- /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 { + + public ChangedEvent getChangedEvent(); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java --- /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 { + + public void changed(T source); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java --- /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 { + + private List listener; + + public Event() { + listener = new ArrayList(); + } + + public void addListener(L l) { + listener.add(l); + } + + public void removeListener(L l) { + listener.remove(l); + } + + public void fire() { + List tmpList = new ArrayList(listener); + for (L l : tmpList) { + fire(l); + } + } + + protected abstract void fire(L l); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java --- /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 { + + private List groups; + private ChangedEvent changedEvent; + + public GraphDocument() { + groups = new ArrayList(); + changedEvent = new ChangedEvent(this); + } + + public void clear() { + groups.clear(); + getChangedEvent().fire(); + } + + public ChangedEvent getChangedEvent() { + return changedEvent; + } + + public List 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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java --- /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 { + + private List graphs; + private transient ChangedEvent changedEvent; + private GraphDocument document; + private InputMethod method; + private String assembly; + + public Group() { + graphs = new ArrayList(); + init(); + } + + private void init() { + changedEvent = new ChangedEvent(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 getChangedEvent() { + return changedEvent; + } + + public List 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 getAllNodes() { + Set result = new HashSet(); + for (InputGraph g : graphs) { + Set 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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java --- /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 nodes; + private List successorNames; + private String name; + private InputGraph graph; + private Rectangle bounds; + private Set successors; + private Set predecessors; + private Set inputs; + private Set outputs; + + public InputBlock(InputGraph graph, String name) { + this.graph = graph; + this.name = name; + nodes = new ArrayList(); + successorNames = new ArrayList(); + successors = new HashSet(); + predecessors = new HashSet(); + inputs = new HashSet(); + outputs = new HashSet(); + } + + 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 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 getPredecessors() { + return Collections.unmodifiableSet(predecessors); + } + + public Set getSuccessors() { + return Collections.unmodifiableSet(successors); + } + + public Set getInputs() { + return Collections.unmodifiableSet(inputs); + } + + public Set 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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java --- /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 nodes; + private Set edges; + private Group parent; + private Map blocks; + private Map 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(); + edges = new HashSet(); + blocks = new Hashtable(); + nodeToBlock = new Hashtable(); + if (last != null) { + + for (InputNode n : last.getNodes()) { + addNode(n); + } + + for (InputEdge c : last.getEdges()) { + addEdge(c); + } + } + } + + public void schedule(Collection newBlocks) { + clearBlocks(); + InputBlock noBlock = new InputBlock(this, "no block"); + Set scheduledNodes = new HashSet(); + + 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 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 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 getNodes() { + return Collections.unmodifiableCollection(nodes.values()); + } + + public Set getNodesAsSet() { + return Collections.unmodifiableSet(nodes.keySet()); + } + + public Collection 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 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java --- /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 inlined; + private InputMethod parentMethod; + private Group group; + private List 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(); + bytecodes = new ArrayList(); + } + + public List getBytecodes() { + return Collections.unmodifiableList(bytecodes); + } + + public List 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java --- /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 { + + 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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java --- /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 map; + + public Properties() { + map = new HashMap(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(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 { + + private Collection objects; + + public PropertySelector(Collection 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 selectMultiple(final String name, final String value) { + return selectMultiple(new StringPropertyMatcher(name, value)); + } + + public List selectMultiple(PropertyMatcher matcher) { + List result = new ArrayList(); + 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 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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java --- /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 + "; "; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java --- /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; + // + private ElementHandler topHandler = new ElementHandler(TOP_ELEMENT) { + + @Override + protected GraphDocument start() throws SAXException { + return new GraphDocument(); + } + }; + // + private ElementHandler groupHandler = new XMLParser.ElementHandler(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 assemblyHandler = new XMLParser.HandoverElementHandler(ASSEMBLY_ELEMENT, true) { + + @Override + protected void end(String text) throws SAXException { + getParentObject().setAssembly(text); + } + }; + // + private ElementHandler methodHandler = new XMLParser.ElementHandler(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; + } + // + private HandoverElementHandler bytecodesHandler = new XMLParser.HandoverElementHandler(BYTECODES_ELEMENT, true) { + + @Override + protected void end(String text) throws SAXException { + getParentObject().setBytecodes(text); + } + }; + // + private HandoverElementHandler inlinedHandler = new XMLParser.HandoverElementHandler(INLINE_ELEMENT); + // + private ElementHandler inlinedMethodHandler = new XMLParser.ElementHandler(METHOD_ELEMENT) { + + @Override + protected InputMethod start() throws SAXException { + InputMethod method = parseMethod(this, getParentObject().getGroup()); + getParentObject().addInlined(method); + return method; + } + }; + // + private ElementHandler graphHandler = new XMLParser.ElementHandler(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(); + } + }; + // + private HandoverElementHandler nodesHandler = new HandoverElementHandler(NODES_ELEMENT); + // + private HandoverElementHandler controlFlowHandler = new HandoverElementHandler(CONTROL_FLOW_ELEMENT); + // + private ElementHandler blockHandler = new ElementHandler(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; + } + }; + // + private HandoverElementHandler blockNodesHandler = new HandoverElementHandler(NODES_ELEMENT); + // + private ElementHandler blockNodeHandler = new ElementHandler(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(); + } + }; + // + private HandoverElementHandler successorsHandler = new HandoverElementHandler(SUCCESSORS_ELEMENT); + // + private ElementHandler successorHandler = new ElementHandler(SUCCESSOR_ELEMENT) { + + @Override + protected InputBlock start() throws SAXException { + String name = readRequiredAttribute(BLOCK_NAME_PROPERTY); + getParentObject().addSuccessor(name); + return getParentObject(); + } + }; + // + private ElementHandler nodeHandler = new ElementHandler(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; + } + }; + // + private ElementHandler removeNodeHandler = new ElementHandler(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); + } + }; + // + private HandoverElementHandler edgesHandler = new HandoverElementHandler(EDGES_ELEMENT); + + // Local class for edge elements + private static class EdgeElementHandler extends ElementHandler { + + 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; + } + } + // + private EdgeElementHandler edgeHandler = new EdgeElementHandler(EDGE_ELEMENT) { + + @Override + protected InputEdge start(InputEdge conn) throws SAXException { + getParentObject().addEdge(conn); + return conn; + } + }; + // + private EdgeElementHandler removeEdgeHandler = new EdgeElementHandler(REMOVE_EDGE_ELEMENT) { + + @Override + protected InputEdge start(InputEdge conn) throws SAXException { + getParentObject().removeEdge(conn); + return conn; + } + }; + // + private HandoverElementHandler propertiesHandler = new HandoverElementHandler(PROPERTIES_ELEMENT); + // + private HandoverElementHandler groupPropertiesHandler = new HandoverElementHandler(PROPERTIES_ELEMENT) { + + @Override + public void end(String text) throws SAXException { + if (groupCallback != null) { + groupCallback.started(getParentObject()); + } + } + }; + // + private ElementHandler propertyHandler = new XMLParser.ElementHandler(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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java --- /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 removed = new HashSet(); + Set equal = new HashSet(); + + 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 removedEdges = new HashSet(); + Set equalEdges = new HashSet(); + + 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(""); + 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java --- /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

extends ElementHandler { + + @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

extends ElementHandler { + + public TopElementHandler() { + super(null); + } + } + + public static class ElementHandler { + + private String name; + private T object; + private Attributes attr; + private StringBuilder currentText; + private ParseMonitor monitor; + private Hashtable> hashtable; + private boolean needsText; + private ElementHandler parentElement; + + public ElementHandler(String name) { + this(name, false); + } + + public ElementHandler getParentElement() { + return parentElement; + } + + public P getParentObject() { + return getParentElement().getObject(); + } + + protected boolean needsText() { + return needsText; + } + + public ElementHandler(String name, boolean needsText) { + this.hashtable = new Hashtable>(); + this.name = name; + this.needsText = needsText; + } + + public ParseMonitor getMonitor() { + return monitor; + } + + public ElementHandler getChild(String name) { + return hashtable.get(name); + } + + public void addChild(ElementHandler 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 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 stack; + private ParseMonitor monitor; + + public XMLParser(TopElementHandler rootHandler, ParseMonitor monitor) { + this.stack = new Stack(); + 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 { + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java --- /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 elementStack; + + public XMLWriter(Writer inner) { + this.inner = inner; + elementStack = new Stack(); + } + + @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(">"); + } else if (c == '<') { + inner.write("<"); + } else if (c == '&') { + inner.write("&"); + } 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("\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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java --- /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); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java --- /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); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java --- /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>> organize(List subFolders, List groups); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java --- /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); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java --- /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 nodes); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java --- /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 schedule(InputGraph graph); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.difference. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.difference + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + + com.sun.hotspot.igv.difference + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java --- /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 keyMapB = new HashMap(); + for (InputNode n : b.getNodes()) { + Integer key = n.getId(); + assert !keyMapB.containsKey(key); + keyMapB.put(key, n); + } + + Set pairs = new HashSet(); + + 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 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 nodesA = new HashSet(a.getNodes()); + Set nodesB = new HashSet(b.getNodes()); + + Map inputNodeMap = new HashMap(); + 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 edgesA = a.getEdges(); + Set edgesB = b.getEdges(); + + Set newEdges = new HashSet(); + + 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 matched = new HashSet(); + + Set pairs = new HashSet(); + 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 selectedPairs = new HashSet(); + 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 toRemove = new HashSet(); + 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)); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.filter. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.filter + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.graph + + + + 1.0 + + + + org.jdesktop.layout + + + + 1 + 1.4.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.filesystems + + + + 7.3 + + + + org.openide.nodes + + + + 7.2.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + com.sun.hotspot.igv.filter + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java --- /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 changedEvent; + private Properties properties; + + public AbstractFilter() { + changedEvent = new ChangedEvent(this); + properties = new Properties(); + } + + public Properties getProperties() { + return properties; + } + + public OpenCookie getEditor() { + return null; + } + + public ChangedEvent getChangedEvent() { + return changedEvent; + } + + protected void fireChangedEvent() { + changedEvent.fire(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java --- /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 colorRules; + private String name; + + public ColorFilter(String name) { + this.name = name; + colorRules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + Properties.PropertySelector

selector = new Properties.PropertySelector
(diagram.getFigures()); + for (ColorRule rule : colorRules) { + if (rule.getSelector() != null) { + List
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; + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java --- /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 rules; + private String name; + + public CombineFilter(String name) { + this.name = name; + rules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + Properties.PropertySelector
selector = new Properties.PropertySelector
(diagram.getFigures()); + for (CombineRule r : rules) { + + List
list = selector.selectMultiple(r.getFirstMatcher()); + Set
figuresToRemove = new HashSet
(); + for (Figure f : list) { + + List
successors = new ArrayList
(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; + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java --- /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 connectionStyleRules; + private String name; + + public ConnectionFilter(String name) { + this.name = name; + connectionStyleRules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + Properties.PropertySelector
selector = new Properties.PropertySelector
(diagram.getFigures()); + for (ConnectionStyleRule rule : connectionStyleRules) { + List
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; + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java --- /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 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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.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.form Wed Jul 05 16:39:00 2017 +0200 @@ -0,0 +1,133 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java --- /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. + */ + // //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(); + }// //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 + +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java --- /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 { + + public String getName(); + + public void apply(Diagram d); + + OpenCookie getEditor(); + + ChangedEvent getChangedEvent(); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java --- /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 { + + private List filters; + private transient ChangedEvent changedEvent; + private boolean fireEvents; + + public FilterChain() { + filters = new ArrayList(); + changedEvent = new ChangedEvent(this); + this.fireEvents = true; + } + + public FilterChain(FilterChain f) { + this.filters = new ArrayList(f.filters); + changedEvent = new ChangedEvent(this); + this.fireEvents = true; + } + + public ChangedEvent 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 applied = new ArrayList(); + 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 getFilters() { + return Collections.unmodifiableList(filters); + } + + public void clear() { + filters.clear(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java --- /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(); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java --- /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 filters; + private String name; + + public FilterSetting() { + this(null); + } + + public FilterSetting(String name) { + this.name = name; + filters = new HashSet(); + } + + public Set 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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java --- /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); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java --- /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) { + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java --- /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 rules; + private String name; + + public RemoveFilter(String name) { + this.name = name; + rules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + for (RemoveRule r : rules) { + + List
list = r.getSelector().selected(diagram); + Set
figuresToRemove = new HashSet
(); + + List
protectedFigures = null; + if (r.getRemoveAllWithoutPredecessor()) { + protectedFigures = diagram.getRootFigures(); + } + + for (Figure f : list) { + if (r.getRemoveOnlyInputs()) { + List inputSlots = new ArrayList(); + 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
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; + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java --- /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 rules; + private String name; + + public RemoveInputsFilter(String name) { + this.name = name; + rules = new ArrayList(); + } + + public String getName() { + return name; + } + + public void apply(Diagram diagram) { + + for (RemoveInputsRule r : rules) { + + List
list = r.getSelector().selected(diagram); + for (Figure f : list) { + int z = 0; + List last = new ArrayList(); + for (InputSlot is : f.getInputSlots()) { + if (z >= r.getStartingIndex() && z <= r.getEndIndex() && is.getConnections().size() > 0) { + StringBuilder sb = new StringBuilder(); + List 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("
"); + } + 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("
"); + } + 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; + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java --- /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 toRemove = new ArrayList(); + 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"); + } + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java --- /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); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java --- /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
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); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js --- /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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/layer.xml --- /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 @@ + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.filterwindow. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.filterwindow + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.filter + + + + 1.0 + + + + com.sun.hotspot.igv.graph + + + + 1.0 + + + + com.sun.hotspot.igv.util + + + + 1.0 + + + + org.openide.actions + + + + 6.6.1.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.explorer + + + + 6.12.1 + + + + org.openide.filesystems + + + + 7.3.1 + + + + org.openide.loaders + + + + 6.7.1 + + + + org.openide.nodes + + + + 7.2.1.1 + + + + org.openide.util + + + + 7.10.1.1 + + + + org.openide.windows + + + + 6.18.1 + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/META-INF/services/com.sun.hotspot.igv.filter.FilterChainProvider --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java --- /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 selectionChangedEvent; + public boolean selected; + public boolean enabled; + + public CheckNode(Children c, Lookup lookup) { + super(c, lookup); + selectionChangedEvent = new ChangedEvent(this); + selected = false; + enabled = true; + } + + public ChangedEvent 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java --- /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]; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java --- /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 { + + 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() { + + public void changed(Filter source) { + update(); + } + }); + + update(); + + Lookup.Template tpl = new Lookup.Template(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)); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.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.form Wed Jul 05 16:39:00 2017 +0200 @@ -0,0 +1,16 @@ + + +
+ + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java --- /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 filterSettings; + private FilterSetting customFilterSetting = new FilterSetting("-- Custom --"); + private ChangedEvent filterSettingsChangedEvent; + private ActionListener comboBoxActionListener = new ActionListener() { + + public void actionPerformed(ActionEvent e) { + comboBoxSelectionChanged(); + } + }; + + public ChangedEvent 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 toRemove = new ArrayList(); + 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() { + + 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 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 { + + //private Node[] oldSelection; + //private ArrayList newSelection; + private HashMap nodeHash = new HashMap(); + + 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() { + + 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(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(); + 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 { + + 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 customFilters = new ArrayList(); + HashMap afterMap = new HashMap(); + Set enabledSet = new HashSet(); + HashMap map = new HashMap(); + + 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 copiedList = new ArrayList(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. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + setLayout(new java.awt.BorderLayout()); + + }// //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 tpl = new Lookup.Template(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(); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentSettings.xml --- /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 @@ + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponentWstcref.xml --- /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 @@ + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/Bundle.properties --- /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... diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/customRightTopWsmode.xml --- /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 @@ + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/add.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/delete.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/down.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/minus.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/plus.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/images/up.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/layer.xml --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.graph. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.graph + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.layout + + + + 1.0 + + + + + com.sun.hotspot.igv.graph + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java --- /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
selected(Diagram d) { + List
l1 = selector1.selected(d); + List
l2 = selector2.selected(d); + List
result = new ArrayList
(); + for (Figure f : l2) { + if (l1.contains(f)) { + result.add(f); + } + } + return result; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java --- /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 getSuccessors() { + Set succs = new HashSet(); + for (InputBlock b : inputBlock.getSuccessors()) { + succs.add(diagram.getBlock(b)); + } + return succs; + } + + public Set getPredecessors() { + Set succs = new HashSet(); + 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()); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java --- /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 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(); + 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 getControlPoints() { + return controlPoints; + } + + public void setControlPoints(List list) { + controlPoints = list; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java --- /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
figures; + private Map blocks; + private InputGraph graph; + private int curId; + private String nodeText; + private Font font; + + public Font getFont() { + return font; + } + + private Diagram() { + figures = new ArrayList
(); + blocks = new HashMap(); + 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 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 getBlocks() { + return Collections.unmodifiableCollection(blocks.values()); + } + + public Diagram getPrev() { + return Diagram.createDiagram(graph.getPrev(), nodeText); + } + + public List
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 nodes = graph.getNodes(); + Hashtable figureHash = new Hashtable(); + 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
figuresToRemove) { + for (Figure f : figuresToRemove) { + freeFigure(f); + } + + ArrayList
newFigures = new ArrayList
(); + for (Figure f : this.figures) { + if (!figuresToRemove.contains(f)) { + newFigures.add(f); + } + } + figures = newFigures; + } + + private void freeFigure(Figure succ) { + + List inputSlots = new ArrayList(succ.getInputSlots()); + for (InputSlot s : inputSlots) { + succ.removeInputSlot(s); + } + + List outputSlots = new ArrayList(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 getConnections() { + + Set connections = new HashSet(); + for (Figure f : figures) { + + for (InputSlot s : f.getInputSlots()) { + connections.addAll(s.getConnections()); + } + } + + return connections; + } + + public Figure getRootFigure() { + Properties.PropertySelector
selector = new Properties.PropertySelector
(figures); + Figure root = selector.selectSingle("name", "Root"); + if (root == null) { + root = selector.selectSingle("name", "Start"); + } + if (root == null) { + List
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
tmpFigures = getFigures(); + Set connections = getConnections(); + + System.out.println("Number of figures: " + tmpFigures.size()); + System.out.println("Number of connections: " + connections.size()); + + List
figuresSorted = new ArrayList
(tmpFigures); + Collections.sort(figuresSorted, new Comparator
() { + + 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
getRootFigures() { + ArrayList
rootFigures = new ArrayList
(); + for (Figure f : figures) { + if (f.getPredecessors().size() == 0) { + rootFigures.add(f); + } + } + return rootFigures; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java --- /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 inputSlots; + protected List outputSlots; + private Source source; + private Diagram diagram; + private Point position; + private List
predecessors; + private List
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(5); + outputSlots = new ArrayList(1); + predecessors = new ArrayList
(6); + successors = new ArrayList
(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
getPredecessors() { + return Collections.unmodifiableList(predecessors); + } + + public Set
getPredecessorSet() { + Set
result = new HashSet
(); + for (Figure f : getPredecessors()) { + result.add(f); + } + return Collections.unmodifiableSet(result); + } + + public Set
getSuccessorSet() { + Set
result = new HashSet
(); + for (Figure f : getSuccessors()) { + result.add(f); + } + return Collections.unmodifiableSet(result); + } + + public List
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 connections = new ArrayList(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 getInputSlots() { + return Collections.unmodifiableList(inputSlots); + } + + public List 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()); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java --- /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 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() + "]"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java --- /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
selected(Diagram d) { + + List
result = new ArrayList
(); + List
otherResult = selector.selected(d); + for (Figure f : d.getFigures()) { + if (!otherResult.contains(f)) { + result.add(f); + } + } + + return result; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java --- /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
selected(Diagram d) { + Properties.PropertySelector
selector = new Properties.PropertySelector
(d.getFigures()); + List
list = selector.selectMultiple(matcher); + return list; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java --- /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
selected(Diagram d) { + + List
l1 = selector1.selected(d); + List
l2 = selector2.selected(d); + + for (Figure f : l2) { + if (!l1.contains(f)) { + l1.add(f); + } + } + + return l1; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java --- /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() + "]"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java --- /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
selected(Diagram d) { + List
inner = innerSelector.selected(d); + List
result = new ArrayList
(); + 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java --- /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
selected(Diagram d); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java --- /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 connections; + private Figure figure; + + protected Slot(Figure figure, int wantedIndex) { + this.figure = figure; + connections = new ArrayList(2); + source = new Source(); + this.wantedIndex = wantedIndex; + name = ""; + shortName = ""; + assert figure != null; + } + public static final Comparator slotIndexComparator = new Comparator() { + + public int compare(Slot o1, Slot o2) { + return o1.wantedIndex - o2.wantedIndex; + } + }; + public static final Comparator slotFigureComparator = new Comparator() { + + 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 getConnections() { + return Collections.unmodifiableList(connections); + } + + public void removeAllConnections() { + List connectionsCopy = new ArrayList(this.connections); + for (Connection c : connectionsCopy) { + c.remove(); + } + } + + public Vertex getVertex() { + return figure; + } + + public abstract int getPosition(); + + public abstract void setPosition(int position); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java --- /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 sourceNodes; + private Set set; + + public Source() { + sourceNodes = new ArrayList(1); + } + + public List getSourceNodes() { + return Collections.unmodifiableList(sourceNodes); + } + + public Set getSourceNodesAsSet() { + if (set == null) { + set = new HashSet(); + 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 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java --- /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
selected(Diagram d) { + List
inner = innerSelector.selected(d); + List
result = new ArrayList
(); + 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.hierarchicallayout. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.hierarchicallayout + + + + com.sun.hotspot.igv.layout + + + + 1.0 + + + + + com.sun.hotspot.igv.hierarchicallayout + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java --- /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 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 p) { + this.points = p; + } + + public List getControlPoints() { + return points; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java --- /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 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(); + + 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 p) { + this.controlPoints = p; + } + + public List getControlPoints() { + return controlPoints; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java --- /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()); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java --- /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 subNodes; + private Dimension size; + private Point position; + private Set 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(); + this.subEdges = new HashSet(); + 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 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 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 points = new ArrayList(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 arr = e.getControlPoints(); + ArrayList newArr = new ArrayList(); + 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 getSubNodes() { + return subNodes; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java --- /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 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(); + + outputSlot = c.getFrom(); + inputSlot = outputSlotNode.getInputSlot(); + } + + public Port getTo() { + return inputSlot; + } + + public Port getFrom() { + return outputSlot; + } + + public void setControlPoints(List p) { + this.intermediatePoints = p; + } + + public List getControlPoints() { + return intermediatePoints; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java --- /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()); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java --- /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 { + + private E data; + private Node source; + private Node dest; + + protected Edge(Graph graph, Node source, Node 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 getSource() { + return source; + } + + public Node 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 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java --- /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 { + + private Hashtable> nodes; + private Hashtable> edges; + private List> nodeList; + + public Graph() { + nodes = new Hashtable>(); + edges = new Hashtable>(); + nodeList = new ArrayList>(); + } + + public Node createNode(N data, Object key) { + Node n = new Node(this, data); + assert key == null || !nodes.containsKey(key); + if (key != null) { + nodes.put(key, n); + } + nodeList.add(n); + return n; + } + + public Edge createEdge(Node source, Node dest, E data, Object key) { + Edge e = new Edge(this, source, dest, data); + source.addOutEdge(e); + dest.addInEdge(e); + if (key != null) { + edges.put(key, e); + } + return e; + } + + public Node getNode(Object key) { + return nodes.get(key); + } + + public Edge getEdge(Object key) { + return edges.get(key); + } + + public Collection> getEdges() { + return Collections.unmodifiableCollection(edges.values()); + } + + public Collection> getNodes() { + return Collections.unmodifiableList(nodeList); + } + + public void removeEdge(Edge 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) { + } + + public boolean visitEdge(Edge e, boolean backEdge) { + return true; + } + } + + public class BFSTraversalVisitor { + + public void visitNode(Node n, int depth) { + } + } + + public List> getNodesWithInDegree(int x) { + return getNodesWithInDegree(x, true); + } + + public List> getNodesWithInDegree(int x, boolean countSelfLoops) { + + List> result = new ArrayList>(); + for (Node n : getNodes()) { + if (n.getInDegree(countSelfLoops) == x) { + result.add(n); + } + } + + return result; + + } + + private void markReachable(Node startingNode) { + ArrayList> arr = new ArrayList>(); + arr.add(startingNode); + for (Node n : getNodes()) { + n.setReachable(false); + } + traverseDFS(arr, new DFSTraversalVisitor() { + + @Override + public void visitNode(Node n) { + n.setReachable(true); + } + }); + } + + public void traverseBFS(Node startingNode, BFSTraversalVisitor tv, boolean longestPath) { + + if (longestPath) { + markReachable(startingNode); + } + + for (Node n : getNodes()) { + n.setVisited(false); + n.setActive(false); + } + + Queue> queue = new LinkedList>(); + queue.add(startingNode); + startingNode.setVisited(true); + int layer = 0; + Node lastOfLayer = startingNode; + Node lastAdded = null; + + while (!queue.isEmpty()) { + + Node current = queue.poll(); + tv.visitNode(current, layer); + current.setActive(false); + + + for (Edge e : current.getOutEdges()) { + if (!e.getDest().isVisited()) { + + boolean allow = true; + if (longestPath) { + for (Node 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> startingNodes, DFSTraversalVisitor tv) { + + for (Node n : getNodes()) { + n.setVisited(false); + n.setActive(false); + } + + boolean result = false; + for (Node n : startingNodes) { + traverse(tv, n); + } + } + + private void traverse(DFSTraversalVisitor tv, Node n) { + + if (!n.isVisited()) { + n.setVisited(true); + n.setActive(true); + tv.visitNode(n); + + for (Edge e : n.getOutEdges()) { + + Node 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 : getNodes()) { + n.setVisited(false); + n.setActive(false); + } + + boolean result = false; + for (Node n : getNodes()) { + result |= checkCycles(n); + if (result) { + break; + } + } + return result; + } + + private boolean checkCycles(Node n) { + + if (n.isActive()) { + return true; + } + + if (!n.isVisited()) { + + n.setVisited(true); + n.setActive(true); + + for (Node 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 : getNodes()) { + s.append(n.toString()); + s.append("\n"); + } + + s.append("Edges: "); + + for (Edge e : getEdges()) { + s.append(e.toString()); + s.append("\n"); + } + + return s.toString(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java --- /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(), new HashSet(), new HashSet()); + } + + public void setSubManager(LayoutManager manager) { + this.subManager = manager; + } + + public void setManager(LayoutManager manager) { + this.manager = manager; + } + + public void doLayout(LayoutGraph graph, Set firstLayerHint, Set lastLayerHint, Set importantLinks) { + + assert graph.verify(); + + Hashtable> lists = new Hashtable>(); + Hashtable> listsConnection = new Hashtable>(); + Hashtable> clusterInputSlotHash = new Hashtable>(); + Hashtable> clusterOutputSlotHash = new Hashtable>(); + + Hashtable clusterNodes = new Hashtable(); + Hashtable> clusterInputSlotSet = new Hashtable>(); + Hashtable> clusterOutputSlotSet = new Hashtable>(); + Set clusterEdges = new HashSet(); + Set interClusterEdges = new HashSet(); + Hashtable linkClusterOutgoingConnection = new Hashtable(); + Hashtable linkInterClusterConnection = new Hashtable(); + Hashtable linkClusterIngoingConnection = new Hashtable(); + Set clusterNodeSet = new HashSet(); + + Set cluster = graph.getClusters(); + int z = 0; + for (Cluster c : cluster) { + lists.put(c, new ArrayList()); + listsConnection.put(c, new ArrayList()); + clusterInputSlotHash.put(c, new Hashtable()); + clusterOutputSlotHash.put(c, new Hashtable()); + clusterOutputSlotSet.put(c, new TreeSet()); + clusterInputSlotSet.put(c, new TreeSet()); + 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()); + n.updateSize(); + } + + Set 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(), new HashSet(), 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 points = new ArrayList(); + + points.addAll(conn1.getControlPoints()); + points.addAll(conn2.getControlPoints()); + points.addAll(conn3.getControlPoints()); + + l.setControlPoints(points); + } + } + } + + public void doRouting(LayoutGraph graph) { + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java --- /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 reversedLinks; + private List nodes; + private HashMap vertexToLayoutNode; + private HashMap> reversedLinkStartPoints; + private HashMap> reversedLinkEndPoints; + private HashMap bottomEdgeHash; + private HashMap> splitStartPoints; + private HashMap> splitEndPoints; + private LayoutGraph graph; + private List[] layers; + private int layerCount; + private Set firstLayerHint; + private Set lastLayerHint; + private Set importantLinks; + private Set 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 preds = new ArrayList(); + public List succs = new ArrayList(); + public HashMap outOffsets = new HashMap(); + public HashMap inOffsets = new HashMap(); + 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(); + } + + 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(), new HashSet(), new HashSet()); + + } + + public void doLayout(LayoutGraph graph, Set firstLayerHint, Set lastLayerHint, Set importantLinks) { + + this.importantLinks = importantLinks; + this.graph = graph; + this.firstLayerHint = firstLayerHint; + this.lastLayerHint = lastLayerHint; + + vertexToLayoutNode = new HashMap(); + reversedLinks = new HashSet(); + reversedLinkStartPoints = new HashMap>(); + reversedLinkEndPoints = new HashMap>(); + bottomEdgeHash = new HashMap(); + nodes = new ArrayList(); + splitStartPoints = new HashMap>(); + splitEndPoints = new HashMap>(); + + // ############################################################# + // Step 1: Build up data structure + new BuildDatastructure().start(); + + // ############################################################# + // STEP 2: Reverse edges, handle backedges + new ReverseEdges().start(); + + for (LayoutNode n : nodes) { + ArrayList tmpArr = new ArrayList(); + 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 vertexPositions = new HashMap(); + HashMap> linkPositions = new HashMap>(); + 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 points = new ArrayList(); + + 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 points = new ArrayList(); + 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 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 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 nodes = new ArrayList(); + public HashSet succs = new HashSet(); + public HashSet preds = new HashSet(); + public Region region; + } + private static final Comparator segmentComparator = new Comparator() { + + public int compare(Segment s1, Segment s2) { + return s1.orderNumber - s2.orderNumber; + } + }; + + private static class Region { + + public float d; + public int minOrderNumber; + public SortedSet segments = new TreeSet(segmentComparator); + public HashSet succs = new HashSet(4); + public HashSet preds = new HashSet(4); + } + private static final Comparator regionComparator = new Comparator() { + + public int compare(Region r1, Region r2) { + return r1.minOrderNumber - r2.minOrderNumber; + } + }; + private static final Comparator nodePositionComparator = new Comparator() { + + public int compare(LayoutNode n1, LayoutNode n2) { + return n1.pos - n2.pos; + } + }; + private static final Comparator nodeProcessingDownComparator = new Comparator() { + + 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 nodeProcessingUpComparator = new Comparator() { + + 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[] space; + private ArrayList[] downProcessingOrder; + private ArrayList[] 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(); + downProcessingOrder[i] = new ArrayList(); + upProcessingOrder[i] = new ArrayList(); + + 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 values = new ArrayList(); + 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 values = new ArrayList(); + 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 values = new ArrayList(); + 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 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= 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 treeSet; + private ArrayList space; + + public NodeRow(ArrayList space) { + treeSet = new TreeSet(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 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 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 hashMap = new HashMap(); + ArrayList segments = new ArrayList(); + + 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 queue = new LinkedList(); + + int index = 0; + ArrayList newList = new ArrayList(); + 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 regions = new TreeSet(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 reversedRegions = new ArrayList(); + 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 arr = new ArrayList(); + 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 crossingNodeComparator = new Comparator() { + + 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(); + } + + + // Generate initial ordering + HashSet visited = new HashSet(); + 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 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) { + 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 visited = new HashSet(); + 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 comparator = new Comparator() { + + public int compare(LayoutEdge e1, LayoutEdge e2) { + return e1.to.layer - e2.to.layer; + } + }; + HashMap> portHash = new HashMap>(); + ArrayList currentNodes = new ArrayList(nodes); + for (LayoutNode n : currentNodes) { + portHash.clear(); + + ArrayList succs = new ArrayList(n.succs); + HashMap topNodeHash = new HashMap(); + HashMap> bottomNodeHash = new HashMap>(); + 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()); + } + + HashMap 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()); + } + + if (n.vertex.toString().equals("1012 CastPP")) { + int x = 0; + } + + portHash.get(i).add(e); + } + } + } + + succs = new ArrayList(n.succs); + for (LayoutEdge e : succs) { + + Integer i = e.relativeFrom; + if (portHash.containsKey(i)) { + + List 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 currentNodes = new ArrayList(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 currentNodes = new ArrayList(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 set = new HashSet(); + for (LayoutNode n : nodes) { + if (n.preds.size() == 0) { + set.add(n); + n.layer = 0; + } + } + + int z = minLayerDifference; + HashSet newSet = new HashSet(); + HashSet failed = new HashSet(); + 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 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 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 visited; + private HashSet active; + + protected void run() { + + // Remove self-edges, TODO: Special treatment + for (LayoutNode node : nodes) { + ArrayList succs = new ArrayList(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(); + active = new HashSet(); + for (LayoutNode node : nodes) { + DFS(node); + } + + + for (LayoutNode node : nodes) { + + SortedSet reversedDown = new TreeSet(); + + for (LayoutEdge e : node.succs) { + if (reversedLinks.contains(e.link)) { + reversedDown.add(e.relativeFrom); + } + } + + + SortedSet reversedUp = null; + if (reversedDown.size() == 0) { + reversedUp = new TreeSet(Collections.reverseOrder()); + } else { + reversedUp = new TreeSet(); + } + + 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 reversedSuccs = new ArrayList(); + for (LayoutEdge e : node.succs) { + if (e.relativeFrom == pos && reversedLinks.contains(e.link)) { + reversedSuccs.add(e); + e.relativeFrom = curWidth; + } + } + + ArrayList startPoints = new ArrayList(); + 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 reversedPreds = new ArrayList(); + 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 endPoints = new ArrayList(); + + 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 stack = new Stack(); + 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 succs = new ArrayList(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 curVisited = new HashSet(); + Queue queue = new LinkedList(); + 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 linkComparator = new Comparator() { + + 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 vertices = new ArrayList(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 links = new ArrayList(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 + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java --- /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 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(); + } + + public ClusterOutputSlotNode getOutputSlotNode() { + return outputSlotNode; + } + + public Port getTo() { + return inputSlot; + } + + public Port getFrom() { + return outputSlot; + } + + public void setControlPoints(List p) { + this.intermediatePoints = p; + } + + public List getControlPoints() { + return intermediatePoints; + } + + @Override + public String toString() { + return "InterClusterConnection[from=" + getFrom() + ", to=" + getTo() + "]"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java --- /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 { + + private N data; + private List> inEdges; + private List> outEdges; + private boolean visited; + private boolean active; + private boolean reachable; + private Graph 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 e : inEdges) { + if (e.getSource() != this) { + cnt++; + } + } + return cnt; + } + } + + public int getOutDegree() { + return outEdges.size(); + } + + protected Node(Graph graph, N data) { + setData(data); + this.graph = graph; + inEdges = new ArrayList>(); + outEdges = new ArrayList>(); + } + + protected void addInEdge(Edge e) { + inEdges.add(e); + } + + public Graph getGraph() { + return graph; + } + + protected void addOutEdge(Edge e) { + outEdges.add(e); + } + + protected void removeInEdge(Edge e) { + //assert inEdges.contains(e); + inEdges.remove(e); + } + + protected void removeOutEdge(Edge e) { + //assert outEdges.contains(e); + outEdges.remove(e); + } + + public List> getInEdges() { + return Collections.unmodifiableList(inEdges); + } + + public List> getOutEdges() { + return Collections.unmodifiableList(outEdges); + } + + public List> getSuccessors() { + ArrayList> succ = new ArrayList>(); + for (Edge e : getOutEdges()) { + Node n = e.getDest(); + if (!succ.contains(n)) { + succ.add(n); + } + } + return succ; + } + + public List> getPredecessors() { + ArrayList> pred = new ArrayList>(); + for (Edge e : getInEdges()) { + Node 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java --- /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 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(); + 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 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 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 startPoints; + private List 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(); + endPoints = new ArrayList(); + this.important = true; + } + + public boolean isImportant() { + return important; + } + + public void setImportant(boolean b) { + this.important = b; + } + + public List getStartPoints() { + return startPoints; + } + + public List getEndPoints() { + return endPoints; + } + + public List getAbsoluteEndPoints() { + if (endPoints.size() == 0) { + return endPoints; + } + + List result = new ArrayList(); + 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 getAbsoluteStartPoints() { + if (startPoints.size() == 0) { + return startPoints; + } + + List result = new ArrayList(); + 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 graph; + private Map> 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 nodes, List edges) { + public void doLayout(LayoutGraph layoutGraph) { + doLayout(layoutGraph, new HashSet(), new HashSet()); + } + + public void doLayout(LayoutGraph layoutGraph, Set firstLayerHint, Set lastLayerHint) { + doLayout(layoutGraph, firstLayerHint, lastLayerHint, new HashSet()); + } + + public void doLayout(LayoutGraph layoutGraph, Set firstLayerHint, Set lastLayerHint, Set 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>(); + + graph = new Graph(); + + Set> rootNodes = new HashSet>(); + Set startRootVertices = new HashSet(); + + for (Vertex v : layoutGraph.getVertices()) { + if (v.isRoot()) { + startRootVertices.add(v); + } + } + + rootVertexTiming.start(); + Set rootVertices = layoutGraph.findRootVertices(startRootVertices); + rootVertexTiming.stop(); + + + for (Vertex node : layoutGraph.getVertices()) { + + NodeData data = new NodeData(node); + Node n = graph.createNode(data, node); + nodeMap.put(node, n); + + if (rootVertices.contains(node)) { + rootNodes.add(n); + } + } + + Set links = layoutGraph.getLinks(); + Link[] linkArr = new Link[links.size()]; + links.toArray(linkArr); + + List linkList = new ArrayList(); + for (Link l : linkArr) { + linkList.add(l); + } + + createEdgesTiming.start(); + Collections.sort(linkList, new Comparator() { + + 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 n : graph.getNodes()) { + List> edges = new ArrayList>(n.getOutEdges()); + Collections.sort(edges, new Comparator>() { + + public int compare(Edge o1, Edge o2) { + return o2.getData().getRelativeEnd().x - o1.getData().getRelativeEnd().x; + } + }); + + + for (Edge e : edges) { + + if (e.getData().isReversed()) { + e.getSource().getData().addReversedEndEdge(e); + } + } + } + + for (Node n : graph.getNodes()) { + List> edges = new ArrayList>(n.getInEdges()); + Collections.sort(edges, new Comparator>() { + + public int compare(Edge o1, Edge o2) { + return o2.getData().getRelativeStart().x - o1.getData().getRelativeStart().x; + } + }); + + + for (Edge 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 n : graph.getNodes()) { + // maxLayer = Math.max(maxLayer, n.getData().getLayer()); + //} + + + ArrayList> layers[] = new ArrayList[maxLayer + 1]; + int layerSizes[] = new int[maxLayer + 1]; + for (int i = 0; i < maxLayer + 1; i++) { + layers[i] = new ArrayList>(); + } + + for (Node 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 n : graph.getNodes()) { + if (!n.getData().isDummy()) { + + Vertex node = n.getData().getNode(); + node.setPosition(new Point(n.getData().getX(), n.getData().getY())); + } + } + + for (Node n : graph.getNodes()) { + if (!n.getData().isDummy()) { + + Vertex node = n.getData().getNode(); + + List> outEdges = n.getOutEdges(); + for (Edge e : outEdges) { + Node succ = e.getDest(); + if (succ.getData().isDummy()) { + //PositionedEdge edge = succ.getData().getEdge(); + List points = new ArrayList(); + assignToRealObjects(layerSizes, succ, points); + } else { + List points = new ArrayList(); + + 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 cur, List points) { + assert cur.getData().isDummy(); + + ArrayList otherPoints = new ArrayList(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 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 middlePoints = new ArrayList(otherPoints); + if (cur.getOutEdges().get(i).getData().isReversed()) { + Collections.reverse(middlePoints); + } + + ArrayList copy = new ArrayList(); + 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 e : graph.getEdges()) { + if (e.getSource().getData().getLayer() != e.getDest().getData().getLayer() - 1) { + return false; + } + } + + return true; + } + + private void insertDummyNodes(ArrayList> layers[]) { + + int sum = 0; + List> nodes = new ArrayList>(graph.getNodes()); + int edgeCount = 0; + int innerMostLoop = 0; + + for (Node n : nodes) { + List> edges = new ArrayList>(n.getOutEdges()); + for (Edge e : edges) { + + edgeCount++; + Link edge = e.getData().getEdge(); + Node destNode = e.getDest(); + Node lastNode = n; + Edge lastEdge = e; + + boolean searchForNode = (combine != Combine.NONE); + for (int i = n.getData().getLayer() + 1; i < destNode.getData().getLayer(); i++) { + + Node foundNode = null; + if (searchForNode) { + for (Node 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 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> layers[], int layerSizes[]) { + int cur = 0; + for (int i = 0; i < layers.length; i++) { + int maxHeight = 0; + for (Node n : layers[i]) { + maxHeight = Math.max(maxHeight, n.getData().getHeight()); + } + + layerSizes[i] = maxHeight; + for (Node n : layers[i]) { + int curCoordinate = cur + (maxHeight - n.getData().getHeight()) / 2; + n.getData().setLayerCoordinate(curCoordinate); + } + cur += maxHeight + layerOffset; + + } + } + + private void assignCoordinates(ArrayList> layers[]) { + + // TODO: change this + for (int i = 0; i < layers.length; i++) { + ArrayList> curArray = layers[i]; + int curY = 0; + for (Node 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>() { + + public int compare(Node o1, Node 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 n : graph.getNodes()) { + min = Math.min(min, n.getData().getCoordinate()); + } + + for (Node n : graph.getNodes()) { + n.getData().setCoordinate(n.getData().getCoordinate() - min); + } + + } + + private void optimizeMedian(ArrayList> layers[]) { + + // Downsweep + for (int i = 1; i < layers.length; i++) { + + ArrayList> processingList = layers[i]; + ArrayList> alreadyAssigned = new ArrayList>(); + for (Node n : processingList) { + + + ArrayList> preds = new ArrayList>(n.getPredecessors()); + int pos = n.getData().getCoordinate(); + if (preds.size() > 0) { + + Collections.sort(preds, new Comparator>() { + + public int compare(Node o1, Node 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> processingList = layers[i]; + ArrayList> alreadyAssigned = new ArrayList>(); + for (Node n : processingList) { + + ArrayList> succs = new ArrayList>(n.getSuccessors()); + int pos = n.getData().getCoordinate(); + if (succs.size() > 0) { + + Collections.sort(succs, new Comparator>() { + + public int compare(Node o1, Node 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 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 n, Node succ) { + + if (n.getData().isDummy() && succ.getData().isDummy()) { + return 0; + } + + int pos = 0; + int pos2 = 0; + ArrayList coords2 = new ArrayList(); + ArrayList coords = new ArrayList(); + /*if(!n.getData().isDummy())*/ { + for (Edge 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 n1, Node n2) { + return intersect(n1.getData().getCoordinate(), n1.getData().getWidth() + OFFSET, n2.getData().getCoordinate(), n2.getData().getWidth() + OFFSET); + } + + private void tryAdding(List> alreadyAssigned, Node node, int pos) { + + boolean doesIntersect = false; + node.getData().setCoordinate(pos); + for (Node 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 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 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 curNode = alreadyAssigned.get(i); + Node 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> nodes, Node node) { + + for (Node n1 : nodes) { + if (intersect(n1, node)) { + return true; + } + } + + return false; + } + + private int evaluateSolution() { + + int sum = 0; + for (Edge e : graph.getEdges()) { + Node source = e.getSource(); + Node dest = e.getDest(); + int offset = 0; + offset = Math.abs(source.getData().getCoordinate() - dest.getData().getCoordinate()); + sum += offset; + } + + return sum; + } + + private void crossingReduction(ArrayList> layers[]) { + + for (int i = 0; i < layers.length - 1; i++) { + + ArrayList> curNodes = layers[i]; + ArrayList> nextNodes = layers[i + 1]; + for (Node n : curNodes) { + for (Node succ : n.getSuccessors()) { + if (ASSERT) { + assert nextNodes.contains(succ); + } + nextNodes.remove(succ); + nextNodes.add(succ); + } + } + + } + + } + + private void removeCycles(Set> rootNodes) { + final List> reversedEdges = new ArrayList>(); + + + int removedCount = 0; + int reversedCount = 0; + + Graph.DFSTraversalVisitor visitor = graph.new DFSTraversalVisitor() { + + @Override + public boolean visitEdge(Edge 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> nodes = new HashSet>(); + nodes.addAll(rootNodes); + + assert nodes.size() > 0; + + this.graph.traverseDFS(nodes, visitor); + + for (Edge 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> rootNodes, Set firstLayerHints, + Set lastLayerHints) { + this.maxLayerTemp = -1; + for (Node n : graph.getNodes()) { + n.getData().setLayer(-1); + } + + Graph.BFSTraversalVisitor traverser = graph.new BFSTraversalVisitor() { + + @Override + public void visitNode(Node n, int depth) { + if (depth > n.getData().getLayer()) { + n.getData().setLayer(depth); + maxLayerTemp = Math.max(maxLayerTemp, depth); + } + } + }; + + for (Node 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 e : graph.getEdges()) { + Node source = e.getSource(); + Node dest = e.getDest(); + + + if (source.getData().getLayer() >= dest.getData().getLayer()) { + return false; + } + } + int maxLayer = 0; + for (Node 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 n : graph.getNodes()) { + countPerLayer[n.getData().getLayer()]++; + } + + if (TRACE) { + System.out.println("Number of layers: " + maxLayer); + } + return true; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.layout. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.layout + + + + com.sun.hotspot.igv.layout + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java --- /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 { + + public Cluster getOuter(); + + public void setBounds(Rectangle r); + + public Set getSuccessors(); + + public Set getPredecessors(); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java --- /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 links; + private SortedSet vertices; + private Hashtable> inputPorts; + private Hashtable> outputPorts; + private Hashtable> portLinks; + + public LayoutGraph(Set links) { + this(links, new HashSet()); + } + + public LayoutGraph(Set links, Set additionalVertices) { + this.links = links; + assert verify(); + + vertices = new TreeSet(); + portLinks = new Hashtable>(); + inputPorts = new Hashtable>(); + outputPorts = new Hashtable>(); + + 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(1)); + inputPorts.put(v1, new HashSet(3)); + vertices.add(v1); + assert vertices.contains(v1); + } + + if (!vertices.contains(v2)) { + vertices.add(v2); + assert vertices.contains(v2); + outputPorts.put(v2, new HashSet(1)); + inputPorts.put(v2, new HashSet(3)); + } + + if (!portLinks.containsKey(p)) { + HashSet hashSet = new HashSet(3); + portLinks.put(p, hashSet); + } + + if (!portLinks.containsKey(p2)) { + portLinks.put(p2, new HashSet(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(1)); + inputPorts.put(v, new HashSet(3)); + vertices.add(v); + vertices.contains(v); + } + } + } + + public Set getInputPorts(Vertex v) { + return this.inputPorts.get(v); + } + + public Set getOutputPorts(Vertex v) { + return this.outputPorts.get(v); + } + + public Set getPortLinks(Port p) { + return portLinks.get(p); + } + + public Set getLinks() { + return links; + } + + public boolean verify() { + return true; + } + + public SortedSet getVertices() { + return vertices; + } + + private void markNotRoot(Set notRootSet, Vertex v, Vertex startingVertex) { + + if (notRootSet.contains(v)) { + return; + } + if (v != startingVertex) { + notRootSet.add(v); + } + Set outPorts = getOutputPorts(v); + for (Port p : outPorts) { + Set 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 findRootVertices(Set startingRoots) { + + Set notRootSet = new HashSet(); + for (Vertex v : startingRoots) { + if (!notRootSet.contains(v)) { + markNotRoot(notRootSet, v, v); + } + } + + Set 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 result = new HashSet(); + for (Vertex v : tmpVertices) { + if (!notRootSet.contains(v)) { + result.add(v); + } + } + assert tmpVertices.size() == 0 || result.size() > 0; + return result; + } + + public Set findRootVertices() { + return findRootVertices(new HashSet()); + } + + public SortedSet getClusters() { + + SortedSet clusters = new TreeSet(); + for (Vertex v : getVertices()) { + if (v.getCluster() != null) { + clusters.add(v.getCluster()); + } + } + + return clusters; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java --- /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 firstLayerHint, Set lastLayerHint, Set importantLinks); + + public void doRouting(LayoutGraph graph); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java --- /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 getControlPoints(); + + public void setControlPoints(List list); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java --- /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(); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java --- /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 { + + public Cluster getCluster(); + + public Dimension getSize(); + + public Point getPosition(); + + public void setPosition(Point p); + + public boolean isRoot(); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.connection. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.connection + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.settings + + + + 1.0 + + + + org.openide.awt + + + + 6.11.1.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.util + + + + 7.10.1.1 + + + + + com.sun.hotspot.igv.connection + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupReceiver --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java --- /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) { + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java --- /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); + } + }); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/layer.xml --- /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 @@ + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/README --- /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. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.rhino. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.rhino + + + + com.sun.hotspot.igv.filter + + + + 1.0 + + + + com.sun.hotspot.igv.graph + + + + 1.0 + + + + + com.sun.hotspot.igv.rhino + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/META-INF/services/com.sun.hotspot.igv.filter.ScriptEngineAbstraction --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java --- /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, "", 1, null); + } finally { + // Exit from the context. + context_exit.invoke(null, (Object[]) null); + } + } catch (InvocationTargetException iae) { + } catch (IllegalAccessException iae) { + } catch (InstantiationException iae) { + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/layer.xml --- /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 @@ + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.servercompilerscheduler. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.servercompiler + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.GroupOrganizer --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/META-INF/services/com.sun.hotspot.igv.data.services.Scheduler --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java --- /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>> organize(List subFolders, List groups) { + + List>> result = new ArrayList>>(); + + 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 children = new ArrayList(); + children.add(g); + Pair> p = new Pair>(); + p.setLeft(reducedNameProvider.getName(g)); + p.setRight(children); + result.add(p); + } + } else { + result.add(new Pair>("", groups)); + } + + return result; + } + + private void buildResult(List>> result, List groups, NameProvider provider) { + HashMap> map = new HashMap>(); + for (Group g : groups) { + String s = provider.getName(g); + + if (!map.containsKey(s)) { + List list = new ArrayList(); + Pair> pair = new Pair>(s, list); + result.add(pair); + map.put(s, list); + } + + List curList = map.get(s); + curList.add(g); + } + + Collections.sort(result, new Comparator>>() { + + public int compare(Pair> a, Pair> 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 = ""; + + 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 = ""; + + 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; + } + }; +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java --- /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 succs = new HashSet(); + public List preds = new ArrayList(); + public InputBlock block; + public boolean isBlockProjection; + public boolean isBlockStart; + } + private InputGraph graph; + private Collection nodes; + private Map inputNodeToNode; + private Vector blocks; + private Map dominatorMap; + private Map blockIndex; + private InputBlock[][] commonDominator; + private static final Comparator edgeComparator = new Comparator() { + + public int compare(InputEdge o1, InputEdge o2) { + return o1.getToIndex() - o2.getToIndex(); + } + }; + + public void buildBlocks() { + + blocks = new Vector(); + Node root = findRoot(); + if (root == null) { + return; + } + Stack stack = new Stack(); + Set visited = new HashSet(); + 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(); + for (InputBlock b : blocks) { + blockIndex.put(b, z); + z++; + } + } + + private String getBlockName(InputNode n) { + return n.getProperties().get("block"); + } + + public Collection schedule(InputGraph graph) { + if (graph.getBlocks().size() > 0) { + Collection tmpNodes = new ArrayList(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(); + inputNodeToNode = new HashMap(); + + 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 reachable = new HashSet(); + reachable.add(root); + Stack stack = new Stack(); + 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 unscheduled = new HashSet(); + for (Node n : this.nodes) { + if (n.block == null && reachable.contains(n)) { + unscheduled.add(n); + } + } + + while (unscheduled.size() > 0) { + boolean progress = false; + + Set newUnscheduled = new HashSet(); + 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 curReachable = new HashSet(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 reachable) { + assert !reachable.contains(n); + Stack stack = new Stack(); + 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 pred; + List 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 visited = new HashSet(); + 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(); + if (blocks.size() == 0) { + return; + } + Vector intermediate = new Vector(); + Map map = new HashMap(); + 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(); + bi.bucket = new ArrayList(); + intermediate.add(bi); + map.put(b, bi); + z++; + } + Stack stack = new Stack(); + stack.add(0); + + Vector array = new Vector(); + 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 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 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 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> edgeMap = new HashMap>(); + for (InputEdge e : graph.getEdges()) { + + int to = e.getTo(); + if (!edgeMap.containsKey(to)) { + edgeMap.put(to, new ArrayList()); + } + + + List list = edgeMap.get(to); + list.add(e); + } + + + for (Integer i : edgeMap.keySet()) { + + List 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); + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/color.filter --- /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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/combine.filter --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/difference.filter --- /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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/extendedColor.filter --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/linestyle.filter --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/matchingFlags.filter --- /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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/onlyControlFlow.filter --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/register.filter --- /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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/remove.filter --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeMemory.filter --- /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"); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeRootInputs.filter --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSafepointInputs.filter --- /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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/removeSelfLoops.filter --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/filters/split.filter --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/layer.xml --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.settings. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.settings + + + + org.jdesktop.layout + + + + 1 + 1.4 + + + + org.netbeans.modules.options.api + + + + 1 + 1.5 + + + + org.openide.awt + + + + 6.11.0.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + + com.sun.hotspot.igv.settings + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.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.form Wed Jul 05 16:39:00 2017 +0200 @@ -0,0 +1,121 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java --- /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. + */ + // //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)) + ); + }// //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 +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/layer.xml --- /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 @@ + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/settings.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.util. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.util + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + org.netbeans.api.visual + + + + 2.9 + + + + org.openide.nodes + + + + 7.2.1.1 + + + + org.openide.util + + + + 7.10.1.1 + + + + + com.sun.hotspot.igv.util + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java --- /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 extends CallableSystemAction implements LookupListener, ContextAwareAction { + + private Lookup context = null; + private Lookup.Result 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 contextClass(); + + public abstract void performAction(T context); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java --- /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); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java --- /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) { + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java --- /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 prop = new Node.Property(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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java --- /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, 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 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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java --- /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 { + + // Warning: Update setData method if fields are added + private ChangedEvent changedEvent; + private ChangedEvent colorChangedEvent; + private List positions; + private int firstPosition; + private int secondPosition; + private List 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 positions) { + assert positions.size() > 0; + this.positions = positions; + this.changedEvent = new ChangedEvent(this); + this.colorChangedEvent = new ChangedEvent(this); + colors = new ArrayList(); + for (int i = 0; i < positions.size(); i++) { + colors.add(Color.black); + } + } + + public void setColors(List colors) { + this.colors = colors; + colorChangedEvent.fire(); + } + + public List getColors() { + return colors; + } + + public RangeSliderModel copy() { + RangeSliderModel newModel = new RangeSliderModel(positions); + newModel.firstPosition = firstPosition; + newModel.secondPosition = secondPosition; + newModel.colors = colors; + return newModel; + } + + public List 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 getColorChangedEvent() { + return colorChangedEvent; + } + + public ChangedEvent getChangedEvent() { + return changedEvent; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/build.xml --- /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 @@ + + + + + + Builds, tests, and runs the project com.sun.hotspot.igv.view. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/manifest.mf --- /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 + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/build-impl.xml --- /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 @@ + + + + + + You must set 'suite.dir' to point to your containing module suite + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project + + + com.sun.hotspot.igv.view + + + + com.sun.hotspot.igv.data + + + + 1.0 + + + + com.sun.hotspot.igv.difference + + + + 1.0 + + + + com.sun.hotspot.igv.filter + + + + 1.0 + + + + com.sun.hotspot.igv.graph + + + + 1.0 + + + + com.sun.hotspot.igv.hierarchicallayout + + + + 1.0 + + + + com.sun.hotspot.igv.layout + + + + 1.0 + + + + com.sun.hotspot.igv.settings + + + + 1.0 + + + + com.sun.hotspot.igv.svg + + + + 1.0 + + + + com.sun.hotspot.igv.util + + + + 1.0 + + + + org.netbeans.api.visual + + + + 2.9 + + + + org.openide.actions + + + + 6.6.0.1 + + + + org.openide.awt + + + + 6.11.0.1 + + + + org.openide.dialogs + + + + 7.5.1 + + + + org.openide.loaders + + + + 6.7 + + + + org.openide.nodes + + + + 7.2.1.1 + + + + org.openide.util + + + + 7.9.0.1 + + + + org.openide.windows + + + + 6.16 + + + + + com.sun.hotspot.igv.view + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/nbproject/suite.properties --- /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}/.. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.GraphViewer --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/META-INF/services/com.sun.hotspot.igv.data.services.InputGraphProvider --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java --- /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 { + + private Hashtable figureWidgets; + private Hashtable slotWidgets; + private Hashtable connectionWidgets; + private Hashtable blockWidgets; + private Widget hoverWidget; + private WidgetAction hoverAction; + private List 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 relativePositions = new HashMap(); + 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(); + 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(); + + 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(); + slotWidgets = new Hashtable(); + connectionWidgets = new Hashtable(); + + WidgetAction selectAction = new ExtendedSelectAction(selectProvider); + Diagram d = getModel().getDiagramToView(); + + if (getModel().getShowBlocks()) { + Scheduler s = Lookup.getDefault().lookup(Scheduler.class); + Collection newBlocks = new ArrayList(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 oldVisibleWidgets) { + + Diagram diagram = getModel().getDiagramToView(); + + HashSet
figures = new HashSet
(); + + for (Figure f : diagram.getFigures()) { + FigureWidget w = figureWidgets.get(f); + if (w.isVisible()) { + figures.add(f); + } + } + + HashSet edges = new HashSet(); + + 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 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 connections, int controlPointIndex, Point lastPoint, LineWidget predecessor, int offx, int offy, SceneAnimator animator) { + Map> pointMap = new HashMap>(); + + for (Connection c : connections) { + + if (!isVisible(c)) { + continue; + } + + List 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 newList = new ArrayList(2); + newList.add(c); + pointMap.put(cur, newList); + } + + } + + for (Point p : pointMap.keySet()) { + List 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
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 nodes) { + clearSelection(); + for (Figure f : getModel().getDiagramToView().getFigures()) { + if (doesIntersect(f.getSource().getSourceNodesAsSet(), nodes)) { + addToSelection(f); + } + } + selectionUpdated(); + this.validate(); + } + + public void setSelection(Collection
list) { + clearSelection(); + for (Figure f : list) { + addToSelection(f); + } + + selectionUpdated(); + this.validate(); + } + + public Set
getSelectedFigures() { + Set
result = new HashSet
(); + for (Widget w : selectedWidgets) { + if (w instanceof FigureWidget) { + FigureWidget fw = (FigureWidget) w; + if (fw.getState().isSelected()) { + result.add(fw.getFigure()); + } + } + } + return result; + } + + public Set getSelectedNodes() { + Set result = new HashSet(); + 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 nodes) { + updateHiddenNodes(nodes, true); + } + + public void showOnly(final Set nodes) { + HashSet allNodes = new HashSet(getModel().getGraphToView().getGroup().getAllNodes()); + allNodes.removeAll(nodes); + updateHiddenNodes(allNodes, true); + } + + private void updateHiddenNodes(Set newHiddenNodes, boolean doRelayout) { + + Set visibleBlocks = new HashSet(); + + Diagram diagram = getModel().getDiagramToView(); + assert diagram != null; + + Set oldVisibleWidgets = new HashSet(); + + 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 boundaries = new ArrayList(); + for (Figure f : diagram.getFigures()) { + FigureWidget w = this.figureWidgets.get(f); + if (!w.isVisible()) { + Set
set = new HashSet
(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
f) { + HashSet newHiddenNodes = new HashSet(getModel().getHiddenNodes()); + for (Figure fig : f) { + newHiddenNodes.removeAll(fig.getSource().getSourceNodesAsSet()); + } + updateHiddenNodes(newHiddenNodes, true); + } + + private void showFigure(Figure f) { + HashSet newHiddenNodes = new HashSet(getModel().getHiddenNodes()); + newHiddenNodes.removeAll(f.getSource().getSourceNodesAsSet()); + updateHiddenNodes(newHiddenNodes, true); + } + + public void showAll(final Collection
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 { + + 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java --- /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 { + + // Warning: Update setData method if fields are added + private Group group; + private Set hiddenNodes; + private Set onScreenNodes; + private Set selectedNodes; + private FilterChain filterChain; + private FilterChain sequenceFilterChain; + private Diagram diagram; + private ChangedEvent diagramChangedEvent; + private ChangedEvent viewChangedEvent; + private ChangedEvent viewPropertiesChangedEvent; + private boolean showBlocks; + private boolean showNodeHull; + private ChangedListener filterChainChangedListener = new ChangedListener() { + + 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(); + onScreenNodes = new HashSet(); + selectedNodes = new HashSet(); + super.getChangedEvent().addListener(this); + diagramChangedEvent = new ChangedEvent(this); + viewChangedEvent = new ChangedEvent(this); + viewPropertiesChangedEvent = new ChangedEvent(this); + + filterChain.getChangedEvent().addListener(filterChainChangedListener); + sequenceFilterChain.getChangedEvent().addListener(filterChainChangedListener); + } + + public ChangedEvent getDiagramChangedEvent() { + return diagramChangedEvent; + } + + public ChangedEvent getViewChangedEvent() { + return viewChangedEvent; + } + + public ChangedEvent getViewPropertiesChangedEvent() { + return viewPropertiesChangedEvent; + } + + public Set getSelectedNodes() { + return Collections.unmodifiableSet(selectedNodes); + } + + public Set getHiddenNodes() { + return Collections.unmodifiableSet(hiddenNodes); + } + + public Set getOnScreenNodes() { + return Collections.unmodifiableSet(onScreenNodes); + } + + public void setSelectedNodes(Set nodes) { + this.selectedNodes = nodes; + List colors = new ArrayList(); + 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 nodes) { + this.hiddenNodes = nodes; + viewChangedEvent.fire(); + } + + public void setOnScreenNodes(Set 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 calculateStringList(Group g) { + List result = new ArrayList(); + 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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java --- /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 nodes) { + EditorTopComponent e = EditorTopComponent.getActive(); + if (e != null) { + e.setSelectedNodes(nodes); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.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.form Wed Jul 05 16:39:00 2017 +0200 @@ -0,0 +1,31 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java --- /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, 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 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. + */ + // //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()); + + }// //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
selector = new Properties.PropertySelector
(scene.getModel().getDiagramToView().getFigures()); + List
list = selector.selectMultiple(matcher); + boolean b = scene.getUndoRedoEnabled(); + scene.setUndoRedoEnabled(false); + scene.gotoFigures(list); + scene.setUndoRedoEnabled(b); + scene.setSelection(list); + } + + public void setSelectedNodes(Set nodes) { + + List
list = new ArrayList
(); + Set ids = new HashSet(); + 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 selectedNodes = this.scene.getSelectedNodes(); + HashSet nodes = new HashSet(scene.getModel().getHiddenNodes()); + nodes.addAll(selectedNodes); + this.scene.showNot(nodes); + } + + public void expandPredecessors() { + Set
oldSelection = scene.getSelectedFigures(); + Set
figures = new HashSet
(); + + 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
oldSelection = scene.getSelectedFigures(); + Set
figures = new HashSet
(); + + 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()); + } + + 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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java --- /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); +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java --- /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) { + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java --- /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
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
figures) { + + String sel = (String) nameComboBox.getSelectedItem(); + SortedSet propertyNames = new TreeSet(); + + 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) { + + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java --- /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"; +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java --- /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 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 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 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); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/Bundle.properties --- /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... diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java --- /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 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.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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java --- /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 implements ChangedListener { + + 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 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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java --- /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 implements ChangedListener { + + 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 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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/blocks.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/expand.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/export.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/extract.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/hide.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/next_diagram.png has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/overview.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/predsucc.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/prev_diagram.png has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/search.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomin.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/images/zoomout.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/layer.xml --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java --- /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 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 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= 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 getControlPoints() { + if (split) { + ArrayList result = new ArrayList(); + 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java --- /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 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(); + + 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
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 hiddenNodes = new HashSet(diagramScene.getModel().getGraphToView().getGroup().getAllNodes()); + hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet()); + this.diagramScene.showNot(hiddenNodes); + } else if (isBoundary()) { + + Set hiddenNodes = new HashSet(diagramScene.getModel().getHiddenNodes()); + hiddenNodes.removeAll(this.getFigure().getSource().getSourceNodesAsSet()); + this.diagramScene.showNot(hiddenNodes); + } else { + Set hiddenNodes = new HashSet(diagramScene.getModel().getHiddenNodes()); + hiddenNodes.addAll(this.getFigure().getSource().getSourceNodesAsSet()); + this.diagramScene.showNot(hiddenNodes); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java --- /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 slots = inputSlot.getFigure().getInputSlots(); + assert slots.contains(inputSlot); + return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(inputSlot)))); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java --- /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 connections; + private Point from; + private Point to; + private Rectangle clientArea; + private Color color = Color.BLACK; + private LineWidget predecessor; + private List successors; + private boolean highlighted; + private boolean popupVisible; + private boolean isBold; + private boolean isDashed; + + public LineWidget(DiagramScene scene, OutputSlot s, List 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(); + 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java --- /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 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(); + } + + @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> routeMap; + private List 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>(); + routeList = new ArrayList(); + color = Color.BLACK; + + for (Connection c : outputSlot.getConnections()) { + List 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 set = routeMap.get(r); + set.add(inputSlot); + } else { + SortedSet set = new TreeSet(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 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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java --- /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 slots = outputSlot.getFigure().getOutputSlots(); + assert slots.contains(outputSlot); + return new Point((int) x, (int) (calculateRelativeY(slots.size(), slots.indexOf(outputSlot)))); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java --- /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("" + slot.getName() + ""); + 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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/Bundle.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/frame.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif Binary file hotspot/src/share/tools/IdealGraphVisualizer/branding/core/core.jar/org/netbeans/core/startup/splash.gif has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/branding/modules/org-netbeans-core-windows.jar/org/netbeans/core/windows/view/ui/Bundle.properties --- /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} diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/build.xml --- /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 @@ + + + + + + Builds the module suite IdealGraphVisualizer. + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/nbproject/build-impl.xml --- /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 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/nbproject/genfiles.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/nbproject/platform.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.properties --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/IdealGraphVisualizer/nbproject/project.xml --- /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 @@ + + + org.netbeans.modules.apisupport.project.suite + + + IdealGraphVisualizer + + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/tools/MakeDeps/Database.java --- 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 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(); 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(); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/adlc/adlc.hpp --- 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 -#else -#include -#endif #include "string.h" #include "ctype.h" #include "stdarg.h" diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/adlc/filebuff.hpp --- 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 -#if _MSC_VER >= 1300 // Visual C++ 7.0 or later -#include -#else -#include -#endif - +using namespace std; // STRUCTURE FOR HANDLING INPUT AND OUTPUT FILES typedef struct { const char *_name; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/adlc/formssel.cpp --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp --- 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(); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/includeDB_compiler2 --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/memory/cardTableModRefBS.cpp --- 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))); } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/oops/symbolKlass.cpp --- 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("'"); } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/oops/symbolOop.cpp --- 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 { diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/callnode.cpp --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/cfgnode.cpp --- 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; } } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/cfgnode.hpp --- 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()), diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/compile.cpp --- 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 } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/connode.cpp --- 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)); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/connode.hpp --- 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; } }; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/escape.cpp --- 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"); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/gcm.cpp --- 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; } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/idealGraphPrinter.cpp --- 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; jlength(); 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("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 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(_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("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* 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* 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* blocks) { - Block *block2 = blocks->adr_at(index2); - block2->set_ancestor(index1); -} - -void IdealGraphPrinter::build_dominators(GrowableArray* blocks) { - - if (blocks->length() == 0) return; - - GrowableArray stack; - stack.append(0); - - GrowableArray 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; jpred()->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; jbucket()->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* 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; jchildren()->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; kadr_at(block->dominates()->at(k)); - common_dominator[child->index()][other_dominated->index()] = common_dominator[other_dominated->index()][child->index()] = index; - - for (int l=0 ; lchildren()->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* 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; jnode()->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; jlen(); 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 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 (; i2fast_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; jadd_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; jsuccs()->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; jnodes()->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; jnode()->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* IdealGraphPrinter::Block::bucket() { - return &_bucket; -} - -GrowableArray* IdealGraphPrinter::Block::children() { - return &_children; -} - -void IdealGraphPrinter::Block::add_child(int i) { - _children.append(i); -} - -GrowableArray* 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* 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* 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::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::succs() { - return &_succs; -} - -void IdealGraphPrinter::NodeDescription::clear_succs() { - _succs.clear(); -} - -void IdealGraphPrinter::NodeDescription::init_succs() { - _succs = GrowableArray(); -} - -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(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("<"); - break; - - case '>': - output()->print(">"); - break; - - default: - buf[0] = c; - output()->print(buf); - break; - } - } + return _xml; } #endif diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/idealGraphPrinter.hpp --- 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 *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 _succs; - int _block_index; - uintptr_t _id; - Properties _properties; - Node* _node; - - public: - - NodeDescription(Node* node); - ~NodeDescription(); - Node* node(); - - // void set_node(Node* node); - GrowableArray* 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 _succs; - GrowableArray _nodes; - GrowableArray _dominates; - GrowableArray _children; - int _semi; - int _parent; - GrowableArray _pred; - GrowableArray _bucket; - int _index; - int _dominator; - int _ancestor; - int _label; - - public: - - Block(); - Block(int index); - - void add_node(NodeDescription *n); - GrowableArray* nodes(); - GrowableArray* children(); - void add_child(int i); - void add_succ(int index); - GrowableArray* succs(); - GrowableArray* 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* bucket(); - void add_to_bucket(int i); - void clear_bucket(); - GrowableArray* 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 _nodes; - GrowableArray _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* blocks); - void build_common_dominator(int **common_dominator, int index, GrowableArray* blocks); - void compress(int index, GrowableArray* blocks); - int eval(int index, GrowableArray* blocks); - void link(int index1, int index2, GrowableArray* blocks); - void build_dominators(GrowableArray* 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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/library_call.cpp --- 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: diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/loopTransform.cpp --- 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) ); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/loopUnswitch.cpp --- 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)); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/loopnode.cpp --- 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); } } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/loopopts.cpp --- 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()); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/machnode.cpp --- 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 { diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/macro.cpp --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/matcher.cpp --- 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; ireq(); 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/matcher.hpp --- 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 }; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/memnode.cpp --- 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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/node.cpp --- 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 ); } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/output.cpp --- 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. diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/parse2.cpp --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/subnode.cpp --- 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) || diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/superword.cpp --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/type.cpp --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/opto/type.hpp --- 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) ) diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/prims/jni.cpp --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/prims/jvm.cpp --- 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, diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/prims/jvm.h --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/runtime/globals.hpp --- 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") \ \ diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/runtime/hpi.hpp --- 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); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/runtime/java.cpp --- 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) { diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/runtime/java.hpp --- 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(); diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/utilities/debug.cpp --- 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, ...) { diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/utilities/ostream.cpp --- 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(); } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/utilities/ostream.hpp --- 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; } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/src/share/vm/utilities/xmlstream.cpp --- 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); } diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/test/compiler/6714694/Tester.java --- /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 ""; + + 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; + } + } +} + + diff -r 7c47c40d4bd5 -r cd8b8f500fac hotspot/test/compiler/6716441/Tester.java --- /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 ""; + + 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; + } + } +} + + diff -r 7c47c40d4bd5 -r cd8b8f500fac jaxp/.hgtags --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jaxws/.hgtags --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/.hgtags --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/make/common/shared/Platform.gmk --- 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? diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/make/common/shared/Sanity.gmk --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/make/tools/Makefile --- 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:: diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/make/tools/winver/Makefile --- 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 - diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/make/tools/winver/bin/winver.exe Binary file jdk/make/tools/winver/bin/winver.exe has changed diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/make/tools/winver/src/StdAfx.cpp --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/make/tools/winver/src/StdAfx.h --- 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 - -// 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_) diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/make/tools/winver/src/winver.cpp --- 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 - -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; -} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java --- 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; diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/src/share/classes/java/nio/charset/Charset.java --- 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 @@ *
    * *
  • When decoding, the UTF-16BE and UTF-16LE - * charsets ignore byte-order marks; when encoding, they do not write + * charsets interpret the initial byte-order marks as a ZERO-WIDTH + * NON-BREAKING SPACE; when encoding, they do not write * byte-order marks.

  • + * - *
  • When decoding, the UTF-16 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.

  • + *
  • When decoding, the UTF-16 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.

  • * *
* - * 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 ZERO-WIDTH - * NON-BREAKING SPACE. + * 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 + * ZERO-WIDTH NON-BREAKING SPACE. * *

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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/src/share/classes/sun/nio/ch/Util.java --- 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( - new SelectorWrapper(sel))); - } else { - localSelectorWrapper.set(selWrapper); + selWrapper = new SelectorWrapper(sel); + localSelector.set(new SoftReference(selWrapper)); } + localSelectorWrapper.set(selWrapper); return sel; } diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/src/share/classes/sun/security/provider/certpath/ConstraintsChecker.java --- 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 supportedExts; + private Set supportedExts; /** * Creates a ConstraintsChecker. diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/src/share/classes/sun/security/provider/certpath/ForwardBuilder.java --- 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 */ diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/src/share/classes/sun/security/provider/certpath/KeyChecker.java --- 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 supportedExts; + private Set supportedExts; /** * Default Constructor diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/src/share/classes/sun/security/provider/certpath/PolicyChecker.java --- 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 supportedExts; + private Set supportedExts; private static final Debug debug = Debug.getInstance("certpath"); static final String ANY_POLICY = "2.5.29.32.0"; diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/src/windows/native/java/io/io_util_md.c --- 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) { diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/java/io/File/MaxPath.java --- /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; + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/java/nio/channels/FileChannel/LongTransferTest.java --- 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(); diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/java/security/cert/CertPathBuilder/targetConstraints/BuildEEBasicConstraints.java --- /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 certs = new ArrayList(); + 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 certList = cp.getCertificates(); + X509Certificate cert = (X509Certificate) certList.get(0); + if (cert.getBasicConstraints() != -1) { + throw new Exception("Target certificate is not an EE certificate"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/java/security/cert/CertPathBuilder/targetConstraints/anchor.cer --- /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----- diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ca.cer --- /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----- diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/java/security/cert/CertPathBuilder/targetConstraints/ee.cer --- /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----- diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/BufferUnderflowEUCTWTest.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/CheckCaseInsensitiveEncAliases.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/CheckHistoricalNames.java --- /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++; + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/ConvertSingle.java --- /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"); + } + + } + +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/Decode.java --- /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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/DecoderOverflow.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/EUCJPUnderflowDecodeTest.java --- /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)"); + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/EucJpLinux0212.java --- /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 bbs = Arrays.asList( + ByteBuffer.allocate(10), + ByteBuffer.allocateDirect(10)); + List cbs = new ArrayList(); + + 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");} +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/EucJpLinuxDecoderRecoveryTest.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/EuroConverter.java --- /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 \\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, + }; +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/FindASCIICodingBugs.java --- /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 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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/FindASCIIRangeCodingBugs.java --- /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 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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/FindCanEncodeBugs.java --- /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 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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/FindDecoderBugs.java --- /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 > List sort(Collection c) { + List list = new ArrayList(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 { + 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");} +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/FindEncoderBugs.java --- /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 > List sort(Collection c) { + List list = new ArrayList(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 { + 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");} +} + diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/FindOneCharEncoderBugs.java --- /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 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);}}} +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/HWKatakanaMS932EncodeTest.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/ISCIITest.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/ISO2022JP.trailEsc --- /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=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

diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/ISO8859x.java --- /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 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");} +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/JISAutoDetectTest.java --- /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"; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/LatinCharReplacementTWTest.java --- /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); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/LeftOverSurrogate.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/MalformedSurrogates.java --- /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) + "\""); + } + + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/NIOJISAutoDetectTest.java --- /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)); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/ReadZero.java --- /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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SJISCanEncode.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/StreamEncoderClose.java --- /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(); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateGB18030Test.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateTestEUCTW.java --- /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(); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane15.surrogates --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane3.surrogates --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane4.surrogates --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane5.surrogates --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane6.surrogates --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateTestEUCTW.plane7.surrogates --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/SurrogateTestHKSCS.java --- /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"); + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/Test4200310.sh --- /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 diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/Test4206507.java --- /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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/Test6254467.java --- /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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/Test6275027.java --- /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"); + } + +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/Test6392804.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestCompoundTest.java --- /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 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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestConverterDroppedCharacters.java --- /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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestCp834_SBCS.java --- /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"); + } + } + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestCp93xSISO.java --- /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 0) + throw new Exception ("bug4429369: Cp93x SI/SO Ch->Byte mappings incorrect"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestIBMBugs.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestISCII91.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestISO2022CNDecoder.java --- /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"); + } + + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestISO2022JP.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestISO2022JPEncoder.java --- /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"); + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestISO2022JPSubBytes.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestIllegalISO2022Esc.java --- /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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestIllegalSJIS.java --- /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"); + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestJIS0208Decoder.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestJIS0212Decoder.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestMS5022X.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestMiscEUC_JP.java --- /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)); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestSJIS0213.java --- /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!"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestTrailingEscapesISO2022JP.java --- /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(); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestUTF8BOM.java --- /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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestUTF_16.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestUTF_32.java --- /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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestUni2HKSCS.java --- /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"); + } + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/TestX11JIS0201.java --- /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"); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/UkrainianIsNotRussian.java --- /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");} +} diff -r 7c47c40d4bd5 -r cd8b8f500fac jdk/test/sun/nio/cs/ZeroedByteArrayEUCTWTest.java --- /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); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/.hgtags --- 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/comp/Check.java --- 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 supertypes = new HashMap(); + 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 tvars1 = st1.getTypeArguments(); + List tvars2 = st2.getTypeArguments(); + List 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 diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java --- 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 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; + } diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java --- 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 isDirectory = new ConcurrentHashMap(); @@ -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 getSubdirectories(); } - public class ZipArchive implements Archive { - protected final Map> map; - protected final ZipFile zdir; - public ZipArchive(ZipFile zdir) throws IOException { - this.zdir = zdir; - this.map = new HashMap>(); - for (Enumeration 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 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 list = map.get(dirname); - return (list != null && list.contains(basename)); - } - - public List 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 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 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> contentCache = new HashMap>(); + CharBuffer getCachedContent(JavaFileObject file) { + SoftReference r = contentCache.get(file); + return (r == null ? null : r.get()); + } + + void cache(JavaFileObject file, CharBuffer cb) { + contentCache.put(file, new SoftReference(cb)); + } + + private final Map> contentCache + = new HashMap>(); 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 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(); 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 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(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 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(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 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(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 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 getSubdirectories() { - return zfIndex.getAllDirectories(); - } - - public void close() throws IOException { - zfIndex.close(); - } - } } diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java --- /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 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(); + } + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java --- /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 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); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/file/ZipArchive.java --- /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>(); + for (Enumeration 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 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 list = map.get(dirname); + return (list != null && list.contains(basename)); + } + + public List 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 getSubdirectories() { + return map.keySet(); + } + + public void close() throws IOException { + zdir.close(); + } + + protected JavacFileManager fileManager; + protected final Map> 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 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('/', '.'); + } + } + +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java --- 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.emptyMap(); zipFileLastModified = NOT_MODIFIED; allDirs = Collections.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(); - ArrayList entryList = new ArrayList(); + ArrayList entryList = new ArrayList(); 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 entryList, + private int readEntry(int pos, List entryList, Map 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 zipFileEntriesFiles = com.sun.tools.javac.util.List.nil(); private com.sun.tools.javac.util.List zipFileEntriesDirectories = com.sun.tools.javac.util.List.nil(); - private com.sun.tools.javac.util.List zipFileEntries = com.sun.tools.javac.util.List.nil(); + private com.sun.tools.javac.util.List zipFileEntries = com.sun.tools.javac.util.List.nil(); - private List entries = new ArrayList(); + private List entries = new ArrayList(); 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 getEntries() { + private com.sun.tools.javac.util.List 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 getEntriesAsCollection() { + List getEntriesAsCollection() { initEntries(); return entries; @@ -1173,8 +1177,8 @@ raf.seek(currFP); // Now write each of the files in the DirectoryEntry - List entries = de.getEntriesAsCollection(); - for (ZipFileIndexEntry zfie : entries) { + List 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 { + 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); + } + } + } diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java --- /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 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 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 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, '.'); + } + } + +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndexEntry.java --- 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 { - 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); - } -} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- 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 path) { + return flatname.toString(); + } } } diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/util/Log.java --- 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 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 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 getEndPosTable() { + return (endPosTables == null ? null : endPosTables.get(file)); + } + }; } private DiagnosticPosition wrap(int pos) { diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java --- 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); + } } diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java --- 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 != '/') { diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java --- 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 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 wrapper = new DiagnosticListener() { - public void report(Diagnostic 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); diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javac/T6358024.java --- 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.*; diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javac/T6358166.java --- 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.*; diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javac/T6358168.java --- 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.*; diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javac/T6625520.java --- /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 dc = + new DiagnosticCollector(); + 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"); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javac/generics/6294779/T6294779a.java --- /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(); + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javac/generics/6294779/T6294779b.java --- /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 { + List m(); + } + + interface I2 { + Queue m(); + } + + interface I3 { + LinkedList m(); + } + + interface I4 extends I1, I2, I3 {} +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javac/generics/6294779/T6294779c.java --- /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 { + + interface A {} + + interface B {} + + interface C {} + + interface I1 { + T6294779c get(); + } + + interface I2 { + T6294779c get(); + } + + interface I3 { + T6294779c get(); + } + + interface I4 extends I1, I2, I3 {} +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javadoc/sourceOption/SourceOption.java --- /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; + } +} diff -r 7c47c40d4bd5 -r cd8b8f500fac langtools/test/tools/javadoc/sourceOption/p/A.java --- /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 +} diff -r 7c47c40d4bd5 -r cd8b8f500fac make/jprt.config --- 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