Date: Wed, 3 Aug 2016 17:01:51 -0700
Subject: [PATCH 009/120] 8155960: TIFF javadoc contains HTML entities inside
{@code} tags
Remove from inside @code tags.
Reviewed-by: prr
---
.../com/sun/imageio/plugins/tiff/TIFFColorConverter.java | 4 ++--
.../com/sun/imageio/plugins/tiff/TIFFDecompressor.java | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java
index 14aa2540acb..dd35d2e9204 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFColorConverter.java
@@ -47,7 +47,7 @@ public abstract class TIFFColorConverter {
* @throws NullPointerException if {@code result} is
* {@code null}.
* @throws ArrayIndexOutOfBoundsException if
- * {@code result.length < 3}.
+ * {@code result.length < 3}.
*/
public abstract void fromRGB(float r, float g, float b, float[] result);
@@ -63,7 +63,7 @@ public abstract class TIFFColorConverter {
* @throws NullPointerException if {@code rgb} is
* {@code null}.
* @throws ArrayIndexOutOfBoundsException if
- * {@code rgb.length < 3}.
+ * {@code rgb.length < 3}.
*/
public abstract void toRGB(float x0, float x1, float x2, float[] rgb);
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java
index bdd31218e03..f89d0de18b6 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java
@@ -353,7 +353,7 @@ public abstract class TIFFDecompressor {
* The pixels in the source region to be copied are
* those with X coordinates of the form {@code activeSrcMinX +
* k*subsampleX}, where {@code k} is an integer such
- * that {@code 0 ≤ k < dstWidth}.
+ * that {@code 0 <= k < dstWidth}.
*/
protected int activeSrcMinX;
@@ -365,7 +365,7 @@ public abstract class TIFFDecompressor {
*
The pixels in the source region to be copied are
* those with Y coordinates of the form {@code activeSrcMinY +
* k*subsampleY}, where {@code k} is an integer such
- * that {@code 0 ≤ k < dstHeight}.
+ * that {@code 0 <= k < dstHeight}.
*/
protected int activeSrcMinY;
From 3673248f32dd9132da12d38e0eaeb55fa39f70ca Mon Sep 17 00:00:00 2001
From: Christoph Langer
Date: Thu, 4 Aug 2016 15:58:28 +0200
Subject: [PATCH 010/120] 8163177: Fix for 8152971 breaks builds with VS2010
Reviewed-by: simonis, pnarayanan
---
.../windows/native/libfontmanager/fontpath.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c b/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c
index 9d2d6c8ceaf..f31fd242b98 100644
--- a/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c
+++ b/jdk/src/java.desktop/windows/native/libfontmanager/fontpath.c
@@ -263,6 +263,7 @@ static int CALLBACK EnumFamilyNamesW(
jstring familyLC;
size_t slen;
LOGFONTW lfw;
+ jboolean mapHasKey;
/* Exceptions indicate critical errors such that program cannot continue
* with further execution. Henceforth, the function returns immediately
@@ -311,10 +312,10 @@ static int CALLBACK EnumFamilyNamesW(
}
/* check if already seen this family with a different charset */
- jboolean mapHasKey = (*env)->CallBooleanMethod(env,
- fmi->familyToFontListMap,
- fmi->containsKeyMID,
- familyLC);
+ mapHasKey = (*env)->CallBooleanMethod(env,
+ fmi->familyToFontListMap,
+ fmi->containsKeyMID,
+ familyLC);
if ((*env)->ExceptionCheck(env)) {
/* Delete the created references before return */
DeleteLocalReference(env, fmi->family);
@@ -535,6 +536,7 @@ Java_sun_awt_Win32FontManager_populateFontFileNameMap0
jclass classIDString;
jmethodID putMID;
GdiFontMapInfo fmi;
+ LOGFONTW lfw;
/* Check we were passed all the maps we need, and do lookup of
* methods for JNI up-calls
@@ -598,7 +600,6 @@ Java_sun_awt_Win32FontManager_populateFontFileNameMap0
}
/* Enumerate fonts via GDI to build maps of fonts and families */
- LOGFONTW lfw;
memset(&lfw, 0, sizeof(lfw));
lfw.lfCharSet = DEFAULT_CHARSET; /* all charsets */
wcscpy(lfw.lfFaceName, L""); /* one face per family (CHECK) */
From a2e634345b36e0f2985fc8b4b2d0b7ccf7288063 Mon Sep 17 00:00:00 2001
From: Li Jiang
Date: Wed, 3 Aug 2016 15:18:58 +0800
Subject: [PATCH 011/120] 8159713: Make the non-translated keywords clear to
translator in jar.properties 8161183: Need extra newline in the end of for
multi-lines strings in jar.properties
Reviewed-by: naoto
---
.../classes/sun/tools/jar/resources/jar.properties | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties
index e00ee76610d..316a5ccee9c 100644
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties
@@ -68,15 +68,15 @@ error.versioned.info.without.root=\
error.versioned.info.name.notequal=\
module-info.class in a versioned directory contains incorrect name
error.versioned.info.requires.public=\
- module-info.class in a versioned directory contains additional requires public
+ module-info.class in a versioned directory contains additional "requires public"
error.versioned.info.requires.added=\
- module-info.class in a versioned directory contains additional requires
+ module-info.class in a versioned directory contains additional "requires"
error.versioned.info.requires.dropped=\
- module-info.class in a versioned directory contains missing requires
+ module-info.class in a versioned directory contains missing "requires"
error.versioned.info.exports.notequal=\
- module-info.class in a versioned directory contains different exports
+ module-info.class in a versioned directory contains different "exports"
error.versioned.info.provides.notequal=\
- module-info.class in a versioned directory contains different provides
+ module-info.class in a versioned directory contains different "provides"
error.invalid.versioned.module.attribute=\
Invalid module descriptor attribute {0}
error.missing.provider=\
@@ -209,7 +209,7 @@ main.help.opt.create.update.hash-modules=\
\ directly or indirectly on a modular jar being\n\
\ created or a non-modular jar being updated
main.help.opt.create.update.modulepath=\
-\ --modulepath Location of module dependence for generating
+\ --modulepath Location of module dependence for generating\n\
\ the hash
main.help.opt.create.update.index=\
\ Operation modifiers valid only in create, update, and generate-index mode:\n
@@ -229,4 +229,4 @@ main.help.postopt=\
\ '--hash-modules', and '--modulepath'.\n\
\n\
\ Mandatory or optional arguments to long options are also mandatory or optional\n\
-\ for any corresponding short options.
\ No newline at end of file
+\ for any corresponding short options.
From 25e581d03d8650e9abf6facaa5d5600420b63146 Mon Sep 17 00:00:00 2001
From: Coleen Phillimore
Date: Wed, 3 Aug 2016 09:40:21 -0400
Subject: [PATCH 012/120] 8159284: bigapps/Jetty - assert(jfa->last_Java_sp() >
sp()) failed with JFR in use
Test condition in assert in frame::safe_for_sender() for entry frames and return false.
Reviewed-by: mgronlun, fparain
---
hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp | 21 ++---------------
hotspot/src/cpu/sparc/vm/frame_sparc.cpp | 24 +++-----------------
hotspot/src/cpu/x86/vm/frame_x86.cpp | 21 ++---------------
hotspot/src/share/vm/runtime/frame.cpp | 13 +++++++++++
hotspot/src/share/vm/runtime/frame.hpp | 2 ++
5 files changed, 22 insertions(+), 59 deletions(-)
diff --git a/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp
index 42c61b9a33f..473c4bc67eb 100644
--- a/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp
+++ b/hotspot/src/cpu/aarch64/vm/frame_aarch64.cpp
@@ -110,17 +110,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
// Entry frame checks
if (is_entry_frame()) {
// an entry frame must have a valid fp.
-
- if (!fp_safe) return false;
-
- // Validate the JavaCallWrapper an entry frame must have
-
- address jcw = (address)entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > fp);
-
- return jcw_safe;
-
+ return fp_safe && is_entry_frame_valid(thread);
}
intptr_t* sender_sp = NULL;
@@ -210,15 +200,8 @@ bool frame::safe_for_sender(JavaThread *thread) {
}
// construct the potential sender
-
frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
-
- // Validate the JavaCallWrapper an entry frame must have
- address jcw = (address)sender.entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > (address)sender.fp());
-
- return jcw_safe;
+ return sender.is_entry_frame_valid(thread);
}
CompiledMethod* nm = sender_blob->as_compiled_method_or_null();
diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
index ab6aeeeeabf..c385c2686df 100644
--- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp
@@ -225,19 +225,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
// Entry frame checks
if (is_entry_frame()) {
// an entry frame must have a valid fp.
-
- if (!fp_safe) {
- return false;
- }
-
- // Validate the JavaCallWrapper an entry frame must have
-
- address jcw = (address)entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > _FP);
-
- return jcw_safe;
-
+ return fp_safe && is_entry_frame_valid(thread);
}
intptr_t* younger_sp = sp();
@@ -290,14 +278,8 @@ bool frame::safe_for_sender(JavaThread *thread) {
return false;
}
- if( sender.is_entry_frame()) {
- // Validate the JavaCallWrapper an entry frame must have
-
- address jcw = (address)sender.entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > sender_fp);
-
- return jcw_safe;
+ if (sender.is_entry_frame()) {
+ return sender.is_entry_frame_valid(thread);
}
// If the frame size is 0 something (or less) is bad because every nmethod has a non-zero frame size
diff --git a/hotspot/src/cpu/x86/vm/frame_x86.cpp b/hotspot/src/cpu/x86/vm/frame_x86.cpp
index ae8628c05d2..1db4b424cf5 100644
--- a/hotspot/src/cpu/x86/vm/frame_x86.cpp
+++ b/hotspot/src/cpu/x86/vm/frame_x86.cpp
@@ -108,17 +108,7 @@ bool frame::safe_for_sender(JavaThread *thread) {
// Entry frame checks
if (is_entry_frame()) {
// an entry frame must have a valid fp.
-
- if (!fp_safe) return false;
-
- // Validate the JavaCallWrapper an entry frame must have
-
- address jcw = (address)entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > fp);
-
- return jcw_safe;
-
+ return fp_safe && is_entry_frame_valid(thread);
}
intptr_t* sender_sp = NULL;
@@ -209,15 +199,8 @@ bool frame::safe_for_sender(JavaThread *thread) {
}
// construct the potential sender
-
frame sender(sender_sp, sender_unextended_sp, saved_fp, sender_pc);
-
- // Validate the JavaCallWrapper an entry frame must have
- address jcw = (address)sender.entry_frame_call_wrapper();
-
- bool jcw_safe = (jcw < thread->stack_base()) && ( jcw > (address)sender.fp());
-
- return jcw_safe;
+ return sender.is_entry_frame_valid(thread);
}
CompiledMethod* nm = sender_blob->as_compiled_method_or_null();
diff --git a/hotspot/src/share/vm/runtime/frame.cpp b/hotspot/src/share/vm/runtime/frame.cpp
index 82f5ead336d..129a08850db 100644
--- a/hotspot/src/share/vm/runtime/frame.cpp
+++ b/hotspot/src/share/vm/runtime/frame.cpp
@@ -225,6 +225,19 @@ JavaCallWrapper* frame::entry_frame_call_wrapper_if_safe(JavaThread* thread) con
return NULL;
}
+bool frame::is_entry_frame_valid(JavaThread* thread) const {
+ // Validate the JavaCallWrapper an entry frame must have
+ address jcw = (address)entry_frame_call_wrapper();
+ bool jcw_safe = (jcw < thread->stack_base()) && (jcw > (address)fp()); // less than stack base
+ if (!jcw_safe) {
+ return false;
+ }
+
+ // Validate sp saved in the java frame anchor
+ JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor();
+ return (jfa->last_Java_sp() > sp());
+}
+
bool frame::should_be_deoptimized() const {
if (_deopt_state == is_deoptimized ||
!is_compiled_frame() ) return false;
diff --git a/hotspot/src/share/vm/runtime/frame.hpp b/hotspot/src/share/vm/runtime/frame.hpp
index d3974d713b2..1a122da60c5 100644
--- a/hotspot/src/share/vm/runtime/frame.hpp
+++ b/hotspot/src/share/vm/runtime/frame.hpp
@@ -166,6 +166,8 @@ class frame VALUE_OBJ_CLASS_SPEC {
frame sender_for_interpreter_frame(RegisterMap* map) const;
frame sender_for_native_frame(RegisterMap* map) const;
+ bool is_entry_frame_valid(JavaThread* thread) const;
+
// All frames:
// A low-level interface for vframes:
From f108319ee4d7ec6f1976a6563ffb42c003fe1b0d Mon Sep 17 00:00:00 2001
From: Chris Plummer
Date: Wed, 3 Aug 2016 13:56:27 -0700
Subject: [PATCH 013/120] 8161030: GPL header missing comma after year
Added comma.
Reviewed-by: coleenp, fparain
---
.../share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java | 2 +-
.../share/classes/sun/jvm/hotspot/oops/MethodCounters.java | 2 +-
hotspot/src/share/vm/oops/methodCounters.hpp | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java
index 207810dd99b..7519520d7da 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java
index ce6ba6c8f37..5f74240ff4b 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/MethodCounters.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
diff --git a/hotspot/src/share/vm/oops/methodCounters.hpp b/hotspot/src/share/vm/oops/methodCounters.hpp
index 2a06ab6eb2e..351cbff76b9 100644
--- a/hotspot/src/share/vm/oops/methodCounters.hpp
+++ b/hotspot/src/share/vm/oops/methodCounters.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
From 13fca14037e4fc16616a9682d6f8fc5337f34ef9 Mon Sep 17 00:00:00 2001
From: Tobias Hartmann
Date: Thu, 4 Aug 2016 08:58:22 +0200
Subject: [PATCH 014/120] 8162881: Effect of -XX:CICompilerCount depends on
ordering of other flags
Value of CICompilerCount should be range checked after ergo. Don't create C2 compiler threads with TieredStopAtLevel=1.
Reviewed-by: kvn
---
hotspot/src/share/vm/prims/whitebox.cpp | 5 +-
.../vm/runtime/advancedThresholdPolicy.cpp | 15 ++-
hotspot/src/share/vm/runtime/globals.hpp | 2 +-
.../vm/runtime/simpleThresholdPolicy.cpp | 14 ++-
.../arguments/CheckCICompilerCount.java | 97 +++++++++++++------
.../intrinsics/IntrinsicAvailableTest.java | 4 +-
.../intrinsics/IntrinsicDisabledTest.java | 10 +-
7 files changed, 98 insertions(+), 49 deletions(-)
diff --git a/hotspot/src/share/vm/prims/whitebox.cpp b/hotspot/src/share/vm/prims/whitebox.cpp
index e1a83af6739..1761f6c6191 100644
--- a/hotspot/src/share/vm/prims/whitebox.cpp
+++ b/hotspot/src/share/vm/prims/whitebox.cpp
@@ -667,7 +667,7 @@ WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobje
WB_END
WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject method, jobject compilation_context, jint compLevel))
- if (compLevel < CompLevel_none || compLevel > CompLevel_highest_tier) {
+ if (compLevel < CompLevel_none || compLevel > TieredStopAtLevel) {
return false; // Intrinsic is not available on a non-existent compilation level.
}
jmethodID method_id, compilation_context_id;
@@ -677,6 +677,7 @@ WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject metho
DirectiveSet* directive;
AbstractCompiler* comp = CompileBroker::compiler((int)compLevel);
+ assert(comp != NULL, "compiler not available");
if (compilation_context != NULL) {
compilation_context_id = reflected_method_to_jmid(thread, env, compilation_context);
CHECK_JNI_EXCEPTION_(env, JNI_FALSE);
@@ -686,7 +687,7 @@ WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject metho
// Calling with NULL matches default directive
directive = DirectivesStack::getDefaultDirective(comp);
}
- bool result = CompileBroker::compiler(compLevel)->is_intrinsic_available(mh, directive);
+ bool result = comp->is_intrinsic_available(mh, directive);
DirectivesStack::release(directive);
return result;
WB_END
diff --git a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp
index fc1ea544cce..9b8e3e6a394 100644
--- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp
@@ -55,7 +55,8 @@ void AdvancedThresholdPolicy::initialize() {
// Simple log n seems to grow too slowly for tiered, try something faster: log n * log log n
int log_cpu = log2_intptr(os::active_processor_count());
int loglog_cpu = log2_intptr(MAX2(log_cpu, 1));
- count = MAX2(log_cpu * loglog_cpu, 1) * 3 / 2;
+ count = MAX2(log_cpu * loglog_cpu * 3 / 2, 2);
+ FLAG_SET_ERGO(intx, CICompilerCount, count);
}
#else
// On 32-bit systems, the number of compiler threads is limited to 3.
@@ -67,12 +68,18 @@ void AdvancedThresholdPolicy::initialize() {
/// available to the VM and thus cause the VM to crash.
if (FLAG_IS_DEFAULT(CICompilerCount)) {
count = 3;
+ FLAG_SET_ERGO(intx, CICompilerCount, count);
}
#endif
- set_c1_count(MAX2(count / 3, 1));
- set_c2_count(MAX2(count - c1_count(), 1));
- FLAG_SET_ERGO(intx, CICompilerCount, c1_count() + c2_count());
+ if (TieredStopAtLevel < CompLevel_full_optimization) {
+ // No C2 compiler thread required
+ set_c1_count(count);
+ } else {
+ set_c1_count(MAX2(count / 3, 1));
+ set_c2_count(MAX2(count - c1_count(), 1));
+ }
+ assert(count == c1_count() + c2_count(), "inconsistent compiler thread count");
// Some inlining tuning
#ifdef X86
diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp
index 930c51acc17..89314669efd 100644
--- a/hotspot/src/share/vm/runtime/globals.hpp
+++ b/hotspot/src/share/vm/runtime/globals.hpp
@@ -2411,7 +2411,7 @@ public:
product(intx, CICompilerCount, CI_COMPILER_COUNT, \
"Number of compiler threads to run") \
range(0, max_jint) \
- constraint(CICompilerCountConstraintFunc, AtParse) \
+ constraint(CICompilerCountConstraintFunc, AfterErgo) \
\
product(intx, CompilationPolicyChoice, 0, \
"which compilation policy (0-3)") \
diff --git a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp
index e38c69279a9..4f532121fc8 100644
--- a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp
+++ b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp
@@ -147,12 +147,18 @@ void SimpleThresholdPolicy::initialize() {
// performed on 32-bit systems because it can lead to exhaustion
// of the virtual memory address space available to the JVM.
if (CICompilerCountPerCPU) {
- count = MAX2(log2_intptr(os::active_processor_count()), 1) * 3 / 2;
+ count = MAX2(log2_intptr(os::active_processor_count()) * 3 / 2, 2);
+ FLAG_SET_ERGO(intx, CICompilerCount, count);
}
#endif
- set_c1_count(MAX2(count / 3, 1));
- set_c2_count(MAX2(count - c1_count(), 1));
- FLAG_SET_ERGO(intx, CICompilerCount, c1_count() + c2_count());
+ if (TieredStopAtLevel < CompLevel_full_optimization) {
+ // No C2 compiler thread required
+ set_c1_count(count);
+ } else {
+ set_c1_count(MAX2(count / 3, 1));
+ set_c2_count(MAX2(count - c1_count(), 1));
+ }
+ assert(count == c1_count() + c2_count(), "inconsistent compiler thread count");
}
void SimpleThresholdPolicy::set_carry_if_necessary(InvocationCounter *counter) {
diff --git a/hotspot/test/compiler/arguments/CheckCICompilerCount.java b/hotspot/test/compiler/arguments/CheckCICompilerCount.java
index 1c361cfdf42..14bbdaa3dc5 100644
--- a/hotspot/test/compiler/arguments/CheckCICompilerCount.java
+++ b/hotspot/test/compiler/arguments/CheckCICompilerCount.java
@@ -23,8 +23,7 @@
/*
* @test CheckCheckCICompilerCount
- * @bug 8130858
- * @bug 8132525
+ * @bug 8130858 8132525 8162881
* @summary Check that correct range of values for CICompilerCount are allowed depending on whether tiered is enabled or not
* @library /testlibrary /
* @modules java.base/jdk.internal.misc
@@ -53,6 +52,13 @@ public class CheckCICompilerCount {
"-XX:CICompilerCount=1",
"-version"
},
+ {
+ "-server",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-XX:-TieredCompilation",
+ "-version"
+ },
{
"-client",
"-XX:-TieredCompilation",
@@ -66,30 +72,31 @@ public class CheckCICompilerCount {
"-XX:+PrintFlagsFinal",
"-XX:CICompilerCount=1",
"-version"
+ },
+ {
+ "-client",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-XX:-TieredCompilation",
+ "-version"
}
};
- private static final String[][] NON_TIERED_EXPECTED_OUTPUTS = {
- {
+ private static final String[] NON_TIERED_EXPECTED_OUTPUTS = {
"CICompilerCount (0) must be at least 1",
- "Improperly specified VM option 'CICompilerCount=0'"
- },
- {
- "intx CICompilerCount = 1 {product} {command line}"
- },
- {
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 1 {product} {command line}",
"CICompilerCount (0) must be at least 1",
- "Improperly specified VM option 'CICompilerCount=0'"
- },
- {
+ "intx CICompilerCount = 1 {product} {command line}",
"intx CICompilerCount = 1 {product} {command line}"
- }
};
private static final int[] NON_TIERED_EXIT = {
1,
0,
+ 0,
1,
+ 0,
0
};
@@ -101,6 +108,22 @@ public class CheckCICompilerCount {
"-XX:CICompilerCount=1",
"-version"
},
+ {
+ "-server",
+ "-XX:+TieredCompilation",
+ "-XX:TieredStopAtLevel=1",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-version"
+ },
+ {
+ "-server",
+ "-XX:+TieredCompilation",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-XX:TieredStopAtLevel=1",
+ "-version"
+ },
{
"-server",
"-XX:+TieredCompilation",
@@ -115,6 +138,22 @@ public class CheckCICompilerCount {
"-XX:CICompilerCount=1",
"-version"
},
+ {
+ "-client",
+ "-XX:+TieredCompilation",
+ "-XX:TieredStopAtLevel=1",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-version"
+ },
+ {
+ "-client",
+ "-XX:+TieredCompilation",
+ "-XX:+PrintFlagsFinal",
+ "-XX:CICompilerCount=1",
+ "-XX:TieredStopAtLevel=1",
+ "-version"
+ },
{
"-client",
"-XX:+TieredCompilation",
@@ -124,31 +163,29 @@ public class CheckCICompilerCount {
}
};
- private static final String[][] TIERED_EXPECTED_OUTPUTS = {
- {
+ private static final String[] TIERED_EXPECTED_OUTPUTS = {
"CICompilerCount (1) must be at least 2",
- "Improperly specified VM option 'CICompilerCount=1'"
- },
- {
- "intx CICompilerCount = 2 {product} {command line, ergonomic}"
- },
- {
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 2 {product} {command line}",
"CICompilerCount (1) must be at least 2",
- "Improperly specified VM option 'CICompilerCount=1'"
- },
- {
- "intx CICompilerCount = 2 {product} {command line, ergonomic}"
- }
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 1 {product} {command line}",
+ "intx CICompilerCount = 2 {product} {command line}",
};
private static final int[] TIERED_EXIT = {
1,
0,
+ 0,
+ 0,
1,
+ 0,
+ 0,
0
};
- private static void verifyValidOption(String[] arguments, String[] expected_outputs, int exit, boolean tiered) throws Exception {
+ private static void verifyValidOption(String[] arguments, String expected_output, int exit, boolean tiered) throws Exception {
ProcessBuilder pb;
OutputAnalyzer out;
@@ -157,9 +194,7 @@ public class CheckCICompilerCount {
try {
out.shouldHaveExitValue(exit);
- for (String expected_output : expected_outputs) {
- out.shouldContain(expected_output);
- }
+ out.shouldContain(expected_output);
} catch (RuntimeException e) {
// Check if tiered compilation is available in this JVM
// Version. Throw exception only if it is available.
diff --git a/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java b/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java
index dd55d5496c9..ddc5bd04f8a 100644
--- a/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java
+++ b/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -114,7 +114,7 @@ public class IntrinsicAvailableTest extends CompilerWhiteBoxTest {
public void test() throws Exception {
Executable intrinsicMethod = testCase.getExecutable();
- if (Platform.isServer()) {
+ if (Platform.isServer() && (TIERED_STOP_AT_LEVEL == COMP_LEVEL_FULL_OPTIMIZATION)) {
if (TIERED_COMPILATION) {
checkIntrinsicForCompilationLevel(intrinsicMethod, COMP_LEVEL_SIMPLE);
}
diff --git a/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java b/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java
index 7cbe3cb6088..53cf827602f 100644
--- a/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java
+++ b/hotspot/test/compiler/intrinsics/IntrinsicDisabledTest.java
@@ -59,9 +59,9 @@ public class IntrinsicDisabledTest {
private static final int COMP_LEVEL_FULL_OPTIMIZATION = 4;
/* Determine if tiered compilation is enabled. */
- private static boolean isTieredCompilationEnabled() {
- return Boolean.valueOf(Objects.toString(wb.getVMFlag("TieredCompilation")));
- }
+ private static final boolean TIERED_COMPILATION = wb.getBooleanVMFlag("TieredCompilation");
+
+ private static final int TIERED_STOP_AT_LEVEL = wb.getIntxVMFlag("TieredStopAtLevel").intValue();
/* This test uses several methods from jdk.internal.misc.Unsafe. The method
* getMethod() returns a different Executable for each different
@@ -202,8 +202,8 @@ public class IntrinsicDisabledTest {
}
public static void main(String args[]) {
- if (Platform.isServer()) {
- if (isTieredCompilationEnabled()) {
+ if (Platform.isServer() && (TIERED_STOP_AT_LEVEL == COMP_LEVEL_FULL_OPTIMIZATION)) {
+ if (TIERED_COMPILATION) {
test(COMP_LEVEL_SIMPLE);
}
test(COMP_LEVEL_FULL_OPTIMIZATION);
From af8e1270cb465e37677b762d8285274a79a1d4fa Mon Sep 17 00:00:00 2001
From: Tobias Hartmann
Date: Thu, 4 Aug 2016 10:34:34 +0200
Subject: [PATCH 015/120] 8136818: Test
compiler/arraycopy/TestEliminatedArrayCopyDeopt.java fails with "m1 failed"
Added missing Op_StoreB check to ArrayCopyNode::may_modify_helper().
Reviewed-by: kvn
---
hotspot/src/share/vm/opto/arraycopynode.cpp | 9 ++++++---
.../compiler/arraycopy/TestEliminatedArrayCopyDeopt.java | 1 -
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/hotspot/src/share/vm/opto/arraycopynode.cpp b/hotspot/src/share/vm/opto/arraycopynode.cpp
index 08334b22597..f73f09165fb 100644
--- a/hotspot/src/share/vm/opto/arraycopynode.cpp
+++ b/hotspot/src/share/vm/opto/arraycopynode.cpp
@@ -630,6 +630,12 @@ bool ArrayCopyNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
}
bool ArrayCopyNode::may_modify_helper(const TypeOopPtr *t_oop, Node* n, PhaseTransform *phase, ArrayCopyNode*& ac) {
+ if (n->Opcode() == Op_StoreCM ||
+ n->Opcode() == Op_StoreB) {
+ // Ignore card mark stores
+ n = n->in(MemNode::Memory);
+ }
+
if (n->is_Proj()) {
n = n->in(0);
if (n->is_Call() && n->as_Call()->may_modify(t_oop, phase)) {
@@ -657,9 +663,6 @@ bool ArrayCopyNode::may_modify(const TypeOopPtr *t_oop, MemBarNode* mb, PhaseTra
}
}
}
- } else if (n->Opcode() == Op_StoreCM) {
- // Ignore card mark stores
- return may_modify_helper(t_oop, n->in(MemNode::Memory), phase, ac);
}
}
diff --git a/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java b/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java
index 80f81c64c9d..85be6c5d428 100644
--- a/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java
+++ b/hotspot/test/compiler/arraycopy/TestEliminatedArrayCopyDeopt.java
@@ -25,7 +25,6 @@
* @test
* @bug 8130847 8156760
* @summary Eliminated instance/array written to by an array copy variant must be correctly initialized when reallocated at a deopt
- * @ignore 8136818
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement
* compiler.arraycopy.TestEliminatedArrayCopyDeopt
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement
From 127367ce74c7a57be75be275e59307f1c16c618c Mon Sep 17 00:00:00 2001
From: Leonid Mesnik
Date: Thu, 4 Aug 2016 14:04:14 +0300
Subject: [PATCH 016/120] 8162852: Mark stress compiler and gc tests with
stress keyword
Reviewed-by: kvn, tschatzl
---
hotspot/test/compiler/codecache/stress/RandomAllocationTest.java | 1 +
.../compiler/codecache/stress/UnexpectedDeoptimizationTest.java | 1 +
hotspot/test/compiler/codegen/aes/TestAESMain.java | 1 +
hotspot/test/gc/g1/ihop/TestIHOPErgo.java | 1 +
4 files changed, 4 insertions(+)
diff --git a/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java b/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java
index f1b8fd26890..761cbfd4842 100644
--- a/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java
+++ b/hotspot/test/compiler/codecache/stress/RandomAllocationTest.java
@@ -24,6 +24,7 @@
/*
* @test RandomAllocationTest
+ * @key stress
* @summary stressing code cache by allocating randomly sized "dummy" code blobs
* @library /testlibrary /test/lib /
* @modules java.base/jdk.internal.misc
diff --git a/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java b/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java
index c6e455d4986..4cd43a154e7 100644
--- a/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java
+++ b/hotspot/test/compiler/codecache/stress/UnexpectedDeoptimizationTest.java
@@ -24,6 +24,7 @@
/*
* @test UnexpectedDeoptimizationTest
+ * @key stress
* @summary stressing code cache by forcing unexpected deoptimizations
* @library /testlibrary /test/lib /
* @modules java.base/jdk.internal.misc
diff --git a/hotspot/test/compiler/codegen/aes/TestAESMain.java b/hotspot/test/compiler/codegen/aes/TestAESMain.java
index 679cd880e53..36353ca45f3 100644
--- a/hotspot/test/compiler/codegen/aes/TestAESMain.java
+++ b/hotspot/test/compiler/codegen/aes/TestAESMain.java
@@ -25,6 +25,7 @@
/**
* @test
* @bug 7184394
+ * @key stress
* @summary add intrinsics to use AES instructions
* @library /testlibrary /
* @modules java.base/jdk.internal.misc
diff --git a/hotspot/test/gc/g1/ihop/TestIHOPErgo.java b/hotspot/test/gc/g1/ihop/TestIHOPErgo.java
index f187d629842..d70c926e298 100644
--- a/hotspot/test/gc/g1/ihop/TestIHOPErgo.java
+++ b/hotspot/test/gc/g1/ihop/TestIHOPErgo.java
@@ -24,6 +24,7 @@
/*
* @test TestIHOPErgo
* @bug 8148397
+ * @key stress
* @summary Test checks that behavior of Adaptive and Static IHOP at concurrent cycle initiation
* @requires vm.gc.G1
* @requires !vm.flightRecorder
From d3e6075c944617dfbca24843f3745d7d10fba8a8 Mon Sep 17 00:00:00 2001
From: Max Ockner
Date: Thu, 4 Aug 2016 12:24:10 -0400
Subject: [PATCH 017/120] 8159917: Space character is missing in
ClassLoaderData::print_value_on
Added missing space in ClassLoaderData::print_value_on
Reviewed-by: coleenp
---
hotspot/src/share/vm/classfile/classLoaderData.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hotspot/src/share/vm/classfile/classLoaderData.cpp b/hotspot/src/share/vm/classfile/classLoaderData.cpp
index fc1774d1941..f31b1d0886c 100644
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp
@@ -1173,7 +1173,7 @@ void ClassLoaderData::print_value_on(outputStream* out) const {
if (class_loader() == NULL) {
out->print("NULL class_loader");
} else {
- out->print("class loader " INTPTR_FORMAT, p2i(this));
+ out->print("class loader " INTPTR_FORMAT " ", p2i(this));
class_loader()->print_value_on(out);
}
}
From 9465d5512a8a4df90f432a0b41d002ad3e582042 Mon Sep 17 00:00:00 2001
From: Max Ockner
Date: Thu, 4 Aug 2016 12:55:28 -0400
Subject: [PATCH 018/120] 8145543: JPRT jobs see intermittent failures in
compiler/floatingpoint/ModNaN.java
Not reproducible due to glibc patch which affects current and previous versions. Removed @ignore for compiler/floatingpoint/ModNaN.java
Reviewed-by: coleenp, gtriantafill
---
hotspot/test/compiler/floatingpoint/ModNaN.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/hotspot/test/compiler/floatingpoint/ModNaN.java b/hotspot/test/compiler/floatingpoint/ModNaN.java
index a1bdcdcdd61..30bc0285781 100644
--- a/hotspot/test/compiler/floatingpoint/ModNaN.java
+++ b/hotspot/test/compiler/floatingpoint/ModNaN.java
@@ -26,7 +26,6 @@
* @bug 8015396
* @summary double a%b returns NaN for some (a,b) (|a| < inf, |b|>0) (on Core i7 980X)
*
- * @ignore 8145543
* @run main compiler.floatingpoint.ModNaN
*/
From 81b9b7b499c51359ff31ff1964972b943c16c9d2 Mon Sep 17 00:00:00 2001
From: Gerald Thornbrugh
Date: Thu, 4 Aug 2016 10:11:35 -0700
Subject: [PATCH 019/120] 8162999: Build give extraneous find warnings
Removed JtregNative.gmk line that was part of a merger error
Reviewed-by: coleenp, fparain
---
hotspot/make/test/JtregNative.gmk | 1 -
1 file changed, 1 deletion(-)
diff --git a/hotspot/make/test/JtregNative.gmk b/hotspot/make/test/JtregNative.gmk
index efb108ad9f0..ce4a0319909 100644
--- a/hotspot/make/test/JtregNative.gmk
+++ b/hotspot/make/test/JtregNative.gmk
@@ -50,7 +50,6 @@ BUILD_HOTSPOT_JTREG_NATIVE_SRC := \
$(HOTSPOT_TOPDIR)/test/runtime/BoolReturn \
$(HOTSPOT_TOPDIR)/test/compiler/floatingpoint/ \
$(HOTSPOT_TOPDIR)/test/compiler/calls \
- $(HOTSPOT_TOPDIR)/test/compiler/native \
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetNamedModule \
$(HOTSPOT_TOPDIR)/test/testlibrary/jvmti \
$(HOTSPOT_TOPDIR)/test/compiler/jvmci/jdk.vm.ci.code.test \
From 6325503100bd61491f21ed80b7a863931bcc7a28 Mon Sep 17 00:00:00 2001
From: Chris Plummer
Date: Thu, 4 Aug 2016 16:11:30 -0700
Subject: [PATCH 020/120] 8162670: make of jtreg_tests fails if no tests are
run, causing jprt test runs to also fail
Clear the jtreg exit code when set to 1.
Reviewed-by: stsmirno, dholmes
---
jdk/test/Makefile | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/jdk/test/Makefile b/jdk/test/Makefile
index 8f2038527a3..6958d9abb58 100644
--- a/jdk/test/Makefile
+++ b/jdk/test/Makefile
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -185,6 +185,9 @@ BUNDLE_UP_AND_EXIT = \
( \
jtregExitCode=$$? && \
_summary="$(SUMMARY_TXT)"; \
+ if [ $${jtregExitCode} = 1 ] ; then \
+ jtregExitCode=0; \
+ fi; \
$(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \
$(ECHO) "$${jtregExitCode}" > $(EXITCODE); \
if [ -r "$${_summary}" ] ; then \
From 3a4f05d90c18de6043af6771ef445e923d4a2a1b Mon Sep 17 00:00:00 2001
From: Chris Plummer
Date: Thu, 4 Aug 2016 16:11:49 -0700
Subject: [PATCH 021/120] 8162670: make of jtreg_tests fails if no tests are
run, causing jprt test runs to also fail
Clear the jtreg exit code when set to 1.
Reviewed-by: stsmirno, dholmes
---
hotspot/test/Makefile | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/hotspot/test/Makefile b/hotspot/test/Makefile
index 2f2f810f37b..07f12c40801 100644
--- a/hotspot/test/Makefile
+++ b/hotspot/test/Makefile
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -226,6 +226,9 @@ BUNDLE_UP_AND_EXIT = \
( \
jtregExitCode=$$? && \
_summary="$(SUMMARY_TXT)"; \
+ if [ $${jtregExitCode} = 1 ] ; then \
+ jtregExitCode=0; \
+ fi; \
$(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \
$(ECHO) "$${jtregExitCode}" > $(EXITCODE); \
if [ -r "$${_summary}" ] ; then \
From 0052e8dc0bb1030709b7e919dadec59dbb72af32 Mon Sep 17 00:00:00 2001
From: Gustavo Romero
Date: Thu, 4 Aug 2016 22:42:05 -0400
Subject: [PATCH 022/120] 8162369: PPC64: Wrong ucontext used after SIGTRAP
while in HTM critical section
Reviewed-by: simonis
---
.../src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
index 0003988860c..554dfa42286 100644
--- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
+++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp
@@ -238,6 +238,28 @@ JVM_handle_linux_signal(int sig,
}
}
+ // Make the signal handler transaction-aware by checking the existence of a
+ // second (transactional) context with MSR TS bits active. If the signal is
+ // caught during a transaction, then just return to the HTM abort handler.
+ // Please refer to Linux kernel document powerpc/transactional_memory.txt,
+ // section "Signals".
+ if (uc && uc->uc_link) {
+ ucontext_t* second_uc = uc->uc_link;
+
+ // MSR TS bits are 29 and 30 (Power ISA, v2.07B, Book III-S, pp. 857-858,
+ // 3.2.1 "Machine State Register"), however note that ISA notation for bit
+ // numbering is MSB 0, so for normal bit numbering (LSB 0) they come to be
+ // bits 33 and 34. It's not related to endianness, just a notation matter.
+ if (second_uc->uc_mcontext.regs->msr & 0x600000000) {
+ if (TraceTraps) {
+ tty->print_cr("caught signal in transaction, "
+ "ignoring to jump to abort handler");
+ }
+ // Return control to the HTM abort handler.
+ return true;
+ }
+ }
+
JavaThread* thread = NULL;
VMThread* vmthread = NULL;
if (os::Linux::signal_handlers_are_installed) {
From 7c82dd1d0495945afe71f9bcf7457689acb25dfc Mon Sep 17 00:00:00 2001
From: Ambarish Rapte
Date: Fri, 5 Aug 2016 15:48:37 +0530
Subject: [PATCH 023/120] 8039081: [TEST_BUG] Test
java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java fails
Reviewed-by: serb, psadhukhan
---
.../share/classes/java/awt/TrayIcon.java | 3 ++
.../classes/sun/awt/X11/XTrayIconPeer.java | 25 ++++++++++-
.../PopupMenuLeakTest/PopupMenuLeakTest.java | 41 ++++++++++++++-----
3 files changed, 57 insertions(+), 12 deletions(-)
diff --git a/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java b/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java
index 7c7a5f9af6f..ccbf0ae0599 100644
--- a/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java
+++ b/jdk/src/java.desktop/share/classes/java/awt/TrayIcon.java
@@ -703,6 +703,9 @@ public class TrayIcon {
synchronized (this) {
p = peer;
peer = null;
+ if (popup != null) {
+ popup.removeNotify();
+ }
}
if (p != null) {
p.dispose();
diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java
index fa1ba5dcf03..b4b949c513e 100644
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java
@@ -93,7 +93,6 @@ public class XTrayIconPeer implements TrayIconPeer,
if (XWM.getWMID() != XWM.METACITY_WM) {
parentXED = dummyXED; // We don't like to leave it 'null'.
-
} else {
parentXED = new XEventDispatcher() {
// It's executed under AWTLock.
@@ -300,10 +299,19 @@ public class XTrayIconPeer implements TrayIconPeer,
removeXED(getWindow(), eframeXED);
removeXED(eframeParentID, parentXED);
+ removeListeners();
eframe.realDispose();
balloon.dispose();
+ tooltip.dispose();
isTrayIconDisplayed = false;
+ canvas.dispose();
+ canvas = null;
+ popup = null;
+ balloon = null;
+ tooltip = null;
XToolkit.targetDisposedPeer(target, this);
+ target = null;
+ eframe = null;
}
public static void suppressWarningString(Window w) {
@@ -416,6 +424,12 @@ public class XTrayIconPeer implements TrayIconPeer,
eframe.addMouseListener(eventProxy);
}
+ void removeListeners() {
+ canvas.removeMouseListener(eventProxy);
+ canvas.removeMouseMotionListener(eventProxy);
+ eframe.removeMouseListener(eventProxy);
+ }
+
long getWindow() {
return AWTAccessor.getComponentAccessor()
.getPeer(eframe).getWindow();
@@ -550,6 +564,11 @@ public class XTrayIconPeer implements TrayIconPeer,
super.repaintImage(doClear || (old_autosize != autosize));
}
+
+ public void dispose() {
+ super.dispose();
+ target = null;
+ }
}
@SuppressWarnings("serial") // JDK-implementation class
@@ -573,6 +592,10 @@ public class XTrayIconPeer implements TrayIconPeer,
repaintImage(true);
}
+ public void dispose() {
+ observer = null;
+ }
+
// Invoke on EDT.
protected void repaintImage(boolean doClear) {
Graphics g = getGraphics();
diff --git a/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java b/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java
index 1b607817698..a8f62ab9c26 100644
--- a/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java
+++ b/jdk/test/java/awt/TrayIcon/PopupMenuLeakTest/PopupMenuLeakTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,17 +22,25 @@
*/
/*
- @test
- @key headful
- @bug 8007220
- @summary Reference to the popup leaks after the TrayIcon is removed
- @author Petr Pchelko
+ @test
+ @key headful
+ @bug 8007220 8039081
+ @summary Reference to the popup leaks after the TrayIcon is removed.
+ @requires os.family != "windows"
@library ../../../../lib/testlibrary/
@build ExtendedRobot
@run main/othervm -Xmx50m PopupMenuLeakTest
*/
-import java.awt.*;
+import java.awt.AWTException;
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.MenuItem;
+import java.awt.PopupMenu;
+import java.awt.RenderingHints;
+import java.awt.SystemTray;
+import java.awt.TrayIcon;
import javax.swing.SwingUtilities;
import java.awt.image.BufferedImage;
@@ -45,7 +53,6 @@ public class PopupMenuLeakTest {
static final AtomicReference> iconWeakReference = new AtomicReference<>();
static final AtomicReference> popupWeakReference = new AtomicReference<>();
static ExtendedRobot robot;
-
public static void main(String[] args) throws Exception {
robot = new ExtendedRobot();
SwingUtilities.invokeAndWait(PopupMenuLeakTest::createSystemTrayIcon);
@@ -55,8 +62,8 @@ public class PopupMenuLeakTest {
sleep();
SwingUtilities.invokeAndWait(PopupMenuLeakTest::removeIcon);
sleep();
- assertCollected(popupWeakReference.get(), "Failed, reference to popup not collected");
assertCollected(iconWeakReference.get(), "Failed, reference to tray icon not collected");
+ assertCollected(popupWeakReference.get(), "Failed, reference to popup not collected");
}
private static void addNotifyPopup() {
@@ -78,12 +85,17 @@ public class PopupMenuLeakTest {
private static void assertCollected(WeakReference> reference, String message) {
java.util.List bytes = new ArrayList<>();
for (int i = 0; i < 5; i ++) {
+ if (reference.get() == null) {
+ // reference is collected, avoid OOMs.
+ break;
+ }
try {
while (true) {
- bytes.add(new byte[1024]);
+ bytes.add(new byte[4096]);
}
} catch (OutOfMemoryError err) {
- bytes = new ArrayList<>();
+ bytes.clear();
+ causeGC();
}
}
if (reference.get() != null) {
@@ -91,6 +103,13 @@ public class PopupMenuLeakTest {
}
}
+ private static void causeGC() {
+ System.gc();
+ System.runFinalization();
+ robot.delay(1000);
+ }
+
+
private static void createSystemTrayIcon() {
final TrayIcon trayIcon = new TrayIcon(createTrayIconImage());
trayIcon.setImageAutoSize(true);
From fdfda0df821b56908cebc9d6a341f4cfabf1ee63 Mon Sep 17 00:00:00 2001
From: Sergey Bylokhov
Date: Fri, 5 Aug 2016 16:20:02 +0300
Subject: [PATCH 024/120] 8162970: Merge error in the DefaultRowSorter.java
Reviewed-by: alexsch
---
.../share/classes/javax/swing/DefaultRowSorter.java | 5 -----
1 file changed, 5 deletions(-)
diff --git a/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java b/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java
index 3334f5f8342..5bc2f0687a9 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java
@@ -81,11 +81,6 @@ import java.util.List;
* sort order is unsorted (the same as the model), and columns are
* sortable by default.
*
- * If the underlying model structure changes (the
- * modelStructureChanged
method is invoked) the following
- * are reset to their default values: Comparator
s by column,
- * current sort order and whether a column is sortable.
- *
* DefaultRowSorter
is an abstract class. Concrete
* subclasses must provide access to the underlying data by invoking
* {@code setModelWrapper}. The {@code setModelWrapper} method
From b06d871fad6bcc260cac121fecd703512141a86c Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko
Date: Fri, 5 Aug 2016 16:22:30 +0300
Subject: [PATCH 025/120] 8161279: Various JMX-tests timed out
Reviewed-by: kvn
---
.../compiler/codecache/jmx/ThresholdNotificationsTest.java | 4 +++-
.../compiler/codecache/jmx/UsageThresholdExceededTest.java | 4 +++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
index 86b22cd5fec..bd22973fe4e 100644
--- a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
+++ b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
@@ -63,7 +63,9 @@ public class ThresholdNotificationsTest implements NotificationListener {
public static void main(String[] args) {
for (BlobType bt : BlobType.getAvailable()) {
- new ThresholdNotificationsTest(bt).runTest();
+ if (CodeCacheUtils.isCodeHeapPredictable(bt)) {
+ new ThresholdNotificationsTest(bt).runTest();
+ }
}
}
diff --git a/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java b/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java
index baa2ebe351b..154a096a277 100644
--- a/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java
+++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdExceededTest.java
@@ -63,7 +63,9 @@ public class UsageThresholdExceededTest {
public static void main(String[] args) {
int iterationsCount = Integer.getInteger("jdk.test.lib.iterations", 1);
for (BlobType btype : BlobType.getAvailable()) {
- new UsageThresholdExceededTest(btype, iterationsCount).runTest();
+ if (CodeCacheUtils.isCodeHeapPredictable(btype)) {
+ new UsageThresholdExceededTest(btype, iterationsCount).runTest();
+ }
}
}
From 8d7182f2a747ecefb79f4555b742462b8dc0d49a Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko
Date: Fri, 5 Aug 2016 16:23:44 +0300
Subject: [PATCH 026/120] 8157498:
compiler/codecache/jmx/InitialAndMaxUsageTest.java times out on 32-bit
platforms
Reviewed-by: kvn
---
hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
index ea17ba28bdb..a0ca3a46b29 100644
--- a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
+++ b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
@@ -90,7 +90,7 @@ public class InitialAndMaxUsageTest {
Asserts.assertEQ(initialUsage, 0L, "Unexpected initial usage");
}
ArrayList blobs = new ArrayList<>();
- long minAllocationUnit = Math.max(0, CodeCacheUtils.MIN_ALLOCATION - headerSize);
+ long minAllocationUnit = Math.max(1, CodeCacheUtils.MIN_ALLOCATION - headerSize);
/* now filling code cache with large-sized allocation first, since
lots of small allocations takes too much time, so, just a small
optimization */
From 6ca8a98449488d6ab9528049357597854f09432a Mon Sep 17 00:00:00 2001
From: Igor Veresov
Date: Sat, 6 Aug 2016 11:52:37 -0700
Subject: [PATCH 027/120] 8163313: assert(comp != __null) failed: compiler not
available
Constrain compLevel parameter in WB_IsIntrinsicAvailable() to supported levels
Reviewed-by: kvn
---
hotspot/src/share/vm/prims/whitebox.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hotspot/src/share/vm/prims/whitebox.cpp b/hotspot/src/share/vm/prims/whitebox.cpp
index 90a9e56da5c..6228453f6cc 100644
--- a/hotspot/src/share/vm/prims/whitebox.cpp
+++ b/hotspot/src/share/vm/prims/whitebox.cpp
@@ -679,7 +679,7 @@ WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobje
WB_END
WB_ENTRY(jboolean, WB_IsIntrinsicAvailable(JNIEnv* env, jobject o, jobject method, jobject compilation_context, jint compLevel))
- if (compLevel < CompLevel_none || compLevel > TieredStopAtLevel) {
+ if (compLevel < CompLevel_none || compLevel > MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier)) {
return false; // Intrinsic is not available on a non-existent compilation level.
}
jmethodID method_id, compilation_context_id;
From 2bd07e4f391204e4afdf0101a5e8e4caad927c78 Mon Sep 17 00:00:00 2001
From: Robin Stevens
Date: Mon, 8 Aug 2016 11:40:39 +0400
Subject: [PATCH 028/120] 8161664: Memory leak in
com.apple.laf.AquaProgressBarUI removed progress bar still referenced
Reviewed-by: serb, alexsch
---
.../com/apple/laf/AquaProgressBarUI.java | 8 +-
.../8161664/ProgressBarMemoryLeakTest.java | 108 ++++++++++++++++++
2 files changed, 114 insertions(+), 2 deletions(-)
create mode 100644 jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java
diff --git a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java
index 9f5f09bbd1e..1745c910b9c 100644
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java
@@ -124,7 +124,9 @@ public class AquaProgressBarUI extends ProgressBarUI implements ChangeListener,
if (!progressBar.isIndeterminate()) return;
stopAnimationTimer();
// start the animation thread
- startAnimationTimer();
+ if (progressBar.isDisplayable()) {
+ startAnimationTimer();
+ }
}
if ("JProgressBar.style".equals(prop)) {
@@ -141,7 +143,9 @@ public class AquaProgressBarUI extends ProgressBarUI implements ChangeListener,
public void ancestorAdded(final AncestorEvent e) {
if (!progressBar.isIndeterminate()) return;
- startAnimationTimer();
+ if (progressBar.isDisplayable()) {
+ startAnimationTimer();
+ }
}
public void ancestorMoved(final AncestorEvent e) { }
diff --git a/jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java b/jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java
new file mode 100644
index 00000000000..b79d03b674d
--- /dev/null
+++ b/jdk/test/javax/swing/JProgressBar/8161664/ProgressBarMemoryLeakTest.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 8161664
+ * @summary Memory leak in com.apple.laf.AquaProgressBarUI: removed progress bar still referenced
+ * @library ../../regtesthelpers
+ * @build Util
+ * @key headful
+ * @run main/timeout=300/othervm -Xmx16m ProgressBarMemoryLeakTest
+ */
+import java.awt.EventQueue;
+import java.lang.ref.WeakReference;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+public class ProgressBarMemoryLeakTest {
+
+ private static JFrame sFrame;
+ private static WeakReference sProgressBar;
+
+ public static void main(String[] args) throws Exception {
+ UIManager.LookAndFeelInfo[] installedLookAndFeels = UIManager.getInstalledLookAndFeels();
+ for ( UIManager.LookAndFeelInfo installedLookAndFeel : installedLookAndFeels ) {
+ executeTestCase(installedLookAndFeel.getClassName());
+ }
+ }
+
+ private static void executeTestCase(String lookAndFeelString) throws Exception{
+ if (tryLookAndFeel(lookAndFeelString)) {
+ EventQueue.invokeAndWait( new Runnable() {
+ @Override
+ public void run() {
+ showUI();
+ }
+ } );
+ EventQueue.invokeAndWait( new Runnable() {
+ @Override
+ public void run() {
+ disposeUI();
+ }
+ } );
+ Util.generateOOME();
+ JProgressBar progressBar = sProgressBar.get();
+ if ( progressBar != null ) {
+ throw new RuntimeException( "Progress bar (using L&F: " + lookAndFeelString + ") should have been GC-ed" );
+ }
+ }
+ }
+
+ private static void showUI(){
+ sFrame = new JFrame();
+
+ JProgressBar progressBar = new JProgressBar();
+ progressBar.setVisible(false);
+ progressBar.setIndeterminate(false);
+ progressBar.setIndeterminate(true);
+ progressBar.setIndeterminate(false);
+ progressBar.setValue(10);
+ progressBar.setString("Progress");
+
+ sFrame.add(progressBar);
+
+ sProgressBar = new WeakReference<>(progressBar);
+
+ sFrame.setSize(200,200);
+ sFrame.setVisible(true);
+ }
+
+ private static void disposeUI(){
+ sFrame.setContentPane(new JPanel());
+ sFrame.dispose();
+ sFrame = null;
+ }
+
+ private static boolean tryLookAndFeel(String lookAndFeelString) throws Exception {
+ try {
+ UIManager.setLookAndFeel(lookAndFeelString);
+ } catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException e) {
+ return false;
+ }
+ return true;
+ }
+}
From 91f07066008561f5efb254f2006898163e8b39fe Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko
Date: Mon, 8 Aug 2016 11:30:46 +0300
Subject: [PATCH 029/120] 8163243: [TESTBUG]
compiler/codecache/jmx/UsageThresholdIncreasedTest.java failed with: Failed
to find sun/hotspot/WhiteBox.class
Reviewed-by: iveresov
---
.../compiler/codecache/jmx/UsageThresholdIncreasedTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java b/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java
index 2f628229cf1..f432f8a1e70 100644
--- a/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java
+++ b/hotspot/test/compiler/codecache/jmx/UsageThresholdIncreasedTest.java
@@ -29,9 +29,9 @@
* @modules java.base/jdk.internal.misc
* java.management
*
+ * @build compiler.codecache.jmx.UsageThresholdIncreasedTest
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @build compiler.codecache.jmx.UsageThresholdIncreasedTest
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:+WhiteBoxAPI -XX:-UseCodeCacheFlushing -XX:-MethodFlushing
* -XX:CompileCommand=compileonly,null::*
From 91414d0dfc9b94ff0df9c744766e68a492f0bb6e Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko
Date: Mon, 8 Aug 2016 11:32:11 +0300
Subject: [PATCH 030/120] 8129523:
java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java timeout
Reviewed-by: kvn
---
.../java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java b/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java
index 6f4ad86a280..08bce54147f 100644
--- a/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java
+++ b/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java
@@ -23,7 +23,6 @@
/*
* @test LFSingleThreadCachingTest
- * @ignore 8129523
* @bug 8046703
* @key randomness
* @summary Test verifies that lambda forms are cached when run with single thread
@@ -33,7 +32,7 @@
* @build LambdaFormTestCase
* @build LFCachingTestCase
* @build LFSingleThreadCachingTest
- * @run main/othervm LFSingleThreadCachingTest
+ * @run main/othervm -XX:ReservedCodeCacheSize=128m LFSingleThreadCachingTest
*/
import java.lang.invoke.MethodHandle;
From 4d61582818adcf3690acbb30ab87c688d499701f Mon Sep 17 00:00:00 2001
From: Yasumasa Suenaga
Date: Mon, 8 Aug 2016 21:59:12 +0900
Subject: [PATCH 031/120] 8163272: jhsdb jinfo cannot show system properties
Reviewed-by: dholmes, dsamersoff
---
.../jvm/hotspot/utilities/ObjectReader.java | 58 +++++++++++++++++--
1 file changed, 53 insertions(+), 5 deletions(-)
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java
index 1a8afe111eb..9cb559bf31c 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java
@@ -26,6 +26,7 @@ package sun.jvm.hotspot.utilities;
import java.lang.reflect.Modifier;
import java.util.*;
+import java.util.stream.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
@@ -204,15 +205,29 @@ public class ObjectReader {
}
}
- protected Object getHashtable(Instance oop, boolean isProperties) {
+ private void setPropertiesEntry(java.util.Properties p, Oop oop) {
+ InstanceKlass ik = (InstanceKlass)oop.getKlass();
+ OopField keyField = (OopField)ik.findField("key", "Ljava/lang/Object;");
+ OopField valueField = (OopField)ik.findField("val", "Ljava/lang/Object;");
+
+ try {
+ p.setProperty((String)readObject(keyField.getValue(oop)),
+ (String)readObject(valueField.getValue(oop)));
+ } catch (ClassNotFoundException ce) {
+ if (DEBUG) {
+ debugPrintStackTrace(ce);
+ }
+ }
+ }
+
+ protected Object getHashtable(Instance oop) {
InstanceKlass k = (InstanceKlass)oop.getKlass();
OopField tableField = (OopField)k.findField("table", "[Ljava/util/Hashtable$Entry;");
if (tableField == null) {
debugPrintln("Could not find field of [Ljava/util/Hashtable$Entry;");
return null;
}
- java.util.Hashtable table = (isProperties) ? new java.util.Properties()
- : new java.util.Hashtable();
+ java.util.Hashtable table = new java.util.Hashtable();
ObjArray kvs = (ObjArray)tableField.getValue(oop);
long size = kvs.getLength();
debugPrintln("Hashtable$Entry Size = " + size);
@@ -225,6 +240,39 @@ public class ObjectReader {
return table;
}
+ private Properties getProperties(Instance oop) {
+ InstanceKlass k = (InstanceKlass)oop.getKlass();
+ OopField mapField = (OopField)k.findField("map", "Ljava/util/concurrent/ConcurrentHashMap;");
+ if (mapField == null) {
+ debugPrintln("Could not find field of Ljava/util/concurrent/ConcurrentHashMap");
+ return null;
+ }
+
+ Instance mapObj = (Instance)mapField.getValue(oop);
+ if (mapObj == null) {
+ debugPrintln("Could not get map field from java.util.Properties");
+ return null;
+ }
+
+ InstanceKlass mk = (InstanceKlass)mapObj.getKlass();
+ OopField tableField = (OopField)mk.findField("table", "[Ljava/util/concurrent/ConcurrentHashMap$Node;");
+ if (tableField == null) {
+ debugPrintln("Could not find field of [Ljava/util/concurrent/ConcurrentHashMap$Node");
+ return null;
+ }
+
+ java.util.Properties props = new java.util.Properties();
+ ObjArray kvs = (ObjArray)tableField.getValue(mapObj);
+ long size = kvs.getLength();
+ debugPrintln("ConcurrentHashMap$Node Size = " + size);
+ LongStream.range(0, size)
+ .mapToObj(kvs::getObjAt)
+ .filter(o -> o != null)
+ .forEach(o -> setPropertiesEntry(props, o));
+
+ return props;
+ }
+
public Object readInstance(Instance oop) throws ClassNotFoundException {
Object result = getFromObjTable(oop);
if (result == null) {
@@ -240,11 +288,11 @@ public class ObjectReader {
}
if (kls.getName().equals(javaUtilHashtable())) {
- return getHashtable(oop, false);
+ return getHashtable(oop);
}
if (kls.getName().equals(javaUtilProperties())) {
- return getHashtable(oop, true);
+ return getProperties(oop);
}
Class clz = readClass(kls);
From 6500bf0035617d7e38d7c7bc6070a256ae6646a6 Mon Sep 17 00:00:00 2001
From: Yasumasa Suenaga
Date: Mon, 8 Aug 2016 21:59:33 +0900
Subject: [PATCH 032/120] 8163272: jhsdb jinfo cannot show system properties
Reviewed-by: dholmes, dsamersoff
---
.../sun/tools/jhsdb/BasicLauncherTest.java | 29 ++++++++++++-------
1 file changed, 19 insertions(+), 10 deletions(-)
diff --git a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
index 4125dbfb4d4..604b28241ee 100644
--- a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
+++ b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
@@ -40,6 +40,7 @@ import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
+import java.util.Optional;
import jdk.testlibrary.JDKToolLauncher;
import jdk.testlibrary.Utils;
import jdk.testlibrary.OutputAnalyzer;
@@ -111,7 +112,8 @@ public class BasicLauncherTest {
* @param vmArgs - vm and java arguments to launch test app
* @return exit code of tool
*/
- public static void launch(String expectedMessage, List toolArgs)
+ public static void launch(String expectedMessage,
+ Optional unexpectedMessage, List toolArgs)
throws IOException {
System.out.println("Starting LingeredApp");
@@ -131,6 +133,7 @@ public class BasicLauncherTest {
processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);;
output.shouldContain(expectedMessage);
+ unexpectedMessage.ifPresent(output::shouldNotContain);
output.shouldHaveExitValue(0);
} catch (Exception ex) {
@@ -140,13 +143,16 @@ public class BasicLauncherTest {
}
}
- public static void launch(String expectedMessage, String... toolArgs)
+ public static void launch(String expectedMessage,
+ String unexpectedMessage, String... toolArgs)
throws IOException {
- launch(expectedMessage, Arrays.asList(toolArgs));
+ launch(expectedMessage, Optional.ofNullable(unexpectedMessage),
+ Arrays.asList(toolArgs));
}
- public static void launchNotOSX(String expectedMessage, String... toolArgs)
+ public static void launchNotOSX(String expectedMessage,
+ String unexpectedMessage, String... toolArgs)
throws IOException {
if (Platform.isOSX()) {
@@ -154,6 +160,8 @@ public class BasicLauncherTest {
System.out.println("This test is not expected to work on OS X. Skipping");
return;
}
+
+ launch(expectedMessage, unexpectedMessage, toolArgs);
}
public static void testHeapDump() throws IOException {
@@ -164,7 +172,7 @@ public class BasicLauncherTest {
}
dump.deleteOnExit();
- launch("heap written to", "jmap",
+ launch("heap written to", null, "jmap",
"--binaryheap", "--dumpfile=" + dump.getAbsolutePath());
assertTrue(dump.exists() && dump.isFile(),
@@ -182,11 +190,12 @@ public class BasicLauncherTest {
launchCLHSDB();
- launch("compiler detected", "jmap", "--clstats");
- launchNotOSX("No deadlocks found", "jstack");
- launch("compiler detected", "jmap");
- launch("Java System Properties", "jinfo");
- launch("java.threads", "jsnap");
+ launch("compiler detected", null, "jmap", "--clstats");
+ launchNotOSX("No deadlocks found", null, "jstack");
+ launch("compiler detected", null, "jmap");
+ launch("Java System Properties",
+ "System Properties info not available", "jinfo");
+ launch("java.threads", null, "jsnap");
testHeapDump();
From bd4e4b5bfbd8010da555611a653f5cbee83608db Mon Sep 17 00:00:00 2001
From: Sharath Ballal
Date: Mon, 8 Aug 2016 17:15:46 +0300
Subject: [PATCH 033/120] 8163269: Testcase missed in push for JDK-8160817
Add missed testcase
Reviewed-by: dsamersoff
---
.../sa/sadebugd/SADebugDTest.java | 85 +++++++++++++++++++
1 file changed, 85 insertions(+)
create mode 100644 hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
diff --git a/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
new file mode 100644
index 00000000000..7264ee2cf24
--- /dev/null
+++ b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Checks that the jshdb debugd utility sucessfully starts
+ * and tries to attach to a running process
+ * @modules java.base/jdk.internal.misc
+ * @library /test/lib/share/classes
+ *
+ * @run main/othervm SADebugDTest
+ */
+import java.io.File;
+import java.util.concurrent.CountDownLatch;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
+import java.io.Reader;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
+import static jdk.test.lib.Asserts.assertTrue;
+import static jdk.test.lib.Platform.shouldSAAttach;
+import static jdk.test.lib.process.ProcessTools.startProcess;
+
+public class SADebugDTest {
+
+ private static final String GOLDEN = "Attaching to process ID %d and starting RMI services, please wait...";
+
+ private static final String JAVA_HOME = (System.getProperty("test.jdk") != null)
+ ? System.getProperty("test.jdk") : System.getProperty("java.home");
+
+ private static final String JAVA_BIN_DIR
+ = JAVA_HOME + File.separator + "bin" + File.separator;
+
+ private static final String JHSDB = JAVA_BIN_DIR + "jhsdb";
+
+ public static void main(String[] args) throws Exception {
+
+ if (!shouldSAAttach()) {
+ log("Not possible to attach the SA. Skipping the test");
+ return;
+ }
+
+ long ourPid = ProcessHandle.current().getPid();
+
+ // The string we are expecting in the debugd ouput
+ String golden = String.format(GOLDEN, ourPid);
+
+ // We are going to run 'jhsdb debugd '
+ // The startProcess will block untl the 'golden' string appears in either process' stdout or stderr
+ // In case of timeout startProcess kills the debugd process
+ ProcessBuilder pb = new ProcessBuilder();
+ pb.command(JHSDB, "debugd", String.valueOf(ourPid));
+ Process debugd = startProcess("debugd", pb, null, (line) -> line.trim().contains(golden), 0, TimeUnit.SECONDS);
+
+ // If we are here, this means we have received the golden line and the test has passed
+ // The debugd remains running, we have to kill it
+ debugd.destroy();
+
+ }
+
+ private static void log(String string) {
+ System.out.println(string);
+ }
+
+}
From e9ea1b08e89aba0634f386da94eec25d675e13d6 Mon Sep 17 00:00:00 2001
From: Doug Simon
Date: Mon, 8 Aug 2016 17:06:21 +0200
Subject: [PATCH 034/120] 8163105: SIGSEGV:
constantPoolHandle::constantPoolHandle(ConstantPool*)
Simplify CompilerToVM.getConstantPool() and related tests.
Reviewed-by: kvn, zmajo
---
.../src/jdk/vm/ci/hotspot/CompilerToVM.java | 29 ++-
.../HotSpotResolvedJavaMethodImpl.java | 2 +-
.../HotSpotResolvedObjectTypeImpl.java | 2 +-
.../src/share/vm/jvmci/jvmciCompilerToVM.cpp | 41 ++--
.../jdk/vm/ci/hotspot/CompilerToVMHelper.java | 4 +-
.../compilerToVM/GetConstantPoolTest.java | 183 ++++--------------
6 files changed, 72 insertions(+), 189 deletions(-)
diff --git a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java
index 72f9d18caa3..c96da48e6fc 100644
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java
@@ -265,9 +265,10 @@ final class CompilerToVM {
native HotSpotResolvedObjectTypeImpl resolveTypeInPool(HotSpotConstantPool constantPool, int cpi) throws LinkageError;
/**
- * Looks up and attempts to resolve the {@code JVM_CONSTANT_Field} entry for at index {@code cpi} in
- * {@code constantPool}. For some opcodes, checks are performed that require the {@code method}
- * that contains {@code opcode} to be specified. The values returned in {@code info} are:
+ * Looks up and attempts to resolve the {@code JVM_CONSTANT_Field} entry for at index
+ * {@code cpi} in {@code constantPool}. For some opcodes, checks are performed that require the
+ * {@code method} that contains {@code opcode} to be specified. The values returned in
+ * {@code info} are:
*
*
* [(int) flags, // only valid if field is resolved
@@ -556,20 +557,18 @@ final class CompilerToVM {
native HotSpotResolvedJavaMethodImpl getResolvedJavaMethod(Object base, long displacement);
/**
- * Read a HotSpot ConstantPool* value from the memory location described by {@code base} plus
- * {@code displacement} and return the {@link HotSpotConstantPool} wrapping it. This method does
- * no checking that the memory location actually contains a valid pointer and may crash the VM
- * if an invalid location is provided. If the {@code base} is null then {@code displacement} is
- * used by itself. If {@code base} is a {@link HotSpotResolvedJavaMethodImpl},
- * {@link HotSpotConstantPool} or {@link HotSpotResolvedObjectTypeImpl} then the metaspace
- * pointer is fetched from that object and added to {@code displacement}. Any other non-null
- * object type causes an {@link IllegalArgumentException} to be thrown.
+ * Gets the {@code ConstantPool*} associated with {@code object} and returns a
+ * {@link HotSpotConstantPool} wrapping it.
*
- * @param base an object to read from or null
- * @param displacement
- * @return null or the resolved method for this location
+ * @param object a {@link HotSpotResolvedJavaMethodImpl} or
+ * {@link HotSpotResolvedObjectTypeImpl} object
+ * @return a {@link HotSpotConstantPool} wrapping the {@code ConstantPool*} associated with
+ * {@code object}
+ * @throws NullPointerException if {@code object == null}
+ * @throws IllegalArgumentException if {@code object} is neither a
+ * {@link HotSpotResolvedJavaMethodImpl} nor a {@link HotSpotResolvedObjectTypeImpl}
*/
- native HotSpotConstantPool getConstantPool(Object base, long displacement);
+ native HotSpotConstantPool getConstantPool(Object object);
/**
* Read a HotSpot Klass* value from the memory location described by {@code base} plus
diff --git a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java
index b861b2cec99..196616c4d61 100644
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java
@@ -121,7 +121,7 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
if (metaspaceConstantPool == holder.getConstantPool().getMetaspaceConstantPool()) {
this.constantPool = holder.getConstantPool();
} else {
- this.constantPool = compilerToVM().getConstantPool(null, constMethod + config.constMethodConstantsOffset);
+ this.constantPool = compilerToVM().getConstantPool(this);
}
final int nameIndex = UNSAFE.getChar(constMethod + config.constMethodNameIndexOffset);
diff --git a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java
index 636c26c2c6c..b2ff5b32491 100644
--- a/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java
+++ b/hotspot/src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl.java
@@ -445,7 +445,7 @@ final class HotSpotResolvedObjectTypeImpl extends HotSpotResolvedJavaType implem
* operating on the latest one and that HotSpotResolvedJavaMethodImpls will be able to
* use the shared copy instead of creating their own instance.
*/
- constantPool = compilerToVM().getConstantPool(this, config().instanceKlassConstantsOffset);
+ constantPool = compilerToVM().getConstantPool(this);
}
return constantPool;
}
diff --git a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
index 36837cda7f4..edc47626853 100644
--- a/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
+++ b/hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
@@ -461,31 +461,26 @@ C2V_VMENTRY(jobject, getResolvedJavaMethod, (JNIEnv *, jobject, jobject base, jl
return JNIHandles::make_local(THREAD, result);
}
-C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject base, jlong offset))
+C2V_VMENTRY(jobject, getConstantPool, (JNIEnv *, jobject, jobject object_handle))
constantPoolHandle cp;
- oop base_object = JNIHandles::resolve(base);
- jlong base_address = 0;
- if (base_object != NULL) {
- if (base_object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) {
- base_address = HotSpotResolvedJavaMethodImpl::metaspaceMethod(base_object);
- } else if (base_object->is_a(SystemDictionary::HotSpotConstantPool_klass())) {
- base_address = HotSpotConstantPool::metaspaceConstantPool(base_object);
- } else if (base_object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) {
- base_address = (jlong) CompilerToVM::asKlass(base_object);
- } else {
- THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
- err_msg("Unexpected type: %s", base_object->klass()->external_name()));
- }
+ oop object = JNIHandles::resolve(object_handle);
+ if (object == NULL) {
+ THROW_0(vmSymbols::java_lang_NullPointerException());
}
- cp = *((ConstantPool**) (intptr_t) (base_address + offset));
- if (!cp.is_null()) {
- JavaValue method_result(T_OBJECT);
- JavaCallArguments args;
- args.push_long((jlong) (address) cp());
- JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL);
- return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());
+ if (object->is_a(SystemDictionary::HotSpotResolvedJavaMethodImpl_klass())) {
+ cp = CompilerToVM::asMethod(object)->constMethod()->constants();
+ } else if (object->is_a(SystemDictionary::HotSpotResolvedObjectTypeImpl_klass())) {
+ cp = InstanceKlass::cast(CompilerToVM::asKlass(object))->constants();
+ } else {
+ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
+ err_msg("Unexpected type: %s", object->klass()->external_name()));
}
- return NULL;
+ assert(!cp.is_null(), "npe");
+ JavaValue method_result(T_OBJECT);
+ JavaCallArguments args;
+ args.push_long((jlong) (address) cp());
+ JavaCalls::call_static(&method_result, SystemDictionary::HotSpotConstantPool_klass(), vmSymbols::fromMetaspace_name(), vmSymbols::constantPool_fromMetaspace_signature(), &args, CHECK_NULL);
+ return JNIHandles::make_local(THREAD, (oop)method_result.get_jobject());
}
C2V_VMENTRY(jobject, getResolvedJavaType, (JNIEnv *, jobject, jobject base, jlong offset, jboolean compressed))
@@ -1522,7 +1517,7 @@ JNINativeMethod CompilerToVM::methods[] = {
{CC "getMaxCallTargetOffset", CC "(J)J", FN_PTR(getMaxCallTargetOffset)},
{CC "getResolvedJavaMethodAtSlot", CC "(" CLASS "I)" HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)},
{CC "getResolvedJavaMethod", CC "(Ljava/lang/Object;J)" HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethod)},
- {CC "getConstantPool", CC "(Ljava/lang/Object;J)" HS_CONSTANT_POOL, FN_PTR(getConstantPool)},
+ {CC "getConstantPool", CC "(Ljava/lang/Object;)" HS_CONSTANT_POOL, FN_PTR(getConstantPool)},
{CC "getResolvedJavaType", CC "(Ljava/lang/Object;JZ)" HS_RESOLVED_KLASS, FN_PTR(getResolvedJavaType)},
{CC "readConfiguration", CC "()[" OBJECT, FN_PTR(readConfiguration)},
{CC "installCode", CC "(" TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG ")I", FN_PTR(installCode)},
diff --git a/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java b/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java
index f2b40928602..2985ed89a94 100644
--- a/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java
+++ b/hotspot/test/compiler/jvmci/common/patches/jdk.vm.ci/jdk/vm/ci/hotspot/CompilerToVMHelper.java
@@ -273,8 +273,8 @@ public class CompilerToVMHelper {
return CTVM.getResolvedJavaMethod(base, displacement);
}
- public static HotSpotConstantPool getConstantPool(Object base, long displacement) {
- return CTVM.getConstantPool(base, displacement);
+ public static HotSpotConstantPool getConstantPool(Object object) {
+ return CTVM.getConstantPool(object);
}
public static HotSpotResolvedObjectType getResolvedJavaType(Object base,
diff --git a/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java b/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java
index ceb35fe6378..097d42e5235 100644
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java
+++ b/hotspot/test/compiler/jvmci/compilerToVM/GetConstantPoolTest.java
@@ -29,187 +29,76 @@
* @library /testlibrary /test/lib /
* @library ../common/patches
* @modules java.base/jdk.internal.misc
- * @modules jdk.vm.ci/jdk.vm.ci.hotspot
+ * @modules java.base/jdk.internal.org.objectweb.asm
+ java.base/jdk.internal.org.objectweb.asm.tree
+ jdk.vm.ci/jdk.vm.ci.hotspot
* jdk.vm.ci/jdk.vm.ci.meta
+ * jdk.vm.ci/jdk.vm.ci.code
*
* @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
- * @build jdk.vm.ci/jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject
* @build compiler.jvmci.compilerToVM.GetConstantPoolTest
- * @build sun.hotspot.WhiteBox
- * @run driver ClassFileInstaller sun.hotspot.WhiteBox
- * sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:.
- * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * -XX:+UnlockDiagnosticVMOptions
* -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* compiler.jvmci.compilerToVM.GetConstantPoolTest
*/
package compiler.jvmci.compilerToVM;
-import jdk.internal.misc.Unsafe;
import jdk.test.lib.Utils;
+import compiler.jvmci.common.CTVMUtilities;
+import compiler.jvmci.common.testcases.TestCase;
import jdk.vm.ci.hotspot.CompilerToVMHelper;
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
-import jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject;
+import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
import jdk.vm.ci.meta.ConstantPool;
-import sun.hotspot.WhiteBox;
import java.lang.reflect.Field;
+import java.lang.reflect.Executable;
/**
* Tests for jdk.vm.ci.hotspot.CompilerToVM::getConstantPool method
*/
public class GetConstantPoolTest {
- private static enum TestCase {
- NULL_BASE {
- @Override
- ConstantPool getConstantPool() {
- return CompilerToVMHelper.getConstantPool(null,
- getPtrToCpAddress());
- }
- },
- JAVA_METHOD_BASE {
- @Override
- ConstantPool getConstantPool() {
- HotSpotResolvedJavaMethod methodInstance
- = CompilerToVMHelper.getResolvedJavaMethodAtSlot(
- TEST_CLASS, 0);
- Field field;
- try {
- // jdk.vm.ci.hotspot.HotSpotResolvedJavaMethodImpl.metaspaceMethod
- field = methodInstance.getClass()
- .getDeclaredField("metaspaceMethod");
- field.setAccessible(true);
- field.set(methodInstance, getPtrToCpAddress());
- } catch (ReflectiveOperationException e) {
- throw new Error("TESTBUG : " + e, e);
- }
- return CompilerToVMHelper.getConstantPool(methodInstance, 0L);
- }
- },
- CONSTANT_POOL_BASE {
- @Override
- ConstantPool getConstantPool() {
- ConstantPool cpInst;
- try {
- cpInst = CompilerToVMHelper.getConstantPool(null,
- getPtrToCpAddress());
- Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
- .getDeclaredField("metaspaceConstantPool");
- field.setAccessible(true);
- field.set(cpInst, getPtrToCpAddress());
- } catch (ReflectiveOperationException e) {
- throw new Error("TESTBUG : " + e.getMessage(), e);
- }
- return CompilerToVMHelper.getConstantPool(cpInst, 0L);
- }
- },
- CONSTANT_POOL_BASE_IN_TWO {
- @Override
- ConstantPool getConstantPool() {
- long ptr = getPtrToCpAddress();
- ConstantPool cpInst;
- try {
- cpInst = CompilerToVMHelper.getConstantPool(null, ptr);
- Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
- .getDeclaredField("metaspaceConstantPool");
- field.setAccessible(true);
- field.set(cpInst, ptr / 2L);
- } catch (ReflectiveOperationException e) {
- throw new Error("TESTBUG : " + e.getMessage(), e);
- }
- return CompilerToVMHelper.getConstantPool(cpInst,
- ptr - ptr / 2L);
- }
- },
- CONSTANT_POOL_BASE_ZERO {
- @Override
- ConstantPool getConstantPool() {
- long ptr = getPtrToCpAddress();
- ConstantPool cpInst;
- try {
- cpInst = CompilerToVMHelper.getConstantPool(null, ptr);
- Field field = CompilerToVMHelper.HotSpotConstantPoolClass()
- .getDeclaredField("metaspaceConstantPool");
- field.setAccessible(true);
- field.set(cpInst, 0L);
- } catch (ReflectiveOperationException e) {
- throw new Error("TESTBUG : " + e.getMessage(), e);
- }
- return CompilerToVMHelper.getConstantPool(cpInst, ptr);
- }
- },
- ;
- abstract ConstantPool getConstantPool();
+ public static void testMethod(Executable executable) {
+ test(CTVMUtilities.getResolvedMethod(executable));
}
- private static final WhiteBox WB = WhiteBox.getWhiteBox();
- private static final Unsafe UNSAFE = Utils.getUnsafe();
+ public static void testClass(Class cls) {
+ HotSpotResolvedObjectType type = CompilerToVMHelper
+ .lookupType(Utils.toJVMTypeSignature(cls),
+ GetConstantPoolTest.class, /* resolve = */ true);
+ test(type);
+ }
- private static final Class TEST_CLASS = GetConstantPoolTest.class;
- private static final long CP_ADDRESS
- = WB.getConstantPool(GetConstantPoolTest.class);
-
- public void test(TestCase testCase) {
- System.out.println(testCase.name());
- ConstantPool cp = testCase.getConstantPool();
- String cpStringRep = cp.toString();
- String cpClassSimpleName
- = CompilerToVMHelper.HotSpotConstantPoolClass().getSimpleName();
- if (!cpStringRep.contains(cpClassSimpleName)
- || !cpStringRep.contains(TEST_CLASS.getName())) {
- String msg = String.format("%s : "
- + " Constant pool is not valid."
- + " String representation should contain \"%s\" and \"%s\"",
- testCase.name(), cpClassSimpleName,
- TEST_CLASS.getName());
- throw new AssertionError(msg);
- }
+ private static void test(Object object) {
+ ConstantPool cp = CompilerToVMHelper.getConstantPool(object);
+ System.out.println(object + " -> " + cp);
}
public static void main(String[] args) {
- GetConstantPoolTest test = new GetConstantPoolTest();
- for (TestCase testCase : TestCase.values()) {
- test.test(testCase);
- }
- testObjectBase();
- testMetaspaceWrapperBase();
+ TestCase.getAllClasses().forEach(GetConstantPoolTest::testClass);
+ TestCase.getAllExecutables().forEach(GetConstantPoolTest::testMethod);
+ testNull();
+ testObject();
}
- private static void testObjectBase() {
+ private static void testNull() {
try {
- Object cp = CompilerToVMHelper.getConstantPool(new Object(), 0L);
- throw new AssertionError("Test OBJECT_BASE."
+ Object cp = CompilerToVMHelper.getConstantPool(null);
+ throw new AssertionError("Test OBJECT."
+ + " Expected IllegalArgumentException has not been caught");
+ } catch (NullPointerException npe) {
+ // expected
+ }
+ }
+ private static void testObject() {
+ try {
+ Object cp = CompilerToVMHelper.getConstantPool(new Object());
+ throw new AssertionError("Test OBJECT."
+ " Expected IllegalArgumentException has not been caught");
} catch (IllegalArgumentException iae) {
// expected
}
}
- private static void testMetaspaceWrapperBase() {
- try {
- Object cp = CompilerToVMHelper.getConstantPool(
- new PublicMetaspaceWrapperObject() {
- @Override
- public long getMetaspacePointer() {
- return getPtrToCpAddress();
- }
- }, 0L);
- throw new AssertionError("Test METASPACE_WRAPPER_BASE."
- + " Expected IllegalArgumentException has not been caught");
- } catch (IllegalArgumentException iae) {
- // expected
- }
- }
-
- private static long getPtrToCpAddress() {
- Field field;
- try {
- field = TEST_CLASS.getDeclaredField("CP_ADDRESS");
- } catch (NoSuchFieldException nsfe) {
- throw new Error("TESTBUG : cannot find field \"CP_ADDRESS\" : "
- + nsfe.getMessage(), nsfe);
- }
- Object base = UNSAFE.staticFieldBase(field);
- return WB.getObjectAddress(base) + UNSAFE.staticFieldOffset(field);
- }
}
From f270d810adbf48014157064b155364fc32f29992 Mon Sep 17 00:00:00 2001
From: Brian Burkhalter
Date: Mon, 8 Aug 2016 11:09:19 -0700
Subject: [PATCH 035/120] 8150154: AIOOB Exception during sequential write of
TIFF images
Need to reset isRescaling variable when resetting the ImageWriter.
Reviewed-by: prr
---
.../imageio/plugins/tiff/TIFFImageWriter.java | 2 ++
.../plugins/shared/RepeatingWriteTest.java | 16 ++++++++++++----
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
index 9b5e7543203..d2f544ad923 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
@@ -3622,6 +3622,8 @@ public class TIFFImageWriter extends ImageWriter {
streamMetadata = null;
imageMetadata = null;
+ isRescaling = false;
+
isWritingSequence = false;
isWritingEmpty = false;
isInsertingEmpty = false;
diff --git a/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java b/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java
index 28c0f04aa8a..3833a1c3f4e 100644
--- a/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java
+++ b/jdk/test/javax/imageio/plugins/shared/RepeatingWriteTest.java
@@ -25,7 +25,6 @@
* @test
*
* @bug 8144991 8150154
- * @ignore 8150154
* @author a.stepanov
* @summary Check if repeating image writing doesn't fail
* (particularly, no AIOOB occurs)
@@ -103,17 +102,18 @@ public class RepeatingWriteTest {
reader.setInput(iis);
BufferedImage img = reader.read(0);
Color c = new Color(img.getRGB(szRef / 2, szRef / 2));
-
int w = img.getWidth(), h = img.getHeight();
if (w != szRef || h != szRef) {
throw new ImageCheckException(fileName +
- ": invalid image size " + w + " x " + h);
+ ": invalid image size " + w + " x " + h +
+ " expected " + szRef + " x " + szRef);
}
if (!c.equals(cRef)) {
throw new ImageCheckException(fileName +
- ": invalid image color " + c);
+ ": invalid image color " + c +
+ " expected " + cRef);
}
}
@@ -128,6 +128,14 @@ public class RepeatingWriteTest {
return;
}
+ // If JDK-8163323 is fixed this if block should be removed.
+ if (format.equals("tiff")
+ && (NAMES[i].equals("TYPE_USHORT_555_RGB")
+ || NAMES[i].equals("TYPE_USHORT_565_RGB"))
+ && (NAMES[j].equals("TYPE_USHORT_555_RGB")
+ || NAMES[j].equals("TYPE_USHORT_565_RGB"))) {
+ return;
+ }
String f1 = "test-1-" + NAMES[i] + "." + format;
String f2 = "test-2-" + NAMES[j] + "." + format;
From fa627e16d56dffd0f0d680a68dd31f02e98debc7 Mon Sep 17 00:00:00 2001
From: Alexander Scherbatiy
Date: Tue, 9 Aug 2016 10:17:51 +0300
Subject: [PATCH 036/120] 8162856: JSlider thumb is twice smaller on HiDPI
display
Reviewed-by: prr, serb
---
.../sun/java/swing/plaf/windows/XPStyle.java | 3 +-
.../classes/sun/swing/CachedPainter.java | 39 ++---
.../8162856/MetalHiDPISliderThumbTest.java | 147 ++++++++++++++++++
3 files changed, 161 insertions(+), 28 deletions(-)
create mode 100644 jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java
diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java
index 641bfed328b..0dbe039f54c 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java
@@ -657,7 +657,6 @@ class XPStyle {
protected void paintToImage(Component c, Image image, Graphics g,
int w, int h, Object[] args) {
- boolean accEnabled = false;
Skin skin = (Skin)args[0];
Part part = skin.part;
State state = (State)args[1];
@@ -668,6 +667,8 @@ class XPStyle {
c = skin.component;
}
BufferedImage bi = (BufferedImage)image;
+ w = bi.getWidth();
+ h = bi.getHeight();
WritableRaster raster = bi.getRaster();
DataBufferInt dbi = (DataBufferInt)raster.getDataBuffer();
diff --git a/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java b/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java
index 60876adae6f..818e20dbdd3 100644
--- a/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java
+++ b/jdk/src/java.desktop/share/classes/sun/swing/CachedPainter.java
@@ -100,7 +100,9 @@ public abstract class CachedPainter {
}
}
- private Image getImage(Object key, Component c, int w, int h, Object... args) {
+ private Image getImage(Object key, Component c,
+ int baseWidth, int baseHeight,
+ int w, int h, Object... args) {
GraphicsConfiguration config = getGraphicsConfiguration(c);
ImageCache cache = getCache(key);
Image image = cache.getImage(key, config, w, h, args);
@@ -127,8 +129,11 @@ public abstract class CachedPainter {
}
if (draw) {
// Render to the Image
- Graphics g2 = image.getGraphics();
- paintToImage(c, image, g2, w, h, args);
+ Graphics2D g2 = (Graphics2D) image.getGraphics();
+ if (w != baseWidth || h != baseHeight) {
+ g2.scale((double) w / baseWidth, (double) h / baseHeight);
+ }
+ paintToImage(c, image, g2, baseWidth, baseHeight, args);
g2.dispose();
}
@@ -149,14 +154,7 @@ public abstract class CachedPainter {
Image image = cache.getImage(key, config, w, h, args);
if (image == null) {
- double sx = 1;
- double sy = 1;
- if (g instanceof Graphics2D) {
- AffineTransform tx = ((Graphics2D) g).getTransform();
- sx = tx.getScaleX();
- sy = tx.getScaleY();
- }
- image = new PainterMultiResolutionCachedImage(sx, sy, w, h);
+ image = new PainterMultiResolutionCachedImage(w, h);
cache.setImage(key, config, w, h, args, image);
}
@@ -238,17 +236,12 @@ public abstract class CachedPainter {
class PainterMultiResolutionCachedImage extends AbstractMultiResolutionImage {
- private final double scaleX;
- private final double scaleY;
private final int baseWidth;
private final int baseHeight;
private Component c;
private Object[] args;
- public PainterMultiResolutionCachedImage(double scaleX, double scaleY,
- int baseWidth, int baseHeight) {
- this.scaleX = scaleX;
- this.scaleY = scaleY;
+ public PainterMultiResolutionCachedImage(int baseWidth, int baseHeight) {
this.baseWidth = baseWidth;
this.baseHeight = baseHeight;
}
@@ -272,7 +265,7 @@ public abstract class CachedPainter {
public Image getResolutionVariant(double destWidth, double destHeight) {
int w = (int) Math.ceil(destWidth);
int h = (int) Math.ceil(destHeight);
- return getImage(this, c, w, h, args);
+ return getImage(this, c, baseWidth, baseHeight, w, h, args);
}
@Override
@@ -282,15 +275,7 @@ public abstract class CachedPainter {
@Override
public java.util.List getResolutionVariants() {
-
- if (scaleX == 1 && scaleY == 1) {
- return Arrays.asList(getResolutionVariant(baseWidth, baseHeight));
- }
-
- return Arrays.asList(
- getResolutionVariant(baseWidth, baseHeight),
- getResolutionVariant(scaleX * baseWidth, scaleY * baseHeight)
- );
+ return Arrays.asList(getResolutionVariant(baseWidth, baseHeight));
}
}
}
\ No newline at end of file
diff --git a/jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java b/jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java
new file mode 100644
index 00000000000..1c0701e3acd
--- /dev/null
+++ b/jdk/test/javax/swing/JSlider/8162856/MetalHiDPISliderThumbTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import javax.swing.JSlider;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+
+/*
+ * @test
+ * @bug 8162856
+ * @summary Bad rendering of Swing UI controls with Metal L&F on HiDPI display
+ * @run main MetalHiDPISliderThumbTest
+ */
+public class MetalHiDPISliderThumbTest {
+
+ public static void main(String[] args) throws Exception {
+
+ SwingUtilities.invokeAndWait(() -> {
+
+ try {
+ UIManager.setLookAndFeel(new MetalLookAndFeel());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ if (!testSliderThumb(true)) {
+ throw new RuntimeException("Horizontal Slider Thumb is not scaled!");
+ }
+
+ if (!testSliderThumb(false)) {
+ throw new RuntimeException("Vertical Slider Thumb is not scaled!");
+ }
+ });
+ }
+
+ private static boolean testSliderThumb(boolean horizontal) {
+ int scale = 3;
+
+ int w = horizontal ? 100 : 20;
+ int h = horizontal ? 20 : 100;
+
+ JSlider testSlider = new JSlider();
+ testSlider.setSize(w, h);
+ Dimension size = new Dimension(w, h);
+ testSlider.setPreferredSize(size);
+ testSlider.setMinimumSize(size);
+ testSlider.setMaximumSize(size);
+ testSlider.setOrientation(horizontal ? JSlider.HORIZONTAL : JSlider.VERTICAL);
+
+ int sw = scale * w;
+ int sh = scale * h;
+
+ final BufferedImage img = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_RGB);
+
+ Graphics2D g = img.createGraphics();
+ g.scale(scale, scale);
+ testSlider.paint(g);
+ g.dispose();
+
+ if (horizontal) {
+ int y = sh / 2;
+
+ int xMin = 0;
+ int rgb = img.getRGB(xMin, y);
+ for (int i = 0; i < sw; i++) {
+ if (img.getRGB(i, y) != rgb) {
+ xMin = i;
+ break;
+ }
+ }
+
+ int xMax = sw - 1;
+ rgb = img.getRGB(xMax, y);
+ for (int i = sw - 1; i > 0; i--) {
+ if (img.getRGB(i, y) != rgb) {
+ xMax = i;
+ break;
+ }
+ }
+
+ int d = 3 * scale;
+ int xc = (xMin + xMax) / 2 - d;
+ rgb = img.getRGB(xc, y);
+
+ for (int x = xMin + d; x < xc; x++) {
+ if (img.getRGB(x, y) != rgb) {
+ return true;
+ }
+ }
+ } else {
+ int x = sw / 2;
+
+ int yMin = 0;
+ int rgb = img.getRGB(x, yMin);
+ for (int i = 0; i < sh; i++) {
+ if (img.getRGB(x, i) != rgb) {
+ yMin = i;
+ break;
+ }
+ }
+
+ int yMax = sh - 1;
+ rgb = img.getRGB(x, yMax);
+ for (int i = sh - 1; i > 0; i--) {
+ if (img.getRGB(x, i) != rgb) {
+ yMax = i;
+ break;
+ }
+ }
+
+ int d = 3 * scale;
+ int yc = (yMin + yMax) / 2 - d;
+ rgb = img.getRGB(x, yc);
+
+ for (int y = yMin + d; y < yc; y++) {
+ if (img.getRGB(x, y) != rgb) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
From 74f5aaca1c68acde0ec766a84cec04ff8b210ce9 Mon Sep 17 00:00:00 2001
From: Prasanta Sadhukhan
Date: Tue, 9 Aug 2016 13:22:58 +0530
Subject: [PATCH 037/120] 5080098: Page Range must be disabled on the common
print dlg for Non serv-formatted flvrs
Reviewed-by: prr, jdv
---
.../classes/sun/print/ServiceDialog.java | 8 +-
.../attribute/ServiceDlgPageRangeTest.java | 170 ++++++++++++++++++
2 files changed, 176 insertions(+), 2 deletions(-)
create mode 100644 jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java
diff --git a/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java b/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java
index ba2f6370150..59797508b2e 100644
--- a/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java
+++ b/jdk/src/java.desktop/share/classes/sun/print/ServiceDialog.java
@@ -977,6 +977,7 @@ public class ServiceDialog extends JDialog implements ActionListener {
private JFormattedTextField tfRangeFrom, tfRangeTo;
private JLabel lblRangeTo;
private boolean prSupported;
+ private boolean prPgRngSupported;
public PrintRangePanel() {
super();
@@ -1090,7 +1091,7 @@ public class ServiceDialog extends JDialog implements ActionListener {
public void focusGained(FocusEvent e) {}
private void setupRangeWidgets() {
- boolean rangeEnabled = (rbPages.isSelected() && prSupported);
+ boolean rangeEnabled = (rbPages.isSelected() && prPgRngSupported);
tfRangeFrom.setEnabled(rangeEnabled);
tfRangeTo.setEnabled(rangeEnabled);
lblRangeTo.setEnabled(rangeEnabled);
@@ -1136,6 +1137,9 @@ public class ServiceDialog extends JDialog implements ActionListener {
if (psCurrent.isAttributeCategorySupported(prCategory) ||
isAWT) {
prSupported = true;
+ prPgRngSupported = psCurrent.isAttributeValueSupported(prAll,
+ docFlavor,
+ asCurrent);
}
SunPageSelection select = SunPageSelection.ALL;
@@ -1175,7 +1179,7 @@ public class ServiceDialog extends JDialog implements ActionListener {
tfRangeFrom.setValue(min);
tfRangeTo.setValue(max);
rbAll.setEnabled(prSupported);
- rbPages.setEnabled(prSupported);
+ rbPages.setEnabled(prPgRngSupported);
setupRangeWidgets();
}
}
diff --git a/jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java b/jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java
new file mode 100644
index 00000000000..b35d687b7c0
--- /dev/null
+++ b/jdk/test/javax/print/attribute/ServiceDlgPageRangeTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @bug 5080098
+ * @summary Verify if PageRanges option is disabled for Non service-formatted
+ * flavors.
+ * @run main/manual ServiceDlgPageRangeTest
+ */
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import javax.print.DocFlavor;
+import javax.print.PrintService;
+import javax.print.PrintServiceLookup;
+import javax.print.ServiceUI;
+import javax.print.attribute.Attribute;
+import javax.print.attribute.HashPrintRequestAttributeSet;
+import javax.print.attribute.standard.PageRanges;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class ServiceDlgPageRangeTest {
+
+ private static Thread mainThread;
+ private static boolean testPassed;
+ private static boolean testGeneratedInterrupt;
+ private static DocFlavor flavor = DocFlavor.INPUT_STREAM.JPEG;
+ private static PrintService services[];
+
+ /**
+ * Starts the application.
+ */
+ public static void printTest() {
+
+ System.out.println("\nDefault print service: " +
+ PrintServiceLookup.lookupDefaultPrintService());
+ System.out.println("is flavor: "+flavor+" supported? "+
+ services[0].isDocFlavorSupported(flavor));
+ System.out.println("is Page Ranges category supported? "+
+ services[0].isAttributeCategorySupported(PageRanges.class));
+ System.out.println("is PageRanges[2] value supported ? "+
+ services[0].isAttributeValueSupported(
+ new PageRanges(2), flavor, null));
+
+ HashPrintRequestAttributeSet prSet = new HashPrintRequestAttributeSet();
+ //prSet.add(new PageRanges(2));
+ PrintService selService = ServiceUI.printDialog(null, 200, 200,
+ services, services[0], flavor, prSet);
+
+ System.out.println("\nSelected Values\n");
+ Attribute attr[] = prSet.toArray();
+ for (int x = 0; x < attr.length; x ++) {
+ System.out.println("Attribute: " + attr[x].getName() +
+ " Value: " + attr[x]);
+ }
+ }
+
+ /**
+ * Starts the application.
+ */
+ public static void main(java.lang.String[] args) throws Exception {
+ services = PrintServiceLookup.lookupPrintServices(flavor, null);
+
+ if (services.length == 0) {
+ System.out.println("No print service found!!");
+ return;
+ }
+ SwingUtilities.invokeAndWait(() -> {
+ doTest(ServiceDlgPageRangeTest::printTest);
+ });
+ mainThread = Thread.currentThread();
+ try {
+ Thread.sleep(600000);
+ } catch (InterruptedException e) {
+ if (!testPassed && testGeneratedInterrupt) {
+ throw new RuntimeException("PageRanges option is not disabled "
+ + "for for Non serv-formatted flvrs");
+ }
+ }
+ if (!testGeneratedInterrupt) {
+ throw new RuntimeException("user has not executed the test");
+ }
+ }
+
+ public static synchronized void pass() {
+ testPassed = true;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }
+
+ public static synchronized void fail() {
+ testPassed = false;
+ testGeneratedInterrupt = true;
+ mainThread.interrupt();
+ }
+
+ private static void doTest(Runnable action) {
+ String description
+ = " Visual inspection of print dialog is required.\n"
+ + " A print dialog will be shown.\n "
+ + " Please verify Pages(From/To) option is disabled.\n"
+ + " Press Cancel to close the print dialog.\n"
+ + " If Pages(From/To) option is disabled, press PASS else press FAIL";
+
+ final JDialog dialog = new JDialog();
+ dialog.setTitle("printSelectionTest");
+ JTextArea textArea = new JTextArea(description);
+ textArea.setEditable(false);
+ final JButton testButton = new JButton("Start Test");
+ final JButton passButton = new JButton("PASS");
+ passButton.setEnabled(false);
+ passButton.addActionListener((e) -> {
+ dialog.dispose();
+ pass();
+ });
+ final JButton failButton = new JButton("FAIL");
+ failButton.setEnabled(false);
+ failButton.addActionListener((e) -> {
+ dialog.dispose();
+ fail();
+ });
+ testButton.addActionListener((e) -> {
+ testButton.setEnabled(false);
+ action.run();
+ passButton.setEnabled(true);
+ failButton.setEnabled(true);
+ });
+ JPanel mainPanel = new JPanel(new BorderLayout());
+ mainPanel.add(textArea, BorderLayout.CENTER);
+ JPanel buttonPanel = new JPanel(new FlowLayout());
+ buttonPanel.add(testButton);
+ buttonPanel.add(passButton);
+ buttonPanel.add(failButton);
+ mainPanel.add(buttonPanel, BorderLayout.SOUTH);
+ dialog.add(mainPanel);
+ dialog.pack();
+ dialog.setVisible(true);
+ dialog.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent e) {
+ System.out.println("main dialog closing");
+ testGeneratedInterrupt = false;
+ mainThread.interrupt();
+ }
+ });
+ }
+}
From 0127b8e8b5041b06cc2ea495e46b055f80a8ae57 Mon Sep 17 00:00:00 2001
From: Jayathirth D V
Date: Tue, 9 Aug 2016 13:45:17 +0530
Subject: [PATCH 038/120] 8160456: KSS : resource loading issue in
TIFFMetadataFormat.java
Reviewed-by: prr, bpb
---
.../com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java
index 94bbdde378c..1091cab9bb2 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFMetadataFormat.java
@@ -49,7 +49,8 @@ public abstract class TIFFMetadataFormat implements IIOMetadataFormat {
}
try {
ResourceBundle bundle =
- ResourceBundle.getBundle(resourceBaseName, locale);
+ ResourceBundle.getBundle(resourceBaseName, locale,
+ this.getClass().getModule());
return bundle.getString(key);
} catch (MissingResourceException e) {
return null;
From c4a6631fc1e0a258b670322439ce7c294c91a4b6 Mon Sep 17 00:00:00 2001
From: Jayathirth D V
Date: Tue, 9 Aug 2016 13:55:27 +0530
Subject: [PATCH 039/120] 8160455: KSS : class.forName issue in
TIFFImageMetadata.java
Reviewed-by: prr, bpb, serb
---
.../com/sun/imageio/plugins/tiff/TIFFImageMetadata.java | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
index 933c2da5a6c..6cfcc9a3b34 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
@@ -1465,8 +1465,14 @@ public class TIFFImageMetadata extends IIOMetadata {
String className = st.nextToken();
Object o = null;
+ Class> setClass = null;
try {
- Class> setClass = Class.forName(className);
+ ClassLoader cl = TIFFImageMetadata.class.getClassLoader();
+ setClass = Class.forName(className, false, cl);
+ if (!TIFFTagSet.class.isAssignableFrom(setClass)) {
+ fatal(node, "TagSets in IFD must be subset of"
+ + " TIFFTagSet class");
+ }
Method getInstanceMethod =
setClass.getMethod("getInstance", (Class[])null);
o = getInstanceMethod.invoke(null, (Object[])null);
From 56b758957824ec37b2fdce3819b5f313d33eb68d Mon Sep 17 00:00:00 2001
From: Alexander Scherbatiy
Date: Tue, 9 Aug 2016 12:08:51 +0300
Subject: [PATCH 040/120] 8160986: Bad rendering of Swing UI controls with
Metal L&F on HiDPI display
Reviewed-by: prr
---
.../swing/plaf/metal/MetalComboBoxIcon.java | 12 +-
.../swing/plaf/metal/MetalIconFactory.java | 39 +----
.../swing/plaf/metal/MetalScrollButton.java | 30 ++--
.../metal/MetalIcons/MetalHiDPIIconsTest.java | 136 ++++++++++++++++++
4 files changed, 162 insertions(+), 55 deletions(-)
create mode 100644 jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java
diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java
index 1b1bed9e0b7..7e0446103c3 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalComboBoxIcon.java
@@ -52,13 +52,11 @@ public class MetalComboBoxIcon implements Icon, Serializable {
g.translate( x, y );
- g.setColor( component.isEnabled() ? MetalLookAndFeel.getControlInfo() : MetalLookAndFeel.getControlShadow() );
- g.drawLine( 0, 0, iconWidth - 1, 0 );
- g.drawLine( 1, 1, 1 + (iconWidth - 3), 1 );
- g.drawLine( 2, 2, 2 + (iconWidth - 5), 2 );
- g.drawLine( 3, 3, 3 + (iconWidth - 7), 3 );
- g.drawLine( 4, 4, 4 + (iconWidth - 9), 4 );
-
+ g.setColor(component.isEnabled()
+ ? MetalLookAndFeel.getControlInfo()
+ : MetalLookAndFeel.getControlShadow());
+ g.fillPolygon(new int[]{0, 5, iconWidth - 5, iconWidth},
+ new int[]{0, 5, 5, 0}, 4);
g.translate( -x, -y );
}
diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java
index 926835fb896..b7cf9644fbe 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalIconFactory.java
@@ -1289,11 +1289,7 @@ public class MetalIconFactory implements Serializable {
else {
g.setColor(MetalLookAndFeel.getControl());
}
- g.fillRect(2, 2, 8, 8);
- g.fillRect(4, 1, 4, 1);
- g.fillRect(4, 10, 4, 1);
- g.fillRect(1, 4, 1, 4);
- g.fillRect(10, 4, 1, 4);
+ g.fillOval(1, 1, 9, 9);
}
// draw Dark Circle (start at top, go clockwise)
@@ -1303,35 +1299,14 @@ public class MetalIconFactory implements Serializable {
else {
g.setColor(MetalLookAndFeel.getControlDarkShadow());
}
- g.drawLine( 4, 0, 7, 0);
- g.drawLine( 8, 1, 9, 1);
- g.drawLine(10, 2, 10, 3);
- g.drawLine(11, 4, 11, 7);
- g.drawLine(10, 8, 10, 9);
- g.drawLine( 9,10, 8,10);
- g.drawLine( 7,11, 4,11);
- g.drawLine( 3,10, 2,10);
- g.drawLine( 1, 9, 1, 8);
- g.drawLine( 0, 7, 0, 4);
- g.drawLine( 1, 3, 1, 2);
- g.drawLine( 2, 1, 3, 1);
+ g.drawOval(0, 0, 11, 11);
if (pressed) {
- g.fillRect(1, 4, 1, 4);
- g.fillRect(2, 2, 1, 2);
- g.fillRect(3, 2, 1, 1);
- g.fillRect(4, 1, 4, 1);
+ g.drawArc(1, 1, 10, 10, 60, 160);
}
else if (rollover) {
g.setColor(MetalLookAndFeel.getPrimaryControl());
- g.fillRect(4, 1, 4, 2);
- g.fillRect(8, 2, 2, 2);
- g.fillRect(9, 4, 2, 4);
- g.fillRect(8, 8, 2, 2);
- g.fillRect(4, 9, 4, 2);
- g.fillRect(2, 8, 2, 2);
- g.fillRect(1, 4, 2, 4);
- g.fillRect(2, 2, 2, 2);
+ g.drawOval(2, 2, 7, 7);
}
// selected dot
@@ -1341,11 +1316,7 @@ public class MetalIconFactory implements Serializable {
} else {
g.setColor(MetalLookAndFeel.getControlDarkShadow());
}
- g.fillRect( 4, 4, 4, 4);
- g.drawLine( 4, 3, 7, 3);
- g.drawLine( 8, 4, 8, 7);
- g.drawLine( 7, 8, 4, 8);
- g.drawLine( 3, 7, 3, 4);
+ g.fillOval(2, 2, 7, 7);
}
g.translate(-x, -y);
diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java
index 31a874326b1..13553acda46 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalScrollButton.java
@@ -128,9 +128,10 @@ public class MetalScrollButton extends BasicArrowButton
int startY = ((h+1) - arrowHeight) / 2;
int startX = (w / 2);
- for (int line = 0; line < arrowHeight; line++) {
- g.drawLine( startX-line, startY+line, startX +line+1, startY+line);
- }
+ g.translate(startX, startY);
+ g.fillPolygon(new int[]{0, 1, arrowHeight + 1, -arrowHeight},
+ new int[]{0, 0, arrowHeight, arrowHeight}, 4);
+ g.translate(-startX, -startY);
if (isEnabled) {
g.setColor( highlightColor );
@@ -174,10 +175,10 @@ public class MetalScrollButton extends BasicArrowButton
int startY = (((h+1) - arrowHeight) / 2)+ arrowHeight-1;
int startX = (w / 2);
-
- for (int line = 0; line < arrowHeight; line++) {
- g.drawLine( startX-line, startY-line, startX +line+1, startY-line);
- }
+ g.translate(startX, startY);
+ g.fillPolygon(new int[]{0, 1, arrowHeight + 1, -arrowHeight},
+ new int[]{0, 0, -arrowHeight, -arrowHeight}, 4);
+ g.translate(-startX, -startY);
if (isEnabled) {
g.setColor( highlightColor );
@@ -220,9 +221,10 @@ public class MetalScrollButton extends BasicArrowButton
int startX = (((w+1) - arrowHeight) / 2) + arrowHeight-1;
int startY = (h / 2);
- for (int line = 0; line < arrowHeight; line++) {
- g.drawLine( startX-line, startY-line, startX -line, startY+line+1);
- }
+ g.translate(startX, startY);
+ g.fillPolygon(new int[]{0, 0, -arrowHeight, -arrowHeight},
+ new int[]{0, 1, arrowHeight + 1, -arrowHeight}, 4);
+ g.translate(-startX, -startY);
if (isEnabled) {
g.setColor( highlightColor );
@@ -262,10 +264,10 @@ public class MetalScrollButton extends BasicArrowButton
int startX = (((w+1) - arrowHeight) / 2);
int startY = (h / 2);
-
- for (int line = 0; line < arrowHeight; line++) {
- g.drawLine( startX+line, startY-line, startX +line, startY+line+1);
- }
+ g.translate(startX, startY);
+ g.fillPolygon(new int[]{0, 0, arrowHeight, arrowHeight},
+ new int[]{0, 1, arrowHeight + 1, -arrowHeight}, 4);
+ g.translate(-startX, -startY);
if (isEnabled) {
g.setColor( highlightColor );
diff --git a/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java b/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java
new file mode 100644
index 00000000000..6c6a4599a1f
--- /dev/null
+++ b/jdk/test/javax/swing/plaf/metal/MetalIcons/MetalHiDPIIconsTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8160986
+ * @summary Bad rendering of Swing UI controls with Metal L&F on HiDPI display
+ * @run main/manual MetalHiDPIIconsTest
+ */
+import java.awt.Color;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+
+public class MetalHiDPIIconsTest {
+
+ private static volatile boolean testResult = false;
+ private static volatile CountDownLatch countDownLatch;
+ private static final String INSTRUCTIONS = "INSTRUCTIONS:\n"
+ + "Verify that icons are painted smoothly for standard Swing UI controls.\n\n"
+ + "If the display does not support HiDPI mode press PASS.\n\n"
+ + "1. Run the SwingSet2 demo on HiDPI Display.\n"
+ + "2. Select Metal Look and Feel\n"
+ + "3. Check that the icons are painted smoothly on Swing UI controls like:\n"
+ + " - JRadioButton\n"
+ + " - JCheckBox\n"
+ + " - JComboBox\n"
+ + " - JScrollPane (vertical and horizontal scroll bars)\n"
+ + "and others...\n\n"
+ + "If so, press PASS, else press FAIL.\n";
+
+ public static void main(String args[]) throws Exception {
+ countDownLatch = new CountDownLatch(1);
+
+ SwingUtilities.invokeLater(MetalHiDPIIconsTest::createUI);
+ countDownLatch.await(15, TimeUnit.MINUTES);
+
+ if (!testResult) {
+ throw new RuntimeException("Test fails!");
+ }
+ }
+
+ private static void createUI() {
+
+ final JFrame mainFrame = new JFrame("Metal L&F icons test");
+ GridBagLayout layout = new GridBagLayout();
+ JPanel mainControlPanel = new JPanel(layout);
+ JPanel resultButtonPanel = new JPanel(layout);
+
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ JTextArea instructionTextArea = new JTextArea();
+ instructionTextArea.setText(INSTRUCTIONS);
+ instructionTextArea.setEditable(false);
+ instructionTextArea.setBackground(Color.white);
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ mainControlPanel.add(instructionTextArea, gbc);
+
+ JButton passButton = new JButton("Pass");
+ passButton.setActionCommand("Pass");
+ passButton.addActionListener((ActionEvent e) -> {
+ testResult = true;
+ mainFrame.dispose();
+ countDownLatch.countDown();
+
+ });
+
+ JButton failButton = new JButton("Fail");
+ failButton.setActionCommand("Fail");
+ failButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ mainFrame.dispose();
+ countDownLatch.countDown();
+ }
+ });
+
+ gbc.gridx = 0;
+ gbc.gridy = 0;
+ resultButtonPanel.add(passButton, gbc);
+
+ gbc.gridx = 1;
+ gbc.gridy = 0;
+ resultButtonPanel.add(failButton, gbc);
+
+ gbc.gridx = 0;
+ gbc.gridy = 1;
+ mainControlPanel.add(resultButtonPanel, gbc);
+
+ mainFrame.add(mainControlPanel);
+ mainFrame.pack();
+
+ mainFrame.addWindowListener(new WindowAdapter() {
+
+ @Override
+ public void windowClosing(WindowEvent e) {
+ mainFrame.dispose();
+ countDownLatch.countDown();
+ }
+ });
+ mainFrame.setVisible(true);
+ }
+}
From 432e69e8fe992d67a3bc3df1b5b1672c993f1fdc Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko
Date: Tue, 9 Aug 2016 14:16:44 +0300
Subject: [PATCH 041/120] 8160083:
compiler.codecache.jmx.InitialAndMaxUsageTest can not be used w/ disabled
SegmentedCodeCache
Reviewed-by: kvn
---
.../codecache/jmx/InitialAndMaxUsageTest.java | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
index a0ca3a46b29..e96dc4713d9 100644
--- a/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
+++ b/hotspot/test/compiler/codecache/jmx/InitialAndMaxUsageTest.java
@@ -36,6 +36,11 @@
* -XX:CompileCommand=compileonly,null::* -XX:-UseLargePages
* -XX:+SegmentedCodeCache
* compiler.codecache.jmx.InitialAndMaxUsageTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ * -XX:-MethodFlushing -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
+ * -XX:CompileCommand=compileonly,null::* -XX:-UseLargePages
+ * -XX:-SegmentedCodeCache
+ * compiler.codecache.jmx.InitialAndMaxUsageTest
*/
package compiler.codecache.jmx;
@@ -70,10 +75,16 @@ public class InitialAndMaxUsageTest {
}
}
- private void fillWithSize(long size, List blobs) {
+ private void fillWithSize(long size, List blobs, MemoryPoolMXBean bean) {
long blob;
- while ((blob = CodeCacheUtils.WB.allocateCodeBlob(size, btype.id))
- != 0L) {
+ /* Don't fill too much to have space for adapters. So, stop after crossing 95% and
+ don't allocate in case we'll cross 97% on next allocation. We can hit situation
+ like 94% -> (1 allocation) -> 100% otherwise. So, check if
+ is less than 97%, then allocate in case it is, then, stop
+ further allocations with given size in case more than 95% */
+ while (((double) bean.getUsage().getUsed() + size <= (CACHE_USAGE_COEF + 0.02d) * maxSize)
+ && (blob = CodeCacheUtils.WB.allocateCodeBlob(size, btype.id)) != 0L
+ && ((double) bean.getUsage().getUsed() <= CACHE_USAGE_COEF * maxSize)) {
blobs.add(blob);
}
}
@@ -96,7 +107,7 @@ public class InitialAndMaxUsageTest {
optimization */
try {
for (int coef = 1000000; coef > 0; coef /= 10) {
- fillWithSize(coef * minAllocationUnit, blobs);
+ fillWithSize(coef * minAllocationUnit, blobs, bean);
}
Asserts.assertGT((double) bean.getUsage().getUsed(),
CACHE_USAGE_COEF * maxSize, String.format("Unable to fill "
From dfce7d89bfd36ef8c758fa0068c4533494784b06 Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko
Date: Tue, 9 Aug 2016 14:17:28 +0300
Subject: [PATCH 042/120] 8163366:
compiler/codecache/jmx/ThresholdNotificationsTest.java doesn't set
-XX:+UnlockDiagnosticVMOptions while using WB
Reviewed-by: kvn
---
.../compiler/codecache/jmx/ThresholdNotificationsTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
index bd22973fe4e..e173fc8a6c7 100644
--- a/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
+++ b/hotspot/test/compiler/codecache/jmx/ThresholdNotificationsTest.java
@@ -31,11 +31,11 @@
* @build compiler.codecache.jmx.ThresholdNotificationsTest
* @run driver ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
* -XX:+WhiteBoxAPI -XX:-MethodFlushing -XX:CompileCommand=compileonly,null::*
* -XX:+SegmentedCodeCache
* compiler.codecache.jmx.ThresholdNotificationsTest
- * @run main/othervm -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -Xbootclasspath/a:. -XX:-UseCodeCacheFlushing
* -XX:+WhiteBoxAPI -XX:-MethodFlushing -XX:CompileCommand=compileonly,null::*
* -XX:-SegmentedCodeCache
* compiler.codecache.jmx.ThresholdNotificationsTest
From 5ae0aff787b6575be66a9d8c3af23b3a1c375f60 Mon Sep 17 00:00:00 2001
From: Dmitrij Pochepko
Date: Tue, 9 Aug 2016 16:47:47 +0300
Subject: [PATCH 043/120] 8160299: Test8015436 doesn't check which method was
executed
Reviewed-by: kvn
---
.../runtime/cr8015436/Driver8015436.java | 43 +++++++++++++++++++
.../runtime/cr8015436/Test8015436.java | 18 +++++---
2 files changed, 56 insertions(+), 5 deletions(-)
create mode 100644 hotspot/test/compiler/runtime/cr8015436/Driver8015436.java
diff --git a/hotspot/test/compiler/runtime/cr8015436/Driver8015436.java b/hotspot/test/compiler/runtime/cr8015436/Driver8015436.java
new file mode 100644
index 00000000000..79c4eb8971a
--- /dev/null
+++ b/hotspot/test/compiler/runtime/cr8015436/Driver8015436.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package compiler.runtime.cr8015436;
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
+public class Driver8015436 {
+ public static void main(String args[]) {
+ OutputAnalyzer oa;
+ try {
+ oa = ProcessTools.executeProcess(ProcessTools.createJavaProcessBuilder(
+ /* add test vm options */ true, Test8015436.class.getName()));
+ } catch (Exception ex) {
+ throw new Error("TESTBUG: exception while running child process: " + ex, ex);
+ }
+ oa.shouldHaveExitValue(0);
+ oa.shouldContain(Test8015436.SOME_MTD_INVOKED);
+ oa.shouldContain(Test8015436.DEFAULT_MTD_INVOKED_DIRECTLY);
+ oa.shouldContain(Test8015436.DEFAULT_MTD_INVOKED_MH);
+ }
+}
diff --git a/hotspot/test/compiler/runtime/cr8015436/Test8015436.java b/hotspot/test/compiler/runtime/cr8015436/Test8015436.java
index 8c70624f32a..256f352b87e 100644
--- a/hotspot/test/compiler/runtime/cr8015436/Test8015436.java
+++ b/hotspot/test/compiler/runtime/cr8015436/Test8015436.java
@@ -25,8 +25,12 @@
* @test
* @bug 8015436
* @summary the IK _initial_method_idnum value must be adjusted if overpass methods are added
+ * @library /test/lib/share/classes /
+ * @modules java.base/jdk.internal.misc
+ * @build compiler.runtime.cr8015436.Test8015436
+ * compiler.runtime.cr8015436.Driver8015436
*
- * @run main compiler.runtime.cr8015436.Test8015436
+ * @run driver compiler.runtime.cr8015436.Driver8015436
*/
/*
@@ -45,20 +49,24 @@ import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class Test8015436 implements InterfaceWithDefaultMethod {
+ public static final String SOME_MTD_INVOKED = "someMethod() invoked";
+ public static final String DEFAULT_MTD_INVOKED_DIRECTLY = "defaultMethod() invoked directly";
+ public static final String DEFAULT_MTD_INVOKED_MH = "defaultMethod() invoked via a MethodHandle";
+
@Override
public void someMethod() {
- System.out.println("someMethod() invoked");
+ System.out.println(SOME_MTD_INVOKED);
}
public static void main(String[] args) throws Throwable {
Test8015436 testObj = new Test8015436();
testObj.someMethod();
- testObj.defaultMethod("invoked directly");
+ testObj.defaultMethod(DEFAULT_MTD_INVOKED_DIRECTLY);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType mt = MethodType.methodType(void.class, String.class);
MethodHandle mh = lookup.findVirtual(Test8015436.class, "defaultMethod", mt);
- mh.invokeExact(testObj, "invoked via a MethodHandle");
+ mh.invokeExact(testObj, DEFAULT_MTD_INVOKED_MH);
}
}
@@ -66,7 +74,7 @@ interface InterfaceWithDefaultMethod {
public void someMethod();
default public void defaultMethod(String str){
- System.out.println("defaultMethod() " + str);
+ System.out.println(str);
}
}
/*
From 85d6f6505de3d40403034d7fbef3c8c6bccca453 Mon Sep 17 00:00:00 2001
From: Robbin Ehn
Date: Wed, 10 Aug 2016 09:24:42 +0200
Subject: [PATCH 044/120] 8161026: GPL header missing comma in year
Reviewed-by: sjohanss, redestad
---
hotspot/src/share/vm/logging/logTagSet.hpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hotspot/src/share/vm/logging/logTagSet.hpp b/hotspot/src/share/vm/logging/logTagSet.hpp
index 0b238b32b52..a40ed5175bc 100644
--- a/hotspot/src/share/vm/logging/logTagSet.hpp
+++ b/hotspot/src/share/vm/logging/logTagSet.hpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
From 942ee05da56559711221b2dbefed306e40a81283 Mon Sep 17 00:00:00 2001
From: Yasumasa Suenaga
Date: Wed, 10 Aug 2016 21:02:14 -0400
Subject: [PATCH 045/120] 8163580: Cannot get Monitor Cache Dump in HSDB
Reviewed-by: dholmes
---
hotspot/src/share/vm/runtime/vmStructs.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp
index a0687534eb3..34b48c3cf80 100644
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp
@@ -2643,7 +2643,7 @@ typedef CompactHashtable SymbolCompactHashTable;
/* DEFAULT_CACHE_LINE_SIZE (globalDefinitions.hpp) */ \
/***************************************************/ \
\
- declare_constant(DEFAULT_CACHE_LINE_SIZE) \
+ declare_preprocessor_constant("DEFAULT_CACHE_LINE_SIZE", DEFAULT_CACHE_LINE_SIZE) \
\
declare_constant(Deoptimization::Unpack_deopt) \
declare_constant(Deoptimization::Unpack_exception) \
From 17c7042e607522450c4dd3e068abab28acf65a06 Mon Sep 17 00:00:00 2001
From: Jini George
Date: Thu, 11 Aug 2016 17:47:25 +0300
Subject: [PATCH 046/120] 8163143: illegal bci error with interpreted frames in
SA due to mirror being stored in interpreted frames
Added code to represent the frame mirror offset in SA
Reviewed-by: dsamersoff
---
.../classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java | 4 ++--
.../classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java | 6 +-----
.../share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java | 5 +++--
3 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java
index 5937f7f19a2..49849f9240c 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/ppc64/PPC64Frame.java
@@ -46,7 +46,6 @@ public class PPC64Frame extends Frame {
private static final int SENDER_SP_OFFSET = 0;
// Interpreter frames
- private static final int INTERPRETER_FRAME_MIRROR_OFFSET = -3; // for native calls only
private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -4;
private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
private static final int INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET -1;
@@ -55,7 +54,8 @@ public class PPC64Frame extends Frame {
private static final int INTERPRETER_FRAME_CACHE_OFFSET =INTERPRETER_FRAME_BCX_OFFSET - 1;
private static final int INTERPRETER_FRAME_MONITORS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
private static final int INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_MONITORS_OFFSET - 1;
- private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
+ private static final int INTERPRETER_FRAME_MIRROR_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
+ private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
private static final int INTERPRETER_FRAME_INITIAL_SP_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1; // FIXME: probably wrong, but unused anyway
private static final int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
private static final int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
index bbb1dfa7e44..afa4660691f 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java
@@ -714,11 +714,7 @@ public class SPARCFrame extends Frame {
/** 2 words, also used to save float regs across calls to C */
public static final int INTERPRETER_FRAME_D_SCRATCH_FP_OFFSET = -2;
public static final int INTERPRETER_FRAME_L_SCRATCH_FP_OFFSET = -4;
- /** For native calls only */
- public static final int INTERPRETER_FRAME_PADDING_OFFSET = -5;
- /** For native calls only */
- public static final int INTERPRETER_FRAME_MIRROR_OFFSET = -6;
- /** Should be same as above, and should be zero mod 8 */
+ public static final int INTERPRETER_FRAME_MIRROR_OFFSET = -5;
public static final int INTERPRETER_FRAME_VM_LOCALS_FP_OFFSET = -6;
public static final int INTERPRETER_FRAME_VM_LOCAL_WORDS = -INTERPRETER_FRAME_VM_LOCALS_FP_OFFSET;
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java
index 51e2b6e8089..65488fe96c6 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java
@@ -48,10 +48,10 @@ public class X86Frame extends Frame {
private static final int SENDER_SP_OFFSET = 2;
// Interpreter frames
- private static final int INTERPRETER_FRAME_MIRROR_OFFSET = 2; // for native calls only
private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -1;
private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET - 1;
+ private static int INTERPRETER_FRAME_MIRROR_OFFSET;
private static int INTERPRETER_FRAME_MDX_OFFSET; // Non-core builds only
private static int INTERPRETER_FRAME_CACHE_OFFSET;
private static int INTERPRETER_FRAME_LOCALS_OFFSET;
@@ -74,7 +74,8 @@ public class X86Frame extends Frame {
}
private static synchronized void initialize(TypeDataBase db) {
- INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_METHOD_OFFSET - 1;
+ INTERPRETER_FRAME_MIRROR_OFFSET = INTERPRETER_FRAME_METHOD_OFFSET - 1;
+ INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_MIRROR_OFFSET - 1;
INTERPRETER_FRAME_CACHE_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
From 2579620b6d4fdf7890372e0439feccda988b82ae Mon Sep 17 00:00:00 2001
From: Lois Foltan
Date: Thu, 11 Aug 2016 11:41:11 -0400
Subject: [PATCH 047/120] 8162553: Crash in class unloading due to null CLD
having a zero _keep_alive value
Correct the refcounting of ClassLoaderData::_keep_alive for anonymous classes.
Reviewed-by: acorn, coleenp, dholmes, jiangli
---
hotspot/src/share/vm/classfile/classLoaderData.cpp | 12 ++++++++----
hotspot/src/share/vm/classfile/classLoaderData.hpp | 8 +++++---
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/hotspot/src/share/vm/classfile/classLoaderData.cpp b/hotspot/src/share/vm/classfile/classLoaderData.cpp
index f31b1d0886c..09ddbf40b92 100644
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp
@@ -126,13 +126,17 @@ bool ClassLoaderData::claim() {
// ClassLoaderData, no other non-GC thread has knowledge of the anonymous class while
// it is being defined, therefore _keep_alive is not volatile or atomic.
void ClassLoaderData::inc_keep_alive() {
- assert(_keep_alive >= 0, "Invalid keep alive count");
- _keep_alive++;
+ if (is_anonymous()) {
+ assert(_keep_alive >= 0, "Invalid keep alive increment count");
+ _keep_alive++;
+ }
}
void ClassLoaderData::dec_keep_alive() {
- assert(_keep_alive > 0, "Invalid keep alive count");
- _keep_alive--;
+ if (is_anonymous()) {
+ assert(_keep_alive > 0, "Invalid keep alive decrement count");
+ _keep_alive--;
+ }
}
void ClassLoaderData::oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
diff --git a/hotspot/src/share/vm/classfile/classLoaderData.hpp b/hotspot/src/share/vm/classfile/classLoaderData.hpp
index 602097935cc..e1798d349ad 100644
--- a/hotspot/src/share/vm/classfile/classLoaderData.hpp
+++ b/hotspot/src/share/vm/classfile/classLoaderData.hpp
@@ -176,9 +176,9 @@ class ClassLoaderData : public CHeapObj {
Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
bool _unloading; // true if this class loader goes away
bool _is_anonymous; // if this CLD is for an anonymous class
- int _keep_alive; // if this CLD is kept alive without a keep_alive_object().
- // Currently used solely for anonymous classes.
- // _keep_alive does not need to be volatile or
+ s2 _keep_alive; // if this CLD is kept alive without a keep_alive_object().
+ // Used for anonymous classes and the boot class
+ // loader. _keep_alive does not need to be volatile or
// atomic since there is one unique CLD per anonymous class.
volatile int _claimed; // true if claimed, for example during GC traces.
// To avoid applying oop closure more than once.
@@ -289,6 +289,8 @@ class ClassLoaderData : public CHeapObj {
return _unloading;
}
+ // Used to refcount an anonymous class's CLD in order to
+ // indicate their aliveness without a keep_alive_object().
void inc_keep_alive();
void dec_keep_alive();
From 74e840d64cd4e68584211af5505ed3202ba116cc Mon Sep 17 00:00:00 2001
From: David Holmes
Date: Fri, 12 Aug 2016 00:19:44 -0400
Subject: [PATCH 048/120] 8159461: bigapps/Kitchensink/stressExitCode hits
assert: Must be VMThread or JavaThread
Reviewed-by: fparain, simonis, dcubed
---
hotspot/src/os/aix/vm/os_aix.cpp | 20 +++++++++++++++++---
hotspot/src/os/bsd/vm/os_bsd.cpp | 20 +++++++++++++++++---
hotspot/src/os/linux/vm/os_linux.cpp | 17 +++++++++++++++--
hotspot/src/share/vm/runtime/thread.cpp | 7 +++++--
4 files changed, 54 insertions(+), 10 deletions(-)
diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp
index 42aa1a635a9..dffad2b7f3f 100644
--- a/hotspot/src/os/aix/vm/os_aix.cpp
+++ b/hotspot/src/os/aix/vm/os_aix.cpp
@@ -2686,7 +2686,8 @@ void os::hint_no_preempt() {}
// - sets target osthread state to continue
// - sends signal to end the sigsuspend loop in the SR_handler
//
-// Note that the SR_lock plays no role in this suspend/resume protocol.
+// Note that the SR_lock plays no role in this suspend/resume protocol,
+// but is checked for NULL in SR_handler as a thread termination indicator.
//
static void resume_clear_context(OSThread *osthread) {
@@ -2718,10 +2719,23 @@ static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
// after sigsuspend.
int old_errno = errno;
- Thread* thread = Thread::current();
- OSThread* osthread = thread->osthread();
+ Thread* thread = Thread::current_or_null_safe();
+ assert(thread != NULL, "Missing current thread in SR_handler");
+
+ // On some systems we have seen signal delivery get "stuck" until the signal
+ // mask is changed as part of thread termination. Check that the current thread
+ // has not already terminated (via SR_lock()) - else the following assertion
+ // will fail because the thread is no longer a JavaThread as the ~JavaThread
+ // destructor has completed.
+
+ if (thread->SR_lock() == NULL) {
+ return;
+ }
+
assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
+ OSThread* osthread = thread->osthread();
+
os::SuspendResume::State current = osthread->sr.state();
if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
suspend_save_context(osthread, siginfo, context);
diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp
index 738144baf3b..a40175df89c 100644
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp
@@ -2716,7 +2716,8 @@ void os::hint_no_preempt() {}
// - sets target osthread state to continue
// - sends signal to end the sigsuspend loop in the SR_handler
//
-// Note that the SR_lock plays no role in this suspend/resume protocol.
+// Note that the SR_lock plays no role in this suspend/resume protocol,
+// but is checked for NULL in SR_handler as a thread termination indicator.
static void resume_clear_context(OSThread *osthread) {
osthread->set_ucontext(NULL);
@@ -2746,10 +2747,23 @@ static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
// after sigsuspend.
int old_errno = errno;
- Thread* thread = Thread::current();
- OSThread* osthread = thread->osthread();
+ Thread* thread = Thread::current_or_null_safe();
+ assert(thread != NULL, "Missing current thread in SR_handler");
+
+ // On some systems we have seen signal delivery get "stuck" until the signal
+ // mask is changed as part of thread termination. Check that the current thread
+ // has not already terminated (via SR_lock()) - else the following assertion
+ // will fail because the thread is no longer a JavaThread as the ~JavaThread
+ // destructor has completed.
+
+ if (thread->SR_lock() == NULL) {
+ return;
+ }
+
assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
+ OSThread* osthread = thread->osthread();
+
os::SuspendResume::State current = osthread->sr.state();
if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
suspend_save_context(osthread, siginfo, context);
diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp
index b8c1a72ae4a..5f4f1174c9d 100644
--- a/hotspot/src/os/linux/vm/os_linux.cpp
+++ b/hotspot/src/os/linux/vm/os_linux.cpp
@@ -3971,7 +3971,8 @@ void os::hint_no_preempt() {}
// - sets target osthread state to continue
// - sends signal to end the sigsuspend loop in the SR_handler
//
-// Note that the SR_lock plays no role in this suspend/resume protocol.
+// Note that the SR_lock plays no role in this suspend/resume protocol,
+// but is checked for NULL in SR_handler as a thread termination indicator.
static void resume_clear_context(OSThread *osthread) {
osthread->set_ucontext(NULL);
@@ -4004,9 +4005,21 @@ static void SR_handler(int sig, siginfo_t* siginfo, ucontext_t* context) {
Thread* thread = Thread::current_or_null_safe();
assert(thread != NULL, "Missing current thread in SR_handler");
- OSThread* osthread = thread->osthread();
+
+ // On some systems we have seen signal delivery get "stuck" until the signal
+ // mask is changed as part of thread termination. Check that the current thread
+ // has not already terminated (via SR_lock()) - else the following assertion
+ // will fail because the thread is no longer a JavaThread as the ~JavaThread
+ // destructor has completed.
+
+ if (thread->SR_lock() == NULL) {
+ return;
+ }
+
assert(thread->is_VM_thread() || thread->is_Java_thread(), "Must be VMThread or JavaThread");
+ OSThread* osthread = thread->osthread();
+
os::SuspendResume::State current = osthread->sr.state();
if (current == os::SuspendResume::SR_SUSPEND_REQUEST) {
suspend_save_context(osthread, siginfo, context);
diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp
index 26c7e870d07..c87de622492 100644
--- a/hotspot/src/share/vm/runtime/thread.cpp
+++ b/hotspot/src/share/vm/runtime/thread.cpp
@@ -374,11 +374,14 @@ Thread::~Thread() {
delete handle_area();
delete metadata_handles();
+ // SR_handler uses this as a termination indicator -
+ // needs to happen before os::free_thread()
+ delete _SR_lock;
+ _SR_lock = NULL;
+
// osthread() can be NULL, if creation of thread failed.
if (osthread() != NULL) os::free_thread(osthread());
- delete _SR_lock;
-
// clear Thread::current if thread is deleting itself.
// Needed to ensure JNI correctly detects non-attached threads.
if (this == Thread::current()) {
From 90db0f9ad78c03fd2f720b6771345db02883fc64 Mon Sep 17 00:00:00 2001
From: Frederic Parain
Date: Fri, 12 Aug 2016 08:46:17 -0700
Subject: [PATCH 049/120] 8146697: VM crashes in test Test7005594
Reviewed-by: coleenp, dholmes
---
hotspot/src/cpu/x86/vm/interp_masm_x86.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp
index 15cf1f751a7..f3ae96f05a1 100644
--- a/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp
+++ b/hotspot/src/cpu/x86/vm/interp_masm_x86.cpp
@@ -1071,6 +1071,9 @@ void InterpreterMacroAssembler::remove_activation(
NOT_LP64(get_thread(rthread);)
+ cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
+ jcc(Assembler::equal, no_reserved_zone_enabling);
+
cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
jcc(Assembler::lessEqual, no_reserved_zone_enabling);
From d68c6f28d46e620c1d1b088c40309cab3456e816 Mon Sep 17 00:00:00 2001
From: Yasumasa Suenaga
Date: Tue, 9 Aug 2016 21:57:29 +0900
Subject: [PATCH 050/120] 8163185: jhsdb jstack cannot work with normal mode
Reviewed-by: dsamersoff, dholmes
---
.../share/classes/sun/jvm/hotspot/SALauncher.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
index 8513c109bb6..3d4c2db9362 100644
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/SALauncher.java
@@ -255,7 +255,8 @@ public class SALauncher {
}
buildAttachArgs(newArgs, pid, exe, core, false);
- JStack.main(newArgs.toArray(new String[newArgs.size()]));
+ JStack jstack = new JStack(false, false);
+ jstack.runWithArgs(newArgs.toArray(new String[newArgs.size()]));
}
private static void runJMAP(String[] oldArgs) {
From 9797ce7dcb2ab2c0fb05f6a5287222db719abad4 Mon Sep 17 00:00:00 2001
From: Phil Race
Date: Tue, 9 Aug 2016 16:20:02 -0700
Subject: [PATCH 051/120] 8163238: Upgrade to harfbuzz 1.3.0 in JDK 9
Reviewed-by: vadim, serb
---
.../native/libfontmanager/harfbuzz/hb-blob.cc | 1 -
.../native/libfontmanager/harfbuzz/hb-blob.h | 24 +-
.../harfbuzz/hb-buffer-private.hh | 114 +-
.../harfbuzz/hb-buffer-serialize.cc | 86 +-
.../libfontmanager/harfbuzz/hb-buffer.cc | 457 +-
.../libfontmanager/harfbuzz/hb-buffer.h | 254 +-
.../libfontmanager/harfbuzz/hb-common.cc | 48 +-
.../libfontmanager/harfbuzz/hb-common.h | 47 +-
.../libfontmanager/harfbuzz/hb-coretext.cc | 207 +-
.../libfontmanager/harfbuzz/hb-coretext.h | 6 +-
.../libfontmanager/harfbuzz/hb-deprecated.h | 10 +
.../native/libfontmanager/harfbuzz/hb-face.h | 34 +-
.../harfbuzz/hb-fallback-shape.cc | 4 +-
.../harfbuzz/hb-font-private.hh | 217 +-
.../native/libfontmanager/harfbuzz/hb-font.cc | 567 +-
.../native/libfontmanager/harfbuzz/hb-font.h | 241 +-
.../native/libfontmanager/harfbuzz/hb-ft.cc | 172 +-
.../native/libfontmanager/harfbuzz/hb-ft.h | 18 +-
.../harfbuzz/hb-open-file-private.hh | 4 +-
.../harfbuzz/hb-open-type-private.hh | 45 +-
.../harfbuzz/hb-ot-cmap-table.hh | 125 +-
.../libfontmanager/harfbuzz/hb-ot-font.cc | 365 +-
.../libfontmanager/harfbuzz/hb-ot-font.h | 2 +-
.../harfbuzz/hb-ot-glyf-table.hh | 8 +-
.../harfbuzz/hb-ot-head-table.hh | 8 +-
.../harfbuzz/hb-ot-hhea-table.hh | 2 +-
.../harfbuzz/hb-ot-hmtx-table.hh | 6 +-
.../harfbuzz/hb-ot-layout-common-private.hh | 54 +-
.../harfbuzz/hb-ot-layout-gdef-table.hh | 2 +-
.../harfbuzz/hb-ot-layout-gpos-table.hh | 136 +-
.../harfbuzz/hb-ot-layout-gsub-table.hh | 49 +-
.../harfbuzz/hb-ot-layout-gsubgpos-private.hh | 63 +-
.../harfbuzz/hb-ot-layout-jstf-table.hh | 2 +-
.../harfbuzz/hb-ot-layout-private.hh | 205 +-
.../libfontmanager/harfbuzz/hb-ot-layout.cc | 248 +-
.../libfontmanager/harfbuzz/hb-ot-layout.h | 56 +-
.../harfbuzz/hb-ot-map-private.hh | 19 +-
.../libfontmanager/harfbuzz/hb-ot-map.cc | 7 +-
.../harfbuzz/hb-ot-maxp-table.hh | 2 +-
.../harfbuzz/hb-ot-os2-table.hh | 105 +
.../hb-ot-shape-complex-arabic-table.hh | 56 +-
.../harfbuzz/hb-ot-shape-complex-arabic.cc | 248 +-
.../harfbuzz/hb-ot-shape-complex-default.cc | 3 +-
.../harfbuzz/hb-ot-shape-complex-hangul.cc | 9 +-
.../harfbuzz/hb-ot-shape-complex-hebrew.cc | 3 +-
.../hb-ot-shape-complex-indic-machine.hh | 2026 ++++---
.../hb-ot-shape-complex-indic-private.hh | 45 +-
.../hb-ot-shape-complex-indic-table.cc | 698 +--
.../harfbuzz/hb-ot-shape-complex-indic.cc | 145 +-
.../hb-ot-shape-complex-myanmar-machine.hh | 38 +-
.../harfbuzz/hb-ot-shape-complex-myanmar.cc | 25 +-
.../harfbuzz/hb-ot-shape-complex-private.hh | 29 +-
.../harfbuzz/hb-ot-shape-complex-thai.cc | 8 +-
.../harfbuzz/hb-ot-shape-complex-tibetan.cc | 3 +-
.../hb-ot-shape-complex-use-machine.hh | 588 +-
.../hb-ot-shape-complex-use-private.hh | 1 -
.../harfbuzz/hb-ot-shape-complex-use-table.cc | 224 +-
.../harfbuzz/hb-ot-shape-complex-use.cc | 65 +-
.../harfbuzz/hb-ot-shape-fallback-private.hh | 4 +
.../harfbuzz/hb-ot-shape-fallback.cc | 71 +-
.../harfbuzz/hb-ot-shape-normalize.cc | 117 +-
.../libfontmanager/harfbuzz/hb-ot-shape.cc | 186 +-
.../libfontmanager/harfbuzz/hb-ot-shape.h | 4 +-
.../libfontmanager/harfbuzz/hb-ot-tag.cc | 166 +-
.../libfontmanager/harfbuzz/hb-ot-tag.h | 8 +-
.../libfontmanager/harfbuzz/hb-private.hh | 76 +-
.../native/libfontmanager/harfbuzz/hb-set.h | 52 +-
.../libfontmanager/harfbuzz/hb-shape-plan.h | 18 +-
.../libfontmanager/harfbuzz/hb-shape.cc | 12 +-
.../native/libfontmanager/harfbuzz/hb-shape.h | 10 +-
.../libfontmanager/harfbuzz/hb-shaper-list.hh | 3 +
.../native/libfontmanager/harfbuzz/hb-ucdn.cc | 6 +
.../libfontmanager/harfbuzz/hb-ucdn/ucdn.c | 80 +-
.../libfontmanager/harfbuzz/hb-ucdn/ucdn.h | 98 +-
.../harfbuzz/hb-ucdn/unicodedata_db.h | 4754 +++++++++--------
.../harfbuzz/hb-unicode-private.hh | 61 +-
.../libfontmanager/harfbuzz/hb-unicode.h | 71 +-
.../libfontmanager/harfbuzz/hb-utf-private.hh | 46 +-
.../libfontmanager/harfbuzz/hb-version.h | 12 +-
.../share/native/libfontmanager/harfbuzz/hb.h | 4 +
80 files changed, 8085 insertions(+), 6008 deletions(-)
create mode 100644 jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc
index 40aa17f306c..5068dc14d9a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc
@@ -104,7 +104,6 @@ hb_blob_create (const char *data,
if (!length ||
length >= 1u << 31 ||
- data + length < data /* overflows */ ||
!(blob = hb_object_create ())) {
if (destroy)
destroy (user_data);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h
index 6559ca2f407..ff44e18b76f 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h
@@ -64,7 +64,7 @@ typedef enum {
typedef struct hb_blob_t hb_blob_t;
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_blob_create (const char *data,
unsigned int length,
hb_memory_mode_t mode,
@@ -77,21 +77,21 @@ hb_blob_create (const char *data,
* modify the parent data as that data may be
* shared among multiple sub-blobs.
*/
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_blob_create_sub_blob (hb_blob_t *parent,
unsigned int offset,
unsigned int length);
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_blob_get_empty (void);
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_blob_reference (hb_blob_t *blob);
-void
+HB_EXTERN void
hb_blob_destroy (hb_blob_t *blob);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_blob_set_user_data (hb_blob_t *blob,
hb_user_data_key_t *key,
void * data,
@@ -99,25 +99,25 @@ hb_blob_set_user_data (hb_blob_t *blob,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_blob_get_user_data (hb_blob_t *blob,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_blob_make_immutable (hb_blob_t *blob);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_blob_is_immutable (hb_blob_t *blob);
-unsigned int
+HB_EXTERN unsigned int
hb_blob_get_length (hb_blob_t *blob);
-const char *
+HB_EXTERN const char *
hb_blob_get_data (hb_blob_t *blob, unsigned int *length);
-char *
+HB_EXTERN char *
hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh
index 8f0f1d6dd72..1fc2252d12c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh
@@ -35,9 +35,36 @@
#include "hb-unicode-private.hh"
+#ifndef HB_BUFFER_MAX_EXPANSION_FACTOR
+#define HB_BUFFER_MAX_EXPANSION_FACTOR 32
+#endif
+#ifndef HB_BUFFER_MAX_LEN_MIN
+#define HB_BUFFER_MAX_LEN_MIN 8192
+#endif
+#ifndef HB_BUFFER_MAX_LEN_DEFAULT
+#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
+#endif
+
ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20);
ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t));
+HB_MARK_AS_FLAG_T (hb_buffer_flags_t);
+HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t);
+
+enum hb_buffer_scratch_flags_t {
+ HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK = 0x00000004u,
+ HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u,
+ /* Reserved for complex shapers' internal use. */
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX0 = 0x01000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u,
+ HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u,
+};
+HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t);
+
/*
* hb_buffer_t
@@ -52,6 +79,8 @@ struct hb_buffer_t {
hb_buffer_flags_t flags; /* BOT / EOT / etc. */
hb_buffer_cluster_level_t cluster_level;
hb_codepoint_t replacement; /* U+FFFD or something else. */
+ hb_buffer_scratch_flags_t scratch_flags; /* Have space-flallback, etc. */
+ unsigned int max_len; /* Maximum allowed len. */
/* Buffer contents */
hb_buffer_content_type_t content_type;
@@ -76,17 +105,13 @@ struct hb_buffer_t {
inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; }
inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; }
- inline hb_glyph_info_t &prev (void) { return out_info[out_len - 1]; }
- inline hb_glyph_info_t prev (void) const { return info[out_len - 1]; }
+ inline hb_glyph_info_t &prev (void) { return out_info[out_len ? out_len - 1 : 0]; }
+ inline hb_glyph_info_t prev (void) const { return out_info[out_len ? out_len - 1 : 0]; }
inline bool has_separate_output (void) const { return info != out_info; }
unsigned int serial;
- /* These reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
- uint8_t allocated_var_bytes[8];
- const char *allocated_var_owner[8];
-
/* Text before / after the main buffer contents.
* Always in Unicode, and ordered outward.
* Index 0 is for "pre-context", 1 for "post-context". */
@@ -94,6 +119,52 @@ struct hb_buffer_t {
hb_codepoint_t context[2][CONTEXT_LENGTH];
unsigned int context_len[2];
+ /* Debugging API */
+ hb_buffer_message_func_t message_func;
+ void *message_data;
+ hb_destroy_func_t message_destroy;
+
+ /* Internal debugging. */
+ /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */
+#ifndef HB_NDEBUG
+ uint8_t allocated_var_bits;
+#endif
+ inline void allocate_var (unsigned int start, unsigned int count)
+ {
+#ifndef HB_NDEBUG
+ unsigned int end = start + count;
+ assert (end <= 8);
+ unsigned int bits = (1<func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
- sizeof (b->info[0].var), owner)
-#define HB_BUFFER_ALLOCATE_VAR(b, var) \
- HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var (), #var)
-#define HB_BUFFER_DEALLOCATE_VAR(b, var) \
- HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var (), #var)
-#define HB_BUFFER_ASSERT_VAR(b, var) \
- HB_BUFFER_XALLOCATE_VAR (b, assert_var, var (), #var)
+ sizeof (b->info[0].var))
+#define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ())
+#define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ())
+#define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ())
#endif /* HB_BUFFER_PRIVATE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc
index 8da89bd3248..0047743d79e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc
@@ -36,11 +36,12 @@ static const char *serialize_formats[] = {
/**
* hb_buffer_serialize_list_formats:
*
- *
+ * Returns a list of supported buffer serialization formats.
*
* Return value: (transfer none):
+ * A string array of buffer serialization formats. Should not be freed.
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
const char **
hb_buffer_serialize_list_formats (void)
@@ -50,14 +51,17 @@ hb_buffer_serialize_list_formats (void)
/**
* hb_buffer_serialize_format_from_string:
- * @str:
- * @len:
- *
+ * @str: (array length=len) (element-type uint8_t): a string to parse
+ * @len: length of @str, or -1 if string is %NULL terminated
*
+ * Parses a string into an #hb_buffer_serialize_format_t. Does not check if
+ * @str is a valid buffer serialization format, use
+ * hb_buffer_serialize_list_formats() to get the list of supported formats.
*
* Return value:
+ * The parsed #hb_buffer_serialize_format_t.
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
hb_buffer_serialize_format_t
hb_buffer_serialize_format_from_string (const char *str, int len)
@@ -68,13 +72,15 @@ hb_buffer_serialize_format_from_string (const char *str, int len)
/**
* hb_buffer_serialize_format_to_string:
- * @format:
+ * @format: an #hb_buffer_serialize_format_t to convert.
*
+ * Converts @format to the string corresponding it, or %NULL if it is not a valid
+ * #hb_buffer_serialize_format_t.
*
+ * Return value: (transfer none):
+ * A %NULL terminated string corresponding to @format. Should not be freed.
*
- * Return value:
- *
- * Since: 0.9.2
+ * Since: 0.9.7
**/
const char *
hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format)
@@ -242,24 +248,51 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
return end - start;
}
-/* Returns number of items, starting at start, that were serialized. */
/**
* hb_buffer_serialize_glyphs:
- * @buffer: a buffer.
- * @start:
- * @end:
- * @buf: (array length=buf_size):
- * @buf_size:
- * @buf_consumed: (out):
- * @font:
- * @format:
- * @flags:
+ * @buffer: an #hb_buffer_t buffer.
+ * @start: the first item in @buffer to serialize.
+ * @end: the last item in @buffer to serialize.
+ * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
+ * write serialized buffer into.
+ * @buf_size: the size of @buf.
+ * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to
+ * read glyph names and extents. If %NULL, and empty font will be used.
+ * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
+ * to serialize.
*
+ * Serializes @buffer into a textual representation of its glyph content,
+ * useful for showing the contents of the buffer, for example during debugging.
+ * There are currently two supported serialization formats:
*
+ * ## text
+ * A human-readable, plain text format.
+ * The serialized glyphs will look something like:
+ *
+ * ```
+ * [uni0651=0@518,0+0|uni0628=0+1897]
+ * ```
+ * - The serialized glyphs are delimited with `[` and `]`.
+ * - Glyphs are separated with `|`
+ * - Each glyph starts with glyph name, or glyph index if
+ * #HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES flag is set. Then,
+ * - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, `=` then #hb_glyph_info_t.cluster.
+ * - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format:
+ * - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then,
+ * - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then,
+ * - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the
+ * #hb_glyph_extents_t in the format
+ * `<x_bearing,y_bearing,width,height>`
+ *
+ * ## json
+ * TODO.
*
* Return value:
+ * The number of serialized items.
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
unsigned int
hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
@@ -267,8 +300,8 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
unsigned int end,
char *buf,
unsigned int buf_size,
- unsigned int *buf_consumed, /* May be NULL */
- hb_font_t *font, /* May be NULL */
+ unsigned int *buf_consumed,
+ hb_font_t *font,
hb_buffer_serialize_format_t format,
hb_buffer_serialize_flags_t flags)
{
@@ -282,6 +315,9 @@ hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) ||
buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS);
+ if (!buffer->have_positions)
+ flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
+
if (unlikely (start == end))
return 0;
@@ -355,7 +391,7 @@ parse_int (const char *pp, const char *end, int32_t *pv)
/**
* hb_buffer_deserialize_glyphs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t buffer.
* @buf: (array length=buf_len):
* @buf_len:
* @end_ptr: (out):
@@ -366,7 +402,7 @@ parse_int (const char *pp, const char *end, int32_t *pv)
*
* Return value:
*
- * Since: 0.9.2
+ * Since: 0.9.7
**/
hb_bool_t
hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc
index 62177f3e9c8..aca21984fb7 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc
@@ -35,8 +35,26 @@
#define HB_DEBUG_BUFFER (HB_DEBUG+0)
#endif
+/**
+ * SECTION: hb-buffer
+ * @title: Buffers
+ * @short_description: Input and output buffers
+ * @include: hb.h
+ *
+ * Buffers serve dual role in HarfBuzz; they hold the input characters that are
+ * passed hb_shape(), and after shaping they hold the output glyphs.
+ **/
/**
+ * hb_segment_properties_equal:
+ * @a: first #hb_segment_properties_t to compare.
+ * @b: second #hb_segment_properties_t to compare.
+ *
+ * Checks the equality of two #hb_segment_properties_t's.
+ *
+ * Return value:
+ * %true if all properties of @a equal those of @b, false otherwise.
+ *
* Since: 0.9.7
**/
hb_bool_t
@@ -52,6 +70,14 @@ hb_segment_properties_equal (const hb_segment_properties_t *a,
}
/**
+ * hb_segment_properties_hash:
+ * @p: #hb_segment_properties_t to hash.
+ *
+ * Creates a hash representing @p.
+ *
+ * Return value:
+ * A hash of @p.
+ *
* Since: 0.9.7
**/
unsigned int
@@ -91,6 +117,11 @@ hb_buffer_t::enlarge (unsigned int size)
{
if (unlikely (in_error))
return false;
+ if (unlikely (size > max_len))
+ {
+ in_error = true;
+ return false;
+ }
unsigned int new_allocated = allocated;
hb_glyph_position_t *new_pos = NULL;
@@ -152,6 +183,12 @@ hb_buffer_t::shift_forward (unsigned int count)
if (unlikely (!ensure (len + count))) return false;
memmove (info + idx + count, info + idx, (len - idx) * sizeof (info[0]));
+ if (idx + count > len)
+ {
+ /* Under memory failure we might expose this area. At least
+ * clean it up. Oh well... */
+ memset (info + len, 0, (idx + count - len) * sizeof (info[0]));
+ }
len += count;
idx += count;
@@ -198,6 +235,7 @@ hb_buffer_t::clear (void)
hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT;
props = default_props;
+ scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
in_error = false;
@@ -210,11 +248,11 @@ hb_buffer_t::clear (void)
out_info = info;
serial = 0;
- memset (allocated_var_bytes, 0, sizeof allocated_var_bytes);
- memset (allocated_var_owner, 0, sizeof allocated_var_owner);
memset (context, 0, sizeof context);
memset (context_len, 0, sizeof context_len);
+
+ deallocate_var_all ();
}
void
@@ -375,6 +413,8 @@ hb_buffer_t::move_to (unsigned int i)
idx = i;
return true;
}
+ if (unlikely (in_error))
+ return false;
assert (i <= out_len + (len - idx));
@@ -392,6 +432,8 @@ hb_buffer_t::move_to (unsigned int i)
/* Tricky part: rewinding... */
unsigned int count = out_len - i;
+ /* This will blow in our face if memory allocation fails later
+ * in this same lookup... */
if (unlikely (idx < count && !shift_forward (count + 32))) return false;
assert (idx >= count);
@@ -627,82 +669,19 @@ hb_buffer_t::guess_segment_properties (void)
}
-static inline void
-dump_var_allocation (const hb_buffer_t *buffer)
-{
- char buf[80];
- for (unsigned int i = 0; i < 8; i++)
- buf[i] = '0' + buffer->allocated_var_bytes[7 - i];
- buf[8] = '\0';
- DEBUG_MSG (BUFFER, buffer,
- "Current var allocation: %s",
- buf);
-}
-
-void hb_buffer_t::allocate_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
- assert (byte_i < 8 && byte_i + count <= 8);
-
- if (DEBUG_ENABLED (BUFFER))
- dump_var_allocation (this);
- DEBUG_MSG (BUFFER, this,
- "Allocating var bytes %d..%d for %s",
- byte_i, byte_i + count - 1, owner);
-
- for (unsigned int i = byte_i; i < byte_i + count; i++) {
- assert (!allocated_var_bytes[i]);
- allocated_var_bytes[i]++;
- allocated_var_owner[i] = owner;
- }
-}
-
-void hb_buffer_t::deallocate_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
- if (DEBUG_ENABLED (BUFFER))
- dump_var_allocation (this);
-
- DEBUG_MSG (BUFFER, this,
- "Deallocating var bytes %d..%d for %s",
- byte_i, byte_i + count - 1, owner);
-
- assert (byte_i < 8 && byte_i + count <= 8);
- for (unsigned int i = byte_i; i < byte_i + count; i++) {
- assert (allocated_var_bytes[i]);
- assert (0 == strcmp (allocated_var_owner[i], owner));
- allocated_var_bytes[i]--;
- }
-}
-
-void hb_buffer_t::assert_var (unsigned int byte_i, unsigned int count, const char *owner)
-{
- if (DEBUG_ENABLED (BUFFER))
- dump_var_allocation (this);
-
- DEBUG_MSG (BUFFER, this,
- "Asserting var bytes %d..%d for %s",
- byte_i, byte_i + count - 1, owner);
-
- assert (byte_i < 8 && byte_i + count <= 8);
- for (unsigned int i = byte_i; i < byte_i + count; i++) {
- assert (allocated_var_bytes[i]);
- assert (0 == strcmp (allocated_var_owner[i], owner));
- }
-}
-
-void hb_buffer_t::deallocate_var_all (void)
-{
- memset (allocated_var_bytes, 0, sizeof (allocated_var_bytes));
- memset (allocated_var_owner, 0, sizeof (allocated_var_owner));
-}
-
/* Public API */
/**
* hb_buffer_create: (Xconstructor)
*
+ * Creates a new #hb_buffer_t with all properties to defaults.
*
- *
- * Return value: (transfer full)
+ * Return value: (transfer full):
+ * A newly allocated #hb_buffer_t with a reference count of 1. The initial
+ * reference count should be released with hb_buffer_destroy() when you are done
+ * using the #hb_buffer_t. This function never returns %NULL. If memory cannot
+ * be allocated, a special #hb_buffer_t object will be returned on which
+ * hb_buffer_allocation_successful() returns %false.
*
* Since: 0.9.2
**/
@@ -714,6 +693,8 @@ hb_buffer_create (void)
if (!(buffer = hb_object_create ()))
return hb_buffer_get_empty ();
+ buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
+
buffer->reset ();
return buffer;
@@ -738,6 +719,8 @@ hb_buffer_get_empty (void)
HB_BUFFER_FLAG_DEFAULT,
HB_BUFFER_CLUSTER_LEVEL_DEFAULT,
HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT,
+ HB_BUFFER_SCRATCH_FLAG_DEFAULT,
+ HB_BUFFER_MAX_LEN_DEFAULT,
HB_BUFFER_CONTENT_TYPE_INVALID,
HB_SEGMENT_PROPERTIES_DEFAULT,
@@ -753,11 +736,13 @@ hb_buffer_get_empty (void)
/**
* hb_buffer_reference: (skip)
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * Increases the reference count on @buffer by one. This prevents @buffer from
+ * being destroyed until a matching call to hb_buffer_destroy() is made.
*
* Return value: (transfer full):
+ * The referenced #hb_buffer_t.
*
* Since: 0.9.2
**/
@@ -769,9 +754,11 @@ hb_buffer_reference (hb_buffer_t *buffer)
/**
* hb_buffer_destroy: (skip)
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * Deallocate the @buffer.
+ * Decreases the reference count on @buffer by one. If the result is zero, then
+ * @buffer and all associated resources are freed. See hb_buffer_reference().
*
* Since: 0.9.2
**/
@@ -784,13 +771,15 @@ hb_buffer_destroy (hb_buffer_t *buffer)
free (buffer->info);
free (buffer->pos);
+ if (buffer->message_destroy)
+ buffer->message_destroy (buffer->message_data);
free (buffer);
}
/**
* hb_buffer_set_user_data: (skip)
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @key:
* @data:
* @destroy:
@@ -814,7 +803,7 @@ hb_buffer_set_user_data (hb_buffer_t *buffer,
/**
* hb_buffer_get_user_data: (skip)
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @key:
*
*
@@ -833,10 +822,11 @@ hb_buffer_get_user_data (hb_buffer_t *buffer,
/**
* hb_buffer_set_content_type:
- * @buffer: a buffer.
- * @content_type:
- *
+ * @buffer: an #hb_buffer_t.
+ * @content_type: the type of buffer contents to set
*
+ * Sets the type of @buffer contents, buffers are either empty, contain
+ * characters (before shaping) or glyphs (the result of shaping).
*
* Since: 0.9.5
**/
@@ -849,11 +839,12 @@ hb_buffer_set_content_type (hb_buffer_t *buffer,
/**
* hb_buffer_get_content_type:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * see hb_buffer_set_content_type().
*
* Return value:
+ * The type of @buffer contents.
*
* Since: 0.9.5
**/
@@ -866,7 +857,7 @@ hb_buffer_get_content_type (hb_buffer_t *buffer)
/**
* hb_buffer_set_unicode_funcs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @unicode_funcs:
*
*
@@ -891,7 +882,7 @@ hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
/**
* hb_buffer_get_unicode_funcs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
*
*
@@ -907,10 +898,16 @@ hb_buffer_get_unicode_funcs (hb_buffer_t *buffer)
/**
* hb_buffer_set_direction:
- * @buffer: a buffer.
- * @direction:
- *
+ * @buffer: an #hb_buffer_t.
+ * @direction: the #hb_direction_t of the @buffer
*
+ * Set the text flow direction of the buffer. No shaping can happen without
+ * setting @buffer direction, and it controls the visual direction for the
+ * output glyphs; for RTL direction the glyphs will be reversed. Many layout
+ * features depend on the proper setting of the direction, for example,
+ * reversing RTL text before shaping, then shaping with LTR direction is not
+ * the same as keeping the text in logical order and shaping with RTL
+ * direction.
*
* Since: 0.9.2
**/
@@ -927,11 +924,12 @@ hb_buffer_set_direction (hb_buffer_t *buffer,
/**
* hb_buffer_get_direction:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * See hb_buffer_set_direction()
*
* Return value:
+ * The direction of the @buffer.
*
* Since: 0.9.2
**/
@@ -943,10 +941,18 @@ hb_buffer_get_direction (hb_buffer_t *buffer)
/**
* hb_buffer_set_script:
- * @buffer: a buffer.
- * @script:
+ * @buffer: an #hb_buffer_t.
+ * @script: an #hb_script_t to set.
*
+ * Sets the script of @buffer to @script.
*
+ * Script is crucial for choosing the proper shaping behaviour for scripts that
+ * require it (e.g. Arabic) and the which OpenType features defined in the font
+ * to be applied.
+ *
+ * You can pass one of the predefined #hb_script_t values, or use
+ * hb_script_from_string() or hb_script_from_iso15924_tag() to get the
+ * corresponding script from an ISOÂ 15924 script tag.
*
* Since: 0.9.2
**/
@@ -962,11 +968,12 @@ hb_buffer_set_script (hb_buffer_t *buffer,
/**
* hb_buffer_get_script:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * See hb_buffer_set_script().
*
* Return value:
+ * The #hb_script_t of the @buffer.
*
* Since: 0.9.2
**/
@@ -978,10 +985,18 @@ hb_buffer_get_script (hb_buffer_t *buffer)
/**
* hb_buffer_set_language:
- * @buffer: a buffer.
- * @language:
+ * @buffer: an #hb_buffer_t.
+ * @language: an hb_language_t to set.
*
+ * Sets the language of @buffer to @language.
*
+ * Languages are crucial for selecting which OpenType feature to apply to the
+ * buffer which can result in applying language-specific behaviour. Languages
+ * are orthogonal to the scripts, and though they are related, they are
+ * different concepts and should not be confused with each other.
+ *
+ * Use hb_language_from_string() to convert from ISOÂ 639 language codes to
+ * #hb_language_t.
*
* Since: 0.9.2
**/
@@ -997,11 +1012,12 @@ hb_buffer_set_language (hb_buffer_t *buffer,
/**
* hb_buffer_get_language:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * See hb_buffer_set_language().
*
* Return value: (transfer none):
+ * The #hb_language_t of the buffer. Must not be freed by the caller.
*
* Since: 0.9.2
**/
@@ -1013,10 +1029,12 @@ hb_buffer_get_language (hb_buffer_t *buffer)
/**
* hb_buffer_set_segment_properties:
- * @buffer: a buffer.
- * @props:
- *
+ * @buffer: an #hb_buffer_t.
+ * @props: an #hb_segment_properties_t to use.
*
+ * Sets the segment properties of the buffer, a shortcut for calling
+ * hb_buffer_set_direction(), hb_buffer_set_script() and
+ * hb_buffer_set_language() individually.
*
* Since: 0.9.7
**/
@@ -1032,10 +1050,10 @@ hb_buffer_set_segment_properties (hb_buffer_t *buffer,
/**
* hb_buffer_get_segment_properties:
- * @buffer: a buffer.
- * @props: (out):
- *
+ * @buffer: an #hb_buffer_t.
+ * @props: (out): the output #hb_segment_properties_t.
*
+ * Sets @props to the #hb_segment_properties_t of @buffer.
*
* Since: 0.9.7
**/
@@ -1049,10 +1067,10 @@ hb_buffer_get_segment_properties (hb_buffer_t *buffer,
/**
* hb_buffer_set_flags:
- * @buffer: a buffer.
- * @flags:
- *
+ * @buffer: an #hb_buffer_t.
+ * @flags: the buffer flags to set.
*
+ * Sets @buffer flags to @flags. See #hb_buffer_flags_t.
*
* Since: 0.9.7
**/
@@ -1068,11 +1086,12 @@ hb_buffer_set_flags (hb_buffer_t *buffer,
/**
* hb_buffer_get_flags:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * See hb_buffer_set_flags().
*
* Return value:
+ * The @buffer flags.
*
* Since: 0.9.7
**/
@@ -1084,7 +1103,7 @@ hb_buffer_get_flags (hb_buffer_t *buffer)
/**
* hb_buffer_set_cluster_level:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @cluster_level:
*
*
@@ -1103,7 +1122,7 @@ hb_buffer_set_cluster_level (hb_buffer_t *buffer,
/**
* hb_buffer_get_cluster_level:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
*
*
@@ -1120,10 +1139,13 @@ hb_buffer_get_cluster_level (hb_buffer_t *buffer)
/**
* hb_buffer_set_replacement_codepoint:
- * @buffer: a buffer.
- * @replacement:
+ * @buffer: an #hb_buffer_t.
+ * @replacement: the replacement #hb_codepoint_t
*
+ * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding
+ * when adding text to @buffer.
*
+ * Default is %HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.
*
* Since: 0.9.31
**/
@@ -1139,11 +1161,12 @@ hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
/**
* hb_buffer_get_replacement_codepoint:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * See hb_buffer_set_replacement_codepoint().
*
* Return value:
+ * The @buffer replacement #hb_codepoint_t.
*
* Since: 0.9.31
**/
@@ -1156,9 +1179,10 @@ hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer)
/**
* hb_buffer_reset:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * Resets the buffer to its initial status, as if it was just newly created
+ * with hb_buffer_create().
*
* Since: 0.9.2
**/
@@ -1170,9 +1194,10 @@ hb_buffer_reset (hb_buffer_t *buffer)
/**
* hb_buffer_clear_contents:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * Similar to hb_buffer_reset(), but does not clear the Unicode functions and
+ * the replacement code point.
*
* Since: 0.9.11
**/
@@ -1184,12 +1209,13 @@ hb_buffer_clear_contents (hb_buffer_t *buffer)
/**
* hb_buffer_pre_allocate:
- * @buffer: a buffer.
- * @size:
- *
+ * @buffer: an #hb_buffer_t.
+ * @size: number of items to pre allocate.
*
+ * Pre allocates memory for @buffer to fit at least @size number of items.
*
* Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
*
* Since: 0.9.2
**/
@@ -1201,11 +1227,12 @@ hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size)
/**
* hb_buffer_allocation_successful:
- * @buffer: a buffer.
- *
+ * @buffer: an #hb_buffer_t.
*
+ * Check if allocating memory for the buffer succeeded.
*
* Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
*
* Since: 0.9.2
**/
@@ -1217,11 +1244,18 @@ hb_buffer_allocation_successful (hb_buffer_t *buffer)
/**
* hb_buffer_add:
- * @buffer: a buffer.
- * @codepoint:
- * @cluster:
+ * @buffer: an #hb_buffer_t.
+ * @codepoint: a Unicode code point.
+ * @cluster: the cluster value of @codepoint.
*
+ * Appends a character with the Unicode value of @codepoint to @buffer, and
+ * gives it the initial cluster value of @cluster. Clusters can be any thing
+ * the client wants, they are usually used to refer to the index of the
+ * character in the input text stream and are output in
+ * #hb_glyph_info_t.cluster field.
*
+ * This function does not check the validity of @codepoint, it is up to the
+ * caller to ensure it is a valid Unicode code point.
*
* Since: 0.9.7
**/
@@ -1236,12 +1270,14 @@ hb_buffer_add (hb_buffer_t *buffer,
/**
* hb_buffer_set_length:
- * @buffer: a buffer.
- * @length:
- *
+ * @buffer: an #hb_buffer_t.
+ * @length: the new length of @buffer.
*
+ * Similar to hb_buffer_pre_allocate(), but clears any new items added at the
+ * end.
*
* Return value:
+ * %true if @buffer memory allocation succeeded, %false otherwise.
*
* Since: 0.9.2
**/
@@ -1276,11 +1312,13 @@ hb_buffer_set_length (hb_buffer_t *buffer,
/**
* hb_buffer_get_length:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
* Returns the number of items in the buffer.
*
- * Return value: buffer length.
+ * Return value:
+ * The @buffer length.
+ * The value valid as long as buffer has not been modified.
*
* Since: 0.9.2
**/
@@ -1292,13 +1330,15 @@ hb_buffer_get_length (hb_buffer_t *buffer)
/**
* hb_buffer_get_glyph_infos:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @length: (out): output array length.
*
- * Returns buffer glyph information array. Returned pointer
- * is valid as long as buffer contents are not modified.
+ * Returns @buffer glyph information array. Returned pointer
+ * is valid as long as @buffer contents are not modified.
*
- * Return value: (transfer none) (array length=length): buffer glyph information array.
+ * Return value: (transfer none) (array length=length):
+ * The @buffer glyph information array.
+ * The value valid as long as buffer has not been modified.
*
* Since: 0.9.2
**/
@@ -1314,13 +1354,15 @@ hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
/**
* hb_buffer_get_glyph_positions:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @length: (out): output length.
*
- * Returns buffer glyph position array. Returned pointer
- * is valid as long as buffer contents are not modified.
+ * Returns @buffer glyph position array. Returned pointer
+ * is valid as long as @buffer contents are not modified.
*
- * Return value: (transfer none) (array length=length): buffer glyph position array.
+ * Return value: (transfer none) (array length=length):
+ * The @buffer glyph position array.
+ * The value valid as long as buffer has not been modified.
*
* Since: 0.9.2
**/
@@ -1339,7 +1381,7 @@ hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
/**
* hb_buffer_reverse:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
* Reverses buffer contents.
*
@@ -1353,7 +1395,7 @@ hb_buffer_reverse (hb_buffer_t *buffer)
/**
* hb_buffer_reverse_range:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
* @start: start index.
* @end: end index.
*
@@ -1370,7 +1412,7 @@ hb_buffer_reverse_range (hb_buffer_t *buffer,
/**
* hb_buffer_reverse_clusters:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
* Reverses buffer clusters. That is, the buffer contents are
* reversed, then each cluster (consecutive items having the
@@ -1386,7 +1428,7 @@ hb_buffer_reverse_clusters (hb_buffer_t *buffer)
/**
* hb_buffer_guess_segment_properties:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
* Sets unset buffer segment properties based on buffer Unicode
* contents. If buffer is not empty, it must have content type
@@ -1485,13 +1527,18 @@ hb_buffer_add_utf (hb_buffer_t *buffer,
/**
* hb_buffer_add_utf8:
- * @buffer: a buffer.
- * @text: (array length=text_length) (element-type uint8_t):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ * characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * See hb_buffer_add_codepoints().
*
+ * Replaces invalid UTF-8 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
*
* Since: 0.9.2
**/
@@ -1507,13 +1554,17 @@ hb_buffer_add_utf8 (hb_buffer_t *buffer,
/**
* hb_buffer_add_utf16:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length): an array of UTF-16 characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * See hb_buffer_add_codepoints().
*
+ * Replaces invalid UTF-16 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
*
* Since: 0.9.2
**/
@@ -1529,13 +1580,17 @@ hb_buffer_add_utf16 (hb_buffer_t *buffer,
/**
* hb_buffer_add_utf32:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length): an array of UTF-32 characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * See hb_buffer_add_codepoints().
*
+ * Replaces invalid UTF-32 characters with the @buffer replacement code point,
+ * see hb_buffer_set_replacement_codepoint().
*
* Since: 0.9.2
**/
@@ -1551,13 +1606,18 @@ hb_buffer_add_utf32 (hb_buffer_t *buffer,
/**
* hb_buffer_add_latin1:
- * @buffer: a buffer.
- * @text: (array length=text_length) (element-type uint8_t):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: an #hb_buffer_t.
+ * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8
+ * characters to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first character to add to the @buffer.
+ * @item_length: the number of characters to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * Similar to hb_buffer_add_codepoints(), but allows only access to first 256
+ * Unicode code points that can fit in 8-bit strings.
*
+ * Has nothing to do with non-Unicode Latin-1 encoding.
*
* Since: 0.9.39
**/
@@ -1573,13 +1633,25 @@ hb_buffer_add_latin1 (hb_buffer_t *buffer,
/**
* hb_buffer_add_codepoints:
- * @buffer: a buffer.
- * @text: (array length=text_length):
- * @text_length:
- * @item_offset:
- * @item_length:
+ * @buffer: a #hb_buffer_t to append characters to.
+ * @text: (array length=text_length): an array of Unicode code points to append.
+ * @text_length: the length of the @text, or -1 if it is %NULL terminated.
+ * @item_offset: the offset of the first code point to add to the @buffer.
+ * @item_length: the number of code points to add to the @buffer, or -1 for the
+ * end of @text (assuming it is %NULL terminated).
*
+ * Appends characters from @text array to @buffer. The @item_offset is the
+ * position of the first character from @text that will be appended, and
+ * @item_length is the number of character. When shaping part of a larger text
+ * (e.g. a run of text from a paragraph), instead of passing just the substring
+ * corresponding to the run, it is preferable to pass the whole
+ * paragraph and specify the run start and length as @item_offset and
+ * @item_length, respectively, to give HarfBuzz the full context to be able,
+ * for example, to do cross-run Arabic shaping or properly handle combining
+ * marks at stat of run.
*
+ * This function does not check the validity of @text, it is up to the caller
+ * to ensure it contains a valid Unicode code points.
*
* Since: 0.9.31
**/
@@ -1651,9 +1723,12 @@ normalize_glyphs_cluster (hb_buffer_t *buffer,
/**
* hb_buffer_normalize_glyphs:
- * @buffer: a buffer.
+ * @buffer: an #hb_buffer_t.
*
+ * Reorders a glyph buffer to have canonical in-cluster glyph order / position.
+ * The resulting clusters should behave identical to pre-reordering clusters.
*
+ * This has nothing to do with Unicode normalization.
*
* Since: 0.9.2
**/
@@ -1699,3 +1774,45 @@ hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_g
}
}
}
+
+/*
+ * Debugging.
+ */
+
+/**
+ * hb_buffer_set_message_func:
+ * @buffer: an #hb_buffer_t.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.3
+ **/
+void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+ hb_buffer_message_func_t func,
+ void *user_data, hb_destroy_func_t destroy)
+{
+ if (buffer->message_destroy)
+ buffer->message_destroy (buffer->message_data);
+
+ if (func) {
+ buffer->message_func = func;
+ buffer->message_data = user_data;
+ buffer->message_destroy = destroy;
+ } else {
+ buffer->message_func = NULL;
+ buffer->message_data = NULL;
+ buffer->message_destroy = NULL;
+ }
+}
+
+bool
+hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap)
+{
+ char buf[100];
+ vsnprintf (buf, sizeof (buf), fmt, ap);
+ return (bool) this->message_func (this, font, buf, this->message_data);
+}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h
index 5e56da49355..688e809779c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h
@@ -40,7 +40,27 @@
HB_BEGIN_DECLS
-
+/**
+ * hb_glyph_info_t:
+ * @codepoint: either a Unicode code point (before shaping) or a glyph index
+ * (after shaping).
+ * @mask:
+ * @cluster: the index of the character in the original text that corresponds
+ * to this #hb_glyph_info_t, or whatever the client passes to
+ * hb_buffer_add(). More than one #hb_glyph_info_t can have the same
+ * @cluster value, if they resulted from the same character (e.g. one
+ * to many glyph substitution), and when more than one character gets
+ * merged in the same glyph (e.g. many to one glyph substitution) the
+ * #hb_glyph_info_t will have the smallest cluster value of them.
+ * By default some characters are merged into the same cluster
+ * (e.g. combining marks have the same cluster as their bases)
+ * even if they are separate glyphs, hb_buffer_set_cluster_level()
+ * allow selecting more fine-grained cluster handling.
+ *
+ * The #hb_glyph_info_t is the structure that holds information about the
+ * glyphs and their relation to input text.
+ *
+ */
typedef struct hb_glyph_info_t {
hb_codepoint_t codepoint;
hb_mask_t mask;
@@ -51,6 +71,22 @@ typedef struct hb_glyph_info_t {
hb_var_int_t var2;
} hb_glyph_info_t;
+/**
+ * hb_glyph_position_t:
+ * @x_advance: how much the line advances after drawing this glyph when setting
+ * text in horizontal direction.
+ * @y_advance: how much the line advances after drawing this glyph when setting
+ * text in vertical direction.
+ * @x_offset: how much the glyph moves on the X-axis before drawing it, this
+ * should not affect how much the line advances.
+ * @y_offset: how much the glyph moves on the Y-axis before drawing it, this
+ * should not affect how much the line advances.
+ *
+ * The #hb_glyph_position_t is the structure that holds the positions of the
+ * glyph in both horizontal and vertical directions. All positions in
+ * #hb_glyph_position_t are relative to the current point.
+ *
+ */
typedef struct hb_glyph_position_t {
hb_position_t x_advance;
hb_position_t y_advance;
@@ -61,7 +97,16 @@ typedef struct hb_glyph_position_t {
hb_var_int_t var;
} hb_glyph_position_t;
-
+/**
+ * hb_segment_properties_t:
+ * @direction: the #hb_direction_t of the buffer, see hb_buffer_set_direction().
+ * @script: the #hb_script_t of the buffer, see hb_buffer_set_script().
+ * @language: the #hb_language_t of the buffer, see hb_buffer_set_language().
+ *
+ * The structure that holds various text properties of an #hb_buffer_t. Can be
+ * set and retrieved using hb_buffer_set_segment_properties() and
+ * hb_buffer_get_segment_properties(), respectively.
+ */
typedef struct hb_segment_properties_t {
hb_direction_t direction;
hb_script_t script;
@@ -77,101 +122,125 @@ typedef struct hb_segment_properties_t {
NULL, \
NULL}
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_segment_properties_equal (const hb_segment_properties_t *a,
const hb_segment_properties_t *b);
-unsigned int
+HB_EXTERN unsigned int
hb_segment_properties_hash (const hb_segment_properties_t *p);
-/*
- * hb_buffer_t
+/**
+ * hb_buffer_t:
+ *
+ * The main structure holding the input text and its properties before shaping,
+ * and output glyphs and their information after shaping.
*/
typedef struct hb_buffer_t hb_buffer_t;
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
hb_buffer_create (void);
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
hb_buffer_get_empty (void);
-hb_buffer_t *
+HB_EXTERN hb_buffer_t *
hb_buffer_reference (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_destroy (hb_buffer_t *buffer);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_set_user_data (hb_buffer_t *buffer,
hb_user_data_key_t *key,
void * data,
hb_destroy_func_t destroy,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_buffer_get_user_data (hb_buffer_t *buffer,
hb_user_data_key_t *key);
-
+/**
+ * hb_buffer_content_type_t:
+ * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
+ * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
+ * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
+ */
typedef enum {
HB_BUFFER_CONTENT_TYPE_INVALID = 0,
HB_BUFFER_CONTENT_TYPE_UNICODE,
HB_BUFFER_CONTENT_TYPE_GLYPHS
} hb_buffer_content_type_t;
-void
+HB_EXTERN void
hb_buffer_set_content_type (hb_buffer_t *buffer,
hb_buffer_content_type_t content_type);
-hb_buffer_content_type_t
+HB_EXTERN hb_buffer_content_type_t
hb_buffer_get_content_type (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_unicode_funcs (hb_buffer_t *buffer,
hb_unicode_funcs_t *unicode_funcs);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_buffer_get_unicode_funcs (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_direction (hb_buffer_t *buffer,
hb_direction_t direction);
-hb_direction_t
+HB_EXTERN hb_direction_t
hb_buffer_get_direction (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_script (hb_buffer_t *buffer,
hb_script_t script);
-hb_script_t
+HB_EXTERN hb_script_t
hb_buffer_get_script (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_language (hb_buffer_t *buffer,
hb_language_t language);
-hb_language_t
+HB_EXTERN hb_language_t
hb_buffer_get_language (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_set_segment_properties (hb_buffer_t *buffer,
const hb_segment_properties_t *props);
-void
+HB_EXTERN void
hb_buffer_get_segment_properties (hb_buffer_t *buffer,
hb_segment_properties_t *props);
-void
+HB_EXTERN void
hb_buffer_guess_segment_properties (hb_buffer_t *buffer);
-/*
+/**
+ * hb_buffer_flags_t:
+ * @HB_BUFFER_FLAG_DEFAULT: the default buffer flag.
+ * @HB_BUFFER_FLAG_BOT: flag indicating that special handling of the beginning
+ * of text paragraph can be applied to this buffer. Should usually
+ * be set, unless you are passing to the buffer only part
+ * of the text without the full context.
+ * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text
+ * paragraph can be applied to this buffer, similar to
+ * @HB_BUFFER_FLAG_EOT.
+ * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES:
+ * flag indication that character with Default_Ignorable
+ * Unicode property should use the corresponding glyph
+ * from the font, instead of hiding them (currently done
+ * by replacing them with the space glyph and zeroing the
+ * advance width.)
+ *
* Since: 0.9.20
*/
typedef enum { /*< flags >*/
@@ -181,11 +250,11 @@ typedef enum { /*< flags >*/
HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u
} hb_buffer_flags_t;
-void
+HB_EXTERN void
hb_buffer_set_flags (hb_buffer_t *buffer,
hb_buffer_flags_t flags);
-hb_buffer_flags_t
+HB_EXTERN hb_buffer_flags_t
hb_buffer_get_flags (hb_buffer_t *buffer);
/*
@@ -198,93 +267,92 @@ typedef enum {
HB_BUFFER_CLUSTER_LEVEL_DEFAULT = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
} hb_buffer_cluster_level_t;
-void
+HB_EXTERN void
hb_buffer_set_cluster_level (hb_buffer_t *buffer,
hb_buffer_cluster_level_t cluster_level);
-hb_buffer_cluster_level_t
+HB_EXTERN hb_buffer_cluster_level_t
hb_buffer_get_cluster_level (hb_buffer_t *buffer);
+/**
+ * HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT:
+ *
+ * The default code point for replacing invalid characters in a given encoding.
+ * Set to U+FFFD REPLACEMENT CHARACTER.
+ *
+ * Since: 0.9.31
+ */
#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
-/* Sets codepoint used to replace invalid UTF-8/16/32 entries.
- * Default is 0xFFFDu. */
-void
+HB_EXTERN void
hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer,
hb_codepoint_t replacement);
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer);
-/* Resets the buffer. Afterwards it's as if it was just created,
- * except that it has a larger buffer allocated perhaps... */
-void
+HB_EXTERN void
hb_buffer_reset (hb_buffer_t *buffer);
-/* Like reset, but does NOT clear unicode_funcs and replacement_codepoint. */
-void
+HB_EXTERN void
hb_buffer_clear_contents (hb_buffer_t *buffer);
-/* Returns false if allocation failed */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_pre_allocate (hb_buffer_t *buffer,
unsigned int size);
-/* Returns false if allocation has failed before */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_allocation_successful (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_reverse (hb_buffer_t *buffer);
-void
+HB_EXTERN void
hb_buffer_reverse_range (hb_buffer_t *buffer,
unsigned int start, unsigned int end);
-void
+HB_EXTERN void
hb_buffer_reverse_clusters (hb_buffer_t *buffer);
/* Filling the buffer in */
-void
+HB_EXTERN void
hb_buffer_add (hb_buffer_t *buffer,
hb_codepoint_t codepoint,
unsigned int cluster);
-void
+HB_EXTERN void
hb_buffer_add_utf8 (hb_buffer_t *buffer,
const char *text,
int text_length,
unsigned int item_offset,
int item_length);
-void
+HB_EXTERN void
hb_buffer_add_utf16 (hb_buffer_t *buffer,
const uint16_t *text,
int text_length,
unsigned int item_offset,
int item_length);
-void
+HB_EXTERN void
hb_buffer_add_utf32 (hb_buffer_t *buffer,
const uint32_t *text,
int text_length,
unsigned int item_offset,
int item_length);
-/* Allows only access to first 256 Unicode codepoints. */
-void
+HB_EXTERN void
hb_buffer_add_latin1 (hb_buffer_t *buffer,
const uint8_t *text,
int text_length,
unsigned int item_offset,
int item_length);
-/* Like add_utf32 but does NOT check for invalid Unicode codepoints. */
-void
+HB_EXTERN void
hb_buffer_add_codepoints (hb_buffer_t *buffer,
const hb_codepoint_t *text,
int text_length,
@@ -292,32 +360,25 @@ hb_buffer_add_codepoints (hb_buffer_t *buffer,
int item_length);
-/* Clears any new items added at the end */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_set_length (hb_buffer_t *buffer,
unsigned int length);
-/* Return value valid as long as buffer not modified */
-unsigned int
+HB_EXTERN unsigned int
hb_buffer_get_length (hb_buffer_t *buffer);
/* Getting glyphs out of the buffer */
-/* Return value valid as long as buffer not modified */
-hb_glyph_info_t *
+HB_EXTERN hb_glyph_info_t *
hb_buffer_get_glyph_infos (hb_buffer_t *buffer,
unsigned int *length);
-/* Return value valid as long as buffer not modified */
-hb_glyph_position_t *
+HB_EXTERN hb_glyph_position_t *
hb_buffer_get_glyph_positions (hb_buffer_t *buffer,
unsigned int *length);
-/* Reorders a glyph buffer to have canonical in-cluster glyph order / position.
- * The resulting clusters should behave identical to pre-reordering clusters.
- * NOTE: This has nothing to do with Unicode normalization. */
-void
+HB_EXTERN void
hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
@@ -325,7 +386,16 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
* Serialize
*/
-/*
+/**
+ * hb_buffer_serialize_flags_t:
+ * @HB_BUFFER_SERIALIZE_FLAG_DEFAULT: serialize glyph names, clusters and positions.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: do not serialize glyph cluster.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
+ * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
+ * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
+ *
+ * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
+ *
* Since: 0.9.20
*/
typedef enum { /*< flags >*/
@@ -336,43 +406,67 @@ typedef enum { /*< flags >*/
HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u
} hb_buffer_serialize_flags_t;
+/**
+ * hb_buffer_serialize_format_t:
+ * @HB_BUFFER_SERIALIZE_FORMAT_TEXT: a human-readable, plain text format.
+ * @HB_BUFFER_SERIALIZE_FORMAT_JSON: a machine-readable JSON format.
+ * @HB_BUFFER_SERIALIZE_FORMAT_INVALID: invalid format.
+ *
+ * The buffer serialization and de-serialization format used in
+ * hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs().
+ *
+ * Since: 0.9.2
+ */
typedef enum {
HB_BUFFER_SERIALIZE_FORMAT_TEXT = HB_TAG('T','E','X','T'),
HB_BUFFER_SERIALIZE_FORMAT_JSON = HB_TAG('J','S','O','N'),
HB_BUFFER_SERIALIZE_FORMAT_INVALID = HB_TAG_NONE
} hb_buffer_serialize_format_t;
-/* len=-1 means str is NUL-terminated. */
-hb_buffer_serialize_format_t
+HB_EXTERN hb_buffer_serialize_format_t
hb_buffer_serialize_format_from_string (const char *str, int len);
-const char *
+HB_EXTERN const char *
hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format);
-const char **
+HB_EXTERN const char **
hb_buffer_serialize_list_formats (void);
-/* Returns number of items, starting at start, that were serialized. */
-unsigned int
+HB_EXTERN unsigned int
hb_buffer_serialize_glyphs (hb_buffer_t *buffer,
unsigned int start,
unsigned int end,
char *buf,
unsigned int buf_size,
- unsigned int *buf_consumed, /* May be NULL */
- hb_font_t *font, /* May be NULL */
+ unsigned int *buf_consumed,
+ hb_font_t *font,
hb_buffer_serialize_format_t format,
hb_buffer_serialize_flags_t flags);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
const char *buf,
- int buf_len, /* -1 means nul-terminated */
- const char **end_ptr, /* May be NULL */
- hb_font_t *font, /* May be NULL */
+ int buf_len,
+ const char **end_ptr,
+ hb_font_t *font,
hb_buffer_serialize_format_t format);
+/*
+ * Debugging.
+ */
+
+typedef hb_bool_t (*hb_buffer_message_func_t) (hb_buffer_t *buffer,
+ hb_font_t *font,
+ const char *message,
+ void *user_data);
+
+HB_EXTERN void
+hb_buffer_set_message_func (hb_buffer_t *buffer,
+ hb_buffer_message_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+
HB_END_DECLS
#endif /* HB_BUFFER_H */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc
index bf5dba8da0c..d7b75ac1b1e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc
@@ -88,7 +88,7 @@ hb_tag_from_string (const char *str, int len)
/**
* hb_tag_to_string:
* @tag:
- * @buf: (array fixed-size=4):
+ * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t):
*
*
*
@@ -281,12 +281,15 @@ retry:
/**
* hb_language_from_string:
- * @str: (array length=len) (element-type uint8_t):
- * @len:
- *
+ * @str: (array length=len) (element-type uint8_t): a string representing
+ * ISOÂ 639 language code
+ * @len: length of the @str, or -1 if it is %NULL-terminated.
*
+ * Converts @str representing an ISOÂ 639 language code to the corresponding
+ * #hb_language_t.
*
* Return value: (transfer none):
+ * The #hb_language_t corresponding to the ISOÂ 639 language code.
*
* Since: 0.9.2
**/
@@ -314,11 +317,13 @@ hb_language_from_string (const char *str, int len)
/**
* hb_language_to_string:
- * @language:
- *
+ * @language: an #hb_language_t to convert.
*
+ * See hb_language_from_string().
*
* Return value: (transfer none):
+ * A %NULL-terminated string representing the @language. Must not be freed by
+ * the caller.
*
* Since: 0.9.2
**/
@@ -357,11 +362,12 @@ hb_language_get_default (void)
/**
* hb_script_from_iso15924_tag:
- * @tag:
- *
+ * @tag: an #hb_tag_t representing an ISOÂ 15924 tag.
*
+ * Converts an ISOÂ 15924 script tag to a corresponding #hb_script_t.
*
* Return value:
+ * An #hb_script_t corresponding to the ISOÂ 15924 tag.
*
* Since: 0.9.2
**/
@@ -401,28 +407,33 @@ hb_script_from_iso15924_tag (hb_tag_t tag)
/**
* hb_script_from_string:
- * @s: (array length=len) (element-type uint8_t):
- * @len:
- *
+ * @str: (array length=len) (element-type uint8_t): a string representing an
+ * ISOÂ 15924 tag.
+ * @len: length of the @str, or -1 if it is %NULL-terminated.
*
+ * Converts a string @str representing an ISOÂ 15924 script tag to a
+ * corresponding #hb_script_t. Shorthand for hb_tag_from_string() then
+ * hb_script_from_iso15924_tag().
*
* Return value:
+ * An #hb_script_t corresponding to the ISOÂ 15924 tag.
*
* Since: 0.9.2
**/
hb_script_t
-hb_script_from_string (const char *s, int len)
+hb_script_from_string (const char *str, int len)
{
- return hb_script_from_iso15924_tag (hb_tag_from_string (s, len));
+ return hb_script_from_iso15924_tag (hb_tag_from_string (str, len));
}
/**
* hb_script_to_iso15924_tag:
- * @script:
- *
+ * @script: an #hb_script_ to convert.
*
+ * See hb_script_from_iso15924_tag().
*
* Return value:
+ * An #hb_tag_t representing an ISOÂ 15924 script tag.
*
* Since: 0.9.2
**/
@@ -496,6 +507,9 @@ hb_script_get_horizontal_direction (hb_script_t script)
/* Unicode-8.0 additions */
case HB_SCRIPT_OLD_HUNGARIAN:
+ /* Unicode-9.0 additions */
+ case HB_SCRIPT_ADLAM:
+
return HB_DIRECTION_RTL;
}
@@ -521,7 +535,7 @@ hb_user_data_array_t::set (hb_user_data_key_t *key,
}
}
hb_user_data_item_t item = {key, data, destroy};
- bool ret = !!items.replace_or_insert (item, lock, replace);
+ bool ret = !!items.replace_or_insert (item, lock, (bool) replace);
return ret;
}
@@ -529,7 +543,7 @@ hb_user_data_array_t::set (hb_user_data_key_t *key,
void *
hb_user_data_array_t::get (hb_user_data_key_t *key)
{
- hb_user_data_item_t item = {NULL };
+ hb_user_data_item_t item = {NULL, NULL, NULL};
return items.find (key, &item, lock) ? item.data : NULL;
}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h
index 1f742a2ef57..ae57c3bf2b6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h
@@ -98,16 +98,22 @@ typedef uint32_t hb_tag_t;
#define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff)
/* len=-1 means str is NUL-terminated. */
-hb_tag_t
+HB_EXTERN hb_tag_t
hb_tag_from_string (const char *str, int len);
/* buf should have 4 bytes. */
-void
+HB_EXTERN void
hb_tag_to_string (hb_tag_t tag, char *buf);
-/* hb_direction_t */
-
+/**
+ * hb_direction_t:
+ * @HB_DIRECTION_INVALID: Initial, unset direction.
+ * @HB_DIRECTION_LTR: Text is set horizontally from left to right.
+ * @HB_DIRECTION_RTL: Text is set horizontally from right to left.
+ * @HB_DIRECTION_TTB: Text is set vertically from top to bottom.
+ * @HB_DIRECTION_BTT: Text is set vertically from bottom to top.
+ */
typedef enum {
HB_DIRECTION_INVALID = 0,
HB_DIRECTION_LTR = 4,
@@ -117,10 +123,10 @@ typedef enum {
} hb_direction_t;
/* len=-1 means str is NUL-terminated */
-hb_direction_t
+HB_EXTERN hb_direction_t
hb_direction_from_string (const char *str, int len);
-const char *
+HB_EXTERN const char *
hb_direction_to_string (hb_direction_t direction);
#define HB_DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) & ~3U) == 4)
@@ -136,16 +142,15 @@ hb_direction_to_string (hb_direction_t direction);
typedef const struct hb_language_impl_t *hb_language_t;
-/* len=-1 means str is NUL-terminated */
-hb_language_t
+HB_EXTERN hb_language_t
hb_language_from_string (const char *str, int len);
-const char *
+HB_EXTERN const char *
hb_language_to_string (hb_language_t language);
#define HB_LANGUAGE_INVALID ((hb_language_t) NULL)
-hb_language_t
+HB_EXTERN hb_language_t
hb_language_get_default (void);
@@ -306,6 +311,16 @@ typedef enum
/*8.0*/ HB_SCRIPT_OLD_HUNGARIAN = HB_TAG ('H','u','n','g'),
/*8.0*/ HB_SCRIPT_SIGNWRITING = HB_TAG ('S','g','n','w'),
+ /*
+ * Since 1.3.0
+ */
+ /*9.0*/ HB_SCRIPT_ADLAM = HB_TAG ('A','d','l','m'),
+ /*9.0*/ HB_SCRIPT_BHAIKSUKI = HB_TAG ('B','h','k','s'),
+ /*9.0*/ HB_SCRIPT_MARCHEN = HB_TAG ('M','a','r','c'),
+ /*9.0*/ HB_SCRIPT_OSAGE = HB_TAG ('O','s','g','e'),
+ /*9.0*/ HB_SCRIPT_TANGUT = HB_TAG ('T','a','n','g'),
+ /*9.0*/ HB_SCRIPT_NEWA = HB_TAG ('N','e','w','a'),
+
/* No script set. */
HB_SCRIPT_INVALID = HB_TAG_NONE,
@@ -324,18 +339,16 @@ typedef enum
/* Script functions */
-hb_script_t
+HB_EXTERN hb_script_t
hb_script_from_iso15924_tag (hb_tag_t tag);
-/* sugar for tag_from_string() then script_from_iso15924_tag */
-/* len=-1 means s is NUL-terminated */
-hb_script_t
-hb_script_from_string (const char *s, int len);
+HB_EXTERN hb_script_t
+hb_script_from_string (const char *str, int len);
-hb_tag_t
+HB_EXTERN hb_tag_t
hb_script_to_iso15924_tag (hb_script_t script);
-hb_direction_t
+HB_EXTERN hb_direction_t
hb_script_get_horizontal_direction (hb_script_t script);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc
index 369b7365c2b..bd769a04aa8 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc
@@ -27,7 +27,6 @@
*/
#define HB_SHAPER coretext
-#define hb_coretext_shaper_face_data_t CGFont
#include "hb-shaper-impl-private.hh"
#include "hb-coretext.h"
@@ -78,6 +77,29 @@ HB_SHAPER_DATA_ENSURE_DECLARE(coretext, font)
* shaper face data
*/
+static CTFontDescriptorRef
+get_last_resort_font_desc (void)
+{
+ // TODO Handle allocation failures?
+ CTFontDescriptorRef last_resort = CTFontDescriptorCreateWithNameAndSize (CFSTR("LastResort"), 0);
+ CFArrayRef cascade_list = CFArrayCreate (kCFAllocatorDefault,
+ (const void **) &last_resort,
+ 1,
+ &kCFTypeArrayCallBacks);
+ CFRelease (last_resort);
+ CFDictionaryRef attributes = CFDictionaryCreate (kCFAllocatorDefault,
+ (const void **) &kCTFontCascadeListAttribute,
+ (const void **) &cascade_list,
+ 1,
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks);
+ CFRelease (cascade_list);
+
+ CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
+ CFRelease (attributes);
+ return font_desc;
+}
+
static void
release_data (void *info, const void *data, size_t size)
{
@@ -87,14 +109,13 @@ release_data (void *info, const void *data, size_t size)
hb_blob_destroy ((hb_blob_t *) info);
}
-hb_coretext_shaper_face_data_t *
-_hb_coretext_shaper_face_data_create (hb_face_t *face)
+static CGFontRef
+create_cg_font (hb_face_t *face)
{
- hb_coretext_shaper_face_data_t *data = NULL;
-
+ CGFontRef cg_font = NULL;
if (face->destroy == (hb_destroy_func_t) CGFontRelease)
{
- data = CGFontRetain ((CGFontRef) face->user_data);
+ cg_font = CGFontRetain ((CGFontRef) face->user_data);
}
else
{
@@ -107,13 +128,98 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face)
CGDataProviderRef provider = CGDataProviderCreateWithData (blob, blob_data, blob_length, &release_data);
if (likely (provider))
{
- data = CGFontCreateWithDataProvider (provider);
+ cg_font = CGFontCreateWithDataProvider (provider);
+ if (unlikely (!cg_font))
+ DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
CGDataProviderRelease (provider);
}
}
+ return cg_font;
+}
- if (unlikely (!data)) {
- DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed");
+static CTFontRef
+create_ct_font (CGFontRef cg_font, CGFloat font_size)
+{
+ CTFontRef ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, NULL, NULL);
+ if (unlikely (!ct_font)) {
+ DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed");
+ return NULL;
+ }
+ CFURLRef original_url = (CFURLRef)CTFontCopyAttribute(ct_font, kCTFontURLAttribute);
+
+ /* Create font copy with cascade list that has LastResort first; this speeds up CoreText
+ * font fallback which we don't need anyway. */
+ {
+ CTFontDescriptorRef last_resort_font_desc = get_last_resort_font_desc ();
+ CTFontRef new_ct_font = CTFontCreateCopyWithAttributes (ct_font, 0.0, NULL, last_resort_font_desc);
+ CFRelease (last_resort_font_desc);
+ if (new_ct_font)
+ {
+ /* The CTFontCreateCopyWithAttributes call fails to stay on the same font
+ * when reconfiguring the cascade list and may switch to a different font
+ * when there are fonts that go by the same name, since the descriptor is
+ * just name and size.
+ *
+ * Avoid reconfiguring the cascade lists if the new font is outside the
+ * system locations that we cannot access from the sandboxed renderer
+ * process in Blink. This can be detected by the new file URL location
+ * that the newly found font points to. */
+ CFURLRef new_url = (CFURLRef) CTFontCopyAttribute (new_ct_font, kCTFontURLAttribute);
+ // Keep reconfigured font if URL cannot be retrieved (seems to be the case
+ // on Mac OS 10.12 Sierra), speculative fix for crbug.com/625606
+ if (!original_url || !new_url || CFEqual (original_url, new_url)) {
+ CFRelease (ct_font);
+ ct_font = new_ct_font;
+ } else {
+ CFRelease (new_ct_font);
+ DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed.");
+ }
+ if (new_url)
+ CFRelease (new_url);
+ }
+ else
+ DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed");
+ }
+
+ if (original_url)
+ CFRelease (original_url);
+ return ct_font;
+}
+
+struct hb_coretext_shaper_face_data_t {
+ CGFontRef cg_font;
+ CTFontRef ct_font;
+};
+
+hb_coretext_shaper_face_data_t *
+_hb_coretext_shaper_face_data_create (hb_face_t *face)
+{
+ hb_coretext_shaper_face_data_t *data = (hb_coretext_shaper_face_data_t *) calloc (1, sizeof (hb_coretext_shaper_face_data_t));
+ if (unlikely (!data))
+ return NULL;
+
+ data->cg_font = create_cg_font (face);
+ if (unlikely (!data->cg_font))
+ {
+ DEBUG_MSG (CORETEXT, face, "CGFont creation failed..");
+ free (data);
+ return NULL;
+ }
+
+ /* We use 36pt size instead of UPEM, because CoreText implements the 'trak' table,
+ * which can make the font too tight at large sizes. 36pt should be a good semi-neutral
+ * size.
+ *
+ * Since we always create CTFont at a fixed size, our CTFont lives in face_data
+ * instead of font_data. Which is good, because when people change scale on
+ * hb_font_t, we won't need to update our CTFont. */
+ data->ct_font = create_ct_font (data->cg_font, 36.);
+ if (unlikely (!data->ct_font))
+ {
+ DEBUG_MSG (CORETEXT, face, "CTFont creation failed.");
+ CFRelease (data->cg_font);
+ free (data);
+ return NULL;
}
return data;
@@ -122,7 +228,9 @@ _hb_coretext_shaper_face_data_create (hb_face_t *face)
void
_hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data)
{
- CFRelease (data);
+ CFRelease (data->ct_font);
+ CFRelease (data->cg_font);
+ free (data);
}
/*
@@ -133,7 +241,7 @@ hb_coretext_face_get_cg_font (hb_face_t *face)
{
if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
- return face_data;
+ return face_data->cg_font;
}
@@ -141,49 +249,17 @@ hb_coretext_face_get_cg_font (hb_face_t *face)
* shaper font data
*/
-struct hb_coretext_shaper_font_data_t {
- CTFontRef ct_font;
- CGFloat x_mult, y_mult; /* From CT space to HB space. */
-};
+struct hb_coretext_shaper_font_data_t {};
hb_coretext_shaper_font_data_t *
-_hb_coretext_shaper_font_data_create (hb_font_t *font)
+_hb_coretext_shaper_font_data_create (hb_font_t *font HB_UNUSED)
{
- if (unlikely (!hb_coretext_shaper_face_data_ensure (font->face))) return NULL;
-
- hb_coretext_shaper_font_data_t *data = (hb_coretext_shaper_font_data_t *) calloc (1, sizeof (hb_coretext_shaper_font_data_t));
- if (unlikely (!data))
- return NULL;
-
- hb_face_t *face = font->face;
- hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
-
- /* Choose a CoreText font size and calculate multipliers to convert to HarfBuzz space. */
- /* TODO: use upem instead of 36? */
- CGFloat font_size = 36.; /* Default... */
- /* No idea if the following is even a good idea. */
- if (font->y_ppem)
- font_size = font->y_ppem;
-
- if (font_size < 0)
- font_size = -font_size;
- data->x_mult = (CGFloat) font->x_scale / font_size;
- data->y_mult = (CGFloat) font->y_scale / font_size;
- data->ct_font = CTFontCreateWithGraphicsFont (face_data, font_size, NULL, NULL);
- if (unlikely (!data->ct_font)) {
- DEBUG_MSG (CORETEXT, font, "Font CTFontCreateWithGraphicsFont() failed");
- free (data);
- return NULL;
- }
-
- return data;
+ return (hb_coretext_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
void
_hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data)
{
- CFRelease (data->ct_font);
- free (data);
}
@@ -209,9 +285,10 @@ _hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_
CTFontRef
hb_coretext_font_get_ct_font (hb_font_t *font)
{
- if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL;
- hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
- return font_data->ct_font;
+ hb_face_t *face = font->face;
+ if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL;
+ hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
+ return face_data->ct_font;
}
@@ -444,7 +521,10 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
{
hb_face_t *face = font->face;
hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face);
- hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font);
+
+ CGFloat ct_font_size = CTFontGetSize (face_data->ct_font);
+ CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size;
+ CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size;
/* Attach marks to their bases, to match the 'ot' shaper.
* Adapted from hb-ot-shape:hb_form_clusters().
@@ -453,6 +533,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
* B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will
* continue pointing to B2 even though B2 was merged into B1's
* cluster... */
+ if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
{
hb_unicode_funcs_t *unicode = buffer->unicode;
unsigned int count = buffer->len;
@@ -575,7 +656,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan,
CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes);
CFRelease (attributes);
- range->font = CTFontCreateCopyWithAttributes (font_data->ct_font, 0.0, NULL, font_desc);
+ range->font = CTFontCreateCopyWithAttributes (face_data->ct_font, 0.0, NULL, font_desc);
CFRelease (font_desc);
}
else
@@ -693,7 +774,6 @@ resize_and_retry:
scratch += old_scratch_used;
scratch_size -= old_scratch_used;
}
-retry:
{
string_ref = CFStringCreateWithCharactersNoCopy (NULL,
pchars, chars_len,
@@ -733,7 +813,7 @@ retry:
CFRelease (lang);
}
CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
- kCTFontAttributeName, font_data->ct_font);
+ kCTFontAttributeName, face_data->ct_font);
if (num_features)
{
@@ -826,7 +906,7 @@ retry:
*/
CFDictionaryRef attributes = CTRunGetAttributes (run);
CTFontRef run_ct_font = static_cast(CFDictionaryGetValue (attributes, kCTFontAttributeName));
- if (!CFEqual (run_ct_font, font_data->ct_font))
+ if (!CFEqual (run_ct_font, face_data->ct_font))
{
/* The run doesn't use our main font instance. We have to figure out
* whether font fallback happened, or this is just CoreText giving us
@@ -846,15 +926,11 @@ retry:
* backend.
*
* However, even that wouldn't work if we were passed in the CGFont to
- * begin with.
- *
- * Webkit uses a slightly different approach: it installs LastResort
- * as fallback chain, and then checks PS name of used font against
- * LastResort. That one is safe for any font except for LastResort,
- * as opposed to ours, which can fail if we are using any uninstalled
- * font that has the same name as an installed font.
+ * construct a hb_face to begin with.
*
* See: http://github.com/behdad/harfbuzz/pull/36
+ *
+ * Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098
*/
bool matched = false;
for (unsigned int i = 0; i < range_records.len; i++)
@@ -868,13 +944,13 @@ retry:
CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0);
if (run_cg_font)
{
- matched = CFEqual (run_cg_font, face_data);
+ matched = CFEqual (run_cg_font, face_data->cg_font);
CFRelease (run_cg_font);
}
}
if (!matched)
{
- CFStringRef font_ps_name = CTFontCopyName (font_data->ct_font, kCTFontPostScriptNameKey);
+ CFStringRef font_ps_name = CTFontCopyName (face_data->ct_font, kCTFontPostScriptNameKey);
CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey);
CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0);
CFRelease (run_ps_name);
@@ -994,7 +1070,6 @@ retry:
positions = position_buf;
}
hb_glyph_info_t *info = run_info;
- CGFloat x_mult = font_data->x_mult, y_mult = font_data->y_mult;
if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
{
hb_position_t x_offset = (positions[0].x - advances_so_far) * x_mult;
@@ -1129,10 +1204,6 @@ fail:
* AAT shaper
*/
-HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, face)
-HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, font)
-
-
/*
* shaper face data
*/
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h
index 25267bc9784..82066e4e0dc 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h
@@ -44,14 +44,14 @@ HB_BEGIN_DECLS
#define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x')
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_coretext_face_create (CGFontRef cg_font);
-CGFontRef
+HB_EXTERN CGFontRef
hb_coretext_face_get_cg_font (hb_face_t *face);
-CTFontRef
+HB_EXTERN CTFontRef
hb_coretext_font_get_ct_font (hb_font_t *font);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h
index 14d435f0068..3943a00a7f3 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h
@@ -44,6 +44,16 @@ HB_BEGIN_DECLS
#define HB_BUFFER_FLAGS_DEFAULT HB_BUFFER_FLAG_DEFAULT
#define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT HB_BUFFER_SERIALIZE_FLAG_DEFAULT
+typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data);
+
+HB_EXTERN void
+hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
#endif
HB_END_DECLS
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h
index 85807dda302..08ffca30d52 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h
@@ -43,28 +43,28 @@ HB_BEGIN_DECLS
typedef struct hb_face_t hb_face_t;
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_face_create (hb_blob_t *blob,
unsigned int index);
typedef hb_blob_t * (*hb_reference_table_func_t) (hb_face_t *face, hb_tag_t tag, void *user_data);
/* calls destroy() when not needing user_data anymore */
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_face_create_for_tables (hb_reference_table_func_t reference_table_func,
void *user_data,
hb_destroy_func_t destroy);
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_face_get_empty (void);
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_face_reference (hb_face_t *face);
-void
+HB_EXTERN void
hb_face_destroy (hb_face_t *face);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_face_set_user_data (hb_face_t *face,
hb_user_data_key_t *key,
void * data,
@@ -72,43 +72,43 @@ hb_face_set_user_data (hb_face_t *face,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_face_get_user_data (hb_face_t *face,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_face_make_immutable (hb_face_t *face);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_face_is_immutable (hb_face_t *face);
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_face_reference_table (hb_face_t *face,
hb_tag_t tag);
-hb_blob_t *
+HB_EXTERN hb_blob_t *
hb_face_reference_blob (hb_face_t *face);
-void
+HB_EXTERN void
hb_face_set_index (hb_face_t *face,
unsigned int index);
-unsigned int
+HB_EXTERN unsigned int
hb_face_get_index (hb_face_t *face);
-void
+HB_EXTERN void
hb_face_set_upem (hb_face_t *face,
unsigned int upem);
-unsigned int
+HB_EXTERN unsigned int
hb_face_get_upem (hb_face_t *face);
-void
+HB_EXTERN void
hb_face_set_glyph_count (hb_face_t *face,
unsigned int glyph_count);
-unsigned int
+HB_EXTERN unsigned int
hb_face_get_glyph_count (hb_face_t *face);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc
index 8e1628be033..dee7d7d12eb 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc
@@ -106,7 +106,7 @@ _hb_fallback_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
*/
hb_codepoint_t space;
- bool has_space = font->get_glyph (' ', 0, &space);
+ bool has_space = (bool) font->get_nominal_glyph (' ', &space);
buffer->clear_positions ();
@@ -123,7 +123,7 @@ _hb_fallback_shape (hb_shape_plan_t *shape_plan HB_UNUSED,
pos[i].y_advance = 0;
continue;
}
- font->get_glyph (info[i].codepoint, 0, &info[i].codepoint);
+ font->get_nominal_glyph (info[i].codepoint, &info[i].codepoint);
font->get_glyph_advance_for_direction (info[i].codepoint,
direction,
&pos[i].x_advance,
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh
index 253e71786f6..d7b48776e1e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh
@@ -42,7 +42,10 @@
*/
#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \
- HB_FONT_FUNC_IMPLEMENT (glyph) \
+ HB_FONT_FUNC_IMPLEMENT (font_h_extents) \
+ HB_FONT_FUNC_IMPLEMENT (font_v_extents) \
+ HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \
+ HB_FONT_FUNC_IMPLEMENT (variation_glyph) \
HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \
HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \
HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \
@@ -61,14 +64,6 @@ struct hb_font_funcs_t {
hb_bool_t immutable;
- /* Don't access these directly. Call hb_font_get_*() instead. */
-
- struct {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
- } get;
-
struct {
#define HB_FONT_FUNC_IMPLEMENT(name) void *name;
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
@@ -80,6 +75,16 @@ struct hb_font_funcs_t {
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT
} destroy;
+
+ /* Don't access these directly. Call font->get_*() instead. */
+ union get_t {
+ struct get_funcs_t {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ } f;
+ void (*array[VAR]) (void);
+ } get;
};
@@ -144,95 +149,133 @@ struct hb_font_t {
/* Public getters */
- inline hb_bool_t has_glyph (hb_codepoint_t unicode)
+ HB_INTERNAL bool has_func (unsigned int i);
+
+ /* has_* ... */
+#define HB_FONT_FUNC_IMPLEMENT(name) \
+ bool \
+ has_##name##_func (void) \
+ { \
+ hb_font_funcs_t *funcs = this->klass; \
+ unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
+ return has_func (i); \
+ }
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+
+ inline hb_bool_t get_font_h_extents (hb_font_extents_t *extents)
{
- hb_codepoint_t glyph;
- return get_glyph (unicode, 0, &glyph);
+ memset (extents, 0, sizeof (*extents));
+ return klass->get.f.font_h_extents (this, user_data,
+ extents,
+ klass->user_data.font_h_extents);
+ }
+ inline hb_bool_t get_font_v_extents (hb_font_extents_t *extents)
+ {
+ memset (extents, 0, sizeof (*extents));
+ return klass->get.f.font_v_extents (this, user_data,
+ extents,
+ klass->user_data.font_v_extents);
}
- inline hb_bool_t get_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph)
+ inline bool has_glyph (hb_codepoint_t unicode)
+ {
+ hb_codepoint_t glyph;
+ return get_nominal_glyph (unicode, &glyph);
+ }
+
+ inline hb_bool_t get_nominal_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t *glyph)
{
*glyph = 0;
- return klass->get.glyph (this, user_data,
- unicode, variation_selector, glyph,
- klass->user_data.glyph);
+ return klass->get.f.nominal_glyph (this, user_data,
+ unicode, glyph,
+ klass->user_data.nominal_glyph);
+ }
+
+ inline hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph)
+ {
+ *glyph = 0;
+ return klass->get.f.variation_glyph (this, user_data,
+ unicode, variation_selector, glyph,
+ klass->user_data.variation_glyph);
}
inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph)
{
- return klass->get.glyph_h_advance (this, user_data,
- glyph,
- klass->user_data.glyph_h_advance);
+ return klass->get.f.glyph_h_advance (this, user_data,
+ glyph,
+ klass->user_data.glyph_h_advance);
}
inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph)
{
- return klass->get.glyph_v_advance (this, user_data,
- glyph,
- klass->user_data.glyph_v_advance);
+ return klass->get.f.glyph_v_advance (this, user_data,
+ glyph,
+ klass->user_data.glyph_v_advance);
}
inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y)
{
*x = *y = 0;
- return klass->get.glyph_h_origin (this, user_data,
- glyph, x, y,
- klass->user_data.glyph_h_origin);
+ return klass->get.f.glyph_h_origin (this, user_data,
+ glyph, x, y,
+ klass->user_data.glyph_h_origin);
}
inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y)
{
*x = *y = 0;
- return klass->get.glyph_v_origin (this, user_data,
- glyph, x, y,
- klass->user_data.glyph_v_origin);
+ return klass->get.f.glyph_v_origin (this, user_data,
+ glyph, x, y,
+ klass->user_data.glyph_v_origin);
}
inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
{
- return klass->get.glyph_h_kerning (this, user_data,
- left_glyph, right_glyph,
- klass->user_data.glyph_h_kerning);
+ return klass->get.f.glyph_h_kerning (this, user_data,
+ left_glyph, right_glyph,
+ klass->user_data.glyph_h_kerning);
}
inline hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph)
{
- return klass->get.glyph_v_kerning (this, user_data,
- top_glyph, bottom_glyph,
- klass->user_data.glyph_v_kerning);
+ return klass->get.f.glyph_v_kerning (this, user_data,
+ top_glyph, bottom_glyph,
+ klass->user_data.glyph_v_kerning);
}
inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
hb_glyph_extents_t *extents)
{
memset (extents, 0, sizeof (*extents));
- return klass->get.glyph_extents (this, user_data,
- glyph,
- extents,
- klass->user_data.glyph_extents);
+ return klass->get.f.glyph_extents (this, user_data,
+ glyph,
+ extents,
+ klass->user_data.glyph_extents);
}
inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
hb_position_t *x, hb_position_t *y)
{
*x = *y = 0;
- return klass->get.glyph_contour_point (this, user_data,
- glyph, point_index,
- x, y,
- klass->user_data.glyph_contour_point);
+ return klass->get.f.glyph_contour_point (this, user_data,
+ glyph, point_index,
+ x, y,
+ klass->user_data.glyph_contour_point);
}
inline hb_bool_t get_glyph_name (hb_codepoint_t glyph,
char *name, unsigned int size)
{
if (size) *name = '\0';
- return klass->get.glyph_name (this, user_data,
- glyph,
- name, size,
- klass->user_data.glyph_name);
+ return klass->get.f.glyph_name (this, user_data,
+ glyph,
+ name, size,
+ klass->user_data.glyph_name);
}
inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */
@@ -240,15 +283,35 @@ struct hb_font_t {
{
*glyph = 0;
if (len == -1) len = strlen (name);
- return klass->get.glyph_from_name (this, user_data,
- name, len,
- glyph,
- klass->user_data.glyph_from_name);
+ return klass->get.f.glyph_from_name (this, user_data,
+ name, len,
+ glyph,
+ klass->user_data.glyph_from_name);
}
/* A bit higher-level, and with fallback */
+ inline void get_extents_for_direction (hb_direction_t direction,
+ hb_font_extents_t *extents)
+ {
+ if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
+ if (!get_font_h_extents (extents))
+ {
+ extents->ascender = y_scale * .8;
+ extents->descender = y_scale - extents->ascender;
+ extents->line_gap = 0;
+ }
+ } else {
+ if (!get_font_v_extents (extents))
+ {
+ extents->ascender = x_scale / 2;
+ extents->descender = x_scale - extents->ascender;
+ extents->line_gap = 0;
+ }
+ }
+ }
+
inline void get_glyph_advance_for_direction (hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y)
@@ -268,7 +331,7 @@ struct hb_font_t {
{
*x = get_glyph_h_advance (glyph) / 2;
- /* TODO use font_metrics.ascent */
+ /* TODO use font_extents.ascender */
*y = y_scale;
}
@@ -298,6 +361,26 @@ struct hb_font_t {
}
}
+ inline void add_glyph_h_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_h_origin (glyph, &origin_x, &origin_y);
+
+ *x += origin_x;
+ *y += origin_y;
+ }
+ inline void add_glyph_v_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_v_origin (glyph, &origin_x, &origin_y);
+
+ *x += origin_x;
+ *y += origin_y;
+ }
inline void add_glyph_origin_for_direction (hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y)
@@ -310,6 +393,26 @@ struct hb_font_t {
*y += origin_y;
}
+ inline void subtract_glyph_h_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_h_origin (glyph, &origin_x, &origin_y);
+
+ *x -= origin_x;
+ *y -= origin_y;
+ }
+ inline void subtract_glyph_v_origin (hb_codepoint_t glyph,
+ hb_position_t *x, hb_position_t *y)
+ {
+ hb_position_t origin_x, origin_y;
+
+ get_glyph_v_origin (glyph, &origin_x, &origin_y);
+
+ *x -= origin_x;
+ *y -= origin_y;
+ }
inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y)
@@ -394,7 +497,7 @@ struct hb_font_t {
hb_codepoint_t unichar;
if (0 == strncmp (s, "uni", 3) &&
hb_codepoint_parse (s + 3, len - 3, 16, &unichar) &&
- get_glyph (unichar, 0, glyph))
+ get_nominal_glyph (unichar, glyph))
return true;
}
@@ -402,7 +505,13 @@ struct hb_font_t {
}
private:
- inline hb_position_t em_scale (int16_t v, int scale) { return (hb_position_t) (v * (int64_t) scale / face->get_upem ()); }
+ inline hb_position_t em_scale (int16_t v, int scale)
+ {
+ int upem = face->get_upem ();
+ int64_t scaled = v * (int64_t) scale;
+ scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */
+ return (hb_position_t) (scaled / upem);
+ }
};
#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc
index fdf871f15ff..eb0f9fcfd09 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc
@@ -45,130 +45,246 @@
*/
static hb_bool_t
-hb_font_get_glyph_nil (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+hb_font_get_font_h_extents_nil (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent->get_glyph (unicode, variation_selector, glyph);
+ memset (metrics, 0, sizeof (*metrics));
+ return false;
+}
+static hb_bool_t
+hb_font_get_font_h_extents_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_font_h_extents (metrics);
+ if (ret) {
+ metrics->ascender = font->parent_scale_y_distance (metrics->ascender);
+ metrics->descender = font->parent_scale_y_distance (metrics->descender);
+ metrics->line_gap = font->parent_scale_y_distance (metrics->line_gap);
+ }
+ return ret;
+}
+static hb_bool_t
+hb_font_get_font_v_extents_nil (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ memset (metrics, 0, sizeof (*metrics));
+ return false;
+}
+static hb_bool_t
+hb_font_get_font_v_extents_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_font_v_extents (metrics);
+ if (ret) {
+ metrics->ascender = font->parent_scale_x_distance (metrics->ascender);
+ metrics->descender = font->parent_scale_x_distance (metrics->descender);
+ metrics->line_gap = font->parent_scale_x_distance (metrics->line_gap);
+ }
+ return ret;
+}
+
+static hb_bool_t
+hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
*glyph = 0;
return false;
}
+static hb_bool_t
+hb_font_get_nominal_glyph_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent->get_nominal_glyph (unicode, glyph);
+}
+
+static hb_bool_t
+hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ *glyph = 0;
+ return false;
+}
+static hb_bool_t
+hb_font_get_variation_glyph_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent->get_variation_glyph (unicode, variation_selector, glyph);
+}
+
static hb_position_t
-hb_font_get_glyph_h_advance_nil (hb_font_t *font,
+hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
-
return font->x_scale;
}
+static hb_position_t
+hb_font_get_glyph_h_advance_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
+}
static hb_position_t
-hb_font_get_glyph_v_advance_nil (hb_font_t *font,
+hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
-
+ /* TODO use font_extents.ascender+descender */
return font->y_scale;
}
-
-static hb_bool_t
-hb_font_get_glyph_h_origin_nil (hb_font_t *font,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph,
- hb_position_t *x,
- hb_position_t *y,
- void *user_data HB_UNUSED)
+static hb_position_t
+hb_font_get_glyph_v_advance_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ void *user_data HB_UNUSED)
{
- if (font->parent) {
- hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
- if (ret)
- font->parent_scale_position (x, y);
- return ret;
- }
-
- *x = *y = 0;
- return false;
+ return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
}
static hb_bool_t
-hb_font_get_glyph_v_origin_nil (hb_font_t *font,
+hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
hb_position_t *x,
hb_position_t *y,
void *user_data HB_UNUSED)
{
- if (font->parent) {
- hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
- if (ret)
- font->parent_scale_position (x, y);
- return ret;
- }
+ *x = *y = 0;
+ return true;
+}
+static hb_bool_t
+hb_font_get_glyph_h_origin_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
+ if (ret)
+ font->parent_scale_position (x, y);
+ return ret;
+}
+static hb_bool_t
+hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
*x = *y = 0;
return false;
}
+static hb_bool_t
+hb_font_get_glyph_v_origin_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
+ if (ret)
+ font->parent_scale_position (x, y);
+ return ret;
+}
static hb_position_t
-hb_font_get_glyph_h_kerning_nil (hb_font_t *font,
+hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t left_glyph,
hb_codepoint_t right_glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
-
return 0;
}
+static hb_position_t
+hb_font_get_glyph_h_kerning_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t left_glyph,
+ hb_codepoint_t right_glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
+}
static hb_position_t
-hb_font_get_glyph_v_kerning_nil (hb_font_t *font,
+hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t top_glyph,
hb_codepoint_t bottom_glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
-
return 0;
}
+static hb_position_t
+hb_font_get_glyph_v_kerning_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t top_glyph,
+ hb_codepoint_t bottom_glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
+}
static hb_bool_t
-hb_font_get_glyph_extents_nil (hb_font_t *font,
+hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
hb_glyph_extents_t *extents,
void *user_data HB_UNUSED)
{
- if (font->parent) {
- hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
- if (ret) {
- font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
- font->parent_scale_distance (&extents->width, &extents->height);
- }
- return ret;
- }
-
memset (extents, 0, sizeof (*extents));
return false;
}
+static hb_bool_t
+hb_font_get_glyph_extents_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
+ if (ret) {
+ font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
+ font->parent_scale_distance (&extents->width, &extents->height);
+ }
+ return ret;
+}
static hb_bool_t
-hb_font_get_glyph_contour_point_nil (hb_font_t *font,
+hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
unsigned int point_index,
@@ -176,45 +292,63 @@ hb_font_get_glyph_contour_point_nil (hb_font_t *font,
hb_position_t *y,
void *user_data HB_UNUSED)
{
- if (font->parent) {
- hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
- if (ret)
- font->parent_scale_position (x, y);
- return ret;
- }
-
*x = *y = 0;
return false;
}
+static hb_bool_t
+hb_font_get_glyph_contour_point_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ unsigned int point_index,
+ hb_position_t *x,
+ hb_position_t *y,
+ void *user_data HB_UNUSED)
+{
+ hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
+ if (ret)
+ font->parent_scale_position (x, y);
+ return ret;
+}
static hb_bool_t
-hb_font_get_glyph_name_nil (hb_font_t *font,
+hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
hb_codepoint_t glyph,
char *name, unsigned int size,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent->get_glyph_name (glyph, name, size);
-
if (size) *name = '\0';
return false;
}
+static hb_bool_t
+hb_font_get_glyph_name_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ hb_codepoint_t glyph,
+ char *name, unsigned int size,
+ void *user_data HB_UNUSED)
+{
+ return font->parent->get_glyph_name (glyph, name, size);
+}
static hb_bool_t
-hb_font_get_glyph_from_name_nil (hb_font_t *font,
+hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
void *font_data HB_UNUSED,
const char *name, int len, /* -1 means nul-terminated */
hb_codepoint_t *glyph,
void *user_data HB_UNUSED)
{
- if (font->parent)
- return font->parent->get_glyph_from_name (name, len, glyph);
-
*glyph = 0;
return false;
}
-
+static hb_bool_t
+hb_font_get_glyph_from_name_parent (hb_font_t *font,
+ void *font_data HB_UNUSED,
+ const char *name, int len, /* -1 means nul-terminated */
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ return font->parent->get_glyph_from_name (name, len, glyph);
+}
static const hb_font_funcs_t _hb_font_funcs_nil = {
HB_OBJECT_HEADER_STATIC,
@@ -222,9 +356,44 @@ static const hb_font_funcs_t _hb_font_funcs_nil = {
true, /* immutable */
{
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT
+ },
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ },
+ {
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ }
+ }
+};
+static const hb_font_funcs_t _hb_font_funcs_parent = {
+ HB_OBJECT_HEADER_STATIC,
+
+ true, /* immutable */
+
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ },
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) NULL,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ },
+ {
+ {
+#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent,
+ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
+#undef HB_FONT_FUNC_IMPLEMENT
+ }
}
};
@@ -246,7 +415,7 @@ hb_font_funcs_create (void)
if (!(ffuncs = hb_object_create ()))
return hb_font_funcs_get_empty ();
- ffuncs->get = _hb_font_funcs_nil.get;
+ ffuncs->get = _hb_font_funcs_parent.get;
return ffuncs;
}
@@ -263,7 +432,7 @@ hb_font_funcs_create (void)
hb_font_funcs_t *
hb_font_funcs_get_empty (void)
{
- return const_cast (&_hb_font_funcs_nil);
+ return const_cast (&_hb_font_funcs_parent);
}
/**
@@ -398,11 +567,11 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \
ffuncs->destroy.name (ffuncs->user_data.name); \
\
if (func) { \
- ffuncs->get.name = func; \
+ ffuncs->get.f.name = func; \
ffuncs->user_data.name = user_data; \
ffuncs->destroy.name = destroy; \
} else { \
- ffuncs->get.name = hb_font_get_##name##_nil; \
+ ffuncs->get.f.name = hb_font_get_##name##_parent; \
ffuncs->user_data.name = NULL; \
ffuncs->destroy.name = NULL; \
} \
@@ -411,9 +580,52 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \
HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
#undef HB_FONT_FUNC_IMPLEMENT
+bool
+hb_font_t::has_func (unsigned int i)
+{
+ if (parent && parent != hb_font_get_empty () && parent->has_func (i))
+ return true;
+ return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i];
+}
/* Public getters */
+/**
+ * hb_font_get_h_extents:
+ * @font: a font.
+ * @extents: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.1.3
+ **/
+hb_bool_t
+hb_font_get_h_extents (hb_font_t *font,
+ hb_font_extents_t *extents)
+{
+ return font->get_font_h_extents (extents);
+}
+
+/**
+ * hb_font_get_v_extents:
+ * @font: a font.
+ * @extents: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.1.3
+ **/
+hb_bool_t
+hb_font_get_v_extents (hb_font_t *font,
+ hb_font_extents_t *extents)
+{
+ return font->get_font_v_extents (extents);
+}
+
/**
* hb_font_get_glyph:
* @font: a font.
@@ -432,7 +644,50 @@ hb_font_get_glyph (hb_font_t *font,
hb_codepoint_t unicode, hb_codepoint_t variation_selector,
hb_codepoint_t *glyph)
{
- return font->get_glyph (unicode, variation_selector, glyph);
+ if (unlikely (variation_selector))
+ return font->get_variation_glyph (unicode, variation_selector, glyph);
+ return font->get_nominal_glyph (unicode, glyph);
+}
+
+/**
+ * hb_font_get_nominal_glyph:
+ * @font: a font.
+ * @unicode:
+ * @glyph: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.2.3
+ **/
+hb_bool_t
+hb_font_get_nominal_glyph (hb_font_t *font,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph)
+{
+ return font->get_nominal_glyph (unicode, glyph);
+}
+
+/**
+ * hb_font_get_variation_glyph:
+ * @font: a font.
+ * @unicode:
+ * @variation_selector:
+ * @glyph: (out):
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.2.3
+ **/
+hb_bool_t
+hb_font_get_variation_glyph (hb_font_t *font,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph)
+{
+ return font->get_variation_glyph (unicode, variation_selector, glyph);
}
/**
@@ -638,6 +893,23 @@ hb_font_get_glyph_from_name (hb_font_t *font,
/* A bit higher-level, and with fallback */
+/**
+ * hb_font_get_extents_for_direction:
+ * @font: a font.
+ * @direction:
+ * @extents:
+ *
+ *
+ *
+ * Since: 1.1.3
+ **/
+void
+hb_font_get_extents_for_direction (hb_font_t *font,
+ hb_direction_t direction,
+ hb_font_extents_t *extents)
+{
+ return font->get_extents_for_direction (direction, extents);
+}
/**
* hb_font_get_glyph_advance_for_direction:
* @font: a font.
@@ -858,6 +1130,7 @@ hb_font_create (hb_face_t *face)
return hb_font_get_empty ();
hb_face_make_immutable (face);
+ font->parent = hb_font_get_empty ();
font->face = hb_face_reference (face);
font->klass = hb_font_funcs_get_empty ();
@@ -917,8 +1190,8 @@ hb_font_get_empty (void)
NULL, /* parent */
const_cast (&_hb_face_nil),
- 0, /* x_scale */
- 0, /* y_scale */
+ 1000, /* x_scale */
+ 1000, /* y_scale */
0, /* x_ppem */
0, /* y_ppem */
@@ -1264,3 +1537,131 @@ hb_font_get_ppem (hb_font_t *font,
if (x_ppem) *x_ppem = font->x_ppem;
if (y_ppem) *y_ppem = font->y_ppem;
}
+
+
+#ifndef HB_DISABLE_DEPRECATED
+
+/*
+ * Deprecated get_glyph_func():
+ */
+
+struct hb_trampoline_closure_t
+{
+ void *user_data;
+ hb_destroy_func_t destroy;
+ unsigned int ref_count;
+};
+
+template
+struct hb_trampoline_t
+{
+ hb_trampoline_closure_t closure; /* Must be first. */
+ FuncType func;
+};
+
+template
+static hb_trampoline_t *
+trampoline_create (FuncType func,
+ void *user_data,
+ hb_destroy_func_t destroy)
+{
+ typedef hb_trampoline_t trampoline_t;
+
+ trampoline_t *trampoline = (trampoline_t *) calloc (1, sizeof (trampoline_t));
+
+ if (unlikely (!trampoline))
+ return NULL;
+
+ trampoline->closure.user_data = user_data;
+ trampoline->closure.destroy = destroy;
+ trampoline->closure.ref_count = 1;
+ trampoline->func = func;
+
+ return trampoline;
+}
+
+static void
+trampoline_reference (hb_trampoline_closure_t *closure)
+{
+ closure->ref_count++;
+}
+
+static void
+trampoline_destroy (void *user_data)
+{
+ hb_trampoline_closure_t *closure = (hb_trampoline_closure_t *) user_data;
+
+ if (--closure->ref_count)
+ return;
+
+ if (closure->destroy)
+ closure->destroy (closure->user_data);
+ free (closure);
+}
+
+typedef hb_trampoline_t hb_font_get_glyph_trampoline_t;
+
+static hb_bool_t
+hb_font_get_nominal_glyph_trampoline (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data)
+{
+ hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
+ return trampoline->func (font, font_data, unicode, 0, glyph, trampoline->closure.user_data);
+}
+
+static hb_bool_t
+hb_font_get_variation_glyph_trampoline (hb_font_t *font,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data)
+{
+ hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
+ return trampoline->func (font, font_data, unicode, variation_selector, glyph, trampoline->closure.user_data);
+}
+
+/**
+ * hb_font_funcs_set_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ * Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and
+ * hb_font_funcs_set_variation_glyph_func() instead.
+ *
+ * Since: 0.9.2
+ * Deprecated: 1.2.3
+ **/
+void
+hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_glyph_func_t func,
+ void *user_data, hb_destroy_func_t destroy)
+{
+ hb_font_get_glyph_trampoline_t *trampoline;
+
+ trampoline = trampoline_create (func, user_data, destroy);
+ if (unlikely (!trampoline))
+ {
+ if (destroy)
+ destroy (user_data);
+ return;
+ }
+
+ hb_font_funcs_set_nominal_glyph_func (ffuncs,
+ hb_font_get_nominal_glyph_trampoline,
+ trampoline,
+ trampoline_destroy);
+
+ trampoline_reference (&trampoline->closure);
+ hb_font_funcs_set_variation_glyph_func (ffuncs,
+ hb_font_get_variation_glyph_trampoline,
+ trampoline,
+ trampoline_destroy);
+}
+
+#endif /* HB_DISABLE_DEPRECATED */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h
index 21049ca4a29..da9a3a7543c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h
@@ -46,19 +46,19 @@ typedef struct hb_font_t hb_font_t;
typedef struct hb_font_funcs_t hb_font_funcs_t;
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
hb_font_funcs_create (void);
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
hb_font_funcs_get_empty (void);
-hb_font_funcs_t *
+HB_EXTERN hb_font_funcs_t *
hb_font_funcs_reference (hb_font_funcs_t *ffuncs);
-void
+HB_EXTERN void
hb_font_funcs_destroy (hb_font_funcs_t *ffuncs);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs,
hb_user_data_key_t *key,
void * data,
@@ -66,19 +66,37 @@ hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs);
-/* glyph extents */
+/* font and glyph extents */
+
+/* Note that typically ascender is positive and descender negative in coordinate systems that grow up. */
+typedef struct hb_font_extents_t
+{
+ hb_position_t ascender; /* typographic ascender. */
+ hb_position_t descender; /* typographic descender. */
+ hb_position_t line_gap; /* suggested line spacing gap. */
+ /*< private >*/
+ hb_position_t reserved9;
+ hb_position_t reserved8;
+ hb_position_t reserved7;
+ hb_position_t reserved6;
+ hb_position_t reserved5;
+ hb_position_t reserved4;
+ hb_position_t reserved3;
+ hb_position_t reserved2;
+ hb_position_t reserved1;
+} hb_font_extents_t;
/* Note that height is negative in coordinate systems that grow up. */
typedef struct hb_glyph_extents_t
@@ -89,13 +107,23 @@ typedef struct hb_glyph_extents_t
hb_position_t height; /* distance from top to bottom side. */
} hb_glyph_extents_t;
-
/* func types */
-typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
- hb_codepoint_t unicode, hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data);
+typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data);
+typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
+typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
+
+
+typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data);
+typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data);
typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
@@ -141,7 +169,7 @@ typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *
/* func setters */
/**
- * hb_font_funcs_set_glyph_func:
+ * hb_font_funcs_set_font_h_extents_func:
* @ffuncs: font functions.
* @func: (closure user_data) (destroy destroy) (scope notified):
* @user_data:
@@ -149,12 +177,60 @@ typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *
*
*
*
- * Since: 0.9.2
+ * Since: 1.1.2
**/
-void
-hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
- hb_font_get_glyph_func_t func,
- void *user_data, hb_destroy_func_t destroy);
+HB_EXTERN void
+hb_font_funcs_set_font_h_extents_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_font_h_extents_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_font_v_extents_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.1.2
+ **/
+HB_EXTERN void
+hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_font_v_extents_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_nominal_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.2.3
+ **/
+HB_EXTERN void
+hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_nominal_glyph_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
+
+/**
+ * hb_font_funcs_set_variation_glyph_func:
+ * @ffuncs: font functions.
+ * @func: (closure user_data) (destroy destroy) (scope notified):
+ * @user_data:
+ * @destroy:
+ *
+ *
+ *
+ * Since: 1.2.3
+ **/
+HB_EXTERN void
+hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs,
+ hb_font_get_variation_glyph_func_t func,
+ void *user_data, hb_destroy_func_t destroy);
/**
* hb_font_funcs_set_glyph_h_advance_func:
@@ -167,7 +243,7 @@ hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_h_advance_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -183,7 +259,7 @@ hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_v_advance_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -199,7 +275,7 @@ hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_h_origin_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -215,7 +291,7 @@ hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_v_origin_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -231,7 +307,7 @@ hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_h_kerning_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -247,7 +323,7 @@ hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_v_kerning_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -263,7 +339,7 @@ hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_extents_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -279,7 +355,7 @@ hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_contour_point_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -295,7 +371,7 @@ hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_name_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -311,57 +387,67 @@ hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_font_funcs_set_glyph_from_name_func (hb_font_funcs_t *ffuncs,
hb_font_get_glyph_from_name_func_t func,
void *user_data, hb_destroy_func_t destroy);
-
/* func dispatch */
-hb_bool_t
-hb_font_get_glyph (hb_font_t *font,
- hb_codepoint_t unicode, hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph);
+HB_EXTERN hb_bool_t
+hb_font_get_h_extents (hb_font_t *font,
+ hb_font_extents_t *extents);
+HB_EXTERN hb_bool_t
+hb_font_get_v_extents (hb_font_t *font,
+ hb_font_extents_t *extents);
-hb_position_t
+HB_EXTERN hb_bool_t
+hb_font_get_nominal_glyph (hb_font_t *font,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph);
+HB_EXTERN hb_bool_t
+hb_font_get_variation_glyph (hb_font_t *font,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph);
+
+HB_EXTERN hb_position_t
hb_font_get_glyph_h_advance (hb_font_t *font,
hb_codepoint_t glyph);
-hb_position_t
+HB_EXTERN hb_position_t
hb_font_get_glyph_v_advance (hb_font_t *font,
hb_codepoint_t glyph);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_h_origin (hb_font_t *font,
hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_v_origin (hb_font_t *font,
hb_codepoint_t glyph,
hb_position_t *x, hb_position_t *y);
-hb_position_t
+HB_EXTERN hb_position_t
hb_font_get_glyph_h_kerning (hb_font_t *font,
hb_codepoint_t left_glyph, hb_codepoint_t right_glyph);
-hb_position_t
+HB_EXTERN hb_position_t
hb_font_get_glyph_v_kerning (hb_font_t *font,
hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_extents (hb_font_t *font,
hb_codepoint_t glyph,
hb_glyph_extents_t *extents);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_contour_point (hb_font_t *font,
hb_codepoint_t glyph, unsigned int point_index,
hb_position_t *x, hb_position_t *y);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_name (hb_font_t *font,
hb_codepoint_t glyph,
char *name, unsigned int size);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_from_name (hb_font_t *font,
const char *name, int len, /* -1 means nul-terminated */
hb_codepoint_t *glyph);
@@ -369,52 +455,63 @@ hb_font_get_glyph_from_name (hb_font_t *font,
/* high-level funcs, with fallback */
-void
+/* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
+ * otherwise callse hb_font_get_variation_glyph(). */
+HB_EXTERN hb_bool_t
+hb_font_get_glyph (hb_font_t *font,
+ hb_codepoint_t unicode, hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph);
+
+HB_EXTERN void
+hb_font_get_extents_for_direction (hb_font_t *font,
+ hb_direction_t direction,
+ hb_font_extents_t *extents);
+HB_EXTERN void
hb_font_get_glyph_advance_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
hb_font_get_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
hb_font_add_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-void
+HB_EXTERN void
hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_extents_for_origin (hb_font_t *font,
hb_codepoint_t glyph,
hb_direction_t direction,
hb_glyph_extents_t *extents);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
hb_codepoint_t glyph, unsigned int point_index,
hb_direction_t direction,
hb_position_t *x, hb_position_t *y);
/* Generates gidDDD if glyph has no name. */
-void
+HB_EXTERN void
hb_font_glyph_to_string (hb_font_t *font,
hb_codepoint_t glyph,
char *s, unsigned int size);
/* Parses gidDDD and uniUUUU strings automatically. */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_glyph_from_string (hb_font_t *font,
const char *s, int len, /* -1 means nul-terminated */
hb_codepoint_t *glyph);
@@ -426,22 +523,22 @@ hb_font_glyph_from_string (hb_font_t *font,
/* Fonts are very light-weight objects */
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_create (hb_face_t *face);
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_create_sub_font (hb_font_t *parent);
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_get_empty (void);
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_reference (hb_font_t *font);
-void
+HB_EXTERN void
hb_font_destroy (hb_font_t *font);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_set_user_data (hb_font_t *font,
hb_user_data_key_t *key,
void * data,
@@ -449,46 +546,46 @@ hb_font_set_user_data (hb_font_t *font,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_font_get_user_data (hb_font_t *font,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_font_make_immutable (hb_font_t *font);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_font_is_immutable (hb_font_t *font);
-void
+HB_EXTERN void
hb_font_set_parent (hb_font_t *font,
hb_font_t *parent);
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_font_get_parent (hb_font_t *font);
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_font_get_face (hb_font_t *font);
-void
+HB_EXTERN void
hb_font_set_funcs (hb_font_t *font,
hb_font_funcs_t *klass,
void *font_data,
hb_destroy_func_t destroy);
/* Be *very* careful with this function! */
-void
+HB_EXTERN void
hb_font_set_funcs_data (hb_font_t *font,
void *font_data,
hb_destroy_func_t destroy);
-void
+HB_EXTERN void
hb_font_set_scale (hb_font_t *font,
int x_scale,
int y_scale);
-void
+HB_EXTERN void
hb_font_get_scale (hb_font_t *font,
int *x_scale,
int *y_scale);
@@ -496,12 +593,12 @@ hb_font_get_scale (hb_font_t *font,
/*
* A zero value means "no hinting in that direction"
*/
-void
+HB_EXTERN void
hb_font_set_ppem (hb_font_t *font,
unsigned int x_ppem,
unsigned int y_ppem);
-void
+HB_EXTERN void
hb_font_get_ppem (hb_font_t *font,
unsigned int *x_ppem,
unsigned int *y_ppem);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc
index 5a8eb2f1a57..fb3c1dfbcf0 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc
@@ -70,11 +70,12 @@ struct hb_ft_font_t
{
FT_Face ft_face;
int load_flags;
+ bool symbol; /* Whether selected cmap is symbol cmap. */
bool unref; /* Whether to destroy ft_face when done. */
};
static hb_ft_font_t *
-_hb_ft_font_create (FT_Face ft_face, bool unref)
+_hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref)
{
hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t));
@@ -82,6 +83,7 @@ _hb_ft_font_create (FT_Face ft_face, bool unref)
return NULL;
ft_font->ft_face = ft_face;
+ ft_font->symbol = symbol;
ft_font->unref = unref;
ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
@@ -89,11 +91,17 @@ _hb_ft_font_create (FT_Face ft_face, bool unref)
return ft_font;
}
+static void
+_hb_ft_face_destroy (FT_Face ft_face)
+{
+ FT_Done_Face (ft_face);
+}
+
static void
_hb_ft_font_destroy (hb_ft_font_t *ft_font)
{
if (ft_font->unref)
- FT_Done_Face (ft_font->ft_face);
+ _hb_ft_face_destroy (ft_font->ft_face);
free (ft_font);
}
@@ -155,21 +163,46 @@ hb_ft_font_get_face (hb_font_t *font)
static hb_bool_t
-hb_ft_get_glyph (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
-
+hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
{
const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
- unsigned int g;
+ unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode);
- if (likely (!variation_selector))
- g = FT_Get_Char_Index (ft_font->ft_face, unicode);
- else
- g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector);
+ if (unlikely (!g))
+ {
+ if (unlikely (ft_font->symbol) && unicode <= 0x00FFu)
+ {
+ /* For symbol-encoded OpenType fonts, we duplicate the
+ * U+F000..F0FF range at U+0000..U+00FF. That's what
+ * Windows seems to do, and that's hinted about at:
+ * http://www.microsoft.com/typography/otspec/recom.htm
+ * under "Non-Standard (Symbol) Fonts". */
+ g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode);
+ if (!g)
+ return false;
+ }
+ else
+ return false;
+ }
+
+ *glyph = g;
+ return true;
+}
+
+static hb_bool_t
+hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ unsigned int g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector);
if (unlikely (!g))
return false;
@@ -216,18 +249,6 @@ hb_ft_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
return (-v + (1<<9)) >> 10;
}
-static hb_bool_t
-hb_ft_get_glyph_h_origin (hb_font_t *font HB_UNUSED,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph HB_UNUSED,
- hb_position_t *x HB_UNUSED,
- hb_position_t *y HB_UNUSED,
- void *user_data HB_UNUSED)
-{
- /* We always work in the horizontal coordinates. */
- return true;
-}
-
static hb_bool_t
hb_ft_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
void *font_data,
@@ -272,17 +293,6 @@ hb_ft_get_glyph_h_kerning (hb_font_t *font,
return kerningv.x;
}
-static hb_position_t
-hb_ft_get_glyph_v_kerning (hb_font_t *font HB_UNUSED,
- void *font_data HB_UNUSED,
- hb_codepoint_t top_glyph HB_UNUSED,
- hb_codepoint_t bottom_glyph HB_UNUSED,
- void *user_data HB_UNUSED)
-{
- /* FreeType API doesn't support vertical kerning */
- return 0;
-}
-
static hb_bool_t
hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED,
void *font_data,
@@ -300,6 +310,16 @@ hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED,
extents->y_bearing = ft_face->glyph->metrics.horiBearingY;
extents->width = ft_face->glyph->metrics.width;
extents->height = -ft_face->glyph->metrics.height;
+ if (font->x_scale < 0)
+ {
+ extents->x_bearing = -extents->x_bearing;
+ extents->width = -extents->width;
+ }
+ if (font->y_scale < 0)
+ {
+ extents->y_bearing = -extents->y_bearing;
+ extents->height = -extents->height;
+ }
return true;
}
@@ -379,25 +399,78 @@ hb_ft_get_glyph_from_name (hb_font_t *font HB_UNUSED,
return *glyph != 0;
}
+static hb_bool_t
+hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
+{
+ const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data;
+ FT_Face ft_face = ft_font->ft_face;
+ metrics->ascender = ft_face->size->metrics.ascender;
+ metrics->descender = ft_face->size->metrics.descender;
+ metrics->line_gap = ft_face->size->metrics.height - (ft_face->size->metrics.ascender - ft_face->size->metrics.descender);
+ if (font->y_scale < 0)
+ {
+ metrics->ascender = -metrics->ascender;
+ metrics->descender = -metrics->descender;
+ metrics->line_gap = -metrics->line_gap;
+ }
+ return true;
+}
+
+static hb_font_funcs_t *static_ft_funcs = NULL;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_ft_funcs (void)
+{
+ hb_font_funcs_destroy (static_ft_funcs);
+}
+#endif
static void
_hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref)
{
- static const hb_font_funcs_t ft_ffuncs = {
- HB_OBJECT_HEADER_STATIC,
+retry:
+ hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ft_funcs);
- true, /* immutable */
+ if (unlikely (!funcs))
+ {
+ funcs = hb_font_funcs_create ();
- {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_ft_get_##name,
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
+ hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, NULL, NULL);
+ //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, NULL, NULL);
+ hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, NULL, NULL);
+ hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, NULL, NULL);
+ hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ft_get_glyph_h_advance, NULL, NULL);
+ hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, NULL, NULL);
+ //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, NULL, NULL);
+ hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, NULL, NULL);
+ hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, NULL, NULL);
+ //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ft_get_glyph_v_kerning, NULL, NULL);
+ hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, NULL, NULL);
+ hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, NULL, NULL);
+ hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, NULL, NULL);
+ hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, NULL, NULL);
+
+ hb_font_funcs_make_immutable (funcs);
+
+ if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, NULL, funcs)) {
+ hb_font_funcs_destroy (funcs);
+ goto retry;
}
+
+#ifdef HB_USE_ATEXIT
+ atexit (free_static_ft_funcs); /* First person registers atexit() callback. */
+#endif
};
+ bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL;
+
hb_font_set_funcs (font,
- const_cast (&ft_ffuncs),
- _hb_ft_font_create (ft_face, unref),
+ funcs,
+ _hb_ft_font_create (ft_face, symbol, unref),
(hb_destroy_func_t) _hb_ft_font_destroy);
}
@@ -477,7 +550,7 @@ hb_face_t *
hb_ft_face_create_referenced (FT_Face ft_face)
{
FT_Reference_Face (ft_face);
- return hb_ft_face_create (ft_face, (hb_destroy_func_t) FT_Done_Face);
+ return hb_ft_face_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
}
static void
@@ -557,7 +630,7 @@ hb_font_t *
hb_ft_font_create_referenced (FT_Face ft_face)
{
FT_Reference_Face (ft_face);
- return hb_ft_font_create (ft_face, (hb_destroy_func_t) FT_Done_Face);
+ return hb_ft_font_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy);
}
@@ -626,7 +699,8 @@ hb_ft_font_set_funcs (hb_font_t *font)
return;
}
- FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE);
+ if (FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE))
+ FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL);
FT_Set_Char_Size (ft_face,
abs (font->x_scale), abs (font->y_scale),
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h
index 368c317a083..196b045773a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h
@@ -59,7 +59,7 @@ HB_BEGIN_DECLS
* probably should use (the more recent) hb_ft_face_create_referenced()
* instead.
*/
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_ft_face_create (FT_Face ft_face,
hb_destroy_func_t destroy);
@@ -71,7 +71,7 @@ hb_ft_face_create (FT_Face ft_face,
* Client is still responsible for making sure that ft-face is destroyed
* after hb-face is.
*/
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_ft_face_create_cached (FT_Face ft_face);
/* This version is like hb_ft_face_create(), except that it calls
@@ -81,7 +81,7 @@ hb_ft_face_create_cached (FT_Face ft_face);
* This is the most convenient version to use. Use it unless you have
* very good reasons not to.
*/
-hb_face_t *
+HB_EXTERN hb_face_t *
hb_ft_face_create_referenced (FT_Face ft_face);
@@ -98,26 +98,26 @@ hb_ft_face_create_referenced (FT_Face ft_face);
/* See notes on hb_ft_face_create(). Same issues re lifecycle-management
* apply here. Use hb_ft_font_create_referenced() if you can. */
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_ft_font_create (FT_Face ft_face,
hb_destroy_func_t destroy);
/* See notes on hb_ft_face_create_referenced() re lifecycle-management
* issues. */
-hb_font_t *
+HB_EXTERN hb_font_t *
hb_ft_font_create_referenced (FT_Face ft_face);
-FT_Face
+HB_EXTERN FT_Face
hb_ft_font_get_face (hb_font_t *font);
-void
+HB_EXTERN void
hb_ft_font_set_load_flags (hb_font_t *font, int load_flags);
-int
+HB_EXTERN int
hb_ft_font_get_load_flags (hb_font_t *font);
/* Makes an hb_font_t use FreeType internally to implement font functions. */
-void
+HB_EXTERN void
hb_ft_font_set_funcs (hb_font_t *font);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh
index 2d3b13c5236..943d96ca2e7 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh
@@ -140,7 +140,7 @@ struct TTCHeaderVersion1
protected:
Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
- FixedVersion version; /* Version of the TTC Header (1.0),
+ FixedVersion<>version; /* Version of the TTC Header (1.0),
* 0x00010000u */
ArrayOf, ULONG>
table; /* Array of offsets to the OffsetTable for each font
@@ -187,7 +187,7 @@ struct TTCHeader
union {
struct {
Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
- FixedVersion version; /* Version of the TTC Header (1.0 or 2.0),
+ FixedVersion<>version; /* Version of the TTC Header (1.0 or 2.0),
* 0x00010000u or 0x00020000u */
} header;
TTCHeaderVersion1 version1;
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh
index 6b3520cf071..27c5f1703cd 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh
@@ -101,10 +101,8 @@ static inline Type& StructAfter(TObject &X)
#define DEFINE_SIZE_STATIC(size) \
DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
static const unsigned int static_size = (size); \
- static const unsigned int min_size = (size)
-
-/* Size signifying variable-sized array */
-#define VAR 1
+ static const unsigned int min_size = (size); \
+ inline unsigned int get_size (void) const { return (size); }
#define DEFINE_SIZE_UNION(size, _member) \
DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \
@@ -185,7 +183,7 @@ struct hb_dispatch_context_t
/* This limits sanitizing time on really broken fonts. */
#ifndef HB_SANITIZE_MAX_EDITS
-#define HB_SANITIZE_MAX_EDITS 100
+#define HB_SANITIZE_MAX_EDITS 32
#endif
struct hb_sanitize_context_t :
@@ -399,9 +397,9 @@ struct Sanitizer
struct hb_serialize_context_t
{
- inline hb_serialize_context_t (void *start, unsigned int size)
+ inline hb_serialize_context_t (void *start_, unsigned int size)
{
- this->start = (char *) start;
+ this->start = (char *) start_;
this->end = this->start + size;
this->ran_out_of_room = false;
@@ -495,10 +493,10 @@ struct hb_serialize_context_t
return reinterpret_cast (&obj);
}
- inline void truncate (void *head)
+ inline void truncate (void *new_head)
{
- assert (this->start < head && head <= this->head);
- this->head = (char *) head;
+ assert (this->start < new_head && new_head <= this->head);
+ this->head = (char *) new_head;
}
unsigned int debug_depth;
@@ -665,6 +663,24 @@ typedef SHORT FWORD;
/* 16-bit unsigned integer (USHORT) that describes a quantity in FUnits. */
typedef USHORT UFWORD;
+/* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */
+struct F2DOT14 : SHORT
+{
+ //inline float to_float (void) const { return ???; }
+ //inline void set_float (float f) { v.set (f * ???); }
+ public:
+ DEFINE_SIZE_STATIC (2);
+};
+
+/* 32-bit signed fixed-point number (16.16). */
+struct Fixed: LONG
+{
+ //inline float to_float (void) const { return ???; }
+ //inline void set_float (float f) { v.set (f * ???); }
+ public:
+ DEFINE_SIZE_STATIC (4);
+};
+
/* Date represented in number of seconds since 12:00 midnight, January 1,
* 1904. The value is represented as a signed 64-bit integer. */
struct LONGDATETIME
@@ -742,9 +758,10 @@ struct CheckSum : ULONG
* Version Numbers
*/
+template
struct FixedVersion
{
- inline uint32_t to_int (void) const { return (major << 16) + minor; }
+ inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; }
inline bool sanitize (hb_sanitize_context_t *c) const
{
@@ -752,10 +769,10 @@ struct FixedVersion
return_trace (c->check_struct (this));
}
- USHORT major;
- USHORT minor;
+ FixedType major;
+ FixedType minor;
public:
- DEFINE_SIZE_STATIC (4);
+ DEFINE_SIZE_STATIC (2 * sizeof(FixedType));
};
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh
index b0e2f36a436..7827c09a57c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh
@@ -69,61 +69,78 @@ struct CmapSubtableFormat0
struct CmapSubtableFormat4
{
- inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ struct accelerator_t
{
- unsigned int segCount;
+ inline void init (const CmapSubtableFormat4 *subtable)
+ {
+ segCount = subtable->segCountX2 / 2;
+ endCount = subtable->values;
+ startCount = endCount + segCount + 1;
+ idDelta = startCount + segCount;
+ idRangeOffset = idDelta + segCount;
+ glyphIdArray = idRangeOffset + segCount;
+ glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2;
+ }
+
+ static inline bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph)
+ {
+ const accelerator_t *thiz = (const accelerator_t *) obj;
+
+ /* Custom two-array bsearch. */
+ int min = 0, max = (int) thiz->segCount - 1;
+ const USHORT *startCount = thiz->startCount;
+ const USHORT *endCount = thiz->endCount;
+ unsigned int i;
+ while (min <= max)
+ {
+ int mid = (min + max) / 2;
+ if (codepoint < startCount[mid])
+ max = mid - 1;
+ else if (codepoint > endCount[mid])
+ min = mid + 1;
+ else
+ {
+ i = mid;
+ goto found;
+ }
+ }
+ return false;
+
+ found:
+ hb_codepoint_t gid;
+ unsigned int rangeOffset = thiz->idRangeOffset[i];
+ if (rangeOffset == 0)
+ gid = codepoint + thiz->idDelta[i];
+ else
+ {
+ /* Somebody has been smoking... */
+ unsigned int index = rangeOffset / 2 + (codepoint - thiz->startCount[i]) + i - thiz->segCount;
+ if (unlikely (index >= thiz->glyphIdArrayLength))
+ return false;
+ gid = thiz->glyphIdArray[index];
+ if (unlikely (!gid))
+ return false;
+ gid += thiz->idDelta[i];
+ }
+
+ *glyph = gid & 0xFFFFu;
+ return true;
+ }
+
const USHORT *endCount;
const USHORT *startCount;
const USHORT *idDelta;
const USHORT *idRangeOffset;
const USHORT *glyphIdArray;
+ unsigned int segCount;
unsigned int glyphIdArrayLength;
+ };
- segCount = this->segCountX2 / 2;
- endCount = this->values;
- startCount = endCount + segCount + 1;
- idDelta = startCount + segCount;
- idRangeOffset = idDelta + segCount;
- glyphIdArray = idRangeOffset + segCount;
- glyphIdArrayLength = (this->length - 16 - 8 * segCount) / 2;
-
- /* Custom two-array bsearch. */
- int min = 0, max = (int) segCount - 1;
- unsigned int i;
- while (min <= max)
- {
- int mid = (min + max) / 2;
- if (codepoint < startCount[mid])
- max = mid - 1;
- else if (codepoint > endCount[mid])
- min = mid + 1;
- else
- {
- i = mid;
- goto found;
- }
- }
- return false;
-
- found:
- hb_codepoint_t gid;
- unsigned int rangeOffset = idRangeOffset[i];
- if (rangeOffset == 0)
- gid = codepoint + idDelta[i];
- else
- {
- /* Somebody has been smoking... */
- unsigned int index = rangeOffset / 2 + (codepoint - startCount[i]) + i - segCount;
- if (unlikely (index >= glyphIdArrayLength))
- return false;
- gid = glyphIdArray[index];
- if (unlikely (!gid))
- return false;
- gid += idDelta[i];
- }
-
- *glyph = gid & 0xFFFFu;
- return true;
+ inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
+ {
+ accelerator_t accel;
+ accel.init (this);
+ return accel.get_glyph_func (&accel, codepoint, glyph);
}
inline bool sanitize (hb_sanitize_context_t *c) const
@@ -388,7 +405,7 @@ struct CmapSubtableFormat14
}
protected:
- USHORT format; /* Format number is set to 0. */
+ USHORT format; /* Format number is set to 14. */
ULONG lengthZ; /* Byte length of this subtable. */
SortedArrayOf
record; /* Variation selector records; sorted
@@ -416,16 +433,6 @@ struct CmapSubtable
}
}
- inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph) const
- {
- switch (u.format) {
- case 14: return u.format14.get_glyph_variant(codepoint, variation_selector, glyph);
- default: return GLYPH_VARIANT_NOT_FOUND;
- }
- }
-
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
@@ -442,7 +449,7 @@ struct CmapSubtable
}
}
- protected:
+ public:
union {
USHORT format; /* Format identifier */
CmapSubtableFormat0 format0;
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc
index 836c3bf0e85..3c63f336a6b 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc
@@ -35,6 +35,8 @@
#include "hb-ot-head-table.hh"
#include "hb-ot-hhea-table.hh"
#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-os2-table.hh"
+//#include "hb-ot-post-table.hh"
struct hb_ot_face_metrics_accelerator_t
@@ -42,24 +44,58 @@ struct hb_ot_face_metrics_accelerator_t
unsigned int num_metrics;
unsigned int num_advances;
unsigned int default_advance;
+ unsigned short ascender;
+ unsigned short descender;
+ unsigned short line_gap;
+
const OT::_mtx *table;
hb_blob_t *blob;
inline void init (hb_face_t *face,
- hb_tag_t _hea_tag, hb_tag_t _mtx_tag,
- unsigned int default_advance_)
+ hb_tag_t _hea_tag,
+ hb_tag_t _mtx_tag,
+ hb_tag_t os2_tag)
{
- this->default_advance = default_advance_;
- this->num_metrics = face->get_num_glyphs ();
+ this->default_advance = face->get_upem ();
+
+ bool got_font_extents = false;
+ if (os2_tag)
+ {
+ hb_blob_t *os2_blob = OT::Sanitizer::sanitize (face->reference_table (os2_tag));
+ const OT::os2 *os2 = OT::Sanitizer::lock_instance (os2_blob);
+#define USE_TYPO_METRICS (1u<<7)
+ if (0 != (os2->fsSelection & USE_TYPO_METRICS))
+ {
+ this->ascender = os2->sTypoAscender;
+ this->descender = os2->sTypoDescender;
+ this->line_gap = os2->sTypoLineGap;
+ got_font_extents = (this->ascender | this->descender) != 0;
+ }
+ hb_blob_destroy (os2_blob);
+ }
hb_blob_t *_hea_blob = OT::Sanitizer::sanitize (face->reference_table (_hea_tag));
const OT::_hea *_hea = OT::Sanitizer::lock_instance (_hea_blob);
this->num_advances = _hea->numberOfLongMetrics;
+ if (!got_font_extents)
+ {
+ this->ascender = _hea->ascender;
+ this->descender = _hea->descender;
+ this->line_gap = _hea->lineGap;
+ }
hb_blob_destroy (_hea_blob);
this->blob = OT::Sanitizer::sanitize (face->reference_table (_mtx_tag));
- if (unlikely (!this->num_advances ||
- 2 * (this->num_advances + this->num_metrics) > hb_blob_get_length (this->blob)))
+
+ /* Cap num_metrics() and num_advances() based on table length. */
+ unsigned int len = hb_blob_get_length (this->blob);
+ if (unlikely (this->num_advances * 4 > len))
+ this->num_advances = len / 4;
+ this->num_metrics = this->num_advances + (len - 4 * this->num_advances) / 2;
+
+ /* We MUST set num_metrics to zero if num_advances is zero.
+ * Our get_advance() depends on that. */
+ if (unlikely (!this->num_advances))
{
this->num_metrics = this->num_advances = 0;
hb_blob_destroy (this->blob);
@@ -166,10 +202,48 @@ struct hb_ot_face_glyf_accelerator_t
}
};
+typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
+ hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph);
+
+template
+static inline bool get_glyph_from (const void *obj,
+ hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph)
+{
+ const Type *typed_obj = (const Type *) obj;
+ return typed_obj->get_glyph (codepoint, glyph);
+}
+
+template
+static inline bool get_glyph_from_symbol (const void *obj,
+ hb_codepoint_t codepoint,
+ hb_codepoint_t *glyph)
+{
+ const Type *typed_obj = (const Type *) obj;
+ if (likely (typed_obj->get_glyph (codepoint, glyph)))
+ return true;
+
+ if (codepoint <= 0x00FFu)
+ {
+ /* For symbol-encoded OpenType fonts, we duplicate the
+ * U+F000..F0FF range at U+0000..U+00FF. That's what
+ * Windows seems to do, and that's hinted about at:
+ * http://www.microsoft.com/typography/otspec/recom.htm
+ * under "Non-Standard (Symbol) Fonts". */
+ return typed_obj->get_glyph (0xF000u + codepoint, glyph);
+ }
+
+ return false;
+}
+
struct hb_ot_face_cmap_accelerator_t
{
- const OT::CmapSubtable *table;
- const OT::CmapSubtable *uvs_table;
+ hb_cmap_get_glyph_func_t get_glyph_func;
+ const void *get_glyph_data;
+ OT::CmapSubtableFormat4::accelerator_t format4_accel;
+
+ const OT::CmapSubtableFormat14 *uvs_table;
hb_blob_t *blob;
inline void init (hb_face_t *face)
@@ -177,8 +251,9 @@ struct hb_ot_face_cmap_accelerator_t
this->blob = OT::Sanitizer::sanitize (face->reference_table (HB_OT_TAG_cmap));
const OT::cmap *cmap = OT::Sanitizer::lock_instance (this->blob);
const OT::CmapSubtable *subtable = NULL;
- const OT::CmapSubtable *subtable_uvs = NULL;
+ const OT::CmapSubtableFormat14 *subtable_uvs = NULL;
+ bool symbol = false;
/* 32-bit subtables. */
if (!subtable) subtable = cmap->find_subtable (3, 10);
if (!subtable) subtable = cmap->find_subtable (0, 6);
@@ -189,17 +264,38 @@ struct hb_ot_face_cmap_accelerator_t
if (!subtable) subtable = cmap->find_subtable (0, 2);
if (!subtable) subtable = cmap->find_subtable (0, 1);
if (!subtable) subtable = cmap->find_subtable (0, 0);
- if (!subtable) subtable = cmap->find_subtable (3, 0);
+ if (!subtable)(subtable = cmap->find_subtable (3, 0)) && (symbol = true);
/* Meh. */
if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
/* UVS subtable. */
- if (!subtable_uvs) subtable_uvs = cmap->find_subtable (0, 5);
+ if (!subtable_uvs)
+ {
+ const OT::CmapSubtable *st = cmap->find_subtable (0, 5);
+ if (st && st->u.format == 14)
+ subtable_uvs = &st->u.format14;
+ }
/* Meh. */
- if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtable);
+ if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14);
- this->table = subtable;
this->uvs_table = subtable_uvs;
+
+ this->get_glyph_data = subtable;
+ if (unlikely (symbol))
+ this->get_glyph_func = get_glyph_from_symbol;
+ else
+ switch (subtable->u.format) {
+ /* Accelerate format 4 and format 12. */
+ default: this->get_glyph_func = get_glyph_from; break;
+ case 12: this->get_glyph_func = get_glyph_from; break;
+ case 4:
+ {
+ this->format4_accel.init (&subtable->u.format4);
+ this->get_glyph_data = &this->format4_accel;
+ this->get_glyph_func = this->format4_accel.get_glyph_func;
+ }
+ break;
+ }
}
inline void fini (void)
@@ -207,33 +303,77 @@ struct hb_ot_face_cmap_accelerator_t
hb_blob_destroy (this->blob);
}
- inline bool get_glyph (hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph) const
+ inline bool get_nominal_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t *glyph) const
{
- if (unlikely (variation_selector))
+ return this->get_glyph_func (this->get_glyph_data, unicode, glyph);
+ }
+
+ inline bool get_variation_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph) const
+ {
+ switch (this->uvs_table->get_glyph_variant (unicode,
+ variation_selector,
+ glyph))
{
- switch (this->uvs_table->get_glyph_variant (unicode,
- variation_selector,
- glyph))
- {
- case OT::GLYPH_VARIANT_NOT_FOUND: return false;
- case OT::GLYPH_VARIANT_FOUND: return true;
- case OT::GLYPH_VARIANT_USE_DEFAULT: break;
- }
+ case OT::GLYPH_VARIANT_NOT_FOUND: return false;
+ case OT::GLYPH_VARIANT_FOUND: return true;
+ case OT::GLYPH_VARIANT_USE_DEFAULT: break;
}
- return this->table->get_glyph (unicode, glyph);
+ return get_nominal_glyph (unicode, glyph);
}
};
+template
+struct hb_lazy_loader_t
+{
+ inline void init (hb_face_t *face_)
+ {
+ face = face_;
+ instance = NULL;
+ }
+
+ inline void fini (void)
+ {
+ if (instance && instance != &OT::Null(T))
+ {
+ instance->fini();
+ free (instance);
+ }
+ }
+
+ inline const T* operator-> (void) const
+ {
+ retry:
+ T *p = (T *) hb_atomic_ptr_get (&instance);
+ if (unlikely (!p))
+ {
+ p = (T *) calloc (1, sizeof (T));
+ if (unlikely (!p))
+ return &OT::Null(T);
+ p->init (face);
+ if (unlikely (!hb_atomic_ptr_cmpexch (const_cast(&instance), NULL, p)))
+ {
+ p->fini ();
+ goto retry;
+ }
+ }
+ return p;
+ }
+
+ private:
+ hb_face_t *face;
+ T *instance;
+};
struct hb_ot_font_t
{
hb_ot_face_cmap_accelerator_t cmap;
hb_ot_face_metrics_accelerator_t h_metrics;
hb_ot_face_metrics_accelerator_t v_metrics;
- hb_ot_face_glyf_accelerator_t glyf;
+ hb_lazy_loader_t glyf;
};
@@ -245,11 +385,9 @@ _hb_ot_font_create (hb_face_t *face)
if (unlikely (!ot_font))
return NULL;
- unsigned int upem = face->get_upem ();
-
ot_font->cmap.init (face);
- ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, upem>>1);
- ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, upem); /* TODO Can we do this lazily? */
+ ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, HB_OT_TAG_os2);
+ ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, HB_TAG_NONE); /* TODO Can we do this lazily? */
ot_font->glyf.init (face);
return ot_font;
@@ -268,16 +406,27 @@ _hb_ot_font_destroy (hb_ot_font_t *ot_font)
static hb_bool_t
-hb_ot_get_glyph (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t unicode,
- hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
+hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
{
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- return ot_font->cmap.get_glyph (unicode, variation_selector, glyph);
+ return ot_font->cmap.get_nominal_glyph (unicode, glyph);
+}
+
+static hb_bool_t
+hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_codepoint_t unicode,
+ hb_codepoint_t variation_selector,
+ hb_codepoint_t *glyph,
+ void *user_data HB_UNUSED)
+{
+ const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+ return ot_font->cmap.get_variation_glyph (unicode, variation_selector, glyph);
}
static hb_position_t
@@ -300,52 +449,6 @@ hb_ot_get_glyph_v_advance (hb_font_t *font HB_UNUSED,
return font->em_scale_y (-(int) ot_font->v_metrics.get_advance (glyph));
}
-static hb_bool_t
-hb_ot_get_glyph_h_origin (hb_font_t *font HB_UNUSED,
- void *font_data HB_UNUSED,
- hb_codepoint_t glyph HB_UNUSED,
- hb_position_t *x HB_UNUSED,
- hb_position_t *y HB_UNUSED,
- void *user_data HB_UNUSED)
-{
- /* We always work in the horizontal coordinates. */
- return true;
-}
-
-static hb_bool_t
-hb_ot_get_glyph_v_origin (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t glyph,
- hb_position_t *x,
- hb_position_t *y,
- void *user_data HB_UNUSED)
-{
- /* TODO */
- return false;
-}
-
-static hb_position_t
-hb_ot_get_glyph_h_kerning (hb_font_t *font,
- void *font_data,
- hb_codepoint_t left_glyph,
- hb_codepoint_t right_glyph,
- void *user_data HB_UNUSED)
-{
- /* TODO */
- return 0;
-}
-
-static hb_position_t
-hb_ot_get_glyph_v_kerning (hb_font_t *font HB_UNUSED,
- void *font_data HB_UNUSED,
- hb_codepoint_t top_glyph HB_UNUSED,
- hb_codepoint_t bottom_glyph HB_UNUSED,
- void *user_data HB_UNUSED)
-{
- /* OpenType doesn't have vertical-kerning other than GPOS. */
- return 0;
-}
-
static hb_bool_t
hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
void *font_data,
@@ -354,7 +457,7 @@ hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
void *user_data HB_UNUSED)
{
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
- bool ret = ot_font->glyf.get_extents (glyph, extents);
+ bool ret = ot_font->glyf->get_extents (glyph, extents);
extents->x_bearing = font->em_scale_x (extents->x_bearing);
extents->y_bearing = font->em_scale_y (extents->y_bearing);
extents->width = font->em_scale_x (extents->width);
@@ -363,61 +466,85 @@ hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED,
}
static hb_bool_t
-hb_ot_get_glyph_contour_point (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t glyph,
- unsigned int point_index,
- hb_position_t *x,
- hb_position_t *y,
- void *user_data HB_UNUSED)
+hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
{
- /* TODO */
- return false;
+ const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+ metrics->ascender = font->em_scale_y (ot_font->h_metrics.ascender);
+ metrics->descender = font->em_scale_y (ot_font->h_metrics.descender);
+ metrics->line_gap = font->em_scale_y (ot_font->h_metrics.line_gap);
+ return true;
}
static hb_bool_t
-hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED,
- void *font_data,
- hb_codepoint_t glyph,
- char *name, unsigned int size,
- void *user_data HB_UNUSED)
+hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED,
+ void *font_data,
+ hb_font_extents_t *metrics,
+ void *user_data HB_UNUSED)
{
- /* TODO */
- return false;
+ const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
+ metrics->ascender = font->em_scale_x (ot_font->v_metrics.ascender);
+ metrics->descender = font->em_scale_x (ot_font->v_metrics.descender);
+ metrics->line_gap = font->em_scale_x (ot_font->v_metrics.line_gap);
+ return true;
}
-static hb_bool_t
-hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED,
- void *font_data,
- const char *name, int len, /* -1 means nul-terminated */
- hb_codepoint_t *glyph,
- void *user_data HB_UNUSED)
-{
- /* TODO */
- return false;
-}
+static hb_font_funcs_t *static_ot_funcs = NULL;
+#ifdef HB_USE_ATEXIT
+static
+void free_static_ot_funcs (void)
+{
+ hb_font_funcs_destroy (static_ot_funcs);
+}
+#endif
static hb_font_funcs_t *
_hb_ot_get_font_funcs (void)
{
- static const hb_font_funcs_t ot_ffuncs = {
- HB_OBJECT_HEADER_STATIC,
+retry:
+ hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ot_funcs);
- true, /* immutable */
+ if (unlikely (!funcs))
+ {
+ funcs = hb_font_funcs_create ();
- {
-#define HB_FONT_FUNC_IMPLEMENT(name) hb_ot_get_##name,
- HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
-#undef HB_FONT_FUNC_IMPLEMENT
+ hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, NULL, NULL);
+ hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, NULL, NULL);
+ hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, NULL, NULL);
+ hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, NULL, NULL);
+ hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, NULL, NULL);
+ hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, NULL, NULL);
+ //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, NULL, NULL);
+ //hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, NULL, NULL);
+ //hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, NULL, NULL); TODO
+ //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, NULL, NULL);
+ hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, NULL, NULL);
+ //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, NULL, NULL); TODO
+ //hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, NULL, NULL); TODO
+ //hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, NULL, NULL); TODO
+
+ hb_font_funcs_make_immutable (funcs);
+
+ if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, NULL, funcs)) {
+ hb_font_funcs_destroy (funcs);
+ goto retry;
}
+
+#ifdef HB_USE_ATEXIT
+ atexit (free_static_ot_funcs); /* First person registers atexit() callback. */
+#endif
};
- return const_cast (&ot_ffuncs);
+ return funcs;
}
/**
+ * hb_ot_font_set_funcs:
+ *
* Since: 0.9.28
**/
void
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h
index b9947a16bc8..80eaa54b1ad 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h
@@ -36,7 +36,7 @@
HB_BEGIN_DECLS
-void
+HB_EXTERN void
hb_ot_font_set_funcs (hb_font_t *font);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh
index 616bd6650d8..cdb23939268 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh
@@ -90,10 +90,10 @@ struct glyfGlyphHeader
* greater than or equal to zero,
* this is a simple glyph; if negative,
* this is a composite glyph. */
- SHORT xMin; /* Minimum x for coordinate data. */
- SHORT yMin; /* Minimum y for coordinate data. */
- SHORT xMax; /* Maximum x for coordinate data. */
- SHORT yMax; /* Maximum y for coordinate data. */
+ FWORD xMin; /* Minimum x for coordinate data. */
+ FWORD yMin; /* Minimum y for coordinate data. */
+ FWORD xMax; /* Maximum x for coordinate data. */
+ FWORD yMax; /* Maximum y for coordinate data. */
DEFINE_SIZE_STATIC (10);
};
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh
index 3cd59fbf2dd..16d18c8f243 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh
@@ -55,13 +55,15 @@ struct head
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && likely (version.major == 1));
+ return_trace (c->check_struct (this) &&
+ version.major == 1 &&
+ magicNumber == 0x5F0F3CF5u);
}
protected:
- FixedVersion version; /* Version of the head table--currently
+ FixedVersion<>version; /* Version of the head table--currently
* 0x00010000u for version 1.0. */
- FixedVersion fontRevision; /* Set by font manufacturer. */
+ FixedVersion<>fontRevision; /* Set by font manufacturer. */
ULONG checkSumAdjustment; /* To compute: set it to 0, sum the
* entire font as ULONG, then store
* 0xB1B0AFBAu - sum. */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh
index ed65934fae4..c63f4668a42 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh
@@ -56,7 +56,7 @@ struct _hea
}
public:
- FixedVersion version; /* 0x00010000u for version 1.0. */
+ FixedVersion<>version; /* 0x00010000u for version 1.0. */
FWORD ascender; /* Typographic ascent. */
FWORD descender; /* Typographic descent. */
FWORD lineGap; /* Typographic line gap. */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh
index cd266ffbee7..2ec501c3b79 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh
@@ -44,8 +44,8 @@ namespace OT {
struct LongMetric
{
- USHORT advance; /* Advance width/height. */
- SHORT lsb; /* Leading (left/top) side bearing. */
+ UFWORD advance; /* Advance width/height. */
+ FWORD lsb; /* Leading (left/top) side bearing. */
public:
DEFINE_SIZE_STATIC (4);
};
@@ -74,7 +74,7 @@ struct _mtx
* be in the array, but that entry is
* required. The last entry applies to
* all subsequent glyphs. */
- SHORT leadingBearingX[VAR]; /* Here the advance is assumed
+ FWORD leadingBearingX[VAR]; /* Here the advance is assumed
* to be the same as the advance
* for the last entry above. The
* number of entries in this array is
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh
index f087b2317cb..f6d966cc97d 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh
@@ -34,6 +34,14 @@
#include "hb-set-private.hh"
+#ifndef HB_MAX_NESTING_LEVEL
+#define HB_MAX_NESTING_LEVEL 6
+#endif
+#ifndef HB_MAX_CONTEXT_LENGTH
+#define HB_MAX_CONTEXT_LENGTH 64
+#endif
+
+
namespace OT {
@@ -44,8 +52,6 @@ namespace OT {
#define NOT_COVERED ((unsigned int) -1)
-#define MAX_NESTING_LEVEL 6
-#define MAX_CONTEXT_LENGTH 64
@@ -539,6 +545,9 @@ struct Feature
c->try_set (&featureParams, new_offset) &&
!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))
return_trace (false);
+
+ if (c->edit_count > 1)
+ c->edit_count--; /* This was a "legitimate" edit; don't contribute to error count. */
}
return_trace (true);
@@ -573,6 +582,11 @@ struct LookupFlag : USHORT
DEFINE_SIZE_STATIC (2);
};
+} /* namespace OT */
+/* This has to be outside the namespace. */
+HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags);
+namespace OT {
+
struct Lookup
{
inline unsigned int get_subtable_count (void) const { return subTable.len; }
@@ -756,7 +770,11 @@ struct CoverageFormat2
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
- if (unlikely (!num_glyphs)) return_trace (true);
+ if (unlikely (!num_glyphs))
+ {
+ rangeRecord.len.set (0);
+ return_trace (true);
+ }
unsigned int num_ranges = 1;
for (unsigned int i = 1; i < num_glyphs; i++)
@@ -1156,6 +1174,21 @@ struct Device
inline hb_position_t get_y_delta (hb_font_t *font) const
{ return get_delta (font->y_ppem, font->y_scale); }
+ inline unsigned int get_size (void) const
+ {
+ unsigned int f = deltaFormat;
+ if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size;
+ return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
+ }
+
+ inline bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
+ }
+
+ private:
+
inline int get_delta (unsigned int ppem, int scale) const
{
if (!ppem) return 0;
@@ -1166,8 +1199,6 @@ struct Device
return (int) (pixels * (int64_t) scale / ppem);
}
-
-
inline int get_delta_pixels (unsigned int ppem_size) const
{
unsigned int f = deltaFormat;
@@ -1191,19 +1222,6 @@ struct Device
return delta;
}
- inline unsigned int get_size (void) const
- {
- unsigned int f = deltaFormat;
- if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size;
- return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f)));
- }
-
- inline bool sanitize (hb_sanitize_context_t *c) const
- {
- TRACE_SANITIZE (this);
- return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
- }
-
protected:
USHORT startSize; /* Smallest size to correct--in ppem */
USHORT endSize; /* Largest size to correct--in ppem */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh
index 9c5206c5594..b77ce74062d 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh
@@ -409,7 +409,7 @@ struct GDEF
protected:
- FixedVersion version; /* Version of the GDEF table--currently
+ FixedVersion<>version; /* Version of the GDEF table--currently
* 0x00010002u */
OffsetTo
glyphClassDef; /* Offset to class definition table
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh
index 41e02200696..c065e179a23 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh
@@ -36,8 +36,17 @@ namespace OT {
/* buffer **position** var allocations */
-#define attach_lookback() var.u16[0] /* number of glyphs to go back to attach this glyph to its base */
-#define cursive_chain() var.i16[1] /* character to which this connects, may be positive or negative */
+#define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */
+#define attach_type() var.u8[2] /* attachment type */
+/* Note! if attach_chain() is zero, the value of attach_type() is irrelevant. */
+
+enum attach_type_t {
+ ATTACH_TYPE_NONE = 0X00,
+
+ /* Each attachment should be either a mark or a cursive; can't be both. */
+ ATTACH_TYPE_MARK = 0X01,
+ ATTACH_TYPE_CURSIVE = 0X02,
+};
/* Shared Tables: ValueRecord, Anchor Table, and MarkArray */
@@ -425,7 +434,9 @@ struct MarkArray : ArrayOf /* Array of MarkRecords--in Coverage ord
hb_glyph_position_t &o = buffer->cur_pos();
o.x_offset = base_x - mark_x;
o.y_offset = base_y - mark_y;
- o.attach_lookback() = buffer->idx - glyph_pos;
+ o.attach_type() = ATTACH_TYPE_MARK;
+ o.attach_chain() = (int) glyph_pos - (int) buffer->idx;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
buffer->idx++;
return_trace (true);
@@ -741,7 +752,7 @@ struct PairPosFormat2
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
- /* (this+coverage).add_coverage (c->input); // Don't need this. */
+ (this+coverage).add_coverage (c->input);
unsigned int count1 = class1Count;
const ClassDef &klass1 = this+classDef1;
@@ -906,9 +917,6 @@ struct CursivePosFormat1
TRACE_APPLY (this);
hb_buffer_t *buffer = c->buffer;
- /* We don't handle mark glyphs here. */
- if (unlikely (_hb_glyph_info_is_mark (&buffer->cur()))) return_trace (false);
-
const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)];
if (!this_record.exitAnchor) return_trace (false);
@@ -992,7 +1000,9 @@ struct CursivePosFormat1
*/
reverse_cursive_minor_offset (pos, child, c->direction, parent);
- pos[child].cursive_chain() = parent - child;
+ pos[child].attach_type() = ATTACH_TYPE_CURSIVE;
+ pos[child].attach_chain() = (int) parent - (int) child;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT;
if (likely (HB_DIRECTION_IS_HORIZONTAL (c->direction)))
pos[child].y_offset = y_offset;
else
@@ -1067,7 +1077,7 @@ struct MarkBasePosFormat1
unsigned int mark_index = (this+markCoverage).get_coverage (buffer->cur().codepoint);
if (likely (mark_index == NOT_COVERED)) return_trace (false);
- /* now we search backwards for a non-mark glyph */
+ /* Now we search backwards for a non-mark glyph */
hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
@@ -1079,7 +1089,7 @@ struct MarkBasePosFormat1
} while (1);
/* Checking that matched glyph is actually a base glyph by GDEF is too strong; disabled */
- if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { /*return_trace (false);*/ }
+ //if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { return_trace (false); }
unsigned int base_index = (this+baseCoverage).get_coverage (buffer->info[skippy_iter.idx].codepoint);
if (base_index == NOT_COVERED) return_trace (false);
@@ -1168,14 +1178,14 @@ struct MarkLigPosFormat1
unsigned int mark_index = (this+markCoverage).get_coverage (buffer->cur().codepoint);
if (likely (mark_index == NOT_COVERED)) return_trace (false);
- /* now we search backwards for a non-mark glyph */
+ /* Now we search backwards for a non-mark glyph */
hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input;
skippy_iter.reset (buffer->idx, 1);
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
if (!skippy_iter.prev ()) return_trace (false);
/* Checking that matched glyph is actually a ligature by GDEF is too strong; disabled */
- if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { /*return_trace (false);*/ }
+ //if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { return_trace (false); }
unsigned int j = skippy_iter.idx;
unsigned int lig_index = (this+ligatureCoverage).get_coverage (buffer->info[j].codepoint);
@@ -1499,7 +1509,8 @@ struct GPOS : GSUBGPOS
{ return CastR (GSUBGPOS::get_lookup (i)); }
static inline void position_start (hb_font_t *font, hb_buffer_t *buffer);
- static inline void position_finish (hb_font_t *font, hb_buffer_t *buffer);
+ static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer);
+ static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer);
inline bool sanitize (hb_sanitize_context_t *c) const
{
@@ -1516,13 +1527,13 @@ struct GPOS : GSUBGPOS
static void
reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent)
{
- unsigned int j = pos[i].cursive_chain();
- if (likely (!j))
+ int chain = pos[i].attach_chain(), type = pos[i].attach_type();
+ if (likely (!chain || 0 == (type & ATTACH_TYPE_CURSIVE)))
return;
- j += i;
+ pos[i].attach_chain() = 0;
- pos[i].cursive_chain() = 0;
+ unsigned int j = (int) i + chain;
/* Stop if we see new parent in the chain. */
if (j == new_parent)
@@ -1535,62 +1546,68 @@ reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direc
else
pos[j].x_offset = -pos[i].x_offset;
- pos[j].cursive_chain() = i - j;
+ pos[j].attach_chain() = -chain;
+ pos[j].attach_type() = type;
}
static void
-fix_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
+propagate_attachment_offsets (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
{
- unsigned int j = pos[i].cursive_chain();
- if (likely (!j))
+ /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate
+ * offset of glyph they are attached to. */
+ int chain = pos[i].attach_chain(), type = pos[i].attach_type();
+ if (likely (!chain))
return;
- j += i;
+ unsigned int j = (int) i + chain;
- pos[i].cursive_chain() = 0;
+ pos[i].attach_chain() = 0;
- fix_cursive_minor_offset (pos, j, direction);
+ propagate_attachment_offsets (pos, j, direction);
- if (HB_DIRECTION_IS_HORIZONTAL (direction))
- pos[i].y_offset += pos[j].y_offset;
- else
+ assert (!!(type & ATTACH_TYPE_MARK) ^ !!(type & ATTACH_TYPE_CURSIVE));
+
+ if (type & ATTACH_TYPE_CURSIVE)
+ {
+ if (HB_DIRECTION_IS_HORIZONTAL (direction))
+ pos[i].y_offset += pos[j].y_offset;
+ else
+ pos[i].x_offset += pos[j].x_offset;
+ }
+ else /*if (type & ATTACH_TYPE_MARK)*/
+ {
pos[i].x_offset += pos[j].x_offset;
-}
+ pos[i].y_offset += pos[j].y_offset;
-static void
-fix_mark_attachment (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction)
-{
- if (likely (!(pos[i].attach_lookback())))
- return;
-
- unsigned int j = i - pos[i].attach_lookback();
-
- pos[i].x_offset += pos[j].x_offset;
- pos[i].y_offset += pos[j].y_offset;
-
- if (HB_DIRECTION_IS_FORWARD (direction))
- for (unsigned int k = j; k < i; k++) {
- pos[i].x_offset -= pos[k].x_advance;
- pos[i].y_offset -= pos[k].y_advance;
- }
- else
- for (unsigned int k = j + 1; k < i + 1; k++) {
- pos[i].x_offset += pos[k].x_advance;
- pos[i].y_offset += pos[k].y_advance;
- }
+ assert (j < i);
+ if (HB_DIRECTION_IS_FORWARD (direction))
+ for (unsigned int k = j; k < i; k++) {
+ pos[i].x_offset -= pos[k].x_advance;
+ pos[i].y_offset -= pos[k].y_advance;
+ }
+ else
+ for (unsigned int k = j + 1; k < i + 1; k++) {
+ pos[i].x_offset += pos[k].x_advance;
+ pos[i].y_offset += pos[k].y_advance;
+ }
+ }
}
void
GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
{
- buffer->clear_positions ();
-
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++)
- buffer->pos[i].attach_lookback() = buffer->pos[i].cursive_chain() = 0;
+ buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0;
}
void
-GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+{
+ //_hb_buffer_assert_gsubgpos_vars (buffer);
+}
+
+void
+GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
{
_hb_buffer_assert_gsubgpos_vars (buffer);
@@ -1598,13 +1615,10 @@ GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len);
hb_direction_t direction = buffer->props.direction;
- /* Handle cursive connections */
- for (unsigned int i = 0; i < len; i++)
- fix_cursive_minor_offset (pos, i, direction);
-
/* Handle attachments */
- for (unsigned int i = 0; i < len; i++)
- fix_mark_attachment (pos, i, direction);
+ if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
+ for (unsigned int i = 0; i < len; i++)
+ propagate_attachment_offsets (pos, i, direction);
}
@@ -1633,8 +1647,8 @@ template
}
-#undef attach_lookback
-#undef cursive_chain
+#undef attach_chain
+#undef attach_type
} /* namespace OT */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh
index f544bd8b250..44dcd120e3b 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh
@@ -265,16 +265,6 @@ struct Sequence
TRACE_APPLY (this);
unsigned int count = substitute.len;
- /* TODO:
- * Testing shows that Uniscribe actually allows zero-len susbstitute,
- * which essentially deletes a glyph. We don't allow for now. It
- * can be confusing to the client since the cluster from the deleted
- * glyph won't be merged with any output cluster... Also, currently
- * buffer->move_to() makes assumptions about this too. Perhaps fix
- * in the future after figuring out what to do with the clusters.
- */
- if (unlikely (!count)) return_trace (false);
-
/* Special-case to make it in-place and not consider this
* as a "multiplied" substitution. */
if (unlikely (count == 1))
@@ -282,6 +272,13 @@ struct Sequence
c->replace_glyph (substitute.array[0]);
return_trace (true);
}
+ /* Spec disallows this, but Uniscribe allows it.
+ * https://github.com/behdad/harfbuzz/issues/253 */
+ else if (unlikely (count == 0))
+ {
+ c->buffer->delete_glyph ();
+ return_trace (true);
+ }
unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ?
HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0;
@@ -630,7 +627,7 @@ struct Ligature
unsigned int total_component_count = 0;
unsigned int match_length = 0;
- unsigned int match_positions[MAX_CONTEXT_LENGTH];
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
if (likely (!match_input (c, count,
&component[1],
@@ -970,7 +967,7 @@ struct ReverseChainSingleSubstFormat1
inline bool apply (hb_apply_context_t *c) const
{
TRACE_APPLY (this);
- if (unlikely (c->nesting_level_left != MAX_NESTING_LEVEL))
+ if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL))
return_trace (false); /* No chaining to this type */
unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint);
@@ -1268,7 +1265,6 @@ struct GSUB : GSUBGPOS
{ return CastR (GSUBGPOS::get_lookup (i)); }
static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
- static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
inline bool sanitize (hb_sanitize_context_t *c) const
{
@@ -1289,19 +1285,32 @@ GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer)
const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef;
unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
{
- _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint));
- _hb_glyph_info_clear_lig_props (&buffer->info[i]);
+ unsigned int props = gdef.get_glyph_props (info[i].codepoint);
+ if (!props)
+ {
+ /* Never mark default-ignorables as marks.
+ * They won't get in the way of lookups anyway,
+ * but having them as mark will cause them to be skipped
+ * over if the lookup-flag says so, but at least for the
+ * Mongolian variation selectors, looks like Uniscribe
+ * marks them as non-mark. Some Mongolian fonts without
+ * GDEF rely on this. Another notable character that
+ * this applies to is COMBINING GRAPHEME JOINER. */
+ props = (_hb_glyph_info_get_general_category (&info[i]) !=
+ HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
+ _hb_glyph_info_is_default_ignorable (&info[i])) ?
+ HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
+ HB_OT_LAYOUT_GLYPH_PROPS_MARK;
+ }
+ _hb_glyph_info_set_glyph_props (&info[i], props);
+ _hb_glyph_info_clear_lig_props (&info[i]);
buffer->info[i].syllable() = 0;
}
}
-void
-GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED)
-{
-}
-
/* Out-of-class implementation for methods recursing */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh
index 0bcbaed81ca..73cfb77fe2a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh
@@ -74,7 +74,7 @@ struct hb_closure_context_t :
hb_closure_context_t (hb_face_t *face_,
hb_set_t *glyphs_,
- unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
+ unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
face (face_),
glyphs (glyphs_),
recurse_func (NULL),
@@ -196,7 +196,7 @@ struct hb_collect_glyphs_context_t :
hb_set_t *glyphs_input, /* OUT. May be NULL */
hb_set_t *glyphs_after, /* OUT. May be NULL */
hb_set_t *glyphs_output, /* OUT. May be NULL */
- unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
+ unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
face (face_),
before (glyphs_before ? glyphs_before : hb_set_get_empty ()),
input (glyphs_input ? glyphs_input : hb_set_get_empty ()),
@@ -319,7 +319,7 @@ struct hb_apply_context_t :
if (!c->check_glyph_property (&info, lookup_props))
return SKIP_YES;
- if (unlikely (_hb_glyph_info_is_default_ignorable (&info) &&
+ if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_fvs (&info) &&
(ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) &&
(ignore_zwj || !_hb_glyph_info_is_zwj (&info))))
return SKIP_MAYBE;
@@ -355,11 +355,11 @@ struct hb_apply_context_t :
{
matcher.set_lookup_props (lookup_props);
}
- inline void set_match_func (matcher_t::match_func_t match_func,
- const void *match_data,
+ inline void set_match_func (matcher_t::match_func_t match_func_,
+ const void *match_data_,
const USHORT glyph_data[])
{
- matcher.set_match_func (match_func, match_data);
+ matcher.set_match_func (match_func_, match_data_);
match_glyph_data = glyph_data;
}
@@ -483,7 +483,7 @@ struct hb_apply_context_t :
lookup_mask (1),
auto_zwj (true),
recurse_func (NULL),
- nesting_level_left (MAX_NESTING_LEVEL),
+ nesting_level_left (HB_MAX_NESTING_LEVEL),
lookup_props (0),
gdef (*hb_ot_layout_from_face (face)->gdef),
has_glyph_classes (gdef.has_glyph_classes ()),
@@ -704,13 +704,13 @@ static inline bool match_input (hb_apply_context_t *c,
match_func_t match_func,
const void *match_data,
unsigned int *end_offset,
- unsigned int match_positions[MAX_CONTEXT_LENGTH],
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH],
bool *p_is_mark_ligature = NULL,
unsigned int *p_total_component_count = NULL)
{
TRACE_APPLY (NULL);
- if (unlikely (count > MAX_CONTEXT_LENGTH)) return_trace (false);
+ if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false);
hb_buffer_t *buffer = c->buffer;
@@ -784,7 +784,7 @@ static inline bool match_input (hb_apply_context_t *c,
}
static inline bool ligate_input (hb_apply_context_t *c,
unsigned int count, /* Including the first glyph */
- unsigned int match_positions[MAX_CONTEXT_LENGTH], /* Including the first glyph */
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
unsigned int match_length,
hb_codepoint_t lig_glyph,
bool is_mark_ligature,
@@ -836,19 +836,21 @@ static inline bool ligate_input (hb_apply_context_t *c,
if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
{
_hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER);
- _hb_glyph_info_set_modified_combining_class (&buffer->cur(), 0);
}
}
c->replace_glyph_with_ligature (lig_glyph, klass);
for (unsigned int i = 1; i < count; i++)
{
- while (buffer->idx < match_positions[i])
+ while (buffer->idx < match_positions[i] && !buffer->in_error)
{
if (!is_mark_ligature) {
+ unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
+ if (this_comp == 0)
+ this_comp = last_num_components;
unsigned int new_lig_comp = components_so_far - last_num_components +
- MIN (MAX (_hb_glyph_info_get_lig_comp (&buffer->cur()), 1u), last_num_components);
- _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
+ MIN (this_comp, last_num_components);
+ _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
}
buffer->next_glyph ();
}
@@ -865,8 +867,11 @@ static inline bool ligate_input (hb_apply_context_t *c,
/* Re-adjust components for any marks following. */
for (unsigned int i = buffer->idx; i < buffer->len; i++) {
if (last_lig_id == _hb_glyph_info_get_lig_id (&buffer->info[i])) {
+ unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]);
+ if (!this_comp)
+ break;
unsigned int new_lig_comp = components_so_far - last_num_components +
- MIN (MAX (_hb_glyph_info_get_lig_comp (&buffer->info[i]), 1u), last_num_components);
+ MIN (this_comp, last_num_components);
_hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp);
} else
break;
@@ -944,7 +949,7 @@ static inline void recurse_lookups (context_t *c,
static inline bool apply_lookup (hb_apply_context_t *c,
unsigned int count, /* Including the first glyph */
- unsigned int match_positions[MAX_CONTEXT_LENGTH], /* Including the first glyph */
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */
unsigned int lookupCount,
const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
unsigned int match_length)
@@ -966,12 +971,17 @@ static inline bool apply_lookup (hb_apply_context_t *c,
match_positions[j] += delta;
}
- for (unsigned int i = 0; i < lookupCount; i++)
+ for (unsigned int i = 0; i < lookupCount && !buffer->in_error; i++)
{
unsigned int idx = lookupRecord[i].sequenceIndex;
if (idx >= count)
continue;
+ /* Don't recurse to ourself at same position.
+ * Note that this test is too naive, it doesn't catch longer loops. */
+ if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
+ continue;
+
buffer->move_to (match_positions[idx]);
unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
@@ -986,16 +996,19 @@ static inline bool apply_lookup (hb_apply_context_t *c,
/* Recursed lookup changed buffer len. Adjust. */
- /* end can't go back past the current match position.
- * Note: this is only true because we do NOT allow MultipleSubst
- * with zero sequence len. */
- end = MAX ((int) match_positions[idx] + 1, int (end) + delta);
+ end = int (end) + delta;
+ if (end <= match_positions[idx])
+ {
+ /* There can't be any further changes. */
+ assert (end == match_positions[idx]);
+ break;
+ }
unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */
if (delta > 0)
{
- if (unlikely (delta + count > MAX_CONTEXT_LENGTH))
+ if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH))
break;
}
else
@@ -1094,7 +1107,7 @@ static inline bool context_apply_lookup (hb_apply_context_t *c,
ContextApplyLookupContext &lookup_context)
{
unsigned int match_length = 0;
- unsigned int match_positions[MAX_CONTEXT_LENGTH];
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
return match_input (c,
inputCount, input,
lookup_context.funcs.match, lookup_context.match_data,
@@ -1621,7 +1634,7 @@ static inline bool chain_context_apply_lookup (hb_apply_context_t *c,
ChainContextApplyLookupContext &lookup_context)
{
unsigned int match_length = 0;
- unsigned int match_positions[MAX_CONTEXT_LENGTH];
+ unsigned int match_positions[HB_MAX_CONTEXT_LENGTH];
return match_input (c,
inputCount, input,
lookup_context.funcs.match, lookup_context.match_data[1],
@@ -2267,7 +2280,7 @@ struct GSUBGPOS
}
protected:
- FixedVersion version; /* Version of the GSUB/GPOS table--initially set
+ FixedVersion<>version; /* Version of the GSUB/GPOS table--initially set
* to 0x00010000u */
OffsetTo
scriptList; /* ScriptList table */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh
index 57eb7535091..be61722eb03 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh
@@ -218,7 +218,7 @@ struct JSTF
}
protected:
- FixedVersion version; /* Version of the JSTF table--initially set
+ FixedVersion<>version; /* Version of the JSTF table--initially set
* to 0x00010000u */
RecordArrayOf
scriptList; /* Array of JstfScripts--listed
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh
index d7e97791003..2081949fe62 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh
@@ -49,7 +49,7 @@ hb_ot_layout_table_find_feature (hb_face_t *face,
* GDEF
*/
-typedef enum
+enum hb_ot_layout_glyph_props_flags_t
{
/* The following three match LookupFlags::Ignore* numbers. */
HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH = 0x02u,
@@ -64,7 +64,8 @@ typedef enum
HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
-} hb_ot_layout_glyph_class_mask_t;
+};
+HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
/*
@@ -98,21 +99,20 @@ hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
const hb_ot_layout_lookup_accelerator_t &accel);
-/* Should be called after all the substitute_lookup's are done */
-HB_INTERNAL void
-hb_ot_layout_substitute_finish (hb_font_t *font,
- hb_buffer_t *buffer);
-
-
-/* Should be called before all the position_lookup's are done. Resets positions to zero. */
+/* Should be called before all the position_lookup's are done. */
HB_INTERNAL void
hb_ot_layout_position_start (hb_font_t *font,
hb_buffer_t *buffer);
-/* Should be called after all the position_lookup's are done */
+/* Should be called after all the position_lookup's are done, to finish advances. */
HB_INTERNAL void
-hb_ot_layout_position_finish (hb_font_t *font,
- hb_buffer_t *buffer);
+hb_ot_layout_position_finish_advances (hb_font_t *font,
+ hb_buffer_t *buffer);
+
+/* Should be called after hb_ot_layout_position_finish_advances, to finish offsets. */
+HB_INTERNAL void
+hb_ot_layout_position_finish_offsets (hb_font_t *font,
+ hb_buffer_t *buffer);
@@ -180,8 +180,7 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout);
*/
/* buffer var allocations, used during the entire shaping process */
-#define unicode_props0() var2.u8[0]
-#define unicode_props1() var2.u8[1]
+#define unicode_props() var2.u16[0]
/* buffer var allocations, used during the GSUB/GPOS processing */
#define glyph_props() var1.u16[0] /* GDEF glyph properties */
@@ -214,48 +213,146 @@ _next_syllable (hb_buffer_t *buffer, unsigned int start)
/* unicode_props */
-enum {
- MASK0_ZWJ = 0x20u,
- MASK0_ZWNJ = 0x40u,
- MASK0_IGNORABLE = 0x80u,
- MASK0_GEN_CAT = 0x1Fu
+/* Design:
+ * unicode_props() is a two-byte number. The low byte includes:
+ * - General_Category: 5 bits.
+ * - A bit each for:
+ * * Is it Default_Ignorable(); we have a modified Default_Ignorable().
+ * * Whether it's one of the three Mongolian Free Variation Selectors.
+ * * One free bit right now.
+ *
+ * The high-byte has different meanings, switched by the Gen-Cat:
+ * - For Mn,Mc,Me: the modified Combining_Class.
+ * - For Cf: whether it's ZWJ, ZWNJ, or something else.
+ * - For Ws: index of which space character this is, if space fallback
+ * is needed, ie. we don't set this by default, only if asked to.
+ */
+
+enum hb_unicode_props_flags_t {
+ UPROPS_MASK_GEN_CAT = 0x001Fu,
+ UPROPS_MASK_IGNORABLE = 0x0020u,
+ UPROPS_MASK_FVS = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3 */
+
+ /* If GEN_CAT=FORMAT, top byte masks: */
+ UPROPS_MASK_Cf_ZWJ = 0x0100u,
+ UPROPS_MASK_Cf_ZWNJ = 0x0200u
};
+HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
static inline void
-_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode)
+_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
{
- /* XXX This shouldn't be inlined, or at least not while is_default_ignorable() is inline. */
- info->unicode_props0() = ((unsigned int) unicode->general_category (info->codepoint)) |
- (unicode->is_default_ignorable (info->codepoint) ? MASK0_IGNORABLE : 0) |
- (info->codepoint == 0x200Cu ? MASK0_ZWNJ : 0) |
- (info->codepoint == 0x200Du ? MASK0_ZWJ : 0);
- info->unicode_props1() = unicode->modified_combining_class (info->codepoint);
+ hb_unicode_funcs_t *unicode = buffer->unicode;
+ unsigned int u = info->codepoint;
+ unsigned int gen_cat = (unsigned int) unicode->general_category (u);
+ unsigned int props = gen_cat;
+
+ if (u >= 0x80)
+ {
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
+ if (unlikely (unicode->is_default_ignorable (u)))
+ {
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
+ props |= UPROPS_MASK_IGNORABLE;
+ if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
+ if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
+ /* Mongolian Free Variation Selectors need to be remembered
+ * because although we need to hide them like default-ignorables,
+ * they need to non-ignorable during shaping. This is similar to
+ * what we do for joiners in Indic-like shapers, but since the
+ * FVSes are GC=Mn, we have use a separate bit to remember them.
+ * Fixes:
+ * https://github.com/behdad/harfbuzz/issues/234
+ */
+ if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_FVS;
+ }
+ else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
+ {
+ /* The above check is just an optimization to let in only things we need further
+ * processing on. */
+
+ /* Only Mn and Mc can have non-zero ccc:
+ * http://www.unicode.org/policies/stability_policy.html#Property_Value
+ * """
+ * Canonical_Combining_Class, General_Category
+ * All characters other than those with General_Category property values
+ * Spacing_Mark (Mc) and Nonspacing_Mark (Mn) have the Canonical_Combining_Class
+ * property value 0.
+ * 1.1.5+
+ * """
+ *
+ * Also, all Mn's that are Default_Ignorable, have ccc=0, hence
+ * the "else if".
+ */
+ props |= unicode->modified_combining_class (info->codepoint)<<8;
+
+ /* Recategorize emoji skin-tone modifiers as Unicode mark, so they
+ * behave correctly in non-native directionality. They originally
+ * are MODIFIER_SYMBOL. Fixes:
+ * https://github.com/behdad/harfbuzz/issues/169
+ */
+ if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu)))
+ {
+ props = gen_cat = HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK;
+ }
+ }
+ }
+
+ info->unicode_props() = props;
}
static inline void
_hb_glyph_info_set_general_category (hb_glyph_info_t *info,
hb_unicode_general_category_t gen_cat)
{
- info->unicode_props0() = (unsigned int) gen_cat | ((info->unicode_props0()) & ~MASK0_GEN_CAT);
+ /* Clears top-byte. */
+ info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT));
}
static inline hb_unicode_general_category_t
_hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
{
- return (hb_unicode_general_category_t) (info->unicode_props0() & MASK0_GEN_CAT);
+ return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
}
+static inline bool
+_hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info)
+{
+ return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT);
+}
static inline void
_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info,
unsigned int modified_class)
{
- info->unicode_props1() = modified_class;
+ if (unlikely (!_hb_glyph_info_is_unicode_mark (info)))
+ return;
+ info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF);
}
-
static inline unsigned int
_hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
{
- return info->unicode_props1();
+ return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
+}
+
+static inline bool
+_hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_get_general_category (info) ==
+ HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
+}
+static inline void
+_hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s)
+{
+ if (unlikely (!_hb_glyph_info_is_unicode_space (info)))
+ return;
+ info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF);
+}
+static inline hb_unicode_funcs_t::space_t
+_hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_space (info) ?
+ (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
+ hb_unicode_funcs_t::NOT_SPACE;
}
static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
@@ -263,25 +360,44 @@ static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
static inline hb_bool_t
_hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
{
- return (info->unicode_props0() & MASK0_IGNORABLE) && !_hb_glyph_info_ligated (info);
+ return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
+ !_hb_glyph_info_ligated (info);
+}
+static inline hb_bool_t
+_hb_glyph_info_is_default_ignorable_and_not_fvs (const hb_glyph_info_t *info)
+{
+ return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_FVS))
+ == UPROPS_MASK_IGNORABLE) &&
+ !_hb_glyph_info_ligated (info);
}
+static inline bool
+_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_get_general_category (info) ==
+ HB_UNICODE_GENERAL_CATEGORY_FORMAT;
+}
static inline hb_bool_t
_hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
{
- return !!(info->unicode_props0() & MASK0_ZWNJ);
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
}
-
static inline hb_bool_t
_hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
{
- return !!(info->unicode_props0() & MASK0_ZWJ);
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
+}
+static inline hb_bool_t
+_hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
+{
+ return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
}
-
static inline void
_hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
{
- info->unicode_props0() ^= MASK0_ZWNJ | MASK0_ZWJ;
+ if (!_hb_glyph_info_is_unicode_format (info))
+ return;
+ info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
}
/* lig_props: aka lig_id / lig_comp
@@ -442,11 +558,9 @@ _hb_glyph_info_clear_ligated_and_multiplied (hb_glyph_info_t *info)
}
static inline void
-_hb_glyph_info_clear_substituted_and_ligated_and_multiplied (hb_glyph_info_t *info)
+_hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
{
- info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
- HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
- HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
+ info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
}
@@ -455,22 +569,19 @@ _hb_glyph_info_clear_substituted_and_ligated_and_multiplied (hb_glyph_info_t *in
static inline void
_hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer)
{
- HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props0);
- HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props1);
+ HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props);
}
static inline void
_hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
{
- HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props0);
- HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props1);
+ HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props);
}
static inline void
_hb_buffer_assert_unicode_vars (hb_buffer_t *buffer)
{
- HB_BUFFER_ASSERT_VAR (buffer, unicode_props0);
- HB_BUFFER_ASSERT_VAR (buffer, unicode_props1);
+ HB_BUFFER_ASSERT_VAR (buffer, unicode_props);
}
static inline void
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc
index 7dac059f595..74f61136780 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc
@@ -60,6 +60,80 @@ _hb_ot_layout_create (hb_face_t *face)
layout->gpos_blob = OT::Sanitizer::sanitize (face->reference_table (HB_OT_TAG_GPOS));
layout->gpos = OT::Sanitizer::lock_instance (layout->gpos_blob);
+ {
+ /*
+ * The ugly business of blacklisting individual fonts' tables happen here!
+ * See this thread for why we finally had to bend in and do this:
+ * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+ */
+ unsigned int gdef_len = hb_blob_get_length (layout->gdef_blob);
+ unsigned int gsub_len = hb_blob_get_length (layout->gsub_blob);
+ unsigned int gpos_len = hb_blob_get_length (layout->gpos_blob);
+ if (0
+ /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
+ || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len)
+ /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
+ || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len)
+ /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
+ || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len)
+ /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
+ || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len)
+ /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
+ || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len)
+ /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
+ || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len)
+ )
+ {
+ /* In certain versions of Times New Roman Italic and Bold Italic,
+ * ASCII double quotation mark U+0022, mapped to glyph 5, has wrong
+ * glyph class 3 (mark) in GDEF. Nuke the GDEF to avoid zero-width
+ * double-quote. See:
+ * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+ */
+ if (3 == layout->gdef->get_glyph_class (5))
+ layout->gdef = &OT::Null(OT::GDEF);
+ }
+ else if (0
+ /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */
+ || (898 == gdef_len && 46470 == gpos_len && 12554 == gsub_len)
+ /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */
+ || (910 == gdef_len && 47732 == gpos_len && 12566 == gsub_len)
+ /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */
+ || (928 == gdef_len && 59332 == gpos_len && 23298 == gsub_len)
+ /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */
+ || (940 == gdef_len && 60732 == gpos_len && 23310 == gsub_len)
+ /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */
+ || (994 == gdef_len && 60336 == gpos_len && 24474 == gsub_len)
+ /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */
+ || (1006 == gdef_len && 61740 == gpos_len && 24470 == gsub_len)
+ /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */
+ || (832 == gdef_len && 47162 == gpos_len && 7324 == gsub_len)
+ /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */
+ || (844 == gdef_len && 45474 == gpos_len && 7302 == gsub_len)
+ /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */
+ || (192 == gdef_len && 7254 == gpos_len && 12638 == gsub_len)
+ /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */
+ || (192 == gdef_len && 7254 == gpos_len && 12690 == gsub_len)
+ /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
+ /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
+ || (188 == gdef_len && 3852 == gpos_len && 248 == gsub_len)
+ /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
+ /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
+ || (188 == gdef_len && 3426 == gpos_len && 264 == gsub_len)
+ )
+ {
+ /* Many versions of Tahoma have bad GDEF tables that incorrectly classify some spacing marks
+ * such as certain IPA symbols as glyph class 3. So do older versions of Microsoft Himalaya,
+ * and the version of Cantarell shipped by Ubuntu 16.04.
+ * Nuke the GDEF tables of these fonts to avoid unwanted width-zeroing.
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
+ */
+ layout->gdef = &OT::Null(OT::GDEF);
+ }
+ }
+
layout->gsub_lookup_count = layout->gsub->get_lookup_count ();
layout->gpos_lookup_count = layout->gpos->get_lookup_count ();
@@ -130,6 +204,8 @@ hb_ot_layout_has_glyph_classes (hb_face_t *face)
}
/**
+ * hb_ot_layout_get_glyph_class:
+ *
* Since: 0.9.7
**/
hb_ot_layout_glyph_class_t
@@ -140,6 +216,8 @@ hb_ot_layout_get_glyph_class (hb_face_t *face,
}
/**
+ * hb_ot_layout_get_glyphs_in_class:
+ *
* Since: 0.9.7
**/
void
@@ -365,6 +443,8 @@ hb_ot_layout_language_get_required_feature_index (hb_face_t *face,
}
/**
+ * hb_ot_layout_language_get_required_feature:
+ *
* Since: 0.9.30
**/
hb_bool_t
@@ -452,6 +532,8 @@ hb_ot_layout_language_find_feature (hb_face_t *face,
}
/**
+ * hb_ot_layout_feature_get_lookups:
+ *
* Since: 0.9.7
**/
unsigned int
@@ -469,6 +551,8 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face,
}
/**
+ * hb_ot_layout_table_get_lookup_count:
+ *
* Since: 0.9.22
**/
unsigned int
@@ -629,6 +713,8 @@ _hb_ot_layout_collect_lookups_languages (hb_face_t *face,
}
/**
+ * hb_ot_layout_collect_lookups:
+ *
* Since: 0.9.8
**/
void
@@ -673,6 +759,8 @@ hb_ot_layout_collect_lookups (hb_face_t *face,
}
/**
+ * hb_ot_layout_lookup_collect_glyphs:
+ *
* Since: 0.9.7
**/
void
@@ -721,6 +809,8 @@ hb_ot_layout_has_substitution (hb_face_t *face)
}
/**
+ * hb_ot_layout_lookup_would_substitute:
+ *
* Since: 0.9.7
**/
hb_bool_t
@@ -742,7 +832,7 @@ hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face,
hb_bool_t zero_context)
{
if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
- OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, zero_context);
+ OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);
const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
@@ -755,13 +845,9 @@ hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer)
OT::GSUB::substitute_start (font, buffer);
}
-void
-hb_ot_layout_substitute_finish (hb_font_t *font, hb_buffer_t *buffer)
-{
- OT::GSUB::substitute_finish (font, buffer);
-}
-
/**
+ * hb_ot_layout_lookup_substitute_closure:
+ *
* Since: 0.9.7
**/
void
@@ -793,12 +879,20 @@ hb_ot_layout_position_start (hb_font_t *font, hb_buffer_t *buffer)
}
void
-hb_ot_layout_position_finish (hb_font_t *font, hb_buffer_t *buffer)
+hb_ot_layout_position_finish_advances (hb_font_t *font, hb_buffer_t *buffer)
{
- OT::GPOS::position_finish (font, buffer);
+ OT::GPOS::position_finish_advances (font, buffer);
+}
+
+void
+hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer)
+{
+ OT::GPOS::position_finish_offsets (font, buffer);
}
/**
+ * hb_ot_layout_get_size_params:
+ *
* Since: 0.9.10
**/
hb_bool_t
@@ -882,20 +976,79 @@ struct GPOSProxy
};
-template
+struct hb_get_subtables_context_t :
+ OT::hb_dispatch_context_t
+{
+ template
+ static inline bool apply_to (const void *obj, OT::hb_apply_context_t *c)
+ {
+ const Type *typed_obj = (const Type *) obj;
+ return typed_obj->apply (c);
+ }
+
+ typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_apply_context_t *c);
+
+ struct hb_applicable_t
+ {
+ inline void init (const void *obj_, hb_apply_func_t apply_func_)
+ {
+ obj = obj_;
+ apply_func = apply_func_;
+ }
+
+ inline bool apply (OT::hb_apply_context_t *c) const { return apply_func (obj, c); }
+
+ private:
+ const void *obj;
+ hb_apply_func_t apply_func;
+ };
+
+ typedef hb_auto_array_t array_t;
+
+ /* Dispatch interface. */
+ inline const char *get_name (void) { return "GET_SUBTABLES"; }
+ template
+ inline return_t dispatch (const T &obj)
+ {
+ hb_applicable_t *entry = array.push();
+ if (likely (entry))
+ entry->init (&obj, apply_to);
+ return HB_VOID;
+ }
+ static return_t default_return_value (void) { return HB_VOID; }
+ bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return false; }
+
+ hb_get_subtables_context_t (array_t &array_) :
+ array (array_),
+ debug_depth (0) {}
+
+ array_t &array;
+ unsigned int debug_depth;
+};
+
static inline bool
apply_forward (OT::hb_apply_context_t *c,
- const Obj &obj,
- const hb_ot_layout_lookup_accelerator_t &accel)
+ const hb_ot_layout_lookup_accelerator_t &accel,
+ const hb_get_subtables_context_t::array_t &subtables)
{
bool ret = false;
hb_buffer_t *buffer = c->buffer;
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
{
+ bool applied = false;
if (accel.may_have (buffer->cur().codepoint) &&
(buffer->cur().mask & c->lookup_mask) &&
- c->check_glyph_property (&buffer->cur(), c->lookup_props) &&
- obj.apply (c))
+ c->check_glyph_property (&buffer->cur(), c->lookup_props))
+ {
+ for (unsigned int i = 0; i < subtables.len; i++)
+ if (subtables[i].apply (c))
+ {
+ applied = true;
+ break;
+ }
+ }
+
+ if (applied)
ret = true;
else
buffer->next_glyph ();
@@ -903,11 +1056,10 @@ apply_forward (OT::hb_apply_context_t *c,
return ret;
}
-template
static inline bool
apply_backward (OT::hb_apply_context_t *c,
- const Obj &obj,
- const hb_ot_layout_lookup_accelerator_t &accel)
+ const hb_ot_layout_lookup_accelerator_t &accel,
+ const hb_get_subtables_context_t::array_t &subtables)
{
bool ret = false;
hb_buffer_t *buffer = c->buffer;
@@ -915,9 +1067,15 @@ apply_backward (OT::hb_apply_context_t *c,
{
if (accel.may_have (buffer->cur().codepoint) &&
(buffer->cur().mask & c->lookup_mask) &&
- c->check_glyph_property (&buffer->cur(), c->lookup_props) &&
- obj.apply (c))
- ret = true;
+ c->check_glyph_property (&buffer->cur(), c->lookup_props))
+ {
+ for (unsigned int i = 0; i < subtables.len; i++)
+ if (subtables[i].apply (c))
+ {
+ ret = true;
+ break;
+ }
+ }
/* The reverse lookup doesn't "advance" cursor (for good reason). */
buffer->idx--;
@@ -926,26 +1084,6 @@ apply_backward (OT::hb_apply_context_t *c,
return ret;
}
-struct hb_apply_forward_context_t :
- OT::hb_dispatch_context_t
-{
- inline const char *get_name (void) { return "APPLY_FWD"; }
- template
- inline return_t dispatch (const T &obj) { return apply_forward (c, obj, accel); }
- static return_t default_return_value (void) { return false; }
- bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return true; }
-
- hb_apply_forward_context_t (OT::hb_apply_context_t *c_,
- const hb_ot_layout_lookup_accelerator_t &accel_) :
- c (c_),
- accel (accel_),
- debug_depth (0) {}
-
- OT::hb_apply_context_t *c;
- const hb_ot_layout_lookup_accelerator_t &accel;
- unsigned int debug_depth;
-};
-
template
static inline void
apply_string (OT::hb_apply_context_t *c,
@@ -959,6 +1097,10 @@ apply_string (OT::hb_apply_context_t *c,
c->set_lookup_props (lookup.get_props ());
+ hb_get_subtables_context_t::array_t subtables;
+ hb_get_subtables_context_t c_get_subtables (subtables);
+ lookup.dispatch (&c_get_subtables);
+
if (likely (!lookup.is_reverse ()))
{
/* in/out forward substitution/positioning */
@@ -967,13 +1109,7 @@ apply_string (OT::hb_apply_context_t *c,
buffer->idx = 0;
bool ret;
- if (lookup.get_subtable_count () == 1)
- {
- hb_apply_forward_context_t c_forward (c, accel);
- ret = lookup.dispatch (&c_forward);
- }
- else
- ret = apply_forward (c, lookup, accel);
+ ret = apply_forward (c, accel, subtables);
if (ret)
{
if (!Proxy::inplace)
@@ -989,7 +1125,7 @@ apply_string (OT::hb_apply_context_t *c,
buffer->remove_output ();
buffer->idx = buffer->len - 1;
- apply_backward (c, lookup, accel);
+ apply_backward (c, accel, subtables);
}
}
@@ -1008,25 +1144,15 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
const stage_map_t *stage = &stages[table_index][stage_index];
for (; i < stage->last_lookup; i++)
{
-#if 0
- char buf[4096];
- hb_buffer_serialize_glyphs (buffer, 0, buffer->len,
- buf, sizeof (buf), NULL,
- font,
- HB_BUFFER_SERIALIZE_FORMAT_TEXT,
- Proxy::table_index == 0 ?
- HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS :
- HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
- printf ("buf: [%s]\n", buf);
-#endif
-
unsigned int lookup_index = lookups[table_index][i].index;
+ if (!buffer->message (font, "start lookup %d", lookup_index)) continue;
c.set_lookup_index (lookup_index);
c.set_lookup_mask (lookups[table_index][i].mask);
c.set_auto_zwj (lookups[table_index][i].auto_zwj);
apply_string (&c,
proxy.table.get_lookup (lookup_index),
proxy.accels[lookup_index]);
+ (void) buffer->message (font, "end lookup %d", lookup_index);
}
if (stage->pause_func)
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h
index 7364adaa77e..2c455a954cd 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h
@@ -48,7 +48,7 @@ HB_BEGIN_DECLS
* GDEF
*/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_has_glyph_classes (hb_face_t *face);
typedef enum {
@@ -59,11 +59,11 @@ typedef enum {
HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT = 4
} hb_ot_layout_glyph_class_t;
-hb_ot_layout_glyph_class_t
+HB_EXTERN hb_ot_layout_glyph_class_t
hb_ot_layout_get_glyph_class (hb_face_t *face,
hb_codepoint_t glyph);
-void
+HB_EXTERN void
hb_ot_layout_get_glyphs_in_class (hb_face_t *face,
hb_ot_layout_glyph_class_t klass,
hb_set_t *glyphs /* OUT */);
@@ -71,7 +71,7 @@ hb_ot_layout_get_glyphs_in_class (hb_face_t *face,
/* Not that useful. Provides list of attach points for a glyph that a
* client may want to cache */
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_get_attach_points (hb_face_t *face,
hb_codepoint_t glyph,
unsigned int start_offset,
@@ -79,7 +79,7 @@ hb_ot_layout_get_attach_points (hb_face_t *face,
unsigned int *point_array /* OUT */);
/* Ligature caret positions */
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_get_ligature_carets (hb_font_t *font,
hb_direction_t direction,
hb_codepoint_t glyph,
@@ -96,35 +96,35 @@ hb_ot_layout_get_ligature_carets (hb_font_t *font,
#define HB_OT_LAYOUT_NO_FEATURE_INDEX 0xFFFFu
#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX 0xFFFFu
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_table_get_script_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int start_offset,
unsigned int *script_count /* IN/OUT */,
hb_tag_t *script_tags /* OUT */);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_table_find_script (hb_face_t *face,
hb_tag_t table_tag,
hb_tag_t script_tag,
unsigned int *script_index);
/* Like find_script, but takes zero-terminated array of scripts to test */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_table_choose_script (hb_face_t *face,
hb_tag_t table_tag,
const hb_tag_t *script_tags,
unsigned int *script_index,
hb_tag_t *chosen_script);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_table_get_feature_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int start_offset,
unsigned int *feature_count /* IN/OUT */,
hb_tag_t *feature_tags /* OUT */);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_script_get_language_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -132,21 +132,21 @@ hb_ot_layout_script_get_language_tags (hb_face_t *face,
unsigned int *language_count /* IN/OUT */,
hb_tag_t *language_tags /* OUT */);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_script_find_language (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
hb_tag_t language_tag,
unsigned int *language_index);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_language_get_required_feature_index (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
unsigned int language_index,
unsigned int *feature_index);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_language_get_required_feature (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -154,7 +154,7 @@ hb_ot_layout_language_get_required_feature (hb_face_t *face,
unsigned int *feature_index,
hb_tag_t *feature_tag);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_language_get_feature_indexes (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -163,7 +163,7 @@ hb_ot_layout_language_get_feature_indexes (hb_face_t *face,
unsigned int *feature_count /* IN/OUT */,
unsigned int *feature_indexes /* OUT */);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_language_get_feature_tags (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -172,7 +172,7 @@ hb_ot_layout_language_get_feature_tags (hb_face_t *face,
unsigned int *feature_count /* IN/OUT */,
hb_tag_t *feature_tags /* OUT */);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_language_find_feature (hb_face_t *face,
hb_tag_t table_tag,
unsigned int script_index,
@@ -180,7 +180,7 @@ hb_ot_layout_language_find_feature (hb_face_t *face,
hb_tag_t feature_tag,
unsigned int *feature_index);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_feature_get_lookups (hb_face_t *face,
hb_tag_t table_tag,
unsigned int feature_index,
@@ -188,12 +188,12 @@ hb_ot_layout_feature_get_lookups (hb_face_t *face,
unsigned int *lookup_count /* IN/OUT */,
unsigned int *lookup_indexes /* OUT */);
-unsigned int
+HB_EXTERN unsigned int
hb_ot_layout_table_get_lookup_count (hb_face_t *face,
hb_tag_t table_tag);
-void
+HB_EXTERN void
hb_ot_layout_collect_lookups (hb_face_t *face,
hb_tag_t table_tag,
const hb_tag_t *scripts,
@@ -201,7 +201,7 @@ hb_ot_layout_collect_lookups (hb_face_t *face,
const hb_tag_t *features,
hb_set_t *lookup_indexes /* OUT */);
-void
+HB_EXTERN void
hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
hb_tag_t table_tag,
unsigned int lookup_index,
@@ -228,7 +228,7 @@ typedef hb_bool_t
const hb_ot_layout_glyph_sequence_t *sequence,
void *user_data);
-void
+HB_EXTERN void
Xhb_ot_layout_lookup_enumerate_sequences (hb_face_t *face,
hb_tag_t table_tag,
unsigned int lookup_index,
@@ -241,17 +241,17 @@ Xhb_ot_layout_lookup_enumerate_sequences (hb_face_t *face,
* GSUB
*/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_has_substitution (hb_face_t *face);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_lookup_would_substitute (hb_face_t *face,
unsigned int lookup_index,
const hb_codepoint_t *glyphs,
unsigned int glyphs_length,
hb_bool_t zero_context);
-void
+HB_EXTERN void
hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
unsigned int lookup_index,
hb_set_t *glyphs
@@ -259,7 +259,7 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
#ifdef HB_NOT_IMPLEMENTED
/* Note: You better have GDEF when using this API, or marks won't do much. */
-hb_bool_t
+HB_EXTERN hb_bool_t
Xhb_ot_layout_lookup_substitute (hb_font_t *font,
unsigned int lookup_index,
const hb_ot_layout_glyph_sequence_t *sequence,
@@ -274,12 +274,12 @@ Xhb_ot_layout_lookup_substitute (hb_font_t *font,
* GPOS
*/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_has_positioning (hb_face_t *face);
#ifdef HB_NOT_IMPLEMENTED
/* Note: You better have GDEF when using this API, or marks won't do much. */
-hb_bool_t
+HB_EXTERN hb_bool_t
Xhb_ot_layout_lookup_position (hb_font_t *font,
unsigned int lookup_index,
const hb_ot_layout_glyph_sequence_t *sequence,
@@ -288,7 +288,7 @@ Xhb_ot_layout_lookup_position (hb_font_t *font,
/* Optical 'size' feature info. Returns true if found.
* http://www.microsoft.com/typography/otspec/features_pt.htm#size */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_ot_layout_get_size_params (hb_face_t *face,
unsigned int *design_size, /* OUT. May be NULL */
unsigned int *subfamily_id, /* OUT. May be NULL */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh
index 9d78a96bc68..6d9cf96331d 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh
@@ -159,23 +159,9 @@ enum hb_ot_map_feature_flags_t {
F_MANUAL_ZWJ = 0x0004u, /* Don't skip over ZWJ when matching. */
F_GLOBAL_SEARCH = 0x0008u /* If feature not found in LangSys, look for it in global feature list and pick one. */
};
+HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t);
/* Macro version for where const is desired. */
#define F_COMBINE(l,r) (hb_ot_map_feature_flags_t ((unsigned int) (l) | (unsigned int) (r)))
-static inline hb_ot_map_feature_flags_t
-operator | (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t ((unsigned int) l | (unsigned int) r); }
-static inline hb_ot_map_feature_flags_t
-operator & (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t ((unsigned int) l & (unsigned int) r); }
-static inline hb_ot_map_feature_flags_t
-operator ~ (hb_ot_map_feature_flags_t r)
-{ return hb_ot_map_feature_flags_t (~(unsigned int) r); }
-static inline hb_ot_map_feature_flags_t&
-operator |= (hb_ot_map_feature_flags_t &l, hb_ot_map_feature_flags_t r)
-{ l = l | r; return l; }
-static inline hb_ot_map_feature_flags_t&
-operator &= (hb_ot_map_feature_flags_t& l, hb_ot_map_feature_flags_t r)
-{ l = l & r; return l; }
struct hb_ot_map_builder_t
@@ -217,7 +203,8 @@ struct hb_ot_map_builder_t
unsigned int stage[2]; /* GSUB/GPOS */
static int cmp (const feature_info_t *a, const feature_info_t *b)
- { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) : (a->seq < b->seq ? -1 : 1); }
+ { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) :
+ (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0); }
};
struct stage_info_t {
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc
index ee11afb9b65..0f9f60875cc 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc
@@ -89,7 +89,7 @@ hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
for (unsigned int table_index = 0; table_index < 2; table_index++) {
hb_tag_t table_tag = table_tags[table_index];
- found_script[table_index] = hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
+ found_script[table_index] = (bool) hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]);
hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]);
}
}
@@ -204,11 +204,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m)
for (unsigned int table_index = 0; table_index < 2; table_index++)
{
if (required_feature_tag[table_index] == info->tag)
- {
required_feature_stage[table_index] = info->stage[table_index];
- found = true;
- continue;
- }
+
found |= hb_ot_layout_language_find_feature (face,
table_tags[table_index],
script_index[table_index],
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh
index 4150dd6bb1e..5b9ed91134e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh
@@ -58,7 +58,7 @@ struct maxp
/* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */
protected:
- FixedVersion version; /* Version of the maxp table (0.5 or 1.0),
+ FixedVersion<>version; /* Version of the maxp table (0.5 or 1.0),
* 0x00005000u or 0x00010000u. */
USHORT numGlyphs; /* The number of glyphs in the font. */
public:
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh
new file mode 100644
index 00000000000..9d3df8de401
--- /dev/null
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2011,2012 Google, Inc.
+ *
+ * This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#ifndef HB_OT_OS2_TABLE_HH
+#define HB_OT_OS2_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+
+namespace OT {
+
+/*
+ * OS/2 and Windows Metrics
+ * http://www.microsoft.com/typography/otspec/os2.htm
+ */
+
+#define HB_OT_TAG_os2 HB_TAG('O','S','/','2')
+
+struct os2
+{
+ static const hb_tag_t tableTag = HB_OT_TAG_os2;
+
+ inline bool sanitize (hb_sanitize_context_t *c) const
+ {
+ TRACE_SANITIZE (this);
+ return_trace (c->check_struct (this));
+ }
+
+ public:
+ USHORT version;
+
+ /* Version 0 */
+ SHORT xAvgCharWidth;
+ USHORT usWeightClass;
+ USHORT usWidthClass;
+ USHORT fsType;
+ SHORT ySubscriptXSize;
+ SHORT ySubscriptYSize;
+ SHORT ySubscriptXOffset;
+ SHORT ySubscriptYOffset;
+ SHORT ySuperscriptXSize;
+ SHORT ySuperscriptYSize;
+ SHORT ySuperscriptXOffset;
+ SHORT ySuperscriptYOffset;
+ SHORT yStrikeoutSize;
+ SHORT yStrikeoutPosition;
+ SHORT sFamilyClass;
+ BYTE panose[10];
+ ULONG ulUnicodeRange[4];
+ Tag achVendID;
+ USHORT fsSelection;
+ USHORT usFirstCharIndex;
+ USHORT usLastCharIndex;
+ SHORT sTypoAscender;
+ SHORT sTypoDescender;
+ SHORT sTypoLineGap;
+ USHORT usWinAscent;
+ USHORT usWinDescent;
+
+ /* Version 1 */
+ //ULONG ulCodePageRange1;
+ //ULONG ulCodePageRange2;
+
+ /* Version 2 */
+ //SHORT sxHeight;
+ //SHORT sCapHeight;
+ //USHORT usDefaultChar;
+ //USHORT usBreakChar;
+ //USHORT usMaxContext;
+
+ /* Version 5 */
+ //USHORT usLowerOpticalPointSize;
+ //USHORT usUpperOpticalPointSize;
+
+ public:
+ DEFINE_SIZE_STATIC (78);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_OS2_TABLE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh
index cfd6919b43f..2198f765aa2 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh
@@ -6,10 +6,10 @@
*
* on files with these headers:
*
- * # ArabicShaping-8.0.0.txt
- * # Date: 2015-02-17, 23:33:00 GMT [RP]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # ArabicShaping-9.0.0.txt
+ * # Date: 2016-02-24, 22:25:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
* UnicodeData.txt does not have a header.
*/
@@ -19,6 +19,7 @@
#define X JOINING_TYPE_X
#define R JOINING_TYPE_R
+#define T JOINING_TYPE_T
#define U JOINING_TYPE_U
#define A JOINING_GROUP_ALAPH
#define DR JOINING_GROUP_DALATH_RISH
@@ -76,9 +77,11 @@ static const uint8_t joining_table[] =
/* Arabic Extended-A */
- /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,
+ /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,X,D,D,D,R,D,D,D,D,X,X,
+ /* 08C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+ /* 08E0 */ X,X,U,
-#define joining_offset_0x1806u 693
+#define joining_offset_0x1806u 739
/* Mongolian */
@@ -86,43 +89,48 @@ static const uint8_t joining_table[] =
/* 1820 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 1840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 1860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X,
- /* 1880 */ U,U,U,U,U,U,U,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+ /* 1880 */ U,U,U,U,U,T,T,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* 18A0 */ D,D,D,D,D,D,D,D,D,X,D,
-#define joining_offset_0x200cu 858
+#define joining_offset_0x200cu 904
/* General Punctuation */
- /* 2000 */ U,C,
+ /* 2000 */ U,C,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+ /* 2020 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+ /* 2040 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
+ /* 2060 */ X,X,X,X,X,X,U,U,U,U,
-#define joining_offset_0x2066u 860
-
- /* General Punctuation */
-
- /* 2060 */ U,U,U,U,
-
-#define joining_offset_0xa840u 864
+#define joining_offset_0xa840u 998
/* Phags-pa */
/* A840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
/* A860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,L,U,
-#define joining_offset_0x10ac0u 916
+#define joining_offset_0x10ac0u 1050
/* Manichaean */
/* 10AC0 */ D,D,D,D,D,R,U,R,U,R,R,U,U,L,R,R,R,R,R,D,D,D,D,L,D,D,D,D,D,R,D,D,
/* 10AE0 */ D,R,U,U,R,X,X,X,X,X,X,D,D,D,D,R,
-#define joining_offset_0x10b80u 964
+#define joining_offset_0x10b80u 1098
/* Psalter Pahlavi */
/* 10B80 */ D,R,D,R,R,R,D,D,D,R,D,D,R,D,R,R,D,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,
/* 10BA0 */ X,X,X,X,X,X,X,X,X,R,R,R,R,D,D,U,
-}; /* Table items: 1012; occupancy: 57% */
+#define joining_offset_0x1e900u 1146
+
+ /* Adlam */
+
+ /* 1E900 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+ /* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,
+ /* 1E940 */ D,D,D,D,
+
+}; /* Table items: 1214; occupancy: 54% */
static unsigned int
@@ -131,7 +139,7 @@ joining_type (hb_codepoint_t u)
switch (u >> 12)
{
case 0x0u:
- if (hb_in_range (u, 0x0600u, 0x08B4u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
+ if (hb_in_range (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u];
break;
case 0x1u:
@@ -139,8 +147,7 @@ joining_type (hb_codepoint_t u)
break;
case 0x2u:
- if (hb_in_range (u, 0x200Cu, 0x200Du)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
- if (hb_in_range (u, 0x2066u, 0x2069u)) return joining_table[u - 0x2066u + joining_offset_0x2066u];
+ if (hb_in_range (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu];
break;
case 0xAu:
@@ -152,6 +159,10 @@ joining_type (hb_codepoint_t u)
if (hb_in_range (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u];
break;
+ case 0x1Eu:
+ if (hb_in_range (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u];
+ break;
+
default:
break;
}
@@ -160,6 +171,7 @@ joining_type (hb_codepoint_t u)
#undef X
#undef R
+#undef T
#undef U
#undef A
#undef DR
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc
index e749ebbe473..80accdedd75 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc
@@ -28,9 +28,38 @@
#include "hb-ot-shape-private.hh"
+#ifndef HB_DEBUG_ARABIC
+#define HB_DEBUG_ARABIC (HB_DEBUG+0)
+#endif
+
+
/* buffer var allocations */
#define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */
+#define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0
+
+/* See:
+ * https://github.com/behdad/harfbuzz/commit/6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d#commitcomment-14248516 */
+#define HB_ARABIC_GENERAL_CATEGORY_IS_WORD(gen_cat) \
+ (FLAG_SAFE (gen_cat) & \
+ (FLAG (HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE) | \
+ /*FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |*/ \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | \
+ /*FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) |*/ \
+ /*FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) |*/ \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL)))
+
/*
* Joining types:
@@ -84,7 +113,7 @@ static const hb_tag_t arabic_features[] =
/* Same order as the feature array */
-enum {
+enum arabic_action_t {
ISOL,
FINA,
FIN2,
@@ -95,7 +124,11 @@ enum {
NONE,
- ARABIC_NUM_FEATURES = NONE
+ ARABIC_NUM_FEATURES = NONE,
+
+ /* We abuse the same byte for other things... */
+ STCH_FIXED,
+ STCH_REPEATING,
};
static const struct arabic_state_table_entry {
@@ -139,6 +172,11 @@ arabic_fallback_shape (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
+static void
+record_stch (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
static void
collect_features_arabic (hb_ot_shape_planner_t *plan)
{
@@ -165,6 +203,9 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
map->add_gsub_pause (nuke_joiners);
+ map->add_global_bool_feature (HB_TAG('s','t','c','h'));
+ map->add_gsub_pause (record_stch);
+
map->add_global_bool_feature (HB_TAG('c','c','m','p'));
map->add_global_bool_feature (HB_TAG('l','o','c','l'));
@@ -182,7 +223,6 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
map->add_gsub_pause (arabic_fallback_shape);
map->add_global_bool_feature (HB_TAG('c','a','l','t'));
- map->add_gsub_pause (NULL);
/* The spec includes 'cswh'. Earlier versions of Windows
* used to enable this by default, but testing suggests
@@ -192,6 +232,7 @@ collect_features_arabic (hb_ot_shape_planner_t *plan)
* Note that IranNastaliq uses this feature extensively
* to fixup broken glyph sequences. Oh well...
* Test case: U+0643,U+0640,U+0631. */
+ //map->add_gsub_pause (NULL);
//map->add_global_bool_feature (HB_TAG('c','s','w','h'));
map->add_global_bool_feature (HB_TAG('m','s','e','t'));
}
@@ -208,8 +249,10 @@ struct arabic_shape_plan_t
* mask_array[NONE] == 0. */
hb_mask_t mask_array[ARABIC_NUM_FEATURES + 1];
- bool do_fallback;
arabic_fallback_plan_t *fallback_plan;
+
+ unsigned int do_fallback : 1;
+ unsigned int has_stch : 1;
};
void *
@@ -220,6 +263,7 @@ data_create_arabic (const hb_ot_shape_plan_t *plan)
return NULL;
arabic_plan->do_fallback = plan->props.script == HB_SCRIPT_ARABIC;
+ arabic_plan->has_stch = !!plan->map.get_1_mask (HB_TAG ('s','t','c','h'));
for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++) {
arabic_plan->mask_array[i] = plan->map.get_1_mask (arabic_features[i]);
arabic_plan->do_fallback = arabic_plan->do_fallback &&
@@ -320,8 +364,6 @@ setup_masks_arabic_plan (const arabic_shape_plan_t *arabic_plan,
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
info[i].mask |= arabic_plan->mask_array[info[i].arabic_shaping_action()];
-
- HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
}
static void
@@ -371,6 +413,197 @@ retry:
arabic_fallback_plan_shape (fallback_plan, font, buffer);
}
+/*
+ * Stretch feature: "stch".
+ * See example here:
+ * https://www.microsoft.com/typography/OpenTypeDev/syriac/intro.htm
+ * We implement this in a generic way, such that the Arabic subtending
+ * marks can use it as well.
+ */
+
+static void
+record_stch (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
+ if (!arabic_plan->has_stch)
+ return;
+
+ /* 'stch' feature was just applied. Look for anything that multiplied,
+ * and record it for stch treatment later. Note that rtlm, frac, etc
+ * are applied before stch, but we assume that they didn't result in
+ * anything multiplying into 5 pieces, so it's safe-ish... */
+
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ for (unsigned int i = 0; i < count; i++)
+ if (unlikely (_hb_glyph_info_multiplied (&info[i])))
+ {
+ unsigned int comp = _hb_glyph_info_get_lig_comp (&info[i]);
+ info[i].arabic_shaping_action() = comp % 2 ? STCH_REPEATING : STCH_FIXED;
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH;
+ }
+}
+
+static void
+apply_stch (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font)
+{
+ if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH)))
+ return;
+
+ /* The Arabic shaper currently always processes in RTL mode, so we should
+ * stretch / position the stretched pieces to the left / preceding glyphs. */
+
+ /* We do a two pass implementation:
+ * First pass calculates the exact number of extra glyphs we need,
+ * We then enlarge buffer to have that much room,
+ * Second pass applies the stretch, copying things to the end of buffer.
+ */
+
+ int sign = font->x_scale < 0 ? -1 : +1;
+ unsigned int extra_glyphs_needed = 0; // Set during MEASURE, used during CUT
+ typedef enum { MEASURE, CUT } step_t;
+
+ for (step_t step = MEASURE; step <= CUT; step = (step_t) (step + 1))
+ {
+ unsigned int count = buffer->len;
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+ unsigned int new_len = count + extra_glyphs_needed; // write head during CUT
+ unsigned int j = new_len;
+ for (unsigned int i = count; i; i--)
+ {
+ if (!hb_in_range (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+ {
+ if (step == CUT)
+ {
+ --j;
+ info[j] = info[i - 1];
+ pos[j] = pos[i - 1];
+ }
+ continue;
+ }
+
+ /* Yay, justification! */
+
+ hb_position_t w_total = 0; // Total to be filled
+ hb_position_t w_fixed = 0; // Sum of fixed tiles
+ hb_position_t w_repeating = 0; // Sum of repeating tiles
+ int n_fixed = 0;
+ int n_repeating = 0;
+
+ unsigned int end = i;
+ while (i &&
+ hb_in_range (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING))
+ {
+ i--;
+ hb_position_t width = font->get_glyph_h_advance (info[i].codepoint);
+ if (info[i].arabic_shaping_action() == STCH_FIXED)
+ {
+ w_fixed += width;
+ n_fixed++;
+ }
+ else
+ {
+ w_repeating += width;
+ n_repeating++;
+ }
+ }
+ unsigned int start = i;
+ unsigned int context = i;
+ while (context &&
+ !hb_in_range (info[context - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING) &&
+ (_hb_glyph_info_is_default_ignorable (&info[context - 1]) ||
+ HB_ARABIC_GENERAL_CATEGORY_IS_WORD (_hb_glyph_info_get_general_category (&info[context - 1]))))
+ {
+ context--;
+ w_total += pos[context].x_advance;
+ }
+ i++; // Don't touch i again.
+
+ DEBUG_MSG (ARABIC, NULL, "%s stretch at (%d,%d,%d)",
+ step == MEASURE ? "measuring" : "cutting", context, start, end);
+ DEBUG_MSG (ARABIC, NULL, "rest of word: count=%d width %d", start - context, w_total);
+ DEBUG_MSG (ARABIC, NULL, "fixed tiles: count=%d width=%d", n_fixed, w_fixed);
+ DEBUG_MSG (ARABIC, NULL, "repeating tiles: count=%d width=%d", n_repeating, w_repeating);
+
+ /* Number of additional times to repeat each repeating tile. */
+ int n_copies = 0;
+
+ hb_position_t w_remaining = w_total - w_fixed;
+ if (sign * w_remaining > sign * w_repeating && sign * w_repeating > 0)
+ n_copies = (sign * w_remaining) / (sign * w_repeating) - 1;
+
+ /* See if we can improve the fit by adding an extra repeat and squeezing them together a bit. */
+ hb_position_t extra_repeat_overlap = 0;
+ hb_position_t shortfall = sign * w_remaining - sign * w_repeating * (n_copies + 1);
+ if (shortfall > 0)
+ {
+ ++n_copies;
+ hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
+ if (excess > 0)
+ extra_repeat_overlap = excess / (n_copies * n_repeating);
+ }
+
+ if (step == MEASURE)
+ {
+ extra_glyphs_needed += n_copies * n_repeating;
+ DEBUG_MSG (ARABIC, NULL, "will add extra %d copies of repeating tiles", n_copies);
+ }
+ else
+ {
+ hb_position_t x_offset = 0;
+ for (unsigned int k = end; k > start; k--)
+ {
+ hb_position_t width = font->get_glyph_h_advance (info[k - 1].codepoint);
+
+ unsigned int repeat = 1;
+ if (info[k - 1].arabic_shaping_action() == STCH_REPEATING)
+ repeat += n_copies;
+
+ DEBUG_MSG (ARABIC, NULL, "appending %d copies of glyph %d; j=%d",
+ repeat, info[k - 1].codepoint, j);
+ for (unsigned int n = 0; n < repeat; n++)
+ {
+ x_offset -= width;
+ if (n > 0)
+ x_offset += extra_repeat_overlap;
+ pos[k - 1].x_offset = x_offset;
+ /* Append copy. */
+ --j;
+ info[j] = info[k - 1];
+ pos[j] = pos[k - 1];
+ }
+ }
+ }
+ }
+
+ if (step == MEASURE)
+ {
+ if (unlikely (!buffer->ensure (count + extra_glyphs_needed)))
+ break;
+ }
+ else
+ {
+ assert (j == 0);
+ buffer->len = new_len;
+ }
+ }
+}
+
+
+static void
+postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font)
+{
+ apply_stch (plan, buffer, font);
+
+ HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action);
+}
const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
{
@@ -379,7 +612,8 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
NULL, /* override_features */
data_create_arabic,
data_destroy_arabic,
- NULL, /* preprocess_text_arabic */
+ NULL, /* preprocess_text */
+ postprocess_glyphs_arabic,
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc
index f7f097eedaa..be60e56feb8 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc
@@ -35,10 +35,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
NULL, /* setup_masks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
true, /* fallback_position */
};
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc
index 8e85d88e7b1..aa907390a84 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc
@@ -188,7 +188,7 @@ preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
*/
unsigned int count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count;)
+ for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
{
hb_codepoint_t u = buffer->cur().codepoint;
@@ -411,13 +411,14 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul =
"hangul",
collect_features_hangul,
override_features_hangul,
- data_create_hangul, /* data_create */
- data_destroy_hangul, /* data_destroy */
+ data_create_hangul,
+ data_destroy_hangul,
preprocess_text_hangul,
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_NONE,
NULL, /* decompose */
NULL, /* compose */
- setup_masks_hangul, /* setup_masks */
+ setup_masks_hangul,
HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
false, /* fallback_position */
};
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc
index ef25badc794..e6fde14dca6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc
@@ -68,7 +68,7 @@ compose_hebrew (const hb_ot_shape_normalize_context_t *c,
0xFB4Au /* TAV */
};
- bool found = c->unicode->compose (a, b, ab);
+ bool found = (bool) c->unicode->compose (a, b, ab);
if (!found && !c->plan->has_mark)
{
@@ -163,6 +163,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
compose_hebrew,
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh
index 5696b0ad610..d3f0beea43a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh
@@ -56,52 +56,52 @@ static const unsigned char _indic_syllable_machine_trans_keys[] = {
5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u,
5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u,
4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u,
- 16u, 16u, 8u, 8u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
+ 16u, 16u, 8u, 8u, 1u, 18u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
+ 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u,
+ 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u,
5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
- 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
- 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
- 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
- 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 4u, 14u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u,
- 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u,
- 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u,
+ 5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u,
+ 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u,
+ 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u,
9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u,
5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u,
- 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u,
- 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u,
- 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+ 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u,
+ 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+ 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+ 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u,
+ 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u,
+ 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u,
+ 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u,
+ 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+ 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
+ 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u,
+ 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
+ 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u,
+ 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u,
+ 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u,
+ 1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u,
+ 5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u,
3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u,
- 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u,
- 1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 5u, 10u, 9u, 10u,
- 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 3u, 31u, 3u, 31u,
- 4u, 31u, 3u, 31u, 3u, 31u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u,
- 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u,
- 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u,
- 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 0
+ 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u,
+ 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u,
+ 9u, 10u, 9u, 9u, 5u, 10u, 0
};
static const char _indic_syllable_machine_key_spans[] = {
@@ -127,52 +127,52 @@ static const char _indic_syllable_machine_key_spans[] = {
3, 4, 3, 1, 4, 3, 1, 4,
3, 1, 1, 16, 6, 5, 1, 1,
5, 1, 1, 5, 1, 1, 5, 1,
- 1, 1, 31, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 10, 10,
+ 1, 1, 18, 15, 15, 14, 16, 15,
+ 15, 14, 16, 15, 15, 14, 16, 15,
+ 15, 14, 16, 15, 15, 14, 10, 10,
6, 2, 1, 2, 2, 1, 6, 11,
8, 6, 8, 11, 12, 12, 11, 10,
12, 11, 10, 12, 11, 10, 12, 11,
- 10, 12, 16, 28, 11, 29, 29, 16,
- 16, 16, 16, 16, 29, 29, 16, 16,
- 16, 16, 16, 29, 29, 16, 16, 16,
- 16, 16, 29, 29, 16, 16, 16, 16,
- 16, 29, 29, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 10, 10,
- 6, 2, 1, 2, 2, 1, 6, 11,
- 8, 6, 8, 11, 12, 12, 11, 10,
- 12, 11, 10, 12, 11, 10, 12, 11,
- 10, 12, 16, 28, 11, 29, 29, 16,
- 16, 16, 16, 16, 29, 29, 16, 16,
- 16, 16, 16, 29, 29, 16, 16, 16,
- 16, 16, 29, 29, 16, 16, 16, 16,
- 11, 16, 29, 29, 28, 16, 29, 29,
- 28, 16, 29, 29, 28, 16, 29, 29,
- 28, 16, 29, 29, 28, 10, 10, 6,
+ 10, 12, 16, 11, 15, 15, 16, 16,
+ 16, 16, 16, 15, 15, 16, 16, 16,
+ 16, 16, 15, 15, 16, 16, 16, 16,
+ 16, 15, 15, 16, 16, 16, 16, 16,
+ 15, 15, 15, 15, 14, 16, 15, 15,
+ 14, 16, 15, 15, 14, 16, 15, 15,
+ 14, 16, 15, 15, 14, 10, 10, 6,
2, 1, 2, 2, 1, 6, 11, 8,
6, 8, 11, 12, 12, 11, 10, 12,
11, 10, 12, 11, 10, 12, 11, 10,
- 12, 16, 28, 11, 29, 29, 16, 16,
- 16, 16, 16, 29, 29, 16, 16, 16,
- 16, 16, 29, 29, 16, 16, 16, 16,
- 16, 29, 29, 16, 16, 16, 16, 16,
- 11, 29, 11, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 16, 29,
- 29, 28, 16, 29, 29, 28, 10, 10,
- 6, 2, 1, 2, 2, 1, 6, 11,
- 8, 6, 8, 11, 12, 12, 11, 10,
+ 12, 16, 11, 15, 15, 16, 16, 16,
+ 16, 16, 15, 15, 16, 16, 16, 16,
+ 16, 15, 15, 16, 16, 16, 16, 16,
+ 15, 15, 16, 16, 16, 16, 11, 16,
+ 15, 15, 14, 16, 15, 15, 14, 16,
+ 15, 15, 14, 16, 15, 15, 14, 16,
+ 15, 15, 14, 10, 10, 6, 2, 1,
+ 2, 2, 1, 6, 11, 8, 6, 8,
+ 11, 12, 12, 11, 10, 12, 11, 10,
+ 12, 11, 10, 12, 11, 10, 12, 16,
+ 11, 15, 15, 16, 16, 16, 16, 16,
+ 15, 15, 16, 16, 16, 16, 16, 15,
+ 15, 16, 16, 16, 16, 16, 15, 15,
+ 16, 16, 16, 16, 16, 11, 15, 11,
+ 15, 15, 14, 16, 15, 15, 14, 16,
+ 15, 15, 14, 16, 15, 15, 14, 16,
+ 15, 15, 14, 10, 10, 6, 2, 1,
+ 2, 2, 1, 6, 11, 8, 6, 8,
+ 11, 12, 12, 11, 10, 12, 11, 10,
+ 12, 11, 10, 12, 11, 10, 12, 16,
+ 11, 15, 15, 16, 16, 16, 16, 16,
+ 15, 15, 16, 16, 16, 16, 16, 15,
+ 15, 16, 16, 16, 16, 16, 15, 15,
+ 16, 16, 16, 16, 16, 15, 17, 15,
+ 17, 11, 6, 2, 1, 2, 2, 1,
+ 6, 16, 15, 15, 14, 15, 15, 16,
12, 11, 10, 12, 11, 10, 12, 11,
- 10, 12, 16, 28, 11, 29, 29, 16,
- 16, 16, 16, 16, 29, 29, 16, 16,
- 16, 16, 16, 29, 29, 16, 16, 16,
- 16, 16, 29, 29, 16, 16, 16, 16,
- 16, 29, 31, 29, 31, 11, 6, 2,
- 1, 2, 2, 1, 6, 16, 29, 29,
- 28, 29, 29, 16, 12, 11, 10, 12,
- 11, 10, 12, 11, 10, 12, 11, 10,
- 11, 8, 6, 8, 11, 16, 8, 6,
- 6, 2, 1, 2, 2, 1, 6
+ 10, 12, 11, 10, 11, 8, 6, 8,
+ 11, 16, 8, 6, 6, 2, 1, 2,
+ 2, 1, 6
};
static const short _indic_syllable_machine_index_offsets[] = {
@@ -198,52 +198,52 @@ static const short _indic_syllable_machine_index_offsets[] = {
954, 958, 963, 967, 969, 974, 978, 980,
985, 989, 991, 993, 1010, 1017, 1023, 1025,
1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053,
- 1055, 1057, 1059, 1091, 1121, 1151, 1180, 1197,
- 1227, 1257, 1286, 1303, 1333, 1363, 1392, 1409,
- 1439, 1469, 1498, 1515, 1545, 1575, 1604, 1615,
- 1626, 1633, 1636, 1638, 1641, 1644, 1646, 1653,
- 1665, 1674, 1681, 1690, 1702, 1715, 1728, 1740,
- 1751, 1764, 1776, 1787, 1800, 1812, 1823, 1836,
- 1848, 1859, 1872, 1889, 1918, 1930, 1960, 1990,
- 2007, 2024, 2041, 2058, 2075, 2105, 2135, 2152,
- 2169, 2186, 2203, 2220, 2250, 2280, 2297, 2314,
- 2331, 2348, 2365, 2395, 2425, 2442, 2459, 2476,
- 2493, 2510, 2540, 2570, 2600, 2630, 2659, 2676,
- 2706, 2736, 2765, 2782, 2812, 2842, 2871, 2888,
- 2918, 2948, 2977, 2994, 3024, 3054, 3083, 3094,
- 3105, 3112, 3115, 3117, 3120, 3123, 3125, 3132,
- 3144, 3153, 3160, 3169, 3181, 3194, 3207, 3219,
- 3230, 3243, 3255, 3266, 3279, 3291, 3302, 3315,
- 3327, 3338, 3351, 3368, 3397, 3409, 3439, 3469,
- 3486, 3503, 3520, 3537, 3554, 3584, 3614, 3631,
- 3648, 3665, 3682, 3699, 3729, 3759, 3776, 3793,
- 3810, 3827, 3844, 3874, 3904, 3921, 3938, 3955,
- 3972, 3984, 4001, 4031, 4061, 4090, 4107, 4137,
- 4167, 4196, 4213, 4243, 4273, 4302, 4319, 4349,
- 4379, 4408, 4425, 4455, 4485, 4514, 4525, 4536,
- 4543, 4546, 4548, 4551, 4554, 4556, 4563, 4575,
- 4584, 4591, 4600, 4612, 4625, 4638, 4650, 4661,
- 4674, 4686, 4697, 4710, 4722, 4733, 4746, 4758,
- 4769, 4782, 4799, 4828, 4840, 4870, 4900, 4917,
- 4934, 4951, 4968, 4985, 5015, 5045, 5062, 5079,
- 5096, 5113, 5130, 5160, 5190, 5207, 5224, 5241,
- 5258, 5275, 5305, 5335, 5352, 5369, 5386, 5403,
- 5420, 5432, 5462, 5474, 5504, 5534, 5563, 5580,
- 5610, 5640, 5669, 5686, 5716, 5746, 5775, 5792,
- 5822, 5852, 5881, 5898, 5928, 5958, 5987, 5998,
- 6009, 6016, 6019, 6021, 6024, 6027, 6029, 6036,
- 6048, 6057, 6064, 6073, 6085, 6098, 6111, 6123,
- 6134, 6147, 6159, 6170, 6183, 6195, 6206, 6219,
- 6231, 6242, 6255, 6272, 6301, 6313, 6343, 6373,
- 6390, 6407, 6424, 6441, 6458, 6488, 6518, 6535,
- 6552, 6569, 6586, 6603, 6633, 6663, 6680, 6697,
- 6714, 6731, 6748, 6778, 6808, 6825, 6842, 6859,
- 6876, 6893, 6923, 6955, 6985, 7017, 7029, 7036,
- 7039, 7041, 7044, 7047, 7049, 7056, 7073, 7103,
- 7133, 7162, 7192, 7222, 7239, 7252, 7264, 7275,
- 7288, 7300, 7311, 7324, 7336, 7347, 7360, 7372,
- 7383, 7395, 7404, 7411, 7420, 7432, 7449, 7458,
- 7465, 7472, 7475, 7477, 7480, 7483, 7485
+ 1055, 1057, 1059, 1078, 1094, 1110, 1125, 1142,
+ 1158, 1174, 1189, 1206, 1222, 1238, 1253, 1270,
+ 1286, 1302, 1317, 1334, 1350, 1366, 1381, 1392,
+ 1403, 1410, 1413, 1415, 1418, 1421, 1423, 1430,
+ 1442, 1451, 1458, 1467, 1479, 1492, 1505, 1517,
+ 1528, 1541, 1553, 1564, 1577, 1589, 1600, 1613,
+ 1625, 1636, 1649, 1666, 1678, 1694, 1710, 1727,
+ 1744, 1761, 1778, 1795, 1811, 1827, 1844, 1861,
+ 1878, 1895, 1912, 1928, 1944, 1961, 1978, 1995,
+ 2012, 2029, 2045, 2061, 2078, 2095, 2112, 2129,
+ 2146, 2162, 2178, 2194, 2210, 2225, 2242, 2258,
+ 2274, 2289, 2306, 2322, 2338, 2353, 2370, 2386,
+ 2402, 2417, 2434, 2450, 2466, 2481, 2492, 2503,
+ 2510, 2513, 2515, 2518, 2521, 2523, 2530, 2542,
+ 2551, 2558, 2567, 2579, 2592, 2605, 2617, 2628,
+ 2641, 2653, 2664, 2677, 2689, 2700, 2713, 2725,
+ 2736, 2749, 2766, 2778, 2794, 2810, 2827, 2844,
+ 2861, 2878, 2895, 2911, 2927, 2944, 2961, 2978,
+ 2995, 3012, 3028, 3044, 3061, 3078, 3095, 3112,
+ 3129, 3145, 3161, 3178, 3195, 3212, 3229, 3241,
+ 3258, 3274, 3290, 3305, 3322, 3338, 3354, 3369,
+ 3386, 3402, 3418, 3433, 3450, 3466, 3482, 3497,
+ 3514, 3530, 3546, 3561, 3572, 3583, 3590, 3593,
+ 3595, 3598, 3601, 3603, 3610, 3622, 3631, 3638,
+ 3647, 3659, 3672, 3685, 3697, 3708, 3721, 3733,
+ 3744, 3757, 3769, 3780, 3793, 3805, 3816, 3829,
+ 3846, 3858, 3874, 3890, 3907, 3924, 3941, 3958,
+ 3975, 3991, 4007, 4024, 4041, 4058, 4075, 4092,
+ 4108, 4124, 4141, 4158, 4175, 4192, 4209, 4225,
+ 4241, 4258, 4275, 4292, 4309, 4326, 4338, 4354,
+ 4366, 4382, 4398, 4413, 4430, 4446, 4462, 4477,
+ 4494, 4510, 4526, 4541, 4558, 4574, 4590, 4605,
+ 4622, 4638, 4654, 4669, 4680, 4691, 4698, 4701,
+ 4703, 4706, 4709, 4711, 4718, 4730, 4739, 4746,
+ 4755, 4767, 4780, 4793, 4805, 4816, 4829, 4841,
+ 4852, 4865, 4877, 4888, 4901, 4913, 4924, 4937,
+ 4954, 4966, 4982, 4998, 5015, 5032, 5049, 5066,
+ 5083, 5099, 5115, 5132, 5149, 5166, 5183, 5200,
+ 5216, 5232, 5249, 5266, 5283, 5300, 5317, 5333,
+ 5349, 5366, 5383, 5400, 5417, 5434, 5450, 5468,
+ 5484, 5502, 5514, 5521, 5524, 5526, 5529, 5532,
+ 5534, 5541, 5558, 5574, 5590, 5605, 5621, 5637,
+ 5654, 5667, 5679, 5690, 5703, 5715, 5726, 5739,
+ 5751, 5762, 5775, 5787, 5798, 5810, 5819, 5826,
+ 5835, 5847, 5864, 5873, 5880, 5887, 5890, 5892,
+ 5895, 5898, 5900
};
static const short _indic_syllable_machine_indicies[] = {
@@ -381,882 +381,684 @@ static const short _indic_syllable_machine_indicies[] = {
161, 161, 162, 157, 0, 183, 0, 184,
0, 186, 185, 188, 189, 190, 191, 192,
193, 84, 79, 194, 195, 196, 196, 156,
- 197, 198, 199, 200, 201, 187, 187, 187,
- 187, 187, 187, 187, 187, 187, 187, 187,
- 187, 202, 187, 204, 205, 206, 207, 6,
- 1, 208, 209, 203, 203, 38, 210, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 213, 205, 214, 214, 6, 1, 208,
- 209, 203, 203, 203, 210, 203, 203, 211,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 212, 203, 205,
- 214, 214, 6, 1, 208, 209, 203, 203,
- 203, 210, 203, 203, 211, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 212, 203, 215, 203, 203, 203,
- 19, 216, 203, 1, 208, 209, 203, 203,
- 203, 217, 203, 215, 203, 218, 219, 220,
- 221, 6, 1, 208, 209, 203, 203, 36,
- 222, 203, 203, 211, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 212, 203, 223, 219, 224, 224, 6,
- 1, 208, 209, 203, 203, 203, 222, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 219, 224, 224, 6, 1, 208, 209,
- 203, 203, 203, 222, 203, 203, 211, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 212, 203, 225, 203,
- 203, 203, 19, 226, 203, 1, 208, 209,
- 203, 203, 203, 217, 203, 225, 203, 227,
- 228, 229, 230, 6, 1, 208, 209, 203,
- 203, 34, 231, 203, 203, 211, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 212, 203, 232, 228, 233,
- 233, 6, 1, 208, 209, 203, 203, 203,
- 231, 203, 203, 211, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 212, 203, 228, 233, 233, 6, 1,
- 208, 209, 203, 203, 203, 231, 203, 203,
- 211, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 212, 203,
- 234, 203, 203, 203, 19, 235, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 234,
- 203, 236, 237, 238, 239, 6, 1, 208,
- 209, 203, 203, 32, 240, 203, 203, 211,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 212, 203, 241,
- 237, 242, 242, 6, 1, 208, 209, 203,
- 203, 203, 240, 203, 203, 211, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 212, 203, 237, 242, 242,
- 6, 1, 208, 209, 203, 203, 203, 240,
- 203, 203, 211, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 212, 203, 243, 203, 203, 203, 19, 244,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 243, 203, 245, 246, 247, 248, 6,
- 1, 208, 209, 203, 203, 30, 249, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 250, 246, 251, 251, 6, 1, 208,
- 209, 203, 203, 203, 249, 203, 203, 211,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 212, 203, 246,
- 251, 251, 6, 1, 208, 209, 203, 203,
- 203, 249, 203, 203, 211, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 212, 203, 19, 252, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 253,
- 253, 203, 1, 208, 209, 203, 203, 203,
- 217, 203, 254, 203, 203, 255, 208, 209,
- 203, 208, 209, 203, 256, 203, 208, 257,
- 203, 208, 258, 203, 208, 203, 254, 203,
- 203, 203, 208, 209, 203, 259, 203, 260,
- 261, 203, 1, 208, 209, 203, 203, 4,
- 203, 3, 203, 253, 253, 203, 1, 208,
- 209, 203, 253, 253, 203, 1, 208, 209,
- 203, 259, 203, 253, 253, 203, 1, 208,
- 209, 203, 259, 203, 260, 253, 203, 1,
- 208, 209, 203, 203, 4, 203, 19, 203,
- 262, 262, 6, 1, 208, 209, 203, 203,
- 203, 217, 203, 263, 28, 264, 265, 9,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 28, 264, 265, 9, 1, 208, 209, 203,
- 203, 203, 217, 203, 264, 264, 9, 1,
- 208, 209, 203, 203, 203, 217, 203, 266,
- 25, 267, 268, 12, 1, 208, 209, 203,
- 203, 203, 217, 203, 25, 267, 268, 12,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 267, 267, 12, 1, 208, 209, 203, 203,
- 203, 217, 203, 269, 22, 270, 271, 15,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 22, 270, 271, 15, 1, 208, 209, 203,
- 203, 203, 217, 203, 270, 270, 15, 1,
- 208, 209, 203, 203, 203, 217, 203, 272,
- 19, 253, 273, 203, 1, 208, 209, 203,
- 203, 203, 217, 203, 19, 253, 273, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 253, 274, 203, 1, 208, 209, 203, 203,
- 203, 217, 203, 19, 203, 253, 253, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 2, 3, 203, 203, 19, 252, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 2,
- 203, 246, 251, 251, 6, 1, 208, 209,
- 203, 203, 203, 249, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 212, 203, 246, 251,
- 251, 6, 1, 208, 209, 203, 203, 203,
- 249, 203, 245, 246, 251, 251, 6, 1,
- 208, 209, 203, 203, 203, 249, 203, 203,
- 211, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 212, 203,
- 245, 246, 247, 251, 6, 1, 208, 209,
- 203, 203, 30, 249, 203, 203, 211, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 212, 203, 243, 203,
- 275, 203, 262, 262, 6, 1, 208, 209,
- 203, 203, 203, 217, 203, 243, 203, 243,
- 203, 203, 203, 253, 253, 203, 1, 208,
- 209, 203, 203, 203, 217, 203, 243, 203,
- 243, 203, 203, 203, 253, 276, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 243,
- 203, 243, 203, 275, 203, 253, 253, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 243, 203, 243, 3, 203, 203, 19, 244,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 243, 203, 236, 237, 242, 242, 6,
- 1, 208, 209, 203, 203, 203, 240, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 236, 237, 238, 242, 6, 1, 208,
- 209, 203, 203, 32, 240, 203, 203, 211,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 212, 203, 234,
- 203, 277, 203, 262, 262, 6, 1, 208,
- 209, 203, 203, 203, 217, 203, 234, 203,
- 234, 203, 203, 203, 253, 253, 203, 1,
- 208, 209, 203, 203, 203, 217, 203, 234,
- 203, 234, 203, 203, 203, 253, 278, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 234, 203, 234, 203, 277, 203, 253, 253,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 234, 203, 234, 3, 203, 203, 19,
- 235, 203, 1, 208, 209, 203, 203, 203,
- 217, 203, 234, 203, 227, 228, 233, 233,
- 6, 1, 208, 209, 203, 203, 203, 231,
- 203, 203, 211, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 212, 203, 227, 228, 229, 233, 6, 1,
- 208, 209, 203, 203, 34, 231, 203, 203,
- 211, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 212, 203,
- 225, 203, 279, 203, 262, 262, 6, 1,
- 208, 209, 203, 203, 203, 217, 203, 225,
- 203, 225, 203, 203, 203, 253, 253, 203,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 225, 203, 225, 203, 203, 203, 253, 280,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 225, 203, 225, 203, 279, 203, 253,
- 253, 203, 1, 208, 209, 203, 203, 203,
- 217, 203, 225, 203, 225, 3, 203, 203,
- 19, 226, 203, 1, 208, 209, 203, 203,
- 203, 217, 203, 225, 203, 218, 219, 224,
- 224, 6, 1, 208, 209, 203, 203, 203,
- 222, 203, 203, 211, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 212, 203, 218, 219, 220, 224, 6,
- 1, 208, 209, 203, 203, 36, 222, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 215, 203, 281, 203, 262, 262, 6,
- 1, 208, 209, 203, 203, 203, 217, 203,
- 215, 203, 215, 203, 203, 203, 253, 253,
- 203, 1, 208, 209, 203, 203, 203, 217,
- 203, 215, 203, 215, 203, 203, 203, 253,
- 282, 203, 1, 208, 209, 203, 203, 203,
- 217, 203, 215, 203, 215, 203, 281, 203,
- 253, 253, 203, 1, 208, 209, 203, 203,
- 203, 217, 203, 215, 203, 215, 3, 203,
- 203, 19, 216, 203, 1, 208, 209, 203,
- 203, 203, 217, 203, 215, 203, 204, 205,
- 214, 214, 6, 1, 208, 209, 203, 203,
- 203, 210, 203, 203, 211, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 212, 203, 204, 205, 206, 214,
- 6, 1, 208, 209, 203, 203, 38, 210,
- 203, 203, 211, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 212, 203, 284, 285, 286, 287, 45, 40,
- 288, 289, 283, 283, 77, 290, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 293, 285, 294, 287, 45, 40, 288, 289,
- 283, 283, 283, 290, 283, 283, 291, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 292, 283, 285, 294,
- 287, 45, 40, 288, 289, 283, 283, 283,
- 290, 283, 283, 291, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 292, 283, 295, 283, 283, 283, 58,
- 296, 283, 40, 288, 289, 283, 283, 283,
- 297, 283, 295, 283, 298, 299, 300, 301,
- 45, 40, 288, 289, 283, 283, 75, 302,
- 283, 283, 291, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 292, 283, 303, 299, 304, 304, 45, 40,
- 288, 289, 283, 283, 283, 302, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 299, 304, 304, 45, 40, 288, 289, 283,
- 283, 283, 302, 283, 283, 291, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 292, 283, 305, 283, 283,
- 283, 58, 306, 283, 40, 288, 289, 283,
- 283, 283, 297, 283, 305, 283, 307, 308,
- 309, 310, 45, 40, 288, 289, 283, 283,
- 73, 311, 283, 283, 291, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 292, 283, 312, 308, 313, 313,
- 45, 40, 288, 289, 283, 283, 283, 311,
- 283, 283, 291, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 292, 283, 308, 313, 313, 45, 40, 288,
- 289, 283, 283, 283, 311, 283, 283, 291,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 292, 283, 314,
- 283, 283, 283, 58, 315, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 314, 283,
- 316, 317, 318, 319, 45, 40, 288, 289,
- 283, 283, 71, 320, 283, 283, 291, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 292, 283, 321, 317,
- 322, 322, 45, 40, 288, 289, 283, 283,
- 283, 320, 283, 283, 291, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 292, 283, 317, 322, 322, 45,
- 40, 288, 289, 283, 283, 283, 320, 283,
- 283, 291, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 292,
- 283, 323, 283, 283, 283, 58, 324, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 323, 283, 325, 326, 327, 328, 45, 40,
- 288, 289, 283, 283, 69, 329, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 330, 326, 331, 331, 45, 40, 288, 289,
- 283, 283, 283, 329, 283, 283, 291, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 292, 283, 326, 331,
- 331, 45, 40, 288, 289, 283, 283, 283,
- 329, 283, 283, 291, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 292, 283, 58, 332, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 333, 333,
- 283, 40, 288, 289, 283, 283, 283, 297,
- 283, 334, 283, 283, 335, 288, 289, 283,
- 288, 289, 283, 336, 283, 288, 337, 283,
- 288, 338, 283, 288, 283, 334, 283, 283,
- 283, 288, 289, 283, 339, 283, 340, 341,
- 283, 40, 288, 289, 283, 283, 43, 283,
- 42, 283, 333, 333, 283, 40, 288, 289,
- 283, 333, 333, 283, 40, 288, 289, 283,
- 339, 283, 333, 333, 283, 40, 288, 289,
- 283, 339, 283, 340, 333, 283, 40, 288,
- 289, 283, 283, 43, 283, 58, 283, 342,
- 342, 45, 40, 288, 289, 283, 283, 283,
- 297, 283, 343, 67, 344, 345, 48, 40,
- 288, 289, 283, 283, 283, 297, 283, 67,
- 344, 345, 48, 40, 288, 289, 283, 283,
- 283, 297, 283, 344, 344, 48, 40, 288,
- 289, 283, 283, 283, 297, 283, 346, 64,
- 347, 348, 51, 40, 288, 289, 283, 283,
- 283, 297, 283, 64, 347, 348, 51, 40,
- 288, 289, 283, 283, 283, 297, 283, 347,
- 347, 51, 40, 288, 289, 283, 283, 283,
- 297, 283, 349, 61, 350, 351, 54, 40,
- 288, 289, 283, 283, 283, 297, 283, 61,
- 350, 351, 54, 40, 288, 289, 283, 283,
- 283, 297, 283, 350, 350, 54, 40, 288,
- 289, 283, 283, 283, 297, 283, 352, 58,
- 333, 353, 283, 40, 288, 289, 283, 283,
- 283, 297, 283, 58, 333, 353, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 333,
- 354, 283, 40, 288, 289, 283, 283, 283,
- 297, 283, 58, 283, 333, 333, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 41,
- 42, 283, 283, 58, 332, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 41, 283,
- 326, 331, 331, 45, 40, 288, 289, 283,
- 283, 283, 329, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 292, 283, 326, 331, 331,
- 45, 40, 288, 289, 283, 283, 283, 329,
- 283, 325, 326, 331, 331, 45, 40, 288,
- 289, 283, 283, 283, 329, 283, 283, 291,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 292, 283, 325,
- 326, 327, 331, 45, 40, 288, 289, 283,
- 283, 69, 329, 283, 283, 291, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 292, 283, 323, 283, 355,
- 283, 342, 342, 45, 40, 288, 289, 283,
- 283, 283, 297, 283, 323, 283, 323, 283,
- 283, 283, 333, 333, 283, 40, 288, 289,
- 283, 283, 283, 297, 283, 323, 283, 323,
- 283, 283, 283, 333, 356, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 323, 283,
- 323, 283, 355, 283, 333, 333, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 323,
- 283, 323, 42, 283, 283, 58, 324, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 323, 283, 316, 317, 322, 322, 45, 40,
- 288, 289, 283, 283, 283, 320, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 316, 317, 318, 322, 45, 40, 288, 289,
- 283, 283, 71, 320, 283, 283, 291, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 292, 283, 314, 283,
- 357, 283, 342, 342, 45, 40, 288, 289,
- 283, 283, 283, 297, 283, 314, 283, 314,
- 283, 283, 283, 333, 333, 283, 40, 288,
- 289, 283, 283, 283, 297, 283, 314, 283,
- 314, 283, 283, 283, 333, 358, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 314,
- 283, 314, 283, 357, 283, 333, 333, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 314, 283, 314, 42, 283, 283, 58, 315,
- 283, 40, 288, 289, 283, 283, 283, 297,
- 283, 314, 283, 307, 308, 313, 313, 45,
- 40, 288, 289, 283, 283, 283, 311, 283,
- 283, 291, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 292,
- 283, 307, 308, 309, 313, 45, 40, 288,
- 289, 283, 283, 73, 311, 283, 283, 291,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 292, 283, 305,
- 283, 359, 283, 342, 342, 45, 40, 288,
- 289, 283, 283, 283, 297, 283, 305, 283,
- 305, 283, 283, 283, 333, 333, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 305,
- 283, 305, 283, 283, 283, 333, 360, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 305, 283, 305, 283, 359, 283, 333, 333,
- 283, 40, 288, 289, 283, 283, 283, 297,
- 283, 305, 283, 305, 42, 283, 283, 58,
- 306, 283, 40, 288, 289, 283, 283, 283,
- 297, 283, 305, 283, 298, 299, 304, 304,
- 45, 40, 288, 289, 283, 283, 283, 302,
- 283, 283, 291, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 292, 283, 298, 299, 300, 304, 45, 40,
- 288, 289, 283, 283, 75, 302, 283, 283,
- 291, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 283, 292, 283,
- 295, 283, 361, 283, 342, 342, 45, 40,
- 288, 289, 283, 283, 283, 297, 283, 295,
- 283, 295, 283, 283, 283, 333, 333, 283,
- 40, 288, 289, 283, 283, 283, 297, 283,
- 295, 283, 295, 283, 283, 283, 333, 362,
- 283, 40, 288, 289, 283, 283, 283, 297,
- 283, 295, 283, 295, 283, 361, 283, 333,
- 333, 283, 40, 288, 289, 283, 283, 283,
- 297, 283, 295, 283, 76, 44, 44, 45,
- 40, 283, 283, 283, 283, 283, 76, 283,
- 295, 42, 283, 283, 58, 296, 283, 40,
- 288, 289, 283, 283, 283, 297, 283, 295,
- 283, 284, 285, 294, 287, 45, 40, 288,
- 289, 283, 283, 283, 290, 283, 283, 291,
- 283, 283, 283, 283, 283, 283, 283, 283,
- 283, 283, 283, 283, 283, 292, 283, 364,
- 191, 365, 365, 84, 79, 194, 195, 363,
- 363, 363, 197, 363, 363, 200, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 202, 363, 191, 365, 365,
- 84, 79, 194, 195, 363, 363, 363, 197,
- 363, 363, 200, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 202, 363, 366, 363, 363, 363, 98, 367,
- 363, 79, 194, 195, 363, 363, 363, 368,
- 363, 366, 363, 369, 370, 371, 372, 84,
- 79, 194, 195, 363, 363, 115, 373, 363,
- 363, 200, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 202,
- 363, 374, 370, 375, 375, 84, 79, 194,
- 195, 363, 363, 363, 373, 363, 363, 200,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 202, 363, 370,
- 375, 375, 84, 79, 194, 195, 363, 363,
- 363, 373, 363, 363, 200, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 202, 363, 376, 363, 363, 363,
- 98, 377, 363, 79, 194, 195, 363, 363,
- 363, 368, 363, 376, 363, 378, 379, 380,
- 381, 84, 79, 194, 195, 363, 363, 113,
- 382, 363, 363, 200, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 202, 363, 383, 379, 384, 384, 84,
- 79, 194, 195, 363, 363, 363, 382, 363,
- 363, 200, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 202,
- 363, 379, 384, 384, 84, 79, 194, 195,
- 363, 363, 363, 382, 363, 363, 200, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 202, 363, 385, 363,
- 363, 363, 98, 386, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 385, 363, 387,
- 388, 389, 390, 84, 79, 194, 195, 363,
- 363, 111, 391, 363, 363, 200, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 202, 363, 392, 388, 393,
- 393, 84, 79, 194, 195, 363, 363, 363,
- 391, 363, 363, 200, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 202, 363, 388, 393, 393, 84, 79,
- 194, 195, 363, 363, 363, 391, 363, 363,
- 200, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 202, 363,
- 394, 363, 363, 363, 98, 395, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 394,
- 363, 396, 397, 398, 399, 84, 79, 194,
- 195, 363, 363, 109, 400, 363, 363, 200,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 202, 363, 401,
- 397, 402, 402, 84, 79, 194, 195, 363,
- 363, 363, 400, 363, 363, 200, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 202, 363, 397, 402, 402,
- 84, 79, 194, 195, 363, 363, 363, 400,
- 363, 363, 200, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 202, 363, 98, 403, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 404, 404, 363,
- 79, 194, 195, 363, 363, 363, 368, 363,
- 405, 363, 363, 406, 194, 195, 363, 194,
- 195, 363, 407, 363, 194, 408, 363, 194,
- 409, 363, 194, 363, 405, 363, 363, 363,
- 194, 195, 363, 410, 363, 411, 412, 363,
- 79, 194, 195, 363, 363, 82, 363, 81,
- 363, 404, 404, 363, 79, 194, 195, 363,
- 404, 404, 363, 79, 194, 195, 363, 410,
- 363, 404, 404, 363, 79, 194, 195, 363,
- 410, 363, 411, 404, 363, 79, 194, 195,
- 363, 363, 82, 363, 98, 363, 413, 413,
- 84, 79, 194, 195, 363, 363, 363, 368,
- 363, 414, 107, 415, 416, 88, 79, 194,
- 195, 363, 363, 363, 368, 363, 107, 415,
- 416, 88, 79, 194, 195, 363, 363, 363,
- 368, 363, 415, 415, 88, 79, 194, 195,
- 363, 363, 363, 368, 363, 417, 104, 418,
- 419, 91, 79, 194, 195, 363, 363, 363,
- 368, 363, 104, 418, 419, 91, 79, 194,
- 195, 363, 363, 363, 368, 363, 418, 418,
- 91, 79, 194, 195, 363, 363, 363, 368,
- 363, 420, 101, 421, 422, 94, 79, 194,
- 195, 363, 363, 363, 368, 363, 101, 421,
- 422, 94, 79, 194, 195, 363, 363, 363,
- 368, 363, 421, 421, 94, 79, 194, 195,
- 363, 363, 363, 368, 363, 423, 98, 404,
- 424, 363, 79, 194, 195, 363, 363, 363,
- 368, 363, 98, 404, 424, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 404, 425,
- 363, 79, 194, 195, 363, 363, 363, 368,
- 363, 98, 363, 404, 404, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 80, 81,
- 363, 363, 98, 403, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 80, 363, 397,
- 402, 402, 84, 79, 194, 195, 363, 363,
- 363, 400, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 202, 363, 397, 402, 402, 84,
- 79, 194, 195, 363, 363, 363, 400, 363,
- 396, 397, 402, 402, 84, 79, 194, 195,
- 363, 363, 363, 400, 363, 363, 200, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 202, 363, 396, 397,
- 398, 402, 84, 79, 194, 195, 363, 363,
- 109, 400, 363, 363, 200, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 202, 363, 394, 363, 426, 363,
- 413, 413, 84, 79, 194, 195, 363, 363,
- 363, 368, 363, 394, 363, 394, 363, 363,
- 363, 404, 404, 363, 79, 194, 195, 363,
- 363, 363, 368, 363, 394, 363, 394, 363,
- 363, 363, 404, 427, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 394, 363, 394,
- 363, 426, 363, 404, 404, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 394, 363,
- 394, 81, 363, 363, 98, 395, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 394,
- 363, 387, 388, 393, 393, 84, 79, 194,
- 195, 363, 363, 363, 391, 363, 363, 200,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 202, 363, 387,
- 388, 389, 393, 84, 79, 194, 195, 363,
- 363, 111, 391, 363, 363, 200, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 202, 363, 385, 363, 428,
- 363, 413, 413, 84, 79, 194, 195, 363,
- 363, 363, 368, 363, 385, 363, 385, 363,
- 363, 363, 404, 404, 363, 79, 194, 195,
- 363, 363, 363, 368, 363, 385, 363, 385,
- 363, 363, 363, 404, 429, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 385, 363,
- 385, 363, 428, 363, 404, 404, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 385,
- 363, 385, 81, 363, 363, 98, 386, 363,
- 79, 194, 195, 363, 363, 363, 368, 363,
- 385, 363, 378, 379, 384, 384, 84, 79,
- 194, 195, 363, 363, 363, 382, 363, 363,
- 200, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 202, 363,
- 378, 379, 380, 384, 84, 79, 194, 195,
- 363, 363, 113, 382, 363, 363, 200, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 202, 363, 376, 363,
- 430, 363, 413, 413, 84, 79, 194, 195,
- 363, 363, 363, 368, 363, 376, 363, 376,
- 363, 363, 363, 404, 404, 363, 79, 194,
- 195, 363, 363, 363, 368, 363, 376, 363,
- 376, 363, 363, 363, 404, 431, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 376,
- 363, 376, 363, 430, 363, 404, 404, 363,
- 79, 194, 195, 363, 363, 363, 368, 363,
- 376, 363, 376, 81, 363, 363, 98, 377,
- 363, 79, 194, 195, 363, 363, 363, 368,
- 363, 376, 363, 369, 370, 375, 375, 84,
- 79, 194, 195, 363, 363, 363, 373, 363,
- 363, 200, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 202,
- 363, 369, 370, 371, 375, 84, 79, 194,
- 195, 363, 363, 115, 373, 363, 363, 200,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 202, 363, 366,
- 363, 432, 363, 413, 413, 84, 79, 194,
- 195, 363, 363, 363, 368, 363, 366, 363,
- 366, 363, 363, 363, 404, 404, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 366,
- 363, 366, 363, 363, 363, 404, 433, 363,
- 79, 194, 195, 363, 363, 363, 368, 363,
- 366, 363, 366, 363, 432, 363, 404, 404,
- 363, 79, 194, 195, 363, 363, 363, 368,
- 363, 366, 363, 366, 81, 363, 363, 98,
- 367, 363, 79, 194, 195, 363, 363, 363,
- 368, 363, 366, 363, 116, 83, 83, 84,
- 79, 434, 434, 434, 434, 156, 116, 434,
- 190, 191, 365, 365, 84, 79, 194, 195,
- 363, 363, 363, 197, 363, 363, 200, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 363, 363, 363, 202, 363, 116, 83,
- 83, 84, 79, 434, 434, 434, 434, 434,
- 116, 434, 436, 437, 438, 439, 123, 118,
- 440, 441, 435, 435, 155, 442, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 445, 437, 439, 439, 123, 118, 440, 441,
- 435, 435, 435, 442, 435, 435, 443, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 444, 435, 437, 439,
- 439, 123, 118, 440, 441, 435, 435, 435,
- 442, 435, 435, 443, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 444, 435, 446, 435, 435, 435, 136,
- 447, 435, 118, 440, 441, 435, 435, 435,
- 448, 435, 446, 435, 449, 450, 451, 452,
- 123, 118, 440, 441, 435, 435, 153, 453,
- 435, 435, 443, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 444, 435, 454, 450, 455, 455, 123, 118,
- 440, 441, 435, 435, 435, 453, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 450, 455, 455, 123, 118, 440, 441, 435,
- 435, 435, 453, 435, 435, 443, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 444, 435, 456, 435, 435,
- 435, 136, 457, 435, 118, 440, 441, 435,
- 435, 435, 448, 435, 456, 435, 458, 459,
- 460, 461, 123, 118, 440, 441, 435, 435,
- 151, 462, 435, 435, 443, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 444, 435, 463, 459, 464, 464,
- 123, 118, 440, 441, 435, 435, 435, 462,
- 435, 435, 443, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 444, 435, 459, 464, 464, 123, 118, 440,
- 441, 435, 435, 435, 462, 435, 435, 443,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 444, 435, 465,
- 435, 435, 435, 136, 466, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 465, 435,
- 467, 468, 469, 470, 123, 118, 440, 441,
- 435, 435, 149, 471, 435, 435, 443, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 444, 435, 472, 468,
- 473, 473, 123, 118, 440, 441, 435, 435,
- 435, 471, 435, 435, 443, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 444, 435, 468, 473, 473, 123,
- 118, 440, 441, 435, 435, 435, 471, 435,
- 435, 443, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 444,
- 435, 474, 435, 435, 435, 136, 475, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 474, 435, 476, 477, 478, 479, 123, 118,
- 440, 441, 435, 435, 147, 480, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 481, 477, 482, 482, 123, 118, 440, 441,
- 435, 435, 435, 480, 435, 435, 443, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 444, 435, 477, 482,
- 482, 123, 118, 440, 441, 435, 435, 435,
- 480, 435, 435, 443, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 444, 435, 136, 483, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 484, 484,
- 435, 118, 440, 441, 435, 435, 435, 448,
- 435, 485, 435, 435, 486, 440, 441, 435,
- 440, 441, 435, 487, 435, 440, 488, 435,
- 440, 489, 435, 440, 435, 485, 435, 435,
- 435, 440, 441, 435, 490, 435, 491, 492,
- 435, 118, 440, 441, 435, 435, 121, 435,
- 120, 435, 484, 484, 435, 118, 440, 441,
- 435, 484, 484, 435, 118, 440, 441, 435,
- 490, 435, 484, 484, 435, 118, 440, 441,
- 435, 490, 435, 491, 484, 435, 118, 440,
- 441, 435, 435, 121, 435, 136, 435, 493,
- 493, 123, 118, 440, 441, 435, 435, 435,
- 448, 435, 494, 145, 495, 496, 126, 118,
- 440, 441, 435, 435, 435, 448, 435, 145,
- 495, 496, 126, 118, 440, 441, 435, 435,
- 435, 448, 435, 495, 495, 126, 118, 440,
- 441, 435, 435, 435, 448, 435, 497, 142,
- 498, 499, 129, 118, 440, 441, 435, 435,
- 435, 448, 435, 142, 498, 499, 129, 118,
- 440, 441, 435, 435, 435, 448, 435, 498,
- 498, 129, 118, 440, 441, 435, 435, 435,
- 448, 435, 500, 139, 501, 502, 132, 118,
- 440, 441, 435, 435, 435, 448, 435, 139,
- 501, 502, 132, 118, 440, 441, 435, 435,
- 435, 448, 435, 501, 501, 132, 118, 440,
- 441, 435, 435, 435, 448, 435, 503, 136,
- 484, 504, 435, 118, 440, 441, 435, 435,
- 435, 448, 435, 136, 484, 504, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 484,
- 505, 435, 118, 440, 441, 435, 435, 435,
- 448, 435, 136, 435, 484, 484, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 119,
- 120, 435, 435, 136, 483, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 119, 435,
- 477, 482, 482, 123, 118, 440, 441, 435,
- 435, 435, 480, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 444, 435, 477, 482, 482,
- 123, 118, 440, 441, 435, 435, 435, 480,
- 435, 476, 477, 482, 482, 123, 118, 440,
- 441, 435, 435, 435, 480, 435, 435, 443,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 444, 435, 476,
- 477, 478, 482, 123, 118, 440, 441, 435,
- 435, 147, 480, 435, 435, 443, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 444, 435, 474, 435, 506,
- 435, 493, 493, 123, 118, 440, 441, 435,
- 435, 435, 448, 435, 474, 435, 474, 435,
- 435, 435, 484, 484, 435, 118, 440, 441,
- 435, 435, 435, 448, 435, 474, 435, 474,
- 435, 435, 435, 484, 507, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 474, 435,
- 474, 435, 506, 435, 484, 484, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 474,
- 435, 474, 120, 435, 435, 136, 475, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 474, 435, 467, 468, 473, 473, 123, 118,
- 440, 441, 435, 435, 435, 471, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 467, 468, 469, 473, 123, 118, 440, 441,
- 435, 435, 149, 471, 435, 435, 443, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 444, 435, 465, 435,
- 508, 435, 493, 493, 123, 118, 440, 441,
- 435, 435, 435, 448, 435, 465, 435, 465,
- 435, 435, 435, 484, 484, 435, 118, 440,
- 441, 435, 435, 435, 448, 435, 465, 435,
- 465, 435, 435, 435, 484, 509, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 465,
- 435, 465, 435, 508, 435, 484, 484, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 465, 435, 465, 120, 435, 435, 136, 466,
- 435, 118, 440, 441, 435, 435, 435, 448,
- 435, 465, 435, 458, 459, 464, 464, 123,
- 118, 440, 441, 435, 435, 435, 462, 435,
- 435, 443, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 444,
- 435, 458, 459, 460, 464, 123, 118, 440,
- 441, 435, 435, 151, 462, 435, 435, 443,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 444, 435, 456,
- 435, 510, 435, 493, 493, 123, 118, 440,
- 441, 435, 435, 435, 448, 435, 456, 435,
- 456, 435, 435, 435, 484, 484, 435, 118,
- 440, 441, 435, 435, 435, 448, 435, 456,
- 435, 456, 435, 435, 435, 484, 511, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 456, 435, 456, 435, 510, 435, 484, 484,
- 435, 118, 440, 441, 435, 435, 435, 448,
- 435, 456, 435, 456, 120, 435, 435, 136,
- 457, 435, 118, 440, 441, 435, 435, 435,
- 448, 435, 456, 435, 449, 450, 455, 455,
- 123, 118, 440, 441, 435, 435, 435, 453,
- 435, 435, 443, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 444, 435, 449, 450, 451, 455, 123, 118,
- 440, 441, 435, 435, 153, 453, 435, 435,
- 443, 435, 435, 435, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 444, 435,
- 446, 435, 512, 435, 493, 493, 123, 118,
- 440, 441, 435, 435, 435, 448, 435, 446,
- 435, 446, 435, 435, 435, 484, 484, 435,
- 118, 440, 441, 435, 435, 435, 448, 435,
- 446, 435, 446, 435, 435, 435, 484, 513,
- 435, 118, 440, 441, 435, 435, 435, 448,
- 435, 446, 435, 446, 435, 512, 435, 484,
- 484, 435, 118, 440, 441, 435, 435, 435,
- 448, 435, 446, 435, 446, 120, 435, 435,
- 136, 447, 435, 118, 440, 441, 435, 435,
- 435, 448, 435, 446, 435, 436, 437, 439,
- 439, 123, 118, 440, 441, 435, 435, 435,
- 442, 435, 435, 443, 435, 435, 435, 435,
- 435, 435, 435, 435, 435, 435, 435, 435,
- 435, 444, 435, 188, 189, 190, 191, 514,
- 365, 84, 79, 194, 195, 196, 196, 156,
- 197, 363, 188, 200, 363, 363, 363, 363,
- 363, 363, 363, 363, 363, 363, 363, 363,
- 363, 202, 363, 204, 515, 206, 207, 6,
- 1, 208, 209, 203, 203, 38, 210, 203,
- 203, 211, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 212,
- 203, 215, 189, 190, 191, 516, 517, 84,
- 157, 518, 519, 203, 196, 156, 520, 203,
- 215, 200, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 202,
- 203, 116, 521, 521, 84, 157, 208, 209,
- 203, 203, 156, 522, 203, 523, 203, 203,
- 524, 518, 519, 203, 518, 519, 203, 256,
- 203, 518, 525, 203, 518, 526, 203, 518,
- 203, 523, 203, 203, 203, 518, 519, 203,
- 527, 3, 363, 363, 404, 433, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 527,
- 363, 528, 370, 529, 530, 84, 157, 518,
- 519, 203, 203, 158, 373, 203, 203, 200,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 202, 203, 531,
- 370, 532, 532, 84, 157, 518, 519, 203,
- 203, 203, 373, 203, 203, 200, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 202, 203, 370, 532, 532,
- 84, 157, 518, 519, 203, 203, 203, 373,
- 203, 203, 200, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 202, 203, 528, 370, 532, 532, 84, 157,
- 518, 519, 203, 203, 203, 373, 203, 203,
- 200, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 202, 203,
- 528, 370, 529, 532, 84, 157, 518, 519,
- 203, 203, 158, 373, 203, 203, 200, 203,
- 203, 203, 203, 203, 203, 203, 203, 203,
- 203, 203, 203, 203, 202, 203, 215, 203,
- 281, 116, 533, 533, 160, 157, 208, 209,
- 203, 203, 203, 522, 203, 215, 203, 534,
- 184, 535, 536, 162, 157, 518, 519, 203,
- 203, 203, 537, 203, 184, 535, 536, 162,
- 157, 518, 519, 203, 203, 203, 537, 203,
- 535, 535, 162, 157, 518, 519, 203, 203,
- 203, 537, 203, 538, 181, 539, 540, 165,
- 157, 518, 519, 203, 203, 203, 537, 203,
- 181, 539, 540, 165, 157, 518, 519, 203,
- 203, 203, 537, 203, 539, 539, 165, 157,
- 518, 519, 203, 203, 203, 537, 203, 541,
- 178, 542, 543, 168, 157, 518, 519, 203,
- 203, 203, 537, 203, 178, 542, 543, 168,
- 157, 518, 519, 203, 203, 203, 537, 203,
- 542, 542, 168, 157, 518, 519, 203, 203,
- 203, 537, 203, 544, 175, 545, 546, 203,
- 157, 518, 519, 203, 203, 203, 537, 203,
- 175, 545, 546, 203, 157, 518, 519, 203,
- 203, 203, 537, 203, 545, 545, 203, 157,
- 518, 519, 203, 203, 203, 537, 203, 547,
- 203, 548, 549, 203, 157, 518, 519, 203,
- 203, 172, 203, 171, 203, 545, 545, 203,
- 157, 518, 519, 203, 545, 545, 203, 157,
- 518, 519, 203, 547, 203, 545, 545, 203,
- 157, 518, 519, 203, 547, 203, 548, 545,
- 203, 157, 518, 519, 203, 203, 172, 203,
- 527, 171, 363, 363, 98, 367, 363, 79,
- 194, 195, 363, 363, 363, 368, 363, 527,
- 363, 551, 550, 552, 552, 550, 186, 553,
- 554, 550, 552, 552, 550, 186, 553, 554,
- 550, 555, 550, 550, 556, 553, 554, 550,
- 553, 554, 550, 557, 550, 553, 558, 550,
- 553, 559, 550, 553, 550, 555, 550, 550,
- 550, 553, 554, 550, 0
+ 197, 198, 199, 200, 201, 187, 203, 204,
+ 205, 206, 6, 1, 207, 208, 202, 202,
+ 38, 209, 202, 202, 210, 202, 211, 204,
+ 212, 212, 6, 1, 207, 208, 202, 202,
+ 202, 209, 202, 202, 210, 202, 204, 212,
+ 212, 6, 1, 207, 208, 202, 202, 202,
+ 209, 202, 202, 210, 202, 213, 202, 202,
+ 202, 19, 214, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 213, 202, 216, 217,
+ 218, 219, 6, 1, 207, 208, 202, 202,
+ 36, 220, 202, 202, 210, 202, 221, 217,
+ 222, 222, 6, 1, 207, 208, 202, 202,
+ 202, 220, 202, 202, 210, 202, 217, 222,
+ 222, 6, 1, 207, 208, 202, 202, 202,
+ 220, 202, 202, 210, 202, 223, 202, 202,
+ 202, 19, 224, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 223, 202, 225, 226,
+ 227, 228, 6, 1, 207, 208, 202, 202,
+ 34, 229, 202, 202, 210, 202, 230, 226,
+ 231, 231, 6, 1, 207, 208, 202, 202,
+ 202, 229, 202, 202, 210, 202, 226, 231,
+ 231, 6, 1, 207, 208, 202, 202, 202,
+ 229, 202, 202, 210, 202, 232, 202, 202,
+ 202, 19, 233, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 232, 202, 234, 235,
+ 236, 237, 6, 1, 207, 208, 202, 202,
+ 32, 238, 202, 202, 210, 202, 239, 235,
+ 240, 240, 6, 1, 207, 208, 202, 202,
+ 202, 238, 202, 202, 210, 202, 235, 240,
+ 240, 6, 1, 207, 208, 202, 202, 202,
+ 238, 202, 202, 210, 202, 241, 202, 202,
+ 202, 19, 242, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 241, 202, 243, 244,
+ 245, 246, 6, 1, 207, 208, 202, 202,
+ 30, 247, 202, 202, 210, 202, 248, 244,
+ 249, 249, 6, 1, 207, 208, 202, 202,
+ 202, 247, 202, 202, 210, 202, 244, 249,
+ 249, 6, 1, 207, 208, 202, 202, 202,
+ 247, 202, 202, 210, 202, 19, 250, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 251, 251, 202, 1, 207, 208, 202, 202,
+ 202, 215, 202, 252, 202, 202, 253, 207,
+ 208, 202, 207, 208, 202, 254, 202, 207,
+ 255, 202, 207, 256, 202, 207, 202, 252,
+ 202, 202, 202, 207, 208, 202, 257, 202,
+ 258, 259, 202, 1, 207, 208, 202, 202,
+ 4, 202, 3, 202, 251, 251, 202, 1,
+ 207, 208, 202, 251, 251, 202, 1, 207,
+ 208, 202, 257, 202, 251, 251, 202, 1,
+ 207, 208, 202, 257, 202, 258, 251, 202,
+ 1, 207, 208, 202, 202, 4, 202, 19,
+ 202, 260, 260, 6, 1, 207, 208, 202,
+ 202, 202, 215, 202, 261, 28, 262, 263,
+ 9, 1, 207, 208, 202, 202, 202, 215,
+ 202, 28, 262, 263, 9, 1, 207, 208,
+ 202, 202, 202, 215, 202, 262, 262, 9,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 264, 25, 265, 266, 12, 1, 207, 208,
+ 202, 202, 202, 215, 202, 25, 265, 266,
+ 12, 1, 207, 208, 202, 202, 202, 215,
+ 202, 265, 265, 12, 1, 207, 208, 202,
+ 202, 202, 215, 202, 267, 22, 268, 269,
+ 15, 1, 207, 208, 202, 202, 202, 215,
+ 202, 22, 268, 269, 15, 1, 207, 208,
+ 202, 202, 202, 215, 202, 268, 268, 15,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 270, 19, 251, 271, 202, 1, 207, 208,
+ 202, 202, 202, 215, 202, 19, 251, 271,
+ 202, 1, 207, 208, 202, 202, 202, 215,
+ 202, 251, 272, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 19, 202, 251, 251,
+ 202, 1, 207, 208, 202, 202, 202, 215,
+ 202, 2, 3, 202, 202, 19, 250, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 2, 202, 244, 249, 249, 6, 1, 207,
+ 208, 202, 202, 202, 247, 202, 243, 244,
+ 249, 249, 6, 1, 207, 208, 202, 202,
+ 202, 247, 202, 202, 210, 202, 243, 244,
+ 245, 249, 6, 1, 207, 208, 202, 202,
+ 30, 247, 202, 202, 210, 202, 241, 202,
+ 273, 202, 260, 260, 6, 1, 207, 208,
+ 202, 202, 202, 215, 202, 241, 202, 241,
+ 202, 202, 202, 251, 251, 202, 1, 207,
+ 208, 202, 202, 202, 215, 202, 241, 202,
+ 241, 202, 202, 202, 251, 274, 202, 1,
+ 207, 208, 202, 202, 202, 215, 202, 241,
+ 202, 241, 202, 273, 202, 251, 251, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 241, 202, 241, 3, 202, 202, 19, 242,
+ 202, 1, 207, 208, 202, 202, 202, 215,
+ 202, 241, 202, 234, 235, 240, 240, 6,
+ 1, 207, 208, 202, 202, 202, 238, 202,
+ 202, 210, 202, 234, 235, 236, 240, 6,
+ 1, 207, 208, 202, 202, 32, 238, 202,
+ 202, 210, 202, 232, 202, 275, 202, 260,
+ 260, 6, 1, 207, 208, 202, 202, 202,
+ 215, 202, 232, 202, 232, 202, 202, 202,
+ 251, 251, 202, 1, 207, 208, 202, 202,
+ 202, 215, 202, 232, 202, 232, 202, 202,
+ 202, 251, 276, 202, 1, 207, 208, 202,
+ 202, 202, 215, 202, 232, 202, 232, 202,
+ 275, 202, 251, 251, 202, 1, 207, 208,
+ 202, 202, 202, 215, 202, 232, 202, 232,
+ 3, 202, 202, 19, 233, 202, 1, 207,
+ 208, 202, 202, 202, 215, 202, 232, 202,
+ 225, 226, 231, 231, 6, 1, 207, 208,
+ 202, 202, 202, 229, 202, 202, 210, 202,
+ 225, 226, 227, 231, 6, 1, 207, 208,
+ 202, 202, 34, 229, 202, 202, 210, 202,
+ 223, 202, 277, 202, 260, 260, 6, 1,
+ 207, 208, 202, 202, 202, 215, 202, 223,
+ 202, 223, 202, 202, 202, 251, 251, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 223, 202, 223, 202, 202, 202, 251, 278,
+ 202, 1, 207, 208, 202, 202, 202, 215,
+ 202, 223, 202, 223, 202, 277, 202, 251,
+ 251, 202, 1, 207, 208, 202, 202, 202,
+ 215, 202, 223, 202, 223, 3, 202, 202,
+ 19, 224, 202, 1, 207, 208, 202, 202,
+ 202, 215, 202, 223, 202, 216, 217, 222,
+ 222, 6, 1, 207, 208, 202, 202, 202,
+ 220, 202, 202, 210, 202, 216, 217, 218,
+ 222, 6, 1, 207, 208, 202, 202, 36,
+ 220, 202, 202, 210, 202, 213, 202, 279,
+ 202, 260, 260, 6, 1, 207, 208, 202,
+ 202, 202, 215, 202, 213, 202, 213, 202,
+ 202, 202, 251, 251, 202, 1, 207, 208,
+ 202, 202, 202, 215, 202, 213, 202, 213,
+ 202, 202, 202, 251, 280, 202, 1, 207,
+ 208, 202, 202, 202, 215, 202, 213, 202,
+ 213, 202, 279, 202, 251, 251, 202, 1,
+ 207, 208, 202, 202, 202, 215, 202, 213,
+ 202, 213, 3, 202, 202, 19, 214, 202,
+ 1, 207, 208, 202, 202, 202, 215, 202,
+ 213, 202, 203, 204, 212, 212, 6, 1,
+ 207, 208, 202, 202, 202, 209, 202, 202,
+ 210, 202, 203, 204, 205, 212, 6, 1,
+ 207, 208, 202, 202, 38, 209, 202, 202,
+ 210, 202, 282, 283, 284, 285, 45, 40,
+ 286, 287, 281, 281, 77, 288, 281, 281,
+ 289, 281, 290, 283, 291, 285, 45, 40,
+ 286, 287, 281, 281, 281, 288, 281, 281,
+ 289, 281, 283, 291, 285, 45, 40, 286,
+ 287, 281, 281, 281, 288, 281, 281, 289,
+ 281, 292, 281, 281, 281, 58, 293, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 292, 281, 295, 296, 297, 298, 45, 40,
+ 286, 287, 281, 281, 75, 299, 281, 281,
+ 289, 281, 300, 296, 301, 301, 45, 40,
+ 286, 287, 281, 281, 281, 299, 281, 281,
+ 289, 281, 296, 301, 301, 45, 40, 286,
+ 287, 281, 281, 281, 299, 281, 281, 289,
+ 281, 302, 281, 281, 281, 58, 303, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 302, 281, 304, 305, 306, 307, 45, 40,
+ 286, 287, 281, 281, 73, 308, 281, 281,
+ 289, 281, 309, 305, 310, 310, 45, 40,
+ 286, 287, 281, 281, 281, 308, 281, 281,
+ 289, 281, 305, 310, 310, 45, 40, 286,
+ 287, 281, 281, 281, 308, 281, 281, 289,
+ 281, 311, 281, 281, 281, 58, 312, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 311, 281, 313, 314, 315, 316, 45, 40,
+ 286, 287, 281, 281, 71, 317, 281, 281,
+ 289, 281, 318, 314, 319, 319, 45, 40,
+ 286, 287, 281, 281, 281, 317, 281, 281,
+ 289, 281, 314, 319, 319, 45, 40, 286,
+ 287, 281, 281, 281, 317, 281, 281, 289,
+ 281, 320, 281, 281, 281, 58, 321, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 320, 281, 322, 323, 324, 325, 45, 40,
+ 286, 287, 281, 281, 69, 326, 281, 281,
+ 289, 281, 327, 323, 328, 328, 45, 40,
+ 286, 287, 281, 281, 281, 326, 281, 281,
+ 289, 281, 323, 328, 328, 45, 40, 286,
+ 287, 281, 281, 281, 326, 281, 281, 289,
+ 281, 58, 329, 281, 40, 286, 287, 281,
+ 281, 281, 294, 281, 330, 330, 281, 40,
+ 286, 287, 281, 281, 281, 294, 281, 331,
+ 281, 281, 332, 286, 287, 281, 286, 287,
+ 281, 333, 281, 286, 334, 281, 286, 335,
+ 281, 286, 281, 331, 281, 281, 281, 286,
+ 287, 281, 336, 281, 337, 338, 281, 40,
+ 286, 287, 281, 281, 43, 281, 42, 281,
+ 330, 330, 281, 40, 286, 287, 281, 330,
+ 330, 281, 40, 286, 287, 281, 336, 281,
+ 330, 330, 281, 40, 286, 287, 281, 336,
+ 281, 337, 330, 281, 40, 286, 287, 281,
+ 281, 43, 281, 58, 281, 339, 339, 45,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 340, 67, 341, 342, 48, 40, 286, 287,
+ 281, 281, 281, 294, 281, 67, 341, 342,
+ 48, 40, 286, 287, 281, 281, 281, 294,
+ 281, 341, 341, 48, 40, 286, 287, 281,
+ 281, 281, 294, 281, 343, 64, 344, 345,
+ 51, 40, 286, 287, 281, 281, 281, 294,
+ 281, 64, 344, 345, 51, 40, 286, 287,
+ 281, 281, 281, 294, 281, 344, 344, 51,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 346, 61, 347, 348, 54, 40, 286, 287,
+ 281, 281, 281, 294, 281, 61, 347, 348,
+ 54, 40, 286, 287, 281, 281, 281, 294,
+ 281, 347, 347, 54, 40, 286, 287, 281,
+ 281, 281, 294, 281, 349, 58, 330, 350,
+ 281, 40, 286, 287, 281, 281, 281, 294,
+ 281, 58, 330, 350, 281, 40, 286, 287,
+ 281, 281, 281, 294, 281, 330, 351, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 58, 281, 330, 330, 281, 40, 286, 287,
+ 281, 281, 281, 294, 281, 41, 42, 281,
+ 281, 58, 329, 281, 40, 286, 287, 281,
+ 281, 281, 294, 281, 41, 281, 323, 328,
+ 328, 45, 40, 286, 287, 281, 281, 281,
+ 326, 281, 322, 323, 328, 328, 45, 40,
+ 286, 287, 281, 281, 281, 326, 281, 281,
+ 289, 281, 322, 323, 324, 328, 45, 40,
+ 286, 287, 281, 281, 69, 326, 281, 281,
+ 289, 281, 320, 281, 352, 281, 339, 339,
+ 45, 40, 286, 287, 281, 281, 281, 294,
+ 281, 320, 281, 320, 281, 281, 281, 330,
+ 330, 281, 40, 286, 287, 281, 281, 281,
+ 294, 281, 320, 281, 320, 281, 281, 281,
+ 330, 353, 281, 40, 286, 287, 281, 281,
+ 281, 294, 281, 320, 281, 320, 281, 352,
+ 281, 330, 330, 281, 40, 286, 287, 281,
+ 281, 281, 294, 281, 320, 281, 320, 42,
+ 281, 281, 58, 321, 281, 40, 286, 287,
+ 281, 281, 281, 294, 281, 320, 281, 313,
+ 314, 319, 319, 45, 40, 286, 287, 281,
+ 281, 281, 317, 281, 281, 289, 281, 313,
+ 314, 315, 319, 45, 40, 286, 287, 281,
+ 281, 71, 317, 281, 281, 289, 281, 311,
+ 281, 354, 281, 339, 339, 45, 40, 286,
+ 287, 281, 281, 281, 294, 281, 311, 281,
+ 311, 281, 281, 281, 330, 330, 281, 40,
+ 286, 287, 281, 281, 281, 294, 281, 311,
+ 281, 311, 281, 281, 281, 330, 355, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 311, 281, 311, 281, 354, 281, 330, 330,
+ 281, 40, 286, 287, 281, 281, 281, 294,
+ 281, 311, 281, 311, 42, 281, 281, 58,
+ 312, 281, 40, 286, 287, 281, 281, 281,
+ 294, 281, 311, 281, 304, 305, 310, 310,
+ 45, 40, 286, 287, 281, 281, 281, 308,
+ 281, 281, 289, 281, 304, 305, 306, 310,
+ 45, 40, 286, 287, 281, 281, 73, 308,
+ 281, 281, 289, 281, 302, 281, 356, 281,
+ 339, 339, 45, 40, 286, 287, 281, 281,
+ 281, 294, 281, 302, 281, 302, 281, 281,
+ 281, 330, 330, 281, 40, 286, 287, 281,
+ 281, 281, 294, 281, 302, 281, 302, 281,
+ 281, 281, 330, 357, 281, 40, 286, 287,
+ 281, 281, 281, 294, 281, 302, 281, 302,
+ 281, 356, 281, 330, 330, 281, 40, 286,
+ 287, 281, 281, 281, 294, 281, 302, 281,
+ 302, 42, 281, 281, 58, 303, 281, 40,
+ 286, 287, 281, 281, 281, 294, 281, 302,
+ 281, 295, 296, 301, 301, 45, 40, 286,
+ 287, 281, 281, 281, 299, 281, 281, 289,
+ 281, 295, 296, 297, 301, 45, 40, 286,
+ 287, 281, 281, 75, 299, 281, 281, 289,
+ 281, 292, 281, 358, 281, 339, 339, 45,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 292, 281, 292, 281, 281, 281, 330, 330,
+ 281, 40, 286, 287, 281, 281, 281, 294,
+ 281, 292, 281, 292, 281, 281, 281, 330,
+ 359, 281, 40, 286, 287, 281, 281, 281,
+ 294, 281, 292, 281, 292, 281, 358, 281,
+ 330, 330, 281, 40, 286, 287, 281, 281,
+ 281, 294, 281, 292, 281, 76, 44, 44,
+ 45, 40, 281, 281, 281, 281, 281, 76,
+ 281, 292, 42, 281, 281, 58, 293, 281,
+ 40, 286, 287, 281, 281, 281, 294, 281,
+ 292, 281, 282, 283, 291, 285, 45, 40,
+ 286, 287, 281, 281, 281, 288, 281, 281,
+ 289, 281, 361, 191, 362, 362, 84, 79,
+ 194, 195, 360, 360, 360, 197, 360, 360,
+ 200, 360, 191, 362, 362, 84, 79, 194,
+ 195, 360, 360, 360, 197, 360, 360, 200,
+ 360, 363, 360, 360, 360, 98, 364, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 363, 360, 366, 367, 368, 369, 84, 79,
+ 194, 195, 360, 360, 115, 370, 360, 360,
+ 200, 360, 371, 367, 372, 372, 84, 79,
+ 194, 195, 360, 360, 360, 370, 360, 360,
+ 200, 360, 367, 372, 372, 84, 79, 194,
+ 195, 360, 360, 360, 370, 360, 360, 200,
+ 360, 373, 360, 360, 360, 98, 374, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 373, 360, 375, 376, 377, 378, 84, 79,
+ 194, 195, 360, 360, 113, 379, 360, 360,
+ 200, 360, 380, 376, 381, 381, 84, 79,
+ 194, 195, 360, 360, 360, 379, 360, 360,
+ 200, 360, 376, 381, 381, 84, 79, 194,
+ 195, 360, 360, 360, 379, 360, 360, 200,
+ 360, 382, 360, 360, 360, 98, 383, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 382, 360, 384, 385, 386, 387, 84, 79,
+ 194, 195, 360, 360, 111, 388, 360, 360,
+ 200, 360, 389, 385, 390, 390, 84, 79,
+ 194, 195, 360, 360, 360, 388, 360, 360,
+ 200, 360, 385, 390, 390, 84, 79, 194,
+ 195, 360, 360, 360, 388, 360, 360, 200,
+ 360, 391, 360, 360, 360, 98, 392, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 391, 360, 393, 394, 395, 396, 84, 79,
+ 194, 195, 360, 360, 109, 397, 360, 360,
+ 200, 360, 398, 394, 399, 399, 84, 79,
+ 194, 195, 360, 360, 360, 397, 360, 360,
+ 200, 360, 394, 399, 399, 84, 79, 194,
+ 195, 360, 360, 360, 397, 360, 360, 200,
+ 360, 98, 400, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 401, 401, 360, 79,
+ 194, 195, 360, 360, 360, 365, 360, 402,
+ 360, 360, 403, 194, 195, 360, 194, 195,
+ 360, 404, 360, 194, 405, 360, 194, 406,
+ 360, 194, 360, 402, 360, 360, 360, 194,
+ 195, 360, 407, 360, 408, 409, 360, 79,
+ 194, 195, 360, 360, 82, 360, 81, 360,
+ 401, 401, 360, 79, 194, 195, 360, 401,
+ 401, 360, 79, 194, 195, 360, 407, 360,
+ 401, 401, 360, 79, 194, 195, 360, 407,
+ 360, 408, 401, 360, 79, 194, 195, 360,
+ 360, 82, 360, 98, 360, 410, 410, 84,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 411, 107, 412, 413, 88, 79, 194, 195,
+ 360, 360, 360, 365, 360, 107, 412, 413,
+ 88, 79, 194, 195, 360, 360, 360, 365,
+ 360, 412, 412, 88, 79, 194, 195, 360,
+ 360, 360, 365, 360, 414, 104, 415, 416,
+ 91, 79, 194, 195, 360, 360, 360, 365,
+ 360, 104, 415, 416, 91, 79, 194, 195,
+ 360, 360, 360, 365, 360, 415, 415, 91,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 417, 101, 418, 419, 94, 79, 194, 195,
+ 360, 360, 360, 365, 360, 101, 418, 419,
+ 94, 79, 194, 195, 360, 360, 360, 365,
+ 360, 418, 418, 94, 79, 194, 195, 360,
+ 360, 360, 365, 360, 420, 98, 401, 421,
+ 360, 79, 194, 195, 360, 360, 360, 365,
+ 360, 98, 401, 421, 360, 79, 194, 195,
+ 360, 360, 360, 365, 360, 401, 422, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 98, 360, 401, 401, 360, 79, 194, 195,
+ 360, 360, 360, 365, 360, 80, 81, 360,
+ 360, 98, 400, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 80, 360, 394, 399,
+ 399, 84, 79, 194, 195, 360, 360, 360,
+ 397, 360, 393, 394, 399, 399, 84, 79,
+ 194, 195, 360, 360, 360, 397, 360, 360,
+ 200, 360, 393, 394, 395, 399, 84, 79,
+ 194, 195, 360, 360, 109, 397, 360, 360,
+ 200, 360, 391, 360, 423, 360, 410, 410,
+ 84, 79, 194, 195, 360, 360, 360, 365,
+ 360, 391, 360, 391, 360, 360, 360, 401,
+ 401, 360, 79, 194, 195, 360, 360, 360,
+ 365, 360, 391, 360, 391, 360, 360, 360,
+ 401, 424, 360, 79, 194, 195, 360, 360,
+ 360, 365, 360, 391, 360, 391, 360, 423,
+ 360, 401, 401, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 391, 360, 391, 81,
+ 360, 360, 98, 392, 360, 79, 194, 195,
+ 360, 360, 360, 365, 360, 391, 360, 384,
+ 385, 390, 390, 84, 79, 194, 195, 360,
+ 360, 360, 388, 360, 360, 200, 360, 384,
+ 385, 386, 390, 84, 79, 194, 195, 360,
+ 360, 111, 388, 360, 360, 200, 360, 382,
+ 360, 425, 360, 410, 410, 84, 79, 194,
+ 195, 360, 360, 360, 365, 360, 382, 360,
+ 382, 360, 360, 360, 401, 401, 360, 79,
+ 194, 195, 360, 360, 360, 365, 360, 382,
+ 360, 382, 360, 360, 360, 401, 426, 360,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 382, 360, 382, 360, 425, 360, 401, 401,
+ 360, 79, 194, 195, 360, 360, 360, 365,
+ 360, 382, 360, 382, 81, 360, 360, 98,
+ 383, 360, 79, 194, 195, 360, 360, 360,
+ 365, 360, 382, 360, 375, 376, 381, 381,
+ 84, 79, 194, 195, 360, 360, 360, 379,
+ 360, 360, 200, 360, 375, 376, 377, 381,
+ 84, 79, 194, 195, 360, 360, 113, 379,
+ 360, 360, 200, 360, 373, 360, 427, 360,
+ 410, 410, 84, 79, 194, 195, 360, 360,
+ 360, 365, 360, 373, 360, 373, 360, 360,
+ 360, 401, 401, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 373, 360, 373, 360,
+ 360, 360, 401, 428, 360, 79, 194, 195,
+ 360, 360, 360, 365, 360, 373, 360, 373,
+ 360, 427, 360, 401, 401, 360, 79, 194,
+ 195, 360, 360, 360, 365, 360, 373, 360,
+ 373, 81, 360, 360, 98, 374, 360, 79,
+ 194, 195, 360, 360, 360, 365, 360, 373,
+ 360, 366, 367, 372, 372, 84, 79, 194,
+ 195, 360, 360, 360, 370, 360, 360, 200,
+ 360, 366, 367, 368, 372, 84, 79, 194,
+ 195, 360, 360, 115, 370, 360, 360, 200,
+ 360, 363, 360, 429, 360, 410, 410, 84,
+ 79, 194, 195, 360, 360, 360, 365, 360,
+ 363, 360, 363, 360, 360, 360, 401, 401,
+ 360, 79, 194, 195, 360, 360, 360, 365,
+ 360, 363, 360, 363, 360, 360, 360, 401,
+ 430, 360, 79, 194, 195, 360, 360, 360,
+ 365, 360, 363, 360, 363, 360, 429, 360,
+ 401, 401, 360, 79, 194, 195, 360, 360,
+ 360, 365, 360, 363, 360, 363, 81, 360,
+ 360, 98, 364, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 363, 360, 116, 83,
+ 83, 84, 79, 431, 431, 431, 431, 156,
+ 116, 431, 190, 191, 362, 362, 84, 79,
+ 194, 195, 360, 360, 360, 197, 360, 360,
+ 200, 360, 116, 83, 83, 84, 79, 431,
+ 431, 431, 431, 431, 116, 431, 433, 434,
+ 435, 436, 123, 118, 437, 438, 432, 432,
+ 155, 439, 432, 432, 440, 432, 441, 434,
+ 436, 436, 123, 118, 437, 438, 432, 432,
+ 432, 439, 432, 432, 440, 432, 434, 436,
+ 436, 123, 118, 437, 438, 432, 432, 432,
+ 439, 432, 432, 440, 432, 442, 432, 432,
+ 432, 136, 443, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 442, 432, 445, 446,
+ 447, 448, 123, 118, 437, 438, 432, 432,
+ 153, 449, 432, 432, 440, 432, 450, 446,
+ 451, 451, 123, 118, 437, 438, 432, 432,
+ 432, 449, 432, 432, 440, 432, 446, 451,
+ 451, 123, 118, 437, 438, 432, 432, 432,
+ 449, 432, 432, 440, 432, 452, 432, 432,
+ 432, 136, 453, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 452, 432, 454, 455,
+ 456, 457, 123, 118, 437, 438, 432, 432,
+ 151, 458, 432, 432, 440, 432, 459, 455,
+ 460, 460, 123, 118, 437, 438, 432, 432,
+ 432, 458, 432, 432, 440, 432, 455, 460,
+ 460, 123, 118, 437, 438, 432, 432, 432,
+ 458, 432, 432, 440, 432, 461, 432, 432,
+ 432, 136, 462, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 461, 432, 463, 464,
+ 465, 466, 123, 118, 437, 438, 432, 432,
+ 149, 467, 432, 432, 440, 432, 468, 464,
+ 469, 469, 123, 118, 437, 438, 432, 432,
+ 432, 467, 432, 432, 440, 432, 464, 469,
+ 469, 123, 118, 437, 438, 432, 432, 432,
+ 467, 432, 432, 440, 432, 470, 432, 432,
+ 432, 136, 471, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 470, 432, 472, 473,
+ 474, 475, 123, 118, 437, 438, 432, 432,
+ 147, 476, 432, 432, 440, 432, 477, 473,
+ 478, 478, 123, 118, 437, 438, 432, 432,
+ 432, 476, 432, 432, 440, 432, 473, 478,
+ 478, 123, 118, 437, 438, 432, 432, 432,
+ 476, 432, 432, 440, 432, 136, 479, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 480, 480, 432, 118, 437, 438, 432, 432,
+ 432, 444, 432, 481, 432, 432, 482, 437,
+ 438, 432, 437, 438, 432, 483, 432, 437,
+ 484, 432, 437, 485, 432, 437, 432, 481,
+ 432, 432, 432, 437, 438, 432, 486, 432,
+ 487, 488, 432, 118, 437, 438, 432, 432,
+ 121, 432, 120, 432, 480, 480, 432, 118,
+ 437, 438, 432, 480, 480, 432, 118, 437,
+ 438, 432, 486, 432, 480, 480, 432, 118,
+ 437, 438, 432, 486, 432, 487, 480, 432,
+ 118, 437, 438, 432, 432, 121, 432, 136,
+ 432, 489, 489, 123, 118, 437, 438, 432,
+ 432, 432, 444, 432, 490, 145, 491, 492,
+ 126, 118, 437, 438, 432, 432, 432, 444,
+ 432, 145, 491, 492, 126, 118, 437, 438,
+ 432, 432, 432, 444, 432, 491, 491, 126,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 493, 142, 494, 495, 129, 118, 437, 438,
+ 432, 432, 432, 444, 432, 142, 494, 495,
+ 129, 118, 437, 438, 432, 432, 432, 444,
+ 432, 494, 494, 129, 118, 437, 438, 432,
+ 432, 432, 444, 432, 496, 139, 497, 498,
+ 132, 118, 437, 438, 432, 432, 432, 444,
+ 432, 139, 497, 498, 132, 118, 437, 438,
+ 432, 432, 432, 444, 432, 497, 497, 132,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 499, 136, 480, 500, 432, 118, 437, 438,
+ 432, 432, 432, 444, 432, 136, 480, 500,
+ 432, 118, 437, 438, 432, 432, 432, 444,
+ 432, 480, 501, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 136, 432, 480, 480,
+ 432, 118, 437, 438, 432, 432, 432, 444,
+ 432, 119, 120, 432, 432, 136, 479, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 119, 432, 473, 478, 478, 123, 118, 437,
+ 438, 432, 432, 432, 476, 432, 472, 473,
+ 478, 478, 123, 118, 437, 438, 432, 432,
+ 432, 476, 432, 432, 440, 432, 472, 473,
+ 474, 478, 123, 118, 437, 438, 432, 432,
+ 147, 476, 432, 432, 440, 432, 470, 432,
+ 502, 432, 489, 489, 123, 118, 437, 438,
+ 432, 432, 432, 444, 432, 470, 432, 470,
+ 432, 432, 432, 480, 480, 432, 118, 437,
+ 438, 432, 432, 432, 444, 432, 470, 432,
+ 470, 432, 432, 432, 480, 503, 432, 118,
+ 437, 438, 432, 432, 432, 444, 432, 470,
+ 432, 470, 432, 502, 432, 480, 480, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 470, 432, 470, 120, 432, 432, 136, 471,
+ 432, 118, 437, 438, 432, 432, 432, 444,
+ 432, 470, 432, 463, 464, 469, 469, 123,
+ 118, 437, 438, 432, 432, 432, 467, 432,
+ 432, 440, 432, 463, 464, 465, 469, 123,
+ 118, 437, 438, 432, 432, 149, 467, 432,
+ 432, 440, 432, 461, 432, 504, 432, 489,
+ 489, 123, 118, 437, 438, 432, 432, 432,
+ 444, 432, 461, 432, 461, 432, 432, 432,
+ 480, 480, 432, 118, 437, 438, 432, 432,
+ 432, 444, 432, 461, 432, 461, 432, 432,
+ 432, 480, 505, 432, 118, 437, 438, 432,
+ 432, 432, 444, 432, 461, 432, 461, 432,
+ 504, 432, 480, 480, 432, 118, 437, 438,
+ 432, 432, 432, 444, 432, 461, 432, 461,
+ 120, 432, 432, 136, 462, 432, 118, 437,
+ 438, 432, 432, 432, 444, 432, 461, 432,
+ 454, 455, 460, 460, 123, 118, 437, 438,
+ 432, 432, 432, 458, 432, 432, 440, 432,
+ 454, 455, 456, 460, 123, 118, 437, 438,
+ 432, 432, 151, 458, 432, 432, 440, 432,
+ 452, 432, 506, 432, 489, 489, 123, 118,
+ 437, 438, 432, 432, 432, 444, 432, 452,
+ 432, 452, 432, 432, 432, 480, 480, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 452, 432, 452, 432, 432, 432, 480, 507,
+ 432, 118, 437, 438, 432, 432, 432, 444,
+ 432, 452, 432, 452, 432, 506, 432, 480,
+ 480, 432, 118, 437, 438, 432, 432, 432,
+ 444, 432, 452, 432, 452, 120, 432, 432,
+ 136, 453, 432, 118, 437, 438, 432, 432,
+ 432, 444, 432, 452, 432, 445, 446, 451,
+ 451, 123, 118, 437, 438, 432, 432, 432,
+ 449, 432, 432, 440, 432, 445, 446, 447,
+ 451, 123, 118, 437, 438, 432, 432, 153,
+ 449, 432, 432, 440, 432, 442, 432, 508,
+ 432, 489, 489, 123, 118, 437, 438, 432,
+ 432, 432, 444, 432, 442, 432, 442, 432,
+ 432, 432, 480, 480, 432, 118, 437, 438,
+ 432, 432, 432, 444, 432, 442, 432, 442,
+ 432, 432, 432, 480, 509, 432, 118, 437,
+ 438, 432, 432, 432, 444, 432, 442, 432,
+ 442, 432, 508, 432, 480, 480, 432, 118,
+ 437, 438, 432, 432, 432, 444, 432, 442,
+ 432, 442, 120, 432, 432, 136, 443, 432,
+ 118, 437, 438, 432, 432, 432, 444, 432,
+ 442, 432, 433, 434, 436, 436, 123, 118,
+ 437, 438, 432, 432, 432, 439, 432, 432,
+ 440, 432, 188, 189, 190, 191, 510, 362,
+ 84, 79, 194, 195, 196, 196, 156, 197,
+ 360, 188, 200, 360, 203, 511, 205, 206,
+ 6, 1, 207, 208, 202, 202, 38, 209,
+ 202, 202, 210, 202, 213, 189, 190, 191,
+ 512, 513, 84, 157, 514, 515, 202, 196,
+ 156, 516, 202, 213, 200, 202, 116, 517,
+ 517, 84, 157, 207, 208, 202, 202, 156,
+ 518, 202, 519, 202, 202, 520, 514, 515,
+ 202, 514, 515, 202, 254, 202, 514, 521,
+ 202, 514, 522, 202, 514, 202, 519, 202,
+ 202, 202, 514, 515, 202, 523, 3, 360,
+ 360, 401, 430, 360, 79, 194, 195, 360,
+ 360, 360, 365, 360, 523, 360, 524, 367,
+ 525, 526, 84, 157, 514, 515, 202, 202,
+ 158, 370, 202, 202, 200, 202, 527, 367,
+ 528, 528, 84, 157, 514, 515, 202, 202,
+ 202, 370, 202, 202, 200, 202, 367, 528,
+ 528, 84, 157, 514, 515, 202, 202, 202,
+ 370, 202, 202, 200, 202, 524, 367, 528,
+ 528, 84, 157, 514, 515, 202, 202, 202,
+ 370, 202, 202, 200, 202, 524, 367, 525,
+ 528, 84, 157, 514, 515, 202, 202, 158,
+ 370, 202, 202, 200, 202, 213, 202, 279,
+ 116, 529, 529, 160, 157, 207, 208, 202,
+ 202, 202, 518, 202, 213, 202, 530, 184,
+ 531, 532, 162, 157, 514, 515, 202, 202,
+ 202, 533, 202, 184, 531, 532, 162, 157,
+ 514, 515, 202, 202, 202, 533, 202, 531,
+ 531, 162, 157, 514, 515, 202, 202, 202,
+ 533, 202, 534, 181, 535, 536, 165, 157,
+ 514, 515, 202, 202, 202, 533, 202, 181,
+ 535, 536, 165, 157, 514, 515, 202, 202,
+ 202, 533, 202, 535, 535, 165, 157, 514,
+ 515, 202, 202, 202, 533, 202, 537, 178,
+ 538, 539, 168, 157, 514, 515, 202, 202,
+ 202, 533, 202, 178, 538, 539, 168, 157,
+ 514, 515, 202, 202, 202, 533, 202, 538,
+ 538, 168, 157, 514, 515, 202, 202, 202,
+ 533, 202, 540, 175, 541, 542, 202, 157,
+ 514, 515, 202, 202, 202, 533, 202, 175,
+ 541, 542, 202, 157, 514, 515, 202, 202,
+ 202, 533, 202, 541, 541, 202, 157, 514,
+ 515, 202, 202, 202, 533, 202, 543, 202,
+ 544, 545, 202, 157, 514, 515, 202, 202,
+ 172, 202, 171, 202, 541, 541, 202, 157,
+ 514, 515, 202, 541, 541, 202, 157, 514,
+ 515, 202, 543, 202, 541, 541, 202, 157,
+ 514, 515, 202, 543, 202, 544, 541, 202,
+ 157, 514, 515, 202, 202, 172, 202, 523,
+ 171, 360, 360, 98, 364, 360, 79, 194,
+ 195, 360, 360, 360, 365, 360, 523, 360,
+ 547, 546, 548, 548, 546, 186, 549, 550,
+ 546, 548, 548, 546, 186, 549, 550, 546,
+ 551, 546, 546, 552, 549, 550, 546, 549,
+ 550, 546, 553, 546, 549, 554, 546, 549,
+ 555, 546, 549, 546, 551, 546, 546, 546,
+ 549, 550, 546, 0
};
static const short _indic_syllable_machine_trans_targs[] = {
178, 200, 207, 209, 210, 4, 213, 5,
7, 216, 8, 10, 219, 11, 13, 222,
14, 16, 17, 199, 19, 20, 221, 22,
- 23, 218, 25, 26, 215, 224, 229, 233,
- 236, 240, 243, 247, 250, 254, 257, 178,
- 280, 287, 289, 290, 41, 293, 42, 44,
- 296, 45, 47, 299, 48, 50, 302, 51,
- 53, 54, 279, 56, 57, 301, 59, 60,
- 298, 62, 63, 295, 304, 309, 313, 316,
- 320, 323, 327, 330, 334, 338, 178, 359,
- 366, 368, 369, 78, 372, 178, 79, 81,
- 375, 82, 84, 378, 85, 87, 381, 88,
- 90, 91, 358, 93, 94, 380, 96, 97,
- 377, 99, 100, 374, 383, 388, 392, 395,
- 399, 402, 406, 409, 413, 178, 440, 447,
- 449, 450, 114, 453, 115, 117, 456, 118,
- 120, 459, 121, 123, 462, 124, 126, 127,
- 439, 129, 130, 461, 132, 133, 458, 135,
- 136, 455, 464, 469, 473, 476, 480, 483,
- 487, 490, 494, 497, 417, 502, 513, 152,
- 516, 154, 519, 155, 157, 522, 158, 160,
- 525, 161, 528, 530, 531, 166, 167, 527,
- 169, 170, 524, 172, 173, 521, 175, 176,
- 518, 178, 536, 178, 179, 259, 339, 341,
- 416, 418, 361, 362, 419, 415, 498, 499,
- 386, 534, 387, 178, 180, 182, 36, 258,
- 202, 203, 256, 227, 228, 181, 35, 183,
- 252, 1, 184, 186, 34, 251, 249, 185,
- 33, 187, 245, 188, 190, 32, 244, 242,
- 189, 31, 191, 238, 192, 194, 30, 237,
- 235, 193, 29, 195, 231, 196, 198, 28,
- 230, 226, 197, 27, 212, 0, 201, 206,
- 178, 204, 205, 208, 2, 211, 3, 214,
- 6, 24, 217, 9, 21, 220, 12, 18,
- 223, 15, 225, 232, 234, 239, 241, 246,
- 248, 253, 255, 178, 260, 262, 73, 336,
- 282, 283, 337, 307, 308, 261, 72, 263,
- 332, 38, 264, 266, 71, 331, 329, 265,
- 70, 267, 325, 268, 270, 69, 324, 322,
- 269, 68, 271, 318, 272, 274, 67, 317,
- 315, 273, 66, 275, 311, 276, 278, 65,
- 310, 306, 277, 64, 292, 37, 281, 286,
- 178, 284, 285, 288, 39, 291, 40, 294,
- 43, 61, 297, 46, 58, 300, 49, 55,
- 303, 52, 305, 312, 314, 319, 321, 326,
- 328, 333, 335, 178, 340, 109, 342, 411,
- 75, 343, 345, 108, 410, 408, 344, 107,
- 346, 404, 347, 349, 106, 403, 401, 348,
- 105, 350, 397, 351, 353, 104, 396, 394,
- 352, 103, 354, 390, 355, 357, 102, 389,
- 385, 356, 101, 371, 74, 360, 365, 178,
- 363, 364, 367, 76, 370, 77, 373, 80,
- 98, 376, 83, 95, 379, 86, 92, 382,
- 89, 384, 391, 393, 398, 400, 405, 407,
- 412, 414, 178, 178, 420, 422, 146, 145,
- 442, 443, 496, 467, 468, 421, 423, 492,
- 111, 424, 426, 144, 491, 489, 425, 143,
- 427, 485, 428, 430, 142, 484, 482, 429,
- 141, 431, 478, 432, 434, 140, 477, 475,
- 433, 139, 435, 471, 436, 438, 138, 470,
- 466, 437, 137, 452, 110, 441, 446, 178,
- 444, 445, 448, 112, 451, 113, 454, 116,
- 134, 457, 119, 131, 460, 122, 128, 463,
- 125, 465, 472, 474, 479, 481, 486, 488,
- 493, 495, 147, 500, 501, 515, 504, 505,
- 533, 148, 509, 503, 508, 506, 507, 510,
- 511, 150, 514, 512, 149, 151, 517, 153,
- 174, 163, 520, 156, 171, 523, 159, 168,
- 526, 162, 165, 529, 164, 532, 178, 535,
- 177, 538, 539, 537, 542, 178, 540, 541
+ 23, 218, 25, 26, 215, 224, 228, 232,
+ 235, 239, 242, 246, 249, 253, 256, 178,
+ 279, 286, 288, 289, 41, 292, 42, 44,
+ 295, 45, 47, 298, 48, 50, 301, 51,
+ 53, 54, 278, 56, 57, 300, 59, 60,
+ 297, 62, 63, 294, 303, 307, 311, 314,
+ 318, 321, 325, 328, 332, 336, 178, 357,
+ 364, 366, 367, 78, 370, 178, 79, 81,
+ 373, 82, 84, 376, 85, 87, 379, 88,
+ 90, 91, 356, 93, 94, 378, 96, 97,
+ 375, 99, 100, 372, 381, 385, 389, 392,
+ 396, 399, 403, 406, 410, 178, 437, 444,
+ 446, 447, 114, 450, 115, 117, 453, 118,
+ 120, 456, 121, 123, 459, 124, 126, 127,
+ 436, 129, 130, 458, 132, 133, 455, 135,
+ 136, 452, 461, 465, 469, 472, 476, 479,
+ 483, 486, 490, 493, 414, 498, 509, 152,
+ 512, 154, 515, 155, 157, 518, 158, 160,
+ 521, 161, 524, 526, 527, 166, 167, 523,
+ 169, 170, 520, 172, 173, 517, 175, 176,
+ 514, 178, 532, 178, 179, 258, 337, 339,
+ 413, 415, 359, 360, 416, 412, 494, 495,
+ 384, 530, 178, 180, 182, 36, 257, 202,
+ 203, 255, 227, 181, 35, 183, 251, 1,
+ 184, 186, 34, 250, 248, 185, 33, 187,
+ 244, 188, 190, 32, 243, 241, 189, 31,
+ 191, 237, 192, 194, 30, 236, 234, 193,
+ 29, 195, 230, 196, 198, 28, 229, 226,
+ 197, 27, 212, 0, 201, 206, 178, 204,
+ 205, 208, 2, 211, 3, 214, 6, 24,
+ 217, 9, 21, 220, 12, 18, 223, 15,
+ 225, 231, 233, 238, 240, 245, 247, 252,
+ 254, 178, 259, 261, 73, 334, 281, 282,
+ 335, 306, 260, 72, 262, 330, 38, 263,
+ 265, 71, 329, 327, 264, 70, 266, 323,
+ 267, 269, 69, 322, 320, 268, 68, 270,
+ 316, 271, 273, 67, 315, 313, 272, 66,
+ 274, 309, 275, 277, 65, 308, 305, 276,
+ 64, 291, 37, 280, 285, 178, 283, 284,
+ 287, 39, 290, 40, 293, 43, 61, 296,
+ 46, 58, 299, 49, 55, 302, 52, 304,
+ 310, 312, 317, 319, 324, 326, 331, 333,
+ 178, 338, 109, 340, 408, 75, 341, 343,
+ 108, 407, 405, 342, 107, 344, 401, 345,
+ 347, 106, 400, 398, 346, 105, 348, 394,
+ 349, 351, 104, 393, 391, 350, 103, 352,
+ 387, 353, 355, 102, 386, 383, 354, 101,
+ 369, 74, 358, 363, 178, 361, 362, 365,
+ 76, 368, 77, 371, 80, 98, 374, 83,
+ 95, 377, 86, 92, 380, 89, 382, 388,
+ 390, 395, 397, 402, 404, 409, 411, 178,
+ 178, 417, 419, 146, 145, 439, 440, 492,
+ 464, 418, 420, 488, 111, 421, 423, 144,
+ 487, 485, 422, 143, 424, 481, 425, 427,
+ 142, 480, 478, 426, 141, 428, 474, 429,
+ 431, 140, 473, 471, 430, 139, 432, 467,
+ 433, 435, 138, 466, 463, 434, 137, 449,
+ 110, 438, 443, 178, 441, 442, 445, 112,
+ 448, 113, 451, 116, 134, 454, 119, 131,
+ 457, 122, 128, 460, 125, 462, 468, 470,
+ 475, 477, 482, 484, 489, 491, 147, 496,
+ 497, 511, 500, 501, 529, 148, 505, 499,
+ 504, 502, 503, 506, 507, 150, 510, 508,
+ 149, 151, 513, 153, 174, 163, 516, 156,
+ 171, 519, 159, 168, 522, 162, 165, 525,
+ 164, 528, 178, 531, 177, 534, 535, 533,
+ 538, 178, 536, 537
};
static const char _indic_syllable_machine_trans_actions[] = {
@@ -1285,51 +1087,51 @@ static const char _indic_syllable_machine_trans_actions[] = {
0, 0, 2, 0, 0, 2, 0, 0,
2, 9, 0, 12, 2, 2, 6, 2,
13, 13, 0, 0, 2, 2, 6, 2,
- 6, 2, 6, 14, 2, 2, 0, 2,
- 0, 0, 2, 2, 2, 2, 0, 2,
- 2, 0, 2, 2, 0, 2, 2, 2,
- 0, 2, 2, 2, 2, 0, 2, 2,
- 2, 0, 2, 2, 2, 2, 0, 2,
- 2, 2, 0, 2, 2, 2, 2, 0,
- 2, 2, 2, 0, 2, 0, 0, 0,
- 15, 0, 0, 2, 0, 2, 0, 2,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 16, 2, 2, 0, 2,
- 0, 0, 2, 2, 2, 2, 0, 2,
- 2, 0, 2, 2, 0, 2, 2, 2,
- 0, 2, 2, 2, 2, 0, 2, 2,
- 2, 0, 2, 2, 2, 2, 0, 2,
- 2, 2, 0, 2, 2, 2, 2, 0,
- 2, 2, 2, 0, 2, 0, 0, 0,
- 17, 0, 0, 2, 0, 2, 0, 2,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 18, 6, 0, 6, 6,
- 0, 6, 2, 0, 6, 2, 6, 0,
- 6, 6, 6, 2, 0, 6, 2, 6,
- 0, 6, 6, 6, 2, 0, 6, 2,
- 6, 0, 6, 6, 6, 2, 0, 6,
- 2, 6, 0, 6, 0, 0, 0, 19,
- 0, 0, 2, 0, 2, 0, 2, 0,
- 0, 2, 0, 0, 2, 0, 0, 2,
- 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 20, 21, 2, 2, 0, 0,
- 0, 0, 2, 2, 2, 2, 2, 2,
- 0, 2, 2, 0, 2, 2, 2, 0,
+ 6, 2, 14, 2, 2, 0, 2, 0,
+ 0, 2, 2, 2, 0, 2, 2, 0,
+ 2, 2, 0, 2, 2, 2, 0, 2,
+ 2, 2, 2, 0, 2, 2, 2, 0,
2, 2, 2, 2, 0, 2, 2, 2,
0, 2, 2, 2, 2, 0, 2, 2,
- 2, 0, 2, 2, 2, 2, 0, 2,
- 2, 2, 0, 2, 0, 0, 0, 22,
- 0, 0, 2, 0, 2, 0, 2, 0,
+ 2, 0, 2, 0, 0, 0, 15, 0,
+ 0, 2, 0, 2, 0, 2, 0, 0,
+ 2, 0, 0, 2, 0, 0, 2, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 16, 2, 2, 0, 2, 0, 0,
+ 2, 2, 2, 0, 2, 2, 0, 2,
+ 2, 0, 2, 2, 2, 0, 2, 2,
+ 2, 2, 0, 2, 2, 2, 0, 2,
+ 2, 2, 2, 0, 2, 2, 2, 0,
+ 2, 2, 2, 2, 0, 2, 2, 2,
+ 0, 2, 0, 0, 0, 17, 0, 0,
+ 2, 0, 2, 0, 2, 0, 0, 2,
+ 0, 0, 2, 0, 0, 2, 0, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2,
+ 18, 6, 0, 6, 6, 0, 6, 2,
+ 0, 6, 2, 6, 0, 6, 6, 6,
+ 2, 0, 6, 2, 6, 0, 6, 6,
+ 6, 2, 0, 6, 2, 6, 0, 6,
+ 6, 6, 2, 0, 6, 2, 6, 0,
+ 6, 0, 0, 0, 19, 0, 0, 2,
+ 0, 2, 0, 2, 0, 0, 2, 0,
+ 0, 2, 0, 0, 2, 0, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 20,
+ 21, 2, 2, 0, 0, 0, 0, 2,
+ 2, 2, 2, 2, 0, 2, 2, 0,
+ 2, 2, 2, 0, 2, 2, 2, 2,
+ 0, 2, 2, 2, 0, 2, 2, 2,
+ 2, 0, 2, 2, 2, 0, 2, 2,
+ 2, 2, 0, 2, 2, 2, 0, 2,
+ 0, 0, 0, 22, 0, 0, 2, 0,
+ 2, 0, 2, 0, 0, 2, 0, 0,
+ 2, 0, 0, 2, 0, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 0, 0,
+ 8, 2, 0, 0, 2, 0, 2, 0,
+ 0, 0, 0, 8, 8, 0, 8, 8,
+ 0, 0, 2, 0, 0, 0, 2, 0,
0, 2, 0, 0, 2, 0, 0, 2,
- 0, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 0, 0, 8, 2, 0, 0,
- 2, 0, 2, 0, 0, 0, 0, 8,
- 8, 0, 8, 8, 0, 0, 2, 0,
- 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 0, 2, 0, 2, 23, 2,
- 0, 0, 0, 0, 0, 24, 0, 0
+ 0, 2, 23, 2, 0, 0, 0, 0,
+ 0, 24, 0, 0
};
static const char _indic_syllable_machine_to_state_actions[] = {
@@ -1400,7 +1202,7 @@ static const char _indic_syllable_machine_to_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0
};
static const char _indic_syllable_machine_from_state_actions[] = {
@@ -1471,7 +1273,7 @@ static const char _indic_syllable_machine_from_state_actions[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0
};
static const short _indic_syllable_machine_eof_trans[] = {
@@ -1497,52 +1299,52 @@ static const short _indic_syllable_machine_eof_trans[] = {
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
- 1, 186, 0, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 284, 284, 284, 284, 284,
- 284, 284, 284, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 364, 364, 364, 364, 364, 364, 364, 364,
- 435, 364, 435, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 436, 436, 436, 436, 436, 436,
- 436, 436, 364, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 364, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 364, 551, 551,
- 551, 551, 551, 551, 551, 551, 551
+ 1, 186, 0, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 282, 282, 282, 282, 282, 282, 282,
+ 282, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 361, 361, 361,
+ 361, 361, 361, 361, 361, 432, 361, 432,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 433, 433,
+ 433, 433, 433, 433, 433, 433, 361, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 361, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 361, 547, 547, 547, 547, 547, 547,
+ 547, 547, 547
};
static const int indic_syllable_machine_start = 178;
@@ -1556,7 +1358,7 @@ static const int indic_syllable_machine_en_main = 178;
-#line 97 "hb-ot-shape-complex-indic-machine.rl"
+#line 96 "hb-ot-shape-complex-indic-machine.rl"
#define found_syllable(syllable_type) \
@@ -1576,7 +1378,7 @@ find_syllables (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 1580 "hb-ot-shape-complex-indic-machine.hh"
+#line 1382 "hb-ot-shape-complex-indic-machine.hh"
{
cs = indic_syllable_machine_start;
ts = 0;
@@ -1584,7 +1386,7 @@ find_syllables (hb_buffer_t *buffer)
act = 0;
}
-#line 118 "hb-ot-shape-complex-indic-machine.rl"
+#line 117 "hb-ot-shape-complex-indic-machine.rl"
p = 0;
@@ -1593,7 +1395,7 @@ find_syllables (hb_buffer_t *buffer)
unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 1597 "hb-ot-shape-complex-indic-machine.hh"
+#line 1399 "hb-ot-shape-complex-indic-machine.hh"
{
int _slen;
int _trans;
@@ -1607,7 +1409,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
-#line 1611 "hb-ot-shape-complex-indic-machine.hh"
+#line 1413 "hb-ot-shape-complex-indic-machine.hh"
}
_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -1630,71 +1432,71 @@ _eof_trans:
{te = p+1;}
break;
case 15:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (consonant_syllable); }}
break;
case 17:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (vowel_syllable); }}
break;
case 22:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (standalone_cluster); }}
break;
case 24:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (symbol_cluster); }}
break;
case 19:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
case 12:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
{te = p+1;{ found_syllable (non_indic_cluster); }}
break;
case 14:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (consonant_syllable); }}
break;
case 16:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (vowel_syllable); }}
break;
case 21:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (standalone_cluster); }}
break;
case 23:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }}
break;
case 18:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
case 20:
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
{te = p;p--;{ found_syllable (non_indic_cluster); }}
break;
case 1:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
break;
case 3:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 88 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
break;
case 7:
-#line 90 "hb-ot-shape-complex-indic-machine.rl"
+#line 89 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
break;
case 9:
-#line 91 "hb-ot-shape-complex-indic-machine.rl"
+#line 90 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
break;
case 4:
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
case 5:
@@ -1715,22 +1517,22 @@ _eof_trans:
case 8:
#line 1 "NONE"
{te = p+1;}
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 87 "hb-ot-shape-complex-indic-machine.rl"
{act = 1;}
break;
case 6:
#line 1 "NONE"
{te = p+1;}
-#line 92 "hb-ot-shape-complex-indic-machine.rl"
+#line 91 "hb-ot-shape-complex-indic-machine.rl"
{act = 5;}
break;
case 13:
#line 1 "NONE"
{te = p+1;}
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 92 "hb-ot-shape-complex-indic-machine.rl"
{act = 6;}
break;
-#line 1734 "hb-ot-shape-complex-indic-machine.hh"
+#line 1536 "hb-ot-shape-complex-indic-machine.hh"
}
_again:
@@ -1739,7 +1541,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
-#line 1743 "hb-ot-shape-complex-indic-machine.hh"
+#line 1545 "hb-ot-shape-complex-indic-machine.hh"
}
if ( ++p != pe )
@@ -1755,7 +1557,7 @@ _again:
}
-#line 127 "hb-ot-shape-complex-indic-machine.rl"
+#line 126 "hb-ot-shape-complex-indic-machine.rl"
}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh
index a999098dde0..4fdc2f80ccf 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh
@@ -60,11 +60,10 @@ enum indic_category_t {
OT_Repha = 15, /* Atomically-encoded logical or visual repha. */
OT_Ra = 16,
OT_CM = 17, /* Consonant-Medial. */
- OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */
- OT_CM2 = 31 /* Consonant-Medial, second slot. */
+ OT_Symbol = 18 /* Avagraha, etc that take marks (SM,A,VD). */
};
-#define MEDIAL_FLAGS (FLAG (OT_CM) | FLAG (OT_CM2))
+#define MEDIAL_FLAGS (FLAG (OT_CM))
/* Note:
*
@@ -109,27 +108,31 @@ enum indic_syllabic_category_t {
INDIC_SYLLABIC_CATEGORY_AVAGRAHA = OT_Symbol,
INDIC_SYLLABIC_CATEGORY_BINDU = OT_SM,
- INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* TODO */
+ INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* Don't care. */
INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK = OT_A,
INDIC_SYLLABIC_CATEGORY_CONSONANT = OT_C,
INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD = OT_C,
INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL = OT_CM,
INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER = OT_C,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER = OT_M, /* U+17CD only. */
INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_CM,
INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER = OT_PLACEHOLDER,
INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA = OT_Repha,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED = OT_X, /* Don't care. */
INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_CM,
INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA = OT_N,
+ INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER = OT_Repha, /* TODO */
INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK = OT_SM,
- INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_H, /* TODO */
+ INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_Coeng,
INDIC_SYLLABIC_CATEGORY_JOINER = OT_ZWJ,
INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER = OT_X,
INDIC_SYLLABIC_CATEGORY_NON_JOINER = OT_ZWNJ,
INDIC_SYLLABIC_CATEGORY_NUKTA = OT_N,
INDIC_SYLLABIC_CATEGORY_NUMBER = OT_PLACEHOLDER,
- INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* TODO */
- INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_H, /* TODO */
+ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* Don't care. */
+ INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_M, /* Is like a vowel matra. */
INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER = OT_RS,
+ INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER = OT_M, /* Misc Khmer signs. */
INDIC_SYLLABIC_CATEGORY_TONE_LETTER = OT_X,
INDIC_SYLLABIC_CATEGORY_TONE_MARK = OT_N,
INDIC_SYLLABIC_CATEGORY_VIRAMA = OT_H,
@@ -162,17 +165,23 @@ enum indic_matra_category_t {
};
#define INDIC_COMBINE_CATEGORIES(S,M) \
- (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || \
- ( \
- S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
- S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
- S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
- S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
- S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
- S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
- false)) + \
- ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
- ((M << 8) | S))
+ ( \
+ ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+ ( S | \
+ ( \
+ ( \
+ S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \
+ S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \
+ S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \
+ S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \
+ S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \
+ S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \
+ false \
+ ? M : INDIC_MATRA_CATEGORY_NOT_APPLICABLE \
+ ) << 8 \
+ ) \
+ ) \
+ )
HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
hb_indic_get_categories (hb_codepoint_t u);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc
index 9e6fa3f89a7..b43e347054a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc
@@ -2,67 +2,71 @@
/*
* The following table is generated by running:
*
- * ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt
+ * ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt
*
* on files with these headers:
*
- * # IndicSyllabicCategory-7.0.0.txt
- * # Date: 2014-06-03, 07:00:00 GMT [KW, LI, AG, RP]
- * # IndicMatraCategory-7.0.0.txt
- * # Date: 2014-06-03, 07:00:00 GMT [KW, LI, AG, RP]
- * # Blocks-7.0.0.txt
- * # Date: 2014-04-03, 23:23:00 GMT [RP, KW]
+ * # IndicSyllabicCategory-9.0.0.txt
+ * # Date: 2016-05-21, 02:46:00 GMT [RP]
+ * # IndicPositionalCategory-9.0.0.txt
+ * # Date: 2016-02-25, 00:48:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
*/
#include "hb-ot-shape-complex-indic-private.hh"
-#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 13 chars; Avagraha */
-#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 59 chars; Bindu */
+#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 15 chars; Avagraha */
+#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 67 chars; Bindu */
#define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER /* 20 chars; Brahmi_Joining_Number */
-#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 30 chars; Cantillation_Mark */
-#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 1744 chars; Consonant */
-#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 7 chars; Consonant_Dead */
-#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 61 chars; Consonant_Final */
+#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 53 chars; Cantillation_Mark */
+#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 1907 chars; Consonant */
+#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 10 chars; Consonant_Dead */
+#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 62 chars; Consonant_Final */
#define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER /* 5 chars; Consonant_Head_Letter */
-#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 19 chars; Consonant_Medial */
-#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 11 chars; Consonant_Placeholder */
+#define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */
+#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 22 chars; Consonant_Medial */
+#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 16 chars; Consonant_Placeholder */
#define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 1 chars; Consonant_Preceding_Repha */
-#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 61 chars; Consonant_Subjoined */
+#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 2 chars; Consonant_Prefixed */
+#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 90 chars; Consonant_Subjoined */
#define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 4 chars; Consonant_Succeeding_Repha */
+#define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 4 chars; Consonant_With_Stacker */
#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 2 chars; Gemination_Mark */
#define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER /* 7 chars; Invisible_Stacker */
#define ISC_ZWJ INDIC_SYLLABIC_CATEGORY_JOINER /* 1 chars; Joiner */
#define ISC_ML INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER /* 1 chars; Modifying_Letter */
#define ISC_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */
-#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 18 chars; Nukta */
-#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 408 chars; Number */
+#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 24 chars; Nukta */
+#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 459 chars; Number */
#define ISC_NJ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER /* 1 chars; Number_Joiner */
#define ISC_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */
-#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 15 chars; Pure_Killer */
-#define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 3 chars; Register_Shifter */
+#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 16 chars; Pure_Killer */
+#define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 2 chars; Register_Shifter */
+#define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER /* 22 chars; Syllable_Modifier */
#define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */
-#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 62 chars; Tone_Mark */
-#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 22 chars; Virama */
-#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 29 chars; Visarga */
+#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */
+#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 24 chars; Virama */
+#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 31 chars; Visarga */
#define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */
-#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 553 chars; Vowel_Dependent */
-#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 395 chars; Vowel_Independent */
+#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 602 chars; Vowel_Dependent */
+#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 431 chars; Vowel_Independent */
-#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 142 chars; Bottom */
+#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 300 chars; Bottom */
#define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT /* 2 chars; Bottom_And_Right */
#define IMC_L INDIC_MATRA_CATEGORY_LEFT /* 57 chars; Left */
#define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT /* 21 chars; Left_And_Right */
#define IMC_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */
-#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 2 chars; Overstruck */
-#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 163 chars; Right */
-#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 169 chars; Top */
+#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */
+#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 258 chars; Right */
+#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 342 chars; Top */
#define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM /* 10 chars; Top_And_Bottom */
#define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT /* 1 chars; Top_And_Bottom_And_Right */
#define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT /* 6 chars; Top_And_Left */
#define IMC_TLR INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT /* 4 chars; Top_And_Left_And_Right */
#define IMC_TR INDIC_MATRA_CATEGORY_TOP_AND_RIGHT /* 13 chars; Top_And_Right */
-#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT /* 15 chars; Visual_Order_Left */
+#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT /* 19 chars; Visual_Order_Left */
#define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)
@@ -79,29 +83,33 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 0030 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0038 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0x00d0u 24
+#define indic_offset_0x00b0u 24
/* Latin-1 Supplement */
+ /* 00B0 */ _(x,x), _(x,x), _(SM,x), _(SM,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 00B8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 00C0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 00C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 00D0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(CP,x),
-#define indic_offset_0x0900u 32
+#define indic_offset_0x0900u 64
/* Devanagari */
- /* 0900 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0900 */ _(Bi,T), _(Bi,T), _(Bi,T), _(Vs,R), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 0908 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 0910 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0920 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0928 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0930 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 0938 */ _(C,x), _(C,x), _(M,T), _(M,R), _(N,x), _(A,x), _(M,R), _(M,L),
+ /* 0938 */ _(C,x), _(C,x), _(M,T), _(M,R), _(N,B), _(A,x), _(M,R), _(M,L),
/* 0940 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T),
/* 0948 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(V,B), _(M,L), _(M,R),
- /* 0950 */ _(x,x), _(TM,x), _(TM,x), _(x,x), _(x,x), _(M,T), _(M,B), _(M,B),
+ /* 0950 */ _(x,x), _(Ca,T), _(Ca,B), _(x,T), _(x,T), _(M,T), _(M,B), _(M,B),
/* 0958 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0960 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0968 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
@@ -110,14 +118,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Bengali */
- /* 0980 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0980 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0988 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x),
/* 0990 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 09A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 09A8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 09B0 */ _(C,x), _(x,x), _(C,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x),
- /* 09B8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,L),
+ /* 09B8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,L),
/* 09C0 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x), _(M,L),
/* 09C8 */ _(M,L), _(x,x), _(x,x), _(M,LR), _(M,LR), _(V,B), _(CD,x), _(x,x),
/* 09D0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R),
@@ -129,33 +137,33 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Gurmukhi */
- /* 0A00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0A00 */ _(x,x), _(Bi,T), _(Bi,T), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0A08 */ _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(x,x), _(x,x), _(VI,x),
/* 0A10 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0A18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0A28 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0A30 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(x,x),
- /* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(x,x), _(M,R), _(M,L),
+ /* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(x,x), _(M,R), _(M,L),
/* 0A40 */ _(M,R), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T),
/* 0A48 */ _(M,T), _(x,x), _(x,x), _(M,T), _(M,T), _(V,B), _(x,x), _(x,x),
/* 0A50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 0A58 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x),
/* 0A60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0A68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 0A70 */ _(Bi,x), _(GM,T), _(CP,x), _(CP,x), _(x,x), _(CM,x), _(x,x), _(x,x),
+ /* 0A70 */ _(Bi,T), _(GM,T), _(CP,x), _(CP,x), _(x,x), _(CM,B), _(x,x), _(x,x),
/* 0A78 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Gujarati */
- /* 0A80 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0A80 */ _(x,x), _(Bi,T), _(Bi,T), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0A88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x),
/* 0A90 */ _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0A98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0AA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0AA8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0AB0 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 0AB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,L),
+ /* 0AB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,L),
/* 0AC0 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(x,x), _(M,T),
/* 0AC8 */ _(M,T), _(M,TR), _(x,x), _(M,R), _(M,R), _(V,B), _(x,x), _(x,x),
/* 0AD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
@@ -163,18 +171,18 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 0AE0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0AE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0AF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 0AF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0AF8 */ _(x,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Oriya */
- /* 0B00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0B00 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x),
/* 0B10 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0B18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0B20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0B28 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0B30 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 0B38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,T),
+ /* 0B38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,T),
/* 0B40 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x), _(M,L),
/* 0B48 */ _(M,TL), _(x,x), _(x,x), _(M,LR),_(M,TLR), _(V,B), _(x,x), _(x,x),
/* 0B50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T), _(M,TR),
@@ -186,7 +194,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Tamil */
- /* 0B80 */ _(x,x), _(x,x), _(Bi,x), _(ML,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0B80 */ _(x,x), _(x,x), _(Bi,T), _(ML,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0B88 */ _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(x,x), _(VI,x), _(VI,x),
/* 0B90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(x,x), _(x,x),
/* 0B98 */ _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x), _(C,x), _(C,x),
@@ -194,7 +202,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 0BA8 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x),
/* 0BB0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0BB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), _(M,R),
- /* 0BC0 */ _(M,T), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(M,L), _(M,L),
+ /* 0BC0 */ _(M,T), _(M,R), _(M,R), _(x,x), _(x,x), _(x,x), _(M,L), _(M,L),
/* 0BC8 */ _(M,L), _(x,x), _(M,LR), _(M,LR), _(M,LR), _(V,T), _(x,x), _(x,x),
/* 0BD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R),
/* 0BD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
@@ -205,7 +213,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Telugu */
- /* 0C00 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0C00 */ _(Bi,T), _(Bi,R), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0C08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0C10 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0C18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -216,7 +224,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 0C40 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(M,T), _(M,T),
/* 0C48 */ _(M,TB), _(x,x), _(M,T), _(M,T), _(M,T), _(V,T), _(x,x), _(x,x),
/* 0C50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T), _(M,B), _(x,x),
- /* 0C58 */ _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0C58 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 0C60 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0C68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0C70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
@@ -224,26 +232,26 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Kannada */
- /* 0C80 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0C80 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0C90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0C98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0CA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0CA8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 0CB0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 0CB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,T),
+ /* 0CB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,T),
/* 0CC0 */ _(M,TR), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(M,T), _(M,TR),
/* 0CC8 */ _(M,TR), _(x,x), _(M,TR), _(M,TR), _(M,T), _(V,T), _(x,x), _(x,x),
/* 0CD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), _(M,R), _(x,x),
/* 0CD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(C,x), _(x,x),
/* 0CE0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0CE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 0CF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0CF0 */ _(x,x),_(CWS,x),_(CWS,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* 0CF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Malayalam */
- /* 0D00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0D00 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0D08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x),
/* 0D10 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
/* 0D18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -253,8 +261,8 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 0D38 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(A,x), _(M,R), _(M,R),
/* 0D40 */ _(M,R), _(M,R), _(M,R), _(M,B), _(M,B), _(x,x), _(M,L), _(M,L),
/* 0D48 */ _(M,L), _(x,x), _(M,LR), _(M,LR), _(M,LR), _(V,T),_(CPR,x), _(x,x),
- /* 0D50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R),
- /* 0D58 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 0D50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(CD,x), _(CD,x), _(CD,x), _(M,R),
+ /* 0D58 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(VI,x),
/* 0D60 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
/* 0D68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0D70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
@@ -262,7 +270,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* Sinhala */
- /* 0D80 */ _(x,x), _(x,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
+ /* 0D80 */ _(x,x), _(x,x), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x),
/* 0D88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 0D90 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x),
/* 0D98 */ _(x,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -278,7 +286,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 0DE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 0DF0 */ _(x,x), _(x,x), _(M,R), _(M,R), _(x,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0x1000u 1304
+#define indic_offset_0x1000u 1336
/* Myanmar */
@@ -289,52 +297,24 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 1018 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* 1020 */ _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 1028 */ _(VI,x), _(VI,x), _(VI,x), _(M,R), _(M,R), _(M,T), _(M,T), _(M,B),
- /* 1030 */ _(M,B), _(M,L), _(M,T), _(M,T), _(M,T), _(M,T), _(Bi,x), _(TM,x),
- /* 1038 */ _(Vs,x), _(IS,x), _(PK,T), _(CM,x), _(CM,x), _(CM,x), _(CM,x), _(C,x),
+ /* 1030 */ _(M,B), _(M,L), _(M,T), _(M,T), _(M,T), _(M,T), _(Bi,T), _(TM,B),
+ /* 1038 */ _(Vs,R), _(IS,x), _(PK,T), _(CM,R), _(CM,x), _(CM,B), _(CM,B), _(C,x),
/* 1040 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 1048 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(CP,x), _(x,x),
/* 1050 */ _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(M,R), _(M,R),
- /* 1058 */ _(M,B), _(M,B), _(C,x), _(C,x), _(C,x), _(C,x), _(CM,x), _(CM,x),
- /* 1060 */ _(CM,x), _(C,x), _(M,R), _(TM,x), _(TM,x), _(C,x), _(C,x), _(M,R),
- /* 1068 */ _(M,R), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(C,x),
+ /* 1058 */ _(M,B), _(M,B), _(C,x), _(C,x), _(C,x), _(C,x), _(CM,B), _(CM,B),
+ /* 1060 */ _(CM,B), _(C,x), _(M,R), _(TM,R), _(TM,R), _(C,x), _(C,x), _(M,R),
+ /* 1068 */ _(M,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(C,x), _(C,x),
/* 1070 */ _(C,x), _(M,T), _(M,T), _(M,T), _(M,T), _(C,x), _(C,x), _(C,x),
/* 1078 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1080 */ _(C,x), _(C,x), _(CM,x), _(M,R), _(M,L), _(M,T), _(M,T), _(TM,x),
- /* 1088 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(TM,x),
+ /* 1080 */ _(C,x), _(C,x), _(CM,B), _(M,R), _(M,L), _(M,T), _(M,T), _(TM,R),
+ /* 1088 */ _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,B), _(C,x), _(TM,R),
/* 1090 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1098 */ _(Nd,x), _(Nd,x), _(TM,x), _(TM,x), _(M,R), _(M,T), _(x,x), _(x,x),
+ /* 1098 */ _(Nd,x), _(Nd,x), _(TM,R), _(TM,R), _(M,R), _(M,T), _(x,x), _(x,x),
-#define indic_offset_0x1700u 1464
+#define indic_offset_0x1780u 1496
- /* Tagalog */
-
- /* 1700 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1708 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x),
- /* 1710 */ _(C,x), _(C,x), _(M,T), _(M,B), _(PK,B), _(x,x), _(x,x), _(x,x),
- /* 1718 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Hanunoo */
-
- /* 1720 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1728 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1730 */ _(C,x), _(C,x), _(M,T), _(M,B), _(PK,B), _(x,x), _(x,x), _(x,x),
- /* 1738 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Buhid */
-
- /* 1740 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1748 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1750 */ _(C,x), _(C,x), _(M,T), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1758 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Tagbanwa */
-
- /* 1760 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1768 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x),
- /* 1770 */ _(C,x), _(x,x), _(M,T), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1778 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
/* Khmer */
/* 1780 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
@@ -345,515 +325,72 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
/* 17A8 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
/* 17B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(M,R), _(M,T),
/* 17B8 */ _(M,T), _(M,T), _(M,T), _(M,B), _(M,B), _(M,B), _(M,TL),_(M,TLR),
- /* 17C0 */ _(M,LR), _(M,L), _(M,L), _(M,L), _(M,LR), _(M,LR), _(Bi,x), _(Vs,x),
- /* 17C8 */ _(M,R), _(RS,T), _(RS,T), _(RS,T),_(CSR,T), _(M,T), _(M,T), _(M,T),
- /* 17D0 */ _(M,T), _(PK,T), _(IS,x), _(M,T), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 17D8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(A,x), _(x,x), _(x,x), _(x,x),
+ /* 17C0 */ _(M,LR), _(M,L), _(M,L), _(M,L), _(M,LR), _(M,LR), _(Bi,T), _(Vs,R),
+ /* 17C8 */ _(M,R), _(RS,T), _(RS,T), _(SM,T),_(CSR,T), _(CK,T), _(SM,T), _(SM,T),
+ /* 17D0 */ _(SM,T), _(PK,T), _(IS,x), _(SM,T), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 17D8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(A,x), _(SM,T), _(x,x), _(x,x),
/* 17E0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* 17E8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0x1900u 1704
-
-
- /* Limbu */
-
- /* 1900 */ _(CP,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1908 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1910 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x),
- /* 1920 */ _(M,T), _(M,T), _(M,B), _(M,R), _(M,R), _(M,TR), _(M,TR), _(M,T),
- /* 1928 */ _(M,T), _(CS,x), _(CS,x), _(CS,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1930 */ _(CF,x), _(CF,x), _(Bi,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
- /* 1938 */ _(CF,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1940 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x),
- /* 1948 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-
- /* Tai Le */
-
- /* 1950 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1958 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1960 */ _(C,x), _(C,x), _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),
- /* 1968 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(x,x), _(x,x),
- /* 1970 */ _(TL,x), _(TL,x), _(TL,x), _(TL,x), _(TL,x), _(x,x), _(x,x), _(x,x),
- /* 1978 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* New Tai Lue */
-
- /* 1980 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1988 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1990 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 19A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 19A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19B0 */ _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,L), _(M,L), _(M,L),
- /* 19B8 */ _(M,R), _(M,R), _(M,L), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R),
- /* 19C0 */ _(M,R), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
- /* 19C8 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 19D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19E0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19E8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19F0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 19F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Buginese */
-
- /* 1A00 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T),
- /* 1A18 */ _(M,B), _(M,L), _(M,R), _(M,T), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Tai Tham */
-
- /* 1A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A38 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A40 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1A48 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x),
- /* 1A50 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(CM,L), _(CM,x), _(CF,x),
- /* 1A58 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(x,x),
- /* 1A60 */ _(IS,x), _(M,R), _(M,T), _(M,R), _(M,R), _(M,T), _(M,T), _(M,T),
- /* 1A68 */ _(M,T), _(M,B), _(M,B), _(M,T), _(M,B), _(M,R), _(M,L), _(M,L),
- /* 1A70 */ _(M,L), _(M,L), _(M,L), _(M,T), _(M,T), _(TM,x), _(TM,x), _(TM,x),
- /* 1A78 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1A80 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1A88 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1A90 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1A98 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x1b00u 2120
-
-
- /* Balinese */
-
- /* 1B00 */ _(Bi,x), _(Bi,x), _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x),
- /* 1B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 1B10 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(N,x), _(M,R), _(M,T), _(M,T),
- /* 1B38 */ _(M,B), _(M,B), _(M,B), _(M,BR), _(M,TB),_(M,TBR), _(M,L), _(M,L),
- /* 1B40 */ _(M,LR), _(M,LR), _(M,T), _(M,TR), _(V,R), _(C,x), _(C,x), _(C,x),
- /* 1B48 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1B58 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B68 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1B78 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Sundanese */
-
- /* 1B80 */ _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 1B88 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B90 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1B98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BA0 */ _(C,x), _(CS,x), _(CS,x), _(CS,x), _(M,T), _(M,B), _(M,L), _(M,R),
- /* 1BA8 */ _(M,T), _(M,T), _(PK,R), _(IS,x), _(CS,x), _(CS,x), _(C,x), _(C,x),
- /* 1BB0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1BB8 */ _(Nd,x), _(Nd,x), _(A,x), _(C,x), _(C,x), _(C,x), _(CF,x), _(CF,x),
-
- /* Batak */
-
- /* 1BC0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BC8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BD0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BD8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1BE0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(N,x), _(M,R),
- /* 1BE8 */ _(M,T), _(M,T), _(M,R), _(M,R), _(M,R), _(M,T), _(M,R), _(M,T),
- /* 1BF0 */ _(CF,x), _(CF,x), _(PK,R), _(PK,R), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1BF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Lepcha */
-
- /* 1C00 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1C08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1C10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1C18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 1C20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(CS,x), _(CS,x), _(M,R), _(M,L),
- /* 1C28 */ _(M,L), _(M,TL), _(M,R), _(M,R), _(M,B), _(CF,x), _(CF,x), _(CF,x),
- /* 1C30 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(Bi,L), _(Bi,L), _(x,x), _(N,x),
- /* 1C38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1C40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 1C48 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x), _(C,x),
-
-#define indic_offset_0x1cd0u 2456
+#define indic_offset_0x1cd0u 1608
/* Vedic Extensions */
- /* 1CD0 */ _(TM,x), _(TM,x), _(TM,x), _(x,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x),
- /* 1CD8 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x),
- /* 1CE0 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1CE8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(TM,x), _(x,x), _(x,x), _(x,x),
+ /* 1CD0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(x,x), _(Ca,O), _(Ca,B), _(Ca,B), _(Ca,B),
+ /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B),
+ /* 1CE0 */ _(Ca,T), _(Ca,R), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O),
+ /* 1CE8 */ _(x,O), _(x,x), _(x,x), _(x,x), _(x,x), _(x,B), _(x,x), _(x,x),
+ /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(Ca,T), _(x,x), _(x,x), _(x,x),
+ /* 1CF8 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0x2008u 2496
+#define indic_offset_0x2008u 1656
/* General Punctuation */
/* 2008 */ _(x,x), _(x,x), _(x,x), _(x,x),_(ZWNJ,x),_(ZWJ,x), _(x,x), _(x,x),
- /* 2010 */ _(x,x), _(x,x), _(CP,x), _(CP,x), _(CP,x), _(x,x), _(x,x), _(x,x),
+ /* 2010 */ _(CP,x), _(CP,x), _(CP,x), _(CP,x), _(CP,x), _(x,x), _(x,x), _(x,x),
-#define indic_offset_0xa800u 2512
+#define indic_offset_0x2070u 1672
- /* Syloti Nagri */
+ /* Superscripts and Subscripts */
- /* A800 */ _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(PK,T), _(C,x),
- /* A808 */ _(C,x), _(C,x), _(C,x), _(Bi,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A810 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A818 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A820 */ _(C,x), _(C,x), _(C,x), _(M,R), _(M,R), _(M,B), _(M,T), _(M,R),
- /* A828 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A830 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A838 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 2070 */ _(x,x), _(x,x), _(x,x), _(x,x), _(SM,x), _(x,x), _(x,x), _(x,x),
+ /* 2078 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* 2080 */ _(x,x), _(x,x), _(SM,x), _(SM,x), _(SM,x), _(x,x), _(x,x), _(x,x),
- /* Phags-pa */
+#define indic_offset_0xa8e0u 1696
- /* A840 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A848 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A850 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A858 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Vo,x), _(Vo,x),
- /* A860 */ _(Vo,x), _(Vo,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Vo,x), _(CS,x),
- /* A868 */ _(CS,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A870 */ _(C,x), _(CS,x), _(C,x), _(Bi,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A878 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Saurashtra */
-
- /* A880 */ _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* A888 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* A890 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A898 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A8A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A8A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A8B0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(CF,x), _(M,R), _(M,R), _(M,R),
- /* A8B8 */ _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R),
- /* A8C0 */ _(M,R), _(M,R), _(M,R), _(M,R), _(V,B), _(x,x), _(x,x), _(x,x),
- /* A8C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A8D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* A8D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Devanagari Extended */
- /* A8E0 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x),
- /* A8E8 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x),
- /* A8F0 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A8F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
+ /* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
+ /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T),
+ /* A8F0 */ _(Ca,T), _(Ca,T), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* Kayah Li */
+#define indic_offset_0xa9e0u 1720
- /* A900 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* A908 */ _(Nd,x), _(Nd,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A910 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A920 */ _(C,x), _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x),
- /* A928 */ _(Vo,x), _(Vo,x), _(Vo,x), _(TM,x), _(TM,x), _(TM,x), _(x,x), _(x,x),
-
- /* Rejang */
-
- /* A930 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A938 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A940 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,B),
- /* A948 */ _(M,B), _(M,B), _(M,T), _(M,B), _(M,B), _(M,B), _(M,B), _(CF,x),
- /* A950 */ _(CF,x), _(CF,x), _(CF,x), _(PK,R), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A958 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A960 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A968 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A970 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A978 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Javanese */
-
- /* A980 */ _(Bi,x), _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* A988 */ _(VI,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x), _(C,x),
- /* A990 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A9A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A9A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* A9B0 */ _(C,x), _(C,x), _(C,x), _(N,x), _(M,R), _(M,R), _(M,T), _(M,T),
- /* A9B8 */ _(M,B), _(M,B), _(M,L), _(M,L), _(M,T), _(CS,x), _(CM,x), _(CM,x),
- /* A9C0 */ _(V,BR), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A9C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* A9D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* A9D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Myanmar Extended-B */
- /* A9E0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(C,x),
+ /* A9E0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T), _(x,x), _(C,x),
/* A9E8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* A9F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
/* A9F8 */ _(Nd,x), _(Nd,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x),
- /* Cham */
+#define indic_offset_0xaa60u 1752
- /* AA00 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x),
- /* AA08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA28 */ _(C,x), _(M,T), _(M,T), _(M,T), _(M,T), _(M,B), _(M,T), _(M,L),
- /* AA30 */ _(M,L), _(M,T), _(M,B), _(CM,x), _(CM,L), _(CM,x), _(CM,x), _(x,x),
- /* AA38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AA40 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
- /* AA48 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(x,x), _(x,x),
- /* AA50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* AA58 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
/* Myanmar Extended-A */
/* AA60 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
/* AA68 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA70 */ _(x,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AA78 */ _(x,x), _(x,x), _(C,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(C,x),
+ /* AA70 */ _(x,x), _(C,x), _(C,x), _(C,x), _(CP,x), _(CP,x), _(CP,x), _(x,x),
+ /* AA78 */ _(x,x), _(x,x), _(C,x), _(TM,R), _(TM,T), _(TM,R), _(C,x), _(C,x),
- /* Tai Viet */
-
- /* AA80 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA88 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA90 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AA98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AAA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AAA8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AAB0 */ _(M,T), _(M,R), _(M,T), _(M,T), _(M,B),_(M,VOL),_(M,VOL), _(M,T),
- /* AAB8 */ _(M,T),_(M,VOL), _(M,R),_(M,VOL),_(M,VOL), _(M,R), _(M,T), _(TM,x),
- /* AAC0 */ _(TL,x), _(TM,x), _(TL,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AAC8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AAD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* AAD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Meetei Mayek Extensions */
-
- /* AAE0 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* AAE8 */ _(C,x), _(C,x), _(C,x), _(M,L), _(M,B), _(M,T), _(M,L), _(M,R),
- /* AAF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Vs,x), _(IS,x), _(x,x),
-
-#define indic_offset_0xabc0u 3272
-
-
- /* Meetei Mayek */
-
- /* ABC0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* ABC8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x),
- /* ABD0 */ _(C,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* ABD8 */ _(C,x), _(C,x), _(C,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x),
- /* ABE0 */ _(CF,x), _(CF,x), _(CF,x), _(M,R), _(M,R), _(M,T), _(M,R), _(M,R),
- /* ABE8 */ _(M,B), _(M,R), _(M,R), _(x,x), _(TM,x), _(PK,B), _(x,x), _(x,x),
- /* ABF0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* ABF8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x10a00u 3336
-
-
- /* Kharoshthi */
-
- /* 10A00 */ _(C,x), _(M,O), _(M,B), _(M,B), _(x,x), _(M,T), _(M,O), _(x,x),
- /* 10A08 */ _(x,x), _(x,x), _(x,x), _(x,x), _(M,B), _(x,x), _(Bi,x), _(Vs,x),
- /* 10A10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 10A18 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 10A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 10A28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 10A30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 10A38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(IS,x),
- /* 10A40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
-
-#define indic_offset_0x11000u 3408
-
-
- /* Brahmi */
-
- /* 11000 */ _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11008 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11010 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11018 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11020 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11028 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11030 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11038 */ _(M,T), _(M,T), _(M,T), _(M,T), _(M,B), _(M,B), _(M,B), _(M,B),
- /* 11040 */ _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,T), _(V,T), _(x,x),
- /* 11048 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11050 */ _(x,x), _(x,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),
- /* 11058 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),
- /* 11060 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x), _(Nd,x), _(Nd,x),
- /* 11068 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 11070 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11078 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(NJ,x),
-
- /* Kaithi */
-
- /* 11080 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11088 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
- /* 11090 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11098 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 110A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 110A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 110B0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,T), _(M,T), _(M,R),
- /* 110B8 */ _(M,R), _(V,B), _(N,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x11100u 3600
-
-
- /* Chakma */
-
- /* 11100 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x),
- /* 11108 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11110 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11118 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11120 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T),
- /* 11128 */ _(M,T), _(M,T), _(M,B), _(M,B), _(M,L), _(M,T), _(M,TB), _(M,TB),
- /* 11130 */ _(M,T), _(M,B), _(M,B), _(IS,x), _(PK,T), _(x,x), _(Nd,x), _(Nd,x),
- /* 11138 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 11140 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11148 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Mahajani */
-
- /* 11150 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(C,x), _(C,x), _(C,x),
- /* 11158 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11160 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11168 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11170 */ _(C,x), _(C,x), _(C,x), _(N,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11178 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Sharada */
-
- /* 11180 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11188 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11190 */ _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11198 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 111A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 111A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 111B0 */ _(C,x), _(C,x), _(C,x), _(M,R), _(M,L), _(M,R), _(M,B), _(M,B),
- /* 111B8 */ _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,TR),
- /* 111C0 */ _(V,R), _(A,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 111C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 111D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 111D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Sinhala Archaic Numbers */
-
- /* 111E0 */ _(x,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 111E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 111F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x),
- /* 111F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Khojki */
-
- /* 11200 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11208 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11210 */ _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11218 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11220 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11228 */ _(C,x), _(C,x), _(C,x), _(C,x), _(M,R), _(M,R), _(M,R), _(M,B),
- /* 11230 */ _(M,T), _(M,T), _(M,TR), _(M,TR), _(Bi,x), _(V,R), _(N,x), _(GM,T),
-
-#define indic_offset_0x112b0u 3912
-
-
- /* Khudawadi */
-
- /* 112B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 112B8 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 112C0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 112C8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 112D0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 112D8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Bi,x),
- /* 112E0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T),
- /* 112E8 */ _(M,T), _(N,x), _(PK,B), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 112F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 112F8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Grantha */
-
- /* 11300 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11308 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x),
- /* 11310 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x),
- /* 11318 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11320 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11328 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11330 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x),
- /* 11338 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,R),
- /* 11340 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(x,x), _(M,L),
- /* 11348 */ _(M,L), _(x,x), _(x,x), _(M,LR), _(M,LR), _(V,R), _(x,x), _(x,x),
- /* 11350 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R),
- /* 11358 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11360 */ _(VI,x), _(VI,x), _(M,R), _(M,R), _(x,x), _(x,x), _(Ca,x), _(Ca,x),
- /* 11368 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x),
- /* 11370 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x11480u 4112
-
-
- /* Tirhuta */
-
- /* 11480 */ _(x,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11488 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x),
- /* 11490 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11498 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 114A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 114A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 114B0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,B),
- /* 114B8 */ _(M,B), _(M,L), _(M,T), _(M,TL), _(M,LR), _(M,R), _(M,LR), _(Bi,x),
- /* 114C0 */ _(Bi,x), _(Vs,x), _(V,B), _(N,x), _(A,x), _(x,x), _(x,x), _(x,x),
- /* 114C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 114D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 114D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x11580u 4208
-
-
- /* Siddham */
-
- /* 11580 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11588 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x),
- /* 11590 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11598 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 115A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 115A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,R),
- /* 115B0 */ _(M,L), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x),
- /* 115B8 */ _(M,L), _(M,TL), _(M,LR),_(M,TLR), _(Bi,x), _(Bi,x), _(Vs,x), _(V,B),
- /* 115C0 */ _(N,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-#define indic_offset_0x11600u 4280
-
-
- /* Modi */
-
- /* 11600 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11608 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x),
- /* 11610 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11618 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11620 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11628 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11630 */ _(M,R), _(M,R), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,B),
- /* 11638 */ _(M,B), _(M,T), _(M,T), _(M,R), _(M,R), _(Bi,x), _(Vs,x), _(V,B),
- /* 11640 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11648 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11650 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 11658 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11660 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11668 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11670 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 11678 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
- /* Takri */
-
- /* 11680 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x),
- /* 11688 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11690 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 11698 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 116A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x),
- /* 116A8 */ _(C,x), _(C,x), _(C,x), _(Bi,x), _(Vs,x), _(M,T), _(M,L), _(M,R),
- /* 116B0 */ _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,T), _(V,T), _(N,x),
- /* 116B8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
- /* 116C0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x),
- /* 116C8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x),
-
-}; /* Table items: 4488; occupancy: 73% */
+}; /* Table items: 1784; occupancy: 69% */
INDIC_TABLE_ELEMENT_TYPE
hb_indic_get_categories (hb_codepoint_t u)
@@ -862,40 +399,27 @@ hb_indic_get_categories (hb_codepoint_t u)
{
case 0x0u:
if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u];
- if (hb_in_range (u, 0x00D0u, 0x00D7u)) return indic_table[u - 0x00D0u + indic_offset_0x00d0u];
+ if (hb_in_range (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u];
if (hb_in_range (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u];
if (unlikely (u == 0x00A0u)) return _(CP,x);
break;
case 0x1u:
if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u];
- if (hb_in_range (u, 0x1700u, 0x17EFu)) return indic_table[u - 0x1700u + indic_offset_0x1700u];
- if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return indic_table[u - 0x1900u + indic_offset_0x1900u];
- if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u];
- if (hb_in_range (u, 0x1CD0u, 0x1CF7u)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
+ if (hb_in_range (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u];
+ if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u];
break;
case 0x2u:
if (hb_in_range (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u];
+ if (hb_in_range (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u];
if (unlikely (u == 0x25CCu)) return _(CP,x);
break;
case 0xAu:
- if (hb_in_range (u, 0xA800u, 0xAAF7u)) return indic_table[u - 0xA800u + indic_offset_0xa800u];
- if (hb_in_range (u, 0xABC0u, 0xABFFu)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u];
- break;
-
- case 0x10u:
- if (hb_in_range (u, 0x10A00u, 0x10A47u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u];
- break;
-
- case 0x11u:
- if (hb_in_range (u, 0x11000u, 0x110BFu)) return indic_table[u - 0x11000u + indic_offset_0x11000u];
- if (hb_in_range (u, 0x11100u, 0x11237u)) return indic_table[u - 0x11100u + indic_offset_0x11100u];
- if (hb_in_range (u, 0x112B0u, 0x11377u)) return indic_table[u - 0x112B0u + indic_offset_0x112b0u];
- if (hb_in_range (u, 0x11480u, 0x114DFu)) return indic_table[u - 0x11480u + indic_offset_0x11480u];
- if (hb_in_range (u, 0x11580u, 0x115C7u)) return indic_table[u - 0x11580u + indic_offset_0x11580u];
- if (hb_in_range (u, 0x11600u, 0x116CFu)) return indic_table[u - 0x11600u + indic_offset_0x11600u];
+ if (hb_in_range (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u];
+ if (hb_in_range (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u];
+ if (hb_in_range (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u];
break;
default:
@@ -914,11 +438,14 @@ hb_indic_get_categories (hb_codepoint_t u)
#undef ISC_CD
#undef ISC_CF
#undef ISC_CHL
+#undef ISC_CK
#undef ISC_CM
#undef ISC_CP
#undef ISC_CPR
+#undef ISC_CPrf
#undef ISC_CS
#undef ISC_CSR
+#undef ISC_CWS
#undef ISC_GM
#undef ISC_IS
#undef ISC_ZWJ
@@ -930,6 +457,7 @@ hb_indic_get_categories (hb_codepoint_t u)
#undef ISC_x
#undef ISC_PK
#undef ISC_RS
+#undef ISC_SM
#undef ISC_TL
#undef ISC_TM
#undef ISC_V
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc
index 93546dbec59..6486e84f5d9 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc
@@ -176,24 +176,8 @@ set_indic_properties (hb_glyph_info_t &info)
* Re-assign category
*/
-
- /* The spec says U+0952 is OT_A. However, testing shows that Uniscribe
- * treats a whole bunch of characters similarly.
- * TESTS: For example, for U+0951:
- * U+092E,U+0947,U+0952
- * U+092E,U+0952,U+0947
- * U+092E,U+0947,U+0951
- * U+092E,U+0951,U+0947
- * U+092E,U+0951,U+0952
- * U+092E,U+0952,U+0951
- */
- if (unlikely (hb_in_ranges (u, 0x0951u, 0x0952u,
- 0x1CD0u, 0x1CD2u,
- 0x1CD4u, 0x1CE1u) ||
- u == 0x1CF4u))
- cat = OT_A;
/* The following act more like the Bindus. */
- else if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
+ if (unlikely (hb_in_range (u, 0x0953u, 0x0954u)))
cat = OT_SM;
/* The following act like consonants. */
else if (unlikely (hb_in_ranges (u, 0x0A72u, 0x0A73u,
@@ -216,21 +200,10 @@ set_indic_properties (hb_glyph_info_t &info)
cat = OT_Symbol;
ASSERT_STATIC ((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol);
}
- else if (unlikely (hb_in_range (u, 0x17CDu, 0x17D1u) ||
- u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
- {
- /* These are like Top Matras. */
- cat = OT_M;
- pos = POS_ABOVE_C;
- }
else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
- else if (unlikely (u == 0x17D2u)) cat = OT_Coeng; /* Khmer coeng */
else if (unlikely (hb_in_range (u, 0x2010u, 0x2011u)))
cat = OT_PLACEHOLDER;
else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
- else if (unlikely (u == 0xA982u)) cat = OT_SM; /* Javanese repha. */
- else if (unlikely (u == 0xA9BEu)) cat = OT_CM2; /* Javanese medial ya. */
- else if (unlikely (u == 0xA9BDu)) { cat = OT_M; pos = POS_POST_C; } /* Javanese vocalic r. */
/*
@@ -296,11 +269,6 @@ enum blwf_mode_t {
BLWF_MODE_PRE_AND_POST, /* Below-forms feature applied to pre-base and post-base. */
BLWF_MODE_POST_ONLY /* Below-forms feature applied to post-base only. */
};
-enum pref_len_t {
- PREF_LEN_1 = 1,
- PREF_LEN_2 = 2,
- PREF_LEN_DONT_CARE = PREF_LEN_2
-};
struct indic_config_t
{
hb_script_t script;
@@ -310,26 +278,24 @@ struct indic_config_t
reph_position_t reph_pos;
reph_mode_t reph_mode;
blwf_mode_t blwf_mode;
- pref_len_t pref_len;
};
static const indic_config_t indic_configs[] =
{
/* Default. Should be first. */
- {HB_SCRIPT_INVALID, false, 0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
- {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_BENGALI, true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_GURMUKHI, true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_GUJARATI, true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_ORIYA, true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_TAMIL, true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
- {HB_SCRIPT_TELUGU, true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY, PREF_LEN_2},
- {HB_SCRIPT_KANNADA, true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY, PREF_LEN_2},
- {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
+ {HB_SCRIPT_INVALID, false, 0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_BENGALI, true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_GURMUKHI, true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_GUJARATI, true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_ORIYA, true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_TAMIL, true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_TELUGU, true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY},
+ {HB_SCRIPT_KANNADA, true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY},
+ {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST},
{HB_SCRIPT_SINHALA, false,0x0DCAu,BASE_POS_LAST_SINHALA,
- REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE},
- {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2},
- {HB_SCRIPT_JAVANESE, false,0xA9C0u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_1},
+ REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST},
+ {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST},
};
@@ -512,12 +478,12 @@ struct indic_shape_plan_t
hb_codepoint_t glyph = virama_glyph;
if (unlikely (virama_glyph == (hb_codepoint_t) -1))
{
- if (!config->virama || !font->get_glyph (config->virama, 0, &glyph))
+ if (!config->virama || !font->get_nominal_glyph (config->virama, &glyph))
glyph = 0;
/* Technically speaking, the spec says we should apply 'locl' to virama too.
* Maybe one day... */
- /* Our get_glyph() function needs a font, so we can't get the virama glyph
+ /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
* during shape planning... Instead, overwrite it here. It's safe. Don't worry! */
(const_cast (this))->virama_glyph = glyph;
}
@@ -557,8 +523,15 @@ data_create_indic (const hb_ot_shape_plan_t *plan)
indic_plan->virama_glyph = (hb_codepoint_t) -1;
/* Use zero-context would_substitute() matching for new-spec of the main
- * Indic scripts, and scripts with one spec only, but not for old-specs. */
- bool zero_context = !indic_plan->is_old_spec;
+ * Indic scripts, and scripts with one spec only, but not for old-specs.
+ * The new-spec for all dual-spec scripts says zero-context matching happens.
+ *
+ * However, testing with Malayalam shows that old and new spec both allow
+ * context. Testing with Bengali new-spec however shows that it doesn't.
+ * So, the heuristic here is the way it is. It should *only* be changed,
+ * as we discover more cases of what Windows does. DON'T TOUCH OTHERWISE.
+ */
+ bool zero_context = !indic_plan->is_old_spec && plan->props.script != HB_SCRIPT_MALAYALAM;
indic_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'), zero_context);
indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), zero_context);
indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), zero_context);
@@ -600,12 +573,8 @@ consonant_position_from_face (const indic_shape_plan_t *indic_plan,
if (indic_plan->pstf.would_substitute (glyphs , 2, face) ||
indic_plan->pstf.would_substitute (glyphs+1, 2, face))
return POS_POST_C;
- unsigned int pref_len = indic_plan->config->pref_len;
- if ((pref_len == PREF_LEN_2 &&
- (indic_plan->pref.would_substitute (glyphs , 2, face) ||
- indic_plan->pref.would_substitute (glyphs+1, 2, face)))
- || (pref_len == PREF_LEN_1 &&
- indic_plan->pref.would_substitute (glyphs+1, 1, face)))
+ if (indic_plan->pref.would_substitute (glyphs , 2, face) ||
+ indic_plan->pref.would_substitute (glyphs+1, 2, face))
return POS_POST_C;
return POS_BASE_C;
}
@@ -754,10 +723,6 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
switch (indic_plan->config->base_pos)
{
- default:
- assert (false);
- /* fallthrough */
-
case BASE_POS_LAST:
{
/* -> starting from the end of the syllable, move backwards */
@@ -1115,10 +1080,9 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan,
}
}
- unsigned int pref_len = indic_plan->config->pref_len;
+ unsigned int pref_len = 2;
if (indic_plan->mask_array[PREF] && base + pref_len < end)
{
- assert (1 <= pref_len && pref_len <= 2);
/* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */
for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) {
hb_codepoint_t glyphs[2];
@@ -1231,7 +1195,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_codepoint_t dottedcircle_glyph;
- if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
+ if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
return;
hb_glyph_info_t dottedcircle = {0};
@@ -1243,7 +1207,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
buffer->idx = 0;
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
{
unsigned int syllable = buffer->cur().syllable();
syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -1251,19 +1215,19 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
{
last_syllable = syllable;
- hb_glyph_info_t info = dottedcircle;
- info.cluster = buffer->cur().cluster;
- info.mask = buffer->cur().mask;
- info.syllable() = buffer->cur().syllable();
+ hb_glyph_info_t ginfo = dottedcircle;
+ ginfo.cluster = buffer->cur().cluster;
+ ginfo.mask = buffer->cur().mask;
+ ginfo.syllable() = buffer->cur().syllable();
/* TODO Set glyph_props? */
/* Insert dottedcircle after possible Repha. */
- while (buffer->idx < buffer->len &&
+ while (buffer->idx < buffer->len && !buffer->in_error &&
last_syllable == buffer->cur().syllable() &&
buffer->cur().indic_category() == OT_Repha)
buffer->next_glyph ();
- buffer->output_info (info);
+ buffer->output_info (ginfo);
}
else
buffer->next_glyph ();
@@ -1328,7 +1292,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
for (base = start; base < end; base++)
if (info[base].indic_position() >= POS_BASE_C)
{
- if (try_pref && base + 1 < end && indic_plan->config->pref_len == 2)
+ if (try_pref && base + 1 < end)
{
for (unsigned int i = base + 1; i < end; i++)
if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
@@ -1348,6 +1312,25 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
break;
}
}
+ /* For Malayalam, skip over unformed below- (but NOT post-) forms. */
+ if (buffer->props.script == HB_SCRIPT_MALAYALAM)
+ {
+ for (unsigned int i = base + 1; i < end; i++)
+ {
+ while (i < end && is_joiner (info[i]))
+ i++;
+ if (i == end || !is_halant_or_coeng (info[i]))
+ break;
+ i++; /* Skip halant. */
+ while (i < end && is_joiner (info[i]))
+ i++;
+ if (i < end && is_consonant (info[i]) && info[i].indic_position() == POS_BELOW_C)
+ {
+ base = i;
+ info[base].indic_position() = POS_BASE_C;
+ }
+ }
+ }
if (start < base && info[base].indic_position() > POS_BASE_C)
base--;
@@ -1591,7 +1574,6 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */
{
- unsigned int pref_len = indic_plan->config->pref_len;
for (unsigned int i = base + 1; i < end; i++)
if ((info[i].mask & indic_plan->mask_array[PREF]) != 0)
{
@@ -1602,10 +1584,8 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
/* Note: We just check that something got substituted. We don't check that
* the feature actually did it...
*
- * If pref len is longer than one, then only reorder if it ligated. If
- * pref len is one, only reorder if it didn't ligate with other things. */
- if (_hb_glyph_info_substituted (&info[i]) &&
- ((pref_len == 1) ^ _hb_glyph_info_ligated_and_didnt_multiply (&info[i])))
+ * Reorder pref only if it ligated. */
+ if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i]))
{
/*
* 2. Try to find a target position the same way as for pre-base matra.
@@ -1631,8 +1611,8 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan,
if (new_pos > start && info[new_pos - 1].indic_category() == OT_M)
{
unsigned int old_pos = i;
- for (unsigned int i = base + 1; i < old_pos; i++)
- if (info[i].indic_category() == OT_M)
+ for (unsigned int j = base + 1; j < old_pos; j++)
+ if (info[j].indic_category() == OT_M)
{
new_pos--;
break;
@@ -1796,7 +1776,7 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
hb_codepoint_t glyph;
if (hb_options ().uniscribe_bug_compatible ||
- (c->font->get_glyph (ab, 0, &glyph) &&
+ (c->font->get_nominal_glyph (ab, &glyph) &&
indic_plan->pstf.would_substitute (&glyph, 1, c->font->face)))
{
/* Ok, safe to use Uniscribe-style decomposition. */
@@ -1806,7 +1786,7 @@ decompose_indic (const hb_ot_shape_normalize_context_t *c,
}
}
- return c->unicode->decompose (ab, a, b);
+ return (bool) c->unicode->decompose (ab, a, b);
}
static bool
@@ -1822,7 +1802,7 @@ compose_indic (const hb_ot_shape_normalize_context_t *c,
/* Composition-exclusion exceptions that we want to recompose. */
if (a == 0x09AFu && b == 0x09BCu) { *ab = 0x09DFu; return true; }
- return c->unicode->compose (a, b, ab);
+ return (bool) c->unicode->compose (a, b, ab);
}
@@ -1834,6 +1814,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
data_create_indic,
data_destroy_indic,
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
decompose_indic,
compose_indic,
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh
index 8aef4cf45e5..c16b4fda39e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh
@@ -1,5 +1,5 @@
-#line 1 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 1 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
/*
* Copyright © 2011,2012 Google, Inc.
*
@@ -32,7 +32,7 @@
#include "hb-private.hh"
-#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
1u, 31u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u,
3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u,
@@ -261,11 +261,11 @@ static const int myanmar_syllable_machine_error = -1;
static const int myanmar_syllable_machine_en_main = 0;
-#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
-#line 93 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 93 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
#define found_syllable(syllable_type) \
@@ -285,7 +285,7 @@ find_syllables (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 289 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 289 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
{
cs = myanmar_syllable_machine_start;
ts = 0;
@@ -293,7 +293,7 @@ find_syllables (hb_buffer_t *buffer)
act = 0;
}
-#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
p = 0;
@@ -302,7 +302,7 @@ find_syllables (hb_buffer_t *buffer)
unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 306 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 306 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
{
int _slen;
int _trans;
@@ -316,7 +316,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
-#line 320 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 320 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
}
_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -335,38 +335,38 @@ _eof_trans:
switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
case 7:
-#line 85 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (consonant_syllable); }}
break;
case 5:
-#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (non_myanmar_cluster); }}
break;
case 10:
-#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (punctuation_cluster); }}
break;
case 4:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
case 3:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p+1;{ found_syllable (non_myanmar_cluster); }}
break;
case 6:
-#line 85 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (consonant_syllable); }}
break;
case 8:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
case 9:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
{te = p;p--;{ found_syllable (non_myanmar_cluster); }}
break;
-#line 370 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 370 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
}
_again:
@@ -375,7 +375,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
-#line 379 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 379 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
}
if ( ++p != pe )
@@ -391,7 +391,7 @@ _again:
}
-#line 123 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 123 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc
index fe9074cdf65..6c6466275a6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc
@@ -199,6 +199,10 @@ set_myanmar_properties (hb_glyph_info_t &info)
cat = (indic_category_t) OT_A;
break;
+ case 0x1039u:
+ cat = (indic_category_t) OT_H;
+ break;
+
case 0x103Au:
cat = (indic_category_t) OT_As;
break;
@@ -245,6 +249,11 @@ set_myanmar_properties (hb_glyph_info_t &info)
case 0x104Au: case 0x104Bu:
cat = (indic_category_t) OT_P;
break;
+
+ case 0xAA74u: case 0xAA75u: case 0xAA76u:
+ /* https://github.com/roozbehp/unicode-data/issues/3 */
+ cat = (indic_category_t) OT_C;
+ break;
}
if (cat == OT_M)
@@ -435,7 +444,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
hb_codepoint_t dottedcircle_glyph;
- if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
+ if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
return;
hb_glyph_info_t dottedcircle = {0};
@@ -447,7 +456,7 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
buffer->idx = 0;
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
{
unsigned int syllable = buffer->cur().syllable();
syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -455,12 +464,12 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
{
last_syllable = syllable;
- hb_glyph_info_t info = dottedcircle;
- info.cluster = buffer->cur().cluster;
- info.mask = buffer->cur().mask;
- info.syllable() = buffer->cur().syllable();
+ hb_glyph_info_t ginfo = dottedcircle;
+ ginfo.cluster = buffer->cur().cluster;
+ ginfo.mask = buffer->cur().mask;
+ ginfo.syllable() = buffer->cur().syllable();
- buffer->output_info (info);
+ buffer->output_info (ginfo);
}
else
buffer->next_glyph ();
@@ -507,6 +516,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old =
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
@@ -523,6 +533,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
NULL, /* decompose */
NULL, /* compose */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh
index b4aff25fc43..c1d08dc7145 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh
@@ -41,12 +41,8 @@
enum hb_ot_shape_zero_width_marks_type_t {
HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
-// HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY,
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE,
HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
-
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE
};
@@ -110,6 +106,15 @@ struct hb_ot_complex_shaper_t
hb_buffer_t *buffer,
hb_font_t *font);
+ /* postprocess_glyphs()
+ * Called during shape().
+ * Shapers can use to modify glyphs after shaping ends.
+ * May be NULL.
+ */
+ void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
+ hb_buffer_t *buffer,
+ hb_font_t *font);
+
hb_ot_shape_normalization_mode_t normalization_preference;
@@ -236,9 +241,6 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-3.0 additions */
case HB_SCRIPT_SINHALA:
- /* Unicode-5.2 additions */
- case HB_SCRIPT_JAVANESE:
-
/* If the designer designed the font for the 'DFLT' script,
* use the default shaper. Otherwise, use the specific shaper.
* Note that for some simple scripts, there may not be *any*
@@ -311,7 +313,7 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
/* Unicode-5.2 additions */
case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
- //case HB_SCRIPT_JAVANESE:
+ case HB_SCRIPT_JAVANESE:
case HB_SCRIPT_KAITHI:
case HB_SCRIPT_MEETEI_MAYEK:
case HB_SCRIPT_TAI_THAM:
@@ -340,6 +342,15 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner)
case HB_SCRIPT_SIDDHAM:
case HB_SCRIPT_TIRHUTA:
+ /* Unicode-8.0 additions */
+ case HB_SCRIPT_AHOM:
+ //case HB_SCRIPT_MULTANI:
+
+ /* Unicode-9.0 additions */
+ case HB_SCRIPT_BHAIKSUKI:
+ case HB_SCRIPT_MARCHEN:
+ case HB_SCRIPT_NEWA:
+
/* If the designer designed the font for the 'DFLT' script,
* use the default shaper. Otherwise, use the specific shaper.
* Note that for some simple scripts, there may not be *any*
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc
index 6934282c12d..e4889d4eff6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc
@@ -139,7 +139,6 @@ thai_pua_shape (hb_codepoint_t u, thai_action_t action, hb_font_t *font)
};
switch (action) {
- default: assert (false); /* Fallthrough */
case NOP: return u;
case SD: pua_mappings = SD_mappings; break;
case SDL: pua_mappings = SDL_mappings; break;
@@ -315,7 +314,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
buffer->clear_output ();
unsigned int count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count;)
+ for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
{
hb_codepoint_t u = buffer->cur().codepoint;
if (likely (!IS_SARA_AM (u))) {
@@ -330,7 +329,7 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
if (unlikely (buffer->in_error))
return;
- /* Make Nikhahit be recognized as a mark when zeroing widths. */
+ /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
unsigned int end = buffer->out_len;
_hb_glyph_info_set_general_category (&buffer->out_info[end - 2], HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK);
@@ -372,10 +371,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
NULL, /* data_create */
NULL, /* data_destroy */
preprocess_text_thai,
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
NULL, /* setup_masks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
false,/* fallback_position */
};
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc
index 01465a426f8..a77b531daa5 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc
@@ -52,10 +52,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_tibetan =
NULL, /* data_create */
NULL, /* data_destroy */
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
NULL, /* decompose */
NULL, /* compose */
NULL, /* setup_masks */
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
true, /* fallback_position */
};
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh
index 4e496f089e9..97409f15b0f 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh
@@ -36,291 +36,222 @@
#line 38 "hb-ot-shape-complex-use-machine.hh"
static const unsigned char _use_syllable_machine_trans_keys[] = {
- 0u, 0u, 4u, 4u, 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u,
- 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u,
+ 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u,
+ 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
+ 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u,
+ 4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u,
8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 8u, 39u, 12u, 21u, 12u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u,
- 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u,
- 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u,
+ 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u,
42u, 42u, 0
};
static const char _use_syllable_machine_key_spans[] = {
- 0, 1, 1, 40, 1, 32, 32, 1,
- 32, 32, 32, 19, 19, 19, 32, 32,
- 32, 32, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 1, 32, 32, 19, 19,
+ 1, 40, 1, 32, 32, 1, 32, 32,
+ 32, 19, 19, 19, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 9,
+ 1, 1, 32, 32, 32, 32, 19, 19,
19, 32, 32, 32, 32, 32, 32, 32,
- 32, 10, 2, 32, 32, 32, 32, 19,
- 19, 19, 32, 32, 32, 32, 32, 32,
- 32, 32, 32, 32, 39, 32, 22, 2,
+ 32, 32, 32, 1, 39, 32, 22, 2,
1
};
static const short _use_syllable_machine_index_offsets[] = {
- 0, 0, 2, 4, 45, 47, 80, 113,
- 115, 148, 181, 214, 234, 254, 274, 307,
- 340, 373, 406, 439, 472, 505, 538, 571,
- 604, 637, 670, 703, 705, 738, 771, 791,
- 811, 831, 864, 897, 930, 963, 996, 1029,
- 1062, 1095, 1106, 1109, 1142, 1175, 1208, 1241,
- 1261, 1281, 1301, 1334, 1367, 1400, 1433, 1466,
- 1499, 1532, 1565, 1598, 1631, 1671, 1704, 1727,
- 1730
+ 0, 2, 43, 45, 78, 111, 113, 146,
+ 179, 212, 232, 252, 272, 305, 338, 371,
+ 404, 437, 470, 503, 536, 569, 602, 635,
+ 645, 647, 649, 682, 715, 748, 781, 801,
+ 821, 841, 874, 907, 940, 973, 1006, 1039,
+ 1072, 1105, 1138, 1171, 1173, 1213, 1246, 1269,
+ 1272
};
static const char _use_syllable_machine_indicies[] = {
- 1, 0, 3, 2, 4, 5, 6,
- 4, 1, 5, 8, 8, 7, 8, 8,
- 3, 9, 8, 8, 8, 4, 4, 10,
- 11, 8, 8, 12, 13, 14, 15, 16,
- 17, 18, 12, 19, 20, 21, 22, 23,
- 24, 8, 25, 26, 27, 8, 29, 28,
- 31, 30, 30, 32, 33, 30, 30, 30,
- 30, 30, 30, 30, 30, 34, 35, 36,
- 37, 38, 39, 40, 41, 35, 42, 34,
- 43, 44, 45, 46, 30, 47, 48, 49,
- 30, 31, 30, 30, 32, 33, 30, 30,
- 30, 30, 30, 30, 30, 30, 50, 35,
- 36, 37, 38, 39, 40, 41, 35, 42,
- 43, 43, 44, 45, 46, 30, 47, 48,
- 49, 30, 32, 51, 31, 30, 30, 32,
- 33, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 35, 36, 37, 38, 39, 40,
- 41, 35, 42, 43, 43, 44, 45, 46,
- 30, 47, 48, 49, 30, 31, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 35, 36, 37, 38, 39,
- 30, 30, 30, 30, 30, 30, 44, 45,
- 46, 30, 47, 48, 49, 30, 31, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 36, 37, 38,
- 39, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 47, 48, 49, 30, 31,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 37,
- 38, 39, 30, 31, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 38, 39, 30, 31,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 39, 30, 31, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 37, 38, 39, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 47, 48, 49, 30, 31, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 37, 38, 39, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 48, 49, 30, 31, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 37, 38, 39,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 49, 30, 31, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 36, 37, 38,
- 39, 30, 30, 30, 30, 30, 30, 44,
- 45, 46, 30, 47, 48, 49, 30, 31,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 36, 37,
- 38, 39, 30, 30, 30, 30, 30, 30,
- 30, 45, 46, 30, 47, 48, 49, 30,
- 31, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 36,
- 37, 38, 39, 30, 30, 30, 30, 30,
- 30, 30, 30, 46, 30, 47, 48, 49,
- 30, 31, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 35,
- 36, 37, 38, 39, 30, 41, 35, 30,
- 30, 30, 44, 45, 46, 30, 47, 48,
- 49, 30, 31, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 35, 36, 37, 38, 39, 30, 30, 35,
- 30, 30, 30, 44, 45, 46, 30, 47,
- 48, 49, 30, 31, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 35, 36, 37, 38, 39, 40, 41,
- 35, 30, 30, 30, 44, 45, 46, 30,
- 47, 48, 49, 30, 31, 30, 30, 32,
- 33, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 35, 36, 37, 38, 39, 40,
- 41, 35, 42, 30, 43, 44, 45, 46,
- 30, 47, 48, 49, 30, 31, 30, 30,
- 32, 33, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 35, 36, 37, 38, 39,
- 40, 41, 35, 42, 34, 43, 44, 45,
- 46, 30, 47, 48, 49, 30, 53, 52,
- 52, 54, 55, 52, 52, 52, 52, 52,
- 52, 52, 52, 56, 52, 57, 58, 59,
- 60, 61, 62, 57, 63, 56, 64, 52,
- 52, 52, 52, 65, 66, 67, 52, 53,
- 52, 52, 54, 55, 52, 52, 52, 52,
- 52, 52, 52, 52, 68, 52, 57, 58,
- 59, 60, 61, 62, 57, 63, 64, 64,
- 52, 52, 52, 52, 65, 66, 67, 52,
- 54, 51, 53, 52, 52, 54, 55, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 57, 58, 59, 60, 61, 62, 57,
- 63, 64, 64, 52, 52, 52, 52, 65,
- 66, 67, 52, 53, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 57, 58, 59, 60, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 65, 66, 67, 52, 53, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 58, 59, 60, 52,
- 53, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 59, 60, 52, 53, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 60, 52,
- 53, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 58, 59, 60, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 65, 66, 67,
- 52, 53, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 58, 59, 60, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 66,
- 67, 52, 53, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 58, 59, 60, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 67, 52, 53, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 57, 58, 59, 60, 52, 62,
- 57, 52, 52, 52, 52, 52, 52, 52,
- 65, 66, 67, 52, 53, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 57, 58, 59, 60, 52,
- 52, 57, 52, 52, 52, 52, 52, 52,
- 52, 65, 66, 67, 52, 53, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 57, 58, 59, 60,
- 61, 62, 57, 52, 52, 52, 52, 52,
- 52, 52, 65, 66, 67, 52, 53, 52,
- 52, 54, 55, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 57, 58, 59,
- 60, 61, 62, 57, 63, 52, 64, 52,
- 52, 52, 52, 65, 66, 67, 52, 53,
- 52, 52, 54, 55, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 57, 58,
- 59, 60, 61, 62, 57, 63, 56, 64,
- 52, 52, 52, 52, 65, 66, 67, 52,
- 70, 71, 69, 69, 69, 69, 69, 69,
- 69, 72, 69, 70, 71, 69, 7, 73,
- 73, 3, 9, 73, 73, 73, 73, 73,
- 73, 73, 73, 74, 12, 13, 14, 15,
- 16, 17, 18, 12, 19, 21, 21, 22,
- 23, 24, 73, 25, 26, 27, 73, 7,
- 73, 73, 3, 9, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 12, 13, 14,
- 15, 16, 17, 18, 12, 19, 21, 21,
- 22, 23, 24, 73, 25, 26, 27, 73,
- 7, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 12, 13,
- 14, 15, 16, 73, 73, 73, 73, 73,
- 73, 22, 23, 24, 73, 25, 26, 27,
- 73, 7, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 13, 14, 15, 16, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 25, 26,
- 27, 73, 7, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 14, 15, 16, 73, 7, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 15,
- 16, 73, 7, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 16, 73, 7, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 14, 15,
- 16, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 25, 26, 27, 73, 7,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 14,
- 15, 16, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 26, 27, 73,
- 7, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 14, 15, 16, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 27,
- 73, 7, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 13, 14, 15, 16, 73, 73, 73, 73,
- 73, 73, 22, 23, 24, 73, 25, 26,
- 27, 73, 7, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 13, 14, 15, 16, 73, 73, 73,
- 73, 73, 73, 73, 23, 24, 73, 25,
- 26, 27, 73, 7, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 13, 14, 15, 16, 73, 73,
- 73, 73, 73, 73, 73, 73, 24, 73,
- 25, 26, 27, 73, 7, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 12, 13, 14, 15, 16, 73,
- 18, 12, 73, 73, 73, 22, 23, 24,
- 73, 25, 26, 27, 73, 7, 73, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 12, 13, 14, 15, 16,
- 73, 73, 12, 73, 73, 73, 22, 23,
- 24, 73, 25, 26, 27, 73, 7, 73,
- 73, 73, 73, 73, 73, 73, 73, 73,
- 73, 73, 73, 73, 12, 13, 14, 15,
- 16, 17, 18, 12, 73, 73, 73, 22,
- 23, 24, 73, 25, 26, 27, 73, 7,
- 73, 73, 3, 9, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 12, 13, 14,
- 15, 16, 17, 18, 12, 19, 73, 21,
- 22, 23, 24, 73, 25, 26, 27, 73,
- 5, 6, 73, 73, 5, 73, 73, 7,
- 73, 73, 3, 9, 73, 73, 73, 73,
- 73, 73, 73, 73, 73, 12, 13, 14,
- 15, 16, 17, 18, 12, 19, 20, 21,
- 22, 23, 24, 73, 25, 26, 27, 73,
- 7, 73, 73, 3, 9, 73, 73, 73,
- 73, 73, 73, 73, 73, 73, 12, 13,
- 14, 15, 16, 17, 18, 12, 19, 20,
- 21, 22, 23, 24, 73, 25, 26, 27,
- 73, 76, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75, 75, 75, 75, 76, 77, 75,
- 76, 77, 75, 77, 75, 0
+ 1, 0, 2, 3, 4, 2, 5, 3,
+ 4, 4, 6, 4, 4, 1, 7, 4,
+ 4, 4, 2, 2, 8, 9, 4, 4,
+ 10, 11, 12, 13, 14, 15, 16, 10,
+ 17, 18, 19, 20, 21, 22, 4, 23,
+ 24, 25, 4, 27, 26, 29, 28, 28,
+ 30, 31, 28, 28, 28, 28, 28, 28,
+ 28, 28, 32, 33, 34, 35, 36, 37,
+ 38, 39, 33, 40, 32, 41, 42, 43,
+ 44, 28, 45, 46, 47, 28, 29, 28,
+ 28, 30, 31, 28, 28, 28, 28, 28,
+ 28, 28, 28, 48, 33, 34, 35, 36,
+ 37, 38, 39, 33, 40, 41, 41, 42,
+ 43, 44, 28, 45, 46, 47, 28, 30,
+ 49, 29, 28, 28, 30, 31, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 33,
+ 34, 35, 36, 37, 38, 39, 33, 40,
+ 41, 41, 42, 43, 44, 28, 45, 46,
+ 47, 28, 29, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 33, 34, 35, 36, 37, 28, 28, 28,
+ 28, 28, 28, 42, 43, 44, 28, 45,
+ 46, 47, 28, 29, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 34, 35, 36, 37, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 45, 46, 47, 28, 29, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 35, 36, 37, 28,
+ 29, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 36, 37, 28, 29, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 37, 28,
+ 29, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 35, 36, 37, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 45, 46, 47,
+ 28, 29, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 35, 36, 37, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 46,
+ 47, 28, 29, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 35, 36, 37, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 47, 28, 29, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 34, 35, 36, 37, 28, 28,
+ 28, 28, 28, 28, 42, 43, 44, 28,
+ 45, 46, 47, 28, 29, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 34, 35, 36, 37, 28,
+ 28, 28, 28, 28, 28, 28, 43, 44,
+ 28, 45, 46, 47, 28, 29, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 34, 35, 36, 37,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 44, 28, 45, 46, 47, 28, 29, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 33, 34, 35, 36,
+ 37, 28, 39, 33, 28, 28, 28, 42,
+ 43, 44, 28, 45, 46, 47, 28, 29,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 33, 34, 35,
+ 36, 37, 28, 28, 33, 28, 28, 28,
+ 42, 43, 44, 28, 45, 46, 47, 28,
+ 29, 28, 28, 28, 28, 28, 28, 28,
+ 28, 28, 28, 28, 28, 28, 33, 34,
+ 35, 36, 37, 38, 39, 33, 28, 28,
+ 28, 42, 43, 44, 28, 45, 46, 47,
+ 28, 29, 28, 28, 30, 31, 28, 28,
+ 28, 28, 28, 28, 28, 28, 28, 33,
+ 34, 35, 36, 37, 38, 39, 33, 40,
+ 28, 41, 42, 43, 44, 28, 45, 46,
+ 47, 28, 29, 28, 28, 30, 31, 28,
+ 28, 28, 28, 28, 28, 28, 28, 28,
+ 33, 34, 35, 36, 37, 38, 39, 33,
+ 40, 32, 41, 42, 43, 44, 28, 45,
+ 46, 47, 28, 51, 50, 50, 50, 50,
+ 50, 50, 50, 52, 50, 5, 53, 51,
+ 50, 6, 54, 54, 1, 55, 54, 54,
+ 54, 54, 54, 54, 54, 54, 56, 10,
+ 11, 12, 13, 14, 15, 16, 10, 17,
+ 19, 19, 20, 21, 22, 54, 23, 24,
+ 25, 54, 6, 54, 54, 1, 55, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 10, 11, 12, 13, 14, 15, 16, 10,
+ 17, 19, 19, 20, 21, 22, 54, 23,
+ 24, 25, 54, 6, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 10, 11, 12, 13, 14, 54, 54,
+ 54, 54, 54, 54, 20, 21, 22, 54,
+ 23, 24, 25, 54, 6, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 11, 12, 13, 14, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 23, 24, 25, 54, 6, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 12, 13, 14,
+ 54, 6, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 13, 14, 54, 6, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 14,
+ 54, 6, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 12, 13, 14, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 23, 24,
+ 25, 54, 6, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 12, 13, 14, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 24, 25, 54, 6, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 12, 13, 14, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 25, 54, 6, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 11, 12, 13, 14, 54,
+ 54, 54, 54, 54, 54, 20, 21, 22,
+ 54, 23, 24, 25, 54, 6, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 11, 12, 13, 14,
+ 54, 54, 54, 54, 54, 54, 54, 21,
+ 22, 54, 23, 24, 25, 54, 6, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 11, 12, 13,
+ 14, 54, 54, 54, 54, 54, 54, 54,
+ 54, 22, 54, 23, 24, 25, 54, 6,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 10, 11, 12,
+ 13, 14, 54, 16, 10, 54, 54, 54,
+ 20, 21, 22, 54, 23, 24, 25, 54,
+ 6, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 10, 11,
+ 12, 13, 14, 54, 54, 10, 54, 54,
+ 54, 20, 21, 22, 54, 23, 24, 25,
+ 54, 6, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 54, 54, 54, 54, 10,
+ 11, 12, 13, 14, 15, 16, 10, 54,
+ 54, 54, 20, 21, 22, 54, 23, 24,
+ 25, 54, 6, 54, 54, 1, 55, 54,
+ 54, 54, 54, 54, 54, 54, 54, 54,
+ 10, 11, 12, 13, 14, 15, 16, 10,
+ 17, 54, 19, 20, 21, 22, 54, 23,
+ 24, 25, 54, 1, 57, 3, 54, 54,
+ 54, 3, 54, 54, 6, 54, 54, 1,
+ 55, 54, 54, 54, 54, 54, 54, 54,
+ 54, 54, 10, 11, 12, 13, 14, 15,
+ 16, 10, 17, 18, 19, 20, 21, 22,
+ 54, 23, 24, 25, 54, 6, 54, 54,
+ 1, 55, 54, 54, 54, 54, 54, 54,
+ 54, 54, 54, 10, 11, 12, 13, 14,
+ 15, 16, 10, 17, 18, 19, 20, 21,
+ 22, 54, 23, 24, 25, 54, 59, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 58, 58, 58, 58, 58, 58,
+ 58, 58, 59, 60, 58, 59, 60, 58,
+ 60, 58, 0
};
static const char _use_syllable_machine_trans_targs[] = {
- 3, 41, 3, 43, 4, 5, 25, 3,
- 0, 2, 60, 62, 45, 46, 47, 48,
- 49, 56, 57, 58, 61, 59, 53, 54,
- 55, 50, 51, 52, 3, 3, 3, 3,
- 6, 7, 24, 9, 10, 11, 12, 13,
- 20, 21, 22, 23, 17, 18, 19, 14,
- 15, 16, 8, 3, 3, 3, 26, 27,
- 40, 29, 30, 31, 32, 36, 37, 38,
- 39, 33, 34, 35, 28, 3, 3, 1,
- 42, 3, 44, 3, 63, 64
+ 1, 26, 2, 3, 1, 23, 1, 43,
+ 44, 46, 28, 29, 30, 31, 32, 39,
+ 40, 41, 45, 42, 36, 37, 38, 33,
+ 34, 35, 1, 1, 1, 1, 4, 5,
+ 22, 7, 8, 9, 10, 11, 18, 19,
+ 20, 21, 15, 16, 17, 12, 13, 14,
+ 6, 1, 1, 24, 25, 1, 1, 0,
+ 27, 1, 1, 47, 48
};
static const char _use_syllable_machine_trans_actions[] = {
- 1, 2, 3, 4, 0, 0, 0, 7,
- 0, 0, 4, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 4, 0, 0,
- 0, 0, 0, 0, 8, 9, 10, 11,
+ 1, 2, 0, 0, 5, 0, 6, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 2, 0, 0, 0, 0,
+ 0, 0, 7, 8, 9, 10, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 12, 13, 14, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 15, 16, 0,
- 2, 17, 4, 18, 0, 0
+ 0, 11, 12, 0, 0, 13, 14, 0,
+ 2, 15, 16, 0, 0
};
static const char _use_syllable_machine_to_state_actions[] = {
- 0, 0, 0, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -330,9 +261,7 @@ static const char _use_syllable_machine_to_state_actions[] = {
};
static const char _use_syllable_machine_from_state_actions[] = {
- 0, 0, 0, 6, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 4, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -342,29 +271,27 @@ static const char _use_syllable_machine_from_state_actions[] = {
};
static const short _use_syllable_machine_eof_trans[] = {
- 0, 1, 3, 0, 29, 31, 31, 52,
- 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 53, 53, 52, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 53, 53, 53,
- 53, 70, 70, 74, 74, 74, 74, 74,
- 74, 74, 74, 74, 74, 74, 74, 74,
- 74, 74, 74, 74, 74, 74, 76, 76,
- 76
+ 1, 0, 27, 29, 29, 50, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 51,
+ 54, 51, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 55, 55, 55, 55, 55,
+ 55, 55, 55, 58, 55, 55, 59, 59,
+ 59
};
-static const int use_syllable_machine_start = 3;
-static const int use_syllable_machine_first_final = 3;
-static const int use_syllable_machine_error = 0;
+static const int use_syllable_machine_start = 1;
+static const int use_syllable_machine_first_final = 1;
+static const int use_syllable_machine_error = -1;
-static const int use_syllable_machine_en_main = 3;
+static const int use_syllable_machine_en_main = 1;
#line 38 "hb-ot-shape-complex-use-machine.rl"
-#line 145 "hb-ot-shape-complex-use-machine.rl"
+#line 138 "hb-ot-shape-complex-use-machine.rl"
#define found_syllable(syllable_type) \
@@ -384,7 +311,7 @@ find_syllables (hb_buffer_t *buffer)
int cs;
hb_glyph_info_t *info = buffer->info;
-#line 388 "hb-ot-shape-complex-use-machine.hh"
+#line 315 "hb-ot-shape-complex-use-machine.hh"
{
cs = use_syllable_machine_start;
ts = 0;
@@ -392,7 +319,7 @@ find_syllables (hb_buffer_t *buffer)
act = 0;
}
-#line 166 "hb-ot-shape-complex-use-machine.rl"
+#line 159 "hb-ot-shape-complex-use-machine.rl"
p = 0;
@@ -401,7 +328,7 @@ find_syllables (hb_buffer_t *buffer)
unsigned int last = 0;
unsigned int syllable_serial = 1;
-#line 405 "hb-ot-shape-complex-use-machine.hh"
+#line 332 "hb-ot-shape-complex-use-machine.hh"
{
int _slen;
int _trans;
@@ -409,15 +336,13 @@ find_syllables (hb_buffer_t *buffer)
const char *_inds;
if ( p == pe )
goto _test_eof;
- if ( cs == 0 )
- goto _out;
_resume:
switch ( _use_syllable_machine_from_state_actions[cs] ) {
- case 6:
+ case 4:
#line 1 "NONE"
{ts = p;}
break;
-#line 421 "hb-ot-shape-complex-use-machine.hh"
+#line 346 "hb-ot-shape-complex-use-machine.hh"
}
_keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -439,92 +364,70 @@ _eof_trans:
#line 1 "NONE"
{te = p+1;}
break;
- case 9:
-#line 134 "hb-ot-shape-complex-use-machine.rl"
+ case 8:
+#line 127 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (independent_cluster); }}
break;
- case 11:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
- {te = p+1;{ found_syllable (consonant_cluster); }}
+ case 10:
+#line 129 "hb-ot-shape-complex-use-machine.rl"
+ {te = p+1;{ found_syllable (standard_cluster); }}
break;
- case 14:
-#line 137 "hb-ot-shape-complex-use-machine.rl"
- {te = p+1;{ found_syllable (vowel_cluster); }}
- break;
- case 16:
-#line 138 "hb-ot-shape-complex-use-machine.rl"
- {te = p+1;{ found_syllable (number_joiner_terminated_cluster); }}
- break;
- case 7:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
+ case 6:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
- case 8:
+ case 5:
#line 134 "hb-ot-shape-complex-use-machine.rl"
+ {te = p+1;{ found_syllable (non_cluster); }}
+ break;
+ case 7:
+#line 127 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (independent_cluster); }}
break;
- case 12:
-#line 135 "hb-ot-shape-complex-use-machine.rl"
+ case 11:
+#line 128 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
break;
- case 10:
-#line 136 "hb-ot-shape-complex-use-machine.rl"
- {te = p;p--;{ found_syllable (consonant_cluster); }}
+ case 9:
+#line 129 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (standard_cluster); }}
break;
case 13:
-#line 137 "hb-ot-shape-complex-use-machine.rl"
- {te = p;p--;{ found_syllable (vowel_cluster); }}
+#line 130 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
break;
- case 15:
-#line 139 "hb-ot-shape-complex-use-machine.rl"
+ case 12:
+#line 131 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (numeral_cluster); }}
break;
- case 18:
-#line 140 "hb-ot-shape-complex-use-machine.rl"
+ case 16:
+#line 132 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }}
break;
- case 17:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
+ case 14:
+#line 133 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
+ case 15:
+#line 134 "hb-ot-shape-complex-use-machine.rl"
+ {te = p;p--;{ found_syllable (non_cluster); }}
+ break;
case 1:
-#line 139 "hb-ot-shape-complex-use-machine.rl"
- {{p = ((te))-1;}{ found_syllable (numeral_cluster); }}
+#line 133 "hb-ot-shape-complex-use-machine.rl"
+ {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
- case 3:
-#line 1 "NONE"
- { switch( act ) {
- case 0:
- {{cs = 0; goto _again;}}
- break;
- case 8:
- {{p = ((te))-1;} found_syllable (broken_cluster); }
- break;
- }
- }
- break;
- case 4:
-#line 1 "NONE"
- {te = p+1;}
-#line 141 "hb-ot-shape-complex-use-machine.rl"
- {act = 8;}
- break;
-#line 513 "hb-ot-shape-complex-use-machine.hh"
+#line 420 "hb-ot-shape-complex-use-machine.hh"
}
_again:
switch ( _use_syllable_machine_to_state_actions[cs] ) {
- case 5:
+ case 3:
#line 1 "NONE"
{ts = 0;}
-#line 1 "NONE"
- {act = 0;}
break;
-#line 524 "hb-ot-shape-complex-use-machine.hh"
+#line 429 "hb-ot-shape-complex-use-machine.hh"
}
- if ( cs == 0 )
- goto _out;
if ( ++p != pe )
goto _resume;
_test_eof: {}
@@ -536,10 +439,9 @@ _again:
}
}
- _out: {}
}
-#line 175 "hb-ot-shape-complex-use-machine.rl"
+#line 168 "hb-ot-shape-complex-use-machine.rl"
}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh
index 0febf8daccf..590fce2d95a 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh
@@ -46,7 +46,6 @@ enum use_category_t {
USE_O = 0, /* OTHER */
USE_B = 1, /* BASE */
- USE_IV = 2, /* BASE_VOWEL */
USE_IND = 3, /* BASE_IND */
USE_N = 4, /* BASE_NUM */
USE_GB = 5, /* BASE_OTHER */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc
index 09d94574823..645576f6f37 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc
@@ -6,12 +6,12 @@
*
* on files with these headers:
*
- * # IndicSyllabicCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # IndicPositionalCategory-8.0.0.txt
- * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI]
- * # Blocks-8.0.0.txt
- * # Date: 2014-11-10, 23:04:00 GMT [KW]
+ * # IndicSyllabicCategory-9.0.0.txt
+ * # Date: 2016-05-21, 02:46:00 GMT [RP]
+ * # IndicPositionalCategory-9.0.0.txt
+ * # Date: 2016-02-25, 00:48:00 GMT [RP]
+ * # Blocks-9.0.0.txt
+ * # Date: 2016-02-05, 23:48:00 GMT [KW]
* UnicodeData.txt does not have a header.
*/
@@ -24,7 +24,6 @@
#define H USE_H /* HALANT */
#define HN USE_HN /* HALANT_NUM */
#define IND USE_IND /* BASE_IND */
-#define IV USE_IV /* BASE_VOWEL */
#define N USE_N /* BASE_NUM */
#define O USE_O /* OTHER */
#define R USE_R /* REPHA */
@@ -80,30 +79,30 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Devanagari */
- /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 0910 */ IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0910 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0920 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0930 */ B, B, B, B, B, B, B, B, B, B, VAbv, VPst, CMBlw, B, VPst, VPre,
/* 0940 */ VPst, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VPst, VPst, VPst, VPst, H, VPre, VPst,
/* 0950 */ O, VMAbv, VMBlw, O, O, VAbv, VBlw, VBlw, B, B, B, B, B, B, B, B,
- /* 0960 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
- /* 0970 */ O, O, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B,
+ /* 0960 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0970 */ O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* Bengali */
- /* 0980 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV,
- /* 0990 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0980 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
+ /* 0990 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 09A0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 09B0 */ B, O, B, O, O, O, B, B, B, B, O, O, CMBlw, B, VPst, VPre,
/* 09C0 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, IND, O,
/* 09D0 */ O, O, O, O, O, O, O, VPst, O, O, O, O, B, B, O, B,
- /* 09E0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 09E0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Gurmukhi */
- /* 0A00 */ O, VMAbv, VMAbv, VMPst, O, IV, IV, IV, IV, IV, IV, O, O, O, O, IV,
- /* 0A10 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0A00 */ O, VMAbv, VMAbv, VMPst, O, B, B, B, B, B, B, O, O, O, O, B,
+ /* 0A10 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0A20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0A30 */ B, O, B, B, O, B, B, O, B, B, O, O, CMBlw, O, VPst, VPre,
/* 0A40 */ VPst, VBlw, VBlw, O, O, O, O, VAbv, VAbv, O, O, VAbv, VAbv, H, O, O,
@@ -113,30 +112,30 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Gujarati */
- /* 0A80 */ O, VMAbv, VMAbv, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, IV, O, IV,
- /* 0A90 */ IV, IV, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0A80 */ O, VMAbv, VMAbv, VMPst, O, B, B, B, B, B, B, B, B, B, O, B,
+ /* 0A90 */ B, B, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0AA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0AB0 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VPre,
/* 0AC0 */ VPst, VBlw, VBlw, VBlw, VBlw, VAbv, O, VAbv, VAbv, VAbv, O, VPst, VPst, H, O, O,
/* 0AD0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- /* 0AE0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0AE0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0AF0 */ O, O, O, O, O, O, O, O, O, B, O, O, O, O, O, O,
/* Oriya */
- /* 0B00 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV,
- /* 0B10 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0B00 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
+ /* 0B10 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0B20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0B30 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv,
/* 0B40 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O,
/* 0B50 */ O, O, O, O, O, O, VAbv, VAbv, O, O, O, O, B, B, O, B,
- /* 0B60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0B60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0B70 */ O, B, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Tamil */
- /* 0B80 */ O, O, VMAbv, IND, O, IV, IV, IV, IV, IV, IV, O, O, O, IV, IV,
- /* 0B90 */ IV, O, IV, IV, IV, B, O, O, O, B, B, O, B, O, B, B,
+ /* 0B80 */ O, O, VMAbv, IND, O, B, B, B, B, B, B, O, O, O, B, B,
+ /* 0B90 */ B, O, B, B, B, B, O, O, O, B, B, O, B, O, B, B,
/* 0BA0 */ O, O, O, B, B, O, O, O, B, B, B, O, O, O, B, B,
/* 0BB0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, VPst, VPst,
/* 0BC0 */ VAbv, VPst, VPst, O, O, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, O, O,
@@ -146,41 +145,41 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Telugu */
- /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV,
- /* 0C10 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
+ /* 0C10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0C20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0C30 */ B, B, B, B, B, B, B, B, B, B, O, O, O, B, VAbv, VAbv,
/* 0C40 */ VAbv, VPst, VPst, VPst, VPst, O, VAbv, VAbv, VAbv, O, VAbv, VAbv, VAbv, H, O, O,
/* 0C50 */ O, O, O, O, O, VAbv, VBlw, O, B, B, B, O, O, O, O, O,
- /* 0C60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0C60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0C70 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Kannada */
- /* 0C80 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV,
- /* 0C90 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0C80 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
+ /* 0C90 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0CA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 0CB0 */ B, B, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv,
/* 0CC0 */ VAbv, VPst, VPst, VPst, VPst, O, VAbv, VAbv, VAbv, O, VAbv, VAbv, VAbv, H, O, O,
/* 0CD0 */ O, O, O, O, O, VPst, VPst, O, O, O, O, O, O, O, B, O,
- /* 0CE0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0CE0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0CF0 */ O, R, R, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Malayalam */
- /* 0D00 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV,
- /* 0D10 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0D00 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B,
+ /* 0D10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0D20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0D30 */ B, B, B, B, B, B, B, B, B, B, B, O, O, B, VPst, VPst,
/* 0D40 */ VPst, VPst, VPst, VBlw, VBlw, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, R, O,
- /* 0D50 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, O, IV,
- /* 0D60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
+ /* 0D50 */ O, O, O, O, IND, IND, IND, VPst, O, O, O, O, O, O, O, B,
+ /* 0D60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B,
/* 0D70 */ O, O, O, O, O, O, O, O, O, O, IND, IND, IND, IND, IND, IND,
/* Sinhala */
- /* 0D80 */ O, O, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 0D90 */ IV, IV, IV, IV, IV, IV, IV, O, O, O, B, B, B, B, B, B,
+ /* 0D80 */ O, O, VMPst, VMPst, O, B, B, B, B, B, B, B, B, B, B, B,
+ /* 0D90 */ B, B, B, B, B, B, B, O, O, O, B, B, B, B, B, B,
/* 0DA0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 0DB0 */ B, B, O, B, B, B, B, B, B, B, B, B, O, B, O, O,
/* 0DC0 */ B, B, B, B, B, B, B, O, O, O, H, O, O, O, O, VPst,
@@ -195,10 +194,10 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1000 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 1020 */ B, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, VPst, VPst, VAbv, VAbv, VBlw,
+ /* 1020 */ B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VAbv, VAbv, VBlw,
/* 1030 */ VBlw, VPre, VAbv, VAbv, VAbv, VAbv, VMAbv, VMBlw, VMPst, H, VAbv, MPst, MPre, MBlw, MBlw, B,
/* 1040 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, GB, O,
- /* 1050 */ B, B, IV, IV, IV, IV, VPst, VPst, VBlw, VBlw, B, B, B, B, MBlw, MBlw,
+ /* 1050 */ B, B, B, B, B, B, VPst, VPst, VBlw, VBlw, B, B, B, B, MBlw, MBlw,
/* 1060 */ MBlw, B, VPst, VMPst, VMPst, B, B, VPst, VPst, VMPst, VMPst, VMPst, VMPst, VMPst, B, B,
/* 1070 */ B, VAbv, VAbv, VAbv, VAbv, B, B, B, B, B, B, B, B, B, B, B,
/* 1080 */ B, B, MBlw, VPst, VPre, VAbv, VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw, B, VMPst,
@@ -209,30 +208,30 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Tagalog */
- /* 1700 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, O, B, B,
+ /* 1700 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, B, B,
/* 1710 */ B, B, VAbv, VBlw, VBlw, O, O, O, O, O, O, O, O, O, O, O,
/* Hanunoo */
- /* 1720 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1720 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1730 */ B, B, VAbv, VBlw, VBlw, O, O, O, O, O, O, O, O, O, O, O,
/* Buhid */
- /* 1740 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1740 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1750 */ B, B, VAbv, VBlw, O, O, O, O, O, O, O, O, O, O, O, O,
/* Tagbanwa */
- /* 1760 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, O, B, B,
+ /* 1760 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, B, B,
/* 1770 */ B, O, VAbv, VBlw, O, O, O, O, O, O, O, O, O, O, O, O,
/* Khmer */
/* 1780 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1790 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 17A0 */ B, B, B, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 17B0 */ IV, IV, IV, IV, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPre, VPre,
+ /* 17A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPre, VPre,
/* 17C0 */ VPre, VPre, VPre, VPre, VPre, VPre, VMAbv, VMPst, VPst, VMAbv, VMAbv, FM, FAbv, CMAbv, FM, FM,
/* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, VAbv, O, O,
/* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
@@ -274,8 +273,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1A30 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, IV, IV, IV,
- /* 1A50 */ IV, IV, IV, B, B, MPre, MBlw, FPst, FAbv, FAbv, FAbv, FBlw, FBlw, FBlw, FBlw, O,
+ /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1A50 */ B, B, B, B, B, MPre, MBlw, FPst, FAbv, FAbv, FAbv, FBlw, FBlw, FBlw, FBlw, O,
/* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre,
/* 1A70 */ VPre, VPre, VPre, VAbv, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, FM, FM, FM, O, O, FM,
/* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
@@ -286,8 +285,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Balinese */
- /* 1B00 */ VMAbv, VMAbv, VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 1B10 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1B00 */ VMAbv, VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B,
+ /* 1B10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1B20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1B30 */ B, B, B, B, CMAbv, VPst, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPre, VPre,
/* 1B40 */ VPre, VPre, VAbv, VAbv, H, B, B, B, B, B, B, B, O, O, O, O,
@@ -297,7 +296,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Sundanese */
- /* 1B80 */ VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B,
+ /* 1B80 */ VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1B90 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1BA0 */ B, SUB, SUB, SUB, VAbv, VBlw, VPre, VPst, VAbv, VAbv, VPst, H, SUB, SUB, B, B,
/* 1BB0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
@@ -306,7 +305,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1BC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 1BD0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* 1BE0 */ B, B, B, B, IV, IV, CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv,
+ /* 1BE0 */ B, B, B, B, B, B, CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv,
/* 1BF0 */ FAbv, FAbv, VPst, VPst, O, O, O, O, O, O, O, O, O, O, O, O,
/* Lepcha */
@@ -326,14 +325,20 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, O, O, O, O, VMBlw, O, O,
/* 1CF0 */ O, O, VMPst, VMPst, VMAbv, O, O, O, VMAbv, VMAbv, O, O, O, O, O, O,
-#define use_offset_0x2008u 2552
+#define use_offset_0x1df8u 2552
+
+
+ /* Combining Diacritical Marks Supplement */
+ O, O, O, FM, O, O, O, O,
+
+#define use_offset_0x2008u 2560
/* General Punctuation */
O, O, O, O, ZWNJ, ZWJ, O, O,
/* 2010 */ GB, GB, GB, GB, GB, O, O, O,
-#define use_offset_0x2060u 2568
+#define use_offset_0x2060u 2576
/* 2060 */ WJ, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -342,12 +347,12 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 2070 */ O, O, O, O, FM, O, O, O, O, O, O, O, O, O, O, O,
/* 2080 */ O, O, FM, FM, FM, O, O, O,
-#define use_offset_0xa800u 2608
+#define use_offset_0xa800u 2616
/* Syloti Nagri */
- /* A800 */ IV, IV, O, IV, IV, IV, VAbv, B, B, B, B, VMAbv, B, B, B, B,
+ /* A800 */ B, B, O, B, B, B, VAbv, B, B, B, B, VMAbv, B, B, B, B,
/* A810 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A820 */ B, B, B, VPst, VPst, VBlw, VAbv, VPst, O, O, O, O, O, O, O, O,
/* A830 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
@@ -361,11 +366,11 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Saurashtra */
- /* A880 */ VMPst, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* A890 */ IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* A880 */ VMPst, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* A890 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A8A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A8B0 */ B, B, B, B, FPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst,
- /* A8C0 */ VPst, VPst, VPst, VPst, H, O, O, O, O, O, O, O, O, O, O, O,
+ /* A8C0 */ VPst, VPst, VPst, VPst, H, VMAbv, O, O, O, O, O, O, O, O, O, O,
/* A8D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
/* Devanagari Extended */
@@ -389,7 +394,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Javanese */
- /* A980 */ VMAbv, VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, B, B, B, IV, IV, IV, B,
+ /* A980 */ VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B,
/* A990 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A9A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, SUB, MPst, MPst,
@@ -403,7 +408,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Cham */
- /* AA00 */ IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B, B,
+ /* AA00 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* AA10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* AA20 */ B, B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VAbv, VPre,
/* AA30 */ VPre, VAbv, VBlw, MPst, MPre, MBlw, MBlw, O, O, O, O, O, O, O, O, O,
@@ -413,7 +418,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Myanmar Extended-A */
/* AA60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
- /* AA70 */ O, B, B, B, O, O, O, O, O, O, B, VMPst, VMAbv, VMPst, B, B,
+ /* AA70 */ O, B, B, B, GB, GB, GB, O, O, O, B, VMPst, VMAbv, VMPst, B, B,
/* Tai Viet */
@@ -426,27 +431,27 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Meetei Mayek Extensions */
- /* AAE0 */ IV, IV, B, B, B, B, B, B, B, B, B, VPre, VBlw, VAbv, VPre, VPst,
+ /* AAE0 */ B, B, B, B, B, B, B, B, B, B, B, VPre, VBlw, VAbv, VPre, VPst,
/* AAF0 */ O, O, O, O, O, VMPst, H, O,
-#define use_offset_0xabc0u 3368
+#define use_offset_0xabc0u 3376
/* Meetei Mayek */
- /* ABC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, IV, IV,
- /* ABD0 */ B, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* ABC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* ABD0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* ABE0 */ B, B, B, VPst, VPst, VAbv, VPst, VPst, VBlw, VPst, VPst, O, VMPst, VBlw, O, O,
/* ABF0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-#define use_offset_0xfe00u 3432
+#define use_offset_0xfe00u 3440
/* Variation Selectors */
/* FE00 */ VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS,
-#define use_offset_0x10a00u 3448
+#define use_offset_0x10a00u 3456
/* Kharoshthi */
@@ -457,13 +462,13 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 10A30 */ B, B, B, B, O, O, O, O, CMAbv, CMBlw, CMBlw, O, O, O, O, H,
/* 10A40 */ B, B, B, B, B, B, B, B,
-#define use_offset_0x11000u 3520
+#define use_offset_0x11000u 3528
/* Brahmi */
- /* 11000 */ VMPst, VMAbv, VMPst, R, R, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 11010 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11000 */ VMPst, VMAbv, VMPst, R, R, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11020 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11030 */ B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw,
/* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, O, O, O, O, O, O, O, O, O,
@@ -473,17 +478,17 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Kaithi */
- /* 11080 */ VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B,
+ /* 11080 */ VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11090 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 110A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 110B0 */ VPst, VPre, VPst, VBlw, VBlw, VAbv, VAbv, VPst, VPst, H, CMBlw, O, O, O, O, O,
-#define use_offset_0x11100u 3712
+#define use_offset_0x11100u 3720
/* Chakma */
- /* 11100 */ VMAbv, VMAbv, VMAbv, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B,
+ /* 11100 */ VMAbv, VMAbv, VMAbv, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11110 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11120 */ B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VAbv, VAbv,
/* 11130 */ VAbv, VBlw, VBlw, H, VAbv, O, B, B, B, B, B, B, B, B, B, B,
@@ -497,8 +502,8 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Sharada */
- /* 11180 */ VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV,
- /* 11190 */ IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11180 */ VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11190 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 111A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 111B0 */ B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv,
/* 111C0 */ H, B, R, R, O, O, O, O, O, O, CMBlw, VAbv, VBlw, O, O, O,
@@ -511,23 +516,23 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Khojki */
- /* 11200 */ IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B,
+ /* 11200 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11210 */ B, B, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11220 */ B, B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VPst, VBlw,
- /* 11230 */ VAbv, VAbv, VAbv, VAbv, VMAbv, H, CMAbv, CMAbv,
+ /* 11230 */ VAbv, VAbv, VAbv, VAbv, VMAbv, H, CMAbv, CMAbv, O, O, O, O, O, O, VMAbv, O,
-#define use_offset_0x11280u 4024
+#define use_offset_0x11280u 4040
/* Multani */
- /* 11280 */ IV, IV, IV, IV, B, B, B, O, B, O, B, B, B, B, O, B,
+ /* 11280 */ B, B, B, B, B, B, B, O, B, O, B, B, B, B, O, B,
/* 11290 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, O, B,
/* 112A0 */ B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, O,
/* Khudawadi */
- /* 112B0 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B,
+ /* 112B0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 112C0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 112D0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VMAbv,
/* 112E0 */ VPst, VPre, VPst, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, CMBlw, VBlw, O, O, O, O, O,
@@ -535,44 +540,55 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Grantha */
- /* 11300 */ VMAbv, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV,
- /* 11310 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11300 */ VMAbv, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B,
+ /* 11310 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11320 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
/* 11330 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VPst,
/* 11340 */ VAbv, VPst, VPst, VPst, VPst, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O,
/* 11350 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, O, O,
- /* 11360 */ IV, IV, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O,
+ /* 11360 */ B, B, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O,
/* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O,
-#define use_offset_0x11480u 4272
+#define use_offset_0x11400u 4288
+ /* Newa */
+
+ /* 11400 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11410 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11420 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11430 */ B, B, B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv,
+ /* 11440 */ VPst, VPst, H, VMAbv, VMAbv, VMPst, CMBlw, B, O, O, O, O, O, O, O, O,
+ /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
+ /* 11460 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 11470 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+
/* Tirhuta */
- /* 11480 */ O, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B,
+ /* 11480 */ O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11490 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 114A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 114B0 */ VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VPre, VAbv, VPre, VPre, VPst, VPre, VMAbv,
/* 114C0 */ VMAbv, VMPst, H, CMBlw, B, O, O, O, O, O, O, O, O, O, O, O,
/* 114D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O,
-#define use_offset_0x11580u 4368
+#define use_offset_0x11580u 4512
/* Siddham */
- /* 11580 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B,
+ /* 11580 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11590 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 115A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VPst,
/* 115B0 */ VPre, VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, VPre, VPre, VMAbv, VMAbv, VMPst, H,
/* 115C0 */ CMBlw, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
- /* 115D0 */ O, O, O, O, O, O, O, O, IV, IV, IV, IV, VBlw, VBlw, O, O,
+ /* 115D0 */ O, O, O, O, O, O, O, O, B, B, B, B, VBlw, VBlw, O, O,
/* 115E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* 115F0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
/* Modi */
- /* 11600 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B,
+ /* 11600 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11610 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11620 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11630 */ VPst, VPst, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPst, VPst, VMAbv, VMPst, H,
@@ -583,7 +599,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* Takri */
- /* 11680 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B,
+ /* 11680 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 11690 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
/* 116A0 */ B, B, B, B, B, B, B, B, B, B, B, VMAbv, VMPst, VAbv, VPre, VPst,
/* 116B0 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, CMBlw, O, O, O, O, O, O, O, O,
@@ -599,7 +615,28 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = {
/* 11720 */ VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VBlw, VAbv, VAbv, VAbv, O, O, O, O,
/* 11730 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O,
-}; /* Table items: 4816; occupancy: 72% */
+#define use_offset_0x11c00u 4960
+
+
+ /* Bhaiksuki */
+
+ /* 11C00 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B,
+ /* 11C10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11C20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VPst,
+ /* 11C30 */ VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VBlw, O, VAbv, VAbv, VAbv, VAbv, VMAbv, VMAbv, VMPst, H,
+ /* 11C40 */ B, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O,
+ /* 11C50 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11C60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, O, O,
+
+ /* Marchen */
+
+ /* 11C70 */ O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11C80 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B,
+ /* 11C90 */ O, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
+ /* 11CA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
+ /* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O,
+
+}; /* Table items: 5144; occupancy: 72% */
USE_TABLE_ELEMENT_TYPE
hb_use_get_categories (hb_codepoint_t u)
@@ -619,6 +656,7 @@ hb_use_get_categories (hb_codepoint_t u)
if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
+ if (hb_in_range (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
break;
case 0x2u:
@@ -642,10 +680,11 @@ hb_use_get_categories (hb_codepoint_t u)
case 0x11u:
if (hb_in_range (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u];
- if (hb_in_range (u, 0x11100u, 0x11237u)) return use_table[u - 0x11100u + use_offset_0x11100u];
+ if (hb_in_range (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
if (hb_in_range (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u];
- if (hb_in_range (u, 0x11480u, 0x114DFu)) return use_table[u - 0x11480u + use_offset_0x11480u];
+ if (hb_in_range (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u];
if (hb_in_range (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u];
+ if (hb_in_range (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u];
if (unlikely (u == 0x1107Fu)) return HN;
break;
@@ -662,7 +701,6 @@ hb_use_get_categories (hb_codepoint_t u)
#undef H
#undef HN
#undef IND
-#undef IV
#undef N
#undef O
#undef R
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc
index caacb0caf29..eeca79ae443 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc
@@ -184,6 +184,9 @@ has_arabic_joining (hb_script_t script)
case HB_SCRIPT_MANICHAEAN:
case HB_SCRIPT_PSALTER_PAHLAVI:
+ /* Unicode-9.0 additions */
+ case HB_SCRIPT_ADLAM:
+
return true;
default:
@@ -227,12 +230,12 @@ data_destroy_use (void *data)
enum syllable_type_t {
independent_cluster,
virama_terminated_cluster,
- consonant_cluster,
- vowel_cluster,
+ standard_cluster,
number_joiner_terminated_cluster,
numeral_cluster,
symbol_cluster,
broken_cluster,
+ non_cluster,
};
#include "hb-ot-shape-complex-use-machine.hh"
@@ -285,6 +288,9 @@ static void
setup_topographical_masks (const hb_ot_shape_plan_t *plan,
hb_buffer_t *buffer)
{
+ const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
+ if (use_plan->arabic_plan)
+ return;
ASSERT_STATIC (INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4);
hb_mask_t masks[4], all_masks = 0;
@@ -309,13 +315,13 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan,
{
case independent_cluster:
case symbol_cluster:
+ case non_cluster:
/* These don't join. Nothing to do. */
last_form = _NONE;
break;
case virama_terminated_cluster:
- case consonant_cluster:
- case vowel_cluster:
+ case standard_cluster:
case number_joiner_terminated_cluster:
case numeral_cluster:
case broken_cluster:
@@ -360,7 +366,7 @@ clear_substitution_flags (const hb_ot_shape_plan_t *plan,
hb_glyph_info_t *info = buffer->info;
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++)
- _hb_glyph_info_clear_substituted_and_ligated_and_multiplied (&info[i]);
+ _hb_glyph_info_clear_substituted (&info[i]);
}
static void
@@ -405,6 +411,12 @@ record_pref (const hb_ot_shape_plan_t *plan,
}
}
+static inline bool
+is_halant (const hb_glyph_info_t &info)
+{
+ return info.use_category() == USE_H && !_hb_glyph_info_ligated (&info);
+}
+
static void
reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
{
@@ -412,28 +424,26 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
/* Only a few syllable types need reordering. */
if (unlikely (!(FLAG_SAFE (syllable_type) &
(FLAG (virama_terminated_cluster) |
- FLAG (consonant_cluster) |
- FLAG (vowel_cluster) |
+ FLAG (standard_cluster) |
FLAG (broken_cluster) |
0))))
return;
hb_glyph_info_t *info = buffer->info;
-#define HALANT_FLAGS FLAG(USE_H)
-#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB) | FLAG (USE_IV))
+#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB))
/* Move things forward. */
if (info[start].use_category() == USE_R && end - start > 1)
{
/* Got a repha. Reorder it to after first base, before first halant. */
for (unsigned int i = start + 1; i < end; i++)
- if (FLAG_UNSAFE (info[i].use_category()) & (HALANT_FLAGS | BASE_FLAGS))
+ if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (info[i]))
{
/* If we hit a halant, move before it; otherwise it's a base: move to it's
* place, and shift things in between backward. */
- if (info[i].use_category() == USE_H)
+ if (is_halant (info[i]))
i--;
buffer->merge_clusters (start, i + 1);
@@ -450,11 +460,11 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
for (unsigned int i = start; i < end; i++)
{
uint32_t flag = FLAG_UNSAFE (info[i].use_category());
- if (flag & (HALANT_FLAGS | BASE_FLAGS))
+ if ((flag & (BASE_FLAGS)) || is_halant (info[i]))
{
- /* If we hit a halant, move before it; otherwise it's a base: move to it's
+ /* If we hit a halant, move after it; otherwise it's a base: move to it's
* place, and shift things in between backward. */
- if (info[i].use_category() == USE_H)
+ if (is_halant (info[i]))
j = i + 1;
else
j = i;
@@ -490,22 +500,16 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
if (likely (!has_broken_syllables))
return;
-
- hb_codepoint_t dottedcircle_glyph;
- if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph))
- return;
-
hb_glyph_info_t dottedcircle = {0};
- if (!font->get_glyph (0x25CCu, 0, &dottedcircle.codepoint))
+ if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
return;
dottedcircle.use_category() = hb_use_get_categories (0x25CC);
buffer->clear_output ();
buffer->idx = 0;
-
unsigned int last_syllable = 0;
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
{
unsigned int syllable = buffer->cur().syllable();
syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F);
@@ -513,19 +517,19 @@ insert_dotted_circles (const hb_ot_shape_plan_t *plan HB_UNUSED,
{
last_syllable = syllable;
- hb_glyph_info_t info = dottedcircle;
- info.cluster = buffer->cur().cluster;
- info.mask = buffer->cur().mask;
- info.syllable() = buffer->cur().syllable();
+ hb_glyph_info_t ginfo = dottedcircle;
+ ginfo.cluster = buffer->cur().cluster;
+ ginfo.mask = buffer->cur().mask;
+ ginfo.syllable() = buffer->cur().syllable();
/* TODO Set glyph_props? */
/* Insert dottedcircle after possible Repha. */
- while (buffer->idx < buffer->len &&
+ while (buffer->idx < buffer->len && !buffer->in_error &&
last_syllable == buffer->cur().syllable() &&
buffer->cur().use_category() == USE_R)
buffer->next_glyph ();
- buffer->output_info (info);
+ buffer->output_info (ginfo);
}
else
buffer->next_glyph ();
@@ -564,7 +568,7 @@ compose_use (const hb_ot_shape_normalize_context_t *c,
if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a)))
return false;
- return c->unicode->compose (a, b, ab);
+ return (bool)c->unicode->compose (a, b, ab);
}
@@ -576,10 +580,11 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use =
data_create_use,
data_destroy_use,
NULL, /* preprocess_text */
+ NULL, /* postprocess_glyphs */
HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
NULL, /* decompose */
compose_use,
setup_masks_use,
- HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
+ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
false, /* fallback_position */
};
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh
index 2f52d857198..f9fe50491ac 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh
@@ -45,5 +45,9 @@ HB_INTERNAL void _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
+HB_INTERNAL void _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer);
+
#endif /* HB_OT_SHAPE_FALLBACK_PRIVATE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc
index 6b9c9ac8594..baa383501f6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc
@@ -224,7 +224,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing;
break;
}
- /* Fall through */
+ HB_FALLTHROUGH;
default:
case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
@@ -259,6 +259,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT:
/* Add gap, fall-through. */
base_extents.height -= y_gap;
+ HB_FALLTHROUGH;
case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT:
case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW:
@@ -279,6 +280,7 @@ position_mark (const hb_ot_shape_plan_t *plan,
/* Add gap, fall-through. */
base_extents.y_bearing += y_gap;
base_extents.height -= y_gap;
+ HB_FALLTHROUGH;
case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE:
case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT:
@@ -482,3 +484,70 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
idx = skippy_iter.idx;
}
}
+
+
+/* Adjusts width of various spaces. */
+void
+_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+ hb_font_t *font,
+ hb_buffer_t *buffer)
+{
+ if (!HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+ return;
+
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+ unsigned int count = buffer->len;
+ for (unsigned int i = 0; i < count; i++)
+ if (_hb_glyph_info_is_unicode_space (&info[i]) && !_hb_glyph_info_ligated (&info[i]))
+ {
+ hb_unicode_funcs_t::space_t space_type = _hb_glyph_info_get_unicode_space_fallback_type (&info[i]);
+ hb_codepoint_t glyph;
+ typedef hb_unicode_funcs_t t;
+ switch (space_type)
+ {
+ case t::NOT_SPACE: /* Shouldn't happen. */
+ case t::SPACE:
+ break;
+
+ case t::SPACE_EM:
+ case t::SPACE_EM_2:
+ case t::SPACE_EM_3:
+ case t::SPACE_EM_4:
+ case t::SPACE_EM_5:
+ case t::SPACE_EM_6:
+ case t::SPACE_EM_16:
+ pos[i].x_advance = (font->x_scale + ((int) space_type)/2) / (int) space_type;
+ break;
+
+ case t::SPACE_4_EM_18:
+ pos[i].x_advance = font->x_scale * 4 / 18;
+ break;
+
+ case t::SPACE_FIGURE:
+ for (char u = '0'; u <= '9'; u++)
+ if (font->get_nominal_glyph (u, &glyph))
+ {
+ pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ break;
+ }
+ break;
+
+ case t::SPACE_PUNCTUATION:
+ if (font->get_nominal_glyph ('.', &glyph))
+ pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ else if (font->get_nominal_glyph (',', &glyph))
+ pos[i].x_advance = font->get_glyph_h_advance (glyph);
+ break;
+
+ case t::SPACE_NARROW:
+ /* Half-space?
+ * Unicode doc http://www.unicode.org/charts/PDF/U2000.pdf says ~1/4 or 1/5 of EM.
+ * However, in my testing, many fonts have their regular space being about that
+ * size. To me, a percentage of the space width makes more sense. Half is as
+ * good as any. */
+ pos[i].x_advance /= 2;
+ break;
+ }
+ }
+}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc
index b0c027aebaa..6bba43b1693 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc
@@ -62,24 +62,12 @@
* with previous base, use that. This needs the itemizer to have this
* knowledge too. We need to provide assistance to the itemizer.
*
- * - When a font does not support a character but supports its decomposition,
- * well, use the decomposition (preferring the canonical decomposition, but
- * falling back to the compatibility decomposition if necessary). The
- * compatibility decomposition is really nice to have, for characters like
- * ellipsis, or various-sized space characters.
+ * - When a font does not support a character but supports its canonical
+ * decomposition, well, use the decomposition.
*
* - The complex shapers can customize the compose and decompose functions to
* offload some of their requirements to the normalizer. For example, the
* Indic shaper may want to disallow recomposing of two matras.
- *
- * - We try compatibility decomposition if decomposing through canonical
- * decomposition alone failed to find a sequence that the font supports.
- * We don't try compatibility decomposition recursively during the canonical
- * decomposition phase. This has minimal impact. There are only a handful
- * of Greek letter that have canonical decompositions that include characters
- * with compatibility decomposition. Those can be found using this command:
- *
- * egrep "`echo -n ';('; grep ';<' UnicodeData.txt | cut -d';' -f1 | tr '\n' '|'; echo ') '`" UnicodeData.txt
*/
static bool
@@ -88,7 +76,7 @@ decompose_unicode (const hb_ot_shape_normalize_context_t *c,
hb_codepoint_t *a,
hb_codepoint_t *b)
{
- return c->unicode->decompose (ab, a, b);
+ return (bool) c->unicode->decompose (ab, a, b);
}
static bool
@@ -97,21 +85,21 @@ compose_unicode (const hb_ot_shape_normalize_context_t *c,
hb_codepoint_t b,
hb_codepoint_t *ab)
{
- return c->unicode->compose (a, b, ab);
+ return (bool) c->unicode->compose (a, b, ab);
}
static inline void
set_glyph (hb_glyph_info_t &info, hb_font_t *font)
{
- font->get_glyph (info.codepoint, 0, &info.glyph_index());
+ font->get_nominal_glyph (info.codepoint, &info.glyph_index());
}
static inline void
output_char (hb_buffer_t *buffer, hb_codepoint_t unichar, hb_codepoint_t glyph)
{
buffer->cur().glyph_index() = glyph;
- buffer->output_glyph (unichar);
- _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer->unicode);
+ buffer->output_glyph (unichar); /* This is very confusing indeed. */
+ _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer);
}
static inline void
@@ -136,10 +124,10 @@ decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint
hb_font_t * const font = c->font;
if (!c->decompose (c, ab, &a, &b) ||
- (b && !font->get_glyph (b, 0, &b_glyph)))
+ (b && !font->get_nominal_glyph (b, &b_glyph)))
return 0;
- bool has_a = font->get_glyph (a, 0, &a_glyph);
+ bool has_a = (bool) font->get_nominal_glyph (a, &a_glyph);
if (shortest && has_a) {
/* Output a and b */
output_char (buffer, a, a_glyph);
@@ -171,28 +159,6 @@ decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint
return 0;
}
-/* Returns 0 if didn't decompose, number of resulting characters otherwise. */
-static inline unsigned int
-decompose_compatibility (const hb_ot_shape_normalize_context_t *c, hb_codepoint_t u)
-{
- unsigned int len, i;
- hb_codepoint_t decomposed[HB_UNICODE_MAX_DECOMPOSITION_LEN];
- hb_codepoint_t glyphs[HB_UNICODE_MAX_DECOMPOSITION_LEN];
-
- len = c->buffer->unicode->decompose_compatibility (u, decomposed);
- if (!len)
- return 0;
-
- for (i = 0; i < len; i++)
- if (!c->font->get_glyph (decomposed[i], 0, &glyphs[i]))
- return 0;
-
- for (i = 0; i < len; i++)
- output_char (c->buffer, decomposed[i], glyphs[i]);
-
- return len;
-}
-
static inline void
decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shortest)
{
@@ -200,17 +166,50 @@ decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shor
hb_codepoint_t u = buffer->cur().codepoint;
hb_codepoint_t glyph;
- /* Kind of a cute waterfall here... */
- if (shortest && c->font->get_glyph (u, 0, &glyph))
+ if (shortest && c->font->get_nominal_glyph (u, &glyph))
+ {
next_char (buffer, glyph);
- else if (decompose (c, shortest, u))
+ return;
+ }
+
+ if (decompose (c, shortest, u))
+ {
skip_char (buffer);
- else if (!shortest && c->font->get_glyph (u, 0, &glyph))
+ return;
+ }
+
+ if (!shortest && c->font->get_nominal_glyph (u, &glyph))
+ {
next_char (buffer, glyph);
- else if (decompose_compatibility (c, u))
- skip_char (buffer);
- else
- next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
+ return;
+ }
+
+ if (_hb_glyph_info_is_unicode_space (&buffer->cur()))
+ {
+ hb_codepoint_t space_glyph;
+ hb_unicode_funcs_t::space_t space_type = buffer->unicode->space_fallback_type (u);
+ if (space_type != hb_unicode_funcs_t::NOT_SPACE && c->font->get_nominal_glyph (0x0020u, &space_glyph))
+ {
+ _hb_glyph_info_set_unicode_space_fallback_type (&buffer->cur(), space_type);
+ next_char (buffer, space_glyph);
+ buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK;
+ return;
+ }
+ }
+
+ if (u == 0x2011u)
+ {
+ /* U+2011 is the only sensible character that is a no-break version of another character
+ * and not a space. The space ones are handled already. Handle this lone one. */
+ hb_codepoint_t other_glyph;
+ if (c->font->get_nominal_glyph (0x2010u, &other_glyph))
+ {
+ next_char (buffer, other_glyph);
+ return;
+ }
+ }
+
+ next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
}
static inline void
@@ -219,10 +218,10 @@ handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, uns
/* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
hb_buffer_t * const buffer = c->buffer;
hb_font_t * const font = c->font;
- for (; buffer->idx < end - 1;) {
+ for (; buffer->idx < end - 1 && !buffer->in_error;) {
if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
/* The next two lines are some ugly lines... But work. */
- if (font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
+ if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
{
buffer->replace_glyphs (2, 1, &buffer->cur().codepoint);
}
@@ -255,13 +254,13 @@ static inline void
decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit)
{
hb_buffer_t * const buffer = c->buffer;
- for (unsigned int i = buffer->idx; i < end; i++)
+ for (unsigned int i = buffer->idx; i < end && !buffer->in_error; i++)
if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) {
handle_variation_selector_cluster (c, end, short_circuit);
return;
}
- while (buffer->idx < end)
+ while (buffer->idx < end && !buffer->in_error)
decompose_current_character (c, short_circuit);
}
@@ -321,7 +320,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
buffer->clear_output ();
count = buffer->len;
- for (buffer->idx = 0; buffer->idx < count;)
+ for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;)
{
unsigned int end;
for (end = buffer->idx + 1; end < count; end++)
@@ -371,7 +370,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
count = buffer->len;
unsigned int starter = 0;
buffer->next_glyph ();
- while (buffer->idx < count)
+ while (buffer->idx < count && !buffer->in_error)
{
hb_codepoint_t composed, glyph;
if (/* We don't try to compose a non-mark character with it's preceding starter.
@@ -389,7 +388,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
buffer->cur().codepoint,
&composed) &&
/* And the font has glyph for the composite. */
- font->get_glyph (composed, 0, &glyph))
+ font->get_nominal_glyph (composed, &glyph))
{
/* Composes. */
buffer->next_glyph (); /* Copy to out-buffer. */
@@ -400,7 +399,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan,
/* Modify starter and carry on. */
buffer->out_info[starter].codepoint = composed;
buffer->out_info[starter].glyph_index() = glyph;
- _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer->unicode);
+ _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
continue;
}
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc
index a8888458753..35f2097d7ec 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc
@@ -145,7 +145,7 @@ _hb_ot_shaper_face_data_destroy (hb_ot_shaper_face_data_t *data)
struct hb_ot_shaper_font_data_t {};
hb_ot_shaper_font_data_t *
-_hb_ot_shaper_font_data_create (hb_font_t *font)
+_hb_ot_shaper_font_data_create (hb_font_t *font HB_UNUSED)
{
return (hb_ot_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
}
@@ -228,7 +228,7 @@ hb_set_unicode_props (hb_buffer_t *buffer)
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 0; i < count; i++)
- _hb_glyph_info_set_unicode_props (&info[i], buffer->unicode);
+ _hb_glyph_info_set_unicode_props (&info[i], buffer);
}
static void
@@ -245,7 +245,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
hb_glyph_info_t dottedcircle = {0};
dottedcircle.codepoint = 0x25CCu;
- _hb_glyph_info_set_unicode_props (&dottedcircle, buffer->unicode);
+ _hb_glyph_info_set_unicode_props (&dottedcircle, buffer);
buffer->clear_output ();
@@ -254,7 +254,7 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
info.cluster = buffer->cur().cluster;
info.mask = buffer->cur().mask;
buffer->output_info (info);
- while (buffer->idx < buffer->len)
+ while (buffer->idx < buffer->len && !buffer->in_error)
buffer->next_glyph ();
buffer->swap_buffers ();
@@ -263,16 +263,18 @@ hb_insert_dotted_circle (hb_buffer_t *buffer, hb_font_t *font)
static void
hb_form_clusters (hb_buffer_t *buffer)
{
- if (buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
+ if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+ buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
return;
- /* Loop duplicated in hb_ensure_native_direction(). */
+ /* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */
unsigned int base = 0;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
for (unsigned int i = 1; i < count; i++)
{
- if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i]))))
+ if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) &&
+ !_hb_glyph_info_is_joiner (&info[i])))
{
buffer->merge_clusters (base, i);
base = i;
@@ -346,7 +348,8 @@ hb_ot_mirror_chars (hb_ot_shape_context_t *c)
static inline void
hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c)
{
- if (!c->plan->has_frac)
+ if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
+ !c->plan->has_frac)
return;
hb_buffer_t *buffer = c->buffer;
@@ -416,7 +419,8 @@ hb_ot_zero_width_default_ignorables (hb_ot_shape_context_t *c)
{
hb_buffer_t *buffer = c->buffer;
- if (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)
+ if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
+ (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
return;
unsigned int count = buffer->len;
@@ -433,7 +437,8 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
{
hb_buffer_t *buffer = c->buffer;
- if (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)
+ if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
+ (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
return;
unsigned int count = buffer->len;
@@ -451,7 +456,7 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
return;
hb_codepoint_t space;
- if (c->font->get_glyph (' ', 0, &space))
+ if (c->font->get_nominal_glyph (' ', &space))
{
/* Replace default-ignorables with a zero-advance space glyph. */
for (/*continue*/; i < count; i++)
@@ -518,40 +523,11 @@ hb_ot_map_glyphs_fast (hb_buffer_t *buffer)
buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
}
-static inline void
-hb_synthesize_glyph_classes (hb_ot_shape_context_t *c)
-{
- unsigned int count = c->buffer->len;
- hb_glyph_info_t *info = c->buffer->info;
- for (unsigned int i = 0; i < count; i++)
- {
- hb_ot_layout_glyph_class_mask_t klass;
-
- /* Never mark default-ignorables as marks.
- * They won't get in the way of lookups anyway,
- * but having them as mark will cause them to be skipped
- * over if the lookup-flag says so, but at least for the
- * Mongolian variation selectors, looks like Uniscribe
- * marks them as non-mark. Some Mongolian fonts without
- * GDEF rely on this. Another notable character that
- * this applies to is COMBINING GRAPHEME JOINER. */
- klass = (_hb_glyph_info_get_general_category (&info[i]) !=
- HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
- _hb_glyph_info_is_default_ignorable (&info[i])) ?
- HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
- HB_OT_LAYOUT_GLYPH_PROPS_MARK;
- _hb_glyph_info_set_glyph_props (&info[i], klass);
- }
-}
-
static inline void
hb_ot_substitute_default (hb_ot_shape_context_t *c)
{
hb_buffer_t *buffer = c->buffer;
- if (c->plan->shaper->preprocess_text)
- c->plan->shaper->preprocess_text (c->plan, buffer, c->font);
-
hb_ot_shape_initialize_masks (c);
hb_ot_mirror_chars (c);
@@ -576,16 +552,10 @@ hb_ot_substitute_complex (hb_ot_shape_context_t *c)
{
hb_buffer_t *buffer = c->buffer;
- _hb_buffer_allocate_gsubgpos_vars (buffer);
hb_ot_layout_substitute_start (c->font, buffer);
- if (!hb_ot_layout_has_glyph_classes (c->face))
- hb_synthesize_glyph_classes (c);
-
c->plan->substitute (c->font, buffer);
- hb_ot_layout_substitute_finish (c->font, buffer);
-
return;
}
@@ -593,6 +563,9 @@ static inline void
hb_ot_substitute (hb_ot_shape_context_t *c)
{
hb_ot_substitute_default (c);
+
+ _hb_buffer_allocate_gsubgpos_vars (c->buffer);
+
hb_ot_substitute_complex (c);
}
@@ -612,20 +585,6 @@ zero_mark_width (hb_glyph_position_t *pos)
pos->y_advance = 0;
}
-static inline void
-zero_mark_widths_by_unicode (hb_buffer_t *buffer, bool adjust_offsets)
-{
- unsigned int count = buffer->len;
- hb_glyph_info_t *info = buffer->info;
- for (unsigned int i = 0; i < count; i++)
- if (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
- {
- if (adjust_offsets)
- adjust_mark_offsets (&buffer->pos[i]);
- zero_mark_width (&buffer->pos[i]);
- }
-}
-
static inline void
zero_mark_widths_by_gdef (hb_buffer_t *buffer, bool adjust_offsets)
{
@@ -647,26 +606,41 @@ hb_ot_position_default (hb_ot_shape_context_t *c)
unsigned int count = c->buffer->len;
hb_glyph_info_t *info = c->buffer->info;
hb_glyph_position_t *pos = c->buffer->pos;
- for (unsigned int i = 0; i < count; i++)
- {
- c->font->get_glyph_advance_for_direction (info[i].codepoint,
- direction,
- &pos[i].x_advance,
- &pos[i].y_advance);
- c->font->subtract_glyph_origin_for_direction (info[i].codepoint,
- direction,
- &pos[i].x_offset,
- &pos[i].y_offset);
+ if (HB_DIRECTION_IS_HORIZONTAL (direction))
+ {
+ for (unsigned int i = 0; i < count; i++)
+ pos[i].x_advance = c->font->get_glyph_h_advance (info[i].codepoint);
+ /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+ if (c->font->has_glyph_h_origin_func ())
+ for (unsigned int i = 0; i < count; i++)
+ c->font->subtract_glyph_h_origin (info[i].codepoint,
+ &pos[i].x_offset,
+ &pos[i].y_offset);
}
+ else
+ {
+ for (unsigned int i = 0; i < count; i++)
+ {
+ pos[i].y_advance = c->font->get_glyph_v_advance (info[i].codepoint);
+ c->font->subtract_glyph_v_origin (info[i].codepoint,
+ &pos[i].x_offset,
+ &pos[i].y_offset);
+ }
+ }
+ if (c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK)
+ _hb_ot_shape_fallback_spaces (c->plan, c->font, c->buffer);
}
static inline bool
hb_ot_position_complex (hb_ot_shape_context_t *c)
{
+ hb_ot_layout_position_start (c->font, c->buffer);
+
bool ret = false;
unsigned int count = c->buffer->len;
- bool has_positioning = hb_ot_layout_has_positioning (c->face);
+ bool has_positioning = (bool) hb_ot_layout_has_positioning (c->face);
+
/* If the font has no GPOS, AND, no fallback positioning will
* happen, AND, direction is forward, then when zeroing mark
* widths, we shift the mark with it, such that the mark
@@ -685,15 +659,8 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
break;
- /* Not currently used for any shaper:
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY:
- zero_mark_widths_by_unicode (c->buffer, adjust_offsets_when_zeroing);
- break;
- */
-
default:
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE:
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
break;
}
@@ -703,60 +670,56 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
hb_glyph_info_t *info = c->buffer->info;
hb_glyph_position_t *pos = c->buffer->pos;
- /* Change glyph origin to what GPOS expects, apply GPOS, change it back. */
+ /* Change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
- for (unsigned int i = 0; i < count; i++) {
- c->font->add_glyph_origin_for_direction (info[i].codepoint,
- HB_DIRECTION_LTR,
- &pos[i].x_offset,
- &pos[i].y_offset);
- }
+ /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+ if (c->font->has_glyph_h_origin_func ())
+ for (unsigned int i = 0; i < count; i++)
+ c->font->add_glyph_h_origin (info[i].codepoint,
+ &pos[i].x_offset,
+ &pos[i].y_offset);
c->plan->position (c->font, c->buffer);
- for (unsigned int i = 0; i < count; i++) {
- c->font->subtract_glyph_origin_for_direction (info[i].codepoint,
- HB_DIRECTION_LTR,
- &pos[i].x_offset,
- &pos[i].y_offset);
- }
+ /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
+ if (c->font->has_glyph_h_origin_func ())
+ for (unsigned int i = 0; i < count; i++)
+ c->font->subtract_glyph_h_origin (info[i].codepoint,
+ &pos[i].x_offset,
+ &pos[i].y_offset);
ret = true;
}
switch (c->plan->shaper->zero_width_marks)
{
- case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE:
- zero_mark_widths_by_unicode (c->buffer, adjust_offsets_when_zeroing);
- break;
-
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
break;
default:
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
- //case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY:
case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
break;
}
+ /* Finishing off GPOS has to follow a certain order. */
+ hb_ot_layout_position_finish_advances (c->font, c->buffer);
+ hb_ot_zero_width_default_ignorables (c);
+ hb_ot_layout_position_finish_offsets (c->font, c->buffer);
+
return ret;
}
static inline void
hb_ot_position (hb_ot_shape_context_t *c)
{
- hb_ot_layout_position_start (c->font, c->buffer);
+ c->buffer->clear_positions ();
hb_ot_position_default (c);
hb_bool_t fallback = !hb_ot_position_complex (c);
- hb_ot_zero_width_default_ignorables (c);
-
- hb_ot_layout_position_finish (c->font, c->buffer);
-
if (fallback && c->plan->shaper->fallback_position)
_hb_ot_shape_fallback_position (c->plan, c->font, c->buffer);
@@ -778,6 +741,12 @@ static void
hb_ot_shape_internal (hb_ot_shape_context_t *c)
{
c->buffer->deallocate_var_all ();
+ c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
+ if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_EXPANSION_FACTOR)))
+ {
+ c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_EXPANSION_FACTOR,
+ (unsigned) HB_BUFFER_MAX_LEN_MIN);
+ }
/* Save the original direction, we use it later. */
c->target_direction = c->buffer->props.direction;
@@ -792,15 +761,22 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
hb_ensure_native_direction (c->buffer);
+ if (c->plan->shaper->preprocess_text)
+ c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
+
hb_ot_substitute (c);
hb_ot_position (c);
hb_ot_hide_default_ignorables (c);
+ if (c->plan->shaper->postprocess_glyphs)
+ c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
+
_hb_buffer_deallocate_unicode_vars (c->buffer);
c->buffer->props.direction = c->target_direction;
+ c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
c->buffer->deallocate_var_all ();
}
@@ -820,6 +796,8 @@ _hb_ot_shape (hb_shape_plan_t *shape_plan,
/**
+ * hb_ot_shape_plan_collect_lookups:
+ *
* Since: 0.9.7
**/
void
@@ -841,18 +819,20 @@ add_char (hb_font_t *font,
hb_set_t *glyphs)
{
hb_codepoint_t glyph;
- if (font->get_glyph (u, 0, &glyph))
+ if (font->get_nominal_glyph (u, &glyph))
glyphs->add (glyph);
if (mirror)
{
hb_codepoint_t m = unicode->mirroring (u);
- if (m != u && font->get_glyph (m, 0, &glyph))
+ if (m != u && font->get_nominal_glyph (m, &glyph))
glyphs->add (glyph);
}
}
/**
+ * hb_ot_shape_glyphs_closure:
+ *
* Since: 0.9.2
**/
void
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h
index a64920d2bb3..0f38b556ebc 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h
@@ -36,14 +36,14 @@
HB_BEGIN_DECLS
/* TODO port to shape-plan / set. */
-void
+HB_EXTERN void
hb_ot_shape_glyphs_closure (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features,
hb_set_t *glyphs);
-void
+HB_EXTERN void
hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
hb_tag_t table_tag,
hb_set_t *lookup_indexes /* OUT */);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc
index ef9d32e930e..c790888d4c3 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc
@@ -186,14 +186,18 @@ static const LangTag ot_languages[] = {
{"aa", HB_TAG('A','F','R',' ')}, /* Afar */
{"ab", HB_TAG('A','B','K',' ')}, /* Abkhazian */
{"abq", HB_TAG('A','B','A',' ')}, /* Abaza */
+ {"acf", HB_TAG('F','A','N',' ')}, /* French Antillean */
{"ach", HB_TAG('A','C','H',' ')}, /* Acoli */
+ {"acr", HB_TAG('A','C','R',' ')}, /* Achi */
{"ada", HB_TAG('D','N','G',' ')}, /* Dangme */
{"ady", HB_TAG('A','D','Y',' ')}, /* Adyghe */
{"af", HB_TAG('A','F','K',' ')}, /* Afrikaans */
+ {"ahg", HB_TAG('A','G','W',' ')}, /* Agaw */
{"aii", HB_TAG('S','W','A',' ')}, /* Swadaya Aramaic */
{"aio", HB_TAG('A','I','O',' ')}, /* Aiton */
{"aiw", HB_TAG('A','R','I',' ')}, /* Aari */
{"ak", HB_TAG('T','W','I',' ')}, /* Akan [macrolanguage] */
+ {"aka", HB_TAG('A','K','A',' ')}, /* Akan */
{"alt", HB_TAG('A','L','T',' ')}, /* [Southern] Altai */
{"am", HB_TAG('A','M','H',' ')}, /* Amharic */
{"amf", HB_TAG('H','B','N',' ')}, /* Hammer-Banna */
@@ -206,6 +210,7 @@ static const LangTag ot_languages[] = {
{"as", HB_TAG('A','S','M',' ')}, /* Assamese */
{"ast", HB_TAG('A','S','T',' ')}, /* Asturian/Asturleonese/Bable/Leonese */
{"ath", HB_TAG('A','T','H',' ')}, /* Athapaskan [family] */
+ {"atj", HB_TAG('R','C','R',' ')}, /* R-Cree */
{"atv", HB_TAG('A','L','T',' ')}, /* [Northern] Altai */
{"av", HB_TAG('A','V','R',' ')}, /* Avaric */
{"awa", HB_TAG('A','W','A',' ')}, /* Awadhi */
@@ -214,6 +219,7 @@ static const LangTag ot_languages[] = {
{"azb", HB_TAG('A','Z','B',' ')}, /* South Azerbaijani */
{"azj", HB_TAG('A','Z','E',' ')}, /* North Azerbaijani */
{"ba", HB_TAG('B','S','H',' ')}, /* Bashkir */
+ {"bad", HB_TAG('B','A','D','0')}, /* Banda */
{"bai", HB_TAG('B','M','L',' ')}, /* Bamileke [family] */
{"bal", HB_TAG('B','L','I',' ')}, /* Baluchi [macrolangauge] */
{"ban", HB_TAG('B','A','N',' ')}, /* Balinese */
@@ -222,11 +228,13 @@ static const LangTag ot_languages[] = {
{"bci", HB_TAG('B','A','U',' ')}, /* Baoulé */
{"bcl", HB_TAG('B','I','K',' ')}, /* Central Bikol */
{"bcq", HB_TAG('B','C','H',' ')}, /* Bench */
+ {"bdy", HB_TAG('B','D','Y',' ')}, /* Bandjalang */
{"be", HB_TAG('B','E','L',' ')}, /* Belarusian */
{"bem", HB_TAG('B','E','M',' ')}, /* Bemba (Zambia) */
{"ber", HB_TAG('B','E','R',' ')}, /* Berber [family] */
{"bfq", HB_TAG('B','A','D',' ')}, /* Badaga */
{"bft", HB_TAG('B','L','T',' ')}, /* Balti */
+ {"bfu", HB_TAG('L','A','H',' ')}, /* Lahuli */
{"bfy", HB_TAG('B','A','G',' ')}, /* Baghelkhandi */
{"bg", HB_TAG('B','G','R',' ')}, /* Bulgarian */
{"bgc", HB_TAG('B','G','C',' ')}, /* Haryanvi */
@@ -260,11 +268,13 @@ static const LangTag ot_languages[] = {
{"bxr", HB_TAG('R','B','U',' ')}, /* Russian Buriat */
{"byn", HB_TAG('B','I','L',' ')}, /* Bilen */
{"ca", HB_TAG('C','A','T',' ')}, /* Catalan */
+ {"cak", HB_TAG('C','A','K',' ')}, /* Kaqchikel */
{"cbk", HB_TAG('C','B','K',' ')}, /* Chavacano */
{"ce", HB_TAG('C','H','E',' ')}, /* Chechen */
{"ceb", HB_TAG('C','E','B',' ')}, /* Cebuano */
{"cgg", HB_TAG('C','G','G',' ')}, /* Chiga */
{"ch", HB_TAG('C','H','A',' ')}, /* Chamorro */
+ {"chk", HB_TAG('C','H','K','0')}, /* Chuukese */
{"cho", HB_TAG('C','H','O',' ')}, /* Choctaw */
{"chp", HB_TAG('C','H','P',' ')}, /* Chipewyan */
{"chr", HB_TAG('C','H','R',' ')}, /* Cherokee */
@@ -272,9 +282,12 @@ static const LangTag ot_languages[] = {
{"ckb", HB_TAG('K','U','R',' ')}, /* Central Kurdish (Sorani) */
{"ckt", HB_TAG('C','H','K',' ')}, /* Chukchi */
{"cop", HB_TAG('C','O','P',' ')}, /* Coptic */
+ {"cpp", HB_TAG('C','P','P',' ')}, /* Creoles */
{"cr", HB_TAG('C','R','E',' ')}, /* Cree */
+ {"cre", HB_TAG('Y','C','R',' ')}, /* Y-Cree */
{"crh", HB_TAG('C','R','T',' ')}, /* Crimean Tatar */
{"crj", HB_TAG('E','C','R',' ')}, /* [Southern] East Cree */
+ {"crk", HB_TAG('W','C','R',' ')}, /* West-Cree */
{"crl", HB_TAG('E','C','R',' ')}, /* [Northern] East Cree */
{"crm", HB_TAG('M','C','R',' ')}, /* Moose Cree */
{"crx", HB_TAG('C','R','R',' ')}, /* Carrier */
@@ -283,21 +296,27 @@ static const LangTag ot_languages[] = {
{"ctg", HB_TAG('C','T','G',' ')}, /* Chittagonian */
{"cts", HB_TAG('B','I','K',' ')}, /* Northern Catanduanes Bikol */
{"cu", HB_TAG('C','S','L',' ')}, /* Church Slavic */
+ {"cuk", HB_TAG('C','U','K',' ')}, /* San Blas Kuna */
{"cv", HB_TAG('C','H','U',' ')}, /* Chuvash */
{"cwd", HB_TAG('D','C','R',' ')}, /* Woods Cree */
{"cy", HB_TAG('W','E','L',' ')}, /* Welsh */
{"da", HB_TAG('D','A','N',' ')}, /* Danish */
{"dap", HB_TAG('N','I','S',' ')}, /* Nisi (India) */
{"dar", HB_TAG('D','A','R',' ')}, /* Dargwa */
+ {"dax", HB_TAG('D','A','X',' ')}, /* Dayi */
{"de", HB_TAG('D','E','U',' ')}, /* German */
{"dgo", HB_TAG('D','G','O',' ')}, /* Dogri */
{"dhd", HB_TAG('M','A','W',' ')}, /* Dhundari */
+ {"dhg", HB_TAG('D','H','G',' ')}, /* Dhangu */
{"din", HB_TAG('D','N','K',' ')}, /* Dinka [macrolanguage] */
{"diq", HB_TAG('D','I','Q',' ')}, /* Dimli */
{"dje", HB_TAG('D','J','R',' ')}, /* Zarma */
+ {"djr", HB_TAG('D','J','R','0')}, /* Djambarrpuyngu */
{"dng", HB_TAG('D','U','N',' ')}, /* Dungan */
+ {"dnj", HB_TAG('D','N','J',' ')}, /* Dan */
{"doi", HB_TAG('D','G','R',' ')}, /* Dogri [macrolanguage] */
{"dsb", HB_TAG('L','S','B',' ')}, /* Lower Sorbian */
+ {"duj", HB_TAG('D','U','J',' ')}, /* Dhuwal */
{"dv", HB_TAG('D','I','V',' ')}, /* Dhivehi/Divehi/Maldivian */
{"dyu", HB_TAG('J','U','L',' ')}, /* Jula */
{"dz", HB_TAG('D','Z','N',' ')}, /* Dzongkha */
@@ -307,23 +326,30 @@ static const LangTag ot_languages[] = {
{"el", HB_TAG('E','L','L',' ')}, /* Modern Greek (1453-) */
{"emk", HB_TAG('M','N','K',' ')}, /* Eastern Maninkakan */
{"en", HB_TAG('E','N','G',' ')}, /* English */
+ {"enf", HB_TAG('F','N','E',' ')}, /* Forest Nenets */
+ {"enh", HB_TAG('T','N','E',' ')}, /* Tundra Nenets */
{"eo", HB_TAG('N','T','O',' ')}, /* Esperanto */
{"eot", HB_TAG('B','T','I',' ')}, /* Beti (Côte d'Ivoire) */
{"es", HB_TAG('E','S','P',' ')}, /* Spanish */
+ {"esu", HB_TAG('E','S','U',' ')}, /* Central Yupik */
{"et", HB_TAG('E','T','I',' ')}, /* Estonian [macrolanguage] */
{"eu", HB_TAG('E','U','Q',' ')}, /* Basque */
{"eve", HB_TAG('E','V','N',' ')}, /* Even */
{"evn", HB_TAG('E','V','K',' ')}, /* Evenki */
{"fa", HB_TAG('F','A','R',' ')}, /* Persian [macrolanguage] */
+ {"fan", HB_TAG('F','A','N','0')}, /* Fang */
+ {"fat", HB_TAG('F','A','T',' ')}, /* Fanti */
{"ff", HB_TAG('F','U','L',' ')}, /* Fulah [macrolanguage] */
{"fi", HB_TAG('F','I','N',' ')}, /* Finnish */
{"fil", HB_TAG('P','I','L',' ')}, /* Filipino */
{"fj", HB_TAG('F','J','I',' ')}, /* Fijian */
+ {"flm", HB_TAG('H','A','L',' ')}, /* Halam */
{"fo", HB_TAG('F','O','S',' ')}, /* Faroese */
{"fon", HB_TAG('F','O','N',' ')}, /* Fon */
{"fr", HB_TAG('F','R','A',' ')}, /* French */
{"frc", HB_TAG('F','R','C',' ')}, /* Cajun French */
{"frp", HB_TAG('F','R','P',' ')}, /* Arpitan/Francoprovençal */
+ {"fuf", HB_TAG('F','T','A',' ')}, /* Futa */
{"fur", HB_TAG('F','R','L',' ')}, /* Friulian */
{"fuv", HB_TAG('F','U','V',' ')}, /* Nigerian Fulfulde */
{"fy", HB_TAG('F','R','I',' ')}, /* Western Frisian */
@@ -334,17 +360,24 @@ static const LangTag ot_languages[] = {
{"gd", HB_TAG('G','A','E',' ')}, /* Scottish Gaelic */
{"gez", HB_TAG('G','E','Z',' ')}, /* Ge'ez */
{"ggo", HB_TAG('G','O','N',' ')}, /* Southern Gondi */
+ {"gih", HB_TAG('G','I','H',' ')}, /* Githabul */
+ {"gil", HB_TAG('G','I','L','0')}, /* Kiribati (Gilbertese) */
+ {"gkp", HB_TAG('G','K','P',' ')}, /* Kpelle (Guinea) */
{"gl", HB_TAG('G','A','L',' ')}, /* Galician */
{"gld", HB_TAG('N','A','N',' ')}, /* Nanai */
+ {"gle", HB_TAG('I','R','T',' ')}, /* Irish Traditional */
{"glk", HB_TAG('G','L','K',' ')}, /* Gilaki */
{"gn", HB_TAG('G','U','A',' ')}, /* Guarani [macrolanguage] */
+ {"gnn", HB_TAG('G','N','N',' ')}, /* Gumatj */
{"gno", HB_TAG('G','O','N',' ')}, /* Northern Gondi */
{"gog", HB_TAG('G','O','G',' ')}, /* Gogo */
{"gon", HB_TAG('G','O','N',' ')}, /* Gondi [macrolanguage] */
{"grt", HB_TAG('G','R','O',' ')}, /* Garo */
{"gru", HB_TAG('S','O','G',' ')}, /* Sodo Gurage */
+ {"gsw", HB_TAG('A','L','S',' ')}, /* Alsatian */
{"gu", HB_TAG('G','U','J',' ')}, /* Gujarati */
{"guc", HB_TAG('G','U','C',' ')}, /* Wayuu */
+ {"guf", HB_TAG('G','U','F',' ')}, /* Gupapuyngu */
{"guk", HB_TAG('G','M','Z',' ')}, /* Gumuz */
/*{"guk", HB_TAG('G','U','K',' ')},*/ /* Gumuz (in SIL fonts) */
{"guz", HB_TAG('G','U','Z',' ')}, /* Ekegusii/Gusii */
@@ -355,9 +388,9 @@ static const LangTag ot_languages[] = {
{"hay", HB_TAG('H','A','Y',' ')}, /* Haya */
{"haz", HB_TAG('H','A','Z',' ')}, /* Hazaragi */
{"he", HB_TAG('I','W','R',' ')}, /* Hebrew */
- {"hz", HB_TAG('H','E','R',' ')}, /* Herero */
{"hi", HB_TAG('H','I','N',' ')}, /* Hindi */
{"hil", HB_TAG('H','I','L',' ')}, /* Hiligaynon */
+ {"hmn", HB_TAG('H','M','N',' ')}, /* Hmong */
{"hnd", HB_TAG('H','N','D',' ')}, /* [Southern] Hindko */
{"hne", HB_TAG('C','H','H',' ')}, /* Chattisgarhi */
{"hno", HB_TAG('H','N','D',' ')}, /* [Northern] Hindko */
@@ -371,11 +404,13 @@ static const LangTag ot_languages[] = {
{"hy", HB_TAG('H','Y','E',' ')}, /* Armenian */
{"hz", HB_TAG('H','E','R',' ')}, /* Herero */
{"ia", HB_TAG('I','N','A',' ')}, /* Interlingua (International Auxiliary Language Association) */
+ {"iba", HB_TAG('I','B','A',' ')}, /* Iban */
{"ibb", HB_TAG('I','B','B',' ')}, /* Ibibio */
{"id", HB_TAG('I','N','D',' ')}, /* Indonesian */
{"ie", HB_TAG('I','L','E',' ')}, /* Interlingue/Occidental */
{"ig", HB_TAG('I','B','O',' ')}, /* Igbo */
{"igb", HB_TAG('E','B','I',' ')}, /* Ebira */
+ {"ii", HB_TAG('Y','I','M',' ')}, /* Yi Modern */
{"ijc", HB_TAG('I','J','O',' ')}, /* Izon */
{"ijo", HB_TAG('I','J','O',' ')}, /* Ijo [family] */
{"ik", HB_TAG('I','P','K',' ')}, /* Inupiaq [macrolanguage] */
@@ -391,15 +426,20 @@ static const LangTag ot_languages[] = {
{"jv", HB_TAG('J','A','V',' ')}, /* Javanese */
{"ka", HB_TAG('K','A','T',' ')}, /* Georgian */
{"kaa", HB_TAG('K','R','K',' ')}, /* Karakalpak */
- {"kab", HB_TAG('K','A','B',' ')}, /* Kabyle */
+ {"kab", HB_TAG('K','A','B','0')}, /* Kabyle */
{"kam", HB_TAG('K','M','B',' ')}, /* Kamba (Kenya) */
{"kar", HB_TAG('K','R','N',' ')}, /* Karen [family] */
+ {"kat", HB_TAG('K','G','E',' ')}, /* Khutsuri Georgian */
{"kbd", HB_TAG('K','A','B',' ')}, /* Kabardian */
{"kde", HB_TAG('K','D','E',' ')}, /* Makonde */
{"kdr", HB_TAG('K','R','M',' ')}, /* Karaim */
{"kdt", HB_TAG('K','U','Y',' ')}, /* Kuy */
+ {"kea", HB_TAG('K','E','A',' ')}, /* Kabuverdianu (Crioulo) */
+ {"kek", HB_TAG('K','E','K',' ')}, /* Kekchi */
{"kex", HB_TAG('K','K','N',' ')}, /* Kokni */
+ {"kfa", HB_TAG('K','O','D',' ')}, /* Kodagu */
{"kfr", HB_TAG('K','A','C',' ')}, /* Kachchi */
+ {"kfx", HB_TAG('K','U','L',' ')}, /* Kulvi */
{"kfy", HB_TAG('K','M','N',' ')}, /* Kumaoni */
{"kg", HB_TAG('K','O','N',' ')}, /* Kongo [macrolanguage] */
{"kha", HB_TAG('K','S','I',' ')}, /* Khasi */
@@ -408,7 +448,9 @@ static const LangTag ot_languages[] = {
/*{"kht", HB_TAG('K','H','T',' ')},*/ /* Khamti (OpenType spec and SIL fonts) */
{"khw", HB_TAG('K','H','W',' ')}, /* Khowar */
{"ki", HB_TAG('K','I','K',' ')}, /* Gikuyu/Kikuyu */
+ {"kiu", HB_TAG('K','I','U',' ')}, /* Kirmanjki */
{"kj", HB_TAG('K','U','A',' ')}, /* Kuanyama/Kwanyama */
+ {"kjd", HB_TAG('K','J','D',' ')}, /* Southern Kiwai */
{"kjh", HB_TAG('K','H','A',' ')}, /* Khakass */
{"kjp", HB_TAG('K','J','P',' ')}, /* Pwo Eastern Karen */
{"kk", HB_TAG('K','A','Z',' ')}, /* Kazakh */
@@ -422,6 +464,8 @@ static const LangTag ot_languages[] = {
{"ko", HB_TAG('K','O','R',' ')}, /* Korean */
{"koi", HB_TAG('K','O','P',' ')}, /* Komi-Permyak */
{"kok", HB_TAG('K','O','K',' ')}, /* Konkani [macrolanguage] */
+ {"kon", HB_TAG('K','O','N','0')}, /* Kongo */
+ {"kos", HB_TAG('K','O','S',' ')}, /* Kosraean */
{"kpe", HB_TAG('K','P','L',' ')}, /* Kpelle [macrolanguage] */
{"kpv", HB_TAG('K','O','Z',' ')}, /* Komi-Zyrian */
{"kpy", HB_TAG('K','Y','K',' ')}, /* Koryak */
@@ -431,9 +475,11 @@ static const LangTag ot_languages[] = {
{"krl", HB_TAG('K','R','L',' ')}, /* Karelian */
{"kru", HB_TAG('K','U','U',' ')}, /* Kurukh */
{"ks", HB_TAG('K','S','H',' ')}, /* Kashmiri */
- {"ksh", HB_TAG('K','S','H',' ')}, /* Kölsch */
+ {"ksh", HB_TAG('K','S','H','0')}, /* Ripuarian, Kölsch */
/*{"ksw", HB_TAG('K','R','N',' ')},*/ /* S'gaw Karen (Microsoft fonts?) */
{"ksw", HB_TAG('K','S','W',' ')}, /* S'gaw Karen (OpenType spec and SIL fonts) */
+ {"ktb", HB_TAG('K','E','B',' ')}, /* Kebena */
+ {"ktu", HB_TAG('K','O','N',' ')}, /* Kikongo */
{"ku", HB_TAG('K','U','R',' ')}, /* Kurdish [macrolanguage] */
{"kum", HB_TAG('K','U','M',' ')}, /* Kumyk */
{"kv", HB_TAG('K','O','M',' ')}, /* Komi [macrolanguage] */
@@ -461,6 +507,7 @@ static const LangTag ot_languages[] = {
{"lmo", HB_TAG('L','M','O',' ')}, /* Lombard */
{"ln", HB_TAG('L','I','N',' ')}, /* Lingala */
{"lo", HB_TAG('L','A','O',' ')}, /* Lao */
+ {"lom", HB_TAG('L','O','M',' ')}, /* Loma */
{"lrc", HB_TAG('L','R','C',' ')}, /* Northern Luri */
{"lt", HB_TAG('L','T','H',' ')}, /* Lithuanian */
{"lu", HB_TAG('L','U','B',' ')}, /* Luba-Katanga */
@@ -475,6 +522,8 @@ static const LangTag ot_languages[] = {
{"mag", HB_TAG('M','A','G',' ')}, /* Magahi */
{"mai", HB_TAG('M','T','H',' ')}, /* Maithili */
{"mak", HB_TAG('M','K','R',' ')}, /* Makasar */
+ {"mal", HB_TAG('M','A','L',' ')}, /* Malayalam */
+ {"mam", HB_TAG('M','A','M',' ')}, /* Mam */
{"man", HB_TAG('M','N','K',' ')}, /* Manding/Mandingo [macrolanguage] */
{"mdc", HB_TAG('M','L','E',' ')}, /* Male (Papua New Guinea) */
{"mdf", HB_TAG('M','O','K',' ')}, /* Moksha */
@@ -517,6 +566,7 @@ static const LangTag ot_languages[] = {
{"mww", HB_TAG('M','W','W',' ')}, /* Hmong Daw */
{"my", HB_TAG('B','R','M',' ')}, /* Burmese */
{"mym", HB_TAG('M','E','N',' ')}, /* Me'en */
+ {"myn", HB_TAG('M','Y','N',' ')}, /* Mayan */
{"myq", HB_TAG('M','N','K',' ')}, /* Forest Maninka (retired code) */
{"myv", HB_TAG('E','R','Z',' ')}, /* Erzya */
{"mzn", HB_TAG('M','Z','N',' ')}, /* Mazanderani */
@@ -534,6 +584,7 @@ static const LangTag ot_languages[] = {
{"ng", HB_TAG('N','D','G',' ')}, /* Ndonga */
{"nga", HB_TAG('N','G','A',' ')}, /* Ngabaka */
{"ngl", HB_TAG('L','M','W',' ')}, /* Lomwe */
+ {"ngo", HB_TAG('S','X','T',' ')}, /* Sutu */
{"niu", HB_TAG('N','I','U',' ')}, /* Niuean */
{"niv", HB_TAG('G','I','L',' ')}, /* Gilyak */
{"nl", HB_TAG('N','L','D',' ')}, /* Dutch */
@@ -554,13 +605,15 @@ static const LangTag ot_languages[] = {
{"oc", HB_TAG('O','C','I',' ')}, /* Occitan (post 1500) */
{"oj", HB_TAG('O','J','B',' ')}, /* Ojibwa [macrolanguage] */
{"ojs", HB_TAG('O','C','R',' ')}, /* Oji-Cree */
+ {"okm", HB_TAG('K','O','H',' ')}, /* Korean Old Hangul */
{"om", HB_TAG('O','R','O',' ')}, /* Oromo [macrolanguage] */
{"or", HB_TAG('O','R','I',' ')}, /* Oriya */
{"os", HB_TAG('O','S','S',' ')}, /* Ossetian */
{"pa", HB_TAG('P','A','N',' ')}, /* Panjabi */
{"pag", HB_TAG('P','A','G',' ')}, /* Pangasinan */
{"pam", HB_TAG('P','A','M',' ')}, /* Kapampangan/Pampanga */
- {"pap", HB_TAG('P','A','P',' ')}, /* Papiamento */
+ {"pap", HB_TAG('P','A','P','0')}, /* Papiamento */
+ {"pau", HB_TAG('P','A','U',' ')}, /* Palauan */
{"pcc", HB_TAG('P','C','C',' ')}, /* Bouyei */
{"pcd", HB_TAG('P','C','D',' ')}, /* Picard */
{"pce", HB_TAG('P','L','G',' ')}, /* [Ruching] Palaung */
@@ -574,24 +627,34 @@ static const LangTag ot_languages[] = {
{"plp", HB_TAG('P','A','P',' ')}, /* Palpa */
{"pms", HB_TAG('P','M','S',' ')}, /* Piemontese */
{"pnb", HB_TAG('P','N','B',' ')}, /* Western Panjabi */
+ {"poh", HB_TAG('P','O','H',' ')}, /* Pocomchi */
+ {"pon", HB_TAG('P','O','N',' ')}, /* Pohnpeian */
{"prs", HB_TAG('D','R','I',' ')}, /* Afghan Persian/Dari */
{"ps", HB_TAG('P','A','S',' ')}, /* Pashto/Pushto [macrolanguage] */
{"pt", HB_TAG('P','T','G',' ')}, /* Portuguese */
{"pwo", HB_TAG('P','W','O',' ')}, /* Pwo Western Karen */
{"qu", HB_TAG('Q','U','Z',' ')}, /* Quechua [macrolanguage] */
{"quc", HB_TAG('Q','U','C',' ')}, /* K'iche'/Quiché */
+ {"quh", HB_TAG('Q','U','H',' ')}, /* Quechua (Bolivia) */
{"quz", HB_TAG('Q','U','Z',' ')}, /* Cusco Quechua */
+ {"qvi", HB_TAG('Q','V','I',' ')}, /* Quechua (Ecuador) */
+ {"qwh", HB_TAG('Q','W','H',' ')}, /* Quechua (Peru) */
{"raj", HB_TAG('R','A','J',' ')}, /* Rajasthani [macrolanguage] */
+ {"rar", HB_TAG('R','A','R',' ')}, /* Rarotongan */
{"rbb", HB_TAG('P','L','G',' ')}, /* Rumai Palaung */
{"rej", HB_TAG('R','E','J',' ')}, /* Rejang */
{"ria", HB_TAG('R','I','A',' ')}, /* Riang (India) */
+ {"rif", HB_TAG('R','I','F',' ')}, /* Tarifit */
{"ril", HB_TAG('R','I','A',' ')}, /* Riang (Myanmar) */
+ {"rit", HB_TAG('R','I','T',' ')}, /* Ritarungo */
{"rki", HB_TAG('A','R','K',' ')}, /* Rakhine */
+ {"rkw", HB_TAG('R','K','W',' ')}, /* Arakwal */
{"rm", HB_TAG('R','M','S',' ')}, /* Romansh */
{"rmy", HB_TAG('R','M','Y',' ')}, /* Vlax Romani */
{"rn", HB_TAG('R','U','N',' ')}, /* Rundi */
{"ro", HB_TAG('R','O','M',' ')}, /* Romanian */
{"rom", HB_TAG('R','O','Y',' ')}, /* Romany [macrolanguage] */
+ {"rtm", HB_TAG('R','T','M',' ')}, /* Rotuman */
{"ru", HB_TAG('R','U','S',' ')}, /* Russian */
{"rue", HB_TAG('R','S','Y',' ')}, /* Rusyn */
{"rup", HB_TAG('R','U','P',' ')}, /* Aromanian/Arumanian/Macedo-Romanian */
@@ -599,10 +662,11 @@ static const LangTag ot_languages[] = {
{"rwr", HB_TAG('M','A','W',' ')}, /* Marwari (India) */
{"sa", HB_TAG('S','A','N',' ')}, /* Sanskrit */
{"sah", HB_TAG('Y','A','K',' ')}, /* Yakut */
+ {"sam", HB_TAG('P','A','A',' ')}, /* Palestinian Aramaic */
{"sas", HB_TAG('S','A','S',' ')}, /* Sasak */
{"sat", HB_TAG('S','A','T',' ')}, /* Santali */
- {"sck", HB_TAG('S','A','D',' ')}, /* Sadri */
{"sc", HB_TAG('S','R','D',' ')}, /* Sardinian [macrolanguage] */
+ {"sck", HB_TAG('S','A','D',' ')}, /* Sadri */
{"scn", HB_TAG('S','C','N',' ')}, /* Sicilian */
{"sco", HB_TAG('S','C','O',' ')}, /* Scots */
{"scs", HB_TAG('S','L','A',' ')}, /* [North] Slavey */
@@ -615,6 +679,7 @@ static const LangTag ot_languages[] = {
{"sgs", HB_TAG('S','G','S',' ')}, /* Samogitian */
{"sgw", HB_TAG('C','H','G',' ')}, /* Sebat Bet Gurage */
/*{"sgw", HB_TAG('S','G','W',' ')},*/ /* Sebat Bet Gurage (in SIL fonts) */
+ {"shi", HB_TAG('S','H','I',' ')}, /* Tachelhit */
{"shn", HB_TAG('S','H','N',' ')}, /* Shan */
{"si", HB_TAG('S','N','H',' ')}, /* Sinhala */
{"sid", HB_TAG('S','I','D',' ')}, /* Sidamo */
@@ -627,7 +692,7 @@ static const LangTag ot_languages[] = {
{"smj", HB_TAG('L','S','M',' ')}, /* Lule Sami */
{"smn", HB_TAG('I','S','M',' ')}, /* Inari Sami */
{"sms", HB_TAG('S','K','S',' ')}, /* Skolt Sami */
- {"sn", HB_TAG('S','N','A',' ')}, /* Shona */
+ {"sn", HB_TAG('S','N','A','0')}, /* Shona */
{"snk", HB_TAG('S','N','K',' ')}, /* Soninke */
{"so", HB_TAG('S','M','L',' ')}, /* Somali */
{"sop", HB_TAG('S','O','P',' ')}, /* Songe */
@@ -665,20 +730,24 @@ static const LangTag ot_languages[] = {
{"tiv", HB_TAG('T','I','V',' ')}, /* Tiv */
{"tk", HB_TAG('T','K','M',' ')}, /* Turkmen */
{"tl", HB_TAG('T','G','L',' ')}, /* Tagalog */
- {"tmh", HB_TAG('t','m','h',' ')}, /* Tamashek [macrolanguage] */
+ {"tmh", HB_TAG('T','M','H',' ')}, /* Tamashek */
{"tn", HB_TAG('T','N','A',' ')}, /* Tswana */
{"to", HB_TAG('T','G','N',' ')}, /* Tonga (Tonga Islands) */
+ {"tod", HB_TAG('T','O','D','0')}, /* Toma */
+ {"toi", HB_TAG('T','N','G',' ')}, /* Tonga */
{"tpi", HB_TAG('T','P','I',' ')}, /* Tok Pisin */
{"tr", HB_TAG('T','R','K',' ')}, /* Turkish */
{"tru", HB_TAG('T','U','A',' ')}, /* Turoyo Aramaic */
{"ts", HB_TAG('T','S','G',' ')}, /* Tsonga */
{"tt", HB_TAG('T','A','T',' ')}, /* Tatar */
{"tum", HB_TAG('T','U','M',' ')}, /* Tumbuka */
+ {"tvl", HB_TAG('T','V','L',' ')}, /* Tuvalu */
{"tw", HB_TAG('T','W','I',' ')}, /* Twi */
{"ty", HB_TAG('T','H','T',' ')}, /* Tahitian */
{"tyv", HB_TAG('T','U','V',' ')}, /* Tuvin */
{"tyz", HB_TAG('T','Y','Z',' ')}, /* TÃ y */
{"tzm", HB_TAG('T','Z','M',' ')}, /* Central Atlas Tamazight */
+ {"tzo", HB_TAG('T','Z','O',' ')}, /* Tzotzil */
{"udm", HB_TAG('U','D','M',' ')}, /* Udmurt */
{"ug", HB_TAG('U','Y','G',' ')}, /* Uighur */
{"uk", HB_TAG('U','K','R',' ')}, /* Ukrainian */
@@ -690,8 +759,8 @@ static const LangTag ot_languages[] = {
{"uzs", HB_TAG('U','Z','B',' ')}, /* Southern Uzbek */
{"ve", HB_TAG('V','E','N',' ')}, /* Venda */
{"vec", HB_TAG('V','E','C',' ')}, /* Venetian */
- {"vls", HB_TAG('F','L','E',' ')}, /* Vlaams */
{"vi", HB_TAG('V','I','T',' ')}, /* Vietnamese */
+ {"vls", HB_TAG('F','L','E',' ')}, /* Vlaams */
{"vmw", HB_TAG('M','A','K',' ')}, /* Makhuwa */
{"vo", HB_TAG('V','O','L',' ')}, /* Volapük */
{"vro", HB_TAG('V','R','O',' ')}, /* Võro */
@@ -700,72 +769,60 @@ static const LangTag ot_languages[] = {
{"wbm", HB_TAG('W','A',' ',' ')}, /* Wa */
{"wbr", HB_TAG('W','A','G',' ')}, /* Wagdi */
{"wle", HB_TAG('S','I','G',' ')}, /* Wolane */
+ {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */
{"wry", HB_TAG('M','A','W',' ')}, /* Merwari */
{"wtm", HB_TAG('W','T','M',' ')}, /* Mewati */
- {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */
{"xal", HB_TAG('K','L','M',' ')}, /* Kalmyk */
+ {"xan", HB_TAG('S','E','K',' ')}, /* Sekota */
{"xh", HB_TAG('X','H','S',' ')}, /* Xhosa */
+ {"xjb", HB_TAG('X','J','B',' ')}, /* Minjangbal */
{"xog", HB_TAG('X','O','G',' ')}, /* Soga */
{"xom", HB_TAG('K','M','O',' ')}, /* Komo (Sudan) */
+ {"xpe", HB_TAG('X','P','E',' ')}, /* Kpelle (Liberia) */
{"xsl", HB_TAG('S','S','L',' ')}, /* South Slavey */
{"xst", HB_TAG('S','I','G',' ')}, /* Silt'e (retired code) */
{"xwo", HB_TAG('T','O','D',' ')}, /* Written Oirat (Todo) */
{"yao", HB_TAG('Y','A','O',' ')}, /* Yao */
+ {"yap", HB_TAG('Y','A','P',' ')}, /* Yapese */
{"yi", HB_TAG('J','I','I',' ')}, /* Yiddish [macrolanguage] */
{"yo", HB_TAG('Y','B','A',' ')}, /* Yoruba */
{"yso", HB_TAG('N','I','S',' ')}, /* Nisi (China) */
{"za", HB_TAG('Z','H','A',' ')}, /* Chuang/Zhuang [macrolanguage] */
{"zea", HB_TAG('Z','E','A',' ')}, /* Zeeuws */
+ {"zgh", HB_TAG('Z','G','H',' ')}, /* Standard Morrocan Tamazigh */
{"zne", HB_TAG('Z','N','D',' ')}, /* Zande */
{"zu", HB_TAG('Z','U','L',' ')}, /* Zulu */
- {"zum", HB_TAG('L','R','C',' ')} /* Kumzari */
+ {"zum", HB_TAG('L','R','C',' ')}, /* Kumzari */
+ {"zza", HB_TAG('Z','Z','A',' ')}, /* Zazaki */
/* The corresponding languages IDs for the following IDs are unclear,
* overlap, or are architecturally weird. Needs more research. */
-/*{"ahg/awn/xan?", HB_TAG('A','G','W',' ')},*/ /* Agaw */
-/*{"gsw?/gsw-FR?", HB_TAG('A','L','S',' ')},*/ /* Alsatian */
+/*{"chp", HB_TAG('S','A','Y',' ')},*/ /* Sayisi */
+/*{"cwd", HB_TAG('T','C','R',' ')},*/ /* TH-Cree */
+/*{"emk", HB_TAG('E','M','K',' ')},*/ /* Eastern Maninkakan */
/*{"krc", HB_TAG('B','A','L',' ')},*/ /* Balkar */
/*{"??", HB_TAG('B','C','R',' ')},*/ /* Bible Cree */
/*{"zh?", HB_TAG('C','H','N',' ')},*/ /* Chinese (seen in Microsoft fonts) */
-/*{"acf/gcf?", HB_TAG('F','A','N',' ')},*/ /* French Antillean */
-/*{"enf?/yrk?", HB_TAG('F','N','E',' ')},*/ /* Forest Nenets */
-/*{"fuf?", HB_TAG('F','T','A',' ')},*/ /* Futa */
/*{"ar-Syrc?", HB_TAG('G','A','R',' ')},*/ /* Garshuni */
-/*{"cfm/rnl?", HB_TAG('H','A','L',' ')},*/ /* Halam */
-/*{"ga-Latg?/Latg?", HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */
+/*{"hy?", HB_TAG('H','Y','E','0')},*/ /* Armenian East (ISO 639-3 hye according to Microsoft, but that’s equivalent to ISO 639-1 hy) */
+/*{"ga-Latg?/" HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */
/*{"krc", HB_TAG('K','A','R',' ')},*/ /* Karachay */
-/*{"alw?/ktb?", HB_TAG('K','E','B',' ')},*/ /* Kebena */
-/*{"Geok", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */
+/*{"ka-Geok?", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */
/*{"kca", HB_TAG('K','H','K',' ')},*/ /* Khanty-Kazim */
/*{"kca", HB_TAG('K','H','S',' ')},*/ /* Khanty-Shurishkar */
/*{"kca", HB_TAG('K','H','V',' ')},*/ /* Khanty-Vakhi */
-/*{"guz?/kqs?/kss?", HB_TAG('K','I','S',' ')},*/ /* Kisii */
-/*{"kfa/kfi?/kpb?/xua?/xuj?", HB_TAG('K','O','D',' ')},*/ /* Kodagu */
-/*{"okm?/oko?", HB_TAG('K','O','H',' ')},*/ /* Korean Old Hangul */
-/*{"kon?/ktu?/...", HB_TAG('K','O','N',' ')},*/ /* Kikongo */
-/*{"kfx?", HB_TAG('K','U','L',' ')},*/ /* Kulvi */
-/*{"??", HB_TAG('L','A','H',' ')},*/ /* Lahuli */
-/*{"??", HB_TAG('L','C','R',' ')},*/ /* L-Cree */
+/*{"kqs, kss", HB_TAG('K','I','S',' ')},*/ /* Kisii */
+/*{"lua", HB_TAG('L','U','A',' ')},*/ /* Luba-Lulua */
+/*{"mlq", HB_TAG('M','L','N',' ')},*/ /* Malinke */
+/*{"nso", HB_TAG('N','S','O',' ')},*/ /* Sotho, Northern */
/*{"??", HB_TAG('M','A','L',' ')},*/ /* Malayalam Traditional */
-/*{"mnk?/mlq?/...", HB_TAG('M','L','N',' ')},*/ /* Malinke */
-/*{"??", HB_TAG('N','C','R',' ')},*/ /* N-Cree */
-/*{"??", HB_TAG('N','H','C',' ')},*/ /* Norway House Cree */
-/*{"jpa?/sam?", HB_TAG('P','A','A',' ')},*/ /* Palestinian Aramaic */
-/*{"polyton", HB_TAG('P','G','R',' ')},*/ /* Polytonic Greek */
-/*{"??", HB_TAG('Q','I','N',' ')},*/ /* Asho Chin */
-/*{"??", HB_TAG('R','C','R',' ')},*/ /* R-Cree */
-/*{"chp?", HB_TAG('S','A','Y',' ')},*/ /* Sayisi */
-/*{"xan?", HB_TAG('S','E','K',' ')},*/ /* Sekota */
-/*{"ngo?", HB_TAG('S','X','T',' ')},*/ /* Sutu */
-/*{"??", HB_TAG('T','C','R',' ')},*/ /* TH-Cree */
-/*{"tnz?/tog?/toi?", HB_TAG('T','N','G',' ')},*/ /* Tonga */
-/*{"enh?/yrk?", HB_TAG('T','N','E',' ')},*/ /* Tundra Nenets */
-/*{"??", HB_TAG('W','C','R',' ')},*/ /* West-Cree */
-/*{"cre?", HB_TAG('Y','C','R',' ')},*/ /* Y-Cree */
+/*{"csw", HB_TAG('N','C','R',' ')},*/ /* N-Cree */
+/*{"csw", HB_TAG('N','H','C',' ')},*/ /* Norway House Cree */
+/*{"el-polyton", HB_TAG('P','G','R',' ')},*/ /* Polytonic Greek */
+/*{"bgr, cnh, cnw, czt, sez, tcp, csy, ctd, flm, pck, tcz, zom, cmr, dao, hlt, cka, cnk, mrh, mwg, cbl, cnb, csh", HB_TAG('Q','I','N',' ')},*/ /* Chin */
/*{"??", HB_TAG('Y','I','C',' ')},*/ /* Yi Classic */
-/*{"ii?/Yiii?", HB_TAG('Y','I','M',' ')},*/ /* Yi Modern */
-/*{"??", HB_TAG('Z','H','P',' ')},*/ /* Chinese Phonetic */
+/*{"zh-Latn-pinyin", HB_TAG('Z','H','P',' ')},*/ /* Chinese Phonetic */
};
typedef struct {
@@ -928,4 +985,27 @@ hb_ot_tag_to_language (hb_tag_t tag)
}
}
+#ifdef MAIN
+static inline void
+test_langs_sorted (void)
+{
+ for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++)
+ {
+ int c = lang_compare_first_component (ot_languages[i-1].language, ot_languages[i].language);
+ if (c >= 0)
+ {
+ fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n",
+ i, ot_languages[i-1].language, c, ot_languages[i].language);
+ abort();
+ }
+ }
+}
+int
+main (void)
+{
+ test_langs_sorted ();
+ return 0;
+}
+
+#endif
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h
index f0279530b8e..10cf3972df6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h
@@ -39,18 +39,18 @@ HB_BEGIN_DECLS
#define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T')
#define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't')
-void
+HB_EXTERN void
hb_ot_tags_from_script (hb_script_t script,
hb_tag_t *script_tag_1,
hb_tag_t *script_tag_2);
-hb_script_t
+HB_EXTERN hb_script_t
hb_ot_tag_to_script (hb_tag_t tag);
-hb_tag_t
+HB_EXTERN hb_tag_t
hb_ot_tag_from_language (hb_language_t language);
-hb_language_t
+HB_EXTERN hb_language_t
hb_ot_tag_to_language (hb_tag_t tag);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh
index 4d10d51ccf4..1f270ee698c 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh
@@ -83,7 +83,7 @@ extern "C" void hb_free_impl(void *ptr);
#define unlikely(expr) (expr)
#endif
-#ifndef __GNUC__
+#if !defined(__GNUC__) && !defined(__clang__)
#undef __attribute__
#define __attribute__(x)
#endif
@@ -119,6 +119,36 @@ extern "C" void hb_free_impl(void *ptr);
#define HB_FUNC __func__
#endif
+/*
+ * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
+ * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
+ * cases that fall through without a break or return statement. HB_FALLTHROUGH
+ * is only needed on cases that have code:
+ *
+ * switch (foo) {
+ * case 1: // These cases have no code. No fallthrough annotations are needed.
+ * case 2:
+ * case 3:
+ * foo = 4; // This case has code, so a fallthrough annotation is needed:
+ * HB_FALLTHROUGH;
+ * default:
+ * return foo;
+ * }
+ */
+#if defined(__clang__) && __cplusplus >= 201103L
+ /* clang's fallthrough annotations are only available starting in C++11. */
+# define HB_FALLTHROUGH [[clang::fallthrough]]
+#elif defined(_MSC_VER)
+ /*
+ * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
+ * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
+ */
+# include
+# define HB_FALLTHROUGH __fallthrough
+#else
+# define HB_FALLTHROUGH /* FALLTHROUGH */
+#endif
+
#if defined(_WIN32) || defined(__CYGWIN__)
/* We need Windows Vista for both Uniscribe backend and for
* MemoryBarrier. We don't support compiling on Windows XP,
@@ -139,6 +169,7 @@ extern "C" void hb_free_impl(void *ptr);
# if defined(_WIN32_WCE)
/* Some things not defined on Windows CE. */
# define strdup _strdup
+# define vsnprintf _vsnprintf
# define getenv(Name) NULL
# if _WIN32_WCE < 0x800
# define setlocale(Category, Locale) "C"
@@ -149,6 +180,9 @@ static int errno = 0; /* Use something better? */
# endif
# if defined(_MSC_VER) && _MSC_VER < 1900
# define snprintf _snprintf
+# elif defined(_MSC_VER) && _MSC_VER >= 1900
+# /* Covers VC++ Error for strdup being a deprecated POSIX name and to instead use _strdup instead */
+# define strdup _strdup
# endif
#endif
@@ -210,9 +244,9 @@ static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
#define _ASSERT_STATIC0(_line, _cond) _ASSERT_STATIC1 (_line, (_cond))
#define ASSERT_STATIC(_cond) _ASSERT_STATIC0 (__LINE__, (_cond))
-/* Note: C++ allows sizeof() of variable-lengh arrays. So, if _cond is not
- * constant, it still compiles (ouch!), but at least we'll get a -Wvla warning. */
-#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * sizeof (char[(_cond) ? 1 : -1]))
+template class hb_assert_constant_t {};
+
+#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
#define _PASTE1(a,b) a##b
#define PASTE(a,b) _PASTE1(a,b)
@@ -578,6 +612,15 @@ static inline unsigned char TOLOWER (unsigned char c)
/* Debug */
+/* HB_NDEBUG disables some sanity checks that are very safe to disable and
+ * should be disabled in production systems. If NDEBUG is defined, enable
+ * HB_NDEBUG; but if it's desirable that normal assert()s (which are very
+ * light-weight) to be enabled, then HB_DEBUG can be defined to disable
+ * the costlier checks. */
+#ifdef NDEBUG
+#define HB_NDEBUG
+#endif
+
#ifndef HB_DEBUG
#define HB_DEBUG 0
#endif
@@ -861,6 +904,29 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3)
}
+/* Enable bitwise ops on enums marked as flags_t */
+/* To my surprise, looks like the function resolver is happy to silently cast
+ * one enum to another... So this doesn't provide the type-checking that I
+ * originally had in mind... :(.
+ *
+ * For MSVC warnings, see: https://github.com/behdad/harfbuzz/pull/163
+ */
+#ifdef _MSC_VER
+# pragma warning(disable:4200)
+# pragma warning(disable:4800)
+#endif
+#define HB_MARK_AS_FLAG_T(T) \
+ extern "C++" { \
+ static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
+ static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
+ static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
+ static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
+ static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
+ static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
+ static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
+ }
+
+
/* Useful for set-operations on small enums.
* For example, for testing "x ∈ {x1, x2, x3}" use:
* (FLAG_SAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
@@ -949,5 +1015,7 @@ hb_options (void)
return _hb_options.opts;
}
+/* Size signifying variable-sized array */
+#define VAR 1
#endif /* HB_PRIVATE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h
index 806479fbefc..f7a544f0b50 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h
@@ -44,109 +44,109 @@ HB_BEGIN_DECLS
typedef struct hb_set_t hb_set_t;
-hb_set_t *
+HB_EXTERN hb_set_t *
hb_set_create (void);
-hb_set_t *
+HB_EXTERN hb_set_t *
hb_set_get_empty (void);
-hb_set_t *
+HB_EXTERN hb_set_t *
hb_set_reference (hb_set_t *set);
-void
+HB_EXTERN void
hb_set_destroy (hb_set_t *set);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_set_user_data (hb_set_t *set,
hb_user_data_key_t *key,
void * data,
hb_destroy_func_t destroy,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_set_get_user_data (hb_set_t *set,
hb_user_data_key_t *key);
/* Returns false if allocation has failed before */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_allocation_successful (const hb_set_t *set);
-void
+HB_EXTERN void
hb_set_clear (hb_set_t *set);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_is_empty (const hb_set_t *set);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_has (const hb_set_t *set,
hb_codepoint_t codepoint);
/* Right now limited to 16-bit integers. Eventually will do full codepoint range, sans -1
* which we will use as a sentinel. */
-void
+HB_EXTERN void
hb_set_add (hb_set_t *set,
hb_codepoint_t codepoint);
-void
+HB_EXTERN void
hb_set_add_range (hb_set_t *set,
hb_codepoint_t first,
hb_codepoint_t last);
-void
+HB_EXTERN void
hb_set_del (hb_set_t *set,
hb_codepoint_t codepoint);
-void
+HB_EXTERN void
hb_set_del_range (hb_set_t *set,
hb_codepoint_t first,
hb_codepoint_t last);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_is_equal (const hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_set (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_union (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_intersect (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_subtract (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_symmetric_difference (hb_set_t *set,
const hb_set_t *other);
-void
+HB_EXTERN void
hb_set_invert (hb_set_t *set);
-unsigned int
+HB_EXTERN unsigned int
hb_set_get_population (const hb_set_t *set);
/* Returns -1 if set empty. */
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
hb_set_get_min (const hb_set_t *set);
/* Returns -1 if set empty. */
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
hb_set_get_max (const hb_set_t *set);
/* Pass -1 in to get started. */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_next (const hb_set_t *set,
hb_codepoint_t *codepoint);
/* Pass -1 for first and last to get started. */
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_set_next_range (const hb_set_t *set,
hb_codepoint_t *first,
hb_codepoint_t *last);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h
index 33f8ce6f8cc..a86d468181e 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h
@@ -38,49 +38,49 @@ HB_BEGIN_DECLS
typedef struct hb_shape_plan_t hb_shape_plan_t;
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
hb_shape_plan_create (hb_face_t *face,
const hb_segment_properties_t *props,
const hb_feature_t *user_features,
unsigned int num_user_features,
const char * const *shaper_list);
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
hb_shape_plan_create_cached (hb_face_t *face,
const hb_segment_properties_t *props,
const hb_feature_t *user_features,
unsigned int num_user_features,
const char * const *shaper_list);
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
hb_shape_plan_get_empty (void);
-hb_shape_plan_t *
+HB_EXTERN hb_shape_plan_t *
hb_shape_plan_reference (hb_shape_plan_t *shape_plan);
-void
+HB_EXTERN void
hb_shape_plan_destroy (hb_shape_plan_t *shape_plan);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_shape_plan_set_user_data (hb_shape_plan_t *shape_plan,
hb_user_data_key_t *key,
void * data,
hb_destroy_func_t destroy,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_shape_plan_get_user_data (hb_shape_plan_t *shape_plan,
hb_user_data_key_t *key);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_shape_plan_execute (hb_shape_plan_t *shape_plan,
hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
-const char *
+HB_EXTERN const char *
hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc
index 2113f90fcb3..2fbaf405a56 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc
@@ -210,13 +210,15 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature)
/**
* hb_feature_from_string:
* @str: (array length=len) (element-type uint8_t): a string to parse
- * @len: length of @str, or -1 if string is nul-terminated
+ * @len: length of @str, or -1 if string is %NULL terminated
* @feature: (out): the #hb_feature_t to initialize with the parsed values
*
- * Parses a string into a #hb_feature_t. If @len is -1 then @str is
- * %NULL-terminated.
+ * Parses a string into a #hb_feature_t.
*
- * Return value: %TRUE if @str is successfully parsed, %FALSE otherwise
+ * TODO: document the syntax here.
+ *
+ * Return value:
+ * %true if @str is successfully parsed, %false otherwise.
*
* Since: 0.9.5
**/
@@ -392,8 +394,6 @@ hb_shape_full (hb_font_t *font,
* positioned glyphs. If @features is not %NULL, it will be used to control the
* features applied during shaping.
*
- * Return value: %FALSE if all shapers failed, %TRUE otherwise
- *
* Since: 0.9.2
**/
void
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h
index 1059d2bae2c..460f770df15 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h
@@ -47,29 +47,29 @@ typedef struct hb_feature_t {
unsigned int end;
} hb_feature_t;
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_feature_from_string (const char *str, int len,
hb_feature_t *feature);
-void
+HB_EXTERN void
hb_feature_to_string (hb_feature_t *feature,
char *buf, unsigned int size);
-void
+HB_EXTERN void
hb_shape (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_shape_full (hb_font_t *font,
hb_buffer_t *buffer,
const hb_feature_t *features,
unsigned int num_features,
const char * const *shaper_list);
-const char **
+HB_EXTERN const char **
hb_shape_list_shapers (void);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh
index 6c537d49215..b0835d31ab1 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh
@@ -46,6 +46,9 @@ HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main OpenType shaper. */
#ifdef HAVE_UNISCRIBE
HB_SHAPER_IMPLEMENT (uniscribe)
#endif
+#ifdef HAVE_DIRECTWRITE
+HB_SHAPER_IMPLEMENT (directwrite)
+#endif
#ifdef HAVE_CORETEXT
HB_SHAPER_IMPLEMENT (coretext)
#endif
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc
index 87cf18d3513..5da04edbf54 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc
@@ -154,6 +154,12 @@ static const hb_script_t ucdn_script_translate[] =
HB_SCRIPT_MULTANI,
HB_SCRIPT_OLD_HUNGARIAN,
HB_SCRIPT_SIGNWRITING,
+ HB_SCRIPT_ADLAM,
+ HB_SCRIPT_BHAIKSUKI,
+ HB_SCRIPT_MARCHEN,
+ HB_SCRIPT_NEWA,
+ HB_SCRIPT_OSAGE,
+ HB_SCRIPT_TANGUT,
};
static hb_unicode_combining_class_t
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c
index d1a4195734a..f4e9be17c05 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c
@@ -16,6 +16,7 @@
#include
#include
+#include
#include "ucdn.h"
typedef struct {
@@ -24,14 +25,19 @@ typedef struct {
unsigned char bidi_class;
unsigned char mirrored;
unsigned char east_asian_width;
- unsigned char normalization_check;
unsigned char script;
+ unsigned char linebreak_class;
} UCDRecord;
typedef struct {
unsigned short from, to;
} MirrorPair;
+typedef struct {
+ unsigned short from, to;
+ unsigned char type;
+} BracketPair;
+
typedef struct {
unsigned int start;
short count, index;
@@ -108,6 +114,24 @@ static int compare_mp(const void *a, const void *b)
return mpa->from - mpb->from;
}
+static int compare_bp(const void *a, const void *b)
+{
+ BracketPair *bpa = (BracketPair *)a;
+ BracketPair *bpb = (BracketPair *)b;
+ return bpa->from - bpb->from;
+}
+
+static BracketPair *search_bp(uint32_t code)
+{
+ BracketPair bp = {0,0,2};
+ BracketPair *res;
+
+ bp.from = code;
+ res = bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN, sizeof(BracketPair),
+ compare_bp);
+ return res;
+}
+
static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b)
{
int si = code - SBASE;
@@ -199,6 +223,42 @@ int ucdn_get_script(uint32_t code)
return get_ucd_record(code)->script;
}
+int ucdn_get_linebreak_class(uint32_t code)
+{
+ return get_ucd_record(code)->linebreak_class;
+}
+
+int ucdn_get_resolved_linebreak_class(uint32_t code)
+{
+ const UCDRecord *record = get_ucd_record(code);
+
+ switch (record->linebreak_class)
+ {
+ case UCDN_LINEBREAK_CLASS_AI:
+ case UCDN_LINEBREAK_CLASS_SG:
+ case UCDN_LINEBREAK_CLASS_XX:
+ return UCDN_LINEBREAK_CLASS_AL;
+
+ case UCDN_LINEBREAK_CLASS_SA:
+ if (record->category == UCDN_GENERAL_CATEGORY_MC ||
+ record->category == UCDN_GENERAL_CATEGORY_MN)
+ return UCDN_LINEBREAK_CLASS_CM;
+ return UCDN_LINEBREAK_CLASS_AL;
+
+ case UCDN_LINEBREAK_CLASS_CJ:
+ return UCDN_LINEBREAK_CLASS_NS;
+
+ case UCDN_LINEBREAK_CLASS_CB:
+ return UCDN_LINEBREAK_CLASS_B2;
+
+ case UCDN_LINEBREAK_CLASS_NL:
+ return UCDN_LINEBREAK_CLASS_BK;
+
+ default:
+ return record->linebreak_class;
+ }
+}
+
uint32_t ucdn_mirror(uint32_t code)
{
MirrorPair mp = {0};
@@ -217,6 +277,24 @@ uint32_t ucdn_mirror(uint32_t code)
return res->to;
}
+uint32_t ucdn_paired_bracket(uint32_t code)
+{
+ BracketPair *res = search_bp(code);
+ if (res == NULL)
+ return code;
+ else
+ return res->to;
+}
+
+int ucdn_paired_bracket_type(uint32_t code)
+{
+ BracketPair *res = search_bp(code);
+ if (res == NULL)
+ return UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE;
+ else
+ return res->type;
+}
+
int ucdn_decompose(uint32_t code, uint32_t *a, uint32_t *b)
{
const unsigned short *rec;
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h
index 8354ae53334..f694dc5a897 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h
@@ -17,6 +17,8 @@
#ifndef UCDN_H
#define UCDN_H
+
+
#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__)
# define HB_BEGIN_VISIBILITY _Pragma ("GCC visibility push(hidden)")
# define HB_END_VISIBILITY _Pragma ("GCC visibility pop")
@@ -58,6 +60,7 @@ typedef unsigned __int64 uint64_t;
#endif
+
#define UCDN_EAST_ASIAN_F 0
#define UCDN_EAST_ASIAN_H 1
#define UCDN_EAST_ASIAN_W 2
@@ -197,6 +200,53 @@ typedef unsigned __int64 uint64_t;
#define UCDN_SCRIPT_MULTANI 129
#define UCDN_SCRIPT_OLD_HUNGARIAN 130
#define UCDN_SCRIPT_SIGNWRITING 131
+#define UCDN_SCRIPT_ADLAM 132
+#define UCDN_SCRIPT_BHAIKSUKI 133
+#define UCDN_SCRIPT_MARCHEN 134
+#define UCDN_SCRIPT_NEWA 135
+#define UCDN_SCRIPT_OSAGE 136
+#define UCDN_SCRIPT_TANGUT 137
+
+#define UCDN_LINEBREAK_CLASS_OP 0
+#define UCDN_LINEBREAK_CLASS_CL 1
+#define UCDN_LINEBREAK_CLASS_CP 2
+#define UCDN_LINEBREAK_CLASS_QU 3
+#define UCDN_LINEBREAK_CLASS_GL 4
+#define UCDN_LINEBREAK_CLASS_NS 5
+#define UCDN_LINEBREAK_CLASS_EX 6
+#define UCDN_LINEBREAK_CLASS_SY 7
+#define UCDN_LINEBREAK_CLASS_IS 8
+#define UCDN_LINEBREAK_CLASS_PR 9
+#define UCDN_LINEBREAK_CLASS_PO 10
+#define UCDN_LINEBREAK_CLASS_NU 11
+#define UCDN_LINEBREAK_CLASS_AL 12
+#define UCDN_LINEBREAK_CLASS_HL 13
+#define UCDN_LINEBREAK_CLASS_ID 14
+#define UCDN_LINEBREAK_CLASS_IN 15
+#define UCDN_LINEBREAK_CLASS_HY 16
+#define UCDN_LINEBREAK_CLASS_BA 17
+#define UCDN_LINEBREAK_CLASS_BB 18
+#define UCDN_LINEBREAK_CLASS_B2 19
+#define UCDN_LINEBREAK_CLASS_ZW 20
+#define UCDN_LINEBREAK_CLASS_CM 21
+#define UCDN_LINEBREAK_CLASS_WJ 22
+#define UCDN_LINEBREAK_CLASS_H2 23
+#define UCDN_LINEBREAK_CLASS_H3 24
+#define UCDN_LINEBREAK_CLASS_JL 25
+#define UCDN_LINEBREAK_CLASS_JV 26
+#define UCDN_LINEBREAK_CLASS_JT 27
+#define UCDN_LINEBREAK_CLASS_RI 28
+#define UCDN_LINEBREAK_CLASS_AI 29
+#define UCDN_LINEBREAK_CLASS_BK 30
+#define UCDN_LINEBREAK_CLASS_CB 31
+#define UCDN_LINEBREAK_CLASS_CJ 32
+#define UCDN_LINEBREAK_CLASS_CR 33
+#define UCDN_LINEBREAK_CLASS_LF 34
+#define UCDN_LINEBREAK_CLASS_NL 35
+#define UCDN_LINEBREAK_CLASS_SA 36
+#define UCDN_LINEBREAK_CLASS_SG 37
+#define UCDN_LINEBREAK_CLASS_SP 38
+#define UCDN_LINEBREAK_CLASS_XX 39
#define UCDN_GENERAL_CATEGORY_CC 0
#define UCDN_GENERAL_CATEGORY_CF 1
@@ -253,6 +303,10 @@ typedef unsigned __int64 uint64_t;
#define UCDN_BIDI_CLASS_FSI 21
#define UCDN_BIDI_CLASS_PDI 22
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_OPEN 0
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_CLOSE 1
+#define UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE 2
+
/**
* Return version of the Unicode database.
*
@@ -301,6 +355,27 @@ int ucdn_get_bidi_class(uint32_t code);
*/
int ucdn_get_script(uint32_t code);
+/**
+ * Get unresolved linebreak class of a codepoint. This does not take
+ * rule LB1 of UAX#14 into account. See ucdn_get_resolved_linebreak_class()
+ * for resolved linebreak classes.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14.
+ */
+int ucdn_get_linebreak_class(uint32_t code);
+
+/**
+ * Get resolved linebreak class of a codepoint. This resolves characters
+ * in the AI, SG, XX, SA and CJ classes according to rule LB1 of UAX#14.
+ * In addition the CB class is resolved as the equivalent B2 class and
+ * the NL class is resolved as the equivalent BK class.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14.
+ */
+int ucdn_get_resolved_linebreak_class(uint32_t code);
+
/**
* Check if codepoint can be mirrored.
*
@@ -318,6 +393,25 @@ int ucdn_get_mirrored(uint32_t code);
*/
uint32_t ucdn_mirror(uint32_t code);
+/**
+ * Get paired bracket for a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return paired bracket codepoint or the original codepoint if no
+ * paired bracket character exists
+ */
+uint32_t ucdn_paired_bracket(uint32_t code);
+
+/**
+ * Get paired bracket type for a codepoint.
+ *
+ * @param code Unicode codepoint
+ * @return value according to UCDN_BIDI_PAIRED_BRACKET_TYPE_* and as defined
+ * in UAX#9.
+ *
+ */
+int ucdn_paired_bracket_type(uint32_t code);
+
/**
* Pairwise canonical decomposition of a codepoint. This includes
* Hangul Jamo decomposition (see chapter 3.12 of the Unicode core
@@ -359,6 +453,8 @@ int ucdn_compat_decompose(uint32_t code, uint32_t *decomposed);
*/
int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b);
-HB_END_HEADER
+#ifdef __cplusplus
+}
+#endif
#endif
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h
index 18c184a2220..034511b8b12 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h
@@ -1,821 +1,999 @@
/* this file was generated by makeunicodedata.py 3.2 */
-#define UNIDATA_VERSION "8.0.0"
+#define UNIDATA_VERSION "9.0.0"
/* a list of unique database records */
static const UCDRecord ucd_records[] = {
- {2, 0, 18, 0, 5, 0, 102},
- {0, 0, 14, 0, 5, 0, 0},
- {0, 0, 16, 0, 5, 0, 0},
- {0, 0, 15, 0, 5, 0, 0},
- {0, 0, 17, 0, 5, 0, 0},
- {29, 0, 17, 0, 3, 0, 0},
- {21, 0, 18, 0, 3, 0, 0},
- {21, 0, 10, 0, 3, 0, 0},
- {23, 0, 10, 0, 3, 0, 0},
+ {2, 0, 18, 0, 5, 102, 41},
+ {0, 0, 14, 0, 5, 0, 21},
+ {0, 0, 16, 0, 5, 0, 17},
+ {0, 0, 15, 0, 5, 0, 35},
+ {0, 0, 16, 0, 5, 0, 30},
+ {0, 0, 17, 0, 5, 0, 30},
+ {0, 0, 15, 0, 5, 0, 33},
+ {0, 0, 15, 0, 5, 0, 21},
+ {0, 0, 16, 0, 5, 0, 21},
+ {29, 0, 17, 0, 3, 0, 40},
+ {21, 0, 18, 0, 3, 0, 6},
+ {21, 0, 18, 0, 3, 0, 3},
+ {21, 0, 10, 0, 3, 0, 12},
+ {23, 0, 10, 0, 3, 0, 9},
+ {21, 0, 10, 0, 3, 0, 10},
+ {21, 0, 18, 0, 3, 0, 12},
{22, 0, 18, 1, 3, 0, 0},
- {18, 0, 18, 1, 3, 0, 0},
- {25, 0, 9, 0, 3, 0, 0},
- {21, 0, 12, 0, 3, 0, 0},
- {17, 0, 9, 0, 3, 0, 0},
- {13, 0, 8, 0, 3, 0, 0},
- {25, 0, 18, 1, 3, 0, 0},
- {25, 0, 18, 0, 3, 0, 0},
- {9, 0, 0, 0, 3, 0, 1},
- {24, 0, 18, 0, 3, 0, 0},
- {16, 0, 18, 0, 3, 0, 0},
- {5, 0, 0, 0, 3, 0, 1},
- {29, 0, 12, 0, 5, 0, 0},
+ {18, 0, 18, 1, 3, 0, 2},
+ {25, 0, 9, 0, 3, 0, 9},
+ {21, 0, 12, 0, 3, 0, 8},
+ {17, 0, 9, 0, 3, 0, 16},
+ {21, 0, 12, 0, 3, 0, 7},
+ {13, 0, 8, 0, 3, 0, 11},
+ {21, 0, 18, 0, 3, 0, 8},
+ {25, 0, 18, 1, 3, 0, 12},
+ {25, 0, 18, 0, 3, 0, 12},
+ {9, 0, 0, 0, 3, 1, 12},
+ {21, 0, 18, 0, 3, 0, 9},
+ {24, 0, 18, 0, 3, 0, 12},
+ {16, 0, 18, 0, 3, 0, 12},
+ {5, 0, 0, 0, 3, 1, 12},
+ {25, 0, 18, 0, 3, 0, 17},
+ {18, 0, 18, 1, 3, 0, 1},
+ {0, 0, 15, 0, 5, 0, 36},
+ {29, 0, 12, 0, 5, 0, 4},
{21, 0, 18, 0, 4, 0, 0},
- {23, 0, 10, 0, 4, 0, 0},
- {26, 0, 18, 0, 3, 0, 0},
- {24, 0, 18, 0, 4, 0, 0},
- {26, 0, 18, 0, 5, 0, 0},
- {7, 0, 0, 0, 4, 0, 1},
- {20, 0, 18, 1, 5, 0, 0},
- {1, 0, 14, 0, 4, 0, 0},
- {26, 0, 18, 0, 4, 0, 0},
- {26, 0, 10, 0, 4, 0, 0},
- {25, 0, 10, 0, 4, 0, 0},
- {15, 0, 8, 0, 4, 0, 0},
- {5, 0, 0, 0, 5, 0, 0},
- {19, 0, 18, 1, 5, 0, 0},
- {15, 0, 18, 0, 4, 0, 0},
- {9, 0, 0, 0, 5, 0, 1},
- {9, 0, 0, 0, 4, 0, 1},
- {25, 0, 18, 0, 4, 0, 0},
- {5, 0, 0, 0, 4, 0, 1},
- {5, 0, 0, 0, 5, 0, 1},
- {7, 0, 0, 0, 5, 0, 1},
- {8, 0, 0, 0, 5, 0, 1},
- {6, 0, 0, 0, 5, 0, 1},
- {6, 0, 18, 0, 5, 0, 0},
- {6, 0, 0, 0, 5, 0, 0},
- {24, 0, 18, 0, 5, 0, 0},
- {6, 0, 18, 0, 4, 0, 0},
- {6, 0, 0, 0, 4, 0, 0},
- {24, 0, 18, 0, 5, 0, 34},
- {12, 230, 13, 0, 4, 0, 40},
- {12, 232, 13, 0, 4, 0, 40},
- {12, 220, 13, 0, 4, 0, 40},
- {12, 216, 13, 0, 4, 0, 40},
- {12, 202, 13, 0, 4, 0, 40},
- {12, 1, 13, 0, 4, 0, 40},
- {12, 240, 13, 0, 4, 0, 40},
- {12, 0, 13, 0, 4, 0, 40},
- {12, 233, 13, 0, 4, 0, 40},
- {12, 234, 13, 0, 4, 0, 40},
- {9, 0, 0, 0, 5, 0, 2},
- {5, 0, 0, 0, 5, 0, 2},
- {24, 0, 18, 0, 5, 0, 2},
- {2, 0, 18, 0, 5, 0, 102},
- {6, 0, 0, 0, 5, 0, 2},
- {21, 0, 18, 0, 5, 0, 0},
- {9, 0, 0, 0, 4, 0, 2},
- {5, 0, 0, 0, 4, 0, 2},
- {9, 0, 0, 0, 5, 0, 54},
- {5, 0, 0, 0, 5, 0, 54},
- {25, 0, 18, 0, 5, 0, 2},
- {9, 0, 0, 0, 5, 0, 3},
- {9, 0, 0, 0, 4, 0, 3},
- {5, 0, 0, 0, 4, 0, 3},
- {5, 0, 0, 0, 5, 0, 3},
- {26, 0, 0, 0, 5, 0, 3},
- {12, 230, 13, 0, 5, 0, 3},
- {12, 230, 13, 0, 5, 0, 40},
- {11, 0, 13, 0, 5, 0, 3},
- {9, 0, 0, 0, 5, 0, 4},
- {6, 0, 0, 0, 5, 0, 4},
- {21, 0, 0, 0, 5, 0, 4},
- {5, 0, 0, 0, 5, 0, 4},
- {21, 0, 0, 0, 5, 0, 0},
- {17, 0, 18, 0, 5, 0, 4},
- {26, 0, 18, 0, 5, 0, 4},
- {23, 0, 10, 0, 5, 0, 4},
- {12, 220, 13, 0, 5, 0, 5},
- {12, 230, 13, 0, 5, 0, 5},
- {12, 222, 13, 0, 5, 0, 5},
- {12, 228, 13, 0, 5, 0, 5},
- {12, 10, 13, 0, 5, 0, 5},
- {12, 11, 13, 0, 5, 0, 5},
- {12, 12, 13, 0, 5, 0, 5},
- {12, 13, 13, 0, 5, 0, 5},
- {12, 14, 13, 0, 5, 0, 5},
- {12, 15, 13, 0, 5, 0, 5},
- {12, 16, 13, 0, 5, 0, 5},
- {12, 17, 13, 0, 5, 0, 5},
- {12, 18, 13, 0, 5, 0, 5},
- {12, 19, 13, 0, 5, 0, 5},
- {12, 20, 13, 0, 5, 0, 5},
- {12, 21, 13, 0, 5, 0, 5},
- {12, 22, 13, 0, 5, 0, 5},
- {17, 0, 3, 0, 5, 0, 5},
- {12, 23, 13, 0, 5, 0, 5},
- {21, 0, 3, 0, 5, 0, 5},
- {12, 24, 13, 0, 5, 0, 5},
- {12, 25, 13, 0, 5, 0, 5},
- {7, 0, 3, 0, 5, 0, 5},
- {1, 0, 11, 0, 5, 0, 6},
- {1, 0, 11, 0, 5, 0, 0},
- {25, 0, 18, 0, 5, 0, 6},
- {25, 0, 4, 0, 5, 0, 6},
- {21, 0, 10, 0, 5, 0, 6},
- {23, 0, 4, 0, 5, 0, 6},
- {21, 0, 12, 0, 5, 0, 0},
+ {23, 0, 10, 0, 3, 0, 10},
+ {23, 0, 10, 0, 4, 0, 9},
+ {26, 0, 18, 0, 3, 0, 12},
+ {21, 0, 18, 0, 4, 0, 29},
+ {24, 0, 18, 0, 4, 0, 29},
+ {26, 0, 18, 0, 5, 0, 12},
+ {7, 0, 0, 0, 4, 1, 29},
+ {20, 0, 18, 1, 5, 0, 3},
+ {1, 0, 14, 0, 4, 0, 17},
+ {26, 0, 18, 0, 4, 0, 12},
+ {26, 0, 10, 0, 4, 0, 10},
+ {25, 0, 10, 0, 4, 0, 9},
+ {15, 0, 8, 0, 4, 0, 29},
+ {24, 0, 18, 0, 4, 0, 18},
+ {5, 0, 0, 0, 5, 0, 12},
+ {19, 0, 18, 1, 5, 0, 3},
+ {15, 0, 18, 0, 4, 0, 29},
+ {9, 0, 0, 0, 5, 1, 12},
+ {9, 0, 0, 0, 4, 1, 12},
+ {25, 0, 18, 0, 4, 0, 29},
+ {5, 0, 0, 0, 4, 1, 12},
+ {5, 0, 0, 0, 5, 1, 12},
+ {7, 0, 0, 0, 5, 1, 12},
+ {8, 0, 0, 0, 5, 1, 12},
+ {6, 0, 0, 0, 5, 1, 12},
+ {6, 0, 18, 0, 5, 0, 12},
+ {6, 0, 0, 0, 5, 0, 12},
+ {24, 0, 18, 0, 5, 0, 12},
+ {24, 0, 18, 0, 4, 0, 12},
+ {6, 0, 18, 0, 4, 0, 29},
+ {6, 0, 18, 0, 5, 0, 18},
+ {6, 0, 0, 0, 4, 0, 29},
+ {24, 0, 18, 0, 5, 34, 12},
+ {12, 230, 13, 0, 4, 40, 21},
+ {12, 232, 13, 0, 4, 40, 21},
+ {12, 220, 13, 0, 4, 40, 21},
+ {12, 216, 13, 0, 4, 40, 21},
+ {12, 202, 13, 0, 4, 40, 21},
+ {12, 1, 13, 0, 4, 40, 21},
+ {12, 240, 13, 0, 4, 40, 21},
+ {12, 0, 13, 0, 4, 40, 4},
+ {12, 233, 13, 0, 4, 40, 4},
+ {12, 234, 13, 0, 4, 40, 4},
+ {9, 0, 0, 0, 5, 2, 12},
+ {5, 0, 0, 0, 5, 2, 12},
+ {24, 0, 18, 0, 5, 2, 12},
+ {2, 0, 18, 0, 5, 102, 41},
+ {6, 0, 0, 0, 5, 2, 12},
+ {21, 0, 18, 0, 5, 0, 8},
+ {21, 0, 18, 0, 5, 0, 12},
+ {9, 0, 0, 0, 4, 2, 12},
+ {5, 0, 0, 0, 4, 2, 12},
+ {9, 0, 0, 0, 5, 54, 12},
+ {5, 0, 0, 0, 5, 54, 12},
+ {25, 0, 18, 0, 5, 2, 12},
+ {9, 0, 0, 0, 5, 3, 12},
+ {9, 0, 0, 0, 4, 3, 12},
+ {5, 0, 0, 0, 4, 3, 12},
+ {5, 0, 0, 0, 5, 3, 12},
+ {26, 0, 0, 0, 5, 3, 12},
+ {12, 230, 13, 0, 5, 3, 21},
+ {12, 230, 13, 0, 5, 40, 21},
+ {11, 0, 13, 0, 5, 3, 21},
+ {9, 0, 0, 0, 5, 4, 12},
+ {6, 0, 0, 0, 5, 4, 12},
+ {21, 0, 0, 0, 5, 4, 12},
+ {5, 0, 0, 0, 5, 4, 12},
+ {21, 0, 0, 0, 5, 0, 8},
+ {17, 0, 18, 0, 5, 4, 17},
+ {26, 0, 18, 0, 5, 4, 12},
+ {23, 0, 10, 0, 5, 4, 9},
+ {12, 220, 13, 0, 5, 5, 21},
+ {12, 230, 13, 0, 5, 5, 21},
+ {12, 222, 13, 0, 5, 5, 21},
+ {12, 228, 13, 0, 5, 5, 21},
+ {12, 10, 13, 0, 5, 5, 21},
+ {12, 11, 13, 0, 5, 5, 21},
+ {12, 12, 13, 0, 5, 5, 21},
+ {12, 13, 13, 0, 5, 5, 21},
+ {12, 14, 13, 0, 5, 5, 21},
+ {12, 15, 13, 0, 5, 5, 21},
+ {12, 16, 13, 0, 5, 5, 21},
+ {12, 17, 13, 0, 5, 5, 21},
+ {12, 18, 13, 0, 5, 5, 21},
+ {12, 19, 13, 0, 5, 5, 21},
+ {12, 20, 13, 0, 5, 5, 21},
+ {12, 21, 13, 0, 5, 5, 21},
+ {12, 22, 13, 0, 5, 5, 21},
+ {17, 0, 3, 0, 5, 5, 17},
+ {12, 23, 13, 0, 5, 5, 21},
+ {21, 0, 3, 0, 5, 5, 12},
+ {12, 24, 13, 0, 5, 5, 21},
+ {12, 25, 13, 0, 5, 5, 21},
+ {21, 0, 3, 0, 5, 5, 6},
+ {7, 0, 3, 0, 5, 5, 13},
+ {1, 0, 11, 0, 5, 6, 12},
+ {1, 0, 11, 0, 5, 0, 12},
+ {25, 0, 18, 0, 5, 6, 12},
+ {25, 0, 4, 0, 5, 6, 12},
+ {21, 0, 10, 0, 5, 6, 10},
+ {23, 0, 4, 0, 5, 6, 10},
+ {21, 0, 12, 0, 5, 0, 8},
+ {21, 0, 4, 0, 5, 6, 8},
+ {26, 0, 18, 0, 5, 6, 12},
+ {12, 230, 13, 0, 5, 6, 21},
+ {12, 30, 13, 0, 5, 6, 21},
+ {12, 31, 13, 0, 5, 6, 21},
+ {12, 32, 13, 0, 5, 6, 21},
{21, 0, 4, 0, 5, 0, 6},
- {26, 0, 18, 0, 5, 0, 6},
- {12, 230, 13, 0, 5, 0, 6},
- {12, 30, 13, 0, 5, 0, 6},
- {12, 31, 13, 0, 5, 0, 6},
- {12, 32, 13, 0, 5, 0, 6},
- {21, 0, 4, 0, 5, 0, 0},
- {1, 0, 4, 0, 5, 0, 0},
- {7, 0, 4, 0, 5, 0, 6},
- {6, 0, 4, 0, 5, 0, 0},
- {12, 27, 13, 0, 5, 0, 40},
- {12, 28, 13, 0, 5, 0, 40},
- {12, 29, 13, 0, 5, 0, 40},
- {12, 30, 13, 0, 5, 0, 40},
- {12, 31, 13, 0, 5, 0, 40},
- {12, 32, 13, 0, 5, 0, 40},
- {12, 33, 13, 0, 5, 0, 40},
- {12, 34, 13, 0, 5, 0, 40},
- {12, 220, 13, 0, 5, 0, 40},
- {12, 220, 13, 0, 5, 0, 6},
- {13, 0, 11, 0, 5, 0, 6},
- {21, 0, 11, 0, 5, 0, 6},
- {12, 35, 13, 0, 5, 0, 40},
- {6, 0, 4, 0, 5, 0, 6},
- {13, 0, 8, 0, 5, 0, 6},
- {26, 0, 4, 0, 5, 0, 6},
- {21, 0, 4, 0, 5, 0, 7},
- {1, 0, 4, 0, 5, 0, 7},
- {7, 0, 4, 0, 5, 0, 7},
- {12, 36, 13, 0, 5, 0, 7},
- {12, 230, 13, 0, 5, 0, 7},
- {12, 220, 13, 0, 5, 0, 7},
- {7, 0, 4, 0, 5, 0, 8},
- {12, 0, 13, 0, 5, 0, 8},
- {13, 0, 3, 0, 5, 0, 65},
- {7, 0, 3, 0, 5, 0, 65},
- {12, 230, 13, 0, 5, 0, 65},
- {12, 220, 13, 0, 5, 0, 65},
- {6, 0, 3, 0, 5, 0, 65},
- {26, 0, 18, 0, 5, 0, 65},
- {21, 0, 18, 0, 5, 0, 65},
- {7, 0, 3, 0, 5, 0, 81},
- {12, 230, 13, 0, 5, 0, 81},
- {6, 0, 3, 0, 5, 0, 81},
- {21, 0, 3, 0, 5, 0, 81},
- {7, 0, 3, 0, 5, 0, 94},
- {12, 220, 13, 0, 5, 0, 94},
- {21, 0, 3, 0, 5, 0, 94},
- {12, 27, 13, 0, 5, 0, 6},
- {12, 28, 13, 0, 5, 0, 6},
- {12, 29, 13, 0, 5, 0, 6},
- {12, 0, 13, 0, 5, 0, 9},
- {10, 0, 0, 0, 5, 0, 9},
- {7, 0, 0, 0, 5, 0, 9},
- {12, 7, 13, 0, 5, 0, 9},
- {12, 9, 13, 0, 5, 0, 9},
- {12, 230, 13, 0, 5, 0, 9},
- {13, 0, 0, 0, 5, 0, 9},
- {21, 0, 0, 0, 5, 0, 9},
- {6, 0, 0, 0, 5, 0, 9},
- {7, 0, 0, 0, 5, 0, 10},
- {12, 0, 13, 0, 5, 0, 10},
- {10, 0, 0, 0, 5, 0, 10},
- {12, 7, 13, 0, 5, 0, 10},
- {12, 9, 13, 0, 5, 0, 10},
- {13, 0, 0, 0, 5, 0, 10},
- {23, 0, 10, 0, 5, 0, 10},
- {15, 0, 0, 0, 5, 0, 10},
- {26, 0, 0, 0, 5, 0, 10},
- {12, 0, 13, 0, 5, 0, 11},
- {10, 0, 0, 0, 5, 0, 11},
- {7, 0, 0, 0, 5, 0, 11},
- {12, 7, 13, 0, 5, 0, 11},
- {12, 9, 13, 0, 5, 0, 11},
- {13, 0, 0, 0, 5, 0, 11},
- {12, 0, 13, 0, 5, 0, 12},
- {10, 0, 0, 0, 5, 0, 12},
- {7, 0, 0, 0, 5, 0, 12},
- {12, 7, 13, 0, 5, 0, 12},
- {12, 9, 13, 0, 5, 0, 12},
- {13, 0, 0, 0, 5, 0, 12},
+ {1, 0, 4, 0, 5, 0, 21},
+ {21, 0, 4, 0, 5, 6, 6},
+ {7, 0, 4, 0, 5, 6, 12},
+ {6, 0, 4, 0, 5, 0, 12},
+ {12, 27, 13, 0, 5, 40, 21},
+ {12, 28, 13, 0, 5, 40, 21},
+ {12, 29, 13, 0, 5, 40, 21},
+ {12, 30, 13, 0, 5, 40, 21},
+ {12, 31, 13, 0, 5, 40, 21},
+ {12, 32, 13, 0, 5, 40, 21},
+ {12, 33, 13, 0, 5, 40, 21},
+ {12, 34, 13, 0, 5, 40, 21},
+ {12, 220, 13, 0, 5, 40, 21},
+ {12, 220, 13, 0, 5, 6, 21},
+ {13, 0, 11, 0, 5, 6, 11},
+ {21, 0, 11, 0, 5, 6, 11},
+ {21, 0, 4, 0, 5, 6, 12},
+ {12, 35, 13, 0, 5, 40, 21},
+ {6, 0, 4, 0, 5, 6, 12},
+ {13, 0, 8, 0, 5, 6, 11},
+ {26, 0, 4, 0, 5, 6, 12},
+ {21, 0, 4, 0, 5, 7, 12},
+ {1, 0, 4, 0, 5, 7, 12},
+ {7, 0, 4, 0, 5, 7, 12},
+ {12, 36, 13, 0, 5, 7, 21},
+ {12, 230, 13, 0, 5, 7, 21},
+ {12, 220, 13, 0, 5, 7, 21},
+ {7, 0, 4, 0, 5, 8, 12},
+ {12, 0, 13, 0, 5, 8, 21},
+ {13, 0, 3, 0, 5, 65, 11},
+ {7, 0, 3, 0, 5, 65, 12},
+ {12, 230, 13, 0, 5, 65, 21},
+ {12, 220, 13, 0, 5, 65, 21},
+ {6, 0, 3, 0, 5, 65, 12},
+ {26, 0, 18, 0, 5, 65, 12},
+ {21, 0, 18, 0, 5, 65, 12},
+ {21, 0, 18, 0, 5, 65, 8},
+ {21, 0, 18, 0, 5, 65, 6},
+ {7, 0, 3, 0, 5, 81, 12},
+ {12, 230, 13, 0, 5, 81, 21},
+ {6, 0, 3, 0, 5, 81, 12},
+ {21, 0, 3, 0, 5, 81, 12},
+ {7, 0, 3, 0, 5, 94, 12},
+ {12, 220, 13, 0, 5, 94, 21},
+ {21, 0, 3, 0, 5, 94, 12},
+ {12, 27, 13, 0, 5, 6, 21},
+ {12, 28, 13, 0, 5, 6, 21},
+ {12, 29, 13, 0, 5, 6, 21},
+ {12, 0, 13, 0, 5, 9, 21},
+ {10, 0, 0, 0, 5, 9, 21},
+ {7, 0, 0, 0, 5, 9, 12},
+ {12, 7, 13, 0, 5, 9, 21},
+ {12, 9, 13, 0, 5, 9, 21},
+ {12, 230, 13, 0, 5, 9, 21},
+ {21, 0, 0, 0, 5, 0, 17},
+ {13, 0, 0, 0, 5, 9, 11},
+ {21, 0, 0, 0, 5, 9, 12},
+ {6, 0, 0, 0, 5, 9, 12},
+ {7, 0, 0, 0, 5, 10, 12},
+ {12, 0, 13, 0, 5, 10, 21},
+ {10, 0, 0, 0, 5, 10, 21},
+ {12, 7, 13, 0, 5, 10, 21},
+ {12, 9, 13, 0, 5, 10, 21},
+ {13, 0, 0, 0, 5, 10, 11},
+ {23, 0, 10, 0, 5, 10, 10},
+ {15, 0, 0, 0, 5, 10, 12},
+ {15, 0, 0, 0, 5, 10, 10},
+ {26, 0, 0, 0, 5, 10, 12},
+ {23, 0, 10, 0, 5, 10, 9},
+ {12, 0, 13, 0, 5, 11, 21},
+ {10, 0, 0, 0, 5, 11, 21},
+ {7, 0, 0, 0, 5, 11, 12},
+ {12, 7, 13, 0, 5, 11, 21},
+ {12, 9, 13, 0, 5, 11, 21},
+ {13, 0, 0, 0, 5, 11, 11},
+ {12, 0, 13, 0, 5, 12, 21},
+ {10, 0, 0, 0, 5, 12, 21},
+ {7, 0, 0, 0, 5, 12, 12},
+ {12, 7, 13, 0, 5, 12, 21},
+ {12, 9, 13, 0, 5, 12, 21},
+ {13, 0, 0, 0, 5, 12, 11},
+ {21, 0, 0, 0, 5, 12, 12},
+ {23, 0, 10, 0, 5, 12, 9},
+ {12, 0, 13, 0, 5, 13, 21},
+ {10, 0, 0, 0, 5, 13, 21},
+ {7, 0, 0, 0, 5, 13, 12},
+ {12, 7, 13, 0, 5, 13, 21},
+ {12, 9, 13, 0, 5, 13, 21},
+ {13, 0, 0, 0, 5, 13, 11},
+ {26, 0, 0, 0, 5, 13, 12},
+ {15, 0, 0, 0, 5, 13, 12},
+ {12, 0, 13, 0, 5, 14, 21},
+ {7, 0, 0, 0, 5, 14, 12},
+ {10, 0, 0, 0, 5, 14, 21},
+ {12, 9, 13, 0, 5, 14, 21},
+ {13, 0, 0, 0, 5, 14, 11},
+ {15, 0, 0, 0, 5, 14, 12},
+ {26, 0, 18, 0, 5, 14, 12},
+ {23, 0, 10, 0, 5, 14, 9},
+ {12, 0, 13, 0, 5, 15, 21},
+ {10, 0, 0, 0, 5, 15, 21},
+ {7, 0, 0, 0, 5, 15, 12},
+ {12, 9, 13, 0, 5, 15, 21},
+ {12, 84, 13, 0, 5, 15, 21},
+ {12, 91, 13, 0, 5, 15, 21},
+ {13, 0, 0, 0, 5, 15, 11},
+ {15, 0, 18, 0, 5, 15, 12},
+ {26, 0, 0, 0, 5, 15, 12},
+ {7, 0, 0, 0, 5, 16, 12},
+ {12, 0, 13, 0, 5, 16, 21},
+ {10, 0, 0, 0, 5, 16, 21},
+ {12, 7, 13, 0, 5, 16, 21},
+ {12, 0, 0, 0, 5, 16, 21},
+ {12, 9, 13, 0, 5, 16, 21},
+ {13, 0, 0, 0, 5, 16, 11},
+ {12, 0, 13, 0, 5, 17, 21},
+ {10, 0, 0, 0, 5, 17, 21},
+ {7, 0, 0, 0, 5, 17, 12},
+ {12, 9, 13, 0, 5, 17, 21},
+ {26, 0, 0, 0, 5, 17, 12},
+ {15, 0, 0, 0, 5, 17, 12},
+ {13, 0, 0, 0, 5, 17, 11},
+ {26, 0, 0, 0, 5, 17, 10},
+ {10, 0, 0, 0, 5, 18, 21},
+ {7, 0, 0, 0, 5, 18, 12},
+ {12, 9, 13, 0, 5, 18, 21},
+ {12, 0, 13, 0, 5, 18, 21},
+ {13, 0, 0, 0, 5, 18, 11},
+ {21, 0, 0, 0, 5, 18, 12},
+ {7, 0, 0, 0, 5, 19, 38},
+ {12, 0, 13, 0, 5, 19, 38},
+ {12, 103, 13, 0, 5, 19, 38},
+ {12, 9, 13, 0, 5, 19, 38},
+ {23, 0, 10, 0, 5, 0, 9},
+ {6, 0, 0, 0, 5, 19, 38},
+ {12, 107, 13, 0, 5, 19, 38},
+ {21, 0, 0, 0, 5, 19, 12},
+ {13, 0, 0, 0, 5, 19, 11},
+ {21, 0, 0, 0, 5, 19, 17},
+ {7, 0, 0, 0, 5, 20, 38},
+ {12, 0, 13, 0, 5, 20, 38},
+ {12, 118, 13, 0, 5, 20, 38},
+ {6, 0, 0, 0, 5, 20, 38},
+ {12, 122, 13, 0, 5, 20, 38},
+ {13, 0, 0, 0, 5, 20, 11},
+ {7, 0, 0, 0, 5, 21, 12},
+ {26, 0, 0, 0, 5, 21, 18},
+ {21, 0, 0, 0, 5, 21, 18},
+ {21, 0, 0, 0, 5, 21, 12},
+ {21, 0, 0, 0, 5, 21, 4},
+ {21, 0, 0, 0, 5, 21, 17},
+ {21, 0, 0, 0, 5, 21, 6},
+ {26, 0, 0, 0, 5, 21, 12},
+ {12, 220, 13, 0, 5, 21, 21},
+ {13, 0, 0, 0, 5, 21, 11},
+ {15, 0, 0, 0, 5, 21, 12},
+ {26, 0, 0, 0, 5, 21, 17},
+ {12, 216, 13, 0, 5, 21, 21},
+ {22, 0, 18, 1, 5, 21, 0},
+ {18, 0, 18, 1, 5, 21, 1},
+ {10, 0, 0, 0, 5, 21, 21},
+ {12, 129, 13, 0, 5, 21, 21},
+ {12, 130, 13, 0, 5, 21, 21},
+ {12, 0, 13, 0, 5, 21, 21},
+ {12, 132, 13, 0, 5, 21, 21},
+ {10, 0, 0, 0, 5, 21, 17},
+ {12, 230, 13, 0, 5, 21, 21},
+ {12, 9, 13, 0, 5, 21, 21},
+ {26, 0, 0, 0, 5, 0, 12},
+ {7, 0, 0, 0, 5, 22, 38},
+ {10, 0, 0, 0, 5, 22, 38},
+ {12, 0, 13, 0, 5, 22, 38},
+ {12, 7, 13, 0, 5, 22, 38},
+ {12, 9, 13, 0, 5, 22, 38},
+ {13, 0, 0, 0, 5, 22, 11},
+ {21, 0, 0, 0, 5, 22, 17},
+ {21, 0, 0, 0, 5, 22, 12},
+ {12, 220, 13, 0, 5, 22, 38},
+ {26, 0, 0, 0, 5, 22, 38},
+ {9, 0, 0, 0, 5, 23, 12},
+ {7, 0, 0, 0, 5, 23, 12},
{21, 0, 0, 0, 5, 0, 12},
- {23, 0, 10, 0, 5, 0, 12},
- {12, 0, 13, 0, 5, 0, 13},
- {10, 0, 0, 0, 5, 0, 13},
- {7, 0, 0, 0, 5, 0, 13},
- {12, 7, 13, 0, 5, 0, 13},
- {12, 9, 13, 0, 5, 0, 13},
- {13, 0, 0, 0, 5, 0, 13},
- {26, 0, 0, 0, 5, 0, 13},
- {15, 0, 0, 0, 5, 0, 13},
- {12, 0, 13, 0, 5, 0, 14},
- {7, 0, 0, 0, 5, 0, 14},
- {10, 0, 0, 0, 5, 0, 14},
- {12, 9, 13, 0, 5, 0, 14},
- {13, 0, 0, 0, 5, 0, 14},
- {15, 0, 0, 0, 5, 0, 14},
- {26, 0, 18, 0, 5, 0, 14},
- {23, 0, 10, 0, 5, 0, 14},
- {12, 0, 13, 0, 5, 0, 15},
- {10, 0, 0, 0, 5, 0, 15},
- {7, 0, 0, 0, 5, 0, 15},
- {12, 9, 13, 0, 5, 0, 15},
- {12, 84, 13, 0, 5, 0, 15},
- {12, 91, 13, 0, 5, 0, 15},
- {13, 0, 0, 0, 5, 0, 15},
- {15, 0, 18, 0, 5, 0, 15},
- {26, 0, 0, 0, 5, 0, 15},
- {12, 0, 13, 0, 5, 0, 16},
- {10, 0, 0, 0, 5, 0, 16},
- {7, 0, 0, 0, 5, 0, 16},
- {12, 7, 13, 0, 5, 0, 16},
- {12, 0, 0, 0, 5, 0, 16},
- {12, 9, 13, 0, 5, 0, 16},
- {13, 0, 0, 0, 5, 0, 16},
- {12, 0, 13, 0, 5, 0, 17},
- {10, 0, 0, 0, 5, 0, 17},
- {7, 0, 0, 0, 5, 0, 17},
- {12, 9, 13, 0, 5, 0, 17},
- {13, 0, 0, 0, 5, 0, 17},
- {15, 0, 0, 0, 5, 0, 17},
- {26, 0, 0, 0, 5, 0, 17},
- {10, 0, 0, 0, 5, 0, 18},
- {7, 0, 0, 0, 5, 0, 18},
- {12, 9, 13, 0, 5, 0, 18},
- {12, 0, 13, 0, 5, 0, 18},
- {13, 0, 0, 0, 5, 0, 18},
- {21, 0, 0, 0, 5, 0, 18},
- {7, 0, 0, 0, 5, 0, 19},
- {12, 0, 13, 0, 5, 0, 19},
- {12, 103, 13, 0, 5, 0, 19},
- {12, 9, 13, 0, 5, 0, 19},
- {23, 0, 10, 0, 5, 0, 0},
- {6, 0, 0, 0, 5, 0, 19},
- {12, 107, 13, 0, 5, 0, 19},
- {21, 0, 0, 0, 5, 0, 19},
- {13, 0, 0, 0, 5, 0, 19},
- {7, 0, 0, 0, 5, 0, 20},
- {12, 0, 13, 0, 5, 0, 20},
- {12, 118, 13, 0, 5, 0, 20},
- {6, 0, 0, 0, 5, 0, 20},
- {12, 122, 13, 0, 5, 0, 20},
- {13, 0, 0, 0, 5, 0, 20},
- {7, 0, 0, 0, 5, 0, 21},
- {26, 0, 0, 0, 5, 0, 21},
- {21, 0, 0, 0, 5, 0, 21},
- {12, 220, 13, 0, 5, 0, 21},
- {13, 0, 0, 0, 5, 0, 21},
- {15, 0, 0, 0, 5, 0, 21},
- {12, 216, 13, 0, 5, 0, 21},
- {22, 0, 18, 1, 5, 0, 21},
- {18, 0, 18, 1, 5, 0, 21},
+ {6, 0, 0, 0, 5, 23, 12},
+ {7, 0, 0, 0, 2, 24, 25},
+ {7, 0, 0, 0, 5, 24, 26},
+ {7, 0, 0, 0, 5, 24, 27},
+ {7, 0, 0, 0, 5, 25, 12},
+ {12, 230, 13, 0, 5, 25, 21},
+ {21, 0, 0, 0, 5, 25, 12},
+ {21, 0, 0, 0, 5, 25, 17},
+ {15, 0, 0, 0, 5, 25, 12},
+ {26, 0, 18, 0, 5, 25, 12},
+ {9, 0, 0, 0, 5, 26, 12},
+ {5, 0, 0, 0, 5, 26, 12},
+ {17, 0, 18, 0, 5, 27, 17},
+ {7, 0, 0, 0, 5, 27, 12},
+ {21, 0, 0, 0, 5, 27, 12},
+ {29, 0, 17, 0, 5, 28, 17},
+ {7, 0, 0, 0, 5, 28, 12},
+ {22, 0, 18, 1, 5, 28, 0},
+ {18, 0, 18, 1, 5, 28, 1},
+ {7, 0, 0, 0, 5, 29, 12},
+ {14, 0, 0, 0, 5, 29, 12},
+ {7, 0, 0, 0, 5, 41, 12},
+ {12, 0, 13, 0, 5, 41, 21},
+ {12, 9, 13, 0, 5, 41, 21},
+ {7, 0, 0, 0, 5, 42, 12},
+ {12, 0, 13, 0, 5, 42, 21},
+ {12, 9, 13, 0, 5, 42, 21},
+ {7, 0, 0, 0, 5, 43, 12},
+ {12, 0, 13, 0, 5, 43, 21},
+ {7, 0, 0, 0, 5, 44, 12},
+ {12, 0, 13, 0, 5, 44, 21},
+ {7, 0, 0, 0, 5, 30, 38},
+ {12, 0, 13, 0, 5, 30, 38},
+ {10, 0, 0, 0, 5, 30, 38},
+ {12, 9, 13, 0, 5, 30, 38},
+ {21, 0, 0, 0, 5, 30, 17},
+ {21, 0, 0, 0, 5, 30, 5},
+ {6, 0, 0, 0, 5, 30, 38},
+ {21, 0, 0, 0, 5, 30, 12},
+ {23, 0, 10, 0, 5, 30, 9},
+ {12, 230, 13, 0, 5, 30, 38},
+ {13, 0, 0, 0, 5, 30, 11},
+ {15, 0, 18, 0, 5, 30, 12},
+ {21, 0, 18, 0, 5, 31, 12},
+ {21, 0, 18, 0, 5, 0, 6},
+ {21, 0, 18, 0, 5, 31, 17},
+ {21, 0, 18, 0, 5, 0, 17},
+ {17, 0, 18, 0, 5, 31, 18},
+ {21, 0, 18, 0, 5, 31, 6},
+ {12, 0, 13, 0, 5, 31, 21},
+ {1, 0, 14, 0, 5, 31, 4},
+ {13, 0, 0, 0, 5, 31, 11},
+ {7, 0, 0, 0, 5, 31, 12},
+ {6, 0, 0, 0, 5, 31, 12},
+ {12, 228, 13, 0, 5, 31, 21},
+ {7, 0, 0, 0, 5, 45, 12},
+ {12, 0, 13, 0, 5, 45, 21},
+ {10, 0, 0, 0, 5, 45, 21},
+ {12, 222, 13, 0, 5, 45, 21},
+ {12, 230, 13, 0, 5, 45, 21},
+ {12, 220, 13, 0, 5, 45, 21},
+ {26, 0, 18, 0, 5, 45, 12},
+ {21, 0, 18, 0, 5, 45, 6},
+ {13, 0, 0, 0, 5, 45, 11},
+ {7, 0, 0, 0, 5, 46, 38},
+ {7, 0, 0, 0, 5, 55, 38},
+ {13, 0, 0, 0, 5, 55, 11},
+ {15, 0, 0, 0, 5, 55, 38},
+ {26, 0, 18, 0, 5, 55, 38},
+ {26, 0, 18, 0, 5, 30, 12},
+ {7, 0, 0, 0, 5, 53, 12},
+ {12, 230, 13, 0, 5, 53, 21},
+ {12, 220, 13, 0, 5, 53, 21},
+ {10, 0, 0, 0, 5, 53, 21},
+ {12, 0, 13, 0, 5, 53, 21},
+ {21, 0, 0, 0, 5, 53, 12},
+ {7, 0, 0, 0, 5, 77, 38},
+ {10, 0, 0, 0, 5, 77, 38},
+ {12, 0, 13, 0, 5, 77, 38},
+ {12, 9, 13, 0, 5, 77, 38},
+ {12, 230, 13, 0, 5, 77, 38},
+ {12, 220, 13, 0, 5, 77, 21},
+ {13, 0, 0, 0, 5, 77, 11},
+ {21, 0, 0, 0, 5, 77, 38},
+ {6, 0, 0, 0, 5, 77, 38},
+ {11, 0, 13, 0, 5, 40, 21},
+ {12, 0, 13, 0, 5, 61, 21},
+ {10, 0, 0, 0, 5, 61, 21},
+ {7, 0, 0, 0, 5, 61, 12},
+ {12, 7, 13, 0, 5, 61, 21},
+ {10, 9, 0, 0, 5, 61, 21},
+ {13, 0, 0, 0, 5, 61, 11},
+ {21, 0, 0, 0, 5, 61, 17},
+ {21, 0, 0, 0, 5, 61, 12},
+ {26, 0, 0, 0, 5, 61, 12},
+ {12, 230, 13, 0, 5, 61, 21},
+ {12, 220, 13, 0, 5, 61, 21},
+ {12, 0, 13, 0, 5, 66, 21},
+ {10, 0, 0, 0, 5, 66, 21},
+ {7, 0, 0, 0, 5, 66, 12},
+ {10, 9, 0, 0, 5, 66, 21},
+ {12, 9, 13, 0, 5, 66, 21},
+ {13, 0, 0, 0, 5, 66, 11},
+ {7, 0, 0, 0, 5, 92, 12},
+ {12, 7, 13, 0, 5, 92, 21},
+ {10, 0, 0, 0, 5, 92, 21},
+ {12, 0, 13, 0, 5, 92, 21},
+ {10, 9, 0, 0, 5, 92, 21},
+ {21, 0, 0, 0, 5, 92, 12},
+ {7, 0, 0, 0, 5, 67, 12},
+ {10, 0, 0, 0, 5, 67, 21},
+ {12, 0, 13, 0, 5, 67, 21},
+ {12, 7, 13, 0, 5, 67, 21},
+ {21, 0, 0, 0, 5, 67, 17},
+ {13, 0, 0, 0, 5, 67, 11},
+ {13, 0, 0, 0, 5, 68, 11},
+ {7, 0, 0, 0, 5, 68, 12},
+ {6, 0, 0, 0, 5, 68, 12},
+ {21, 0, 0, 0, 5, 68, 17},
+ {21, 0, 0, 0, 5, 66, 12},
+ {12, 1, 13, 0, 5, 40, 21},
{10, 0, 0, 0, 5, 0, 21},
- {12, 129, 13, 0, 5, 0, 21},
- {12, 130, 13, 0, 5, 0, 21},
- {12, 0, 13, 0, 5, 0, 21},
- {12, 132, 13, 0, 5, 0, 21},
- {12, 230, 13, 0, 5, 0, 21},
- {12, 9, 13, 0, 5, 0, 21},
- {26, 0, 0, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 22},
- {10, 0, 0, 0, 5, 0, 22},
- {12, 0, 13, 0, 5, 0, 22},
- {12, 7, 13, 0, 5, 0, 22},
- {12, 9, 13, 0, 5, 0, 22},
- {13, 0, 0, 0, 5, 0, 22},
- {21, 0, 0, 0, 5, 0, 22},
- {12, 220, 13, 0, 5, 0, 22},
- {26, 0, 0, 0, 5, 0, 22},
- {9, 0, 0, 0, 5, 0, 23},
- {7, 0, 0, 0, 5, 0, 23},
- {6, 0, 0, 0, 5, 0, 23},
- {7, 0, 0, 0, 2, 0, 24},
- {7, 0, 0, 0, 5, 0, 24},
- {7, 0, 0, 0, 5, 0, 25},
- {12, 230, 13, 0, 5, 0, 25},
- {21, 0, 0, 0, 5, 0, 25},
- {15, 0, 0, 0, 5, 0, 25},
- {26, 0, 18, 0, 5, 0, 25},
- {9, 0, 0, 0, 5, 0, 26},
- {5, 0, 0, 0, 5, 0, 26},
- {17, 0, 18, 0, 5, 0, 27},
- {7, 0, 0, 0, 5, 0, 27},
- {21, 0, 0, 0, 5, 0, 27},
- {29, 0, 17, 0, 5, 0, 28},
- {7, 0, 0, 0, 5, 0, 28},
- {22, 0, 18, 1, 5, 0, 28},
- {18, 0, 18, 1, 5, 0, 28},
- {7, 0, 0, 0, 5, 0, 29},
- {14, 0, 0, 0, 5, 0, 29},
- {7, 0, 0, 0, 5, 0, 41},
- {12, 0, 13, 0, 5, 0, 41},
- {12, 9, 13, 0, 5, 0, 41},
- {7, 0, 0, 0, 5, 0, 42},
- {12, 0, 13, 0, 5, 0, 42},
- {12, 9, 13, 0, 5, 0, 42},
- {7, 0, 0, 0, 5, 0, 43},
- {12, 0, 13, 0, 5, 0, 43},
- {7, 0, 0, 0, 5, 0, 44},
- {12, 0, 13, 0, 5, 0, 44},
- {7, 0, 0, 0, 5, 0, 30},
- {12, 0, 13, 0, 5, 0, 30},
- {10, 0, 0, 0, 5, 0, 30},
- {12, 9, 13, 0, 5, 0, 30},
- {21, 0, 0, 0, 5, 0, 30},
- {6, 0, 0, 0, 5, 0, 30},
- {23, 0, 10, 0, 5, 0, 30},
- {12, 230, 13, 0, 5, 0, 30},
- {13, 0, 0, 0, 5, 0, 30},
- {15, 0, 18, 0, 5, 0, 30},
- {21, 0, 18, 0, 5, 0, 31},
- {17, 0, 18, 0, 5, 0, 31},
- {12, 0, 13, 0, 5, 0, 31},
- {1, 0, 14, 0, 5, 0, 31},
- {13, 0, 0, 0, 5, 0, 31},
- {7, 0, 0, 0, 5, 0, 31},
- {6, 0, 0, 0, 5, 0, 31},
- {12, 228, 13, 0, 5, 0, 31},
- {7, 0, 0, 0, 5, 0, 45},
- {12, 0, 13, 0, 5, 0, 45},
- {10, 0, 0, 0, 5, 0, 45},
- {12, 222, 13, 0, 5, 0, 45},
- {12, 230, 13, 0, 5, 0, 45},
- {12, 220, 13, 0, 5, 0, 45},
- {26, 0, 18, 0, 5, 0, 45},
- {21, 0, 18, 0, 5, 0, 45},
- {13, 0, 0, 0, 5, 0, 45},
- {7, 0, 0, 0, 5, 0, 46},
- {7, 0, 0, 0, 5, 0, 55},
- {13, 0, 0, 0, 5, 0, 55},
- {15, 0, 0, 0, 5, 0, 55},
- {26, 0, 18, 0, 5, 0, 55},
- {26, 0, 18, 0, 5, 0, 30},
- {7, 0, 0, 0, 5, 0, 53},
- {12, 230, 13, 0, 5, 0, 53},
- {12, 220, 13, 0, 5, 0, 53},
- {10, 0, 0, 0, 5, 0, 53},
- {12, 0, 13, 0, 5, 0, 53},
- {21, 0, 0, 0, 5, 0, 53},
- {7, 0, 0, 0, 5, 0, 77},
- {10, 0, 0, 0, 5, 0, 77},
- {12, 0, 13, 0, 5, 0, 77},
- {12, 9, 13, 0, 5, 0, 77},
- {12, 230, 13, 0, 5, 0, 77},
- {12, 220, 13, 0, 5, 0, 77},
- {13, 0, 0, 0, 5, 0, 77},
- {21, 0, 0, 0, 5, 0, 77},
- {6, 0, 0, 0, 5, 0, 77},
- {11, 0, 13, 0, 5, 0, 40},
- {12, 0, 13, 0, 5, 0, 61},
- {10, 0, 0, 0, 5, 0, 61},
- {7, 0, 0, 0, 5, 0, 61},
- {12, 7, 13, 0, 5, 0, 61},
- {10, 9, 0, 0, 5, 0, 61},
- {13, 0, 0, 0, 5, 0, 61},
- {21, 0, 0, 0, 5, 0, 61},
- {26, 0, 0, 0, 5, 0, 61},
- {12, 230, 13, 0, 5, 0, 61},
- {12, 220, 13, 0, 5, 0, 61},
- {12, 0, 13, 0, 5, 0, 66},
- {10, 0, 0, 0, 5, 0, 66},
- {7, 0, 0, 0, 5, 0, 66},
- {10, 9, 0, 0, 5, 0, 66},
- {12, 9, 13, 0, 5, 0, 66},
- {13, 0, 0, 0, 5, 0, 66},
- {7, 0, 0, 0, 5, 0, 92},
- {12, 7, 13, 0, 5, 0, 92},
- {10, 0, 0, 0, 5, 0, 92},
- {12, 0, 13, 0, 5, 0, 92},
- {10, 9, 0, 0, 5, 0, 92},
- {21, 0, 0, 0, 5, 0, 92},
- {7, 0, 0, 0, 5, 0, 67},
- {10, 0, 0, 0, 5, 0, 67},
- {12, 0, 13, 0, 5, 0, 67},
- {12, 7, 13, 0, 5, 0, 67},
- {21, 0, 0, 0, 5, 0, 67},
- {13, 0, 0, 0, 5, 0, 67},
- {13, 0, 0, 0, 5, 0, 68},
- {7, 0, 0, 0, 5, 0, 68},
- {6, 0, 0, 0, 5, 0, 68},
- {21, 0, 0, 0, 5, 0, 68},
- {21, 0, 0, 0, 5, 0, 66},
- {12, 1, 13, 0, 5, 0, 40},
- {10, 0, 0, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 0},
- {6, 0, 0, 0, 5, 0, 3},
- {12, 234, 13, 0, 5, 0, 40},
- {12, 214, 13, 0, 5, 0, 40},
- {12, 202, 13, 0, 5, 0, 40},
- {12, 233, 13, 0, 5, 0, 40},
- {8, 0, 0, 0, 5, 0, 2},
- {29, 0, 17, 0, 5, 0, 0},
- {1, 0, 14, 0, 5, 0, 0},
- {1, 0, 14, 0, 5, 0, 40},
- {1, 0, 0, 0, 5, 0, 0},
- {1, 0, 3, 0, 5, 0, 0},
- {17, 0, 18, 0, 4, 0, 0},
- {17, 0, 18, 0, 5, 0, 0},
- {20, 0, 18, 0, 4, 0, 0},
- {19, 0, 18, 0, 4, 0, 0},
+ {7, 0, 0, 0, 5, 0, 12},
+ {6, 0, 0, 0, 5, 3, 12},
+ {12, 234, 13, 0, 5, 40, 21},
+ {12, 214, 13, 0, 5, 40, 21},
+ {12, 202, 13, 0, 5, 40, 21},
+ {12, 233, 13, 0, 5, 40, 21},
+ {8, 0, 0, 0, 5, 2, 12},
+ {24, 0, 18, 0, 5, 2, 18},
+ {29, 0, 17, 0, 5, 0, 17},
+ {29, 0, 17, 0, 5, 0, 4},
+ {1, 0, 14, 0, 5, 0, 20},
+ {1, 0, 14, 0, 5, 40, 21},
+ {1, 0, 14, 0, 5, 40, 41},
+ {1, 0, 0, 0, 5, 0, 21},
+ {1, 0, 3, 0, 5, 0, 21},
+ {17, 0, 18, 0, 4, 0, 17},
+ {17, 0, 18, 0, 5, 0, 4},
+ {17, 0, 18, 0, 5, 0, 17},
+ {17, 0, 18, 0, 4, 0, 19},
+ {17, 0, 18, 0, 4, 0, 29},
+ {20, 0, 18, 0, 4, 0, 3},
+ {19, 0, 18, 0, 4, 0, 3},
{22, 0, 18, 0, 5, 0, 0},
- {20, 0, 18, 0, 5, 0, 0},
- {27, 0, 17, 0, 5, 0, 0},
- {28, 0, 15, 0, 5, 0, 0},
- {1, 0, 1, 0, 5, 0, 0},
- {1, 0, 5, 0, 5, 0, 0},
- {1, 0, 7, 0, 5, 0, 0},
- {1, 0, 2, 0, 5, 0, 0},
- {1, 0, 6, 0, 5, 0, 0},
- {21, 0, 10, 0, 4, 0, 0},
- {21, 0, 10, 0, 5, 0, 0},
- {16, 0, 18, 0, 5, 0, 0},
- {25, 0, 12, 0, 5, 0, 0},
+ {20, 0, 18, 0, 5, 0, 3},
+ {21, 0, 18, 0, 4, 0, 12},
+ {21, 0, 18, 0, 4, 0, 15},
+ {21, 0, 18, 0, 4, 0, 17},
+ {27, 0, 17, 0, 5, 0, 30},
+ {28, 0, 15, 0, 5, 0, 30},
+ {1, 0, 1, 0, 5, 0, 21},
+ {1, 0, 5, 0, 5, 0, 21},
+ {1, 0, 7, 0, 5, 0, 21},
+ {1, 0, 2, 0, 5, 0, 21},
+ {1, 0, 6, 0, 5, 0, 21},
+ {21, 0, 10, 0, 4, 0, 10},
+ {21, 0, 10, 0, 5, 0, 10},
+ {21, 0, 18, 0, 4, 0, 10},
+ {21, 0, 18, 0, 5, 0, 10},
+ {21, 0, 18, 0, 5, 0, 5},
+ {16, 0, 18, 0, 5, 0, 12},
+ {25, 0, 12, 0, 5, 0, 8},
{22, 0, 18, 1, 5, 0, 0},
- {18, 0, 18, 1, 5, 0, 0},
- {25, 0, 18, 0, 5, 0, 0},
- {1, 0, 19, 0, 5, 0, 0},
- {1, 0, 20, 0, 5, 0, 0},
- {1, 0, 21, 0, 5, 0, 0},
- {1, 0, 22, 0, 5, 0, 0},
- {15, 0, 8, 0, 5, 0, 0},
- {25, 0, 9, 0, 5, 0, 0},
- {6, 0, 0, 0, 4, 0, 1},
- {23, 0, 10, 0, 1, 0, 0},
- {9, 0, 0, 0, 5, 0, 0},
- {5, 0, 0, 0, 4, 0, 0},
- {26, 0, 10, 0, 5, 0, 0},
- {25, 0, 18, 1, 5, 0, 0},
- {15, 0, 18, 0, 5, 0, 0},
- {14, 0, 0, 0, 4, 0, 1},
- {14, 0, 0, 0, 5, 0, 1},
- {25, 0, 18, 1, 4, 0, 0},
- {25, 0, 10, 0, 5, 0, 0},
+ {18, 0, 18, 1, 5, 0, 1},
+ {25, 0, 18, 0, 5, 0, 12},
+ {1, 0, 14, 0, 5, 0, 22},
+ {1, 0, 14, 0, 5, 0, 12},
+ {1, 0, 19, 0, 5, 0, 21},
+ {1, 0, 20, 0, 5, 0, 21},
+ {1, 0, 21, 0, 5, 0, 21},
+ {1, 0, 22, 0, 5, 0, 21},
+ {1, 0, 14, 0, 5, 0, 21},
+ {15, 0, 8, 0, 5, 0, 12},
+ {25, 0, 9, 0, 5, 0, 12},
+ {6, 0, 0, 0, 4, 1, 29},
+ {23, 0, 10, 0, 5, 0, 10},
+ {23, 0, 10, 0, 1, 0, 9},
+ {2, 0, 18, 0, 5, 102, 9},
+ {9, 0, 0, 0, 5, 0, 12},
+ {26, 0, 18, 0, 4, 0, 10},
+ {26, 0, 18, 0, 4, 0, 29},
+ {5, 0, 0, 0, 4, 0, 29},
+ {26, 0, 18, 0, 4, 0, 9},
+ {9, 0, 0, 0, 4, 1, 29},
+ {26, 0, 10, 0, 5, 0, 12},
+ {25, 0, 18, 1, 5, 0, 12},
+ {15, 0, 18, 0, 5, 0, 12},
+ {15, 0, 18, 0, 4, 0, 12},
+ {15, 0, 18, 0, 5, 0, 29},
+ {14, 0, 0, 0, 4, 1, 29},
+ {14, 0, 0, 0, 5, 1, 12},
+ {25, 0, 18, 1, 4, 0, 29},
+ {25, 0, 9, 0, 5, 0, 9},
+ {25, 0, 10, 0, 5, 0, 9},
+ {25, 0, 18, 0, 5, 0, 15},
+ {26, 0, 18, 0, 2, 0, 14},
{22, 0, 18, 1, 2, 0, 0},
- {18, 0, 18, 1, 2, 0, 0},
- {26, 0, 0, 0, 4, 0, 0},
- {26, 0, 0, 0, 5, 0, 52},
- {9, 0, 0, 0, 5, 0, 56},
- {5, 0, 0, 0, 5, 0, 56},
- {26, 0, 18, 0, 5, 0, 54},
- {12, 230, 13, 0, 5, 0, 54},
- {21, 0, 18, 0, 5, 0, 54},
- {15, 0, 18, 0, 5, 0, 54},
- {5, 0, 0, 0, 5, 0, 23},
- {7, 0, 0, 0, 5, 0, 57},
- {6, 0, 0, 0, 5, 0, 57},
- {21, 0, 0, 0, 5, 0, 57},
- {12, 9, 13, 0, 5, 0, 57},
- {26, 0, 18, 0, 2, 0, 35},
- {26, 0, 18, 0, 2, 0, 0},
- {29, 0, 17, 0, 0, 0, 0},
- {21, 0, 18, 0, 2, 0, 0},
- {6, 0, 0, 0, 2, 0, 35},
- {7, 0, 0, 0, 2, 0, 0},
- {14, 0, 0, 0, 2, 0, 35},
- {17, 0, 18, 0, 2, 0, 0},
- {22, 0, 18, 0, 2, 0, 0},
- {18, 0, 18, 0, 2, 0, 0},
- {12, 218, 13, 0, 2, 0, 40},
- {12, 228, 13, 0, 2, 0, 40},
- {12, 232, 13, 0, 2, 0, 40},
- {12, 222, 13, 0, 2, 0, 40},
- {10, 224, 0, 0, 2, 0, 24},
- {6, 0, 0, 0, 2, 0, 0},
- {7, 0, 0, 0, 2, 0, 32},
- {12, 8, 13, 0, 2, 0, 40},
- {24, 0, 18, 0, 2, 0, 0},
- {6, 0, 0, 0, 2, 0, 32},
- {7, 0, 0, 0, 2, 0, 33},
- {6, 0, 0, 0, 2, 0, 33},
- {7, 0, 0, 0, 2, 0, 34},
- {26, 0, 0, 0, 2, 0, 0},
- {15, 0, 0, 0, 2, 0, 0},
- {26, 0, 0, 0, 2, 0, 24},
- {26, 0, 18, 0, 2, 0, 24},
- {15, 0, 0, 0, 4, 0, 0},
- {15, 0, 18, 0, 2, 0, 0},
- {26, 0, 0, 0, 2, 0, 33},
- {7, 0, 0, 0, 2, 0, 35},
- {2, 0, 18, 0, 2, 0, 102},
- {7, 0, 0, 0, 2, 0, 36},
- {6, 0, 0, 0, 2, 0, 36},
- {26, 0, 18, 0, 2, 0, 36},
- {7, 0, 0, 0, 5, 0, 82},
- {6, 0, 0, 0, 5, 0, 82},
- {21, 0, 0, 0, 5, 0, 82},
- {7, 0, 0, 0, 5, 0, 69},
- {6, 0, 0, 0, 5, 0, 69},
- {21, 0, 18, 0, 5, 0, 69},
- {13, 0, 0, 0, 5, 0, 69},
- {7, 0, 0, 0, 5, 0, 3},
+ {18, 0, 18, 1, 2, 0, 1},
+ {26, 0, 18, 0, 2, 0, 12},
+ {26, 0, 18, 0, 5, 0, 14},
+ {26, 0, 0, 0, 4, 0, 29},
+ {26, 0, 18, 0, 5, 0, 29},
+ {25, 0, 18, 0, 2, 0, 12},
+ {26, 0, 18, 0, 4, 0, 14},
+ {26, 0, 18, 0, 5, 0, 41},
+ {26, 0, 18, 0, 4, 0, 41},
+ {26, 0, 18, 0, 2, 0, 41},
+ {26, 0, 18, 0, 2, 0, 29},
+ {26, 0, 18, 0, 5, 0, 3},
+ {26, 0, 18, 0, 5, 0, 6},
+ {26, 0, 0, 0, 5, 52, 12},
+ {9, 0, 0, 0, 5, 56, 12},
+ {5, 0, 0, 0, 5, 56, 12},
+ {26, 0, 18, 0, 5, 54, 12},
+ {12, 230, 13, 0, 5, 54, 21},
+ {21, 0, 18, 0, 5, 54, 6},
+ {21, 0, 18, 0, 5, 54, 17},
+ {15, 0, 18, 0, 5, 54, 12},
+ {5, 0, 0, 0, 5, 23, 12},
+ {7, 0, 0, 0, 5, 57, 12},
+ {6, 0, 0, 0, 5, 57, 12},
+ {21, 0, 0, 0, 5, 57, 17},
+ {12, 9, 13, 0, 5, 57, 21},
{21, 0, 18, 0, 5, 0, 3},
- {6, 0, 18, 0, 5, 0, 3},
- {7, 0, 0, 0, 5, 0, 83},
- {14, 0, 0, 0, 5, 0, 83},
- {12, 230, 13, 0, 5, 0, 83},
- {21, 0, 0, 0, 5, 0, 83},
- {24, 0, 0, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 58},
- {12, 0, 13, 0, 5, 0, 58},
- {12, 9, 13, 0, 5, 0, 58},
- {10, 0, 0, 0, 5, 0, 58},
- {26, 0, 18, 0, 5, 0, 58},
- {15, 0, 0, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 64},
- {21, 0, 18, 0, 5, 0, 64},
- {10, 0, 0, 0, 5, 0, 70},
- {7, 0, 0, 0, 5, 0, 70},
- {12, 9, 13, 0, 5, 0, 70},
- {21, 0, 0, 0, 5, 0, 70},
- {13, 0, 0, 0, 5, 0, 70},
- {13, 0, 0, 0, 5, 0, 71},
- {7, 0, 0, 0, 5, 0, 71},
- {12, 0, 13, 0, 5, 0, 71},
- {12, 220, 13, 0, 5, 0, 71},
- {21, 0, 0, 0, 5, 0, 71},
- {7, 0, 0, 0, 5, 0, 72},
- {12, 0, 13, 0, 5, 0, 72},
- {10, 0, 0, 0, 5, 0, 72},
- {10, 9, 0, 0, 5, 0, 72},
- {21, 0, 0, 0, 5, 0, 72},
- {12, 0, 13, 0, 5, 0, 84},
- {10, 0, 0, 0, 5, 0, 84},
- {7, 0, 0, 0, 5, 0, 84},
- {12, 7, 13, 0, 5, 0, 84},
- {10, 9, 0, 0, 5, 0, 84},
- {21, 0, 0, 0, 5, 0, 84},
- {13, 0, 0, 0, 5, 0, 84},
- {6, 0, 0, 0, 5, 0, 22},
- {7, 0, 0, 0, 5, 0, 76},
- {12, 0, 13, 0, 5, 0, 76},
- {10, 0, 0, 0, 5, 0, 76},
- {13, 0, 0, 0, 5, 0, 76},
- {21, 0, 0, 0, 5, 0, 76},
- {7, 0, 0, 0, 5, 0, 78},
- {12, 230, 13, 0, 5, 0, 78},
- {12, 220, 13, 0, 5, 0, 78},
- {6, 0, 0, 0, 5, 0, 78},
- {21, 0, 0, 0, 5, 0, 78},
- {7, 0, 0, 0, 5, 0, 85},
- {10, 0, 0, 0, 5, 0, 85},
- {12, 0, 13, 0, 5, 0, 85},
- {21, 0, 0, 0, 5, 0, 85},
- {6, 0, 0, 0, 5, 0, 85},
- {12, 9, 13, 0, 5, 0, 85},
- {13, 0, 0, 0, 5, 0, 85},
- {4, 0, 0, 0, 5, 0, 102},
- {3, 0, 0, 0, 4, 0, 102},
- {12, 26, 13, 0, 5, 0, 5},
- {25, 0, 9, 0, 5, 0, 5},
- {24, 0, 4, 0, 5, 0, 6},
- {18, 0, 18, 0, 5, 0, 0},
- {16, 0, 18, 0, 2, 0, 0},
- {21, 0, 12, 0, 2, 0, 0},
- {21, 0, 10, 0, 2, 0, 0},
- {25, 0, 9, 0, 2, 0, 0},
- {17, 0, 9, 0, 2, 0, 0},
- {25, 0, 18, 1, 2, 0, 0},
- {25, 0, 18, 0, 2, 0, 0},
- {23, 0, 10, 0, 2, 0, 0},
- {21, 0, 18, 0, 0, 0, 0},
- {21, 0, 10, 0, 0, 0, 0},
- {23, 0, 10, 0, 0, 0, 0},
+ {21, 0, 18, 0, 5, 0, 0},
+ {17, 0, 18, 0, 5, 0, 12},
+ {17, 0, 18, 0, 5, 0, 19},
+ {26, 0, 18, 0, 2, 35, 14},
+ {29, 0, 17, 0, 0, 0, 17},
+ {21, 0, 18, 0, 2, 0, 1},
+ {21, 0, 18, 0, 2, 0, 14},
+ {6, 0, 0, 0, 2, 35, 5},
+ {7, 0, 0, 0, 2, 0, 14},
+ {14, 0, 0, 0, 2, 35, 14},
+ {17, 0, 18, 0, 2, 0, 5},
+ {22, 0, 18, 0, 2, 0, 0},
+ {18, 0, 18, 0, 2, 0, 1},
+ {12, 218, 13, 0, 2, 40, 21},
+ {12, 228, 13, 0, 2, 40, 21},
+ {12, 232, 13, 0, 2, 40, 21},
+ {12, 222, 13, 0, 2, 40, 21},
+ {10, 224, 0, 0, 2, 24, 21},
+ {17, 0, 18, 0, 2, 0, 14},
+ {6, 0, 0, 0, 2, 0, 14},
+ {6, 0, 0, 0, 2, 0, 21},
+ {7, 0, 0, 0, 2, 0, 5},
+ {7, 0, 0, 0, 2, 32, 32},
+ {7, 0, 0, 0, 2, 32, 14},
+ {12, 8, 13, 0, 2, 40, 21},
+ {24, 0, 18, 0, 2, 0, 5},
+ {6, 0, 0, 0, 2, 32, 5},
+ {7, 0, 0, 0, 2, 33, 32},
+ {7, 0, 0, 0, 2, 33, 14},
+ {21, 0, 18, 0, 2, 0, 5},
+ {6, 0, 0, 0, 2, 0, 32},
+ {6, 0, 0, 0, 2, 33, 5},
+ {7, 0, 0, 0, 2, 34, 14},
+ {7, 0, 0, 0, 2, 24, 14},
+ {26, 0, 0, 0, 2, 0, 14},
+ {15, 0, 0, 0, 2, 0, 14},
+ {26, 0, 0, 0, 2, 24, 14},
+ {26, 0, 18, 0, 2, 24, 14},
+ {15, 0, 0, 0, 4, 0, 29},
+ {15, 0, 18, 0, 2, 0, 14},
+ {26, 0, 0, 0, 2, 33, 14},
+ {7, 0, 0, 0, 2, 35, 14},
+ {2, 0, 18, 0, 2, 102, 14},
+ {7, 0, 0, 0, 2, 36, 14},
+ {6, 0, 0, 0, 2, 36, 5},
+ {26, 0, 18, 0, 2, 36, 14},
+ {7, 0, 0, 0, 5, 82, 12},
+ {6, 0, 0, 0, 5, 82, 12},
+ {21, 0, 0, 0, 5, 82, 17},
+ {7, 0, 0, 0, 5, 69, 12},
+ {6, 0, 0, 0, 5, 69, 12},
+ {21, 0, 18, 0, 5, 69, 17},
+ {21, 0, 18, 0, 5, 69, 6},
+ {13, 0, 0, 0, 5, 69, 11},
+ {7, 0, 0, 0, 5, 3, 12},
+ {21, 0, 18, 0, 5, 3, 12},
+ {6, 0, 18, 0, 5, 3, 12},
+ {7, 0, 0, 0, 5, 83, 12},
+ {14, 0, 0, 0, 5, 83, 12},
+ {12, 230, 13, 0, 5, 83, 21},
+ {21, 0, 0, 0, 5, 83, 12},
+ {21, 0, 0, 0, 5, 83, 17},
+ {24, 0, 0, 0, 5, 0, 12},
+ {7, 0, 0, 0, 5, 58, 12},
+ {12, 0, 13, 0, 5, 58, 21},
+ {12, 9, 13, 0, 5, 58, 21},
+ {10, 0, 0, 0, 5, 58, 21},
+ {26, 0, 18, 0, 5, 58, 12},
+ {15, 0, 0, 0, 5, 0, 12},
+ {7, 0, 0, 0, 5, 64, 12},
+ {21, 0, 18, 0, 5, 64, 18},
+ {21, 0, 18, 0, 5, 64, 6},
+ {10, 0, 0, 0, 5, 70, 21},
+ {7, 0, 0, 0, 5, 70, 12},
+ {12, 9, 13, 0, 5, 70, 21},
+ {12, 0, 13, 0, 5, 70, 21},
+ {21, 0, 0, 0, 5, 70, 17},
+ {13, 0, 0, 0, 5, 70, 11},
+ {21, 0, 0, 0, 5, 9, 18},
+ {13, 0, 0, 0, 5, 71, 11},
+ {7, 0, 0, 0, 5, 71, 12},
+ {12, 0, 13, 0, 5, 71, 21},
+ {12, 220, 13, 0, 5, 71, 21},
+ {21, 0, 0, 0, 5, 71, 17},
+ {7, 0, 0, 0, 5, 72, 12},
+ {12, 0, 13, 0, 5, 72, 21},
+ {10, 0, 0, 0, 5, 72, 21},
+ {10, 9, 0, 0, 5, 72, 21},
+ {21, 0, 0, 0, 5, 72, 12},
+ {12, 0, 13, 0, 5, 84, 21},
+ {10, 0, 0, 0, 5, 84, 21},
+ {7, 0, 0, 0, 5, 84, 12},
+ {12, 7, 13, 0, 5, 84, 21},
+ {10, 9, 0, 0, 5, 84, 21},
+ {21, 0, 0, 0, 5, 84, 12},
+ {21, 0, 0, 0, 5, 84, 17},
+ {13, 0, 0, 0, 5, 84, 11},
+ {6, 0, 0, 0, 5, 22, 38},
+ {7, 0, 0, 0, 5, 76, 12},
+ {12, 0, 13, 0, 5, 76, 21},
+ {10, 0, 0, 0, 5, 76, 21},
+ {13, 0, 0, 0, 5, 76, 11},
+ {21, 0, 0, 0, 5, 76, 12},
+ {21, 0, 0, 0, 5, 76, 17},
+ {7, 0, 0, 0, 5, 78, 38},
+ {12, 230, 13, 0, 5, 78, 38},
+ {12, 220, 13, 0, 5, 78, 38},
+ {6, 0, 0, 0, 5, 78, 38},
+ {21, 0, 0, 0, 5, 78, 38},
+ {7, 0, 0, 0, 5, 85, 12},
+ {10, 0, 0, 0, 5, 85, 21},
+ {12, 0, 13, 0, 5, 85, 21},
+ {21, 0, 0, 0, 5, 85, 17},
+ {6, 0, 0, 0, 5, 85, 12},
+ {12, 9, 13, 0, 5, 85, 21},
+ {13, 0, 0, 0, 5, 85, 11},
+ {7, 0, 0, 0, 2, 24, 23},
+ {7, 0, 0, 0, 2, 24, 24},
+ {4, 0, 0, 0, 5, 102, 39},
+ {3, 0, 0, 0, 4, 102, 41},
+ {12, 26, 13, 0, 5, 5, 21},
+ {25, 0, 9, 0, 5, 5, 12},
+ {24, 0, 4, 0, 5, 6, 12},
+ {18, 0, 18, 0, 5, 0, 1},
+ {12, 0, 13, 0, 4, 40, 21},
+ {21, 0, 18, 0, 2, 0, 8},
+ {21, 0, 18, 0, 2, 0, 6},
+ {21, 0, 18, 0, 2, 0, 15},
+ {16, 0, 18, 0, 2, 0, 14},
+ {21, 0, 12, 0, 2, 0, 1},
+ {21, 0, 12, 0, 2, 0, 5},
+ {21, 0, 10, 0, 2, 0, 14},
+ {25, 0, 9, 0, 2, 0, 14},
+ {17, 0, 9, 0, 2, 0, 14},
+ {25, 0, 18, 1, 2, 0, 14},
+ {25, 0, 18, 0, 2, 0, 14},
+ {23, 0, 10, 0, 2, 0, 9},
+ {21, 0, 10, 0, 2, 0, 10},
+ {21, 0, 18, 0, 0, 0, 6},
+ {21, 0, 18, 0, 0, 0, 14},
+ {21, 0, 10, 0, 0, 0, 14},
+ {23, 0, 10, 0, 0, 0, 9},
+ {21, 0, 10, 0, 0, 0, 10},
{22, 0, 18, 1, 0, 0, 0},
- {18, 0, 18, 1, 0, 0, 0},
- {25, 0, 9, 0, 0, 0, 0},
- {21, 0, 12, 0, 0, 0, 0},
- {17, 0, 9, 0, 0, 0, 0},
- {13, 0, 8, 0, 0, 0, 0},
- {25, 0, 18, 1, 0, 0, 0},
- {25, 0, 18, 0, 0, 0, 0},
- {9, 0, 0, 0, 0, 0, 1},
- {24, 0, 18, 0, 0, 0, 0},
- {16, 0, 18, 0, 0, 0, 0},
- {5, 0, 0, 0, 0, 0, 1},
- {21, 0, 18, 0, 1, 0, 0},
+ {18, 0, 18, 1, 0, 0, 1},
+ {25, 0, 9, 0, 0, 0, 14},
+ {21, 0, 12, 0, 0, 0, 1},
+ {17, 0, 9, 0, 0, 0, 14},
+ {21, 0, 12, 0, 0, 0, 14},
+ {13, 0, 8, 0, 0, 0, 14},
+ {21, 0, 12, 0, 0, 0, 5},
+ {21, 0, 18, 0, 0, 0, 5},
+ {25, 0, 18, 1, 0, 0, 14},
+ {25, 0, 18, 0, 0, 0, 14},
+ {9, 0, 0, 0, 0, 1, 14},
+ {24, 0, 18, 0, 0, 0, 14},
+ {16, 0, 18, 0, 0, 0, 14},
+ {5, 0, 0, 0, 0, 1, 14},
+ {21, 0, 18, 0, 1, 0, 1},
{22, 0, 18, 1, 1, 0, 0},
- {18, 0, 18, 1, 1, 0, 0},
- {7, 0, 0, 0, 1, 0, 33},
- {6, 0, 0, 0, 1, 0, 0},
- {7, 0, 0, 0, 1, 0, 24},
- {26, 0, 18, 0, 0, 0, 0},
- {26, 0, 18, 0, 1, 0, 0},
- {25, 0, 18, 0, 1, 0, 0},
- {1, 0, 18, 0, 5, 0, 0},
- {7, 0, 0, 0, 5, 0, 47},
- {14, 0, 18, 0, 5, 0, 2},
- {15, 0, 18, 0, 5, 0, 2},
- {26, 0, 18, 0, 5, 0, 2},
- {7, 0, 0, 0, 5, 0, 73},
- {7, 0, 0, 0, 5, 0, 74},
- {7, 0, 0, 0, 5, 0, 37},
- {15, 0, 0, 0, 5, 0, 37},
- {7, 0, 0, 0, 5, 0, 38},
- {14, 0, 0, 0, 5, 0, 38},
- {7, 0, 0, 0, 5, 0, 118},
- {12, 230, 13, 0, 5, 0, 118},
- {7, 0, 0, 0, 5, 0, 48},
- {21, 0, 0, 0, 5, 0, 48},
- {7, 0, 0, 0, 5, 0, 59},
- {21, 0, 0, 0, 5, 0, 59},
- {14, 0, 0, 0, 5, 0, 59},
- {9, 0, 0, 0, 5, 0, 39},
- {5, 0, 0, 0, 5, 0, 39},
- {7, 0, 0, 0, 5, 0, 49},
- {7, 0, 0, 0, 5, 0, 50},
- {13, 0, 0, 0, 5, 0, 50},
- {7, 0, 0, 0, 5, 0, 106},
- {7, 0, 0, 0, 5, 0, 104},
- {21, 0, 0, 0, 5, 0, 104},
- {7, 0, 0, 0, 5, 0, 110},
- {7, 0, 3, 0, 5, 0, 51},
- {7, 0, 3, 0, 5, 0, 86},
- {21, 0, 3, 0, 5, 0, 86},
- {15, 0, 3, 0, 5, 0, 86},
- {7, 0, 3, 0, 5, 0, 120},
- {26, 0, 3, 0, 5, 0, 120},
- {15, 0, 3, 0, 5, 0, 120},
- {7, 0, 3, 0, 5, 0, 116},
- {15, 0, 3, 0, 5, 0, 116},
- {7, 0, 3, 0, 5, 0, 128},
- {15, 0, 3, 0, 5, 0, 128},
- {7, 0, 3, 0, 5, 0, 63},
- {15, 0, 3, 0, 5, 0, 63},
- {21, 0, 18, 0, 5, 0, 63},
- {7, 0, 3, 0, 5, 0, 75},
- {21, 0, 3, 0, 5, 0, 75},
- {7, 0, 3, 0, 5, 0, 97},
- {7, 0, 3, 0, 5, 0, 96},
- {15, 0, 3, 0, 5, 0, 96},
- {7, 0, 3, 0, 5, 0, 60},
- {12, 0, 13, 0, 5, 0, 60},
- {12, 220, 13, 0, 5, 0, 60},
- {12, 230, 13, 0, 5, 0, 60},
- {12, 1, 13, 0, 5, 0, 60},
- {12, 9, 13, 0, 5, 0, 60},
- {15, 0, 3, 0, 5, 0, 60},
- {21, 0, 3, 0, 5, 0, 60},
- {7, 0, 3, 0, 5, 0, 87},
- {15, 0, 3, 0, 5, 0, 87},
- {21, 0, 3, 0, 5, 0, 87},
- {7, 0, 3, 0, 5, 0, 117},
- {15, 0, 3, 0, 5, 0, 117},
- {7, 0, 3, 0, 5, 0, 112},
- {26, 0, 3, 0, 5, 0, 112},
- {12, 230, 13, 0, 5, 0, 112},
- {12, 220, 13, 0, 5, 0, 112},
- {15, 0, 3, 0, 5, 0, 112},
- {21, 0, 3, 0, 5, 0, 112},
- {7, 0, 3, 0, 5, 0, 79},
- {21, 0, 18, 0, 5, 0, 79},
- {7, 0, 3, 0, 5, 0, 88},
- {15, 0, 3, 0, 5, 0, 88},
- {7, 0, 3, 0, 5, 0, 89},
- {15, 0, 3, 0, 5, 0, 89},
- {7, 0, 3, 0, 5, 0, 122},
- {21, 0, 3, 0, 5, 0, 122},
- {15, 0, 3, 0, 5, 0, 122},
- {7, 0, 3, 0, 5, 0, 90},
- {9, 0, 3, 0, 5, 0, 130},
- {5, 0, 3, 0, 5, 0, 130},
- {15, 0, 3, 0, 5, 0, 130},
- {15, 0, 11, 0, 5, 0, 6},
- {10, 0, 0, 0, 5, 0, 93},
- {12, 0, 13, 0, 5, 0, 93},
- {7, 0, 0, 0, 5, 0, 93},
- {12, 9, 13, 0, 5, 0, 93},
- {21, 0, 0, 0, 5, 0, 93},
- {15, 0, 18, 0, 5, 0, 93},
- {13, 0, 0, 0, 5, 0, 93},
- {12, 0, 13, 0, 5, 0, 91},
- {10, 0, 0, 0, 5, 0, 91},
- {7, 0, 0, 0, 5, 0, 91},
- {12, 9, 13, 0, 5, 0, 91},
- {12, 7, 13, 0, 5, 0, 91},
- {21, 0, 0, 0, 5, 0, 91},
- {1, 0, 0, 0, 5, 0, 91},
- {7, 0, 0, 0, 5, 0, 100},
- {13, 0, 0, 0, 5, 0, 100},
- {12, 230, 13, 0, 5, 0, 95},
- {7, 0, 0, 0, 5, 0, 95},
- {12, 0, 13, 0, 5, 0, 95},
- {10, 0, 0, 0, 5, 0, 95},
- {12, 9, 13, 0, 5, 0, 95},
- {13, 0, 0, 0, 5, 0, 95},
- {21, 0, 0, 0, 5, 0, 95},
- {7, 0, 0, 0, 5, 0, 111},
- {12, 7, 13, 0, 5, 0, 111},
- {21, 0, 0, 0, 5, 0, 111},
- {12, 0, 13, 0, 5, 0, 99},
- {10, 0, 0, 0, 5, 0, 99},
- {7, 0, 0, 0, 5, 0, 99},
- {10, 9, 0, 0, 5, 0, 99},
- {21, 0, 0, 0, 5, 0, 99},
- {12, 7, 13, 0, 5, 0, 99},
- {13, 0, 0, 0, 5, 0, 99},
- {15, 0, 0, 0, 5, 0, 18},
- {7, 0, 0, 0, 5, 0, 108},
- {10, 0, 0, 0, 5, 0, 108},
- {12, 0, 13, 0, 5, 0, 108},
- {10, 9, 0, 0, 5, 0, 108},
- {12, 7, 13, 0, 5, 0, 108},
- {21, 0, 0, 0, 5, 0, 108},
- {7, 0, 0, 0, 5, 0, 129},
- {21, 0, 0, 0, 5, 0, 129},
- {7, 0, 0, 0, 5, 0, 109},
- {12, 0, 13, 0, 5, 0, 109},
- {10, 0, 0, 0, 5, 0, 109},
- {12, 7, 13, 0, 5, 0, 109},
- {12, 9, 13, 0, 5, 0, 109},
- {13, 0, 0, 0, 5, 0, 109},
- {12, 0, 13, 0, 5, 0, 107},
- {10, 0, 0, 0, 5, 0, 107},
- {7, 0, 0, 0, 5, 0, 107},
- {12, 7, 13, 0, 5, 0, 107},
- {10, 9, 0, 0, 5, 0, 107},
- {12, 230, 13, 0, 5, 0, 107},
- {7, 0, 0, 0, 5, 0, 124},
- {10, 0, 0, 0, 5, 0, 124},
- {12, 0, 13, 0, 5, 0, 124},
- {12, 9, 13, 0, 5, 0, 124},
- {12, 7, 13, 0, 5, 0, 124},
- {21, 0, 0, 0, 5, 0, 124},
- {13, 0, 0, 0, 5, 0, 124},
- {7, 0, 0, 0, 5, 0, 123},
- {10, 0, 0, 0, 5, 0, 123},
- {12, 0, 13, 0, 5, 0, 123},
- {12, 9, 13, 0, 5, 0, 123},
- {12, 7, 13, 0, 5, 0, 123},
- {21, 0, 0, 0, 5, 0, 123},
- {7, 0, 0, 0, 5, 0, 114},
- {10, 0, 0, 0, 5, 0, 114},
- {12, 0, 13, 0, 5, 0, 114},
- {12, 9, 13, 0, 5, 0, 114},
- {21, 0, 0, 0, 5, 0, 114},
- {13, 0, 0, 0, 5, 0, 114},
- {7, 0, 0, 0, 5, 0, 101},
- {12, 0, 13, 0, 5, 0, 101},
- {10, 0, 0, 0, 5, 0, 101},
- {10, 9, 0, 0, 5, 0, 101},
- {12, 7, 13, 0, 5, 0, 101},
- {13, 0, 0, 0, 5, 0, 101},
- {7, 0, 0, 0, 5, 0, 126},
- {12, 0, 13, 0, 5, 0, 126},
- {10, 0, 0, 0, 5, 0, 126},
- {12, 9, 13, 0, 5, 0, 126},
- {13, 0, 0, 0, 5, 0, 126},
- {15, 0, 0, 0, 5, 0, 126},
- {21, 0, 0, 0, 5, 0, 126},
- {26, 0, 0, 0, 5, 0, 126},
- {9, 0, 0, 0, 5, 0, 125},
- {5, 0, 0, 0, 5, 0, 125},
- {13, 0, 0, 0, 5, 0, 125},
- {15, 0, 0, 0, 5, 0, 125},
- {7, 0, 0, 0, 5, 0, 125},
- {7, 0, 0, 0, 5, 0, 121},
- {7, 0, 0, 0, 5, 0, 62},
- {14, 0, 0, 0, 5, 0, 62},
- {21, 0, 0, 0, 5, 0, 62},
- {7, 0, 0, 0, 5, 0, 80},
- {7, 0, 0, 0, 5, 0, 127},
- {7, 0, 0, 0, 5, 0, 115},
- {13, 0, 0, 0, 5, 0, 115},
- {21, 0, 0, 0, 5, 0, 115},
- {7, 0, 0, 0, 5, 0, 103},
- {12, 1, 13, 0, 5, 0, 103},
- {21, 0, 0, 0, 5, 0, 103},
- {7, 0, 0, 0, 5, 0, 119},
- {12, 230, 13, 0, 5, 0, 119},
- {21, 0, 0, 0, 5, 0, 119},
- {26, 0, 0, 0, 5, 0, 119},
- {6, 0, 0, 0, 5, 0, 119},
- {13, 0, 0, 0, 5, 0, 119},
- {15, 0, 0, 0, 5, 0, 119},
- {7, 0, 0, 0, 5, 0, 98},
- {10, 0, 0, 0, 5, 0, 98},
- {12, 0, 13, 0, 5, 0, 98},
- {6, 0, 0, 0, 5, 0, 98},
- {7, 0, 0, 0, 5, 0, 105},
- {26, 0, 0, 0, 5, 0, 105},
- {12, 0, 13, 0, 5, 0, 105},
- {12, 1, 13, 0, 5, 0, 105},
- {21, 0, 0, 0, 5, 0, 105},
- {10, 216, 0, 0, 5, 0, 0},
- {10, 226, 0, 0, 5, 0, 0},
- {12, 230, 13, 0, 5, 0, 2},
- {25, 0, 0, 0, 5, 0, 0},
- {13, 0, 8, 0, 5, 0, 0},
- {26, 0, 0, 0, 5, 0, 131},
- {12, 0, 13, 0, 5, 0, 131},
- {21, 0, 0, 0, 5, 0, 131},
- {7, 0, 3, 0, 5, 0, 113},
- {15, 0, 3, 0, 5, 0, 113},
- {12, 220, 13, 0, 5, 0, 113},
- {26, 0, 0, 0, 2, 0, 32},
+ {18, 0, 18, 1, 1, 0, 1},
+ {21, 0, 18, 0, 1, 0, 5},
+ {7, 0, 0, 0, 1, 33, 14},
+ {7, 0, 0, 0, 1, 33, 32},
+ {6, 0, 0, 0, 1, 0, 32},
+ {6, 0, 0, 0, 1, 0, 5},
+ {7, 0, 0, 0, 1, 24, 14},
+ {23, 0, 10, 0, 0, 0, 10},
+ {26, 0, 18, 0, 0, 0, 14},
+ {26, 0, 18, 0, 1, 0, 12},
+ {25, 0, 18, 0, 1, 0, 12},
+ {1, 0, 18, 0, 5, 0, 21},
+ {26, 0, 18, 0, 5, 0, 31},
+ {7, 0, 0, 0, 5, 47, 12},
+ {14, 0, 18, 0, 5, 2, 12},
+ {15, 0, 18, 0, 5, 2, 12},
+ {26, 0, 18, 0, 5, 2, 12},
+ {26, 0, 0, 0, 5, 2, 12},
+ {7, 0, 0, 0, 5, 73, 12},
+ {7, 0, 0, 0, 5, 74, 12},
+ {7, 0, 0, 0, 5, 37, 12},
+ {15, 0, 0, 0, 5, 37, 12},
+ {7, 0, 0, 0, 5, 38, 12},
+ {14, 0, 0, 0, 5, 38, 12},
+ {7, 0, 0, 0, 5, 118, 12},
+ {12, 230, 13, 0, 5, 118, 21},
+ {7, 0, 0, 0, 5, 48, 12},
+ {21, 0, 0, 0, 5, 48, 17},
+ {7, 0, 0, 0, 5, 59, 12},
+ {21, 0, 0, 0, 5, 59, 17},
+ {14, 0, 0, 0, 5, 59, 12},
+ {9, 0, 0, 0, 5, 39, 12},
+ {5, 0, 0, 0, 5, 39, 12},
+ {7, 0, 0, 0, 5, 49, 12},
+ {7, 0, 0, 0, 5, 50, 12},
+ {13, 0, 0, 0, 5, 50, 11},
+ {9, 0, 0, 0, 5, 136, 12},
+ {5, 0, 0, 0, 5, 136, 12},
+ {7, 0, 0, 0, 5, 106, 12},
+ {7, 0, 0, 0, 5, 104, 12},
+ {21, 0, 0, 0, 5, 104, 12},
+ {7, 0, 0, 0, 5, 110, 12},
+ {7, 0, 3, 0, 5, 51, 12},
+ {7, 0, 3, 0, 5, 86, 12},
+ {21, 0, 3, 0, 5, 86, 17},
+ {15, 0, 3, 0, 5, 86, 12},
+ {7, 0, 3, 0, 5, 120, 12},
+ {26, 0, 3, 0, 5, 120, 12},
+ {15, 0, 3, 0, 5, 120, 12},
+ {7, 0, 3, 0, 5, 116, 12},
+ {15, 0, 3, 0, 5, 116, 12},
+ {7, 0, 3, 0, 5, 128, 12},
+ {15, 0, 3, 0, 5, 128, 12},
+ {7, 0, 3, 0, 5, 63, 12},
+ {15, 0, 3, 0, 5, 63, 12},
+ {21, 0, 18, 0, 5, 63, 17},
+ {7, 0, 3, 0, 5, 75, 12},
+ {21, 0, 3, 0, 5, 75, 12},
+ {7, 0, 3, 0, 5, 97, 12},
+ {7, 0, 3, 0, 5, 96, 12},
+ {15, 0, 3, 0, 5, 96, 12},
+ {7, 0, 3, 0, 5, 60, 12},
+ {12, 0, 13, 0, 5, 60, 21},
+ {12, 220, 13, 0, 5, 60, 21},
+ {12, 230, 13, 0, 5, 60, 21},
+ {12, 1, 13, 0, 5, 60, 21},
+ {12, 9, 13, 0, 5, 60, 21},
+ {15, 0, 3, 0, 5, 60, 12},
+ {21, 0, 3, 0, 5, 60, 17},
+ {21, 0, 3, 0, 5, 60, 12},
+ {7, 0, 3, 0, 5, 87, 12},
+ {15, 0, 3, 0, 5, 87, 12},
+ {21, 0, 3, 0, 5, 87, 12},
+ {7, 0, 3, 0, 5, 117, 12},
+ {15, 0, 3, 0, 5, 117, 12},
+ {7, 0, 3, 0, 5, 112, 12},
+ {26, 0, 3, 0, 5, 112, 12},
+ {12, 230, 13, 0, 5, 112, 21},
+ {12, 220, 13, 0, 5, 112, 21},
+ {15, 0, 3, 0, 5, 112, 12},
+ {21, 0, 3, 0, 5, 112, 17},
+ {21, 0, 3, 0, 5, 112, 15},
+ {7, 0, 3, 0, 5, 79, 12},
+ {21, 0, 18, 0, 5, 79, 17},
+ {7, 0, 3, 0, 5, 88, 12},
+ {15, 0, 3, 0, 5, 88, 12},
+ {7, 0, 3, 0, 5, 89, 12},
+ {15, 0, 3, 0, 5, 89, 12},
+ {7, 0, 3, 0, 5, 122, 12},
+ {21, 0, 3, 0, 5, 122, 12},
+ {15, 0, 3, 0, 5, 122, 12},
+ {7, 0, 3, 0, 5, 90, 12},
+ {9, 0, 3, 0, 5, 130, 12},
+ {5, 0, 3, 0, 5, 130, 12},
+ {15, 0, 3, 0, 5, 130, 12},
+ {15, 0, 11, 0, 5, 6, 12},
+ {10, 0, 0, 0, 5, 93, 21},
+ {12, 0, 13, 0, 5, 93, 21},
+ {7, 0, 0, 0, 5, 93, 12},
+ {12, 9, 13, 0, 5, 93, 21},
+ {21, 0, 0, 0, 5, 93, 17},
+ {21, 0, 0, 0, 5, 93, 12},
+ {15, 0, 18, 0, 5, 93, 12},
+ {13, 0, 0, 0, 5, 93, 11},
+ {12, 0, 13, 0, 5, 91, 21},
+ {10, 0, 0, 0, 5, 91, 21},
+ {7, 0, 0, 0, 5, 91, 12},
+ {12, 9, 13, 0, 5, 91, 21},
+ {12, 7, 13, 0, 5, 91, 21},
+ {21, 0, 0, 0, 5, 91, 12},
+ {1, 0, 0, 0, 5, 91, 12},
+ {21, 0, 0, 0, 5, 91, 17},
+ {7, 0, 0, 0, 5, 100, 12},
+ {13, 0, 0, 0, 5, 100, 11},
+ {12, 230, 13, 0, 5, 95, 21},
+ {7, 0, 0, 0, 5, 95, 12},
+ {12, 0, 13, 0, 5, 95, 21},
+ {10, 0, 0, 0, 5, 95, 21},
+ {12, 9, 13, 0, 5, 95, 21},
+ {13, 0, 0, 0, 5, 95, 11},
+ {21, 0, 0, 0, 5, 95, 17},
+ {7, 0, 0, 0, 5, 111, 12},
+ {12, 7, 13, 0, 5, 111, 21},
+ {21, 0, 0, 0, 5, 111, 12},
+ {21, 0, 0, 0, 5, 111, 18},
+ {12, 0, 13, 0, 5, 99, 21},
+ {10, 0, 0, 0, 5, 99, 21},
+ {7, 0, 0, 0, 5, 99, 12},
+ {10, 9, 0, 0, 5, 99, 21},
+ {21, 0, 0, 0, 5, 99, 17},
+ {21, 0, 0, 0, 5, 99, 12},
+ {12, 7, 13, 0, 5, 99, 21},
+ {13, 0, 0, 0, 5, 99, 11},
+ {21, 0, 0, 0, 5, 99, 18},
+ {15, 0, 0, 0, 5, 18, 12},
+ {7, 0, 0, 0, 5, 108, 12},
+ {10, 0, 0, 0, 5, 108, 21},
+ {12, 0, 13, 0, 5, 108, 21},
+ {10, 9, 0, 0, 5, 108, 21},
+ {12, 7, 13, 0, 5, 108, 21},
+ {21, 0, 0, 0, 5, 108, 17},
+ {21, 0, 0, 0, 5, 108, 12},
+ {7, 0, 0, 0, 5, 129, 12},
+ {21, 0, 0, 0, 5, 129, 17},
+ {7, 0, 0, 0, 5, 109, 12},
+ {12, 0, 13, 0, 5, 109, 21},
+ {10, 0, 0, 0, 5, 109, 21},
+ {12, 7, 13, 0, 5, 109, 21},
+ {12, 9, 13, 0, 5, 109, 21},
+ {13, 0, 0, 0, 5, 109, 11},
+ {12, 0, 13, 0, 5, 107, 21},
+ {10, 0, 0, 0, 5, 107, 21},
+ {7, 0, 0, 0, 5, 107, 12},
+ {12, 7, 13, 0, 5, 107, 21},
+ {10, 9, 0, 0, 5, 107, 21},
+ {12, 230, 13, 0, 5, 107, 21},
+ {7, 0, 0, 0, 5, 135, 12},
+ {10, 0, 0, 0, 5, 135, 21},
+ {12, 0, 13, 0, 5, 135, 21},
+ {12, 9, 13, 0, 5, 135, 21},
+ {12, 7, 13, 0, 5, 135, 21},
+ {21, 0, 0, 0, 5, 135, 17},
+ {21, 0, 0, 0, 5, 135, 12},
+ {13, 0, 0, 0, 5, 135, 11},
+ {7, 0, 0, 0, 5, 124, 12},
+ {10, 0, 0, 0, 5, 124, 21},
+ {12, 0, 13, 0, 5, 124, 21},
+ {12, 9, 13, 0, 5, 124, 21},
+ {12, 7, 13, 0, 5, 124, 21},
+ {21, 0, 0, 0, 5, 124, 12},
+ {13, 0, 0, 0, 5, 124, 11},
+ {7, 0, 0, 0, 5, 123, 12},
+ {10, 0, 0, 0, 5, 123, 21},
+ {12, 0, 13, 0, 5, 123, 21},
+ {12, 9, 13, 0, 5, 123, 21},
+ {12, 7, 13, 0, 5, 123, 21},
+ {21, 0, 0, 0, 5, 123, 18},
+ {21, 0, 0, 0, 5, 123, 17},
+ {21, 0, 0, 0, 5, 123, 6},
+ {21, 0, 0, 0, 5, 123, 12},
+ {7, 0, 0, 0, 5, 114, 12},
+ {10, 0, 0, 0, 5, 114, 21},
+ {12, 0, 13, 0, 5, 114, 21},
+ {12, 9, 13, 0, 5, 114, 21},
+ {21, 0, 0, 0, 5, 114, 17},
+ {21, 0, 0, 0, 5, 114, 12},
+ {13, 0, 0, 0, 5, 114, 11},
+ {21, 0, 18, 0, 5, 31, 18},
+ {7, 0, 0, 0, 5, 101, 12},
+ {12, 0, 13, 0, 5, 101, 21},
+ {10, 0, 0, 0, 5, 101, 21},
+ {10, 9, 0, 0, 5, 101, 21},
+ {12, 7, 13, 0, 5, 101, 21},
+ {13, 0, 0, 0, 5, 101, 11},
+ {7, 0, 0, 0, 5, 126, 38},
+ {12, 0, 13, 0, 5, 126, 38},
+ {10, 0, 0, 0, 5, 126, 38},
+ {12, 9, 13, 0, 5, 126, 38},
+ {13, 0, 0, 0, 5, 126, 11},
+ {15, 0, 0, 0, 5, 126, 38},
+ {21, 0, 0, 0, 5, 126, 17},
+ {26, 0, 0, 0, 5, 126, 38},
+ {9, 0, 0, 0, 5, 125, 12},
+ {5, 0, 0, 0, 5, 125, 12},
+ {13, 0, 0, 0, 5, 125, 11},
+ {15, 0, 0, 0, 5, 125, 12},
+ {7, 0, 0, 0, 5, 125, 12},
+ {7, 0, 0, 0, 5, 121, 12},
+ {7, 0, 0, 0, 5, 133, 12},
+ {10, 0, 0, 0, 5, 133, 21},
+ {12, 0, 13, 0, 5, 133, 21},
+ {12, 9, 0, 0, 5, 133, 21},
+ {21, 0, 0, 0, 5, 133, 17},
+ {13, 0, 0, 0, 5, 133, 11},
+ {15, 0, 0, 0, 5, 133, 12},
+ {21, 0, 0, 0, 5, 134, 18},
+ {21, 0, 0, 0, 5, 134, 6},
+ {7, 0, 0, 0, 5, 134, 12},
+ {12, 0, 13, 0, 5, 134, 21},
+ {10, 0, 0, 0, 5, 134, 21},
+ {7, 0, 0, 0, 5, 62, 12},
+ {14, 0, 0, 0, 5, 62, 12},
+ {21, 0, 0, 0, 5, 62, 17},
+ {7, 0, 0, 0, 5, 80, 12},
+ {7, 0, 0, 0, 5, 80, 0},
+ {7, 0, 0, 0, 5, 80, 1},
+ {7, 0, 0, 0, 5, 127, 12},
+ {7, 0, 0, 0, 5, 127, 0},
+ {7, 0, 0, 0, 5, 127, 1},
+ {7, 0, 0, 0, 5, 115, 12},
+ {13, 0, 0, 0, 5, 115, 11},
+ {21, 0, 0, 0, 5, 115, 17},
+ {7, 0, 0, 0, 5, 103, 12},
+ {12, 1, 13, 0, 5, 103, 21},
+ {21, 0, 0, 0, 5, 103, 17},
+ {7, 0, 0, 0, 5, 119, 12},
+ {12, 230, 13, 0, 5, 119, 21},
+ {21, 0, 0, 0, 5, 119, 17},
+ {21, 0, 0, 0, 5, 119, 12},
+ {26, 0, 0, 0, 5, 119, 12},
+ {6, 0, 0, 0, 5, 119, 12},
+ {13, 0, 0, 0, 5, 119, 11},
+ {15, 0, 0, 0, 5, 119, 12},
+ {7, 0, 0, 0, 5, 98, 12},
+ {10, 0, 0, 0, 5, 98, 21},
+ {12, 0, 13, 0, 5, 98, 21},
+ {6, 0, 0, 0, 5, 98, 12},
+ {6, 0, 0, 0, 2, 137, 5},
+ {7, 0, 0, 0, 2, 137, 14},
+ {7, 0, 0, 0, 5, 105, 12},
+ {26, 0, 0, 0, 5, 105, 12},
+ {12, 0, 13, 0, 5, 105, 21},
+ {12, 1, 13, 0, 5, 105, 21},
+ {21, 0, 0, 0, 5, 105, 17},
+ {10, 216, 0, 0, 5, 0, 21},
+ {10, 226, 0, 0, 5, 0, 21},
+ {12, 230, 13, 0, 5, 2, 21},
+ {25, 0, 0, 0, 5, 0, 12},
+ {13, 0, 8, 0, 5, 0, 11},
+ {26, 0, 0, 0, 5, 131, 12},
+ {12, 0, 13, 0, 5, 131, 21},
+ {21, 0, 0, 0, 5, 131, 17},
+ {21, 0, 0, 0, 5, 131, 12},
+ {12, 230, 13, 0, 5, 56, 21},
+ {7, 0, 3, 0, 5, 113, 12},
+ {15, 0, 3, 0, 5, 113, 12},
+ {12, 220, 13, 0, 5, 113, 21},
+ {9, 0, 3, 0, 5, 132, 12},
+ {5, 0, 3, 0, 5, 132, 12},
+ {12, 230, 13, 0, 5, 132, 21},
+ {12, 7, 13, 0, 5, 132, 21},
+ {13, 0, 3, 0, 5, 132, 11},
+ {21, 0, 3, 0, 5, 132, 0},
+ {2, 0, 18, 0, 5, 102, 14},
+ {26, 0, 0, 0, 2, 0, 29},
+ {26, 0, 0, 0, 5, 0, 28},
+ {26, 0, 0, 0, 2, 32, 14},
+ {24, 0, 18, 0, 2, 0, 41},
+ {26, 0, 18, 0, 5, 0, 5},
};
#define BIDI_MIRROR_LEN 364
@@ -1186,6 +1364,130 @@ static const MirrorPair mirror_pairs[] = {
{65379, 65378},
};
+#define BIDI_BRACKET_LEN 120
+static const BracketPair bracket_pairs[] = {
+ {40, 41, 0},
+ {41, 40, 1},
+ {91, 93, 0},
+ {93, 91, 1},
+ {123, 125, 0},
+ {125, 123, 1},
+ {3898, 3899, 0},
+ {3899, 3898, 1},
+ {3900, 3901, 0},
+ {3901, 3900, 1},
+ {5787, 5788, 0},
+ {5788, 5787, 1},
+ {8261, 8262, 0},
+ {8262, 8261, 1},
+ {8317, 8318, 0},
+ {8318, 8317, 1},
+ {8333, 8334, 0},
+ {8334, 8333, 1},
+ {8968, 8969, 0},
+ {8969, 8968, 1},
+ {8970, 8971, 0},
+ {8971, 8970, 1},
+ {9001, 9002, 0},
+ {9002, 9001, 1},
+ {10088, 10089, 0},
+ {10089, 10088, 1},
+ {10090, 10091, 0},
+ {10091, 10090, 1},
+ {10092, 10093, 0},
+ {10093, 10092, 1},
+ {10094, 10095, 0},
+ {10095, 10094, 1},
+ {10096, 10097, 0},
+ {10097, 10096, 1},
+ {10098, 10099, 0},
+ {10099, 10098, 1},
+ {10100, 10101, 0},
+ {10101, 10100, 1},
+ {10181, 10182, 0},
+ {10182, 10181, 1},
+ {10214, 10215, 0},
+ {10215, 10214, 1},
+ {10216, 10217, 0},
+ {10217, 10216, 1},
+ {10218, 10219, 0},
+ {10219, 10218, 1},
+ {10220, 10221, 0},
+ {10221, 10220, 1},
+ {10222, 10223, 0},
+ {10223, 10222, 1},
+ {10627, 10628, 0},
+ {10628, 10627, 1},
+ {10629, 10630, 0},
+ {10630, 10629, 1},
+ {10631, 10632, 0},
+ {10632, 10631, 1},
+ {10633, 10634, 0},
+ {10634, 10633, 1},
+ {10635, 10636, 0},
+ {10636, 10635, 1},
+ {10637, 10640, 0},
+ {10638, 10639, 1},
+ {10639, 10638, 0},
+ {10640, 10637, 1},
+ {10641, 10642, 0},
+ {10642, 10641, 1},
+ {10643, 10644, 0},
+ {10644, 10643, 1},
+ {10645, 10646, 0},
+ {10646, 10645, 1},
+ {10647, 10648, 0},
+ {10648, 10647, 1},
+ {10712, 10713, 0},
+ {10713, 10712, 1},
+ {10714, 10715, 0},
+ {10715, 10714, 1},
+ {10748, 10749, 0},
+ {10749, 10748, 1},
+ {11810, 11811, 0},
+ {11811, 11810, 1},
+ {11812, 11813, 0},
+ {11813, 11812, 1},
+ {11814, 11815, 0},
+ {11815, 11814, 1},
+ {11816, 11817, 0},
+ {11817, 11816, 1},
+ {12296, 12297, 0},
+ {12297, 12296, 1},
+ {12298, 12299, 0},
+ {12299, 12298, 1},
+ {12300, 12301, 0},
+ {12301, 12300, 1},
+ {12302, 12303, 0},
+ {12303, 12302, 1},
+ {12304, 12305, 0},
+ {12305, 12304, 1},
+ {12308, 12309, 0},
+ {12309, 12308, 1},
+ {12310, 12311, 0},
+ {12311, 12310, 1},
+ {12312, 12313, 0},
+ {12313, 12312, 1},
+ {12314, 12315, 0},
+ {12315, 12314, 1},
+ {65113, 65114, 0},
+ {65114, 65113, 1},
+ {65115, 65116, 0},
+ {65116, 65115, 1},
+ {65117, 65118, 0},
+ {65118, 65117, 1},
+ {65288, 65289, 0},
+ {65289, 65288, 1},
+ {65339, 65341, 0},
+ {65341, 65339, 1},
+ {65371, 65373, 0},
+ {65373, 65371, 1},
+ {65375, 65376, 0},
+ {65376, 65375, 1},
+ {65378, 65379, 0},
+ {65379, 65378, 1},
+};
+
/* Reindexing of NFC first characters. */
#define TOTAL_FIRST 376
#define TOTAL_LAST 62
@@ -1585,6 +1887,12 @@ static const Reindex nfc_last[] = {
#define UCDN_SCRIPT_MULTANI 129
#define UCDN_SCRIPT_OLD_HUNGARIAN 130
#define UCDN_SCRIPT_SIGNWRITING 131
+#define UCDN_SCRIPT_ADLAM 132
+#define UCDN_SCRIPT_BHAIKSUKI 133
+#define UCDN_SCRIPT_MARCHEN 134
+#define UCDN_SCRIPT_NEWA 135
+#define UCDN_SCRIPT_OSAGE 136
+#define UCDN_SCRIPT_TANGUT 137
#define UCDN_GENERAL_CATEGORY_CC 0
#define UCDN_GENERAL_CATEGORY_CF 1
@@ -1654,26 +1962,27 @@ static const unsigned char index0[] = {
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 56, 56, 57,
- 58, 59, 60, 61, 62, 63, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 67, 67, 67,
- 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 52, 69, 70, 71, 72, 73,
- 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 88, 90,
- 91, 92, 93, 94, 95, 96, 97, 98, 88, 99, 88, 88, 88, 88, 88, 100, 100,
- 100, 101, 102, 103, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 104, 104,
- 104, 104, 105, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 106, 106, 107, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 108, 108, 109, 110, 88, 88, 88, 111, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 112, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 113, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 114,
- 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 124, 88, 88, 88, 88, 88, 125, 88, 126, 127,
- 128, 129, 130, 131, 132, 133, 134, 135, 88, 88, 88, 88, 88, 88, 52, 52,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68,
+ 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65,
+ 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 72, 73, 73, 73,
+ 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 52, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 94, 96,
+ 97, 98, 99, 100, 101, 102, 103, 104, 94, 105, 94, 106, 94, 94, 94, 107,
+ 107, 107, 108, 109, 110, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 111,
+ 111, 112, 113, 114, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 115, 116, 117, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 118, 118, 119, 120, 94, 94, 94, 121, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 123, 122, 122, 124, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 125, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 126, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 127, 128, 129, 130, 131, 132, 133, 134, 135,
+ 135, 136, 94, 94, 94, 94, 94, 137, 94, 94, 94, 94, 94, 94, 94, 138, 139,
+ 94, 94, 94, 94, 140, 94, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+ 150, 151, 151, 151, 151, 151, 152, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
@@ -1682,216 +1991,216 @@ static const unsigned char index0[] = {
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 136, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 137, 138, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 139, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 52, 52, 141, 140, 140, 140, 140, 142, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140,
- 142, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 143, 144, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
- 88, 88, 88, 88, 88, 88, 88, 88, 88, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 145, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 145,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 153, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 154, 155, 52, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 156,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 52, 52,
+ 158, 157, 157, 157, 157, 159, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 159, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 160, 161,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94,
+ 94, 94, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 162, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 162,
};
static const unsigned short index1[] = {
@@ -1912,992 +2221,1135 @@ static const unsigned short index1[] = {
146, 147, 148, 149, 128, 128, 128, 128, 128, 128, 150, 150, 150, 150,
151, 152, 153, 120, 154, 155, 156, 156, 156, 157, 158, 159, 160, 160,
161, 162, 163, 164, 165, 166, 167, 167, 167, 168, 120, 120, 120, 120,
- 120, 120, 120, 120, 128, 128, 169, 120, 120, 120, 120, 120, 170, 171,
- 172, 173, 174, 175, 175, 175, 175, 175, 175, 176, 177, 178, 179, 175,
- 180, 181, 182, 175, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191,
- 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204,
- 205, 206, 207, 208, 209, 210, 211, 120, 212, 213, 214, 215, 215, 216,
- 217, 218, 219, 220, 221, 120, 222, 223, 224, 225, 226, 227, 228, 229,
- 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 120, 240, 241,
- 242, 243, 244, 241, 245, 246, 247, 248, 249, 120, 250, 251, 252, 253,
- 254, 255, 256, 257, 257, 256, 257, 258, 259, 260, 261, 262, 263, 264,
- 120, 265, 266, 267, 268, 269, 269, 268, 270, 271, 272, 273, 274, 275,
- 276, 277, 278, 120, 279, 280, 281, 282, 282, 282, 282, 283, 284, 285,
- 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 293, 293, 296, 297,
- 294, 298, 299, 300, 301, 302, 303, 120, 304, 305, 305, 305, 305, 305,
- 306, 307, 308, 309, 310, 311, 120, 120, 120, 120, 312, 313, 314, 315,
- 316, 317, 318, 319, 320, 321, 322, 323, 120, 120, 120, 120, 324, 325,
- 326, 327, 328, 329, 330, 331, 332, 333, 332, 332, 332, 334, 335, 336,
- 337, 338, 339, 340, 339, 339, 339, 341, 342, 343, 344, 345, 120, 120,
- 120, 120, 346, 346, 346, 346, 346, 347, 348, 349, 350, 351, 352, 353,
- 354, 355, 356, 346, 357, 358, 350, 359, 360, 360, 360, 360, 361, 362,
- 363, 363, 363, 363, 363, 364, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366,
- 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 367, 367, 367, 367,
- 367, 367, 367, 367, 367, 368, 369, 368, 367, 367, 367, 367, 367, 368,
- 367, 367, 367, 367, 368, 369, 368, 367, 369, 367, 367, 367, 367, 367,
- 367, 367, 368, 367, 367, 367, 367, 367, 367, 367, 367, 370, 371, 372,
- 373, 374, 367, 367, 375, 376, 377, 377, 377, 377, 377, 377, 377, 377,
- 377, 377, 378, 379, 380, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
- 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 382, 381, 381,
- 383, 384, 384, 385, 386, 386, 386, 386, 386, 386, 386, 386, 386, 387,
- 388, 389, 390, 391, 392, 120, 393, 393, 394, 120, 395, 395, 396, 120,
- 397, 398, 399, 120, 400, 400, 400, 400, 400, 400, 401, 402, 403, 404,
- 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 415, 415, 415,
- 416, 415, 415, 415, 415, 415, 415, 120, 415, 415, 415, 415, 415, 417,
- 381, 381, 381, 381, 381, 381, 381, 381, 418, 120, 419, 419, 419, 420,
- 421, 422, 423, 424, 425, 426, 427, 427, 427, 428, 429, 120, 430, 430,
- 430, 430, 430, 431, 430, 430, 430, 432, 433, 434, 435, 435, 435, 435,
- 436, 436, 437, 438, 439, 439, 439, 439, 439, 439, 440, 441, 442, 443,
- 444, 445, 446, 447, 446, 447, 448, 449, 450, 451, 120, 120, 120, 120,
- 120, 120, 120, 120, 452, 453, 453, 453, 453, 453, 454, 455, 456, 457,
- 458, 459, 460, 461, 462, 463, 464, 465, 465, 465, 466, 467, 468, 469,
- 470, 470, 470, 470, 471, 472, 473, 474, 475, 475, 475, 475, 476, 477,
- 478, 479, 480, 481, 482, 483, 484, 484, 484, 485, 120, 120, 120, 120,
- 120, 120, 120, 120, 486, 120, 487, 488, 489, 490, 491, 492, 54, 54, 54,
- 54, 493, 494, 56, 56, 56, 56, 56, 495, 496, 497, 54, 498, 54, 54, 54,
- 499, 56, 56, 56, 500, 501, 502, 503, 504, 504, 504, 505, 506, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 507, 508, 27,
- 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 509, 510, 511, 512, 509, 510,
- 509, 510, 511, 512, 509, 513, 509, 510, 509, 511, 509, 514, 509, 514,
- 509, 514, 515, 516, 517, 518, 519, 520, 509, 521, 522, 523, 524, 525,
- 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539,
- 540, 541, 56, 542, 543, 544, 543, 545, 120, 120, 546, 547, 548, 549, 550,
- 120, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563,
- 564, 563, 565, 566, 567, 568, 569, 570, 571, 572, 573, 572, 574, 575,
- 572, 576, 572, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587,
- 588, 589, 590, 591, 592, 587, 587, 593, 594, 595, 596, 597, 587, 587,
- 598, 578, 599, 600, 587, 587, 601, 587, 587, 572, 602, 603, 572, 604,
- 605, 606, 607, 607, 607, 607, 607, 607, 607, 607, 608, 572, 572, 609,
- 610, 578, 578, 611, 572, 572, 572, 572, 577, 612, 572, 572, 613, 572,
- 572, 572, 572, 614, 120, 120, 120, 572, 613, 120, 120, 615, 615, 615,
- 615, 615, 616, 616, 617, 618, 618, 618, 618, 618, 618, 618, 618, 618,
- 619, 615, 615, 620, 620, 620, 620, 620, 620, 620, 620, 620, 621, 620,
- 620, 620, 620, 621, 572, 620, 620, 622, 572, 623, 573, 624, 625, 626,
- 627, 573, 572, 622, 576, 572, 578, 628, 629, 625, 630, 572, 572, 572,
- 572, 631, 572, 572, 572, 632, 633, 572, 572, 572, 572, 572, 634, 572,
- 635, 572, 634, 636, 637, 620, 620, 638, 620, 620, 620, 572, 572, 572,
- 572, 572, 572, 572, 639, 572, 572, 576, 572, 572, 640, 641, 615, 642,
- 642, 643, 572, 572, 572, 572, 572, 644, 645, 646, 647, 648, 649, 578,
- 578, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
- 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
- 650, 650, 650, 650, 650, 578, 578, 578, 578, 578, 578, 578, 578, 578,
- 578, 578, 578, 578, 578, 578, 578, 651, 652, 652, 653, 587, 587, 578,
- 654, 601, 655, 656, 657, 658, 659, 660, 661, 578, 662, 587, 663, 664,
- 665, 666, 647, 578, 578, 590, 654, 666, 667, 668, 669, 587, 587, 587,
- 587, 670, 671, 587, 587, 587, 587, 672, 673, 674, 647, 675, 676, 572,
- 572, 572, 572, 572, 572, 578, 578, 677, 678, 679, 573, 572, 572, 680,
- 572, 572, 572, 681, 572, 572, 572, 572, 682, 572, 683, 684, 120, 120,
- 685, 120, 120, 686, 686, 686, 686, 686, 687, 688, 688, 688, 688, 688,
- 689, 690, 691, 692, 693, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
- 694, 695, 696, 697, 698, 698, 698, 698, 699, 700, 701, 701, 701, 701,
- 701, 701, 701, 702, 703, 704, 367, 367, 369, 120, 369, 369, 369, 369,
- 369, 369, 369, 369, 705, 705, 705, 705, 706, 707, 708, 709, 710, 711,
- 533, 712, 713, 120, 120, 120, 120, 120, 120, 120, 714, 714, 714, 715,
- 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 716, 120, 714, 714,
- 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
- 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 717, 120, 120, 120,
- 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 729, 729,
- 729, 729, 729, 729, 729, 729, 730, 731, 732, 733, 733, 733, 733, 733,
- 733, 733, 733, 733, 733, 734, 735, 736, 736, 736, 736, 737, 738, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 739, 740, 741, 736, 736,
- 736, 742, 718, 718, 718, 718, 719, 120, 733, 733, 743, 743, 743, 744,
- 745, 746, 741, 741, 741, 747, 748, 749, 743, 743, 743, 750, 745, 746,
- 741, 741, 741, 741, 751, 749, 741, 752, 753, 753, 753, 753, 753, 754,
- 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 741, 741, 741,
- 755, 756, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 757,
- 741, 741, 741, 755, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 759, 760, 572, 572, 572, 572, 572, 572, 572, 572, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 760, 760, 760,
- 760, 760, 761, 761, 762, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761,
- 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 763,
- 764, 764, 764, 764, 764, 764, 765, 120, 766, 766, 766, 766, 766, 767,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768,
- 768, 768, 768, 768, 768, 769, 768, 768, 770, 771, 120, 120, 101, 101,
- 101, 101, 101, 772, 773, 774, 101, 101, 101, 775, 776, 776, 776, 776,
- 776, 776, 776, 776, 777, 778, 779, 120, 64, 64, 780, 781, 782, 27, 783,
- 27, 27, 27, 27, 27, 27, 27, 784, 785, 27, 786, 787, 27, 27, 788, 789,
- 120, 120, 120, 120, 120, 120, 120, 790, 791, 792, 793, 794, 794, 795,
- 796, 797, 798, 799, 799, 799, 799, 799, 799, 800, 120, 801, 802, 802,
- 802, 802, 802, 803, 804, 805, 806, 807, 808, 809, 809, 810, 811, 812,
- 813, 814, 814, 815, 816, 817, 817, 818, 819, 820, 821, 365, 365, 365,
- 822, 823, 824, 824, 824, 824, 824, 825, 826, 827, 828, 829, 830, 831,
- 346, 350, 832, 833, 833, 833, 833, 833, 834, 835, 120, 836, 837, 838,
- 839, 346, 346, 840, 841, 842, 842, 842, 842, 842, 842, 843, 844, 845,
- 120, 120, 846, 847, 848, 849, 120, 850, 850, 850, 120, 369, 369, 54, 54,
- 54, 54, 54, 851, 852, 120, 853, 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 847, 847, 847, 847, 854, 855, 856, 857, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365,
- 365, 365, 365, 365, 365, 858, 120, 366, 366, 859, 860, 366, 366, 366,
- 366, 366, 861, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862,
- 862, 862, 862, 862, 862, 862, 862, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 864, 760, 760, 760,
- 760, 865, 120, 866, 867, 121, 868, 869, 870, 871, 121, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 872, 873, 874, 120, 875,
+ 120, 120, 120, 120, 128, 128, 169, 170, 120, 120, 171, 126, 172, 173,
+ 174, 175, 176, 177, 177, 177, 177, 177, 177, 178, 179, 180, 181, 177,
+ 182, 183, 184, 177, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193,
+ 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206,
+ 207, 208, 209, 210, 211, 212, 213, 120, 214, 215, 216, 217, 217, 218,
+ 219, 220, 221, 222, 223, 120, 224, 225, 226, 227, 228, 229, 230, 231,
+ 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 120, 242, 243,
+ 244, 245, 246, 243, 247, 248, 249, 250, 251, 120, 252, 253, 254, 255,
+ 256, 257, 258, 259, 259, 258, 259, 260, 261, 262, 263, 264, 265, 266,
+ 120, 267, 268, 269, 270, 271, 271, 270, 272, 273, 274, 275, 276, 277,
+ 278, 279, 280, 120, 281, 282, 283, 284, 284, 284, 284, 285, 286, 287,
+ 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 295, 295, 298, 299,
+ 296, 300, 301, 302, 303, 304, 305, 120, 306, 307, 307, 307, 307, 307,
+ 308, 309, 310, 311, 312, 313, 120, 120, 120, 120, 314, 315, 316, 317,
+ 318, 319, 320, 321, 322, 323, 324, 325, 120, 120, 120, 120, 326, 327,
+ 328, 329, 330, 331, 332, 333, 334, 335, 334, 334, 334, 336, 337, 338,
+ 339, 340, 341, 342, 341, 341, 341, 343, 344, 345, 346, 347, 120, 120,
+ 120, 120, 348, 348, 348, 348, 348, 349, 350, 351, 352, 353, 354, 355,
+ 356, 357, 358, 348, 359, 360, 352, 361, 362, 362, 362, 362, 363, 364,
+ 365, 365, 365, 365, 365, 366, 367, 367, 367, 367, 367, 367, 367, 367,
+ 367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369,
+ 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 370, 370, 370,
+ 370, 370, 370, 370, 370, 371, 372, 371, 370, 370, 370, 370, 370, 371,
+ 370, 370, 370, 370, 371, 372, 371, 370, 372, 370, 370, 370, 370, 370,
+ 370, 370, 371, 370, 370, 370, 370, 370, 370, 370, 370, 373, 374, 375,
+ 376, 377, 370, 370, 378, 379, 380, 380, 380, 380, 380, 380, 380, 380,
+ 380, 380, 381, 382, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384,
+ 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 384, 384,
+ 386, 387, 387, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390,
+ 391, 392, 393, 394, 395, 120, 396, 396, 397, 120, 398, 398, 399, 120,
+ 400, 401, 402, 120, 403, 403, 403, 403, 403, 403, 404, 405, 406, 407,
+ 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 418, 418, 418,
+ 419, 418, 418, 418, 418, 418, 418, 120, 420, 418, 418, 418, 418, 421,
+ 384, 384, 384, 384, 384, 384, 384, 384, 422, 120, 423, 423, 423, 424,
+ 425, 426, 427, 428, 429, 430, 431, 431, 431, 432, 433, 120, 434, 434,
+ 434, 434, 434, 435, 434, 434, 434, 436, 437, 438, 439, 439, 439, 439,
+ 440, 440, 441, 442, 443, 443, 443, 443, 443, 443, 444, 445, 446, 447,
+ 448, 449, 450, 451, 450, 451, 452, 453, 454, 455, 120, 120, 120, 120,
+ 120, 120, 120, 120, 456, 457, 457, 457, 457, 457, 458, 459, 460, 461,
+ 462, 463, 464, 465, 466, 467, 468, 469, 469, 469, 470, 471, 472, 473,
+ 474, 474, 474, 474, 475, 476, 477, 478, 479, 479, 479, 479, 480, 481,
+ 482, 483, 484, 485, 486, 487, 488, 488, 488, 489, 100, 490, 120, 120,
+ 120, 120, 120, 120, 491, 120, 492, 493, 494, 495, 496, 497, 54, 54, 54,
+ 54, 498, 499, 56, 56, 56, 56, 56, 500, 501, 502, 54, 503, 54, 54, 54,
+ 504, 56, 56, 56, 505, 506, 507, 508, 509, 509, 509, 510, 511, 27, 27, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 512, 513, 27,
+ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 514, 515, 516, 517, 514, 515,
+ 514, 515, 516, 517, 514, 518, 514, 515, 514, 516, 514, 519, 514, 519,
+ 514, 519, 520, 521, 522, 523, 524, 525, 514, 526, 527, 528, 529, 530,
+ 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544,
+ 545, 546, 56, 547, 548, 549, 550, 551, 552, 552, 553, 554, 555, 556, 557,
+ 120, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570,
+ 571, 570, 572, 573, 574, 575, 576, 577, 578, 579, 580, 579, 581, 582,
+ 579, 583, 579, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594,
+ 595, 596, 597, 598, 599, 594, 594, 600, 601, 602, 603, 604, 594, 594,
+ 605, 585, 606, 607, 594, 594, 608, 594, 594, 579, 609, 610, 611, 612,
+ 613, 614, 615, 615, 615, 615, 615, 615, 615, 615, 616, 579, 579, 617,
+ 618, 585, 585, 619, 579, 579, 579, 579, 584, 620, 621, 622, 623, 579,
+ 579, 579, 579, 623, 120, 120, 120, 579, 624, 120, 120, 625, 625, 625,
+ 625, 625, 626, 626, 627, 628, 628, 628, 628, 628, 628, 628, 628, 628,
+ 629, 625, 630, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 631,
+ 631, 631, 631, 633, 579, 631, 631, 634, 579, 635, 636, 637, 638, 639,
+ 640, 636, 579, 634, 641, 579, 642, 643, 644, 645, 646, 579, 579, 579,
+ 647, 648, 649, 650, 579, 651, 652, 579, 653, 579, 579, 654, 655, 656,
+ 657, 579, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 579,
+ 579, 579, 669, 579, 670, 579, 671, 672, 673, 674, 675, 676, 625, 677,
+ 677, 678, 579, 579, 579, 669, 679, 680, 681, 682, 683, 684, 685, 585,
+ 585, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+ 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
+ 686, 686, 686, 686, 686, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+ 585, 585, 585, 585, 585, 585, 585, 687, 688, 688, 689, 594, 594, 585,
+ 690, 691, 692, 693, 694, 695, 696, 697, 698, 585, 699, 594, 700, 701,
+ 702, 703, 683, 585, 585, 597, 690, 703, 704, 705, 706, 594, 594, 594,
+ 594, 707, 708, 594, 594, 594, 594, 709, 710, 711, 683, 712, 713, 579,
+ 579, 579, 714, 579, 579, 585, 585, 715, 716, 717, 636, 579, 579, 718,
+ 579, 579, 579, 719, 579, 579, 579, 579, 720, 579, 721, 722, 120, 120,
+ 723, 120, 120, 724, 724, 724, 724, 724, 725, 726, 726, 726, 726, 726,
+ 727, 728, 729, 730, 731, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92,
+ 732, 733, 734, 735, 736, 736, 736, 736, 737, 738, 739, 739, 739, 739,
+ 739, 739, 739, 740, 741, 742, 370, 370, 372, 120, 372, 372, 372, 372,
+ 372, 372, 372, 372, 743, 743, 743, 743, 744, 745, 746, 747, 748, 749,
+ 750, 751, 752, 120, 120, 120, 120, 120, 120, 120, 753, 753, 753, 754,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 755, 120, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 756, 120, 120, 120,
+ 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 769,
+ 770, 769, 769, 769, 771, 772, 773, 774, 775, 776, 777, 777, 778, 777,
+ 777, 777, 779, 780, 781, 782, 783, 784, 784, 784, 784, 785, 786, 787,
+ 787, 787, 787, 787, 787, 787, 787, 787, 787, 788, 789, 790, 784, 784,
+ 784, 791, 757, 757, 757, 757, 758, 120, 792, 792, 793, 793, 793, 794,
+ 795, 796, 790, 790, 790, 797, 798, 799, 793, 793, 793, 800, 795, 796,
+ 790, 790, 790, 790, 801, 799, 790, 802, 803, 803, 803, 803, 803, 804,
+ 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 790, 790, 790,
+ 805, 806, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 807,
+ 790, 790, 790, 805, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 809, 810, 579, 579, 579, 579, 579, 579, 579, 579, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 809, 810, 810, 810,
+ 810, 810, 811, 811, 812, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 813,
+ 814, 814, 814, 814, 814, 814, 815, 120, 816, 816, 816, 816, 816, 817,
+ 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+ 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+ 818, 818, 818, 818, 818, 819, 818, 818, 820, 821, 120, 120, 101, 101,
+ 101, 101, 101, 822, 823, 824, 101, 101, 101, 825, 826, 826, 826, 826,
+ 826, 826, 826, 826, 827, 828, 829, 120, 64, 64, 830, 831, 832, 27, 833,
+ 27, 27, 27, 27, 27, 27, 27, 834, 835, 27, 836, 837, 27, 27, 838, 839,
+ 120, 120, 120, 120, 120, 120, 120, 840, 841, 842, 843, 844, 844, 845,
+ 846, 847, 848, 849, 849, 849, 849, 849, 849, 850, 120, 851, 852, 852,
+ 852, 852, 852, 853, 854, 855, 856, 857, 858, 859, 859, 860, 861, 862,
+ 863, 864, 864, 865, 866, 867, 867, 868, 869, 870, 871, 367, 367, 367,
+ 872, 873, 874, 874, 874, 874, 874, 875, 876, 877, 878, 879, 880, 881,
+ 348, 352, 882, 883, 883, 883, 883, 883, 884, 885, 120, 886, 887, 888,
+ 889, 348, 348, 890, 891, 892, 892, 892, 892, 892, 892, 893, 894, 895,
+ 120, 120, 896, 897, 898, 899, 120, 900, 900, 900, 120, 372, 372, 54, 54,
+ 54, 54, 54, 901, 902, 120, 903, 903, 903, 903, 903, 903, 903, 903, 903,
+ 903, 897, 897, 897, 897, 904, 905, 906, 907, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909,
+ 909, 909, 908, 909, 909, 910, 909, 909, 909, 909, 909, 909, 908, 909,
+ 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909,
+ 909, 911, 120, 368, 368, 912, 913, 369, 369, 369, 369, 369, 914, 915,
+ 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915,
+ 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915,
+ 915, 915, 915, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+ 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+ 916, 916, 916, 916, 916, 916, 916, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 917, 810, 810, 810, 810, 918, 120, 919,
+ 920, 121, 921, 922, 923, 924, 121, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 925, 926, 927, 120, 928, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 876, 120, 120, 128, 128, 128, 128, 128, 128, 128, 128, 877,
- 128, 128, 128, 128, 128, 128, 120, 120, 120, 120, 120, 128, 878, 879,
- 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892,
- 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 893, 894, 895, 896, 897, 898, 899, 899, 900, 901, 902, 902,
- 903, 904, 905, 906, 905, 905, 905, 905, 907, 908, 908, 908, 909, 910,
- 910, 910, 911, 912, 913, 120, 914, 915, 916, 915, 915, 917, 915, 915,
- 918, 915, 919, 915, 919, 120, 120, 120, 120, 915, 915, 915, 915, 915,
- 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 920, 921, 922, 922,
- 922, 922, 922, 923, 607, 924, 924, 924, 924, 924, 924, 925, 926, 927,
- 928, 572, 929, 930, 120, 120, 120, 120, 120, 607, 607, 607, 607, 607,
- 931, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 932, 932, 932, 933, 934, 934, 934, 934, 934, 934, 935,
- 120, 936, 937, 937, 938, 939, 939, 939, 939, 940, 120, 941, 941, 942,
- 943, 944, 944, 944, 944, 945, 946, 947, 947, 947, 948, 949, 949, 949,
- 949, 950, 949, 951, 120, 120, 120, 120, 120, 952, 952, 952, 952, 952,
- 953, 953, 953, 953, 953, 954, 954, 954, 954, 954, 954, 955, 955, 955,
- 956, 957, 958, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 959,
- 959, 959, 959, 959, 120, 960, 960, 960, 960, 960, 960, 961, 962, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
- 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963,
- 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 964,
- 120, 963, 963, 965, 120, 963, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 966, 967, 968,
- 968, 968, 968, 969, 970, 971, 971, 972, 973, 974, 974, 975, 976, 977,
- 977, 977, 978, 979, 980, 120, 120, 120, 120, 120, 120, 981, 981, 982,
- 983, 984, 984, 985, 986, 987, 987, 987, 988, 120, 120, 120, 120, 120,
- 120, 120, 120, 989, 989, 989, 989, 990, 990, 990, 991, 992, 992, 993,
- 992, 992, 992, 992, 992, 994, 995, 996, 997, 998, 998, 999, 1000, 1001,
- 120, 1002, 1003, 1004, 1004, 1004, 1005, 1006, 1006, 1006, 1007, 120,
- 120, 120, 120, 1008, 1009, 1008, 1008, 1010, 1011, 1012, 120, 1013, 1013,
- 1013, 1013, 1013, 1013, 1014, 1015, 1016, 1016, 1017, 1018, 1019, 1019,
- 1020, 1021, 1022, 1022, 1023, 1024, 120, 1025, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026,
- 1026, 1027, 120, 120, 120, 120, 120, 120, 1028, 1028, 1028, 1028, 1028,
- 1028, 1029, 120, 1030, 1030, 1030, 1030, 1030, 1030, 1031, 1032, 120,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 929, 120,
+ 120, 128, 128, 128, 128, 128, 128, 128, 128, 930, 128, 128, 128, 128,
+ 128, 128, 120, 120, 120, 120, 120, 128, 931, 932, 932, 933, 934, 935,
+ 936, 937, 938, 939, 940, 941, 942, 943, 944, 169, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 945, 946,
+ 947, 948, 949, 950, 951, 951, 952, 953, 954, 954, 955, 956, 957, 958,
+ 959, 959, 959, 959, 960, 961, 961, 961, 962, 963, 963, 963, 964, 965,
+ 966, 120, 967, 968, 969, 968, 968, 970, 968, 968, 971, 968, 972, 968,
+ 972, 120, 120, 120, 120, 968, 968, 968, 968, 968, 968, 968, 968, 968,
+ 968, 968, 968, 968, 968, 968, 973, 974, 975, 975, 975, 975, 975, 976,
+ 615, 977, 977, 977, 977, 977, 977, 978, 979, 980, 981, 579, 982, 983,
+ 120, 120, 120, 120, 120, 615, 615, 615, 615, 615, 984, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 985,
+ 985, 985, 986, 987, 987, 987, 987, 987, 987, 988, 120, 989, 990, 990,
+ 991, 992, 992, 992, 992, 993, 120, 994, 994, 995, 996, 997, 997, 997,
+ 997, 998, 999, 1000, 1000, 1000, 1001, 1002, 1002, 1002, 1002, 1003,
+ 1002, 1004, 120, 120, 120, 120, 120, 1005, 1005, 1005, 1005, 1005, 1006,
+ 1006, 1006, 1006, 1006, 1007, 1007, 1007, 1007, 1007, 1007, 1008, 1008,
+ 1008, 1009, 1010, 1011, 1012, 1012, 1012, 1012, 1013, 1014, 1014, 1014,
+ 1014, 1015, 1016, 1016, 1016, 1016, 1016, 120, 1017, 1017, 1017, 1017,
+ 1017, 1017, 1018, 1019, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020,
+ 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1021, 120, 1020,
+ 1020, 1022, 120, 1020, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 1023, 1024, 1025, 1025,
+ 1025, 1025, 1026, 1027, 1028, 1028, 1029, 1030, 1031, 1031, 1032, 1033,
+ 1034, 1034, 1034, 1035, 1036, 1037, 120, 120, 120, 120, 120, 120, 1038,
+ 1038, 1039, 1040, 1041, 1041, 1042, 1043, 1044, 1044, 1044, 1045, 120,
+ 120, 120, 120, 120, 120, 120, 120, 1046, 1046, 1046, 1046, 1047, 1047,
+ 1047, 1048, 1049, 1049, 1050, 1049, 1049, 1049, 1049, 1049, 1051, 1052,
+ 1053, 1054, 1055, 1055, 1056, 1057, 1058, 120, 1059, 1060, 1061, 1061,
+ 1061, 1062, 1063, 1063, 1063, 1064, 120, 120, 120, 120, 1065, 1066, 1065,
+ 1065, 1067, 1068, 1069, 120, 1070, 1070, 1070, 1070, 1070, 1070, 1071,
+ 1072, 1073, 1073, 1074, 1075, 1076, 1076, 1077, 1078, 1079, 1079, 1080,
+ 1081, 120, 1082, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1083,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 120, 120, 120, 120,
+ 120, 120, 1085, 1085, 1085, 1085, 1085, 1085, 1086, 120, 1087, 1087,
+ 1087, 1087, 1087, 1087, 1088, 1089, 120, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 1090, 1090, 1090, 1091, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 1033, 1033, 1033, 1034, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 1035, 1036, 1036, 1036, 1036, 1036,
- 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 120, 1044, 1045, 1046,
- 1046, 1046, 1046, 1046, 1047, 1048, 1049, 120, 1050, 1050, 1050, 1051,
- 1052, 1053, 1054, 1055, 1055, 1055, 1056, 1057, 1058, 1059, 1060, 120,
- 1061, 1061, 1061, 1061, 1062, 120, 1063, 1064, 1064, 1064, 1064, 1064,
- 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 120, 1074, 1074,
- 1075, 1074, 1074, 1076, 1077, 1078, 120, 120, 120, 120, 120, 120, 120,
- 120, 1079, 1080, 1081, 1082, 1081, 1083, 1084, 1084, 1084, 1084, 1084,
- 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1093, 1094, 1095,
- 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1102, 120, 120, 120, 120, 120,
+ 120, 1092, 1093, 1093, 1093, 1093, 1093, 1093, 1094, 1095, 1096, 1097,
+ 1098, 1099, 1100, 120, 1101, 1102, 1103, 1103, 1103, 1103, 1103, 1104,
+ 1105, 1106, 120, 1107, 1107, 1107, 1108, 1109, 1110, 1111, 1112, 1112,
+ 1112, 1113, 1114, 1115, 1116, 1117, 120, 1118, 1118, 1118, 1118, 1119,
+ 120, 1120, 1121, 1121, 1121, 1121, 1121, 1122, 1123, 1124, 1125, 1126,
+ 1127, 1128, 1129, 1130, 120, 1131, 1131, 1132, 1131, 1131, 1133, 1134,
+ 1135, 120, 120, 120, 120, 120, 120, 120, 120, 1136, 1137, 1138, 1139,
+ 1138, 1140, 1141, 1141, 1141, 1141, 1141, 1142, 1143, 1144, 1145, 1146,
+ 1147, 1148, 1149, 1150, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157,
+ 1158, 1159, 1159, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 1160, 1160, 1160, 1160, 1160, 1160, 1161,
+ 1162, 1163, 1164, 1165, 1166, 120, 120, 120, 120, 1167, 1167, 1167, 1167,
+ 1167, 1167, 1168, 1169, 1170, 120, 1171, 1172, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 1173, 1173, 1173, 1173, 1173, 1174, 1175, 1176, 1177, 1178, 1179,
+ 1180, 120, 120, 120, 120, 1181, 1181, 1181, 1181, 1181, 1181, 1182, 1183,
+ 1184, 120, 1185, 1186, 1187, 1188, 120, 120, 1189, 1189, 1189, 1189,
+ 1189, 1190, 1191, 120, 1192, 1193, 120, 120, 120, 120, 120, 120, 1194,
+ 1194, 1194, 1195, 1196, 1197, 1198, 1199, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 1103, 1103, 1103, 1103, 1103, 1103, 1104, 1105, 1106, 120, 1107, 1108,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1200, 1200, 1200, 1200,
+ 1201, 1201, 1201, 1201, 1202, 1203, 1204, 1205, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 1109, 1109, 1109, 1109, 1109, 1110, 1111,
- 1112, 1113, 1114, 1114, 1115, 120, 120, 120, 120, 1116, 1116, 1116, 1116,
- 1116, 1116, 1117, 1118, 1119, 120, 1120, 1121, 120, 120, 120, 120, 1122,
- 1122, 1122, 1122, 1122, 1123, 1124, 120, 1125, 1126, 120, 120, 120, 120,
- 120, 120, 1127, 1127, 1127, 1128, 1129, 1130, 1131, 1132, 120, 120, 120,
+ 120, 120, 120, 120, 120, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1207,
+ 1208, 1209, 1208, 1208, 1208, 1210, 1211, 1212, 1213, 120, 1214, 1215,
+ 1216, 1217, 1218, 1219, 1219, 1219, 1220, 1221, 1221, 1222, 1223, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1225, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1226, 1226, 1226,
+ 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1227, 1228,
+ 120, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224,
+ 1224, 1229, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1231, 1230, 1230, 1230, 1230, 1232, 1233, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1234, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230,
+ 1230, 1230, 1235, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1236,
+ 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236,
+ 1236, 1238, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 826, 826, 826,
+ 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826,
+ 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826,
+ 826, 826, 826, 826, 826, 826, 826, 826, 1239, 1240, 1240, 1240, 1241,
+ 1242, 1243, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 1244, 1244, 1244, 1245, 1246, 120, 1247, 1247, 1247, 1247, 1247, 1247,
+ 1248, 1249, 1250, 120, 1251, 1252, 1253, 1247, 1247, 1254, 1247, 1247,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1133,
- 1133, 1133, 1133, 1134, 1134, 1134, 1134, 1135, 1136, 1137, 1138, 120,
+ 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1256, 120, 1257, 1258,
+ 1258, 1258, 1258, 1259, 120, 1260, 1261, 1262, 120, 120, 120, 120, 120,
+ 120, 120, 120, 1263, 120, 120, 120, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1265, 120, 120, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264,
+ 1264, 1264, 1264, 1264, 1266, 120, 1267, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 1139, 1139, 1139, 1139,
- 1139, 1139, 1139, 1140, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1142, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 1143, 1143, 1143, 1143, 1143, 1143,
- 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1144, 1145, 120, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
- 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1146, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268, 1268, 1268,
+ 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1269, 1268,
+ 1270, 1268, 1271, 1268, 1272, 1273, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+ 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+ 615, 615, 615, 615, 615, 615, 1274, 120, 615, 615, 615, 615, 1275, 1276,
+ 615, 615, 615, 615, 615, 615, 1277, 1278, 1279, 1280, 1281, 1282, 615,
+ 615, 615, 1283, 615, 615, 615, 615, 615, 615, 615, 1284, 120, 120, 980,
+ 980, 980, 980, 980, 980, 980, 980, 1285, 120, 120, 120, 120, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 1147, 1147, 1147, 1147, 1147,
- 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
- 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,
- 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1148, 120, 120, 120, 120,
+ 120, 120, 120, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 623,
+ 120, 975, 975, 1286, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 1287, 1287, 1287, 1288, 1289, 1289,
+ 1290, 1287, 1287, 1291, 1292, 1289, 1289, 1287, 1287, 1287, 1288, 1289,
+ 1289, 1293, 1294, 1295, 1291, 1296, 1297, 1289, 1287, 1287, 1287, 1288,
+ 1289, 1289, 1298, 1299, 1300, 1301, 1289, 1289, 1289, 1302, 1303, 1304,
+ 1305, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287, 1287,
+ 1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287,
+ 1287, 1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289,
+ 1287, 1287, 1287, 1288, 1289, 1289, 1306, 1287, 1287, 1287, 1307, 1289,
+ 1289, 1308, 1309, 1287, 1287, 1310, 1289, 1289, 1311, 1290, 1287, 1287,
+ 1312, 1289, 1289, 1313, 1314, 1287, 1287, 1315, 1289, 1289, 1289, 1316,
+ 1287, 1287, 1287, 1307, 1289, 1289, 1308, 1317, 1318, 1318, 1318, 1318,
+ 1318, 1318, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+ 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+ 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1320, 1320,
+ 1320, 1320, 1320, 1320, 1321, 1322, 1320, 1320, 1320, 1320, 1320, 1323,
+ 1324, 1319, 1325, 1326, 120, 1327, 1328, 1320, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 1329, 1330, 1330, 1331, 1332, 1333, 120, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 1149, 1149, 1149, 1149, 1149,
- 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
- 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
- 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1150,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1334, 1334, 1334, 1334,
+ 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334,
+ 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1335, 1336, 1337, 120,
+ 120, 120, 120, 120, 1338, 1338, 1338, 1338, 1339, 1340, 1340, 1340, 1341,
+ 1342, 1343, 1344, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
+ 120, 120, 120, 120, 120, 120, 120, 120, 120, 1345, 128, 128, 128, 1346,
+ 1347, 1348, 1349, 1350, 1351, 1346, 1352, 1346, 1348, 1348, 1353, 128,
+ 1354, 128, 1355, 1356, 1354, 128, 1355, 120, 120, 120, 120, 120, 120,
+ 1357, 120, 1358, 1359, 1359, 1359, 1359, 1360, 1359, 1359, 1359, 1359,
+ 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1360, 1361, 1359, 1362,
+ 1363, 1359, 1363, 1364, 1363, 1359, 1359, 1359, 1365, 1361, 626, 1366,
+ 628, 628, 628, 1367, 628, 628, 628, 628, 628, 628, 628, 1368, 628, 628,
+ 628, 1369, 1370, 1371, 628, 1372, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1373, 1374, 1374, 1374, 1375, 1361, 790, 790, 790, 790, 790, 1376, 790,
+ 1377, 1378, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757,
+ 757, 757, 757, 1379, 1380, 1381, 757, 757, 757, 757, 757, 757, 757, 757,
+ 1382, 1383, 757, 1384, 1385, 757, 757, 1386, 1387, 1388, 1389, 1384,
+ 1359, 757, 757, 1390, 1391, 757, 757, 757, 757, 757, 757, 757, 1392,
+ 1393, 1394, 1395, 757, 1396, 1397, 1394, 1398, 1399, 757, 757, 757, 1400,
+ 1401, 1402, 757, 757, 757, 757, 757, 757, 757, 757, 1403, 1404, 757,
+ 1405, 649, 1406, 757, 1407, 1408, 579, 1409, 757, 757, 757, 1359, 1410,
+ 1411, 1359, 1359, 1412, 1359, 1358, 1359, 1359, 1359, 1359, 1359, 1413,
+ 1414, 1359, 1359, 1413, 1415, 757, 757, 757, 757, 757, 757, 757, 757,
+ 1416, 1417, 579, 579, 579, 579, 1418, 1419, 757, 757, 757, 757, 1420,
+ 757, 1421, 757, 1422, 1358, 1423, 1361, 1359, 1424, 1425, 1361, 579, 579,
+ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1426, 1361,
+ 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1427, 1361, 1361, 1361,
+ 1361, 1361, 579, 1426, 579, 579, 579, 579, 579, 579, 579, 1361, 579,
+ 1428, 579, 579, 579, 579, 579, 1361, 579, 579, 579, 1429, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757, 1430,
+ 1431, 1361, 1432, 1433, 757, 1434, 757, 1435, 1361, 1361, 1361, 1361,
+ 757, 757, 1436, 1361, 1361, 1361, 1361, 1361, 1437, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361,
+ 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1438, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 1439, 810, 810, 810, 810, 810, 808,
+ 808, 808, 808, 808, 808, 1440, 810, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 917,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 808, 808, 808, 809, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 810, 1441, 1442, 120, 120, 120, 1443,
+ 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 120,
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 776, 776, 776, 776, 776,
- 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776,
- 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776,
- 776, 776, 776, 776, 776, 776, 1151, 1152, 1152, 1152, 1153, 1154, 1155,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1156, 1156,
- 1156, 1157, 1158, 120, 1159, 1159, 1159, 1159, 1159, 1159, 1160, 1161,
- 1162, 120, 1163, 1164, 1165, 1159, 1159, 1166, 1159, 1159, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1167, 1167, 1167,
- 1167, 1167, 1167, 1167, 1167, 1168, 120, 1169, 1170, 1170, 1170, 1170,
- 1171, 120, 1172, 1173, 1174, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 1175, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 1176, 1176, 1176, 1176, 1176, 1176,
- 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1177, 1176, 1178, 1176, 1179,
- 1176, 1180, 1181, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 1182, 120, 607, 607, 607, 607, 1183, 1184, 607, 607, 607, 607,
- 607, 607, 1185, 1186, 1187, 1188, 1189, 1190, 607, 607, 607, 1191, 607,
- 607, 607, 607, 607, 607, 607, 1192, 120, 120, 927, 927, 927, 927, 927,
- 927, 927, 927, 1193, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 614, 120, 922, 922, 1194,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 1195, 1195, 1195, 1196, 1197, 1197, 1198, 1195, 1195,
- 1199, 1200, 1197, 1197, 1195, 1195, 1195, 1196, 1197, 1197, 1201, 1202,
- 1203, 1199, 1204, 1205, 1197, 1195, 1195, 1195, 1196, 1197, 1197, 1206,
- 1207, 1208, 1209, 1197, 1197, 1197, 1210, 1211, 1212, 1213, 1197, 1197,
- 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, 1196, 1197,
- 1197, 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, 1196,
- 1197, 1197, 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195,
- 1196, 1197, 1197, 1214, 1195, 1195, 1195, 1215, 1197, 1197, 1216, 1217,
- 1195, 1195, 1218, 1197, 1197, 1219, 1198, 1195, 1195, 1220, 1197, 1197,
- 1221, 1222, 1195, 1195, 1223, 1197, 1197, 1197, 1224, 1195, 1195, 1195,
- 1215, 1197, 1197, 1216, 1225, 1226, 1226, 1226, 1226, 1226, 1226, 1227,
- 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
- 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227,
- 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1228, 1228, 1228, 1228, 1228,
- 1228, 1229, 1230, 1228, 1228, 1228, 1228, 1228, 1231, 1232, 1227, 1233,
- 1234, 120, 1235, 1236, 1228, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
- 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237,
- 1237, 1238, 1239, 1240, 120, 120, 120, 120, 120, 1241, 128, 128, 128,
- 1242, 1243, 1244, 1245, 1246, 1247, 1242, 1248, 1242, 1244, 1244, 1249,
- 128, 1250, 128, 1251, 1252, 1250, 128, 1251, 120, 120, 120, 120, 120,
- 120, 1253, 120, 572, 572, 572, 572, 572, 929, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 929, 120, 572, 614, 1254, 572, 1254,
- 572, 1254, 572, 572, 572, 681, 120, 616, 1255, 618, 618, 618, 1256, 618,
- 618, 618, 618, 618, 618, 618, 1257, 618, 618, 618, 618, 618, 1258, 120,
- 120, 120, 120, 120, 120, 120, 120, 1259, 607, 607, 607, 1260, 120, 741,
- 741, 741, 741, 741, 1261, 741, 1262, 1263, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 1264, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1265, 572, 572, 572,
- 572, 1266, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1267, 120, 572,
- 1268, 929, 120, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 572, 572, 929, 120, 572, 572, 572, 572, 572, 572, 572, 572, 572,
- 572, 1268, 120, 120, 120, 120, 120, 572, 929, 572, 572, 572, 572, 572,
- 572, 572, 120, 572, 684, 572, 572, 572, 572, 572, 120, 572, 572, 572,
- 681, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 572,
- 1267, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268,
- 120, 120, 120, 120, 120, 120, 120, 1267, 120, 120, 120, 120, 120, 120,
- 120, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 1269,
- 760, 760, 760, 760, 760, 758, 758, 758, 758, 758, 758, 1270, 760, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758,
- 758, 758, 758, 758, 758, 864, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 758, 758, 758, 759, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760,
- 1271, 1272, 120, 120, 120, 1273, 1273, 1273, 1273, 1273, 1273, 1273,
- 1273, 1273, 1273, 1273, 1273, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 120, 120, 120, 120, 120, 120, 879, 879, 879, 879, 879, 879,
- 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879,
- 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 120, 120, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863,
- 863, 1274,
+ 120, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932,
+ 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932,
+ 932, 932, 932, 120, 120, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+ 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916,
+ 916, 916, 916, 916, 916, 916, 916, 916, 1444,
};
static const unsigned short index2[] = {
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2,
- 5, 6, 6, 7, 8, 7, 6, 6, 9, 10, 6, 11, 12, 13, 12, 12, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 12, 6, 15, 16, 15, 6, 6, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 6, 10, 18, 19, 18, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 16,
- 10, 16, 1, 1, 1, 1, 1, 1, 3, 1, 1, 21, 22, 8, 8, 23, 8, 24, 22, 25, 26,
- 27, 28, 16, 29, 30, 18, 31, 32, 33, 33, 25, 34, 22, 22, 25, 33, 27, 35,
- 36, 36, 36, 22, 37, 37, 37, 37, 37, 37, 38, 37, 37, 37, 37, 37, 37, 37,
- 37, 37, 38, 37, 37, 37, 37, 37, 37, 39, 38, 37, 37, 37, 37, 37, 38, 40,
- 40, 40, 41, 41, 41, 41, 40, 41, 40, 40, 40, 41, 40, 40, 41, 41, 40, 41,
- 40, 40, 41, 41, 41, 39, 40, 40, 40, 41, 40, 41, 40, 41, 37, 40, 37, 41,
- 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 40, 37, 40, 37, 41,
- 37, 41, 37, 41, 37, 40, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 38, 40,
- 37, 40, 38, 40, 37, 41, 37, 41, 40, 37, 41, 37, 41, 37, 41, 38, 40, 38,
- 40, 37, 40, 37, 41, 37, 40, 40, 38, 40, 37, 40, 37, 41, 37, 41, 38, 40,
- 37, 41, 37, 41, 37, 37, 41, 37, 41, 37, 41, 41, 41, 37, 37, 41, 37, 41,
- 37, 37, 41, 37, 37, 37, 41, 41, 37, 37, 37, 37, 41, 37, 37, 41, 37, 37,
- 37, 41, 41, 41, 37, 37, 41, 37, 37, 41, 37, 41, 37, 41, 37, 37, 41, 37,
- 41, 41, 37, 41, 37, 37, 41, 37, 37, 37, 41, 37, 41, 37, 37, 41, 41, 42,
- 37, 41, 41, 41, 42, 42, 42, 42, 37, 43, 41, 37, 43, 41, 37, 43, 41, 37,
- 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 41, 37, 41,
- 41, 37, 43, 41, 37, 41, 37, 37, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41,
- 37, 37, 41, 37, 37, 41, 41, 37, 41, 37, 37, 37, 37, 41, 41, 40, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 41,
- 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 46, 46, 46, 46, 46,
- 46, 46, 47, 47, 25, 47, 45, 48, 45, 48, 48, 48, 45, 48, 45, 45, 49, 46,
- 47, 47, 47, 47, 47, 47, 25, 25, 25, 25, 47, 25, 47, 25, 44, 44, 44, 44,
- 44, 47, 47, 47, 47, 47, 50, 50, 45, 47, 46, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, 53,
- 53, 53, 52, 54, 53, 53, 53, 53, 53, 55, 55, 53, 53, 53, 53, 55, 55, 53,
- 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 53, 53, 53,
- 53, 51, 51, 51, 51, 51, 51, 51, 51, 57, 51, 53, 53, 53, 51, 51, 51, 53,
- 53, 58, 51, 51, 51, 53, 53, 53, 53, 51, 52, 53, 53, 51, 59, 60, 60, 59,
- 60, 60, 59, 51, 51, 51, 51, 51, 61, 62, 61, 62, 45, 63, 61, 62, 64, 64,
- 65, 62, 62, 62, 66, 61, 64, 64, 64, 64, 63, 47, 61, 66, 61, 61, 61, 64,
- 61, 64, 61, 61, 62, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
- 67, 67, 67, 67, 64, 67, 67, 67, 67, 67, 67, 67, 61, 61, 62, 62, 62, 62,
- 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68,
- 62, 68, 68, 68, 68, 68, 68, 68, 62, 62, 62, 62, 62, 61, 62, 62, 61, 61,
- 61, 62, 62, 62, 61, 62, 61, 62, 61, 62, 61, 62, 61, 62, 69, 70, 69, 70,
- 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 62, 62, 62, 62, 61, 62, 71, 61,
- 62, 61, 61, 62, 62, 61, 61, 61, 72, 73, 72, 72, 72, 72, 72, 72, 72, 72,
- 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74,
- 74, 74, 74, 74, 75, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75,
- 75, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 76, 77, 77, 78, 78, 77,
- 79, 79, 72, 75, 72, 75, 72, 75, 72, 72, 75, 72, 75, 72, 75, 72, 75, 72,
- 75, 72, 75, 72, 75, 75, 64, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 64, 64, 81, 82, 82, 82, 82,
- 82, 82, 64, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
- 64, 84, 85, 64, 64, 86, 86, 87, 64, 88, 89, 89, 89, 89, 88, 89, 89, 89,
- 90, 88, 89, 89, 89, 89, 89, 89, 88, 88, 88, 88, 88, 88, 89, 89, 88, 89,
- 89, 90, 91, 89, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103,
- 104, 105, 106, 107, 108, 109, 107, 89, 88, 107, 100, 64, 64, 64, 64, 64,
- 64, 64, 64, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 64,
- 64, 64, 64, 64, 110, 110, 110, 107, 107, 64, 64, 64, 111, 111, 111, 111,
- 111, 112, 113, 113, 114, 115, 115, 116, 117, 118, 119, 119, 120, 120,
- 120, 120, 120, 120, 120, 120, 121, 122, 123, 124, 125, 64, 118, 124, 126,
- 126, 126, 126, 126, 126, 126, 126, 127, 126, 126, 126, 126, 126, 126,
- 126, 126, 126, 126, 128, 129, 130, 131, 132, 133, 134, 135, 78, 78, 136,
- 137, 120, 120, 120, 120, 120, 137, 120, 120, 137, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 138, 115, 139, 139, 118, 126, 126, 140, 126,
- 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 118, 126, 120, 120,
- 120, 120, 120, 120, 120, 112, 119, 120, 120, 120, 120, 137, 120, 141,
- 141, 120, 120, 119, 137, 120, 120, 137, 126, 126, 142, 142, 142, 142,
- 142, 142, 142, 142, 142, 142, 126, 126, 126, 143, 143, 126, 144, 144,
- 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, 145, 146,
- 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146,
- 146, 148, 149, 148, 148, 149, 148, 148, 149, 149, 149, 148, 149, 149,
- 148, 149, 148, 148, 148, 149, 148, 149, 148, 149, 148, 149, 148, 148, 64,
- 64, 146, 146, 146, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
- 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
- 150, 64, 64, 64, 64, 64, 64, 152, 152, 152, 152, 152, 152, 152, 152, 152,
- 152, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153,
- 153, 153, 153, 153, 154, 154, 154, 154, 154, 154, 154, 155, 154, 156,
- 156, 157, 158, 158, 158, 156, 64, 64, 64, 64, 64, 159, 159, 159, 159,
- 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 160, 160, 160,
- 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160,
- 161, 160, 160, 160, 160, 160, 64, 64, 162, 162, 162, 162, 162, 162, 162,
- 162, 162, 162, 162, 162, 162, 162, 162, 64, 163, 163, 163, 163, 163, 163,
- 163, 163, 163, 164, 164, 164, 64, 64, 165, 64, 126, 126, 126, 126, 126,
- 64, 64, 64, 64, 64, 64, 137, 120, 120, 137, 120, 120, 137, 120, 120, 120,
- 137, 137, 137, 166, 167, 168, 120, 120, 120, 137, 120, 120, 137, 137,
- 120, 120, 120, 120, 120, 169, 169, 169, 170, 171, 171, 171, 171, 171,
- 171, 171, 171, 171, 171, 171, 171, 171, 171, 169, 170, 172, 171, 170,
- 170, 170, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170,
- 173, 170, 170, 171, 78, 136, 174, 174, 169, 169, 169, 171, 171, 169, 169,
- 84, 84, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 177, 171,
- 171, 171, 171, 171, 171, 178, 179, 180, 180, 64, 178, 178, 178, 178, 178,
- 178, 178, 178, 64, 64, 178, 178, 64, 64, 178, 178, 178, 178, 178, 178,
- 178, 178, 178, 178, 178, 178, 178, 178, 64, 178, 178, 178, 178, 178, 178,
- 178, 64, 178, 64, 64, 64, 178, 178, 178, 178, 64, 64, 181, 178, 180, 180,
- 180, 179, 179, 179, 179, 64, 64, 180, 180, 64, 64, 180, 180, 182, 178,
- 64, 64, 64, 64, 64, 64, 64, 64, 180, 64, 64, 64, 64, 178, 178, 64, 178,
- 178, 178, 179, 179, 64, 64, 183, 183, 183, 183, 183, 183, 183, 183, 183,
- 183, 178, 178, 184, 184, 185, 185, 185, 185, 185, 185, 186, 184, 64, 64,
- 64, 64, 64, 187, 187, 188, 64, 189, 189, 189, 189, 189, 189, 64, 64, 64,
- 64, 189, 189, 64, 64, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189,
- 189, 189, 189, 189, 64, 189, 189, 189, 189, 189, 189, 189, 64, 189, 189,
- 64, 189, 189, 64, 189, 189, 64, 64, 190, 64, 188, 188, 188, 187, 187, 64,
- 64, 64, 64, 187, 187, 64, 64, 187, 187, 191, 64, 64, 64, 187, 64, 64, 64,
- 64, 64, 64, 64, 189, 189, 189, 189, 64, 189, 64, 64, 64, 64, 64, 64, 64,
- 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 187, 187, 189, 189,
- 189, 187, 64, 64, 64, 193, 193, 194, 64, 195, 195, 195, 195, 195, 195,
- 195, 195, 195, 64, 195, 195, 195, 64, 195, 195, 195, 195, 195, 195, 195,
- 195, 195, 195, 195, 195, 195, 195, 64, 195, 195, 195, 195, 195, 195, 195,
- 64, 195, 195, 64, 195, 195, 195, 195, 195, 64, 64, 196, 195, 194, 194,
- 194, 193, 193, 193, 193, 193, 64, 193, 193, 194, 64, 194, 194, 197, 64,
- 64, 195, 64, 64, 64, 64, 64, 64, 64, 195, 195, 193, 193, 64, 64, 198,
- 198, 198, 198, 198, 198, 198, 198, 198, 198, 199, 200, 64, 64, 64, 64,
- 64, 64, 64, 195, 64, 64, 64, 64, 64, 64, 64, 201, 202, 202, 64, 203, 203,
- 203, 203, 203, 203, 203, 203, 64, 64, 203, 203, 64, 64, 203, 203, 203,
- 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 64, 203, 203, 203,
- 203, 203, 203, 203, 64, 203, 203, 64, 203, 203, 203, 203, 203, 64, 64,
- 204, 203, 202, 201, 202, 201, 201, 201, 201, 64, 64, 202, 202, 64, 64,
- 202, 202, 205, 64, 64, 64, 64, 64, 64, 64, 64, 201, 202, 64, 64, 64, 64,
- 203, 203, 64, 203, 203, 203, 201, 201, 64, 64, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 207, 203, 208, 208, 208, 208, 208, 208, 64, 64,
- 209, 210, 64, 210, 210, 210, 210, 210, 210, 64, 64, 64, 210, 210, 210,
- 64, 210, 210, 210, 210, 64, 64, 64, 210, 210, 64, 210, 64, 210, 210, 64,
- 64, 64, 210, 210, 64, 64, 64, 210, 210, 210, 210, 210, 210, 210, 210,
- 210, 210, 64, 64, 64, 64, 211, 211, 209, 211, 211, 64, 64, 64, 211, 211,
- 211, 64, 211, 211, 211, 212, 64, 64, 210, 64, 64, 64, 64, 64, 64, 211,
- 64, 64, 64, 64, 64, 64, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213,
- 214, 214, 214, 215, 215, 215, 215, 215, 215, 216, 215, 64, 64, 64, 64,
- 64, 217, 218, 218, 218, 64, 219, 219, 219, 219, 219, 219, 219, 219, 64,
- 219, 219, 219, 64, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 64, 64, 64, 219, 217, 217, 217, 218, 218, 218,
- 218, 64, 217, 217, 217, 64, 217, 217, 217, 220, 64, 64, 64, 64, 64, 64,
- 64, 221, 222, 64, 219, 219, 219, 64, 64, 64, 64, 64, 219, 219, 217, 217,
- 64, 64, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 224, 224, 224,
- 224, 224, 224, 224, 225, 64, 226, 227, 227, 64, 228, 228, 228, 228, 228,
- 228, 228, 228, 64, 228, 228, 228, 64, 228, 228, 228, 228, 228, 228, 228,
- 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 64, 228, 228, 228,
- 228, 228, 64, 64, 229, 228, 227, 230, 227, 227, 227, 227, 227, 64, 230,
- 227, 227, 64, 227, 227, 226, 231, 64, 64, 64, 64, 64, 64, 64, 227, 227,
- 64, 64, 64, 64, 64, 64, 64, 228, 64, 228, 228, 226, 226, 64, 64, 232,
- 232, 232, 232, 232, 232, 232, 232, 232, 232, 64, 228, 228, 64, 64, 64,
- 64, 64, 64, 233, 234, 234, 64, 235, 235, 235, 235, 235, 235, 235, 235,
- 64, 235, 235, 235, 64, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235,
- 235, 235, 235, 235, 235, 235, 235, 64, 64, 235, 234, 234, 234, 233, 233,
- 233, 233, 64, 234, 234, 234, 64, 234, 234, 234, 236, 235, 64, 64, 64, 64,
- 64, 64, 64, 64, 234, 64, 64, 64, 64, 64, 64, 64, 235, 235, 235, 233, 233,
- 64, 64, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 238, 238, 238,
- 238, 238, 238, 64, 64, 64, 239, 235, 235, 235, 235, 235, 235, 64, 64,
- 240, 240, 64, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
- 241, 241, 241, 241, 241, 241, 64, 64, 64, 241, 241, 241, 241, 241, 241,
- 241, 241, 64, 241, 241, 241, 241, 241, 241, 241, 241, 241, 64, 241, 64,
- 64, 64, 64, 242, 64, 64, 64, 64, 240, 240, 240, 243, 243, 243, 64, 243,
- 64, 240, 240, 240, 240, 240, 240, 240, 240, 64, 64, 64, 64, 64, 64, 244,
- 244, 244, 244, 244, 244, 244, 244, 244, 244, 64, 64, 240, 240, 245, 64,
- 64, 64, 64, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246,
- 246, 246, 246, 246, 247, 246, 246, 247, 247, 247, 247, 248, 248, 249, 64,
- 64, 64, 64, 250, 246, 246, 246, 246, 246, 246, 251, 247, 252, 252, 252,
- 252, 247, 247, 247, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254,
- 254, 253, 253, 64, 64, 64, 64, 64, 255, 255, 64, 255, 64, 64, 255, 255,
- 64, 255, 64, 64, 255, 64, 64, 64, 64, 64, 64, 255, 255, 255, 255, 64,
- 255, 255, 255, 255, 255, 255, 255, 64, 255, 255, 255, 64, 255, 64, 255,
- 64, 64, 255, 255, 64, 255, 255, 255, 255, 256, 255, 255, 256, 256, 256,
- 256, 257, 257, 64, 256, 256, 255, 64, 64, 255, 255, 255, 255, 255, 64,
- 258, 64, 259, 259, 259, 259, 256, 256, 64, 64, 260, 260, 260, 260, 260,
- 260, 260, 260, 260, 260, 64, 64, 255, 255, 255, 255, 261, 262, 262, 262,
- 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263,
- 263, 262, 263, 262, 262, 262, 264, 264, 262, 262, 262, 262, 262, 262,
- 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 262, 264, 262, 264, 262, 267, 268, 269,
- 268, 269, 270, 270, 261, 261, 261, 261, 261, 261, 261, 261, 64, 261, 261,
- 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 64, 64, 64, 64, 271,
- 272, 273, 274, 273, 273, 273, 273, 273, 272, 272, 272, 272, 273, 270,
- 272, 273, 275, 275, 276, 263, 275, 275, 261, 261, 261, 261, 261, 273,
- 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 64, 273, 273, 273, 273,
- 273, 273, 273, 273, 273, 273, 273, 273, 64, 262, 262, 262, 262, 262, 262,
- 262, 262, 264, 262, 262, 262, 262, 262, 262, 64, 262, 262, 263, 263, 263,
- 263, 263, 277, 277, 277, 277, 263, 263, 64, 64, 64, 64, 64, 278, 278,
- 278, 278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 280, 280, 280,
- 280, 279, 280, 280, 280, 280, 280, 281, 279, 282, 282, 279, 279, 280,
- 280, 278, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284, 284,
- 284, 284, 284, 284, 278, 278, 278, 278, 278, 278, 279, 279, 280, 280,
- 278, 278, 278, 278, 280, 280, 280, 278, 279, 279, 279, 278, 278, 279,
- 279, 279, 279, 279, 279, 279, 278, 278, 278, 280, 280, 280, 280, 278,
- 278, 278, 278, 278, 280, 279, 279, 280, 280, 279, 279, 279, 279, 279,
- 279, 285, 278, 279, 283, 283, 279, 279, 279, 280, 286, 286, 287, 287,
- 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 64, 287, 64,
- 64, 64, 64, 64, 287, 64, 64, 288, 288, 288, 288, 288, 288, 288, 288, 288,
- 288, 288, 84, 289, 288, 288, 288, 290, 290, 290, 290, 290, 290, 290, 290,
- 291, 291, 291, 291, 291, 291, 291, 291, 292, 292, 292, 292, 292, 292,
- 292, 292, 292, 64, 292, 292, 292, 292, 64, 64, 292, 292, 292, 292, 292,
- 292, 292, 64, 292, 292, 292, 64, 64, 293, 293, 293, 294, 294, 294, 294,
- 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, 295, 295, 295,
- 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 64, 64, 64, 296,
- 296, 296, 296, 296, 296, 296, 296, 296, 296, 64, 64, 64, 64, 64, 64, 297,
- 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 64, 64,
- 298, 298, 298, 298, 298, 298, 64, 64, 299, 300, 300, 300, 300, 300, 300,
- 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300,
- 301, 301, 300, 302, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303,
- 303, 303, 303, 303, 303, 303, 303, 303, 304, 305, 64, 64, 64, 306, 306,
- 306, 306, 306, 306, 306, 306, 306, 306, 306, 84, 84, 84, 307, 307, 307,
- 306, 306, 306, 306, 306, 306, 306, 306, 64, 64, 64, 64, 64, 64, 64, 308,
- 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 64, 308, 308,
- 308, 308, 309, 309, 310, 64, 64, 64, 311, 311, 311, 311, 311, 311, 311,
- 311, 311, 311, 312, 312, 313, 84, 84, 64, 314, 314, 314, 314, 314, 314,
- 314, 314, 314, 314, 315, 315, 64, 64, 64, 64, 316, 316, 316, 316, 316,
- 316, 316, 316, 316, 316, 316, 316, 316, 64, 316, 316, 316, 64, 317, 317,
- 64, 64, 64, 64, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318,
- 318, 319, 319, 320, 319, 319, 319, 319, 319, 319, 319, 320, 320, 320,
- 320, 320, 320, 320, 320, 319, 320, 320, 319, 319, 319, 319, 319, 319,
- 319, 319, 319, 321, 319, 322, 322, 322, 323, 322, 322, 322, 324, 318,
- 325, 64, 64, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 64, 64,
- 64, 64, 64, 64, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 64, 64,
- 64, 64, 64, 64, 328, 328, 66, 66, 328, 66, 329, 328, 328, 328, 328, 330,
- 330, 330, 331, 64, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 64,
- 64, 64, 64, 64, 64, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333,
- 333, 334, 333, 333, 333, 333, 333, 335, 333, 64, 64, 64, 64, 64, 300,
- 300, 300, 300, 300, 300, 64, 64, 336, 336, 336, 336, 336, 336, 336, 336,
- 336, 336, 336, 336, 336, 336, 336, 64, 337, 337, 337, 338, 338, 338, 338,
- 337, 337, 338, 338, 338, 64, 64, 64, 64, 338, 338, 337, 338, 338, 338,
- 338, 338, 338, 339, 340, 341, 64, 64, 64, 64, 342, 64, 64, 64, 343, 343,
- 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 345, 345, 345,
- 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 64, 64, 345, 345, 345,
- 345, 345, 64, 64, 64, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346,
- 346, 346, 64, 64, 64, 64, 346, 346, 64, 64, 64, 64, 64, 64, 347, 347,
- 347, 347, 347, 347, 347, 347, 347, 347, 348, 64, 64, 64, 349, 349, 350,
- 350, 350, 350, 350, 350, 350, 350, 351, 351, 351, 351, 351, 351, 351,
- 351, 351, 351, 351, 351, 351, 351, 351, 352, 353, 354, 354, 355, 64, 64,
- 356, 356, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
- 357, 358, 359, 358, 359, 359, 359, 359, 359, 359, 359, 64, 360, 358, 359,
- 358, 358, 359, 359, 359, 359, 359, 359, 359, 359, 358, 358, 358, 358,
- 358, 358, 359, 359, 361, 361, 361, 361, 361, 361, 361, 361, 64, 64, 362,
- 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 64, 64, 64, 64, 64, 64,
- 364, 364, 364, 364, 364, 364, 364, 365, 364, 364, 364, 364, 364, 364, 64,
- 64, 78, 78, 78, 78, 78, 136, 136, 136, 136, 136, 136, 78, 78, 136, 366,
- 64, 367, 367, 367, 367, 368, 369, 369, 369, 369, 369, 369, 369, 369, 369,
- 369, 369, 369, 369, 369, 369, 370, 368, 367, 367, 367, 367, 367, 368,
- 367, 368, 368, 368, 368, 368, 367, 368, 371, 369, 369, 369, 369, 369,
- 369, 369, 64, 64, 64, 64, 372, 372, 372, 372, 372, 372, 372, 372, 372,
- 372, 373, 373, 373, 373, 373, 373, 373, 374, 374, 374, 374, 374, 374,
- 374, 374, 374, 374, 375, 376, 375, 375, 375, 375, 375, 375, 375, 374,
- 374, 374, 374, 374, 374, 374, 374, 374, 64, 64, 64, 377, 377, 378, 379,
- 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 378,
- 377, 377, 377, 377, 378, 378, 377, 377, 380, 381, 377, 377, 379, 379,
- 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 379, 379, 379, 379,
- 379, 379, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383,
- 383, 383, 384, 385, 386, 386, 385, 385, 385, 386, 385, 386, 386, 386,
- 387, 387, 64, 64, 64, 64, 64, 64, 64, 64, 388, 388, 388, 388, 389, 389,
- 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 390, 390, 390,
- 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 391, 390, 390,
- 391, 392, 64, 64, 64, 393, 393, 393, 393, 393, 394, 394, 394, 394, 394,
- 394, 394, 394, 394, 394, 64, 64, 64, 389, 389, 389, 395, 395, 395, 395,
- 395, 395, 395, 395, 395, 395, 396, 396, 396, 396, 396, 396, 396, 396,
- 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, 398, 398,
- 399, 399, 399, 399, 399, 399, 399, 399, 78, 78, 78, 84, 400, 136, 136,
- 136, 136, 136, 78, 78, 136, 136, 136, 136, 78, 401, 400, 400, 400, 400,
- 400, 400, 400, 402, 402, 402, 402, 136, 402, 402, 402, 402, 401, 401, 78,
- 402, 402, 64, 78, 78, 64, 64, 64, 64, 64, 64, 41, 41, 41, 41, 41, 41, 62,
- 62, 62, 62, 62, 75, 44, 44, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65,
- 65, 44, 44, 44, 44, 65, 65, 65, 65, 65, 41, 41, 41, 41, 41, 403, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 65, 78, 78, 136, 78, 78, 78, 78, 78, 78, 78, 136, 78, 78, 404,
- 405, 136, 406, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 78, 78, 78, 78, 78, 78, 64, 64, 64, 64, 64, 64, 407, 136, 78, 136,
- 37, 41, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 62, 62,
- 62, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62,
- 62, 62, 64, 64, 61, 61, 61, 61, 61, 61, 64, 64, 64, 61, 64, 61, 64, 61,
- 64, 61, 408, 408, 408, 408, 408, 408, 408, 408, 62, 62, 62, 62, 62, 64,
- 62, 62, 61, 61, 61, 61, 408, 63, 62, 63, 63, 63, 62, 62, 62, 64, 62, 62,
- 61, 61, 61, 61, 408, 63, 63, 63, 62, 62, 62, 62, 64, 64, 62, 62, 61, 61,
- 61, 61, 64, 63, 63, 63, 61, 61, 61, 61, 61, 63, 63, 63, 64, 64, 62, 62,
- 62, 64, 62, 62, 61, 61, 61, 61, 408, 63, 63, 64, 409, 409, 409, 409, 409,
- 409, 409, 409, 409, 409, 409, 410, 411, 411, 412, 413, 414, 415, 415,
- 414, 414, 414, 22, 66, 416, 417, 418, 419, 416, 417, 418, 419, 22, 22,
- 22, 66, 22, 22, 22, 22, 420, 421, 422, 423, 424, 425, 426, 21, 427, 428,
- 427, 427, 428, 22, 66, 66, 66, 28, 35, 22, 66, 66, 22, 429, 429, 66, 66,
- 66, 430, 431, 432, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 433, 66,
- 429, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 409, 410, 410, 410, 410,
- 410, 64, 434, 435, 436, 437, 410, 410, 410, 410, 410, 410, 438, 44, 64,
- 64, 33, 438, 438, 438, 438, 438, 439, 439, 433, 431, 432, 440, 438, 33,
- 33, 33, 33, 438, 438, 438, 438, 438, 439, 439, 433, 431, 432, 64, 44, 44,
- 44, 44, 44, 64, 64, 64, 250, 250, 250, 250, 250, 250, 250, 250, 250, 441,
- 250, 250, 23, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 64, 78,
- 78, 400, 400, 78, 78, 78, 78, 400, 400, 400, 78, 78, 366, 366, 366, 366,
- 78, 366, 366, 366, 400, 400, 78, 136, 78, 400, 400, 136, 136, 136, 136,
- 78, 64, 64, 64, 64, 64, 64, 64, 26, 26, 442, 30, 26, 30, 26, 442, 26, 30,
- 34, 442, 442, 442, 34, 34, 442, 442, 442, 443, 26, 442, 30, 26, 433, 442,
- 442, 442, 442, 442, 26, 26, 26, 30, 30, 26, 442, 26, 67, 26, 442, 26, 37,
- 38, 442, 442, 444, 34, 442, 442, 37, 442, 34, 402, 402, 402, 402, 34, 26,
- 26, 34, 34, 442, 442, 445, 433, 433, 433, 433, 442, 34, 34, 34, 34, 26,
- 433, 26, 26, 41, 277, 446, 446, 446, 36, 36, 446, 446, 446, 446, 446,
- 446, 36, 36, 36, 36, 446, 447, 447, 447, 447, 447, 447, 447, 447, 447,
- 447, 447, 447, 448, 448, 448, 448, 447, 447, 448, 448, 448, 448, 448,
- 448, 448, 448, 448, 37, 41, 448, 448, 448, 448, 36, 26, 26, 64, 64, 64,
- 64, 39, 39, 39, 39, 39, 30, 30, 30, 30, 30, 433, 433, 26, 26, 26, 26,
- 433, 26, 26, 433, 26, 26, 433, 26, 26, 26, 26, 26, 26, 26, 433, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 433, 433, 26, 26, 39, 26, 39, 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 30, 26, 26, 26, 26, 433, 433, 433, 433, 433, 433, 433, 433, 433,
- 433, 433, 433, 39, 445, 449, 449, 445, 433, 433, 39, 449, 445, 445, 449,
- 445, 445, 433, 39, 433, 449, 439, 450, 433, 449, 445, 433, 433, 433, 449,
- 445, 445, 449, 39, 449, 449, 445, 445, 39, 445, 39, 445, 39, 39, 39, 39,
- 449, 449, 445, 449, 445, 445, 445, 445, 445, 39, 39, 39, 39, 433, 445,
- 433, 445, 449, 449, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445,
- 449, 445, 445, 445, 449, 433, 433, 433, 433, 433, 449, 445, 445, 445,
- 433, 433, 433, 433, 433, 433, 433, 433, 433, 445, 449, 39, 445, 433, 449,
- 449, 449, 449, 445, 445, 449, 449, 433, 433, 449, 449, 445, 445, 449,
- 449, 445, 445, 449, 449, 445, 445, 445, 445, 445, 433, 433, 445, 445,
- 445, 445, 433, 433, 39, 433, 433, 445, 39, 433, 433, 433, 433, 433, 433,
- 433, 433, 445, 445, 433, 39, 445, 445, 445, 433, 433, 433, 433, 433, 445,
- 449, 433, 445, 445, 445, 445, 445, 433, 433, 445, 445, 433, 433, 433,
- 433, 445, 445, 445, 445, 445, 445, 445, 445, 433, 433, 431, 432, 431,
- 432, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 445, 445, 26, 26,
- 26, 26, 26, 26, 26, 451, 452, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
- 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 433,
- 26, 26, 26, 26, 26, 26, 26, 26, 277, 26, 26, 26, 26, 26, 433, 433, 433,
- 433, 433, 433, 433, 433, 433, 26, 26, 26, 26, 433, 433, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 26, 64,
- 36, 36, 36, 36, 36, 36, 36, 36, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
- 453, 446, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 30, 30, 26, 30, 30,
- 30, 30, 30, 26, 26, 30, 30, 26, 26, 30, 39, 26, 26, 26, 26, 30, 30, 26,
- 26, 30, 39, 26, 26, 26, 26, 30, 30, 30, 26, 26, 30, 26, 26, 30, 30, 26,
- 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26,
- 26, 30, 26, 30, 26, 30, 26, 30, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30,
- 30, 26, 30, 30, 30, 30, 26, 30, 30, 26, 39, 26, 26, 26, 26, 26, 26, 30,
- 30, 26, 26, 26, 26, 277, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 26, 30, 30, 30, 26, 30, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 30, 26, 26, 431, 432, 431, 432, 431, 432, 431, 432, 431, 432,
- 431, 432, 431, 432, 36, 36, 446, 446, 446, 446, 446, 446, 446, 446, 446,
- 446, 446, 446, 26, 26, 26, 26, 445, 433, 433, 445, 445, 431, 432, 433,
- 445, 445, 433, 445, 445, 445, 433, 433, 433, 433, 433, 445, 445, 445,
- 445, 433, 433, 433, 433, 433, 445, 445, 445, 433, 433, 433, 445, 445,
- 445, 445, 9, 10, 9, 10, 9, 10, 9, 10, 431, 432, 454, 454, 454, 454, 454,
- 454, 454, 454, 433, 433, 433, 431, 432, 9, 10, 431, 432, 431, 432, 431,
- 432, 431, 432, 431, 432, 433, 433, 445, 445, 445, 445, 445, 445, 433,
- 433, 433, 433, 433, 433, 433, 433, 445, 433, 433, 433, 433, 445, 445,
- 445, 445, 445, 433, 445, 445, 433, 433, 431, 432, 431, 432, 445, 433,
- 433, 433, 433, 445, 433, 445, 445, 445, 433, 433, 445, 445, 433, 433,
- 433, 433, 433, 433, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445,
- 433, 433, 431, 432, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445,
- 445, 445, 445, 445, 445, 433, 445, 445, 445, 445, 433, 433, 445, 433,
- 445, 433, 433, 445, 433, 445, 445, 445, 445, 433, 433, 433, 433, 433,
- 445, 445, 433, 433, 433, 433, 445, 445, 445, 445, 433, 445, 445, 433,
- 433, 445, 445, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445, 445,
- 445, 445, 445, 445, 433, 433, 445, 445, 445, 445, 445, 445, 445, 445,
- 433, 445, 445, 445, 445, 445, 445, 445, 445, 433, 433, 433, 433, 433,
- 445, 433, 445, 433, 433, 433, 445, 445, 445, 445, 445, 433, 433, 433,
- 433, 445, 433, 433, 433, 445, 445, 445, 445, 445, 433, 445, 433, 433,
- 433, 433, 433, 433, 433, 26, 26, 433, 433, 433, 433, 433, 433, 26, 26,
- 26, 26, 26, 26, 26, 26, 30, 30, 30, 26, 26, 26, 26, 64, 64, 26, 26, 26,
- 26, 26, 26, 26, 26, 64, 64, 26, 26, 64, 64, 64, 26, 26, 26, 26, 64, 26,
- 26, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 26,
- 26, 26, 26, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
- 455, 455, 455, 64, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456,
- 456, 456, 456, 456, 64, 37, 41, 37, 37, 37, 41, 41, 37, 41, 37, 41, 37,
- 41, 37, 37, 37, 37, 41, 37, 41, 41, 37, 41, 41, 41, 41, 41, 41, 44, 44,
- 37, 37, 69, 70, 69, 70, 70, 457, 457, 457, 457, 457, 457, 69, 70, 69, 70,
- 458, 458, 458, 69, 70, 64, 64, 64, 64, 64, 459, 459, 459, 459, 460, 459,
- 459, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461,
- 461, 64, 461, 64, 64, 64, 64, 64, 461, 64, 64, 462, 462, 462, 462, 462,
- 462, 462, 462, 64, 64, 64, 64, 64, 64, 64, 463, 464, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 465, 77, 77, 77, 77, 77, 77, 77, 77,
- 66, 66, 28, 35, 28, 35, 66, 66, 66, 28, 35, 66, 28, 35, 66, 66, 66, 66,
- 66, 66, 66, 66, 66, 415, 66, 66, 415, 66, 28, 35, 66, 66, 28, 35, 431,
- 432, 431, 432, 431, 432, 431, 432, 66, 66, 66, 66, 66, 45, 66, 66, 415,
- 415, 66, 66, 66, 66, 415, 66, 418, 64, 64, 64, 64, 64, 466, 466, 466,
- 466, 466, 466, 466, 466, 466, 466, 64, 466, 466, 466, 466, 466, 466, 466,
- 466, 466, 64, 64, 64, 64, 466, 466, 466, 466, 466, 466, 64, 64, 467, 467,
- 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 64, 64, 64, 64, 468,
- 469, 469, 469, 467, 470, 471, 472, 451, 452, 451, 452, 451, 452, 451,
- 452, 451, 452, 467, 467, 451, 452, 451, 452, 451, 452, 451, 452, 473,
- 474, 475, 475, 467, 472, 472, 472, 472, 472, 472, 472, 472, 472, 476,
- 477, 478, 479, 480, 480, 473, 481, 481, 481, 481, 481, 467, 467, 472,
- 472, 472, 470, 471, 469, 467, 26, 64, 482, 482, 482, 482, 482, 482, 482,
- 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482,
- 482, 64, 64, 483, 483, 484, 484, 485, 485, 482, 473, 486, 486, 486, 486,
- 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486,
- 469, 481, 487, 487, 486, 64, 64, 64, 64, 64, 488, 488, 488, 488, 488,
- 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 64, 64, 64,
- 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 64,
- 489, 489, 490, 490, 490, 490, 489, 489, 489, 489, 489, 489, 489, 489,
- 489, 489, 488, 488, 488, 64, 64, 64, 64, 64, 491, 491, 491, 491, 491,
- 491, 491, 491, 491, 491, 491, 491, 491, 492, 492, 64, 490, 490, 490, 490,
- 490, 490, 490, 490, 490, 490, 489, 489, 489, 489, 489, 489, 493, 493,
- 493, 493, 493, 493, 493, 493, 467, 494, 494, 494, 494, 494, 494, 494,
- 494, 494, 494, 494, 494, 494, 494, 494, 491, 491, 491, 491, 492, 492,
- 492, 489, 489, 494, 494, 494, 494, 494, 494, 494, 489, 489, 489, 489,
- 467, 467, 467, 467, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495,
- 495, 495, 495, 495, 495, 64, 489, 489, 489, 489, 489, 489, 489, 467, 467,
- 467, 467, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 467,
- 467, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496,
- 496, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, 498, 498,
- 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 499, 498, 498, 498,
- 498, 498, 498, 498, 64, 64, 64, 500, 500, 500, 500, 500, 500, 500, 500,
- 500, 500, 500, 500, 500, 500, 500, 64, 501, 501, 501, 501, 501, 501, 501,
- 501, 502, 502, 502, 502, 502, 502, 503, 503, 504, 504, 504, 504, 504,
- 504, 504, 504, 504, 504, 504, 504, 505, 506, 506, 506, 507, 507, 507,
- 507, 507, 507, 507, 507, 507, 507, 504, 504, 64, 64, 64, 64, 72, 75, 72,
- 75, 72, 75, 508, 77, 79, 79, 79, 509, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 509, 510, 72, 75, 72, 75, 403, 403, 77, 77, 511, 511, 511, 511, 511,
- 511, 511, 511, 511, 511, 511, 511, 511, 511, 512, 512, 512, 512, 512,
- 512, 512, 512, 512, 512, 513, 513, 514, 514, 514, 514, 514, 514, 47, 47,
- 47, 47, 47, 47, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 37, 41,
- 37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 41, 44, 41, 41, 41, 41, 41,
- 41, 41, 41, 37, 41, 37, 41, 37, 37, 41, 45, 515, 515, 37, 41, 37, 41, 42,
- 37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 37, 37, 37, 64, 64, 37, 37,
- 37, 37, 37, 41, 37, 41, 64, 64, 64, 64, 64, 64, 64, 42, 44, 44, 41, 42,
- 42, 42, 42, 42, 516, 516, 517, 516, 516, 516, 518, 516, 516, 516, 516,
- 517, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516,
- 516, 516, 519, 519, 517, 517, 519, 520, 520, 520, 520, 64, 64, 64, 64,
- 521, 521, 521, 521, 521, 521, 277, 277, 250, 444, 64, 64, 64, 64, 64, 64,
- 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 523,
- 523, 523, 524, 524, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525,
- 525, 525, 525, 525, 525, 525, 525, 525, 524, 524, 524, 524, 524, 524,
- 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 526, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 527, 527, 528, 528, 528, 528, 528, 528, 528, 528,
- 528, 528, 64, 64, 64, 64, 64, 64, 174, 174, 174, 174, 174, 174, 174, 174,
- 174, 174, 171, 171, 171, 171, 171, 171, 176, 176, 176, 171, 176, 171, 64,
- 64, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 530, 530, 530, 530,
- 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530,
- 530, 530, 531, 531, 531, 531, 531, 532, 532, 532, 84, 533, 534, 534, 534,
- 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 535, 535,
- 535, 535, 535, 535, 535, 535, 535, 535, 535, 536, 537, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 538, 290, 290, 290, 290, 290, 64, 64, 64,
- 539, 539, 539, 540, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541,
- 541, 541, 541, 541, 541, 542, 540, 540, 539, 539, 539, 539, 540, 540,
- 539, 540, 540, 540, 543, 544, 544, 544, 544, 544, 544, 544, 544, 544,
- 544, 544, 544, 544, 64, 46, 545, 545, 545, 545, 545, 545, 545, 545, 545,
- 545, 64, 64, 64, 64, 544, 544, 278, 278, 278, 278, 278, 280, 546, 278,
- 283, 283, 278, 278, 278, 278, 278, 64, 547, 547, 547, 547, 547, 547, 547,
- 547, 547, 548, 548, 548, 548, 548, 548, 549, 549, 548, 548, 549, 549,
- 548, 548, 64, 547, 547, 547, 548, 547, 547, 547, 547, 547, 547, 547, 547,
- 548, 549, 64, 64, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 64,
- 64, 551, 551, 551, 551, 546, 278, 278, 278, 278, 278, 278, 286, 286, 286,
- 278, 279, 280, 279, 278, 278, 552, 552, 552, 552, 552, 552, 552, 552,
- 553, 552, 553, 553, 554, 552, 552, 553, 553, 552, 552, 552, 552, 552,
- 553, 553, 552, 553, 552, 64, 64, 64, 64, 64, 64, 64, 64, 552, 552, 555,
- 556, 556, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558,
- 559, 559, 558, 558, 560, 560, 557, 561, 561, 558, 562, 64, 64, 292, 292,
- 292, 292, 292, 292, 64, 41, 41, 41, 515, 44, 44, 44, 44, 41, 41, 41, 41,
- 41, 62, 64, 64, 298, 298, 298, 298, 298, 298, 298, 298, 557, 557, 557,
- 558, 558, 559, 558, 558, 559, 558, 558, 560, 558, 562, 64, 64, 563, 563,
- 563, 563, 563, 563, 563, 563, 563, 563, 64, 64, 64, 64, 64, 64, 290, 290,
- 290, 290, 64, 64, 64, 64, 291, 291, 291, 291, 291, 291, 291, 64, 64, 64,
- 64, 291, 291, 291, 291, 291, 291, 291, 291, 291, 64, 64, 64, 64, 564,
- 564, 564, 564, 564, 564, 564, 564, 565, 565, 565, 565, 565, 565, 565,
- 565, 496, 496, 497, 497, 497, 497, 497, 497, 41, 41, 41, 41, 41, 41, 41,
- 64, 64, 64, 64, 83, 83, 83, 83, 83, 64, 64, 64, 64, 64, 110, 566, 110,
- 110, 567, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
- 110, 64, 110, 110, 110, 110, 110, 64, 110, 64, 110, 110, 64, 110, 110,
- 64, 110, 110, 126, 126, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568,
- 568, 568, 568, 568, 568, 568, 64, 64, 64, 64, 64, 64, 64, 64, 64, 126,
- 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 569, 418, 64, 64, 126,
- 126, 126, 126, 126, 126, 126, 126, 126, 126, 116, 119, 64, 64, 58, 58,
- 58, 58, 58, 58, 58, 58, 469, 469, 469, 469, 469, 469, 469, 474, 475, 469,
- 64, 64, 64, 64, 64, 64, 78, 78, 78, 78, 78, 78, 78, 136, 136, 136, 136,
- 136, 136, 136, 77, 77, 469, 473, 473, 570, 570, 474, 475, 474, 475, 474,
- 475, 474, 475, 474, 475, 474, 475, 474, 475, 474, 475, 469, 469, 474,
- 475, 469, 469, 469, 469, 570, 570, 570, 571, 469, 571, 64, 469, 571, 469,
- 469, 473, 451, 452, 451, 452, 451, 452, 572, 469, 469, 573, 574, 575,
- 575, 576, 64, 469, 577, 572, 469, 64, 64, 64, 64, 126, 126, 126, 126,
- 126, 64, 126, 126, 126, 126, 126, 126, 126, 64, 64, 410, 64, 578, 578,
- 579, 580, 579, 578, 578, 581, 582, 578, 583, 584, 585, 584, 584, 586,
- 586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 578, 587, 588, 587,
- 578, 578, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589,
- 589, 589, 589, 589, 589, 589, 581, 578, 582, 590, 591, 590, 592, 592,
- 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592,
- 592, 592, 581, 588, 582, 588, 581, 582, 593, 594, 595, 593, 593, 596,
- 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 596, 596, 596,
- 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 597, 598, 598, 598,
- 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 64, 64, 64,
- 598, 598, 598, 598, 598, 598, 64, 64, 598, 598, 598, 64, 64, 64, 580,
- 580, 588, 590, 599, 580, 580, 64, 600, 601, 601, 601, 601, 600, 600, 64,
- 64, 602, 602, 602, 26, 30, 64, 64, 603, 603, 603, 603, 603, 603, 603,
- 603, 603, 603, 603, 603, 64, 603, 603, 603, 603, 603, 603, 603, 603, 603,
- 603, 64, 603, 603, 603, 64, 603, 603, 64, 603, 603, 603, 603, 603, 603,
- 603, 64, 64, 603, 603, 603, 64, 64, 64, 64, 64, 84, 66, 84, 64, 64, 64,
- 64, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 64,
- 64, 64, 277, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604,
- 604, 605, 605, 605, 605, 606, 606, 606, 606, 606, 606, 606, 606, 606,
- 606, 606, 606, 606, 606, 606, 606, 606, 605, 605, 606, 64, 64, 64, 26,
- 26, 26, 26, 64, 64, 64, 64, 606, 64, 64, 64, 64, 64, 64, 64, 277, 277,
- 277, 277, 277, 136, 64, 64, 607, 607, 607, 607, 607, 607, 607, 607, 607,
- 607, 607, 607, 607, 64, 64, 64, 608, 608, 608, 608, 608, 608, 608, 608,
- 608, 64, 64, 64, 64, 64, 64, 64, 136, 438, 438, 438, 438, 438, 438, 438,
- 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 64, 64, 64,
- 64, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610, 610, 610, 64, 64,
- 64, 64, 611, 611, 611, 611, 611, 611, 611, 611, 611, 612, 611, 611, 611,
- 611, 611, 611, 611, 611, 612, 64, 64, 64, 64, 64, 613, 613, 613, 613,
- 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 614, 614, 614, 614,
- 614, 64, 64, 64, 64, 64, 615, 615, 615, 615, 615, 615, 615, 615, 615,
- 615, 615, 615, 615, 615, 64, 616, 617, 617, 617, 617, 617, 617, 617, 617,
- 617, 617, 617, 617, 64, 64, 64, 64, 618, 619, 619, 619, 619, 619, 64, 64,
- 620, 620, 620, 620, 620, 620, 620, 620, 621, 621, 621, 621, 621, 621,
- 621, 621, 622, 622, 622, 622, 622, 622, 622, 622, 623, 623, 623, 623,
- 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 64, 64, 624, 624, 624,
- 624, 624, 624, 624, 624, 624, 624, 64, 64, 64, 64, 64, 64, 625, 625, 625,
- 625, 625, 625, 625, 625, 626, 626, 626, 626, 626, 626, 626, 626, 626,
- 626, 626, 626, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 627, 628, 628,
- 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 64, 628,
- 628, 628, 628, 628, 628, 64, 64, 629, 629, 629, 629, 629, 629, 64, 64,
- 629, 64, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629,
- 629, 629, 629, 629, 629, 629, 629, 64, 629, 629, 64, 64, 64, 629, 64, 64,
- 629, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630,
- 630, 64, 631, 632, 632, 632, 632, 632, 632, 632, 632, 633, 633, 633, 633,
- 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 634, 635,
- 635, 635, 635, 635, 635, 635, 636, 636, 636, 636, 636, 636, 636, 636,
- 636, 636, 636, 636, 636, 636, 636, 64, 64, 64, 64, 64, 64, 64, 64, 637,
- 637, 637, 637, 637, 637, 637, 637, 637, 638, 638, 638, 638, 638, 638,
- 638, 638, 638, 638, 638, 64, 638, 638, 64, 64, 64, 64, 64, 639, 639, 639,
- 639, 639, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640,
- 640, 640, 641, 641, 641, 641, 641, 641, 64, 64, 64, 642, 643, 643, 643,
- 643, 643, 643, 643, 643, 643, 643, 64, 64, 64, 64, 64, 644, 645, 645,
- 645, 645, 645, 645, 645, 645, 646, 646, 646, 646, 646, 646, 646, 646, 64,
- 64, 64, 64, 647, 647, 646, 646, 647, 647, 647, 647, 647, 647, 647, 647,
- 64, 64, 647, 647, 647, 647, 647, 647, 648, 649, 649, 649, 64, 649, 649,
- 64, 64, 64, 64, 64, 649, 650, 649, 651, 648, 648, 648, 648, 64, 648, 648,
- 648, 64, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648,
- 648, 648, 648, 648, 648, 648, 64, 64, 64, 64, 651, 652, 650, 64, 64, 64,
- 64, 653, 654, 654, 654, 654, 654, 654, 654, 654, 655, 655, 655, 655, 655,
- 655, 655, 655, 655, 64, 64, 64, 64, 64, 64, 64, 656, 656, 656, 656, 656,
- 656, 656, 656, 656, 656, 656, 656, 656, 657, 657, 658, 659, 659, 659,
- 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 660, 660, 660, 661,
- 661, 661, 661, 661, 661, 661, 661, 662, 661, 661, 661, 661, 661, 661,
- 661, 661, 661, 661, 661, 661, 663, 664, 64, 64, 64, 64, 665, 665, 665,
- 665, 665, 666, 666, 666, 666, 666, 666, 666, 64, 667, 667, 667, 667, 667,
- 667, 667, 667, 667, 667, 667, 667, 667, 667, 64, 64, 64, 668, 668, 668,
- 668, 668, 668, 668, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
- 669, 669, 669, 669, 64, 64, 670, 670, 670, 670, 670, 670, 670, 670, 671,
- 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 64, 64, 64, 64, 64,
- 672, 672, 672, 672, 672, 672, 672, 672, 673, 673, 673, 673, 673, 673,
- 673, 673, 673, 673, 64, 64, 64, 64, 64, 64, 64, 674, 674, 674, 674, 64,
- 64, 64, 64, 675, 675, 675, 675, 675, 675, 675, 676, 676, 676, 676, 676,
- 676, 676, 676, 676, 64, 64, 64, 64, 64, 64, 64, 677, 677, 677, 677, 677,
- 677, 677, 677, 677, 677, 677, 64, 64, 64, 64, 64, 678, 678, 678, 678,
- 678, 678, 678, 678, 678, 678, 678, 64, 64, 64, 64, 64, 64, 64, 679, 679,
- 679, 679, 679, 679, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680,
- 680, 680, 680, 680, 680, 64, 681, 682, 681, 683, 683, 683, 683, 683, 683,
- 683, 683, 683, 683, 683, 683, 683, 682, 682, 682, 682, 682, 682, 682,
- 682, 682, 682, 682, 682, 682, 682, 684, 685, 685, 685, 685, 685, 685,
- 685, 64, 64, 64, 64, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686,
- 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 687, 687, 687, 687,
- 687, 687, 687, 687, 687, 687, 64, 64, 64, 64, 64, 64, 64, 684, 688, 688,
- 689, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690,
- 689, 689, 689, 688, 688, 688, 688, 689, 689, 691, 692, 693, 693, 694,
- 693, 693, 693, 693, 64, 64, 64, 64, 64, 64, 695, 695, 695, 695, 695, 695,
- 695, 695, 695, 64, 64, 64, 64, 64, 64, 64, 696, 696, 696, 696, 696, 696,
- 696, 696, 696, 696, 64, 64, 64, 64, 64, 64, 697, 697, 697, 698, 698, 698,
- 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698,
- 698, 698, 698, 699, 699, 699, 699, 699, 700, 699, 699, 699, 699, 699,
- 699, 701, 701, 64, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 703,
- 703, 703, 703, 64, 64, 64, 64, 704, 704, 704, 704, 704, 704, 704, 704,
- 704, 704, 704, 705, 706, 706, 704, 64, 707, 707, 708, 709, 709, 709, 709,
- 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 708, 708,
- 708, 707, 707, 707, 707, 707, 707, 707, 707, 707, 708, 710, 709, 709,
- 709, 709, 711, 711, 711, 711, 711, 712, 707, 707, 711, 64, 64, 713, 713,
- 713, 713, 713, 713, 713, 713, 713, 713, 709, 711, 709, 711, 711, 711, 64,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 11, 16, 17, 15, 18, 19, 20, 19, 21, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 19, 23, 24, 25, 24, 10, 15, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 16, 27, 17,
+ 28, 29, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 16, 31, 32, 25, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 36, 13,
+ 37, 13, 38, 39, 40, 41, 42, 43, 25, 44, 45, 28, 46, 47, 48, 48, 49, 50,
+ 39, 39, 40, 48, 42, 51, 52, 52, 52, 35, 53, 53, 53, 53, 53, 53, 54, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 53, 53, 53, 53, 53, 55, 54, 53,
+ 53, 53, 53, 53, 54, 56, 56, 56, 57, 57, 57, 57, 56, 57, 56, 56, 56, 57,
+ 56, 56, 57, 57, 56, 57, 56, 56, 57, 57, 57, 55, 56, 56, 56, 57, 56, 57,
+ 56, 57, 53, 56, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57,
+ 53, 56, 53, 56, 53, 57, 53, 57, 53, 57, 53, 56, 53, 57, 53, 57, 53, 57,
+ 53, 57, 53, 57, 54, 56, 53, 56, 54, 56, 53, 57, 53, 57, 56, 53, 57, 53,
+ 57, 53, 57, 54, 56, 54, 56, 53, 56, 53, 57, 53, 56, 56, 54, 56, 53, 56,
+ 53, 57, 53, 57, 54, 56, 53, 57, 53, 57, 53, 53, 57, 53, 57, 53, 57, 57,
+ 57, 53, 53, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 57, 53, 53, 53, 53,
+ 57, 53, 53, 57, 53, 53, 53, 57, 57, 57, 53, 53, 57, 53, 53, 57, 53, 57,
+ 53, 57, 53, 53, 57, 53, 57, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 53,
+ 57, 53, 53, 57, 57, 58, 53, 57, 57, 57, 58, 58, 58, 58, 53, 59, 57, 53,
+ 59, 57, 53, 59, 57, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53,
+ 56, 53, 56, 57, 53, 57, 57, 53, 59, 57, 53, 57, 53, 53, 53, 57, 53, 57,
+ 57, 57, 57, 57, 57, 57, 53, 53, 57, 53, 53, 57, 57, 53, 57, 53, 53, 53,
+ 53, 57, 57, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 57, 58, 57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61,
+ 61, 62, 62, 62, 62, 62, 62, 62, 63, 63, 64, 63, 61, 65, 66, 65, 65, 65,
+ 66, 65, 61, 61, 67, 62, 63, 63, 63, 63, 63, 63, 40, 40, 40, 40, 63, 40,
+ 63, 49, 60, 60, 60, 60, 60, 63, 63, 63, 63, 63, 68, 68, 61, 63, 62, 63,
+ 63, 63, 63, 63, 63, 63, 63, 63, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
+ 69, 69, 69, 70, 71, 71, 71, 71, 70, 72, 71, 71, 71, 71, 71, 73, 73, 71,
+ 71, 71, 71, 73, 73, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 74, 74,
+ 74, 74, 74, 71, 71, 71, 71, 69, 69, 69, 69, 69, 69, 69, 69, 75, 69, 71,
+ 71, 71, 69, 69, 69, 71, 71, 76, 69, 69, 69, 71, 71, 71, 71, 69, 70, 71,
+ 71, 69, 77, 78, 78, 77, 78, 78, 77, 69, 69, 69, 69, 69, 79, 80, 79, 80,
+ 61, 81, 79, 80, 82, 82, 83, 80, 80, 80, 84, 79, 82, 82, 82, 82, 81, 63,
+ 79, 85, 79, 79, 79, 82, 79, 82, 79, 79, 80, 86, 86, 86, 86, 86, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 82, 86, 86, 86, 86, 86, 86, 86,
+ 79, 79, 80, 80, 80, 80, 80, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
+ 87, 87, 87, 87, 87, 87, 80, 87, 87, 87, 87, 87, 87, 87, 80, 80, 80, 80,
+ 80, 79, 80, 80, 79, 79, 79, 80, 80, 80, 79, 80, 79, 80, 79, 80, 79, 80,
+ 79, 80, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 80, 80,
+ 80, 80, 79, 80, 90, 79, 80, 79, 79, 80, 80, 79, 79, 79, 91, 92, 91, 91,
+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92,
+ 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 94, 93, 94, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 94, 94, 94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94,
+ 95, 96, 96, 97, 97, 96, 98, 98, 91, 94, 91, 94, 91, 94, 91, 91, 94, 91,
+ 94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94, 94, 82, 99, 99, 99, 99, 99,
+ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 82,
+ 82, 100, 101, 101, 101, 101, 101, 101, 82, 102, 102, 102, 102, 102, 102,
+ 102, 102, 102, 102, 102, 102, 102, 102, 102, 82, 103, 104, 82, 82, 105,
+ 105, 106, 82, 107, 108, 108, 108, 108, 107, 108, 108, 108, 109, 107, 108,
+ 108, 108, 108, 108, 108, 107, 107, 107, 107, 107, 107, 108, 108, 107,
+ 108, 108, 109, 110, 108, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 120, 121, 122, 123, 124, 125, 126, 127, 128, 126, 108, 107, 129,
+ 119, 82, 82, 82, 82, 82, 82, 82, 82, 130, 130, 130, 130, 130, 130, 130,
+ 130, 130, 130, 130, 82, 82, 82, 82, 82, 130, 130, 130, 126, 126, 82, 82,
+ 82, 131, 131, 131, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 138,
+ 139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 141, 142, 143, 144,
+ 145, 82, 146, 144, 147, 147, 147, 147, 147, 147, 147, 147, 148, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 147, 149, 150, 151, 152, 153, 154,
+ 155, 156, 97, 97, 157, 158, 140, 140, 140, 140, 140, 158, 140, 140, 158,
+ 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 135, 160, 160, 161,
+ 147, 147, 162, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147,
+ 146, 147, 140, 140, 140, 140, 140, 140, 140, 132, 139, 140, 140, 140,
+ 140, 158, 140, 163, 163, 140, 140, 139, 158, 140, 140, 158, 147, 147,
+ 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 147, 147, 147, 165,
+ 165, 147, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+ 166, 166, 82, 167, 168, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168,
+ 168, 168, 168, 168, 168, 170, 171, 170, 170, 171, 170, 170, 171, 171,
+ 171, 170, 171, 171, 170, 171, 170, 170, 170, 171, 170, 171, 170, 171,
+ 170, 171, 170, 170, 82, 82, 168, 168, 168, 172, 172, 172, 172, 172, 172,
+ 172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173,
+ 173, 173, 173, 173, 173, 172, 82, 82, 82, 82, 82, 82, 174, 174, 174, 174,
+ 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175,
+ 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176,
+ 176, 176, 177, 176, 178, 178, 179, 180, 181, 182, 178, 82, 82, 82, 82,
+ 82, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183,
+ 184, 184, 184, 184, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184,
+ 185, 184, 184, 184, 185, 184, 184, 184, 184, 184, 82, 82, 186, 186, 186,
+ 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 82, 187, 187,
+ 187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 82, 82, 189, 82, 147,
+ 147, 147, 147, 147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 82, 82,
+ 82, 82, 82, 82, 140, 140, 140, 140, 140, 140, 132, 158, 140, 140, 158,
+ 140, 140, 158, 140, 140, 140, 158, 158, 158, 190, 191, 192, 140, 140,
+ 140, 158, 140, 140, 158, 158, 140, 140, 140, 140, 140, 193, 193, 193,
+ 194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195,
+ 195, 193, 194, 196, 195, 194, 194, 194, 193, 193, 193, 193, 193, 193,
+ 193, 193, 194, 194, 194, 194, 197, 194, 194, 195, 97, 157, 198, 198, 193,
+ 193, 193, 195, 195, 193, 193, 199, 199, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 201, 202, 195, 195, 195, 195, 195, 195, 203, 204,
+ 205, 205, 82, 203, 203, 203, 203, 203, 203, 203, 203, 82, 82, 203, 203,
+ 82, 82, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203,
+ 203, 82, 203, 203, 203, 203, 203, 203, 203, 82, 203, 82, 82, 82, 203,
+ 203, 203, 203, 82, 82, 206, 203, 205, 205, 205, 204, 204, 204, 204, 82,
+ 82, 205, 205, 82, 82, 205, 205, 207, 203, 82, 82, 82, 82, 82, 82, 82, 82,
+ 205, 82, 82, 82, 82, 203, 203, 82, 203, 203, 203, 204, 204, 82, 82, 208,
+ 208, 208, 208, 208, 208, 208, 208, 208, 208, 203, 203, 209, 209, 210,
+ 210, 210, 210, 210, 211, 212, 213, 82, 82, 82, 82, 82, 214, 214, 215, 82,
+ 216, 216, 216, 216, 216, 216, 82, 82, 82, 82, 216, 216, 82, 82, 216, 216,
+ 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 82, 216, 216,
+ 216, 216, 216, 216, 216, 82, 216, 216, 82, 216, 216, 82, 216, 216, 82,
+ 82, 217, 82, 215, 215, 215, 214, 214, 82, 82, 82, 82, 214, 214, 82, 82,
+ 214, 214, 218, 82, 82, 82, 214, 82, 82, 82, 82, 82, 82, 82, 216, 216,
+ 216, 216, 82, 216, 82, 82, 82, 82, 82, 82, 82, 219, 219, 219, 219, 219,
+ 219, 219, 219, 219, 219, 214, 214, 216, 216, 216, 214, 82, 82, 82, 220,
+ 220, 221, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222,
+ 222, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222,
+ 222, 82, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222, 82, 222, 222,
+ 222, 222, 222, 82, 82, 223, 222, 221, 221, 221, 220, 220, 220, 220, 220,
+ 82, 220, 220, 221, 82, 221, 221, 224, 82, 82, 222, 82, 82, 82, 82, 82,
+ 82, 82, 222, 222, 220, 220, 82, 82, 225, 225, 225, 225, 225, 225, 225,
+ 225, 225, 225, 226, 227, 82, 82, 82, 82, 82, 82, 82, 222, 82, 82, 82, 82,
+ 82, 82, 82, 228, 229, 229, 82, 230, 230, 230, 230, 230, 230, 230, 230,
+ 82, 82, 230, 230, 82, 82, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 82, 230, 230, 230, 230, 230, 230, 230, 82, 230,
+ 230, 82, 230, 230, 230, 230, 230, 82, 82, 231, 230, 229, 228, 229, 228,
+ 228, 228, 228, 82, 82, 229, 229, 82, 82, 229, 229, 232, 82, 82, 82, 82,
+ 82, 82, 82, 82, 228, 229, 82, 82, 82, 82, 230, 230, 82, 230, 230, 230,
+ 228, 228, 82, 82, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 234,
+ 230, 235, 235, 235, 235, 235, 235, 82, 82, 236, 237, 82, 237, 237, 237,
+ 237, 237, 237, 82, 82, 82, 237, 237, 237, 82, 237, 237, 237, 237, 82, 82,
+ 82, 237, 237, 82, 237, 82, 237, 237, 82, 82, 82, 237, 237, 82, 82, 82,
+ 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 82, 82, 82, 82, 238,
+ 238, 236, 238, 238, 82, 82, 82, 238, 238, 238, 82, 238, 238, 238, 239,
+ 82, 82, 237, 82, 82, 82, 82, 82, 82, 238, 82, 82, 82, 82, 82, 82, 240,
+ 240, 240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 242, 242,
+ 242, 242, 242, 242, 243, 242, 82, 82, 82, 82, 82, 244, 245, 245, 245, 82,
+ 246, 246, 246, 246, 246, 246, 246, 246, 82, 246, 246, 246, 82, 246, 246,
+ 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 82,
+ 82, 82, 246, 244, 244, 244, 245, 245, 245, 245, 82, 244, 244, 244, 82,
+ 244, 244, 244, 247, 82, 82, 82, 82, 82, 82, 82, 248, 249, 82, 246, 246,
+ 246, 82, 82, 82, 82, 82, 246, 246, 244, 244, 82, 82, 250, 250, 250, 250,
+ 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 252,
+ 253, 254, 255, 255, 82, 253, 253, 253, 253, 253, 253, 253, 253, 82, 253,
+ 253, 253, 82, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253,
+ 253, 253, 253, 253, 253, 253, 82, 253, 253, 253, 253, 253, 82, 82, 256,
+ 253, 255, 257, 255, 255, 255, 255, 255, 82, 257, 255, 255, 82, 255, 255,
+ 254, 258, 82, 82, 82, 82, 82, 82, 82, 255, 255, 82, 82, 82, 82, 82, 82,
+ 82, 253, 82, 253, 253, 254, 254, 82, 82, 259, 259, 259, 259, 259, 259,
+ 259, 259, 259, 259, 82, 253, 253, 82, 82, 82, 82, 82, 82, 260, 261, 261,
+ 82, 262, 262, 262, 262, 262, 262, 262, 262, 82, 262, 262, 262, 82, 262,
+ 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262,
+ 262, 262, 82, 82, 262, 261, 261, 261, 260, 260, 260, 260, 82, 261, 261,
+ 261, 82, 261, 261, 261, 263, 262, 264, 82, 82, 82, 82, 262, 262, 262,
+ 261, 265, 265, 265, 265, 265, 265, 265, 262, 262, 262, 260, 260, 82, 82,
+ 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, 265, 265,
+ 265, 265, 265, 265, 265, 267, 262, 262, 262, 262, 262, 262, 82, 82, 268,
+ 268, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269,
+ 269, 269, 269, 269, 269, 82, 82, 82, 269, 269, 269, 269, 269, 269, 269,
+ 269, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 82, 269, 82, 82,
+ 82, 82, 270, 82, 82, 82, 82, 268, 268, 268, 271, 271, 271, 82, 271, 82,
+ 268, 268, 268, 268, 268, 268, 268, 268, 82, 82, 82, 82, 82, 82, 272, 272,
+ 272, 272, 272, 272, 272, 272, 272, 272, 82, 82, 268, 268, 273, 82, 82,
+ 82, 82, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274,
+ 274, 274, 274, 275, 274, 274, 275, 275, 275, 275, 276, 276, 277, 82, 82,
+ 82, 82, 278, 274, 274, 274, 274, 274, 274, 279, 275, 280, 280, 280, 280,
+ 275, 275, 275, 281, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282,
+ 283, 283, 82, 82, 82, 82, 82, 284, 284, 82, 284, 82, 82, 284, 284, 82,
+ 284, 82, 82, 284, 82, 82, 82, 82, 82, 82, 284, 284, 284, 284, 82, 284,
+ 284, 284, 284, 284, 284, 284, 82, 284, 284, 284, 82, 284, 82, 284, 82,
+ 82, 284, 284, 82, 284, 284, 284, 284, 285, 284, 284, 285, 285, 285, 285,
+ 286, 286, 82, 285, 285, 284, 82, 82, 284, 284, 284, 284, 284, 82, 287,
+ 82, 288, 288, 288, 288, 285, 285, 82, 82, 289, 289, 289, 289, 289, 289,
+ 289, 289, 289, 289, 82, 82, 284, 284, 284, 284, 290, 291, 291, 291, 292,
+ 293, 292, 292, 294, 292, 292, 295, 294, 296, 296, 296, 296, 296, 294,
+ 297, 296, 297, 297, 297, 298, 298, 297, 297, 297, 297, 297, 297, 299,
+ 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 300, 300, 300, 300,
+ 300, 300, 300, 300, 300, 301, 298, 297, 298, 297, 302, 303, 304, 303,
+ 304, 305, 305, 290, 290, 290, 290, 290, 290, 290, 290, 82, 290, 290, 290,
+ 290, 290, 290, 290, 290, 290, 290, 290, 290, 82, 82, 82, 82, 306, 307,
+ 308, 309, 308, 308, 308, 308, 308, 307, 307, 307, 307, 308, 310, 307,
+ 308, 311, 311, 312, 295, 311, 311, 290, 290, 290, 290, 290, 308, 308,
+ 308, 308, 308, 308, 308, 308, 308, 308, 308, 82, 308, 308, 308, 308, 308,
+ 308, 308, 308, 308, 308, 308, 308, 82, 301, 301, 297, 297, 297, 297, 297,
+ 297, 298, 297, 297, 297, 297, 297, 297, 82, 297, 297, 292, 292, 295, 292,
+ 293, 313, 313, 313, 313, 294, 294, 82, 82, 82, 82, 82, 314, 314, 314,
+ 314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 316, 316,
+ 315, 316, 316, 316, 316, 316, 317, 315, 318, 318, 315, 315, 316, 316,
+ 314, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 320, 320, 321,
+ 321, 321, 321, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 314,
+ 314, 314, 314, 316, 316, 316, 314, 315, 315, 315, 314, 314, 315, 315,
+ 315, 315, 315, 315, 315, 314, 314, 314, 316, 316, 316, 316, 314, 314,
+ 314, 314, 314, 316, 315, 315, 316, 316, 315, 315, 315, 315, 315, 315,
+ 322, 314, 315, 319, 319, 315, 315, 315, 316, 323, 323, 324, 324, 324,
+ 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 82, 324, 82, 82,
+ 82, 82, 82, 324, 82, 82, 325, 325, 325, 325, 325, 325, 325, 325, 325,
+ 325, 325, 326, 327, 325, 325, 325, 328, 328, 328, 328, 328, 328, 328,
+ 328, 329, 329, 329, 329, 329, 329, 329, 329, 330, 330, 330, 330, 330,
+ 330, 330, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331,
+ 331, 331, 82, 82, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331, 331,
+ 82, 82, 332, 332, 332, 333, 334, 333, 333, 333, 333, 333, 333, 333, 335,
+ 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335,
+ 335, 335, 335, 335, 335, 82, 82, 82, 336, 336, 336, 336, 336, 336, 336,
+ 336, 336, 336, 82, 82, 82, 82, 82, 82, 337, 337, 337, 337, 337, 337, 337,
+ 337, 337, 337, 337, 337, 337, 337, 82, 82, 338, 338, 338, 338, 338, 338,
+ 82, 82, 339, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340,
+ 340, 340, 340, 340, 340, 340, 340, 340, 341, 341, 340, 342, 343, 343,
+ 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343,
+ 343, 343, 344, 345, 82, 82, 82, 346, 346, 346, 346, 346, 346, 346, 346,
+ 346, 346, 346, 199, 199, 199, 347, 347, 347, 346, 346, 346, 346, 346,
+ 346, 346, 346, 82, 82, 82, 82, 82, 82, 82, 348, 348, 348, 348, 348, 348,
+ 348, 348, 348, 348, 348, 348, 348, 82, 348, 348, 348, 348, 349, 349, 350,
+ 82, 82, 82, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352,
+ 353, 199, 199, 82, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355,
+ 355, 82, 82, 82, 82, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356,
+ 356, 356, 356, 82, 356, 356, 356, 82, 357, 357, 82, 82, 82, 82, 358, 358,
+ 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 359, 359, 360, 359,
+ 359, 359, 359, 359, 359, 359, 360, 360, 360, 360, 360, 360, 360, 360,
+ 359, 360, 360, 359, 359, 359, 359, 359, 359, 359, 359, 359, 361, 359,
+ 362, 362, 363, 364, 362, 365, 362, 366, 358, 367, 82, 82, 368, 368, 368,
+ 368, 368, 368, 368, 368, 368, 368, 82, 82, 82, 82, 82, 82, 369, 369, 369,
+ 369, 369, 369, 369, 369, 369, 369, 82, 82, 82, 82, 82, 82, 370, 370, 371,
+ 371, 372, 373, 374, 370, 375, 375, 370, 376, 376, 376, 377, 82, 378, 378,
+ 378, 378, 378, 378, 378, 378, 378, 378, 82, 82, 82, 82, 82, 82, 379, 379,
+ 379, 379, 379, 379, 379, 379, 379, 379, 379, 380, 379, 379, 379, 379,
+ 379, 379, 379, 379, 379, 376, 376, 379, 379, 381, 379, 82, 82, 82, 82,
+ 82, 340, 340, 340, 340, 340, 340, 82, 82, 382, 382, 382, 382, 382, 382,
+ 382, 382, 382, 382, 382, 382, 382, 382, 382, 82, 383, 383, 383, 384, 384,
+ 384, 384, 383, 383, 384, 384, 384, 82, 82, 82, 82, 384, 384, 383, 384,
+ 384, 384, 384, 384, 384, 385, 386, 387, 82, 82, 82, 82, 388, 82, 82, 82,
+ 389, 389, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 391, 391,
+ 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 82, 82, 391,
+ 391, 391, 391, 391, 82, 82, 82, 392, 392, 392, 392, 392, 392, 392, 392,
+ 392, 392, 392, 392, 82, 82, 82, 82, 392, 392, 82, 82, 82, 82, 82, 82,
+ 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 394, 82, 82, 82, 395,
+ 395, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397,
+ 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 398, 399, 400, 400,
+ 401, 82, 82, 402, 402, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403,
+ 403, 403, 403, 404, 405, 404, 405, 405, 405, 405, 405, 405, 405, 82, 406,
+ 404, 405, 404, 404, 405, 405, 405, 405, 405, 405, 405, 405, 404, 404,
+ 404, 404, 404, 404, 405, 405, 407, 407, 407, 407, 407, 407, 407, 407, 82,
+ 82, 408, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 82, 82, 82,
+ 82, 82, 82, 410, 410, 410, 410, 410, 410, 410, 411, 410, 410, 410, 410,
+ 410, 410, 82, 82, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157, 97,
+ 97, 157, 412, 82, 413, 413, 413, 413, 414, 415, 415, 415, 415, 415, 415,
+ 415, 415, 415, 415, 415, 415, 415, 415, 415, 416, 414, 413, 413, 413,
+ 413, 413, 414, 413, 414, 414, 414, 414, 414, 413, 414, 417, 415, 415,
+ 415, 415, 415, 415, 415, 82, 82, 82, 82, 418, 418, 418, 418, 418, 418,
+ 418, 418, 418, 418, 419, 419, 420, 419, 419, 419, 419, 421, 421, 421,
+ 421, 421, 421, 421, 421, 421, 421, 422, 423, 422, 422, 422, 422, 422,
+ 422, 422, 421, 421, 421, 421, 421, 421, 421, 421, 421, 82, 82, 82, 424,
+ 424, 425, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426,
+ 426, 426, 425, 424, 424, 424, 424, 425, 425, 424, 424, 427, 428, 424,
+ 424, 426, 426, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 426,
+ 426, 426, 426, 426, 426, 430, 430, 430, 430, 430, 430, 430, 430, 430,
+ 430, 430, 430, 430, 430, 431, 432, 433, 433, 432, 432, 432, 433, 432,
+ 433, 433, 433, 434, 434, 82, 82, 82, 82, 82, 82, 82, 82, 435, 435, 435,
+ 435, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 437,
+ 437, 437, 437, 437, 437, 437, 437, 438, 438, 438, 438, 438, 438, 438,
+ 438, 437, 437, 438, 439, 82, 82, 82, 440, 440, 440, 440, 440, 441, 441,
+ 441, 441, 441, 441, 441, 441, 441, 441, 82, 82, 82, 436, 436, 436, 442,
+ 442, 442, 442, 442, 442, 442, 442, 442, 442, 443, 443, 443, 443, 443,
+ 443, 443, 443, 443, 443, 443, 443, 443, 443, 444, 444, 444, 444, 444,
+ 444, 445, 445, 94, 82, 82, 82, 82, 82, 82, 82, 446, 446, 446, 446, 446,
+ 446, 446, 446, 97, 97, 97, 326, 447, 157, 157, 157, 157, 157, 97, 97,
+ 157, 157, 157, 157, 97, 448, 447, 447, 447, 447, 447, 447, 447, 449, 449,
+ 449, 449, 157, 449, 449, 449, 449, 448, 448, 97, 449, 449, 82, 97, 97,
+ 82, 82, 82, 82, 82, 82, 57, 57, 57, 57, 57, 57, 80, 80, 80, 80, 80, 94,
+ 60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 83, 83, 83, 83, 60, 60, 60, 60,
+ 83, 83, 83, 83, 83, 57, 57, 57, 57, 57, 450, 57, 57, 57, 57, 57, 57, 57,
+ 57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 97, 97,
+ 157, 97, 97, 97, 97, 97, 97, 97, 157, 97, 97, 451, 452, 157, 453, 97, 97,
+ 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97,
+ 97, 82, 82, 82, 82, 82, 97, 454, 157, 97, 157, 53, 57, 53, 57, 53, 57,
+ 57, 57, 57, 57, 57, 57, 57, 57, 53, 57, 80, 80, 80, 80, 80, 80, 80, 80,
+ 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 82, 82, 79, 79,
+ 79, 79, 79, 79, 82, 82, 82, 79, 82, 79, 82, 79, 82, 79, 455, 455, 455,
+ 455, 455, 455, 455, 455, 80, 80, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79,
+ 455, 81, 80, 81, 81, 81, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79, 455, 81,
+ 81, 81, 80, 80, 80, 80, 82, 82, 80, 80, 79, 79, 79, 79, 82, 81, 81, 81,
+ 79, 79, 79, 79, 79, 81, 81, 81, 82, 82, 80, 80, 80, 82, 80, 80, 79, 79,
+ 79, 79, 455, 456, 81, 82, 457, 457, 457, 457, 457, 457, 457, 458, 457,
+ 457, 457, 459, 460, 461, 462, 463, 464, 465, 466, 464, 467, 468, 39, 85,
+ 469, 470, 471, 472, 469, 470, 471, 472, 39, 39, 473, 85, 474, 474, 474,
+ 475, 476, 477, 478, 479, 480, 481, 482, 34, 483, 484, 483, 483, 484, 485,
+ 486, 486, 85, 43, 51, 39, 487, 487, 473, 488, 488, 85, 85, 85, 489, 490,
+ 491, 487, 487, 487, 85, 85, 85, 85, 85, 85, 85, 85, 492, 85, 488, 85,
+ 373, 85, 373, 373, 373, 373, 85, 373, 373, 457, 493, 494, 494, 494, 494,
+ 82, 495, 496, 497, 498, 499, 499, 499, 499, 499, 499, 500, 60, 82, 82,
+ 48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 502, 500, 48, 48,
+ 48, 48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 82, 60, 60, 60,
+ 60, 60, 82, 82, 82, 278, 278, 278, 278, 278, 278, 278, 503, 278, 504,
+ 278, 278, 37, 278, 278, 278, 278, 278, 278, 278, 278, 278, 503, 278, 278,
+ 278, 278, 503, 278, 278, 503, 505, 505, 505, 505, 505, 505, 505, 505,
+ 505, 97, 97, 447, 447, 97, 97, 97, 97, 447, 447, 447, 97, 97, 412, 412,
+ 412, 412, 97, 412, 412, 412, 447, 447, 97, 157, 97, 447, 447, 157, 157,
+ 157, 157, 97, 82, 82, 82, 82, 82, 82, 82, 41, 41, 506, 507, 41, 508, 41,
+ 506, 41, 507, 50, 506, 506, 506, 50, 50, 506, 506, 506, 509, 41, 506,
+ 510, 41, 492, 506, 506, 506, 506, 506, 41, 41, 41, 508, 508, 41, 506, 41,
+ 86, 41, 506, 41, 53, 511, 506, 506, 512, 50, 506, 506, 53, 506, 50, 449,
+ 449, 449, 449, 50, 41, 41, 50, 50, 506, 506, 513, 492, 492, 492, 492,
+ 506, 50, 50, 50, 50, 41, 492, 41, 41, 57, 313, 514, 514, 514, 515, 52,
+ 516, 514, 514, 514, 514, 514, 52, 515, 515, 52, 514, 517, 517, 517, 517,
+ 517, 517, 517, 517, 517, 517, 517, 517, 518, 518, 518, 518, 517, 517,
+ 518, 518, 518, 518, 518, 518, 518, 518, 518, 53, 57, 518, 518, 518, 518,
+ 52, 41, 41, 82, 82, 82, 82, 55, 55, 55, 55, 55, 508, 508, 508, 508, 508,
+ 492, 492, 41, 41, 41, 41, 492, 41, 41, 492, 41, 41, 492, 41, 41, 41, 41,
+ 41, 41, 41, 492, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 45, 41, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 492, 492, 41, 41, 55, 41, 55, 41, 41,
+ 41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41, 492, 492, 492, 492,
+ 492, 492, 492, 492, 492, 492, 492, 492, 55, 513, 519, 519, 513, 492, 492,
+ 55, 519, 513, 513, 519, 513, 513, 492, 55, 492, 519, 520, 521, 492, 519,
+ 513, 492, 492, 492, 519, 513, 513, 519, 55, 519, 519, 513, 513, 55, 513,
+ 55, 513, 55, 55, 55, 55, 519, 519, 513, 519, 513, 513, 513, 513, 513, 55,
+ 55, 55, 55, 492, 513, 492, 513, 519, 519, 513, 513, 513, 513, 513, 513,
+ 513, 513, 513, 513, 519, 513, 513, 513, 519, 492, 492, 492, 492, 492,
+ 519, 513, 513, 513, 492, 492, 492, 492, 492, 492, 492, 492, 492, 513,
+ 519, 55, 513, 492, 519, 519, 519, 519, 513, 513, 519, 519, 492, 492, 519,
+ 519, 513, 513, 519, 519, 513, 513, 519, 519, 513, 513, 513, 513, 513,
+ 492, 492, 513, 513, 513, 513, 492, 492, 55, 492, 492, 513, 55, 492, 492,
+ 492, 492, 492, 492, 492, 492, 513, 513, 492, 55, 513, 513, 513, 492, 492,
+ 492, 492, 492, 513, 519, 492, 513, 513, 513, 513, 513, 492, 492, 513,
+ 513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 492,
+ 522, 490, 491, 490, 491, 41, 41, 41, 41, 41, 41, 508, 41, 41, 41, 41, 41,
+ 41, 41, 523, 523, 41, 41, 41, 41, 513, 513, 41, 41, 41, 41, 41, 41, 41,
+ 524, 525, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 313, 313, 313, 313,
+ 313, 313, 313, 313, 313, 313, 313, 313, 313, 41, 492, 41, 41, 41, 41, 41,
+ 41, 41, 41, 313, 41, 41, 41, 41, 41, 492, 492, 492, 492, 492, 492, 492,
+ 492, 492, 41, 41, 41, 41, 492, 492, 41, 41, 41, 41, 41, 41, 41, 526, 526,
+ 526, 526, 41, 41, 41, 523, 527, 527, 523, 41, 41, 41, 41, 41, 41, 41, 41,
+ 41, 41, 41, 82, 41, 41, 41, 82, 82, 82, 82, 82, 52, 52, 52, 52, 52, 52,
+ 52, 52, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 528, 528, 528,
+ 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 516, 52, 52, 52,
+ 52, 52, 52, 52, 52, 52, 52, 52, 52, 515, 508, 508, 508, 508, 508, 508,
+ 508, 508, 508, 508, 508, 508, 41, 41, 41, 41, 508, 508, 508, 508, 529,
+ 41, 41, 41, 41, 41, 508, 508, 508, 508, 41, 41, 508, 508, 41, 508, 508,
+ 508, 508, 508, 508, 508, 41, 41, 41, 41, 41, 41, 41, 41, 508, 508, 41,
+ 41, 508, 55, 41, 41, 41, 41, 508, 508, 41, 41, 508, 55, 41, 41, 41, 41,
+ 508, 508, 508, 41, 41, 508, 41, 41, 508, 508, 41, 41, 41, 41, 41, 41, 41,
+ 508, 492, 492, 492, 492, 492, 530, 530, 492, 527, 527, 527, 527, 41, 508,
+ 508, 41, 41, 508, 41, 41, 41, 41, 508, 508, 41, 41, 41, 41, 523, 523,
+ 529, 529, 527, 41, 527, 527, 531, 532, 531, 527, 41, 527, 527, 527, 41,
+ 41, 41, 41, 508, 41, 508, 41, 41, 41, 41, 41, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 526, 526, 41, 41, 41, 41, 508, 508, 41, 508,
+ 508, 508, 41, 508, 531, 508, 508, 41, 508, 508, 41, 55, 41, 41, 41, 41,
+ 41, 41, 41, 523, 41, 41, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+ 508, 508, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 526, 526, 313, 41, 41,
+ 41, 41, 41, 41, 41, 41, 523, 523, 531, 527, 527, 527, 527, 523, 523, 531,
+ 531, 531, 508, 508, 508, 508, 531, 526, 531, 531, 531, 508, 531, 523,
+ 508, 508, 508, 531, 531, 508, 508, 531, 508, 508, 531, 531, 531, 41, 508,
+ 41, 41, 41, 41, 508, 508, 523, 508, 508, 508, 508, 508, 508, 531, 523,
+ 523, 531, 523, 508, 531, 531, 533, 523, 508, 508, 523, 531, 531, 527,
+ 527, 527, 527, 527, 526, 41, 41, 527, 527, 534, 534, 532, 532, 41, 41,
+ 526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41,
+ 41, 41, 526, 41, 526, 41, 41, 41, 41, 526, 526, 526, 41, 535, 41, 41, 41,
+ 536, 536, 536, 536, 536, 536, 41, 537, 537, 527, 41, 41, 41, 490, 491,
+ 490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 52, 52, 516,
+ 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 41, 526, 526, 526,
+ 41, 41, 41, 41, 41, 41, 41, 526, 513, 492, 492, 513, 513, 490, 491, 492,
+ 513, 513, 492, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 513,
+ 513, 492, 492, 492, 492, 492, 513, 513, 513, 492, 492, 492, 513, 513,
+ 513, 513, 16, 32, 16, 32, 16, 32, 16, 32, 490, 491, 538, 538, 538, 538,
+ 538, 538, 538, 538, 492, 492, 492, 490, 491, 16, 32, 490, 491, 490, 491,
+ 490, 491, 490, 491, 490, 491, 492, 492, 513, 513, 513, 513, 513, 513,
+ 492, 492, 492, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 492,
+ 492, 492, 513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 492, 513,
+ 513, 492, 492, 490, 491, 490, 491, 513, 492, 492, 492, 492, 513, 492,
+ 513, 513, 513, 492, 492, 513, 513, 492, 492, 492, 492, 492, 492, 492,
+ 492, 492, 492, 513, 513, 513, 513, 513, 513, 492, 492, 490, 491, 492,
+ 492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513,
+ 492, 513, 513, 513, 513, 492, 492, 513, 492, 513, 492, 492, 513, 492,
+ 513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 492, 492, 492,
+ 492, 513, 513, 513, 513, 492, 513, 513, 492, 492, 513, 513, 492, 492,
+ 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 492,
+ 492, 513, 513, 513, 513, 513, 513, 513, 513, 492, 513, 513, 513, 513,
+ 513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 492, 513, 492, 492,
+ 492, 513, 513, 513, 513, 513, 492, 492, 492, 492, 513, 492, 492, 492,
+ 513, 513, 513, 513, 513, 492, 513, 492, 492, 41, 41, 41, 526, 526, 41,
+ 41, 41, 492, 492, 492, 492, 492, 41, 41, 492, 492, 492, 492, 492, 492,
+ 41, 41, 41, 526, 41, 41, 41, 41, 535, 508, 508, 41, 41, 41, 41, 82, 82,
+ 41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 41, 41, 82, 82, 82, 41, 41, 41,
+ 41, 82, 41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 41, 41, 41, 41, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539,
+ 539, 539, 539, 539, 539, 82, 540, 540, 540, 540, 540, 540, 540, 540, 540,
+ 540, 540, 540, 540, 540, 540, 82, 53, 57, 53, 53, 53, 57, 57, 53, 57, 53,
+ 57, 53, 57, 53, 53, 53, 53, 57, 53, 57, 57, 53, 57, 57, 57, 57, 57, 57,
+ 60, 60, 53, 53, 88, 89, 88, 89, 89, 541, 541, 541, 541, 541, 541, 88, 89,
+ 88, 89, 542, 542, 542, 88, 89, 82, 82, 82, 82, 82, 543, 544, 544, 544,
+ 545, 543, 544, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546,
+ 546, 546, 546, 82, 546, 82, 82, 82, 82, 82, 546, 82, 82, 547, 547, 547,
+ 547, 547, 547, 547, 547, 82, 82, 82, 82, 82, 82, 82, 548, 549, 82, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 550, 96, 96, 96, 96, 96,
+ 96, 96, 96, 551, 551, 43, 51, 43, 51, 551, 551, 551, 43, 51, 551, 43, 51,
+ 373, 373, 373, 373, 373, 373, 373, 373, 85, 466, 552, 373, 553, 85, 43,
+ 51, 85, 85, 43, 51, 490, 491, 490, 491, 490, 491, 490, 491, 373, 373,
+ 373, 373, 371, 61, 373, 373, 85, 373, 373, 85, 85, 85, 85, 85, 554, 554,
+ 373, 373, 373, 85, 466, 373, 471, 373, 373, 82, 82, 82, 555, 555, 555,
+ 555, 555, 555, 555, 555, 555, 555, 82, 555, 555, 555, 555, 555, 555, 555,
+ 555, 555, 82, 82, 82, 82, 555, 555, 555, 555, 555, 555, 82, 82, 523, 523,
+ 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 82, 82, 82, 82, 556,
+ 557, 557, 558, 523, 559, 560, 561, 524, 525, 524, 525, 524, 525, 524,
+ 525, 524, 525, 523, 523, 524, 525, 524, 525, 524, 525, 524, 525, 562,
+ 563, 564, 564, 523, 561, 561, 561, 561, 561, 561, 561, 561, 561, 565,
+ 566, 567, 568, 569, 569, 570, 571, 571, 571, 571, 572, 523, 523, 561,
+ 561, 561, 559, 573, 558, 523, 527, 82, 574, 575, 574, 575, 574, 575, 574,
+ 575, 574, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575,
+ 575, 575, 575, 575, 575, 574, 575, 575, 575, 575, 575, 575, 575, 574,
+ 575, 574, 575, 574, 575, 575, 575, 575, 575, 575, 574, 575, 575, 575,
+ 575, 575, 575, 574, 574, 82, 82, 576, 576, 577, 577, 578, 578, 575, 562,
+ 579, 580, 579, 580, 579, 580, 579, 580, 579, 580, 580, 580, 580, 580,
+ 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 579, 580,
+ 580, 580, 580, 580, 580, 580, 579, 580, 579, 580, 579, 580, 580, 580,
+ 580, 580, 580, 579, 580, 580, 580, 580, 580, 580, 579, 579, 580, 580,
+ 580, 580, 581, 582, 583, 583, 580, 82, 82, 82, 82, 82, 584, 584, 584,
+ 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 82,
+ 82, 82, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585,
+ 585, 585, 585, 585, 585, 585, 585, 585, 585, 82, 586, 586, 587, 587, 587,
+ 587, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 584, 584, 82,
+ 82, 82, 82, 82, 579, 579, 579, 579, 579, 579, 579, 579, 588, 588, 588,
+ 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 82, 587, 587,
+ 587, 587, 587, 587, 587, 587, 587, 587, 586, 586, 586, 586, 586, 586,
+ 590, 590, 590, 590, 590, 590, 590, 590, 523, 591, 591, 591, 591, 591,
+ 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 588, 588, 588, 588,
+ 589, 589, 589, 586, 586, 591, 591, 591, 591, 591, 591, 591, 586, 586,
+ 586, 586, 523, 523, 523, 523, 592, 592, 592, 592, 592, 592, 592, 592,
+ 592, 592, 592, 592, 592, 592, 592, 82, 586, 586, 586, 586, 586, 586, 586,
+ 523, 523, 523, 523, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586,
+ 586, 523, 523, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593,
+ 593, 593, 593, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595,
+ 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 596, 595,
+ 595, 595, 595, 595, 595, 595, 82, 82, 82, 597, 597, 597, 597, 597, 597,
+ 597, 597, 597, 597, 597, 597, 597, 597, 597, 82, 598, 598, 598, 598, 598,
+ 598, 598, 598, 599, 599, 599, 599, 599, 599, 600, 600, 601, 601, 601,
+ 601, 601, 601, 601, 601, 601, 601, 601, 601, 602, 603, 604, 603, 605,
+ 605, 605, 605, 605, 605, 605, 605, 605, 605, 601, 601, 82, 82, 82, 82,
+ 91, 94, 91, 94, 91, 94, 606, 96, 98, 98, 98, 607, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 607, 608, 91, 94, 91, 94, 450, 450, 96, 96, 609, 609,
+ 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610,
+ 610, 610, 610, 610, 610, 610, 610, 610, 611, 611, 612, 613, 613, 613,
+ 613, 613, 63, 63, 63, 63, 63, 63, 63, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+ 63, 63, 53, 57, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 57, 60, 57,
+ 57, 57, 57, 57, 57, 57, 57, 53, 57, 53, 57, 53, 53, 57, 61, 614, 614, 53,
+ 57, 53, 57, 58, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 53, 53, 53,
+ 53, 82, 53, 53, 53, 53, 53, 57, 53, 57, 82, 82, 82, 82, 82, 82, 82, 58,
+ 60, 60, 57, 58, 58, 58, 58, 58, 615, 615, 616, 615, 615, 615, 617, 615,
+ 615, 615, 615, 616, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615,
+ 615, 615, 615, 615, 615, 618, 618, 616, 616, 618, 619, 619, 619, 619, 82,
+ 82, 82, 82, 620, 620, 620, 620, 620, 620, 313, 313, 503, 512, 82, 82, 82,
+ 82, 82, 82, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621,
+ 622, 622, 623, 623, 624, 624, 625, 625, 625, 625, 625, 625, 625, 625,
+ 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 624, 624, 624, 624,
+ 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 626, 627, 82,
+ 82, 82, 82, 82, 82, 82, 82, 628, 628, 629, 629, 629, 629, 629, 629, 629,
+ 629, 629, 629, 82, 82, 82, 82, 82, 82, 198, 198, 198, 198, 198, 198, 198,
+ 198, 198, 198, 195, 195, 195, 195, 195, 195, 201, 201, 201, 195, 630,
+ 195, 82, 82, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 632,
+ 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632,
+ 632, 632, 632, 632, 633, 633, 633, 633, 633, 634, 634, 634, 199, 635,
+ 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636,
+ 636, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 638, 639, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 640, 328, 328, 328, 328, 328, 82,
+ 82, 82, 641, 641, 641, 642, 643, 643, 643, 643, 643, 643, 643, 643, 643,
+ 643, 643, 643, 643, 643, 643, 644, 642, 642, 641, 641, 641, 641, 642,
+ 642, 641, 642, 642, 642, 645, 646, 646, 646, 646, 646, 646, 647, 647,
+ 647, 646, 646, 646, 646, 82, 62, 648, 648, 648, 648, 648, 648, 648, 648,
+ 648, 648, 82, 82, 82, 82, 646, 646, 314, 314, 314, 314, 314, 316, 649,
+ 314, 319, 319, 314, 314, 314, 314, 314, 82, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 651, 651, 651, 651, 651, 651, 652, 652, 651, 651, 652,
+ 652, 651, 651, 82, 650, 650, 650, 651, 650, 650, 650, 650, 650, 650, 650,
+ 650, 651, 652, 82, 82, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653,
+ 82, 82, 654, 655, 655, 655, 649, 314, 314, 314, 314, 314, 314, 323, 323,
+ 323, 314, 315, 316, 315, 314, 314, 656, 656, 656, 656, 656, 656, 656,
+ 656, 657, 656, 657, 657, 658, 656, 656, 657, 657, 656, 656, 656, 656,
+ 656, 657, 657, 656, 657, 656, 82, 82, 82, 82, 82, 82, 82, 82, 656, 656,
+ 659, 660, 660, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661,
+ 662, 663, 663, 662, 662, 664, 664, 661, 665, 665, 662, 666, 82, 82, 331,
+ 331, 331, 331, 331, 331, 82, 57, 57, 57, 614, 60, 60, 60, 60, 57, 57, 57,
+ 57, 57, 80, 82, 82, 338, 338, 338, 338, 338, 338, 338, 338, 661, 661,
+ 661, 662, 662, 663, 662, 662, 663, 662, 662, 664, 662, 666, 82, 82, 667,
+ 667, 667, 667, 667, 667, 667, 667, 667, 667, 82, 82, 82, 82, 82, 82, 668,
+ 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669,
+ 669, 669, 669, 669, 669, 668, 669, 669, 669, 669, 669, 669, 669, 82, 82,
+ 82, 82, 329, 329, 329, 329, 329, 329, 329, 82, 82, 82, 82, 330, 330, 330,
+ 330, 330, 330, 330, 330, 330, 82, 82, 82, 82, 670, 670, 670, 670, 670,
+ 670, 670, 670, 671, 671, 671, 671, 671, 671, 671, 671, 593, 593, 594,
+ 594, 594, 594, 594, 594, 57, 57, 57, 57, 57, 57, 57, 82, 82, 82, 82, 102,
+ 102, 102, 102, 102, 82, 82, 82, 82, 82, 130, 672, 130, 130, 673, 130,
+ 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 82, 130, 130,
+ 130, 130, 130, 82, 130, 82, 130, 130, 82, 130, 130, 82, 130, 130, 147,
+ 147, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674,
+ 674, 674, 674, 82, 82, 82, 82, 82, 82, 82, 82, 82, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 147, 675, 471, 82, 82, 147, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 136, 139, 82, 82, 676, 676, 676, 676, 676,
+ 676, 676, 676, 677, 557, 557, 677, 677, 678, 678, 563, 564, 679, 82, 82,
+ 82, 82, 82, 82, 97, 97, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157,
+ 157, 96, 96, 558, 570, 570, 680, 680, 563, 564, 563, 564, 563, 564, 563,
+ 564, 563, 564, 563, 564, 563, 564, 563, 564, 558, 558, 563, 564, 558,
+ 558, 558, 558, 680, 680, 680, 681, 558, 681, 82, 581, 682, 678, 678, 570,
+ 524, 525, 524, 525, 524, 525, 683, 558, 558, 684, 685, 686, 686, 687, 82,
+ 558, 688, 689, 558, 82, 82, 82, 82, 147, 147, 147, 147, 147, 82, 82, 493,
+ 82, 690, 691, 692, 693, 694, 691, 691, 695, 696, 691, 697, 698, 699, 698,
+ 700, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 702, 703, 704,
+ 705, 704, 690, 691, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706,
+ 706, 706, 706, 706, 706, 706, 706, 706, 695, 691, 696, 707, 708, 707,
+ 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709,
+ 709, 709, 709, 709, 695, 705, 696, 705, 695, 696, 710, 711, 712, 710,
+ 713, 714, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, 714, 714,
714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714,
- 714, 714, 714, 714, 714, 714, 64, 64, 64, 715, 715, 715, 715, 715, 715,
- 715, 715, 715, 715, 64, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716,
- 716, 716, 717, 717, 717, 716, 716, 717, 718, 719, 717, 720, 720, 720,
- 720, 720, 720, 64, 64, 721, 721, 721, 721, 721, 721, 721, 64, 721, 64,
- 721, 721, 721, 721, 64, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721,
- 721, 721, 721, 721, 721, 64, 721, 721, 722, 64, 64, 64, 64, 64, 64, 723,
- 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723,
- 724, 725, 725, 725, 724, 724, 724, 724, 724, 724, 726, 727, 64, 64, 64,
- 64, 64, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 64, 64, 64, 64,
- 64, 64, 729, 729, 730, 730, 64, 731, 731, 731, 731, 731, 731, 731, 731,
- 64, 64, 731, 731, 64, 64, 731, 731, 731, 731, 731, 731, 731, 731, 731,
- 731, 731, 731, 731, 731, 64, 731, 731, 731, 731, 731, 731, 731, 64, 731,
- 731, 64, 731, 731, 731, 731, 731, 64, 64, 732, 731, 730, 730, 729, 730,
- 730, 730, 730, 64, 64, 730, 730, 64, 64, 730, 730, 733, 64, 64, 731, 64,
- 64, 64, 64, 64, 64, 730, 64, 64, 64, 64, 64, 731, 731, 731, 731, 731,
- 730, 730, 64, 64, 734, 734, 734, 734, 734, 734, 734, 64, 64, 64, 735,
- 735, 735, 735, 735, 735, 735, 735, 736, 736, 736, 737, 737, 737, 737,
- 737, 737, 736, 737, 736, 736, 736, 736, 737, 737, 736, 738, 739, 735,
- 735, 740, 735, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 64, 64,
- 64, 64, 64, 64, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742,
- 742, 742, 742, 742, 743, 743, 743, 744, 744, 744, 744, 64, 64, 743, 743,
- 743, 743, 744, 744, 743, 745, 746, 747, 747, 747, 747, 747, 747, 747,
- 747, 747, 747, 747, 747, 747, 747, 747, 742, 742, 742, 742, 744, 744, 64,
- 64, 748, 748, 748, 748, 748, 748, 748, 748, 749, 749, 749, 750, 750, 750,
- 750, 750, 750, 750, 750, 749, 749, 750, 749, 751, 750, 752, 752, 752,
- 748, 64, 64, 64, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 64,
- 64, 64, 64, 64, 64, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754,
- 754, 755, 756, 755, 756, 756, 755, 755, 755, 755, 755, 755, 757, 758,
- 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 64, 64, 64, 64, 64, 64,
- 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 64, 64, 64, 761, 761,
- 761, 762, 762, 761, 761, 761, 761, 762, 761, 761, 761, 761, 763, 64, 64,
- 64, 64, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 765, 765, 766,
- 766, 766, 767, 768, 768, 768, 768, 768, 768, 768, 768, 769, 769, 769,
- 769, 769, 769, 769, 769, 770, 770, 770, 770, 770, 770, 770, 770, 770,
- 770, 771, 771, 771, 771, 771, 771, 771, 771, 771, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 772, 773, 773, 773, 773, 773, 773, 773, 773, 773,
- 64, 64, 64, 64, 64, 64, 64, 774, 774, 774, 774, 774, 774, 774, 774, 774,
- 774, 64, 64, 64, 64, 64, 64, 775, 775, 775, 775, 775, 775, 775, 775, 775,
- 775, 775, 775, 775, 775, 775, 64, 776, 776, 776, 776, 776, 64, 64, 64,
- 774, 774, 774, 774, 64, 64, 64, 64, 777, 777, 777, 777, 777, 777, 777,
- 777, 777, 777, 777, 777, 777, 777, 777, 64, 778, 778, 778, 778, 778, 778,
- 778, 778, 778, 778, 778, 778, 778, 778, 778, 64, 511, 64, 64, 64, 64, 64,
- 64, 64, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779,
- 779, 779, 64, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 64, 64,
- 64, 64, 781, 781, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782,
- 782, 782, 782, 64, 64, 783, 783, 783, 783, 783, 784, 64, 64, 785, 785,
- 785, 785, 785, 785, 785, 785, 786, 786, 786, 786, 786, 786, 786, 787,
- 787, 787, 787, 787, 788, 788, 788, 788, 789, 789, 789, 789, 787, 788, 64,
- 64, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 64, 791, 791, 791,
- 791, 791, 791, 791, 64, 785, 785, 785, 785, 785, 64, 64, 64, 64, 64, 785,
- 785, 785, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
- 792, 64, 64, 64, 792, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793,
- 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 64, 64, 64,
- 64, 64, 64, 64, 64, 794, 794, 794, 794, 795, 795, 795, 795, 795, 795,
- 795, 795, 795, 795, 795, 795, 795, 486, 482, 64, 64, 64, 64, 64, 64, 796,
- 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 64, 64, 64, 64, 64,
- 796, 796, 796, 796, 796, 64, 64, 64, 796, 64, 64, 64, 64, 64, 64, 64,
- 796, 796, 64, 64, 797, 798, 799, 800, 410, 410, 410, 410, 64, 64, 64, 64,
- 277, 277, 277, 277, 277, 277, 64, 64, 277, 277, 277, 277, 277, 277, 277,
- 64, 64, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 801,
- 801, 400, 400, 400, 277, 277, 277, 802, 801, 801, 801, 801, 801, 410,
- 410, 410, 410, 410, 410, 410, 410, 136, 136, 136, 136, 136, 136, 136,
- 136, 277, 277, 78, 78, 78, 78, 78, 136, 136, 277, 277, 277, 277, 277,
- 277, 78, 78, 78, 78, 277, 277, 277, 64, 64, 64, 64, 64, 64, 64, 606, 606,
- 803, 803, 803, 606, 64, 64, 521, 521, 64, 64, 64, 64, 64, 64, 442, 442,
- 442, 442, 442, 442, 442, 442, 442, 442, 34, 34, 34, 34, 34, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, 442, 442,
- 442, 442, 442, 442, 34, 34, 34, 34, 34, 34, 34, 64, 34, 34, 34, 34, 34,
- 34, 442, 64, 442, 442, 64, 64, 442, 64, 64, 442, 442, 64, 64, 442, 442,
- 442, 442, 64, 442, 442, 34, 34, 64, 34, 64, 34, 34, 34, 34, 34, 34, 34,
- 64, 34, 34, 34, 34, 34, 34, 34, 442, 442, 64, 442, 442, 442, 442, 64, 64,
- 442, 442, 442, 442, 442, 442, 442, 442, 64, 442, 442, 442, 442, 442, 442,
- 442, 64, 34, 34, 442, 442, 64, 442, 442, 442, 442, 64, 442, 442, 442,
- 442, 442, 64, 442, 64, 64, 64, 442, 442, 442, 442, 442, 442, 442, 64, 34,
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 64, 64, 442, 804, 34, 34, 34,
- 34, 34, 34, 34, 34, 34, 445, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442,
- 442, 442, 442, 442, 442, 804, 34, 34, 34, 34, 34, 34, 34, 34, 34, 445,
- 34, 34, 442, 442, 442, 442, 442, 804, 34, 34, 34, 34, 34, 34, 34, 34, 34,
- 445, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, 442, 442, 442, 442, 442,
- 804, 34, 445, 34, 34, 34, 34, 34, 34, 34, 34, 442, 34, 64, 64, 805, 805,
- 805, 805, 805, 805, 805, 805, 805, 805, 806, 806, 806, 806, 806, 806,
- 806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
- 807, 807, 807, 806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807,
- 807, 807, 807, 806, 806, 806, 806, 806, 806, 806, 806, 807, 806, 806,
- 806, 806, 806, 806, 807, 806, 806, 808, 808, 808, 808, 808, 64, 64, 64,
- 64, 64, 64, 64, 807, 807, 807, 807, 807, 64, 807, 807, 807, 807, 807,
- 807, 807, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809,
- 809, 64, 64, 810, 810, 810, 810, 810, 810, 810, 810, 810, 811, 811, 811,
- 811, 811, 811, 811, 64, 126, 126, 126, 126, 64, 126, 126, 126, 64, 126,
- 126, 64, 126, 64, 64, 126, 64, 126, 126, 126, 126, 126, 126, 126, 126,
- 126, 126, 64, 126, 126, 126, 126, 64, 126, 64, 126, 64, 64, 64, 64, 64,
- 64, 126, 64, 64, 64, 64, 126, 64, 126, 64, 126, 64, 126, 126, 126, 64,
- 126, 64, 126, 64, 126, 64, 126, 64, 126, 126, 126, 126, 64, 126, 64, 126,
- 126, 64, 126, 126, 126, 126, 126, 126, 126, 126, 126, 64, 64, 64, 64, 64,
- 126, 126, 126, 64, 126, 126, 126, 113, 113, 64, 64, 64, 64, 64, 64, 64,
- 26, 26, 26, 26, 26, 26, 26, 33, 33, 33, 446, 446, 64, 64, 64, 453, 453,
- 453, 453, 453, 453, 277, 64, 453, 453, 26, 26, 64, 64, 64, 64, 453, 453,
- 453, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 277, 277, 812, 489, 489,
- 64, 64, 64, 64, 64, 489, 489, 489, 64, 64, 64, 64, 64, 489, 64, 64, 64,
- 64, 64, 64, 64, 489, 489, 64, 64, 64, 64, 64, 64, 26, 26, 26, 47, 47, 47,
- 47, 47, 26, 26, 64, 26, 26, 26, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26,
- 26, 64, 64, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 64, 64, 64, 496, 496,
- 496, 496, 496, 496, 496, 497, 496, 496, 496, 496, 496, 497, 497, 497,
- 497, 497, 497, 497, 497, 497, 64, 64, 64, 410, 64, 64, 64, 64, 64, 64,
- 410, 410, 410, 410, 410, 410, 410, 410, 565, 565, 565, 565, 565, 565, 64,
- 64,
+ 714, 714, 714, 714, 714, 717, 717, 718, 718, 718, 718, 718, 718, 718,
+ 718, 718, 718, 718, 718, 718, 718, 718, 82, 82, 82, 718, 718, 718, 718,
+ 718, 718, 82, 82, 718, 718, 718, 82, 82, 82, 719, 693, 705, 707, 720,
+ 693, 693, 82, 721, 722, 722, 722, 722, 721, 721, 82, 82, 723, 723, 723,
+ 724, 508, 82, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725,
+ 725, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 82, 725, 725,
+ 725, 82, 725, 725, 82, 725, 725, 725, 725, 725, 725, 725, 82, 82, 725,
+ 725, 725, 82, 82, 82, 82, 82, 199, 373, 199, 82, 82, 82, 82, 620, 620,
+ 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 82, 82, 82, 313,
+ 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 727,
+ 727, 727, 727, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728,
+ 728, 728, 728, 728, 728, 728, 727, 727, 728, 729, 729, 82, 41, 41, 41,
+ 41, 82, 82, 82, 82, 728, 82, 82, 82, 82, 82, 82, 82, 313, 313, 313, 313,
+ 313, 157, 82, 82, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730,
+ 730, 730, 82, 82, 82, 731, 731, 731, 731, 731, 731, 731, 731, 731, 82,
+ 82, 82, 82, 82, 82, 82, 157, 500, 500, 500, 500, 500, 500, 500, 500, 500,
+ 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 82, 82, 82, 82, 732,
+ 732, 732, 732, 732, 732, 732, 732, 733, 733, 733, 733, 82, 82, 82, 82,
+ 734, 734, 734, 734, 734, 734, 734, 734, 734, 735, 734, 734, 734, 734,
+ 734, 734, 734, 734, 735, 82, 82, 82, 82, 82, 736, 736, 736, 736, 736,
+ 736, 736, 736, 736, 736, 736, 736, 736, 736, 737, 737, 737, 737, 737, 82,
+ 82, 82, 82, 82, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738,
+ 738, 738, 738, 82, 739, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740,
+ 740, 740, 82, 82, 82, 82, 741, 742, 742, 742, 742, 742, 82, 82, 743, 743,
+ 743, 743, 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, 744, 744,
+ 745, 745, 745, 745, 745, 745, 745, 745, 746, 746, 746, 746, 746, 746,
+ 746, 746, 746, 746, 746, 746, 746, 746, 82, 82, 747, 747, 747, 747, 747,
+ 747, 747, 747, 747, 747, 82, 82, 82, 82, 82, 82, 748, 748, 748, 748, 748,
+ 748, 748, 748, 748, 748, 748, 748, 82, 82, 82, 82, 749, 749, 749, 749,
+ 749, 749, 749, 749, 749, 749, 749, 749, 82, 82, 82, 82, 750, 750, 750,
+ 750, 750, 750, 750, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751,
+ 751, 751, 751, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 752, 753, 753,
+ 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 82, 753,
+ 753, 753, 753, 753, 753, 82, 82, 754, 754, 754, 754, 754, 754, 82, 82,
+ 754, 82, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754,
+ 754, 754, 754, 754, 754, 754, 754, 82, 754, 754, 82, 82, 82, 754, 82, 82,
+ 754, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755,
+ 755, 82, 756, 757, 757, 757, 757, 757, 757, 757, 757, 758, 758, 758, 758,
+ 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 759, 760,
+ 760, 760, 760, 760, 760, 760, 761, 761, 761, 761, 761, 761, 761, 761,
+ 761, 761, 761, 761, 761, 761, 761, 82, 82, 82, 82, 82, 82, 82, 82, 762,
+ 762, 762, 762, 762, 762, 762, 762, 762, 763, 763, 763, 763, 763, 763,
+ 763, 763, 763, 763, 763, 82, 763, 763, 82, 82, 82, 82, 82, 764, 764, 764,
+ 764, 764, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765,
+ 765, 765, 766, 766, 766, 766, 766, 766, 82, 82, 82, 767, 768, 768, 768,
+ 768, 768, 768, 768, 768, 768, 768, 82, 82, 82, 82, 82, 769, 770, 770,
+ 770, 770, 770, 770, 770, 770, 771, 771, 771, 771, 771, 771, 771, 771, 82,
+ 82, 82, 82, 772, 772, 771, 771, 772, 772, 772, 772, 772, 772, 772, 772,
+ 82, 82, 772, 772, 772, 772, 772, 772, 773, 774, 774, 774, 82, 774, 774,
+ 82, 82, 82, 82, 82, 774, 775, 774, 776, 773, 773, 773, 773, 82, 773, 773,
+ 773, 82, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773,
+ 773, 773, 773, 773, 773, 773, 82, 82, 82, 82, 776, 777, 775, 82, 82, 82,
+ 82, 778, 779, 779, 779, 779, 779, 779, 779, 779, 780, 780, 780, 780, 780,
+ 780, 780, 780, 781, 82, 82, 82, 82, 82, 82, 82, 782, 782, 782, 782, 782,
+ 782, 782, 782, 782, 782, 782, 782, 782, 783, 783, 784, 785, 785, 785,
+ 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 786, 786, 786, 787,
+ 787, 787, 787, 787, 787, 787, 787, 788, 787, 787, 787, 787, 787, 787,
+ 787, 787, 787, 787, 787, 787, 789, 790, 82, 82, 82, 82, 791, 791, 791,
+ 791, 791, 792, 792, 792, 792, 792, 792, 793, 82, 794, 794, 794, 794, 794,
+ 794, 794, 794, 794, 794, 794, 794, 794, 794, 82, 82, 82, 795, 795, 795,
+ 795, 795, 795, 795, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796,
+ 796, 796, 796, 796, 82, 82, 797, 797, 797, 797, 797, 797, 797, 797, 798,
+ 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 82, 82, 82, 82, 82,
+ 799, 799, 799, 799, 799, 799, 799, 799, 800, 800, 800, 800, 800, 800,
+ 800, 800, 800, 800, 82, 82, 82, 82, 82, 82, 82, 801, 801, 801, 801, 82,
+ 82, 82, 82, 802, 802, 802, 802, 802, 802, 802, 803, 803, 803, 803, 803,
+ 803, 803, 803, 803, 82, 82, 82, 82, 82, 82, 82, 804, 804, 804, 804, 804,
+ 804, 804, 804, 804, 804, 804, 82, 82, 82, 82, 82, 805, 805, 805, 805,
+ 805, 805, 805, 805, 805, 805, 805, 82, 82, 82, 82, 82, 82, 82, 806, 806,
+ 806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807,
+ 807, 807, 807, 807, 807, 82, 808, 809, 808, 810, 810, 810, 810, 810, 810,
+ 810, 810, 810, 810, 810, 810, 810, 809, 809, 809, 809, 809, 809, 809,
+ 809, 809, 809, 809, 809, 809, 809, 811, 812, 812, 813, 813, 813, 813,
+ 813, 82, 82, 82, 82, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814,
+ 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 815, 815, 815, 815,
+ 815, 815, 815, 815, 815, 815, 82, 82, 82, 82, 82, 82, 82, 811, 816, 816,
+ 817, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818,
+ 817, 817, 817, 816, 816, 816, 816, 817, 817, 819, 820, 821, 821, 822,
+ 823, 823, 823, 823, 82, 82, 82, 82, 82, 82, 824, 824, 824, 824, 824, 824,
+ 824, 824, 824, 82, 82, 82, 82, 82, 82, 82, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 82, 82, 82, 82, 82, 82, 826, 826, 826, 827, 827, 827,
+ 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827,
+ 827, 827, 827, 828, 828, 828, 828, 828, 829, 828, 828, 828, 828, 828,
+ 828, 830, 830, 82, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 832,
+ 832, 832, 832, 82, 82, 82, 82, 833, 833, 833, 833, 833, 833, 833, 833,
+ 833, 833, 833, 834, 835, 836, 833, 82, 837, 837, 838, 839, 839, 839, 839,
+ 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 838, 838,
+ 838, 837, 837, 837, 837, 837, 837, 837, 837, 837, 838, 840, 839, 839,
+ 839, 839, 841, 841, 842, 841, 842, 843, 837, 837, 842, 82, 82, 844, 844,
+ 844, 844, 844, 844, 844, 844, 844, 844, 839, 845, 839, 841, 841, 841, 82,
+ 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846,
+ 846, 846, 846, 846, 846, 846, 82, 82, 82, 847, 847, 847, 847, 847, 847,
+ 847, 847, 847, 847, 82, 847, 847, 847, 847, 847, 847, 847, 847, 847, 848,
+ 848, 848, 849, 849, 849, 848, 848, 849, 850, 851, 849, 852, 852, 853,
+ 852, 852, 853, 849, 82, 854, 854, 854, 854, 854, 854, 854, 82, 854, 82,
+ 854, 854, 854, 854, 82, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854,
+ 854, 854, 854, 854, 854, 82, 854, 854, 855, 82, 82, 82, 82, 82, 82, 856,
+ 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856,
+ 857, 858, 858, 858, 857, 857, 857, 857, 857, 857, 859, 860, 82, 82, 82,
+ 82, 82, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 82, 82, 82, 82,
+ 82, 82, 862, 862, 863, 863, 82, 864, 864, 864, 864, 864, 864, 864, 864,
+ 82, 82, 864, 864, 82, 82, 864, 864, 864, 864, 864, 864, 864, 864, 864,
+ 864, 864, 864, 864, 864, 82, 864, 864, 864, 864, 864, 864, 864, 82, 864,
+ 864, 82, 864, 864, 864, 864, 864, 82, 82, 865, 864, 863, 863, 862, 863,
+ 863, 863, 863, 82, 82, 863, 863, 82, 82, 863, 863, 866, 82, 82, 864, 82,
+ 82, 82, 82, 82, 82, 863, 82, 82, 82, 82, 82, 864, 864, 864, 864, 864,
+ 863, 863, 82, 82, 867, 867, 867, 867, 867, 867, 867, 82, 82, 82, 868,
+ 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 869, 869,
+ 869, 870, 870, 870, 870, 870, 870, 870, 870, 869, 869, 871, 870, 870,
+ 869, 872, 868, 868, 868, 868, 873, 873, 873, 873, 874, 875, 875, 875,
+ 875, 875, 875, 875, 875, 875, 875, 82, 873, 82, 874, 82, 82, 876, 876,
+ 876, 876, 876, 876, 876, 876, 877, 877, 877, 878, 878, 878, 878, 878,
+ 878, 877, 878, 877, 877, 877, 877, 878, 878, 877, 879, 880, 876, 876,
+ 881, 876, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 82, 82, 82,
+ 82, 82, 82, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883,
+ 883, 883, 883, 884, 884, 884, 885, 885, 885, 885, 82, 82, 884, 884, 884,
+ 884, 885, 885, 884, 886, 887, 888, 889, 889, 890, 890, 891, 891, 891,
+ 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889,
+ 889, 883, 883, 883, 883, 885, 885, 82, 82, 892, 892, 892, 892, 892, 892,
+ 892, 892, 893, 893, 893, 894, 894, 894, 894, 894, 894, 894, 894, 893,
+ 893, 894, 893, 895, 894, 896, 896, 897, 892, 82, 82, 82, 898, 898, 898,
+ 898, 898, 898, 898, 898, 898, 898, 82, 82, 82, 82, 82, 82, 899, 899, 899,
+ 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 82, 82, 82, 900, 900,
+ 900, 900, 900, 900, 900, 900, 900, 900, 900, 901, 902, 901, 902, 902,
+ 901, 901, 901, 901, 901, 901, 903, 904, 905, 905, 905, 905, 905, 905,
+ 905, 905, 905, 905, 82, 82, 82, 82, 82, 82, 906, 906, 906, 906, 906, 906,
+ 906, 906, 906, 906, 82, 82, 82, 907, 907, 907, 908, 908, 907, 907, 907,
+ 907, 908, 907, 907, 907, 907, 909, 82, 82, 82, 82, 910, 910, 910, 910,
+ 910, 910, 910, 910, 910, 910, 911, 911, 912, 912, 912, 913, 914, 914,
+ 914, 914, 914, 914, 914, 914, 915, 915, 915, 915, 915, 915, 915, 915,
+ 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 917, 917, 917, 917,
+ 917, 917, 917, 917, 917, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 918, 919, 919, 919, 919, 919, 919, 919, 919, 919, 82, 82, 82, 82, 82, 82,
+ 82, 920, 920, 920, 920, 920, 920, 920, 920, 920, 82, 920, 920, 920, 920,
+ 920, 920, 920, 920, 920, 920, 920, 920, 920, 921, 922, 922, 922, 922,
+ 922, 922, 922, 82, 922, 922, 922, 922, 922, 922, 921, 923, 920, 924, 924,
+ 924, 924, 924, 82, 82, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925,
+ 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926,
+ 926, 926, 926, 926, 926, 82, 82, 82, 927, 928, 929, 929, 929, 929, 929,
+ 929, 929, 929, 929, 929, 929, 929, 929, 929, 82, 82, 930, 930, 930, 930,
+ 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 82, 931, 930, 930, 930,
+ 930, 930, 930, 930, 931, 930, 930, 931, 930, 930, 82, 932, 932, 932, 932,
+ 932, 932, 932, 932, 932, 932, 82, 82, 82, 82, 82, 82, 933, 933, 933, 933,
+ 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 82, 934, 934, 934,
+ 934, 934, 82, 82, 82, 932, 932, 932, 932, 82, 82, 82, 82, 935, 935, 935,
+ 935, 935, 935, 935, 935, 936, 936, 936, 937, 937, 937, 935, 935, 935,
+ 935, 937, 935, 935, 935, 936, 937, 936, 937, 935, 935, 935, 935, 935,
+ 935, 935, 936, 937, 937, 935, 935, 935, 935, 935, 935, 935, 935, 935,
+ 935, 935, 82, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938,
+ 938, 938, 939, 940, 938, 938, 938, 938, 938, 938, 938, 82, 609, 82, 82,
+ 82, 82, 82, 82, 82, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941,
+ 941, 941, 941, 941, 941, 82, 942, 942, 942, 942, 942, 942, 942, 942, 942,
+ 942, 82, 82, 82, 82, 943, 943, 944, 944, 944, 944, 944, 944, 944, 944,
+ 944, 944, 944, 944, 944, 944, 82, 82, 945, 945, 945, 945, 945, 946, 82,
+ 82, 947, 947, 947, 947, 947, 947, 947, 947, 948, 948, 948, 948, 948, 948,
+ 948, 949, 949, 949, 950, 950, 951, 951, 951, 951, 952, 952, 952, 952,
+ 949, 951, 82, 82, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 82,
+ 954, 954, 954, 954, 954, 954, 954, 82, 947, 947, 947, 947, 947, 82, 82,
+ 82, 82, 82, 947, 947, 947, 955, 955, 955, 955, 955, 955, 955, 955, 955,
+ 955, 955, 955, 955, 82, 82, 82, 955, 956, 956, 956, 956, 956, 956, 956,
+ 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956,
+ 956, 82, 82, 82, 82, 82, 82, 82, 82, 957, 957, 957, 957, 958, 958, 958,
+ 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 959, 82, 82, 82, 82,
+ 82, 82, 82, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960,
+ 960, 82, 82, 82, 960, 960, 960, 82, 82, 82, 82, 82, 580, 575, 82, 82, 82,
+ 82, 82, 82, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 82,
+ 82, 82, 82, 82, 961, 961, 961, 961, 961, 82, 82, 82, 961, 82, 82, 82, 82,
+ 82, 82, 82, 961, 961, 82, 82, 962, 963, 964, 965, 499, 499, 499, 499, 82,
+ 82, 82, 82, 313, 313, 313, 313, 313, 313, 82, 82, 313, 313, 313, 313,
+ 313, 313, 313, 82, 82, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313,
+ 313, 313, 966, 966, 447, 447, 447, 313, 313, 313, 967, 966, 966, 966,
+ 966, 966, 499, 499, 499, 499, 499, 499, 499, 499, 157, 157, 157, 157,
+ 157, 157, 157, 157, 313, 313, 97, 97, 97, 97, 97, 157, 157, 313, 313,
+ 313, 313, 313, 313, 97, 97, 97, 97, 313, 313, 313, 82, 82, 82, 82, 82,
+ 82, 82, 728, 728, 968, 968, 968, 728, 82, 82, 620, 620, 82, 82, 82, 82,
+ 82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 506, 506, 506,
+ 506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50, 50, 50, 50, 82, 50,
+ 50, 50, 50, 50, 50, 506, 82, 506, 506, 82, 82, 506, 82, 82, 506, 506, 82,
+ 82, 506, 506, 506, 506, 82, 506, 506, 50, 50, 82, 50, 82, 50, 50, 50, 50,
+ 50, 50, 50, 82, 50, 50, 50, 50, 50, 50, 50, 506, 506, 82, 506, 506, 506,
+ 506, 82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 82, 506, 506, 506,
+ 506, 506, 506, 506, 82, 50, 50, 506, 506, 82, 506, 506, 506, 506, 82,
+ 506, 506, 506, 506, 506, 82, 506, 82, 82, 82, 506, 506, 506, 506, 506,
+ 506, 506, 82, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 82, 82,
+ 506, 969, 50, 50, 50, 50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50,
+ 50, 506, 506, 506, 506, 506, 506, 506, 506, 506, 969, 50, 50, 50, 50, 50,
+ 50, 50, 50, 50, 513, 50, 50, 506, 506, 506, 506, 506, 969, 50, 50, 50,
+ 50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50, 50, 506, 506, 506, 506,
+ 506, 506, 506, 506, 506, 969, 50, 513, 50, 50, 50, 50, 50, 50, 50, 50,
+ 506, 50, 82, 82, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 971,
+ 971, 971, 971, 971, 971, 971, 971, 972, 972, 972, 972, 972, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 972, 972,
+ 972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 971, 971,
+ 971, 971, 972, 971, 971, 971, 971, 971, 971, 972, 971, 971, 973, 973,
+ 973, 973, 974, 82, 82, 82, 82, 82, 82, 82, 972, 972, 972, 972, 972, 82,
+ 972, 972, 972, 972, 972, 972, 972, 975, 975, 975, 975, 975, 975, 975, 82,
+ 975, 975, 975, 975, 975, 975, 975, 975, 975, 82, 82, 975, 975, 975, 975,
+ 975, 975, 975, 82, 975, 975, 82, 975, 975, 975, 975, 975, 82, 82, 82, 82,
+ 82, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 82,
+ 82, 977, 977, 977, 977, 977, 977, 977, 977, 977, 978, 978, 978, 978, 978,
+ 978, 978, 82, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 980, 980,
+ 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980,
+ 980, 980, 981, 981, 981, 981, 981, 981, 982, 82, 82, 82, 82, 82, 983,
+ 983, 983, 983, 983, 983, 983, 983, 983, 983, 82, 82, 82, 82, 984, 984,
+ 147, 147, 147, 147, 82, 147, 147, 147, 82, 147, 147, 82, 147, 82, 82,
+ 147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 82, 147, 147,
+ 147, 147, 82, 147, 82, 147, 82, 82, 82, 82, 82, 82, 147, 82, 82, 82, 82,
+ 147, 82, 147, 82, 147, 82, 147, 147, 147, 82, 147, 82, 147, 82, 147, 82,
+ 147, 82, 147, 147, 147, 147, 82, 147, 82, 147, 147, 82, 147, 147, 147,
+ 147, 147, 147, 147, 147, 147, 82, 82, 82, 82, 82, 147, 147, 147, 82, 147,
+ 147, 147, 133, 133, 82, 82, 82, 82, 82, 82, 527, 527, 527, 527, 523, 527,
+ 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 527, 527,
+ 527, 527, 527, 527, 527, 985, 985, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 527, 527, 523, 527, 527, 527, 527, 527, 527,
+ 985, 985, 48, 48, 48, 516, 516, 985, 985, 985, 528, 528, 528, 528, 528,
+ 528, 313, 985, 528, 528, 41, 41, 985, 985, 985, 985, 528, 528, 528, 528,
+ 528, 528, 986, 528, 528, 986, 986, 986, 986, 986, 986, 986, 986, 986,
+ 986, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 987, 987, 987, 987, 987, 987, 987, 987,
+ 987, 987, 988, 586, 586, 985, 985, 985, 985, 985, 586, 586, 586, 586,
+ 985, 985, 985, 985, 586, 985, 985, 985, 985, 985, 985, 985, 586, 586,
+ 985, 985, 985, 985, 985, 985, 523, 527, 527, 527, 527, 527, 527, 527,
+ 527, 527, 527, 527, 527, 523, 523, 523, 523, 523, 523, 523, 523, 523,
+ 527, 523, 523, 523, 523, 523, 523, 527, 523, 523, 523, 523, 523, 523,
+ 523, 534, 523, 523, 523, 523, 523, 523, 527, 527, 527, 527, 527, 527,
+ 527, 527, 41, 41, 527, 527, 523, 523, 523, 523, 523, 526, 526, 523, 523,
+ 523, 523, 523, 526, 523, 523, 523, 523, 523, 523, 534, 534, 523, 523,
+ 523, 523, 523, 534, 532, 527, 527, 527, 523, 523, 527, 527, 527, 523,
+ 527, 527, 527, 523, 523, 523, 989, 989, 989, 989, 989, 523, 523, 523,
+ 523, 523, 523, 523, 527, 523, 527, 534, 534, 523, 523, 534, 534, 534,
+ 534, 534, 534, 534, 534, 534, 534, 534, 523, 523, 523, 523, 523, 523,
+ 523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 534, 523, 523, 523,
+ 523, 534, 523, 534, 523, 523, 523, 534, 523, 523, 523, 523, 534, 534,
+ 534, 523, 534, 534, 534, 526, 523, 526, 523, 526, 523, 523, 523, 523,
+ 523, 534, 523, 523, 523, 523, 526, 523, 526, 526, 523, 523, 523, 523,
+ 523, 523, 523, 523, 523, 523, 527, 527, 523, 526, 526, 526, 526, 526,
+ 526, 526, 523, 523, 523, 523, 523, 523, 523, 523, 526, 526, 526, 526,
+ 526, 526, 523, 523, 523, 523, 523, 526, 526, 526, 526, 526, 526, 526,
+ 526, 526, 526, 526, 526, 41, 41, 41, 41, 527, 523, 523, 523, 523, 527,
+ 527, 527, 527, 527, 527, 532, 527, 527, 527, 527, 534, 527, 527, 527,
+ 527, 527, 532, 527, 527, 527, 527, 534, 534, 527, 527, 527, 527, 527, 41,
+ 41, 41, 41, 41, 41, 41, 41, 527, 527, 527, 527, 41, 41, 527, 523, 523,
+ 523, 523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 523, 523, 523,
+ 534, 534, 534, 534, 534, 41, 41, 41, 41, 41, 41, 536, 536, 536, 990, 990,
+ 990, 41, 41, 41, 41, 523, 523, 523, 534, 523, 523, 523, 523, 523, 523,
+ 523, 523, 534, 534, 534, 523, 534, 523, 523, 523, 523, 523, 527, 527,
+ 523, 523, 523, 985, 985, 985, 985, 985, 527, 527, 527, 523, 523, 985,
+ 985, 985, 527, 527, 527, 527, 523, 523, 523, 985, 41, 41, 41, 41, 985,
+ 985, 985, 985, 41, 41, 41, 41, 41, 985, 985, 985, 41, 41, 985, 985, 985,
+ 985, 985, 985, 41, 41, 41, 41, 41, 41, 985, 985, 534, 534, 534, 534, 534,
+ 534, 534, 985, 523, 523, 523, 523, 523, 523, 534, 523, 534, 985, 985,
+ 534, 534, 534, 534, 534, 534, 534, 523, 523, 534, 534, 534, 985, 523,
+ 523, 523, 523, 985, 985, 985, 985, 523, 523, 523, 523, 523, 523, 523,
+ 985, 523, 523, 985, 985, 985, 985, 985, 985, 523, 985, 985, 985, 985,
+ 985, 985, 985, 985, 985, 985, 985, 985, 985, 82, 82, 593, 593, 593, 593,
+ 593, 593, 593, 594, 593, 593, 593, 593, 593, 594, 594, 594, 594, 594,
+ 594, 594, 594, 594, 82, 82, 82, 499, 82, 82, 82, 82, 82, 82, 499, 499,
+ 499, 499, 499, 499, 499, 499, 671, 671, 671, 671, 671, 671, 82, 82,
};
/* decomposition data */
@@ -3874,98 +4326,98 @@ static const unsigned short decomp_data[] = {
25429, 266, 19968, 266, 19977, 266, 36938, 266, 24038, 266, 20013, 266,
21491, 266, 25351, 266, 36208, 266, 25171, 266, 31105, 266, 31354, 266,
21512, 266, 28288, 266, 26377, 266, 26376, 266, 30003, 266, 21106, 266,
- 21942, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309, 770, 12308,
- 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857, 12309, 770,
- 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308, 21213, 12309,
- 770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024,
- 256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398, 256, 20411, 256,
- 20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256,
- 55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256, 20855, 256, 55361,
- 56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361, 56651, 256, 20887,
- 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, 55396, 56799, 256,
- 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 256, 21106, 256,
- 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 256, 21242, 256,
- 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 256, 21338, 256,
- 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 256, 55362, 56876,
- 256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187, 256, 21483, 256,
- 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, 21608, 256,
- 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, 21892, 256,
- 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, 22294, 256,
- 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, 22766, 256,
- 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, 22577, 256,
- 22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256, 22790, 256, 22810,
- 256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365, 57066, 256, 23020,
- 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076,
- 256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776, 256, 23491, 256,
- 23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256, 23551, 256, 23558,
- 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744,
- 256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367, 56806, 256, 23918,
- 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256, 14383, 256, 24061,
- 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256, 55368, 56707, 256,
- 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266, 256, 55400, 57234,
- 256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256, 33281, 256, 24354,
- 256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384, 56794, 256, 24418,
- 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, 256, 24569,
- 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 55369, 57044, 256,
- 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, 256,
- 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, 256,
- 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, 256,
- 25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256, 25448, 256, 25475,
- 256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541, 256, 25513, 256,
- 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256,
- 25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256, 26360, 256, 26185,
- 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885,
- 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395,
- 256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283, 256, 15177, 256,
- 26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373, 56429, 256, 26766,
- 256, 26655, 256, 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114,
- 256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384, 256, 27425, 256,
- 55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256, 27551, 256, 27578,
- 256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256, 55374, 57082, 256,
- 27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256, 27751, 256, 27926,
- 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, 256, 28037,
- 256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270, 256, 15667, 256,
- 28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256, 28526, 256, 55375,
- 57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256, 28702, 256, 28699,
- 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 55361,
- 56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256, 55376, 57259, 256,
- 29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256, 29312, 256, 29333,
- 256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256, 29579, 256, 16044,
- 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256, 29788, 256, 29809,
- 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256, 55379, 56374, 256,
- 30014, 256, 55379, 56466, 256, 30064, 256, 55368, 56735, 256, 30224, 256,
- 55379, 57249, 256, 55379, 57272, 256, 55380, 56388, 256, 16380, 256,
- 16392, 256, 30452, 256, 55380, 56563, 256, 55380, 56562, 256, 55380,
- 56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256, 30495, 256, 30538,
- 256, 16441, 256, 30603, 256, 16454, 256, 16534, 256, 55381, 56349, 256,
- 30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381, 56870, 256, 31062,
- 256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256, 31211, 256, 16687,
- 256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700, 256, 55382, 56999,
- 256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382, 57259, 256, 31686,
- 256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954, 256, 17056, 256,
- 31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256, 32099, 256, 17153,
- 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 55384, 56872, 256,
- 55384, 56903, 256, 17241, 256, 55384, 57049, 256, 32634, 256, 55384,
- 57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385, 56538, 256, 55385,
- 56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256, 55372, 57183, 256,
- 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, 256, 23221, 256,
- 55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256, 55372, 57244,
- 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419,
- 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510,
- 256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256,
- 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256,
- 33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256, 55387,
- 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388, 57290,
- 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387, 57265,
- 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407, 256,
- 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681, 256,
- 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817, 256,
- 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256, 35038,
- 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390, 56678,
- 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 35925,
- 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256,
- 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336, 256,
- 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393,
+ 21942, 266, 37197, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309,
+ 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857,
+ 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308,
+ 21213, 12309, 770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256,
+ 20029, 256, 20024, 256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398,
+ 256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687,
+ 256, 13470, 256, 55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256,
+ 20855, 256, 55361, 56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361,
+ 56651, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256,
+ 55396, 56799, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062,
+ 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220,
+ 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329,
+ 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375,
+ 256, 55362, 56876, 256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187,
+ 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576,
+ 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859,
+ 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954,
+ 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999,
+ 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578,
+ 256, 22577, 256, 22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256,
+ 22790, 256, 22810, 256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365,
+ 57066, 256, 23020, 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256,
+ 14062, 256, 14076, 256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776,
+ 256, 23491, 256, 23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256,
+ 23551, 256, 23558, 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256,
+ 23662, 256, 23744, 256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367,
+ 56806, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256,
+ 14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256,
+ 55368, 56707, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266,
+ 256, 55400, 57234, 256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256,
+ 33281, 256, 24354, 256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384,
+ 56794, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256,
+ 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256,
+ 55369, 57044, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908,
+ 256, 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054,
+ 256, 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265,
+ 256, 25300, 256, 25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256,
+ 25448, 256, 25475, 256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541,
+ 256, 25513, 256, 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719,
+ 256, 14956, 256, 25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256,
+ 26360, 256, 26185, 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256,
+ 20882, 256, 20885, 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256,
+ 26391, 256, 26395, 256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283,
+ 256, 15177, 256, 26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373,
+ 56429, 256, 26766, 256, 26655, 256, 26900, 256, 15261, 256, 26946, 256,
+ 27043, 256, 27114, 256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384,
+ 256, 27425, 256, 55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256,
+ 27551, 256, 27578, 256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256,
+ 55374, 57082, 256, 27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256,
+ 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256,
+ 28024, 256, 28037, 256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270,
+ 256, 15667, 256, 28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256,
+ 28526, 256, 55375, 57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256,
+ 28702, 256, 28699, 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256,
+ 28845, 256, 55361, 56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256,
+ 55376, 57259, 256, 29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256,
+ 29312, 256, 29333, 256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256,
+ 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256,
+ 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256,
+ 55379, 56374, 256, 30014, 256, 55379, 56466, 256, 30064, 256, 55368,
+ 56735, 256, 30224, 256, 55379, 57249, 256, 55379, 57272, 256, 55380,
+ 56388, 256, 16380, 256, 16392, 256, 30452, 256, 55380, 56563, 256, 55380,
+ 56562, 256, 55380, 56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256,
+ 30495, 256, 30538, 256, 16441, 256, 30603, 256, 16454, 256, 16534, 256,
+ 55381, 56349, 256, 30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381,
+ 56870, 256, 31062, 256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256,
+ 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700,
+ 256, 55382, 56999, 256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382,
+ 57259, 256, 31686, 256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954,
+ 256, 17056, 256, 31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256,
+ 32099, 256, 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256,
+ 55384, 56872, 256, 55384, 56903, 256, 17241, 256, 55384, 57049, 256,
+ 32634, 256, 55384, 57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385,
+ 56538, 256, 55385, 56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256,
+ 55372, 57183, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086,
+ 256, 23221, 256, 55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256,
+ 55372, 57244, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425,
+ 256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469,
+ 256, 33510, 256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256,
+ 33709, 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256,
+ 33738, 256, 33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256,
+ 55387, 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388,
+ 57290, 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387,
+ 57265, 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407,
+ 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681,
+ 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817,
+ 256, 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256,
+ 35038, 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390,
+ 56678, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256,
+ 35925, 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215,
+ 256, 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336,
+ 256, 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393,
56813, 256, 37012, 256, 37105, 256, 37137, 256, 55393, 57134, 256, 37147,
256, 37432, 256, 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909,
256, 55394, 57338, 256, 38283, 256, 18837, 256, 38327, 256, 55395, 56695,
@@ -4642,64 +5094,64 @@ static const unsigned short decomp_index2[] = {
13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121,
13123, 13125, 13127, 13129, 13131, 13133, 13135, 13137, 13139, 13141,
13143, 13145, 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161,
- 13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 0, 0, 0, 0, 0,
- 13179, 13183, 13187, 13191, 13195, 13199, 13203, 13207, 13211, 0, 0, 0,
- 0, 0, 0, 0, 13215, 13217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 13219, 13221, 13223, 13225, 13228, 13230, 13232, 13234, 13236, 13238,
- 13240, 13242, 13244, 13246, 13249, 13251, 13253, 13255, 13257, 13260,
- 13262, 13264, 13266, 13269, 13271, 13273, 13275, 13277, 13279, 13282,
- 13284, 13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302,
- 13304, 13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322,
- 13324, 13326, 13328, 13331, 13333, 13335, 13337, 13340, 13342, 13344,
- 13346, 13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364,
- 13366, 13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384,
- 13386, 13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404,
- 13407, 13409, 13411, 13413, 13415, 13417, 13419, 13422, 13425, 13427,
- 13429, 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13448,
- 13450, 13452, 13454, 13456, 13459, 13461, 13463, 13465, 13467, 13469,
- 13471, 13473, 13475, 13477, 13480, 13482, 13485, 13487, 13489, 13491,
- 13493, 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13510, 13512,
- 13514, 13516, 13518, 13520, 13523, 13525, 13528, 13531, 13533, 13535,
- 13537, 13539, 13542, 13545, 13547, 13549, 13551, 13553, 13555, 13557,
- 13559, 13561, 13563, 13565, 13567, 13570, 13572, 13574, 13576, 13578,
- 13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598,
- 13600, 13602, 13604, 13606, 13608, 13611, 13613, 13615, 13617, 13619,
- 13621, 13624, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640,
- 13642, 13644, 13646, 13649, 13651, 13653, 13655, 13657, 13659, 13661,
- 13663, 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681,
- 13683, 13685, 13688, 13690, 13692, 13694, 13696, 13698, 13701, 13703,
- 13705, 13707, 13709, 13711, 13713, 13715, 13717, 13720, 13722, 13724,
- 13726, 13729, 13731, 13733, 13735, 13737, 13739, 13741, 13744, 13747,
- 13750, 13752, 13755, 13757, 13759, 13761, 13763, 13765, 13767, 13769,
- 13771, 13773, 13775, 13778, 13780, 13782, 13784, 13786, 13788, 13790,
- 13793, 13795, 13797, 13800, 13803, 13805, 13807, 13809, 13811, 13813,
- 13815, 13817, 13819, 13821, 13824, 13826, 13829, 13831, 13834, 13836,
- 13838, 13840, 13843, 13845, 13847, 13850, 13853, 13855, 13857, 13859,
- 13861, 13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879,
- 13882, 13884, 13887, 13889, 13892, 13894, 13897, 13900, 13903, 13905,
- 13907, 13909, 13912, 13915, 13918, 13921, 13923, 13925, 13927, 13929,
- 13931, 13933, 13935, 13937, 13940, 13942, 13944, 13946, 13948, 13951,
- 13953, 13956, 13959, 13961, 13963, 13965, 13967, 13969, 13971, 13974,
- 13977, 13980, 13982, 13984, 13987, 13989, 13991, 13993, 13996, 13998,
- 14000, 14002, 14004, 14006, 14009, 14011, 14013, 14015, 14017, 14019,
- 14021, 14024, 14027, 14029, 14032, 14034, 14037, 14039, 14041, 14043,
- 14046, 14049, 14051, 14054, 14056, 14059, 14061, 14063, 14065, 14067,
- 14069, 14071, 14074, 14077, 14080, 14083, 14085, 14087, 14089, 14091,
- 14093, 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14110, 14112,
- 14114, 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132,
- 14134, 14137, 14140, 14143, 14145, 14147, 14149, 14151, 14154, 14156,
- 14159, 14161, 14163, 14166, 14169, 14171, 14173, 14175, 14177, 14179,
- 14181, 14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199,
- 14201, 14203, 14205, 14207, 14210, 14212, 14214, 14216, 14218, 14220,
- 14223, 14226, 14228, 14230, 14232, 14234, 14236, 14238, 14241, 14243,
- 14245, 14247, 14249, 14252, 14255, 14257, 14259, 14261, 14264, 14266,
- 14268, 14271, 14274, 14276, 14278, 14280, 14283, 14285, 14287, 14289,
- 14291, 14293, 14295, 14297, 14300, 14302, 14304, 14306, 14309, 14311,
- 14313, 14315, 14317, 14320, 14323, 14325, 14327, 14329, 14332, 14334,
- 14337, 14339, 14341, 14343, 14346, 14348, 14350, 14352, 14354, 14356,
- 14358, 14360, 14363, 14365, 14367, 14369, 14371, 14373, 14375, 14378,
- 14380, 14383, 14386, 14389, 14391, 14393, 14395, 14397, 14399, 14401,
- 14403, 14405, 0, 0,
+ 13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 13179, 0, 0, 0,
+ 0, 13181, 13185, 13189, 13193, 13197, 13201, 13205, 13209, 13213, 0, 0,
+ 0, 0, 0, 0, 0, 13217, 13219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 13221, 13223, 13225, 13227, 13230, 13232, 13234, 13236, 13238, 13240,
+ 13242, 13244, 13246, 13248, 13251, 13253, 13255, 13257, 13259, 13262,
+ 13264, 13266, 13268, 13271, 13273, 13275, 13277, 13279, 13281, 13284,
+ 13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302, 13304,
+ 13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322, 13324,
+ 13326, 13328, 13330, 13333, 13335, 13337, 13339, 13342, 13344, 13346,
+ 13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364, 13366,
+ 13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384, 13386,
+ 13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404, 13406,
+ 13409, 13411, 13413, 13415, 13417, 13419, 13421, 13424, 13427, 13429,
+ 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13450,
+ 13452, 13454, 13456, 13458, 13461, 13463, 13465, 13467, 13469, 13471,
+ 13473, 13475, 13477, 13479, 13482, 13484, 13487, 13489, 13491, 13493,
+ 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13512, 13514,
+ 13516, 13518, 13520, 13522, 13525, 13527, 13530, 13533, 13535, 13537,
+ 13539, 13541, 13544, 13547, 13549, 13551, 13553, 13555, 13557, 13559,
+ 13561, 13563, 13565, 13567, 13569, 13572, 13574, 13576, 13578, 13580,
+ 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598, 13600,
+ 13602, 13604, 13606, 13608, 13610, 13613, 13615, 13617, 13619, 13621,
+ 13623, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640, 13642,
+ 13644, 13646, 13648, 13651, 13653, 13655, 13657, 13659, 13661, 13663,
+ 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, 13683,
+ 13685, 13687, 13690, 13692, 13694, 13696, 13698, 13700, 13703, 13705,
+ 13707, 13709, 13711, 13713, 13715, 13717, 13719, 13722, 13724, 13726,
+ 13728, 13731, 13733, 13735, 13737, 13739, 13741, 13743, 13746, 13749,
+ 13752, 13754, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771,
+ 13773, 13775, 13777, 13780, 13782, 13784, 13786, 13788, 13790, 13792,
+ 13795, 13797, 13799, 13802, 13805, 13807, 13809, 13811, 13813, 13815,
+ 13817, 13819, 13821, 13823, 13826, 13828, 13831, 13833, 13836, 13838,
+ 13840, 13842, 13845, 13847, 13849, 13852, 13855, 13857, 13859, 13861,
+ 13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879, 13881,
+ 13884, 13886, 13889, 13891, 13894, 13896, 13899, 13902, 13905, 13907,
+ 13909, 13911, 13914, 13917, 13920, 13923, 13925, 13927, 13929, 13931,
+ 13933, 13935, 13937, 13939, 13942, 13944, 13946, 13948, 13950, 13953,
+ 13955, 13958, 13961, 13963, 13965, 13967, 13969, 13971, 13973, 13976,
+ 13979, 13982, 13984, 13986, 13989, 13991, 13993, 13995, 13998, 14000,
+ 14002, 14004, 14006, 14008, 14011, 14013, 14015, 14017, 14019, 14021,
+ 14023, 14026, 14029, 14031, 14034, 14036, 14039, 14041, 14043, 14045,
+ 14048, 14051, 14053, 14056, 14058, 14061, 14063, 14065, 14067, 14069,
+ 14071, 14073, 14076, 14079, 14082, 14085, 14087, 14089, 14091, 14093,
+ 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14112, 14114,
+ 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134,
+ 14136, 14139, 14142, 14145, 14147, 14149, 14151, 14153, 14156, 14158,
+ 14161, 14163, 14165, 14168, 14171, 14173, 14175, 14177, 14179, 14181,
+ 14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199, 14201,
+ 14203, 14205, 14207, 14209, 14212, 14214, 14216, 14218, 14220, 14222,
+ 14225, 14228, 14230, 14232, 14234, 14236, 14238, 14240, 14243, 14245,
+ 14247, 14249, 14251, 14254, 14257, 14259, 14261, 14263, 14266, 14268,
+ 14270, 14273, 14276, 14278, 14280, 14282, 14285, 14287, 14289, 14291,
+ 14293, 14295, 14297, 14299, 14302, 14304, 14306, 14308, 14311, 14313,
+ 14315, 14317, 14319, 14322, 14325, 14327, 14329, 14331, 14334, 14336,
+ 14339, 14341, 14343, 14345, 14348, 14350, 14352, 14354, 14356, 14358,
+ 14360, 14362, 14365, 14367, 14369, 14371, 14373, 14375, 14377, 14380,
+ 14382, 14385, 14388, 14391, 14393, 14395, 14397, 14399, 14401, 14403,
+ 14405, 14407, 0, 0,
};
/* NFC pairs */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh
index 6cbcfa3de80..3e342d43278 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh
@@ -115,6 +115,8 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
/* XXX This hack belongs to the Tibetan shaper:
* Reorder PADMA to ensure it comes after any vowel marks. */
if (unlikely (unicode == 0x0FC6u)) return 254;
+ /* Reorder TSA -PHRU to reorder before U+0F74 */
+ if (unlikely (unicode == 0x0F39u)) return 127;
return _hb_modified_combining_class[combining_class (unicode)];
}
@@ -180,8 +182,8 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
case 0x17: return hb_in_range (ch, 0x17B4u, 0x17B5u);
case 0x18: return hb_in_range (ch, 0x180Bu, 0x180Eu);
case 0x20: return hb_in_ranges (ch, 0x200Bu, 0x200Fu,
- 0x202Au, 0x202Eu,
- 0x2060u, 0x206Fu);
+ 0x202Au, 0x202Eu,
+ 0x2060u, 0x206Fu);
case 0xFE: return hb_in_range (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
case 0xFF: return hb_in_range (ch, 0xFFF0u, 0xFFF8u);
default: return false;
@@ -199,6 +201,50 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
}
}
+ /* Space estimates based on:
+ * http://www.unicode.org/charts/PDF/U2000.pdf
+ * https://www.microsoft.com/typography/developers/fdsspec/spaces.aspx
+ */
+ enum space_t {
+ NOT_SPACE = 0,
+ SPACE_EM = 1,
+ SPACE_EM_2 = 2,
+ SPACE_EM_3 = 3,
+ SPACE_EM_4 = 4,
+ SPACE_EM_5 = 5,
+ SPACE_EM_6 = 6,
+ SPACE_EM_16 = 16,
+ SPACE_4_EM_18, /* 4/18th of an EM! */
+ SPACE,
+ SPACE_FIGURE,
+ SPACE_PUNCTUATION,
+ SPACE_NARROW,
+ };
+ static inline space_t
+ space_fallback_type (hb_codepoint_t u)
+ {
+ switch (u)
+ {
+ /* All GC=Zs chars that can use a fallback. */
+ default: return NOT_SPACE; /* U+1680 OGHAM SPACE MARK */
+ case 0x0020u: return SPACE; /* U+0020 SPACE */
+ case 0x00A0u: return SPACE; /* U+00A0 NO-BREAK SPACE */
+ case 0x2000u: return SPACE_EM_2; /* U+2000 EN QUAD */
+ case 0x2001u: return SPACE_EM; /* U+2001 EM QUAD */
+ case 0x2002u: return SPACE_EM_2; /* U+2002 EN SPACE */
+ case 0x2003u: return SPACE_EM; /* U+2003 EM SPACE */
+ case 0x2004u: return SPACE_EM_3; /* U+2004 THREE-PER-EM SPACE */
+ case 0x2005u: return SPACE_EM_4; /* U+2005 FOUR-PER-EM SPACE */
+ case 0x2006u: return SPACE_EM_6; /* U+2006 SIX-PER-EM SPACE */
+ case 0x2007u: return SPACE_FIGURE; /* U+2007 FIGURE SPACE */
+ case 0x2008u: return SPACE_PUNCTUATION; /* U+2008 PUNCTUATION SPACE */
+ case 0x2009u: return SPACE_EM_5; /* U+2009 THIN SPACE */
+ case 0x200Au: return SPACE_EM_16; /* U+200A HAIR SPACE */
+ case 0x202Fu: return SPACE_NARROW; /* U+202F NARROW NO-BREAK SPACE */
+ case 0x205Fu: return SPACE_4_EM_18; /* U+205F MEDIUM MATHEMATICAL SPACE */
+ case 0x3000u: return SPACE_EM; /* U+3000 IDEOGRAPHIC SPACE */
+ }
+ }
struct {
#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name;
@@ -299,10 +345,12 @@ extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
#define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */
#define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */
-/* Tibetan */
+/* Tibetan
+ * Modify U+0F74 (ccc=132) to reorder before ccc=130 marks.
+ */
#define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */
#define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */
-#define HB_MODIFIED_COMBINING_CLASS_CCC132 132 /* sign u */
+#define HB_MODIFIED_COMBINING_CLASS_CCC132 128 /* sign u */
/* Misc */
@@ -313,5 +361,10 @@ extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
+#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \
+ (FLAG_SAFE (gen_cat) & \
+ (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
+ FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL)))
#endif /* HB_UNICODE_PRIVATE_HH */
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h
index 4edb5fcd45b..99b2986e382 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h
@@ -174,23 +174,23 @@ typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
/*
* just give me the best implementation you've got there.
*/
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_get_default (void);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_create (hb_unicode_funcs_t *parent);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_get_empty (void);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs);
-void
+HB_EXTERN void
hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
hb_user_data_key_t *key,
void * data,
@@ -198,18 +198,18 @@ hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
hb_bool_t replace);
-void *
+HB_EXTERN void *
hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
hb_user_data_key_t *key);
-void
+HB_EXTERN void
hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs);
-hb_unicode_funcs_t *
+HB_EXTERN hb_unicode_funcs_t *
hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs);
@@ -285,7 +285,7 @@ typedef unsigned int (*hb_unicode_decompose_compatibility_fun
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_combining_class_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -301,7 +301,7 @@ hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_eastasian_width_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -317,7 +317,7 @@ hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_general_category_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -333,7 +333,7 @@ hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_mirroring_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -349,7 +349,7 @@ hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_script_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -365,7 +365,7 @@ hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_compose_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -381,7 +381,7 @@ hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_decompose_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -397,7 +397,7 @@ hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
*
* Since: 0.9.2
**/
-void
+HB_EXTERN void
hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs,
hb_unicode_decompose_compatibility_func_t func,
void *user_data, hb_destroy_func_t destroy);
@@ -405,62 +405,63 @@ hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs,
/* accessors */
/**
+ * hb_unicode_combining_class:
+ *
* Since: 0.9.2
**/
-hb_unicode_combining_class_t
+HB_EXTERN hb_unicode_combining_class_t
hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
+ * hb_unicode_eastasian_width:
+ *
* Since: 0.9.2
**/
-unsigned int
+HB_EXTERN unsigned int
hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
+ * hb_unicode_general_category:
+ *
* Since: 0.9.2
**/
-hb_unicode_general_category_t
+HB_EXTERN hb_unicode_general_category_t
hb_unicode_general_category (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
+ * hb_unicode_mirroring:
+ *
* Since: 0.9.2
**/
-hb_codepoint_t
+HB_EXTERN hb_codepoint_t
hb_unicode_mirroring (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
/**
+ * hb_unicode_script:
+ *
* Since: 0.9.2
**/
-hb_script_t
+HB_EXTERN hb_script_t
hb_unicode_script (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t unicode);
-/**
- * Since: 0.9.2
- **/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t a,
hb_codepoint_t b,
hb_codepoint_t *ab);
-/**
- * Since: 0.9.2
- **/
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t ab,
hb_codepoint_t *a,
hb_codepoint_t *b);
-/**
- * Since: 0.9.2
- **/
-unsigned int
+HB_EXTERN unsigned int
hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
hb_codepoint_t u,
hb_codepoint_t *decomposed);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh
index 580bfd8ed14..a465842a3f0 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh
@@ -146,11 +146,11 @@ struct hb_utf16_t
return text;
}
- if (likely (hb_in_range (c, 0xD800u, 0xDBFFu)))
+ if (likely (c <= 0xDBFFu && text < end))
{
/* High-surrogate in c */
- hb_codepoint_t l;
- if (text < end && ((l = *text), likely (hb_in_range (l, 0xDC00u, 0xDFFFu))))
+ hb_codepoint_t l = *text;
+ if (likely (hb_in_range (l, 0xDC00u, 0xDFFFu)))
{
/* Low-surrogate in l */
*unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
@@ -170,8 +170,7 @@ struct hb_utf16_t
hb_codepoint_t *unicode,
hb_codepoint_t replacement)
{
- const uint16_t *end = text--;
- hb_codepoint_t c = *text;
+ hb_codepoint_t c = *--text;
if (likely (!hb_in_range (c, 0xD800u, 0xDFFFu)))
{
@@ -179,14 +178,22 @@ struct hb_utf16_t
return text;
}
- if (likely (start < text && hb_in_range (c, 0xDC00u, 0xDFFFu)))
- text--;
-
- if (likely (next (text, end, unicode, replacement) == end))
- return text;
+ if (likely (c >= 0xDC00u && start < text))
+ {
+ /* Low-surrogate in c */
+ hb_codepoint_t h = text[-1];
+ if (likely (hb_in_range (h, 0xD800u, 0xDBFFu)))
+ {
+ /* High-surrogate in h */
+ *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
+ text--;
+ return text;
+ }
+ }
+ /* Lonely / out-of-order surrogate. */
*unicode = replacement;
- return end - 1;
+ return text;
}
@@ -211,14 +218,9 @@ struct hb_utf32_t
hb_codepoint_t *unicode,
hb_codepoint_t replacement)
{
- hb_codepoint_t c = *text++;
- if (validate && unlikely (c > 0x10FFFFu || hb_in_range (c, 0xD800u, 0xDFFFu)))
- goto error;
- *unicode = c;
- return text;
-
- error:
- *unicode = replacement;
+ hb_codepoint_t c = *unicode = *text++;
+ if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+ *unicode = replacement;
return text;
}
@@ -228,8 +230,10 @@ struct hb_utf32_t
hb_codepoint_t *unicode,
hb_codepoint_t replacement)
{
- next (text - 1, text, unicode, replacement);
- return text - 1;
+ hb_codepoint_t c = *unicode = *--text;
+ if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
+ *unicode = replacement;
+ return text;
}
static inline unsigned int
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h
index 16cf5e3fc4b..5bcd33c61a6 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h
@@ -37,25 +37,25 @@ HB_BEGIN_DECLS
#define HB_VERSION_MAJOR 1
-#define HB_VERSION_MINOR 0
-#define HB_VERSION_MICRO 5
+#define HB_VERSION_MINOR 3
+#define HB_VERSION_MICRO 0
-#define HB_VERSION_STRING "1.0.5"
+#define HB_VERSION_STRING "1.3.0"
#define HB_VERSION_ATLEAST(major,minor,micro) \
((major)*10000+(minor)*100+(micro) <= \
HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO)
-void
+HB_EXTERN void
hb_version (unsigned int *major,
unsigned int *minor,
unsigned int *micro);
-const char *
+HB_EXTERN const char *
hb_version_string (void);
-hb_bool_t
+HB_EXTERN hb_bool_t
hb_version_atleast (unsigned int major,
unsigned int minor,
unsigned int micro);
diff --git a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h
index c5a938a3818..7402034f437 100644
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h
+++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h
@@ -28,6 +28,10 @@
#define HB_H
#define HB_H_IN
+#ifndef HB_EXTERN
+#define HB_EXTERN extern
+#endif
+
#include "hb-blob.h"
#include "hb-buffer.h"
#include "hb-common.h"
From 88f2ad28aa275c1e07bbcad2fc0f1c9d39eebce7 Mon Sep 17 00:00:00 2001
From: Alexander Zvegintsev
Date: Wed, 10 Aug 2016 02:50:58 +0300
Subject: [PATCH 052/120] 8155690: Update libPNG library to the latest
up-to-date
Reviewed-by: serb
---
.../native/libsplashscreen/libpng/CHANGES | 154 ++++++++++-
.../native/libsplashscreen/libpng/LICENSE | 34 ++-
.../native/libsplashscreen/libpng/README | 2 +-
.../share/native/libsplashscreen/libpng/png.c | 13 +-
.../share/native/libsplashscreen/libpng/png.h | 253 +++++++++++++-----
.../native/libsplashscreen/libpng/pngconf.h | 4 +-
.../native/libsplashscreen/libpng/pngdebug.h | 2 +-
.../native/libsplashscreen/libpng/pngerror.c | 4 +-
.../native/libsplashscreen/libpng/pngget.c | 16 +-
.../native/libsplashscreen/libpng/pnginfo.h | 2 +-
.../libsplashscreen/libpng/pnglibconf.h | 6 +-
.../native/libsplashscreen/libpng/pngmem.c | 2 +-
.../native/libsplashscreen/libpng/pngpread.c | 19 +-
.../native/libsplashscreen/libpng/pngpriv.h | 7 +-
.../native/libsplashscreen/libpng/pngread.c | 156 ++++++-----
.../native/libsplashscreen/libpng/pngrio.c | 2 +-
.../native/libsplashscreen/libpng/pngrtran.c | 15 +-
.../native/libsplashscreen/libpng/pngrutil.c | 4 +-
.../native/libsplashscreen/libpng/pngset.c | 98 ++++++-
.../native/libsplashscreen/libpng/pngstruct.h | 2 +-
.../native/libsplashscreen/libpng/pngtest.c | 15 +-
.../native/libsplashscreen/libpng/pngtrans.c | 2 +-
.../native/libsplashscreen/libpng/pngwio.c | 2 +-
.../native/libsplashscreen/libpng/pngwrite.c | 173 +++++++++++-
.../native/libsplashscreen/libpng/pngwtran.c | 2 +-
.../native/libsplashscreen/libpng/pngwutil.c | 100 +------
26 files changed, 798 insertions(+), 291 deletions(-)
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
index 8d9d53ee4e2..f7973c470a0 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/CHANGES
@@ -5088,7 +5088,8 @@ Version 1.6.15beta04 [November 4, 2014]
Version 1.6.15beta05 [November 5, 2014]
Use png_get_libpng_ver(NULL) instead of PNG_LIBPNG_VER_STRING in
example.c, pngtest.c, and applications in the contrib directory.
- Avoid out-of-bounds memory access in png_user_version_check().
+ Fixed an out-of-range read in png_user_version_check() (Bug report from
+ Qixue Xiao, CVE-2015-8540).
Simplified and future-proofed png_user_version_check().
Fixed GCC unsigned int->float warnings. Various versions of GCC
seem to generate warnings when an unsigned value is implicitly
@@ -5446,7 +5447,7 @@ Version 1.6.20beta01 [November 20, 2015]
Version 1.6.20beta02 [November 23, 2015]
Fixed incorrect implementation of png_set_PLTE() that uses png_ptr
not info_ptr, that left png_set_PLTE() open to the CVE-2015-8126
- vulnerability.
+ vulnerability. Fixes CVE-2015-8472.
Version 1.6.20beta03 [November 24, 2015]
Backported tests from libpng-1.7.0beta69.
@@ -5471,6 +5472,155 @@ Version 1.6.20rc02 [November 29, 2015]
Version 1.6.20 [December 3, 2015]
No changes.
+Version 1.6.21beta01 [December 11, 2015]
+ Fixed syntax "$(command)" in tests/pngstest that some shells other than
+ bash could not parse (Bug report by Nelson Beebe). Use `command` instead.
+
+Version 1.6.21beta02 [December 14, 2015]
+ Moved png_check_keyword() from pngwutil.c to pngset.c
+ Removed LE/BE dependencies in pngvalid, to 'fix' the current problem
+ in the BigEndian tests by not testing it, making the BE code the same
+ as the LE version.
+ Fixes to pngvalid for various reduced build configurations (eliminate unused
+ statics) and a fix for the case in rgb_to_gray when the digitize option
+ reduces graylo to 0, producing a large error.
+
+Version 1.6.21beta03 [December 18, 2015]
+ Widened the 'limit' check on the internally calculated error limits in
+ the 'DIGITIZE' case (the code used prior to 1.7 for rgb_to_gray error
+ checks) and changed the check to only operate in non-release builds
+ (base build type not RC or RELEASE.)
+ Fixed undefined behavior in pngvalid.c, undefined because
+ (png_byte) << shift is undefined if it changes the signed bit
+ (because png_byte is promoted to int). The libpng exported functions
+ png_get_uint_32 and png_get_uint_16 handle this. (Bug reported by
+ David Drysdale as a result of reports from UBSAN in clang 3.8).
+ This changes pngvalid to use BE random numbers; this used to produce
+ errors but these should not be fixed as a result of the previous changes.
+
+Version 1.6.21rc01 [January 4, 2016]
+ In projects/vstudio, combined readme.txt and WARNING into README.txt
+
+Version 1.6.21rc02 [January 7, 2016]
+ Relocated assert() in contrib/tools/pngfix.c, bug found by American
+ Fuzzy Lop, reported by Brian Carpenter.
+ Marked 'limit' UNUSED in transform_range_check(). This only affects
+ release builds.
+
+Version 1.6.21 [January 15, 2016]
+ Worked around a false-positive Coverity issue in pngvalid.c.
+
+Version 1.6.22beta01 [January 23, 2016]
+ Changed PNG_USE_MKSTEMP to __COVERITY__ to select alternate
+ "tmpfile()" implementation in contrib/libtests/pngstest.c
+ Fixed NO_STDIO build of pngunknown.c to skip calling png_init_io()
+ if there is no stdio.h support.
+ Added a png_image_write_to_memory() API and a number of assist macros
+ to allow an application that uses the simplified API write to bypass
+ stdio and write directly to memory.
+ Added some warnings (png.h) and some check code to detect *possible*
+ overflow in the ROW_STRIDE and simplified image SIZE macros. This
+ disallows image width/height/format that *might* overflow. This is
+ a quiet API change that limits in-memory image size (uncompressed) to
+ less than 4GByte and image row size (stride) to less than 2GByte.
+ Revised workaround for false-positive Coverity issue in pngvalid.c.
+
+Version 1.6.22beta02 [February 8, 2016]
+ Only use exit(77) in configure builds.
+ Corrected error in PNG_IMAGE_PNG_SIZE_MAX. This new macro underreported
+ the palette size because it failed to take into account that the memory
+ palette has to be expanded to full RGB when it is written to PNG.
+ Updated CMakeLists.txt, added supporting scripts/gen*.cmake.in
+ and test.cmake.in (Roger Leigh).
+ Relaxed limit checks on gamma values in pngrtran.c. As suggested in
+ the comments gamma values outside the range currently permitted
+ by png_set_alpha_mode are useful for HDR data encoding. These values
+ are already permitted by png_set_gamma so it is reasonable caution to
+ extend the png_set_alpha_mode range as HDR imaging systems are starting
+ to emerge.
+
+Version 1.6.22beta03 [March 9, 2016]
+ Added a common-law trademark notice and export control information
+ to the LICENSE file, png.h, and the man page.
+ Restored "& 0xff" in png_save_uint_16() and png_save_uint_32() that
+ were accidentally removed from libpng-1.6.17.
+ Changed PNG_INFO_cHNK and PNG_FREE_cHNK from 0xnnnn to 0xnnnnU in png.h
+ (Robert C. Seacord).
+ Removed dubious "#if INT_MAX" test from png.h that was added to
+ libpng-1.6.19beta02 (John Bowler).
+ Add ${INCLUDES} in scripts/genout.cmake.in (Bug report by Nixon Kwok).
+ Updated LICENSE to say files in the contrib directory are not
+ necessarily under the libpng license, and that some makefiles have
+ other copyright owners.
+ Added INTEL-SSE2 support (Mike Klein and Matt Sarett, Google, Inc.).
+ Made contrib/libtests/timepng more robust. The code no longer gives
+ up/fails on invalid PNG data, it just skips it (with error messages).
+ The code no longer fails on PNG files with data beyond IEND. Options
+ exist to use png_read_png (reading the whole image, not by row) and, in
+ that case, to apply any of the supported transforms. This makes for
+ more realistic testing; the decoded data actually gets used in a
+ meaningful fashion (John Bowler).
+ Fixed some misleading indentation (Krishnaraj Bhat).
+
+Version 1.6.22beta04 [April 5, 2016]
+ Force GCC compilation to C89 if needed (Dagobert Michelsen).
+ SSE filter speed improvements for bpp=3:
+ memcpy-free implementations of load3() / store3().
+ call load3() only when needed at the end of a scanline.
+
+Version 1.6.22beta05 [April 27, 2016]
+ Added PNG_FAST_FILTERS macro (defined as
+ PNG_FILTER_NONE|PNG_FILTER_SUB|PNG_FILTER_UP).
+ Various fixes for contrib/libtests/timepng.c
+ Moved INTEL-SSE code from pngpriv.h into contrib/intel/intel_sse.patch.
+ Fixed typo (missing underscore) in #define PNG_READ_16_TO_8_SUPPORTED
+ (Bug report by Y.Ohashik).
+
+Version 1.6.22beta06 [May 5, 2016]
+ Rebased contrib/intel_sse.patch.
+ Quieted two Coverity issues in contrib/libtests/timepng.c.
+ Fixed issues with scripts/genout.cmake.in (David Capello, Nixon Kwok):
+ Added support to use multiple directories in ZLIBINCDIR variable,
+ Fixed CMAKE_C_FLAGS with multiple values when genout is compiled on MSVC,
+ Fixed pnglibconf.c compilation on OS X including the sysroot path.
+
+Version 1.6.22rc01 [May 14, 2016]
+ No changes.
+
+Version 1.6.22rc02 [May 16, 2016]
+ Removed contrib/timepng from default build; it does not build on platforms
+ that don't supply clock_gettime().
+
+Version 1.6.22rc03 [May 17, 2016]
+ Restored contrib/timepng to default build but check for the presence
+ of clock_gettime() in configure.ac and Makefile.am.
+
+Version 1.6.22 [May 26, 2016]
+ No changes.
+
+Version 1.6.23beta01 [May 29, 2016]
+ Stop a potential memory leak in png_set_tRNS() (Bug report by Ted Ying).
+ Fixed the progressive reader to handle empty first IDAT chunk properly
+ (patch by Timothy Nikkel). This bug was introduced in libpng-1.6.0 and
+ only affected the libpng16 branch.
+ Added tests in pngvalid.c to check zero-length IDAT chunks in various
+ positions. Fixed the sequential reader to handle these more robustly
+ (John Bowler).
+
+Version 1.6.23rc01 [June 2, 2016]
+ Corrected progressive read input buffer in pngvalid.c. The previous version
+ the code invariably passed just one byte at a time to libpng. The intent
+ was to pass a random number of bytes in the range 0..511.
+ Moved sse2 prototype from pngpriv.h to contrib/intel/intel_sse.patch.
+ Added missing ")" in pngerror.c (Matt Sarrett).
+
+Version 1.6.23rc02 [June 4, 2016]
+ Fixed undefined behavior in png_push_save_buffer(). Do not call
+ memcpy() with a null source, even if count is zero (Leon Scroggins III).
+
+Version 1.6.23 [June 9, 2016]
+ Fixed bad link to RFC2083 in png.5 (Nikola Forro).
+
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE
index 82dbe117f6d..b7ad4b9eaf3 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/LICENSE
@@ -10,8 +10,8 @@ this sentence.
This code is released under the libpng license.
-libpng versions 1.0.7, July 1, 2000, through 1.6.20, December 3, 2015, are
-Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, are
+libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
+Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
derived from libpng-1.0.6, and are distributed according to the same
disclaimer and license as libpng-1.0.6 with the following individuals
added to the list of Contributing Authors:
@@ -32,6 +32,10 @@ and with the following additions to the disclaimer:
risk of satisfactory quality, performance, accuracy, and effort is with
the user.
+Some files in the "contrib" directory and some configure-generated
+files that are distributed with libpng have other copyright owners and
+are released under other open source licenses.
+
libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
libpng-0.96, and are distributed according to the same disclaimer and
@@ -55,6 +59,9 @@ Contributing Authors:
Greg Roelofs
Tom Tanner
+Some files in the "scripts" directory have other copyright owners
+but are released under this license.
+
libpng versions 0.5, May 1995, through 0.88, January 1996, are
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
@@ -95,18 +102,29 @@ appreciated.
END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
+TRADEMARK:
- printf("%s", png_get_copyright(NULL));
+The name "libpng" has not been registered by the Copyright owner
+as a trademark in any jurisdiction. However, because libpng has
+been distributed and maintained world-wide, continually since 1995,
+the Copyright owner claims "common-law trademark protection" in any
+jurisdiction where common-law trademark is recognized.
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+OSI CERTIFICATION:
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
a certification mark of the Open Source Initiative. OSI has not addressed
the additional disclaimers inserted at version 1.0.7.
+EXPORT CONTROL:
+
+The Copyright owner believes that the Export Control Classification
+Number (ECCN) for libpng is EAR99, which means not subject to export
+controls or International Traffic in Arms Regulations (ITAR) because
+it is open source, publicly available software, that does not contain
+any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+734.7(b).
+
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-December 3, 2015
+June 9, 2016
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README
index 59f1f918ae2..38e9a14f5c9 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/README
@@ -1,4 +1,4 @@
-README for libpng version 1.6.20 - December 3, 2015 (shared library 16.0)
+README for libpng version 1.6.23 - June 9, 2016 (shared library 16.0)
See the note about version numbers near the top of png.h
See INSTALL for instructions on how to install libpng.
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c
index 38aa05942c9..f039ff71d90 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -42,7 +42,7 @@
#include "pngpriv.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_20 Your_png_h_is_not_version_1_6_20;
+typedef png_libpng_version_1_6_23 Your_png_h_is_not_version_1_6_23;
/* Tells libpng that we have already handled the first "num_bytes" bytes
* of the PNG file signature. If the PNG data is embedded into another
@@ -803,14 +803,15 @@ png_get_copyright(png_const_structrp png_ptr)
#else
# ifdef __STDC__
return PNG_STRING_NEWLINE \
- "libpng version 1.6.20 - December 3, 2015" PNG_STRING_NEWLINE \
- "Copyright (c) 1998-2015 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
+ "libpng version 1.6.23 - June 9, 2016" PNG_STRING_NEWLINE \
+ "Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson" \
+ PNG_STRING_NEWLINE \
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
"Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
PNG_STRING_NEWLINE;
# else
- return "libpng version 1.6.20 - December 3, 2015\
- Copyright (c) 1998-2015 Glenn Randers-Pehrson\
+ return "libpng version 1.6.23 - June 9, 2016\
+ Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson\
Copyright (c) 1996-1997 Andreas Dilger\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.";
# endif
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h
index c90a90f29cb..9f1ab421031 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/png.h
@@ -29,9 +29,9 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * libpng version 1.6.20, December 3, 2015
+ * libpng version 1.6.23, June 9, 2016
*
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -40,7 +40,7 @@
* Authors and maintainers:
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.6.20, December 3, 2015:
+ * libpng versions 0.97, January 1998, through 1.6.23, June 9, 2016:
* Glenn Randers-Pehrson.
* See also "Contributing Authors", below.
*/
@@ -53,8 +53,12 @@
*
* This code is released under the libpng license.
*
- * libpng versions 1.0.7, July 1, 2000, through 1.6.20, December 3, 2015, are
- * Copyright (c) 2000-2002, 2004, 2006-2015 Glenn Randers-Pehrson, are
+ * Some files in the "contrib" directory and some configure-generated
+ * files that are distributed with libpng have other copyright owners and
+ * are released under other open source licenses.
+ *
+ * libpng versions 1.0.7, July 1, 2000 through 1.6.23, June 9, 2016 are
+ * Copyright (c) 2000-2002, 2004, 2006-2016 Glenn Randers-Pehrson, are
* derived from libpng-1.0.6, and are distributed according to the same
* disclaimer and license as libpng-1.0.6 with the following individuals
* added to the list of Contributing Authors:
@@ -75,6 +79,10 @@
* risk of satisfactory quality, performance, accuracy, and effort is with
* the user.
*
+ * Some files in the "contrib" directory have other copyright owners and
+ * are released under other open source licenses.
+ *
+ *
* libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
* Copyright (c) 1998-2000 Glenn Randers-Pehrson, are derived from
* libpng-0.96, and are distributed according to the same disclaimer and
@@ -85,6 +93,9 @@
* Glenn Randers-Pehrson
* Willem van Schaik
*
+ * Some files in the "scripts" directory have different copyright owners
+ * but are also released under this license.
+ *
* libpng versions 0.89, June 1996, through 0.96, May 1997, are
* Copyright (c) 1996-1997 Andreas Dilger, are derived from libpng-0.88,
* and are distributed according to the same disclaimer and license as
@@ -98,6 +109,9 @@
* Greg Roelofs
* Tom Tanner
*
+ * Some files in the "scripts" directory have other copyright owners
+ * but are released under this license.
+ *
* libpng versions 0.5, May 1995, through 0.88, January 1996, are
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
*
@@ -137,6 +151,29 @@
* appreciated.
*
* END OF COPYRIGHT NOTICE, DISCLAIMER, and LICENSE.
+ *
+ * TRADEMARK:
+ *
+ * The name "libpng" has not been registered by the Copyright owner
+ * as a trademark in any jurisdiction. However, because libpng has
+ * been distributed and maintained world-wide, continually since 1995,
+ * the Copyright owner claims "common-law trademark protection" in any
+ * jurisdiction where common-law trademark is recognized.
+ *
+ * OSI CERTIFICATION:
+ *
+ * Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
+ * a certification mark of the Open Source Initiative. OSI has not addressed
+ * the additional disclaimers inserted at version 1.0.7.
+ *
+ * EXPORT CONTROL:
+ *
+ * The Copyright owner believes that the Export Control Classification
+ * Number (ECCN) for libpng is EAR99, which means not subject to export
+ * controls or International Traffic in Arms Regulations (ITAR) because
+ * it is open source, publicly available software, that does not contain
+ * any encryption software. See the EAR, paragraphs 734.3(b)(3) and
+ * 734.7(b).
*/
/*
@@ -149,12 +186,6 @@
* files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
*/
-/*
- * Libpng is OSI Certified Open Source Software. OSI Certified Open Source is
- * a certification mark of the Open Source Initiative. OSI has not addressed
- * the additional disclaimers inserted at version 1.0.7.
- */
-
/*
* The contributing authors would like to thank all those who helped
* with testing, bug fixes, and patience. This wouldn't have been
@@ -210,11 +241,11 @@
* ...
* 1.0.19 10 10019 10.so.0.19[.0]
* ...
- * 1.2.53 13 10253 12.so.0.53[.0]
+ * 1.2.56 13 10256 12.so.0.56[.0]
* ...
- * 1.5.23 15 10523 15.so.15.23[.0]
+ * 1.5.27 15 10527 15.so.15.27[.0]
* ...
- * 1.6.20 16 10620 16.so.16.20[.0]
+ * 1.6.23 16 10623 16.so.16.23[.0]
*
* Henceforth the source version will match the shared-library major
* and minor numbers; the shared-library major version number will be
@@ -242,13 +273,13 @@
* Y2K compliance in libpng:
* =========================
*
- * December 3, 2015
+ * June 9, 2016
*
* Since the PNG Development group is an ad-hoc body, we can't make
* an official declaration.
*
* This is your unofficial assurance that libpng from version 0.71 and
- * upward through 1.6.20 are Y2K compliant. It is my belief that
+ * upward through 1.6.23 are Y2K compliant. It is my belief that
* earlier versions were also Y2K compliant.
*
* Libpng only has two year fields. One is a 2-byte unsigned integer
@@ -310,9 +341,9 @@
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.6.20"
+#define PNG_LIBPNG_VER_STRING "1.6.23"
#define PNG_HEADER_VERSION_STRING \
- " libpng version 1.6.20 - December 3, 2015\n"
+ " libpng version 1.6.23 - June 9, 2016\n"
#define PNG_LIBPNG_VER_SONUM 16
#define PNG_LIBPNG_VER_DLLNUM 16
@@ -320,7 +351,7 @@
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
#define PNG_LIBPNG_VER_MINOR 6
-#define PNG_LIBPNG_VER_RELEASE 20
+#define PNG_LIBPNG_VER_RELEASE 23
/* This should match the numeric part of the final component of
* PNG_LIBPNG_VER_STRING, omitting any leading zero:
@@ -351,7 +382,7 @@
* version 1.0.0 was mis-numbered 100 instead of 10000). From
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release
*/
-#define PNG_LIBPNG_VER 10620 /* 1.6.20 */
+#define PNG_LIBPNG_VER 10623 /* 1.6.23 */
/* Library configuration: these options cannot be changed after
* the library has been built.
@@ -461,7 +492,7 @@ extern "C" {
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef char* png_libpng_version_1_6_20;
+typedef char* png_libpng_version_1_6_23;
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
*
@@ -762,24 +793,22 @@ typedef png_unknown_chunk * * png_unknown_chunkpp;
* data in the info_struct to be written into the output file. The values
* of the PNG_INFO_ defines should NOT be changed.
*/
-#define PNG_INFO_gAMA 0x0001
-#define PNG_INFO_sBIT 0x0002
-#define PNG_INFO_cHRM 0x0004
-#define PNG_INFO_PLTE 0x0008
-#define PNG_INFO_tRNS 0x0010
-#define PNG_INFO_bKGD 0x0020
-#define PNG_INFO_hIST 0x0040
-#define PNG_INFO_pHYs 0x0080
-#define PNG_INFO_oFFs 0x0100
-#define PNG_INFO_tIME 0x0200
-#define PNG_INFO_pCAL 0x0400
-#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */
-#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */
-#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
-#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
-#if INT_MAX >= 0x8000 /* else this might break */
-#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */
-#endif
+#define PNG_INFO_gAMA 0x0001U
+#define PNG_INFO_sBIT 0x0002U
+#define PNG_INFO_cHRM 0x0004U
+#define PNG_INFO_PLTE 0x0008U
+#define PNG_INFO_tRNS 0x0010U
+#define PNG_INFO_bKGD 0x0020U
+#define PNG_INFO_hIST 0x0040U
+#define PNG_INFO_pHYs 0x0080U
+#define PNG_INFO_oFFs 0x0100U
+#define PNG_INFO_tIME 0x0200U
+#define PNG_INFO_pCAL 0x0400U
+#define PNG_INFO_sRGB 0x0800U /* GR-P, 0.96a */
+#define PNG_INFO_iCCP 0x1000U /* ESR, 1.0.6 */
+#define PNG_INFO_sPLT 0x2000U /* ESR, 1.0.6 */
+#define PNG_INFO_sCAL 0x4000U /* ESR, 1.0.6 */
+#define PNG_INFO_IDAT 0x8000U /* ESR, 1.0.6 */
/* This is used for the transformation routines, as some of them
* change these values for the row. It also should enable using
@@ -1350,7 +1379,7 @@ PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr));
#endif
#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED
-#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */
+#define PNG_READ_16_TO_8_SUPPORTED /* Name prior to 1.5.4 */
/* Strip the second byte of information from a 16-bit depth file. */
PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr));
#endif
@@ -1501,8 +1530,8 @@ PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method,
#define PNG_FILTER_UP 0x20
#define PNG_FILTER_AVG 0x40
#define PNG_FILTER_PAETH 0x80
-#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
- PNG_FILTER_AVG | PNG_FILTER_PAETH)
+#define PNG_FAST_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP)
+#define PNG_ALL_FILTERS (PNG_FAST_FILTERS | PNG_FILTER_AVG | PNG_FILTER_PAETH)
/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
* These defines should NOT be changed.
@@ -1779,21 +1808,21 @@ PNG_EXPORT(99, void, png_data_freer, (png_const_structrp png_ptr,
#define PNG_SET_WILL_FREE_DATA 1
#define PNG_USER_WILL_FREE_DATA 2
/* Flags for png_ptr->free_me and info_ptr->free_me */
-#define PNG_FREE_HIST 0x0008
-#define PNG_FREE_ICCP 0x0010
-#define PNG_FREE_SPLT 0x0020
-#define PNG_FREE_ROWS 0x0040
-#define PNG_FREE_PCAL 0x0080
-#define PNG_FREE_SCAL 0x0100
+#define PNG_FREE_HIST 0x0008U
+#define PNG_FREE_ICCP 0x0010U
+#define PNG_FREE_SPLT 0x0020U
+#define PNG_FREE_ROWS 0x0040U
+#define PNG_FREE_PCAL 0x0080U
+#define PNG_FREE_SCAL 0x0100U
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
-# define PNG_FREE_UNKN 0x0200
+# define PNG_FREE_UNKN 0x0200U
#endif
-/* PNG_FREE_LIST 0x0400 removed in 1.6.0 because it is ignored */
-#define PNG_FREE_PLTE 0x1000
-#define PNG_FREE_TRNS 0x2000
-#define PNG_FREE_TEXT 0x4000
-#define PNG_FREE_ALL 0x7fff
-#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
+/* PNG_FREE_LIST 0x0400U removed in 1.6.0 because it is ignored */
+#define PNG_FREE_PLTE 0x1000U
+#define PNG_FREE_TRNS 0x2000U
+#define PNG_FREE_TEXT 0x4000U
+#define PNG_FREE_ALL 0x7fffU
+#define PNG_FREE_MUL 0x4220U /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
#ifdef PNG_USER_MEM_SUPPORTED
PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr,
@@ -2917,12 +2946,19 @@ typedef struct
* is the minimum 'row stride', the minimum count of components between each
* row. For a color-mapped image this is the minimum number of bytes in a
* row.
+ *
+ * WARNING: this macro overflows for some images with more than one component
+ * and very large image widths. libpng will refuse to process an image where
+ * this macro would overflow.
*/
#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\
(PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride))
/* Return the size, in bytes, of an image buffer given a png_image and a row
* stride - the number of components to leave space for in each row.
+ *
+ * WARNING: this macro overflows a 32-bit integer for some large PNG images,
+ * libpng will refuse to process an image where such an overflow would occur.
*/
#define PNG_IMAGE_SIZE(image)\
@@ -3043,7 +3079,6 @@ PNG_EXPORT(238, void, png_image_free, (png_imagep image));
#endif /* SIMPLIFIED_READ */
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
-#ifdef PNG_STDIO_SUPPORTED
/* WRITE APIS
* ----------
* For write you must initialize a png_image structure to describe the image to
@@ -3060,6 +3095,7 @@ PNG_EXPORT(238, void, png_image_free, (png_imagep image));
* values do not correspond to the colors in sRGB.
* colormap_entries: set to the number of entries in the color-map (0 to 256)
*/
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image,
const char *file, int convert_to_8bit, const void *buffer,
png_int_32 row_stride, const void *colormap));
@@ -3069,8 +3105,9 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
int convert_to_8_bit, const void *buffer, png_int_32 row_stride,
const void *colormap));
/* Write the image to the given (FILE*). */
+#endif /* SIMPLIFIED_WRITE_STDIO */
-/* With both write APIs if image is in one of the linear formats with 16-bit
+/* With all write APIs if image is in one of the linear formats with 16-bit
* data then setting convert_to_8_bit will cause the output to be an 8-bit PNG
* gamma encoded according to the sRGB specification, otherwise a 16-bit linear
* encoded PNG file is written.
@@ -3082,13 +3119,103 @@ PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file,
*
* With all APIs row_stride is handled as in the read APIs - it is the spacing
* from one row to the next in component sized units (1 or 2 bytes) and if
- * negative indicates a bottom-up row layout in the buffer. If row_stride is zero,
- * libpng will calculate it for you from the image width and number of channels.
+ * negative indicates a bottom-up row layout in the buffer. If row_stride is
+ * zero, libpng will calculate it for you from the image width and number of
+ * channels.
*
- * Note that the write API does not support interlacing, sub-8-bit pixels, indexed
- * PNG (color_type 3) or most ancillary chunks.
+ * Note that the write API does not support interlacing, sub-8-bit pixels or
+ * most ancillary chunks. If you need to write text chunks (e.g. for copyright
+ * notices) you need to use one of the other APIs.
*/
-#endif /* STDIO */
+
+PNG_EXPORT(245, int, png_image_write_to_memory, (png_imagep image, void *memory,
+ png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8_bit,
+ const void *buffer, png_int_32 row_stride, const void *colormap));
+ /* Write the image to the given memory buffer. The function both writes the
+ * whole PNG data stream to *memory and updates *memory_bytes with the count
+ * of bytes written.
+ *
+ * 'memory' may be NULL. In this case *memory_bytes is not read however on
+ * success the number of bytes which would have been written will still be
+ * stored in *memory_bytes. On failure *memory_bytes will contain 0.
+ *
+ * If 'memory' is not NULL it must point to memory[*memory_bytes] of
+ * writeable memory.
+ *
+ * If the function returns success memory[*memory_bytes] (if 'memory' is not
+ * NULL) contains the written PNG data. *memory_bytes will always be less
+ * than or equal to the original value.
+ *
+ * If the function returns false and *memory_bytes was not changed an error
+ * occured during write. If *memory_bytes was changed, or is not 0 if
+ * 'memory' was NULL, the write would have succeeded but for the memory
+ * buffer being too small. *memory_bytes contains the required number of
+ * bytes and will be bigger that the original value.
+ */
+
+#define png_image_write_get_memory_size(image, size, convert_to_8_bit, buffer,\
+ row_stride, colormap)\
+ png_image_write_to_memory(&(image), 0, &(size), convert_to_8_bit, buffer,\
+ row_stride, colormap)
+ /* Return the amount of memory in 'size' required to compress this image.
+ * The png_image structure 'image' must be filled in as in the above
+ * function and must not be changed before the actual write call, the buffer
+ * and all other parameters must also be identical to that in the final
+ * write call. The 'size' variable need not be initialized.
+ *
+ * NOTE: the macro returns true/false, if false is returned 'size' will be
+ * set to zero and the write failed and probably will fail if tried again.
+ */
+
+/* You can pre-allocate the buffer by making sure it is of sufficient size
+ * regardless of the amount of compression achieved. The buffer size will
+ * always be bigger than the original image and it will never be filled. The
+ * following macros are provided to assist in allocating the buffer.
+ */
+#define PNG_IMAGE_DATA_SIZE(image) (PNG_IMAGE_SIZE(image)+(image).height)
+ /* The number of uncompressed bytes in the PNG byte encoding of the image;
+ * uncompressing the PNG IDAT data will give this number of bytes.
+ *
+ * NOTE: while PNG_IMAGE_SIZE cannot overflow for an image in memory this
+ * macro can because of the extra bytes used in the PNG byte encoding. You
+ * need to avoid this macro if your image size approaches 2^30 in width or
+ * height. The same goes for the remainder of these macros; they all produce
+ * bigger numbers than the actual in-memory image size.
+ */
+#ifndef PNG_ZLIB_MAX_SIZE
+# define PNG_ZLIB_MAX_SIZE(b) ((b)+(((b)+7U)>>3)+(((b)+63U)>>6)+11U)
+ /* An upper bound on the number of compressed bytes given 'b' uncompressed
+ * bytes. This is based on deflateBounds() in zlib; different
+ * implementations of zlib compression may conceivably produce more data so
+ * if your zlib implementation is not zlib itself redefine this macro
+ * appropriately.
+ */
+#endif
+
+#define PNG_IMAGE_COMPRESSED_SIZE_MAX(image)\
+ PNG_ZLIB_MAX_SIZE((png_alloc_size_t)PNG_IMAGE_DATA_SIZE(image))
+ /* An upper bound on the size of the data in the PNG IDAT chunks. */
+
+#define PNG_IMAGE_PNG_SIZE_MAX_(image, image_size)\
+ ((8U/*sig*/+25U/*IHDR*/+16U/*gAMA*/+44U/*cHRM*/+12U/*IEND*/+\
+ (((image).format&PNG_FORMAT_FLAG_COLORMAP)?/*colormap: PLTE, tRNS*/\
+ 12U+3U*(image).colormap_entries/*PLTE data*/+\
+ (((image).format&PNG_FORMAT_FLAG_ALPHA)?\
+ 12U/*tRNS*/+(image).colormap_entries:0U):0U)+\
+ 12U)+(12U*((image_size)/PNG_ZBUF_SIZE))/*IDAT*/+(image_size))
+ /* A helper for the following macro; if your compiler cannot handle the
+ * following macro use this one with the result of
+ * PNG_IMAGE_COMPRESSED_SIZE_MAX(image) as the second argument (most
+ * compilers should handle this just fine.)
+ */
+
+#define PNG_IMAGE_PNG_SIZE_MAX(image)\
+ PNG_IMAGE_PNG_SIZE_MAX_(image, PNG_IMAGE_COMPRESSED_SIZE_MAX(image))
+ /* An upper bound on the total length of the PNG data stream for 'image'.
+ * The result is of type png_alloc_size_t, on 32-bit systems this may
+ * overflow even though PNG_IMAGE_DATA_SIZE does not overflow; the write will
+ * run out of buffer space but return a corrected size which should work.
+ */
#endif /* SIMPLIFIED_WRITE */
/*******************************************************************************
* END OF SIMPLIFIED API
@@ -3146,7 +3273,7 @@ PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option,
* one to use is one more than this.)
*/
#ifdef PNG_EXPORT_LAST_ORDINAL
- PNG_EXPORT_LAST_ORDINAL(244);
+ PNG_EXPORT_LAST_ORDINAL(245);
#endif
#ifdef __cplusplus
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
index 482dcf7daef..fd35b2a757b 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngconf.h
@@ -29,9 +29,9 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * libpng version 1.6.20, December 3, 2015
+ * libpng version 1.6.23, June 9, 2016
*
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
index d30815032c7..f65bb8a3e0f 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngdebug.h
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.8 [December 19, 2013]
- * Copyright (c) 1998-2013 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
index 7ab1cfeeb7e..920935a0f02 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngerror.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -72,7 +72,7 @@ png_error,(png_const_structrp png_ptr, png_const_charp error_message),
if (png_ptr != NULL)
{
if ((png_ptr->flags &
- (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0
+ (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) != 0)
{
if (*error_message == PNG_LITERAL_SHARP)
{
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
index a2c9d3a8a4c..3b3fe19ca38 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngget.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -484,11 +484,11 @@ png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr,
return (retval);
}
#endif /* pHYs */
-#endif /* INCH_CONVERSIONS */
+#endif /* INCH_CONVERSIONS */
/* png_get_channels really belongs in here, too, but it's been around longer */
-#endif /* EASY_ACCESS */
+#endif /* EASY_ACCESS */
png_byte PNGAPI
@@ -1170,19 +1170,19 @@ png_get_compression_buffer_size(png_const_structrp png_ptr)
return 0;
#ifdef PNG_WRITE_SUPPORTED
- if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
+ if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0)
#endif
{
#ifdef PNG_SEQUENTIAL_READ_SUPPORTED
- return png_ptr->IDAT_read_size;
+ return png_ptr->IDAT_read_size;
#else
- return PNG_IDAT_READ_SIZE;
+ return PNG_IDAT_READ_SIZE;
#endif
}
#ifdef PNG_WRITE_SUPPORTED
- else
- return png_ptr->zbuffer_size;
+ else
+ return png_ptr->zbuffer_size;
#endif
}
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
index ff350824430..1dbf785cd08 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnginfo.h
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.1 [March 28, 2013]
- * Copyright (c) 1998-2013 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2013 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
index bcb167e7aa7..bd14d6e2056 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pnglibconf.h
@@ -27,16 +27,15 @@
/* libpng STANDARD API DEFINITION */
/* pnglibconf.h - library build configuration */
-
/* This file is available under and governed by the GNU General Public
* License version 2 only, as published by the Free Software Foundation.
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*/
-/* libpng version 1.6.20, December 3, 2015 */
+/* libpng version 1.6.23, June 9, 2016 */
-/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */
+/* Copyright (c) 1998-2016 Glenn Randers-Pehrson */
/* This code is released under the libpng license. */
/* For conditions of distribution and use, see the disclaimer */
@@ -141,6 +140,7 @@
#define PNG_SIMPLIFIED_READ_SUPPORTED
/*#undef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED*/
/*#undef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED*/
+/*#undef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED*/
/*#undef PNG_SIMPLIFIED_WRITE_SUPPORTED*/
#define PNG_STDIO_SUPPORTED
#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
index 71c6956b79f..967611f968f 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngmem.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
index e17c993a2ff..289e94ce239 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpread.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -238,12 +238,14 @@ png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr)
(png_ptr->mode & PNG_HAVE_PLTE) == 0)
png_error(png_ptr, "Missing PLTE before IDAT");
- png_ptr->mode |= PNG_HAVE_IDAT;
png_ptr->process_mode = PNG_READ_IDAT_MODE;
- if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
- if (png_ptr->push_length == 0)
- return;
+ if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
+ if ((png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) == 0)
+ if (png_ptr->push_length == 0)
+ return;
+
+ png_ptr->mode |= PNG_HAVE_IDAT;
if ((png_ptr->mode & PNG_AFTER_IDAT) != 0)
png_benign_error(png_ptr, "Too many IDATs found");
@@ -527,7 +529,10 @@ png_push_save_buffer(png_structrp png_ptr)
png_error(png_ptr, "Insufficient memory for save_buffer");
}
- memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+ if (old_buffer)
+ memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
+ else if (png_ptr->save_buffer_size)
+ png_error(png_ptr, "save_buffer error");
png_free(png_ptr, old_buffer);
png_ptr->save_buffer_max = new_max;
}
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
index f5c1532af51..05ed1eb7151 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngpriv.h
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -1945,6 +1945,9 @@ PNG_INTERNAL_FUNCTION(void, png_init_filter_functions_neon,
(png_structp png_ptr, unsigned int bpp), PNG_EMPTY);
#endif
+PNG_INTERNAL_FUNCTION(png_uint_32, png_check_keyword, (png_structrp png_ptr,
+ png_const_charp key, png_bytep new_key), PNG_EMPTY);
+
/* Maintainer: Put new private prototypes here ^ */
#include "pngdebug.h"
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
index 69d5be24367..8650556a9cf 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngread.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -155,7 +155,10 @@ png_read_info(png_structrp png_ptr, png_inforp info_ptr)
}
else if ((png_ptr->mode & PNG_HAVE_IDAT) != 0)
+ {
+ png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
png_ptr->mode |= PNG_AFTER_IDAT;
+ }
/* This should be a binary subdivision search or a hash for
* matching the chunk name rather than a linear search.
@@ -813,6 +816,9 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
png_uint_32 length = png_read_chunk_header(png_ptr);
png_uint_32 chunk_name = png_ptr->chunk_name;
+ if (chunk_name != png_IDAT)
+ png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
+
if (chunk_name == png_IEND)
png_handle_IEND(png_ptr, info_ptr, length);
@@ -827,9 +833,9 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
{
if (chunk_name == png_IDAT)
{
- if ((length > 0) ||
- (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
- png_benign_error(png_ptr, "Too many IDATs found");
+ if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
+ || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
+ png_benign_error(png_ptr, ".Too many IDATs found");
}
png_handle_unknown(png_ptr, info_ptr, length, keep);
if (chunk_name == png_PLTE)
@@ -840,10 +846,14 @@ png_read_end(png_structrp png_ptr, png_inforp info_ptr)
else if (chunk_name == png_IDAT)
{
/* Zero length IDATs are legal after the last IDAT has been
- * read, but not after other chunks have been read.
+ * read, but not after other chunks have been read. 1.6 does not
+ * always read all the deflate data; specifically it cannot be relied
+ * upon to read the Adler32 at the end. If it doesn't ignore IDAT
+ * chunks which are longer than zero as well:
*/
- if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
- png_benign_error(png_ptr, "Too many IDATs found");
+ if ((length > 0 && !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED))
+ || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT) != 0)
+ png_benign_error(png_ptr, "..Too many IDATs found");
png_crc_finish(png_ptr, length);
}
@@ -3876,16 +3886,16 @@ png_image_read_direct(png_voidp argument)
else
filler = 255;
-# ifdef PNG_FORMAT_AFIRST_SUPPORTED
- if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
- {
- where = PNG_FILLER_BEFORE;
- change &= ~PNG_FORMAT_FLAG_AFIRST;
- }
+#ifdef PNG_FORMAT_AFIRST_SUPPORTED
+ if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
+ {
+ where = PNG_FILLER_BEFORE;
+ change &= ~PNG_FORMAT_FLAG_AFIRST;
+ }
- else
-# endif
- where = PNG_FILLER_AFTER;
+ else
+#endif
+ where = PNG_FILLER_AFTER;
png_set_add_alpha(png_ptr, filler, where);
}
@@ -3993,12 +4003,12 @@ png_image_read_direct(png_voidp argument)
if (info_ptr->bit_depth == 16)
info_format |= PNG_FORMAT_FLAG_LINEAR;
-# ifdef PNG_FORMAT_BGR_SUPPORTED
- if ((png_ptr->transformations & PNG_BGR) != 0)
- info_format |= PNG_FORMAT_FLAG_BGR;
-# endif
+#ifdef PNG_FORMAT_BGR_SUPPORTED
+ if ((png_ptr->transformations & PNG_BGR) != 0)
+ info_format |= PNG_FORMAT_FLAG_BGR;
+#endif
-# ifdef PNG_FORMAT_AFIRST_SUPPORTED
+#ifdef PNG_FORMAT_AFIRST_SUPPORTED
if (do_local_background == 2)
{
if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
@@ -4099,58 +4109,84 @@ png_image_finish_read(png_imagep image, png_const_colorp background,
{
if (image != NULL && image->version == PNG_IMAGE_VERSION)
{
- png_uint_32 check;
+ /* Check for row_stride overflow. This check is not performed on the
+ * original PNG format because it may not occur in the output PNG format
+ * and libpng deals with the issues of reading the original.
+ */
+ const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
- if (row_stride == 0)
- row_stride = PNG_IMAGE_ROW_STRIDE(*image);
-
- if (row_stride < 0)
- check = -row_stride;
-
- else
- check = row_stride;
-
- if (image->opaque != NULL && buffer != NULL &&
- check >= PNG_IMAGE_ROW_STRIDE(*image))
+ if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */
{
- if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
- (image->colormap_entries > 0 && colormap != NULL))
+ png_uint_32 check;
+ const png_uint_32 png_row_stride = image->width * channels;
+
+ if (row_stride == 0)
+ row_stride = (png_int_32)/*SAFE*/png_row_stride;
+
+ if (row_stride < 0)
+ check = -row_stride;
+
+ else
+ check = row_stride;
+
+ if (image->opaque != NULL && buffer != NULL && check >= png_row_stride)
{
- int result;
- png_image_read_control display;
-
- memset(&display, 0, (sizeof display));
- display.image = image;
- display.buffer = buffer;
- display.row_stride = row_stride;
- display.colormap = colormap;
- display.background = background;
- display.local_row = NULL;
-
- /* Choose the correct 'end' routine; for the color-map case all the
- * setup has already been done.
+ /* Now check for overflow of the image buffer calculation; this
+ * limits the whole image size to 32 bits for API compatibility with
+ * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
*/
- if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
- result =
- png_safe_execute(image, png_image_read_colormap, &display) &&
- png_safe_execute(image, png_image_read_colormapped, &display);
+ if (image->height <= 0xFFFFFFFF/png_row_stride)
+ {
+ if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 ||
+ (image->colormap_entries > 0 && colormap != NULL))
+ {
+ int result;
+ png_image_read_control display;
+
+ memset(&display, 0, (sizeof display));
+ display.image = image;
+ display.buffer = buffer;
+ display.row_stride = row_stride;
+ display.colormap = colormap;
+ display.background = background;
+ display.local_row = NULL;
+
+ /* Choose the correct 'end' routine; for the color-map case
+ * all the setup has already been done.
+ */
+ if ((image->format & PNG_FORMAT_FLAG_COLORMAP) != 0)
+ result = png_safe_execute(image,
+ png_image_read_colormap, &display) &&
+ png_safe_execute(image,
+ png_image_read_colormapped, &display);
+
+ else
+ result =
+ png_safe_execute(image,
+ png_image_read_direct, &display);
+
+ png_image_free(image);
+ return result;
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_finish_read[color-map]: no color-map");
+ }
else
- result =
- png_safe_execute(image, png_image_read_direct, &display);
-
- png_image_free(image);
- return result;
+ return png_image_error(image,
+ "png_image_finish_read: image too large");
}
else
return png_image_error(image,
- "png_image_finish_read[color-map]: no color-map");
+ "png_image_finish_read: invalid argument");
}
else
return png_image_error(image,
- "png_image_finish_read: invalid argument");
+ "png_image_finish_read: row_stride too large");
}
else if (image != NULL)
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
index b72cafd328a..0ac5c4b0b4d 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrio.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.17 [March 26, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
index b6b731d0176..51585b02fde 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -187,7 +187,7 @@ png_set_background(png_structrp png_ptr,
png_set_background_fixed(png_ptr, background_color, background_gamma_code,
need_expand, png_fixed(png_ptr, background_gamma, "png_set_background"));
}
-# endif /* FLOATING_POINT */
+# endif /* FLOATING_POINT */
#endif /* READ_BACKGROUND */
/* Scale 16-bit depth files to 8-bit depth. If both of these are set then the
@@ -317,9 +317,12 @@ png_set_alpha_mode_fixed(png_structrp png_ptr, int mode,
* is expected to be 1 or greater, but this range test allows for some
* viewing correction values. The intent is to weed out users of this API
* who use the inverse of the gamma value accidentally! Since some of these
- * values are reasonable this may have to be changed.
+ * values are reasonable this may have to be changed:
+ *
+ * 1.6.x: changed from 0.07..3 to 0.01..100 (to accomodate the optimal 16-bit
+ * gamma of 36, and its reciprocal.)
*/
- if (output_gamma < 70000 || output_gamma > 300000)
+ if (output_gamma < 1000 || output_gamma > 10000000)
png_error(png_ptr, "output gamma out of expected range");
/* The default file gamma is the inverse of the output gamma; the output
@@ -1940,7 +1943,7 @@ png_init_read_transformations(png_structrp png_ptr)
png_ptr->palette[i].blue = (png_byte)component;
}
}
-#endif /* READ_SHIFT */
+#endif /* READ_SHIFT */
}
/* Modify the info structure to reflect the transformations. The
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
index a2e58468a68..6722f3b7165 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngrutil.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.20 [December 3, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.20 [December 3, 2014]
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
index 748008eb70b..a610db6c78a 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngset.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.23 [June 9, 2016]
+ * Copyright (c) 1998-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -980,12 +980,14 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr,
png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
- /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
- png_ptr->trans_alpha = info_ptr->trans_alpha = png_voidcast(png_bytep,
- png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
-
if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
+ {
+ /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
+ info_ptr->trans_alpha = png_voidcast(png_bytep,
+ png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH));
memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
+ }
+ png_ptr->trans_alpha = info_ptr->trans_alpha;
}
if (trans_color != NULL)
@@ -1672,4 +1674,88 @@ png_set_check_for_invalid_index(png_structrp png_ptr, int allowed)
png_ptr->num_palette_max = -1;
}
#endif
+
+#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) || \
+ defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
+/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
+ * and if invalid, correct the keyword rather than discarding the entire
+ * chunk. The PNG 1.0 specification requires keywords 1-79 characters in
+ * length, forbids leading or trailing whitespace, multiple internal spaces,
+ * and the non-break space (0x80) from ISO 8859-1. Returns keyword length.
+ *
+ * The 'new_key' buffer must be 80 characters in size (for the keyword plus a
+ * trailing '\0'). If this routine returns 0 then there was no keyword, or a
+ * valid one could not be generated, and the caller must png_error.
+ */
+png_uint_32 /* PRIVATE */
+png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
+{
+ png_const_charp orig_key = key;
+ png_uint_32 key_len = 0;
+ int bad_character = 0;
+ int space = 1;
+
+ png_debug(1, "in png_check_keyword");
+
+ if (key == NULL)
+ {
+ *new_key = 0;
+ return 0;
+ }
+
+ while (*key && key_len < 79)
+ {
+ png_byte ch = (png_byte)*key++;
+
+ if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
+ *new_key++ = ch, ++key_len, space = 0;
+
+ else if (space == 0)
+ {
+ /* A space or an invalid character when one wasn't seen immediately
+ * before; output just a space.
+ */
+ *new_key++ = 32, ++key_len, space = 1;
+
+ /* If the character was not a space then it is invalid. */
+ if (ch != 32)
+ bad_character = ch;
+ }
+
+ else if (bad_character == 0)
+ bad_character = ch; /* just skip it, record the first error */
+ }
+
+ if (key_len > 0 && space != 0) /* trailing space */
+ {
+ --key_len, --new_key;
+ if (bad_character == 0)
+ bad_character = 32;
+ }
+
+ /* Terminate the keyword */
+ *new_key = 0;
+
+ if (key_len == 0)
+ return 0;
+
+#ifdef PNG_WARNINGS_SUPPORTED
+ /* Try to only output one warning per keyword: */
+ if (*key != 0) /* keyword too long */
+ png_warning(png_ptr, "keyword truncated");
+
+ else if (bad_character != 0)
+ {
+ PNG_WARNING_PARAMETERS(p)
+
+ png_warning_parameter(p, 1, orig_key);
+ png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
+
+ png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
+ }
+#endif /* WARNINGS */
+
+ return key_len;
+}
+#endif /* TEXT || pCAL || iCCP || sPLT */
#endif /* READ || WRITE */
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
index e47c02d6fa6..ae72f32a963 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngstruct.h
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c
index ef3a4ab0e50..399e67fe8db 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtest.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.5.25 [December 3, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -71,6 +71,15 @@
#include "png.h"
+/* 1.6.1 added support for the configure test harness, which uses 77 to indicate
+ * a skipped test, in earlier versions we need to succeed on a skipped test, so:
+ */
+#if PNG_LIBPNG_VER >= 10601 && defined(HAVE_CONFIG_H)
+# define SKIP 77
+#else
+# define SKIP 0
+#endif
+
/* Known chunks that exist in pngtest.png must be supported or pngtest will fail
* simply as a result of re-ordering them. This may be fixed in 1.7
*
@@ -2093,9 +2102,9 @@ main(void)
fprintf(STDERR,
" test ignored because libpng was not built with read support\n");
/* And skip this test */
- return PNG_LIBPNG_VER < 10600 ? 0 : 77;
+ return SKIP;
}
#endif
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef png_libpng_version_1_6_20 Your_png_h_is_not_version_1_6_20;
+typedef png_libpng_version_1_6_23 Your_png_h_is_not_version_1_6_23;
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c
index d6016df53ec..e2d11b0ba8a 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngtrans.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c
index 7268523c3f9..ea5f59556d9 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwio.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.15 [November 20, 2014]
- * Copyright (c) 1998-2014 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2014 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c
index d7d751d36fe..6dfb3c2578a 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwrite.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -40,9 +40,9 @@
*/
#include "pngpriv.h"
-#if defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) && defined(PNG_STDIO_SUPPORTED)
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
# include
-#endif
+#endif /* SIMPLIFIED_WRITE_STDIO */
#ifdef PNG_WRITE_SUPPORTED
@@ -1480,7 +1480,6 @@ png_write_png(png_structrp png_ptr, png_inforp info_ptr,
#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
-# ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */
/* Initialize the write structure - general purpose utility. */
static int
png_image_write_init(png_imagep image)
@@ -1532,6 +1531,10 @@ typedef struct
png_const_voidp first_row;
ptrdiff_t row_bytes;
png_voidp local_row;
+ /* Byte count for memory writing */
+ png_bytep memory;
+ png_alloc_size_t memory_bytes; /* not used for STDIO */
+ png_alloc_size_t output_bytes; /* running total */
} png_image_write_control;
/* Write png_uint_16 input to a 16-bit PNG; the png_ptr has already been set to
@@ -1959,9 +1962,43 @@ png_image_write_main(png_voidp argument)
png_set_benign_errors(png_ptr, 0/*error*/);
# endif
- /* Default the 'row_stride' parameter if required. */
- if (display->row_stride == 0)
- display->row_stride = PNG_IMAGE_ROW_STRIDE(*image);
+ /* Default the 'row_stride' parameter if required, also check the row stride
+ * and total image size to ensure that they are within the system limits.
+ */
+ {
+ const unsigned int channels = PNG_IMAGE_PIXEL_CHANNELS(image->format);
+
+ if (image->width <= 0x7FFFFFFFU/channels) /* no overflow */
+ {
+ png_uint_32 check;
+ const png_uint_32 png_row_stride = image->width * channels;
+
+ if (display->row_stride == 0)
+ display->row_stride = (png_int_32)/*SAFE*/png_row_stride;
+
+ if (display->row_stride < 0)
+ check = -display->row_stride;
+
+ else
+ check = display->row_stride;
+
+ if (check >= png_row_stride)
+ {
+ /* Now check for overflow of the image buffer calculation; this
+ * limits the whole image size to 32 bits for API compatibility with
+ * the current, 32-bit, PNG_IMAGE_BUFFER_SIZE macro.
+ */
+ if (image->height > 0xFFFFFFFF/png_row_stride)
+ png_error(image->opaque->png_ptr, "memory image too large");
+ }
+
+ else
+ png_error(image->opaque->png_ptr, "supplied row stride too small");
+ }
+
+ else
+ png_error(image->opaque->png_ptr, "image row stride too large");
+ }
/* Set the required transforms then write the rows in the correct order. */
if ((format & PNG_FORMAT_FLAG_COLORMAP) != 0)
@@ -2138,6 +2175,122 @@ png_image_write_main(png_voidp argument)
return 1;
}
+
+static void (PNGCBAPI
+image_memory_write)(png_structp png_ptr, png_bytep/*const*/ data,
+ png_size_t size)
+{
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
+ png_ptr->io_ptr/*backdoor: png_get_io_ptr(png_ptr)*/);
+ const png_alloc_size_t ob = display->output_bytes;
+
+ /* Check for overflow; this should never happen: */
+ if (size <= ((png_alloc_size_t)-1) - ob)
+ {
+ /* I don't think libpng ever does this, but just in case: */
+ if (size > 0)
+ {
+ if (display->memory_bytes >= ob+size) /* writing */
+ memcpy(display->memory+ob, data, size);
+
+ /* Always update the size: */
+ display->output_bytes = ob+size;
+ }
+ }
+
+ else
+ png_error(png_ptr, "png_image_write_to_memory: PNG too big");
+}
+
+static void (PNGCBAPI
+image_memory_flush)(png_structp png_ptr)
+{
+ PNG_UNUSED(png_ptr)
+}
+
+static int
+png_image_write_memory(png_voidp argument)
+{
+ png_image_write_control *display = png_voidcast(png_image_write_control*,
+ argument);
+
+ /* The rest of the memory-specific init and write_main in an error protected
+ * environment. This case needs to use callbacks for the write operations
+ * since libpng has no built in support for writing to memory.
+ */
+ png_set_write_fn(display->image->opaque->png_ptr, display/*io_ptr*/,
+ image_memory_write, image_memory_flush);
+
+ return png_image_write_main(display);
+}
+
+int PNGAPI
+png_image_write_to_memory(png_imagep image, void *memory,
+ png_alloc_size_t * PNG_RESTRICT memory_bytes, int convert_to_8bit,
+ const void *buffer, png_int_32 row_stride, const void *colormap)
+{
+ /* Write the image to the given buffer, or count the bytes if it is NULL */
+ if (image != NULL && image->version == PNG_IMAGE_VERSION)
+ {
+ if (memory_bytes != NULL && buffer != NULL)
+ {
+ /* This is to give the caller an easier error detection in the NULL
+ * case and guard against uninitialized variable problems:
+ */
+ if (memory == NULL)
+ *memory_bytes = 0;
+
+ if (png_image_write_init(image) != 0)
+ {
+ png_image_write_control display;
+ int result;
+
+ memset(&display, 0, (sizeof display));
+ display.image = image;
+ display.buffer = buffer;
+ display.row_stride = row_stride;
+ display.colormap = colormap;
+ display.convert_to_8bit = convert_to_8bit;
+ display.memory = png_voidcast(png_bytep, memory);
+ display.memory_bytes = *memory_bytes;
+ display.output_bytes = 0;
+
+ result = png_safe_execute(image, png_image_write_memory, &display);
+ png_image_free(image);
+
+ /* write_memory returns true even if we ran out of buffer. */
+ if (result)
+ {
+ /* On out-of-buffer this function returns '0' but still updates
+ * memory_bytes:
+ */
+ if (memory != NULL && display.output_bytes > *memory_bytes)
+ result = 0;
+
+ *memory_bytes = display.output_bytes;
+ }
+
+ return result;
+ }
+
+ else
+ return 0;
+ }
+
+ else
+ return png_image_error(image,
+ "png_image_write_to_memory: invalid argument");
+ }
+
+ else if (image != NULL)
+ return png_image_error(image,
+ "png_image_write_to_memory: incorrect PNG_IMAGE_VERSION");
+
+ else
+ return 0;
+}
+
+#ifdef PNG_SIMPLIFIED_WRITE_STDIO_SUPPORTED
int PNGAPI
png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit,
const void *buffer, png_int_32 row_stride, const void *colormap)
@@ -2145,7 +2298,7 @@ png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit,
/* Write the image to the given (FILE*). */
if (image != NULL && image->version == PNG_IMAGE_VERSION)
{
- if (file != NULL)
+ if (file != NULL && buffer != NULL)
{
if (png_image_write_init(image) != 0)
{
@@ -2195,7 +2348,7 @@ png_image_write_to_file(png_imagep image, const char *file_name,
/* Write the image to the named file. */
if (image != NULL && image->version == PNG_IMAGE_VERSION)
{
- if (file_name != NULL)
+ if (file_name != NULL && buffer != NULL)
{
FILE *fp = fopen(file_name, "wb");
@@ -2253,6 +2406,6 @@ png_image_write_to_file(png_imagep image, const char *file_name,
else
return 0;
}
-# endif /* STDIO */
+#endif /* SIMPLIFIED_WRITE_STDIO */
#endif /* SIMPLIFIED_WRITE */
#endif /* WRITE */
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c
index 44e7daf5614..e962c4ff631 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwtran.c
@@ -30,7 +30,7 @@
* file and, per its terms, should not be removed:
*
* Last changed in libpng 1.6.18 [July 23, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
diff --git a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c
index a51f24b94c4..daeb1e79c9e 100644
--- a/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/libpng/pngwutil.c
@@ -29,8 +29,8 @@
* However, the following notice accompanied the original version of this
* file and, per its terms, should not be removed:
*
- * Last changed in libpng 1.6.19 [November 12, 2015]
- * Copyright (c) 1998-2015 Glenn Randers-Pehrson
+ * Last changed in libpng 1.6.22 [May 26, 2016]
+ * Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
@@ -51,10 +51,10 @@
void PNGAPI
png_save_uint_32(png_bytep buf, png_uint_32 i)
{
- buf[0] = (png_byte)(i >> 24);
- buf[1] = (png_byte)(i >> 16);
- buf[2] = (png_byte)(i >> 8);
- buf[3] = (png_byte)(i );
+ buf[0] = (png_byte)((i >> 24) & 0xffU);
+ buf[1] = (png_byte)((i >> 16) & 0xffU);
+ buf[2] = (png_byte)((i >> 8) & 0xffU);
+ buf[3] = (png_byte)( i & 0xffU);
}
/* Place a 16-bit number into a buffer in PNG byte order.
@@ -64,8 +64,8 @@ png_save_uint_32(png_bytep buf, png_uint_32 i)
void PNGAPI
png_save_uint_16(png_bytep buf, unsigned int i)
{
- buf[0] = (png_byte)(i >> 8);
- buf[1] = (png_byte)(i );
+ buf[0] = (png_byte)((i >> 8) & 0xffU);
+ buf[1] = (png_byte)( i & 0xffU);
}
#endif
@@ -693,90 +693,6 @@ png_write_compressed_data_out(png_structrp png_ptr, compression_state *comp)
}
#endif /* WRITE_COMPRESSED_TEXT */
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
- defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
-/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
- * and if invalid, correct the keyword rather than discarding the entire
- * chunk. The PNG 1.0 specification requires keywords 1-79 characters in
- * length, forbids leading or trailing whitespace, multiple internal spaces,
- * and the non-break space (0x80) from ISO 8859-1. Returns keyword length.
- *
- * The 'new_key' buffer must be 80 characters in size (for the keyword plus a
- * trailing '\0'). If this routine returns 0 then there was no keyword, or a
- * valid one could not be generated, and the caller must png_error.
- */
-static png_uint_32
-png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key)
-{
- png_const_charp orig_key = key;
- png_uint_32 key_len = 0;
- int bad_character = 0;
- int space = 1;
-
- png_debug(1, "in png_check_keyword");
-
- if (key == NULL)
- {
- *new_key = 0;
- return 0;
- }
-
- while (*key && key_len < 79)
- {
- png_byte ch = (png_byte)*key++;
-
- if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/))
- *new_key++ = ch, ++key_len, space = 0;
-
- else if (space == 0)
- {
- /* A space or an invalid character when one wasn't seen immediately
- * before; output just a space.
- */
- *new_key++ = 32, ++key_len, space = 1;
-
- /* If the character was not a space then it is invalid. */
- if (ch != 32)
- bad_character = ch;
- }
-
- else if (bad_character == 0)
- bad_character = ch; /* just skip it, record the first error */
- }
-
- if (key_len > 0 && space != 0) /* trailing space */
- {
- --key_len, --new_key;
- if (bad_character == 0)
- bad_character = 32;
- }
-
- /* Terminate the keyword */
- *new_key = 0;
-
- if (key_len == 0)
- return 0;
-
-#ifdef PNG_WARNINGS_SUPPORTED
- /* Try to only output one warning per keyword: */
- if (*key != 0) /* keyword too long */
- png_warning(png_ptr, "keyword truncated");
-
- else if (bad_character != 0)
- {
- PNG_WARNING_PARAMETERS(p)
-
- png_warning_parameter(p, 1, orig_key);
- png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character);
-
- png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'");
- }
-#endif /* WARNINGS */
-
- return key_len;
-}
-#endif /* WRITE_TEXT || WRITE_pCAL || WRITE_iCCP || WRITE_sPLT */
-
/* Write the IHDR chunk, and update the png_struct with the necessary
* information. Note that the rest of this code depends upon this
* information being correct.
From 1920a07b8c1f262622379770a29ce5c3a74553de Mon Sep 17 00:00:00 2001
From: Jini George
Date: Thu, 11 Aug 2016 17:47:47 +0300
Subject: [PATCH 053/120] 8163143: illegal bci error with interpreted frames in
SA due to mirror being stored in interpreted frames
Added code to represent the frame mirror offset in SA
Reviewed-by: dsamersoff
---
.../sun/tools/jhsdb/BasicLauncherTest.java | 47 +++++++++++++------
1 file changed, 33 insertions(+), 14 deletions(-)
diff --git a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
index 604b28241ee..e18b5c76c1d 100644
--- a/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
+++ b/jdk/test/sun/tools/jhsdb/BasicLauncherTest.java
@@ -107,6 +107,38 @@ public class BasicLauncherTest {
}
}
+ public static void launchJStack() throws IOException {
+
+ if (Platform.isOSX()) {
+ // Coredump stackwalking is not implemented for Darwin
+ System.out.println("This test is not expected to work on OS X. Skipping");
+ return;
+ }
+
+ System.out.println("Starting LingeredApp");
+ try {
+ theApp = LingeredApp.startApp(Arrays.asList("-Xmx256m"));
+
+ System.out.println("Starting jstack against " + theApp.getPid());
+ JDKToolLauncher launcher = createSALauncher();
+
+ launcher.addToolArg("jstack");
+ launcher.addToolArg("--pid=" + Long.toString(theApp.getPid()));
+
+ ProcessBuilder processBuilder = new ProcessBuilder(launcher.getCommand());
+ OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);;
+ output.shouldContain("No deadlocks found");
+ output.shouldNotContain("illegal bci");
+ output.shouldNotContain("AssertionFailure");
+ output.shouldHaveExitValue(0);
+
+ } catch (Exception ex) {
+ throw new RuntimeException("Test ERROR " + ex, ex);
+ } finally {
+ LingeredApp.stopApp(theApp);
+ }
+ }
+
/**
*
* @param vmArgs - vm and java arguments to launch test app
@@ -151,19 +183,6 @@ public class BasicLauncherTest {
Arrays.asList(toolArgs));
}
- public static void launchNotOSX(String expectedMessage,
- String unexpectedMessage, String... toolArgs)
- throws IOException {
-
- if (Platform.isOSX()) {
- // Coredump stackwalking is not implemented for Darwin
- System.out.println("This test is not expected to work on OS X. Skipping");
- return;
- }
-
- launch(expectedMessage, unexpectedMessage, toolArgs);
- }
-
public static void testHeapDump() throws IOException {
File dump = new File("jhsdb.jmap.dump." +
System.currentTimeMillis() + ".hprof");
@@ -191,7 +210,7 @@ public class BasicLauncherTest {
launchCLHSDB();
launch("compiler detected", null, "jmap", "--clstats");
- launchNotOSX("No deadlocks found", null, "jstack");
+ launchJStack();
launch("compiler detected", null, "jmap");
launch("Java System Properties",
"System Properties info not available", "jinfo");
From d41cfa354ab856d0713bb7ac21079d5a021b50f2 Mon Sep 17 00:00:00 2001
From: Brian Burkhalter
Date: Thu, 11 Aug 2016 11:35:47 -0700
Subject: [PATCH 054/120] 8145014: "IIOException: Couldn't seek!" when calling
TIFFImageReader.getNumImages()
In locateImage() break and decrement image count for zero-entry IFDs and on encountering an EOF.
Reviewed-by: prr
---
.../imageio/plugins/tiff/TIFFImageReader.java | 25 ++-
.../plugins/tiff/BogusSecondImageTest.java | 196 ++++++++++++++++++
2 files changed, 214 insertions(+), 7 deletions(-)
create mode 100644 jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java
index 317027351fc..bf143b4a7ae 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageReader.java
@@ -35,6 +35,7 @@ import java.awt.image.ComponentColorModel;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
import java.awt.image.SampleModel;
+import java.io.EOFException;
import java.io.IOException;
import java.nio.ByteOrder;
import java.util.ArrayList;
@@ -189,8 +190,8 @@ public class TIFFImageReader extends ImageReader {
// Seek to start of first IFD
long offset = stream.readUnsignedInt();
- imageStartPosition.add(Long.valueOf(offset));
stream.seek(offset);
+ imageStartPosition.add(Long.valueOf(offset));
} catch (IOException e) {
throw new IIOException("I/O error reading header!", e);
}
@@ -201,10 +202,10 @@ public class TIFFImageReader extends ImageReader {
private int locateImage(int imageIndex) throws IIOException {
readHeader();
- try {
- // Find closest known index
- int index = Math.min(imageIndex, imageStartPosition.size() - 1);
+ // Find closest known index
+ int index = Math.min(imageIndex, imageStartPosition.size() - 1);
+ try {
// Seek to that position
Long l = imageStartPosition.get(index);
stream.seek(l.longValue());
@@ -212,6 +213,11 @@ public class TIFFImageReader extends ImageReader {
// Skip IFDs until at desired index or last image found
while (index < imageIndex) {
int count = stream.readUnsignedShort();
+ // If zero-entry IFD, decrement the index and exit the loop
+ if (count == 0) {
+ imageIndex = index > 0 ? index - 1 : 0;
+ break;
+ }
stream.skipBytes(12 * count);
long offset = stream.readUnsignedInt();
@@ -219,12 +225,17 @@ public class TIFFImageReader extends ImageReader {
return index;
}
- imageStartPosition.add(Long.valueOf(offset));
stream.seek(offset);
+ imageStartPosition.add(Long.valueOf(offset));
++index;
}
- } catch (IOException e) {
- throw new IIOException("Couldn't seek!", e);
+ } catch (EOFException eofe) {
+ forwardWarningMessage("Ignored " + eofe);
+
+ // Ran off the end of stream: decrement index
+ imageIndex = index > 0 ? index - 1 : 0;
+ } catch (IOException ioe) {
+ throw new IIOException("Couldn't seek!", ioe);
}
if (currIndex != imageIndex) {
diff --git a/jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java b/jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java
new file mode 100644
index 00000000000..5ebadab8631
--- /dev/null
+++ b/jdk/test/javax/imageio/plugins/tiff/BogusSecondImageTest.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8145014
+ * @summary Verify reader correctly fails for zero-entry IFDs and EOFs
+ * encountered in locateImage().
+ */
+
+import java.awt.Image;
+import java.awt.image.*;
+import java.io.*;
+import java.util.Iterator;
+import javax.imageio.*;
+import javax.imageio.stream.*;
+
+public class BogusSecondImageTest {
+ public static void main(String[] args) throws Throwable {
+ int failures = 0;
+
+ try {
+ testZeroEntryIFD();
+ } catch (Exception e) {
+ System.out.printf("Failed testZeroEntryIFD: %s%n", e);
+ failures++;
+ }
+
+ try {
+ testOutOfStreamIFD();
+ } catch (Exception e) {
+ System.out.printf("Failed testOutOfStreamIFD: %s%n", e);
+ failures++;
+ }
+
+ if (failures == 0) {
+ System.out.println("Test succeeded");
+ } else {
+ throw new RuntimeException
+ ("Test failed with " + failures + " errors");
+ }
+ }
+
+ private static void testZeroEntryIFD() throws Exception {
+ // Create an image.
+ File f = createImageFile();
+
+ ImageOutputStream s = new FileImageOutputStream(f);
+ long length = s.length();
+
+ // Skip the endianness and magic number
+ s.skipBytes(4);
+
+ // Read and seek to offset of 0th IFD
+ long ifd0 = s.readUnsignedInt();
+ s.seek(ifd0);
+
+ // Read number of 0th IFD entries and skip over them
+ int entries0 = s.readUnsignedShort();
+ s.skipBytes(12*entries0);
+
+ // Write the offset of the 1st IFD as the current file length
+ s.write((int)length);
+
+ // Seek to the 1st IFD and write a zero entry count to it
+ s.seek(length);
+ s.writeShort(0);
+ s.close();
+
+ try {
+ Load(f);
+ } catch (Exception e) {
+ throw e;
+ } finally {
+ f.delete();
+ }
+ }
+
+ private static void testOutOfStreamIFD() throws Exception {
+ // Create an image.
+ File f = createImageFile();
+ ImageOutputStream s = new FileImageOutputStream(f);
+ long length = s.length();
+
+ // Skip the endianness and magic number
+ s.skipBytes(4);
+
+ // Read and seek to offset of 0th IFD
+ long ifd0 = s.readUnsignedInt();
+ s.seek(ifd0);
+
+ // Read number of 0th IFD entries and skip over them
+ int entries0 = s.readUnsignedShort();
+ s.skipBytes(12*entries0);
+
+ // Write the offset of the 1st IFD as the current file length + 7
+ s.write((int)length + 7);
+ s.close();
+
+ try {
+ Load(f);
+ } catch (Exception e) {
+ throw e;
+ } finally {
+ f.delete();
+ }
+ }
+
+ private static File createImageFile() throws Exception {
+ BufferedImage im =
+ new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_GRAY);
+ File f = File.createTempFile("BogusSecondImage", "tif", new File("."));
+ f.deleteOnExit();
+ if (!ImageIO.write(im, "TIFF", f)) {
+ throw new RuntimeException("Failed to write " + f);
+ }
+ return f;
+ }
+
+ private final static boolean printTrace = false;
+
+ public static void Load(File file) {
+ if (!file.exists()) {
+ throw new IllegalArgumentException(file + " does not exist");
+ } else if (!file.isFile()) {
+ throw new IllegalArgumentException(file + " is not a regular file");
+ } else if (!file.canRead()) {
+ throw new IllegalArgumentException(file + " cannot be read");
+ }
+
+ ImageInputStream input = null;
+ try {
+ input = ImageIO.createImageInputStream(file);
+ } catch (Throwable e) {
+ System.err.println("NOK: createImageInputStream()\t" + e.getMessage());
+ if (printTrace) { e.printStackTrace(); }
+ return;
+ }
+
+ Iterator readers = ImageIO.getImageReadersByFormatName("TIFF");
+ if (!readers.hasNext()) { throw new RuntimeException("No readers available for TIFF"); }
+ ImageReader reader = readers.next();
+ reader.setInput(input);
+
+ Image images[] = null;
+ int numImages = 0;
+
+ int failures = 0;
+ try {
+ numImages = reader.getNumImages(true);
+ images = new Image[numImages];
+ } catch (Throwable e) {
+ failures++;
+ System.err.println("NOK: getNumImages()\t" + e.getMessage());
+ if (printTrace) { e.printStackTrace(); }
+ }
+ System.out.printf("numImages %d%n", numImages);
+
+ for (int i = 0; i < numImages; i++) {
+ System.out.printf("reading image %d%n", i);
+ try {
+ images[i] = reader.read(i);
+ } catch (Throwable e) {
+ failures++;
+ System.err.println("NOK: read()\t" + e.getMessage());
+ if (printTrace) { e.printStackTrace(); }
+ }
+ }
+
+ if (failures == 0) {
+ System.err.println("OK");
+ } else {
+ throw new RuntimeException("NOK");
+ }
+ }
+}
From d05e00ca7656298da89c8c208aa890fe95ee7e23 Mon Sep 17 00:00:00 2001
From: "Daniel D. Daugherty"
Date: Thu, 11 Aug 2016 12:27:20 -0700
Subject: [PATCH 055/120] 8163879: quarantine
serviceability/sa/sadebugd/SADebugDTest.java since it hangs intermittently
Reviewed-by: hseigel
---
hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
index 7264ee2cf24..a9cf6e53119 100644
--- a/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
+++ b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java
@@ -28,6 +28,7 @@
* @modules java.base/jdk.internal.misc
* @library /test/lib/share/classes
*
+ * @ignore 8163805
* @run main/othervm SADebugDTest
*/
import java.io.File;
From 780aad0314d71900d2d1e7329b9e4e411de8b6a3 Mon Sep 17 00:00:00 2001
From: Pete Brunet
Date: Thu, 11 Aug 2016 21:48:53 -0500
Subject: [PATCH 056/120] 8161483: Implement AccessibleAction interface in
JList.AccessibleJList.AccessibleJListChild
Move AccessibleAction implementation from subclass to AccessibleJListChild
Reviewed-by: alexsch, prr, darcy
---
.../share/classes/javax/swing/JList.java | 48 +++++---
.../javax/swing/JList/8161483/Bug8161483.java | 104 ++++++++++++++++++
2 files changed, 138 insertions(+), 14 deletions(-)
create mode 100644 jdk/test/javax/swing/JList/8161483/Bug8161483.java
diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JList.java b/jdk/src/java.desktop/share/classes/javax/swing/JList.java
index d745527872b..5e9866356a0 100644
--- a/jdk/src/java.desktop/share/classes/javax/swing/JList.java
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JList.java
@@ -3058,7 +3058,7 @@ public class JList extends JComponent implements Scrollable, Accessible
public Accessible getAccessibleAt(Point p) {
int i = locationToIndex(p);
if (i >= 0) {
- return new ActionableAccessibleJListChild(JList.this, i);
+ return new AccessibleJListChild(JList.this, i);
} else {
return null;
}
@@ -3085,7 +3085,7 @@ public class JList extends JComponent implements Scrollable, Accessible
if (i >= getModel().getSize()) {
return null;
} else {
- return new ActionableAccessibleJListChild(JList.this, i);
+ return new AccessibleJListChild(JList.this, i);
}
}
@@ -3188,7 +3188,7 @@ public class JList extends JComponent implements Scrollable, Accessible
* for list children.
*/
protected class AccessibleJListChild extends AccessibleContext
- implements Accessible, AccessibleComponent {
+ implements Accessible, AccessibleComponent, AccessibleAction {
private JList parent = null;
int indexInParent;
private Component component = null;
@@ -3743,16 +3743,17 @@ public class JList extends JComponent implements Scrollable, Accessible
}
}
- } // inner class AccessibleJListChild
-
- private class ActionableAccessibleJListChild
- extends AccessibleJListChild
- implements AccessibleAction {
-
- ActionableAccessibleJListChild(JList parent, int indexInParent) {
- super(parent, indexInParent);
- }
-
+ /**
+ * {@inheritDoc}
+ * @implSpec Returns the AccessibleAction for this AccessibleJListChild
+ * as follows: First getListCellRendererComponent of the ListCellRenderer
+ * for the component at the "index in parent" of this child is called.
+ * Then its AccessibleContext is fetched and that AccessibleContext's
+ * AccessibleAction is returned. Note that if an AccessibleAction
+ * is not found using this process then this object with its implementation
+ * of the AccessibleAction interface is returned.
+ * @since 9
+ */
@Override
public AccessibleAction getAccessibleAction() {
AccessibleContext ac = getCurrentAccessibleContext();
@@ -3768,6 +3769,13 @@ public class JList extends JComponent implements Scrollable, Accessible
}
}
+ /**
+ * {@inheritDoc}
+ * @implSpec If i == 0 selects this AccessibleJListChild by calling
+ * JList.this.setSelectedIndex(indexInParent) and then returns true;
+ * otherwise returns false.
+ * @since 9
+ */
@Override
public boolean doAccessibleAction(int i) {
if (i == 0) {
@@ -3778,6 +3786,13 @@ public class JList extends JComponent implements Scrollable, Accessible
}
}
+ /**
+ * {@inheritDoc}
+ * @implSpec If i == 0 returns the action description fetched from
+ * UIManager.getString("AbstractButton.clickText");
+ * otherwise returns null.
+ * @since 9
+ */
@Override
public String getAccessibleActionDescription(int i) {
if (i == 0) {
@@ -3787,12 +3802,17 @@ public class JList extends JComponent implements Scrollable, Accessible
}
}
+ /**
+ * {@inheritDoc}
+ * @implSpec Returns 1, i.e. there is only one action.
+ * @since 9
+ */
@Override
public int getAccessibleActionCount() {
return 1;
}
- } // inner class ActionableAccessibleJListChild
+ } // inner class AccessibleJListChild
} // inner class AccessibleJList
}
diff --git a/jdk/test/javax/swing/JList/8161483/Bug8161483.java b/jdk/test/javax/swing/JList/8161483/Bug8161483.java
new file mode 100644
index 00000000000..275b871f136
--- /dev/null
+++ b/jdk/test/javax/swing/JList/8161483/Bug8161483.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8161483
+ * @summary Implement AccessibleAction in JList.AccessibleJList.AccessibleJListChild
+ * @run main Bug8161483
+ */
+
+import javax.accessibility.Accessible;
+import javax.accessibility.AccessibleAction;
+import javax.accessibility.AccessibleContext;
+import javax.accessibility.AccessibleSelection;
+import javax.swing.DefaultListModel;
+import javax.swing.JFrame;
+import javax.swing.JList;
+import javax.swing.SwingUtilities;
+
+public class Bug8161483 extends JFrame {
+
+ private static JFrame frame;
+ private static volatile Exception exception = null;
+ private JList countryList;
+
+ public static void main(String args[]) throws Exception {
+ try {
+ SwingUtilities.invokeAndWait(() -> {
+ DefaultListModel listModel = new DefaultListModel<>();
+ listModel.addElement("one");
+ listModel.addElement("two");
+ listModel.addElement("three");
+ JList list = new JList<>(listModel);
+ frame = new JFrame();
+ frame.add(list);
+ frame.pack();
+ try {
+ AccessibleContext acList = list.getAccessibleContext();
+ Accessible accChild = acList.getAccessibleChild(1);
+ AccessibleContext acChild = accChild.getAccessibleContext();
+ AccessibleAction aa = acChild.getAccessibleAction();
+ int c = aa.getAccessibleActionCount();
+ if (c != 1) {
+ throw new RuntimeException("getAccessibleActionCount is not 1");
+ }
+ String s = aa.getAccessibleActionDescription(0);
+ if (!s.equals("click")) {
+ throw new RuntimeException("getAccessibleActionDescription is not click");
+ }
+ boolean b = aa.doAccessibleAction(0);
+ if (!b) {
+ throw new RuntimeException("doAccessibleAction did not return true");
+ }
+ AccessibleSelection as = acList.getAccessibleSelection();
+ int asc = as.getAccessibleSelectionCount();
+ if (asc != 1) {
+ throw new RuntimeException("getAccessibleSelectionCount is not 1");
+ }
+ boolean isSelected = as.isAccessibleChildSelected(0);
+ if (isSelected) {
+ throw new RuntimeException("isAccessibleChildSelected(0) did not return false");
+ }
+ isSelected = as.isAccessibleChildSelected(1);
+ if (!isSelected) {
+ throw new RuntimeException("isAccessibleChildSelected(1) did not return true");
+ }
+ } catch (Exception e) {
+ exception = e;
+ }
+ });
+ if (exception != null) {
+ System.out.println("Test failed: " + exception.getMessage());
+ throw exception;
+ } else {
+ System.out.println("Test passed.");
+ }
+ } finally {
+ SwingUtilities.invokeAndWait(() -> {
+ frame.dispose();
+ });
+ }
+ }
+
+}
From 2b8954d7e41295f15c57f872026254cf595c2447 Mon Sep 17 00:00:00 2001
From: Mikhail Cherkasov
Date: Fri, 12 Aug 2016 18:43:13 +0300
Subject: [PATCH 057/120] 8160696: IllegalArgumentException: adding a component
to a container on a different GraphicsDevice
Reviewed-by: serb
---
.../share/classes/java/awt/Container.java | 15 ++--
.../MoveToOtherScreenTest.java | 88 +++++++++++++++++++
2 files changed, 96 insertions(+), 7 deletions(-)
create mode 100644 jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java
diff --git a/jdk/src/java.desktop/share/classes/java/awt/Container.java b/jdk/src/java.desktop/share/classes/java/awt/Container.java
index 04e3f1e89bd..13d5e23ed1c 100644
--- a/jdk/src/java.desktop/share/classes/java/awt/Container.java
+++ b/jdk/src/java.desktop/share/classes/java/awt/Container.java
@@ -1109,17 +1109,18 @@ public class Container extends Component {
}
checkAddToSelf(comp);
checkNotAWindow(comp);
+ /* Reparent the component and tidy up the tree's state. */
+ if (comp.parent != null) {
+ comp.parent.remove(comp);
+ if (index > component.size()) {
+ throw new IllegalArgumentException("illegal component position");
+ }
+ }
if (thisGC != null) {
comp.checkGD(thisGC.getDevice().getIDstring());
}
- /* Reparent the component and tidy up the tree's state. */
- if (comp.parent != null) {
- comp.parent.remove(comp);
- if (index > component.size()) {
- throw new IllegalArgumentException("illegal component position");
- }
- }
+
//index == -1 means add to the end.
if (index == -1) {
diff --git a/jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java b/jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java
new file mode 100644
index 00000000000..fcc4fcc72b5
--- /dev/null
+++ b/jdk/test/java/awt/Container/MoveToOtherScreenTest/MoveToOtherScreenTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.lang.reflect.InvocationTargetException;
+
+
+
+/* @test
+ @bug 8160696
+ @summary IllegalArgumentException: adding a component to a container on a different GraphicsDevice
+ @author Mikhail Cherkasov
+ @run main MoveToOtherScreenTest
+ @key headful
+*/
+public class MoveToOtherScreenTest {
+
+ private static volatile boolean twoDisplays = true;
+ private static final Canvas canvas = new Canvas();
+ private static final Frame[] frms = new JFrame[2];
+
+ public static void main(String[] args) throws InterruptedException, InvocationTargetException {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ GraphicsEnvironment ge = GraphicsEnvironment.
+ getLocalGraphicsEnvironment();
+ GraphicsDevice[] gds = ge.getScreenDevices();
+ if (gds.length < 2) {
+ System.out.println("Test requires at least 2 displays");
+ twoDisplays = false;
+ return;
+ }
+ for (int i = 0; i < 2; i++) {
+ GraphicsConfiguration conf = gds[i].getConfigurations()[0];
+ JFrame frm = new JFrame("Frame " + i);
+ frm.setLocation(conf.getBounds().x, 0); // On first screen
+ frm.setSize(new Dimension(400, 400));
+ frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frm.setVisible(true);
+ frms[i] = frm;
+ }
+ canvas.setBackground(Color.red);
+ frms[0].add(canvas);
+ }
+ });
+ if(!twoDisplays){
+ return;
+ }
+ Thread.sleep(200);
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ frms[1].add(canvas);
+ }
+ });
+ for (Frame frm : frms) {
+ frm.dispose();
+ }
+ }
+}
From ab8079d89a0f2eafc9caebd8615593258b178ffb Mon Sep 17 00:00:00 2001
From: Sergey Bylokhov
Date: Fri, 12 Aug 2016 20:36:41 +0300
Subject: [PATCH 058/120] 8159696: java.beans.MethodRef#get throws
NullPointerException
Reviewed-by: alexsch
---
.../share/classes/java/beans/MethodRef.java | 7 +-
.../8159696/UnloadClassBeanInfo.java | 78 +++++++++++++++++++
.../beans/Introspector/8159696/stub/Stub.java | 29 +++++++
3 files changed, 110 insertions(+), 4 deletions(-)
create mode 100644 jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java
create mode 100644 jdk/test/java/beans/Introspector/8159696/stub/Stub.java
diff --git a/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java b/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java
index 59b2690b4fa..6be617f2951 100644
--- a/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java
+++ b/jdk/src/java.desktop/share/classes/java/beans/MethodRef.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -64,10 +64,9 @@ final class MethodRef {
this.signature = null;
this.methodRef = null;
this.typeRef = null;
+ return null;
}
- else {
- this.methodRef = new SoftReference<>(method);
- }
+ this.methodRef = new SoftReference<>(method);
}
return isPackageAccessible(method.getDeclaringClass()) ? method : null;
}
diff --git a/jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java b/jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java
new file mode 100644
index 00000000000..8c77b3565a8
--- /dev/null
+++ b/jdk/test/java/beans/Introspector/8159696/UnloadClassBeanInfo.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.MethodDescriptor;
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Arrays;
+
+/**
+ * @test
+ * @bug 8159696
+ * @library /javax/swing/regtesthelpers
+ * @compile ./stub/Stub.java
+ * @run main/othervm -mx32M UnloadClassBeanInfo
+ */
+public class UnloadClassBeanInfo {
+
+ private static URLClassLoader loader;
+
+ public static void main(final String[] args) throws Exception {
+ Class cl = getStub();
+ System.out.println("cl.getClassLoader() = " + cl.getClassLoader());
+ final BeanInfo beanInfo = Introspector.getBeanInfo(cl, Object.class);
+ MethodDescriptor[] mds = beanInfo.getMethodDescriptors();
+ System.out.println("mds = " + Arrays.toString(mds));
+ loader.close();
+ loader=null;
+ cl=null;
+ Util.generateOOME();
+ mds = beanInfo.getMethodDescriptors();
+ System.out.println("mds = " + Arrays.toString(mds));
+ }
+
+ /**
+ * The Stub class is compiled by jtreg, but we want to move it so it is not
+ * on the application classpath. We want to load it through a separate
+ * classloader.
+ */
+ static Class> getStub() throws Exception {
+ final String testclasses = System.getProperty("test.classes");
+ final File subdir = new File(testclasses, "stub");
+ subdir.mkdir();
+
+ final Path src = Paths.get(testclasses, "Stub.class");
+ final Path dest = subdir.toPath().resolve("Stub.class");
+ Files.move(src, dest, StandardCopyOption.REPLACE_EXISTING);
+
+ loader = new URLClassLoader(new URL[]{subdir.toURL()});
+ return Class.forName("Stub", true, loader);
+ }
+}
diff --git a/jdk/test/java/beans/Introspector/8159696/stub/Stub.java b/jdk/test/java/beans/Introspector/8159696/stub/Stub.java
new file mode 100644
index 00000000000..2c093ec6d4d
--- /dev/null
+++ b/jdk/test/java/beans/Introspector/8159696/stub/Stub.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public final class Stub {
+
+ public void test() {
+
+ }
+}
From 61860ae01d703e87d46eaeeec78035ab54a6ea46 Mon Sep 17 00:00:00 2001
From: Brian Burkhalter
Date: Fri, 12 Aug 2016 14:35:56 -0700
Subject: [PATCH 059/120] 8152966: ClassCastException when adding IFD to the
TIFFDirectory before the image write
Move the private method getDirectoryAsIFD(TIFFDirectory) from the API class TIFFDirectory to a public method in the internal class TIFFIFD and replace all casts of TIFFDirectory to TIFFIFD with its invocation
Reviewed-by: prr
---
.../com/sun/imageio/plugins/tiff/TIFFIFD.java | 41 +++++++-
.../plugins/tiff/TIFFImageMetadata.java | 2 +-
.../imageio/plugins/tiff/TIFFImageWriter.java | 2 +-
.../imageio/plugins/tiff/TIFFDirectory.java | 40 +-------
.../javax/imageio/plugins/tiff/IFDTest.java | 99 +++++++++++++++++++
5 files changed, 142 insertions(+), 42 deletions(-)
create mode 100644 jdk/test/javax/imageio/plugins/tiff/IFDTest.java
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java
index 46d1419ee4c..0a305c09726 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFIFD.java
@@ -49,6 +49,45 @@ public class TIFFIFD extends TIFFDirectory {
private long stripOrTileOffsetsPosition = -1;
private long lastPosition = -1;
+
+ /**
+ * Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
+ */
+ public static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
+ if(dir instanceof TIFFIFD) {
+ return (TIFFIFD)dir;
+ }
+
+ TIFFIFD ifd = new TIFFIFD(Arrays.asList(dir.getTagSets()),
+ dir.getParentTag());
+ TIFFField[] fields = dir.getTIFFFields();
+ int numFields = fields.length;
+ for(int i = 0; i < numFields; i++) {
+ TIFFField f = fields[i];
+ TIFFTag tag = f.getTag();
+ if(tag.isIFDPointer()) {
+ TIFFDirectory subDir = null;
+ if (f.hasDirectory()) {
+ subDir = f.getDirectory();
+ } else if (f.getData() instanceof TIFFDirectory) {
+ subDir = (TIFFDirectory)f.getData();
+ }
+ if (subDir != null) {
+ TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
+ f = new TIFFField(tag, f.getType(), (long)f.getCount(),
+ subIFD);
+ } else {
+ f = null;
+ }
+ }
+ if (f != null) {
+ ifd.addTIFFField(f);
+ }
+ }
+
+ return ifd;
+ }
+
public static TIFFTag getTag(int tagNumber, List tagSets) {
Iterator iter = tagSets.iterator();
while (iter.hasNext()) {
@@ -704,7 +743,7 @@ public class TIFFIFD extends TIFFDirectory {
pos = nextSpace;
if (tag.isIFDPointer() && f.hasDirectory()) {
- TIFFIFD subIFD = (TIFFIFD)f.getDirectory();
+ TIFFIFD subIFD = getDirectoryAsIFD(f.getDirectory());
subIFD.writeToStream(stream);
nextSpace = subIFD.lastPosition;
} else {
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
index 6cfcc9a3b34..a1455315331 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageMetadata.java
@@ -132,7 +132,7 @@ public class TIFFImageMetadata extends IIOMetadata {
if (tag == null) {
node = f.getAsNativeNode();
} else if (tag.isIFDPointer() && f.hasDirectory()) {
- TIFFIFD subIFD = (TIFFIFD)f.getDirectory();
+ TIFFIFD subIFD = TIFFIFD.getDirectoryAsIFD(f.getDirectory());
// Recurse
node = getIFDAsTree(subIFD, tag.getName(), tag.getNumber());
diff --git a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
index d2f544ad923..9924c3d2210 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFImageWriter.java
@@ -1478,7 +1478,7 @@ public class TIFFImageWriter extends ImageWriter {
(ExifParentTIFFTagSet.TAG_EXIF_IFD_POINTER);
if(f != null && f.hasDirectory()) {
// Retrieve the Exif IFD.
- exifIFD = (TIFFIFD)f.getDirectory();
+ exifIFD = TIFFIFD.getDirectoryAsIFD(f.getDirectory());
} else if(isPrimaryIFD) {
// Create the Exif IFD.
List exifTagSets = new ArrayList(1);
diff --git a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java
index f3e5577716a..7678762203f 100644
--- a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java
+++ b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java
@@ -203,44 +203,6 @@ public class TIFFDirectory implements Cloneable {
return tim.getRootIFD();
}
- /**
- * Converts a {@code TIFFDirectory} to a {@code TIFFIFD}.
- */
- private static TIFFIFD getDirectoryAsIFD(TIFFDirectory dir) {
- if(dir instanceof TIFFIFD) {
- return (TIFFIFD)dir;
- }
-
- TIFFIFD ifd = new TIFFIFD(Arrays.asList(dir.getTagSets()),
- dir.getParentTag());
- TIFFField[] fields = dir.getTIFFFields();
- int numFields = fields.length;
- for(int i = 0; i < numFields; i++) {
- TIFFField f = fields[i];
- TIFFTag tag = f.getTag();
- if(tag.isIFDPointer()) {
- TIFFDirectory subDir = null;
- if (f.hasDirectory()) {
- subDir = f.getDirectory();
- } else if (f.getData() instanceof TIFFDirectory) {
- subDir = (TIFFDirectory)f.getData();
- }
- if (subDir != null) {
- TIFFDirectory subIFD = getDirectoryAsIFD(subDir);
- f = new TIFFField(tag, f.getType(), (long)f.getCount(),
- subIFD);
- } else {
- f = null;
- }
- }
- if (f != null) {
- ifd.addTIFFField(f);
- }
- }
-
- return ifd;
- }
-
/**
* Constructs a {@code TIFFDirectory} which is aware of a given
* group of {@link TIFFTagSet}s. An optional parent {@link TIFFTag}
@@ -459,7 +421,7 @@ public class TIFFDirectory implements Cloneable {
* {@code TIFFDirectory}.
*/
public IIOMetadata getAsMetadata() {
- return new TIFFImageMetadata(getDirectoryAsIFD(this));
+ return new TIFFImageMetadata(TIFFIFD.getDirectoryAsIFD(this));
}
/**
diff --git a/jdk/test/javax/imageio/plugins/tiff/IFDTest.java b/jdk/test/javax/imageio/plugins/tiff/IFDTest.java
new file mode 100644
index 00000000000..6822477749c
--- /dev/null
+++ b/jdk/test/javax/imageio/plugins/tiff/IFDTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8152966
+ * @summary Verify that casting of TIFFDirectory to TIFFIFD has been fixed.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import javax.imageio.*;
+import javax.imageio.metadata.*;
+import javax.imageio.stream.*;
+
+
+import javax.imageio.plugins.tiff.*;
+
+
+public class IFDTest {
+
+ private ImageWriter getTIFFWriter() {
+
+ java.util.Iterator writers =
+ ImageIO.getImageWritersByFormatName("TIFF");
+ if (!writers.hasNext()) {
+ throw new RuntimeException("No readers available for TIFF format");
+ }
+ return writers.next();
+ }
+
+ private void writeImage() throws Exception {
+
+ File file = File.createTempFile("IFDTest", "tif", new File("."));
+ file.deleteOnExit();
+
+ OutputStream s = new BufferedOutputStream(
+ new FileOutputStream("test.tiff"));
+ try (ImageOutputStream ios = ImageIO.createImageOutputStream(s)) {
+
+ ImageWriter writer = getTIFFWriter();
+ writer.setOutput(ios);
+
+ BufferedImage img = new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB);
+ Graphics g = img.getGraphics();
+ g.setColor(Color.GRAY);
+ g.fillRect(0, 0, 20, 20);
+ g.dispose();
+
+ IIOMetadata metadata = writer.getDefaultImageMetadata(
+ new ImageTypeSpecifier(img), writer.getDefaultWriteParam());
+
+ TIFFDirectory dir = TIFFDirectory.createFromMetadata(metadata);
+
+ int type = TIFFTag.TIFF_IFD_POINTER;
+ int nTag = ExifParentTIFFTagSet.TAG_EXIF_IFD_POINTER;
+ TIFFTag tag = new TIFFTag("Exif IFD", nTag, 1 << type);
+ TIFFTagSet sets[] = {ExifTIFFTagSet.getInstance()};
+
+ TIFFField f = new TIFFField(tag, type, 42L, new TIFFDirectory(sets, tag));
+ dir.addTIFFField(f);
+
+ writer.write(new IIOImage(img, null, dir.getAsMetadata()));
+
+ ios.flush();
+ writer.dispose();
+ } finally {
+ s.close();
+ file.delete();
+ }
+ }
+
+
+ public static void main(String[] args) throws Exception {
+ (new IFDTest()).writeImage();
+ }
+}
From a39d9629ddd66408aedabe1b6d20f75f220a5315 Mon Sep 17 00:00:00 2001
From: Erik Joelsson
Date: Mon, 15 Aug 2016 16:14:59 +0200
Subject: [PATCH 060/120] 8069540: Remove universal binaries support from
hotspot build
Reviewed-by: tbell, dholmes, dcubed
---
common/autoconf/spec.gmk.in | 2 --
1 file changed, 2 deletions(-)
diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in
index e4d41e81b43..c591a79d327 100644
--- a/common/autoconf/spec.gmk.in
+++ b/common/autoconf/spec.gmk.in
@@ -251,8 +251,6 @@ SUPPORT_HEADLESS:=@SUPPORT_HEADLESS@
# Legacy support
USE_NEW_HOTSPOT_BUILD:=@USE_NEW_HOTSPOT_BUILD@
-MACOSX_UNIVERSAL=@MACOSX_UNIVERSAL@
-
# JDK_OUTPUTDIR specifies where a working jvm is built.
# You can run $(JDK_OUTPUTDIR)/bin/java
# Though the layout of the contents of $(JDK_OUTPUTDIR) is not
From d57ddc21e8485412652403d3b8529081f4a41671 Mon Sep 17 00:00:00 2001
From: Erik Joelsson
Date: Mon, 15 Aug 2016 16:15:16 +0200
Subject: [PATCH 061/120] 8069540: Remove universal binaries support from
hotspot build
Reviewed-by: tbell, dholmes, dcubed
---
hotspot/make/Dist.gmk | 16 ----------------
1 file changed, 16 deletions(-)
diff --git a/hotspot/make/Dist.gmk b/hotspot/make/Dist.gmk
index bfe3daf2062..710de55960c 100644
--- a/hotspot/make/Dist.gmk
+++ b/hotspot/make/Dist.gmk
@@ -45,15 +45,6 @@ else
LIB_SUBDIR := lib$(OPENJDK_TARGET_CPU_LIBDIR)
endif
-################################################################################
-# Functions to setup copying of files for variants
-
-# Support macro for SetupDistLibFile
-define macosx_universalize
- $(MKDIR) -p $(@D)
- $(LIPO) -create -output $@ $<
-endef
-
################################################################################
# Setup make rules to copy a native library and associated data.
#
@@ -74,16 +65,9 @@ define SetupDistLibFileBody
$1_LIB_NAME := $(LIBRARY_PREFIX)$$($1_NAME)
$1_TARGET_DIR := $$(DIST_OUTPUTDIR)/$$(LIB_SUBDIR)/$$($1_VARIANT_TARGET_DIR)
- ifeq ($(OPENJDK_TARGET_OS), macosx)
- # We must use the 'universalize' macro to run lipo on shared libraries, at
- # least until JDK-8069540 is fixed.
- $1_MACRO := macosx_universalize
- endif
-
# Copy the the native library.
$$(eval $$(call SetupCopyFiles, $1_COPY_LIB, \
DEST := $$($1_TARGET_DIR), \
- MACRO := $$($1_MACRO), \
FILES := $$(wildcard \
$$($1_SRC_DIR)/$$($1_LIB_NAME)$(SHARED_LIBRARY_SUFFIX)), \
))
From 50c19d91941e8bebe3e8f162a3a4cf1beeb4a8ab Mon Sep 17 00:00:00 2001
From: Sergey Bylokhov
Date: Mon, 15 Aug 2016 20:08:55 +0300
Subject: [PATCH 062/120] 8163949: Cleanup of classes which are related to
JavaSound
Reviewed-by: prr
---
.../com/sun/media/sound/AbstractDataLine.java | 48 ++---
.../com/sun/media/sound/AbstractLine.java | 25 +--
.../sun/media/sound/AbstractMidiDevice.java | 92 +++------
.../sound/AbstractMidiDeviceProvider.java | 8 -
.../com/sun/media/sound/AbstractMixer.java | 56 ++---
.../com/sun/media/sound/AiffFileFormat.java | 1 -
.../com/sun/media/sound/AiffFileReader.java | 1 -
.../com/sun/media/sound/AlawCodec.java | 30 +--
.../media/sound/AudioFileSoundbankReader.java | 3 +
.../sun/media/sound/AudioFloatConverter.java | 138 ++++++++-----
.../sound/AudioFloatFormatConverter.java | 48 ++++-
.../media/sound/AudioFloatInputStream.java | 19 ++
.../com/sun/media/sound/AudioSynthesizer.java | 14 +-
.../sound/AudioSynthesizerPropertyInfo.java | 1 +
.../com/sun/media/sound/AutoClosingClip.java | 2 +-
.../sun/media/sound/AutoConnectSequencer.java | 3 +-
.../classes/com/sun/media/sound/DLSInfo.java | 1 +
.../com/sun/media/sound/DLSInstrument.java | 17 +-
.../com/sun/media/sound/DLSModulator.java | 1 +
.../com/sun/media/sound/DLSRegion.java | 3 +-
.../com/sun/media/sound/DLSSample.java | 5 +
.../com/sun/media/sound/DLSSampleLoop.java | 1 +
.../com/sun/media/sound/DLSSampleOptions.java | 3 +-
.../com/sun/media/sound/DLSSoundbank.java | 34 +--
.../sun/media/sound/DLSSoundbankReader.java | 4 +
.../com/sun/media/sound/DataPusher.java | 7 +-
.../sun/media/sound/DirectAudioDevice.java | 115 +++++------
.../sound/DirectAudioDeviceProvider.java | 18 +-
.../sun/media/sound/EmergencySoundbank.java | 1 +
.../com/sun/media/sound/EventDispatcher.java | 44 ++--
.../classes/com/sun/media/sound/FFT.java | 4 +-
.../com/sun/media/sound/FastShortMessage.java | 19 +-
.../com/sun/media/sound/FastSysexMessage.java | 6 +-
.../sun/media/sound/InvalidDataException.java | 1 +
.../media/sound/InvalidFormatException.java | 1 +
.../sun/media/sound/JARSoundbankReader.java | 5 +-
.../com/sun/media/sound/JDK13Services.java | 3 -
.../sun/media/sound/JSSecurityManager.java | 12 +-
.../sun/media/sound/JavaSoundAudioClip.java | 54 +++--
.../sound/MidiDeviceReceiverEnvelope.java | 10 +-
.../sound/MidiDeviceTransmitterEnvelope.java | 12 +-
.../com/sun/media/sound/MidiInDevice.java | 32 +--
.../sun/media/sound/MidiInDeviceProvider.java | 18 +-
.../com/sun/media/sound/MidiOutDevice.java | 33 +--
.../media/sound/MidiOutDeviceProvider.java | 20 +-
.../com/sun/media/sound/MidiUtils.java | 9 -
.../sound/ModelAbstractChannelMixer.java | 29 +++
.../media/sound/ModelAbstractOscillator.java | 19 +-
.../com/sun/media/sound/ModelByteBuffer.java | 10 +
.../media/sound/ModelByteBufferWavetable.java | 20 +-
.../sun/media/sound/ModelChannelMixer.java | 5 +-
.../sun/media/sound/ModelConnectionBlock.java | 1 +
.../com/sun/media/sound/ModelDestination.java | 1 +
.../sun/media/sound/ModelDirectedPlayer.java | 3 +-
.../com/sun/media/sound/ModelDirector.java | 7 +-
.../com/sun/media/sound/ModelIdentifier.java | 4 +
.../com/sun/media/sound/ModelInstrument.java | 1 +
.../sound/ModelInstrumentComparator.java | 3 +
.../media/sound/ModelMappedInstrument.java | 9 +-
.../com/sun/media/sound/ModelOscillator.java | 7 +-
.../media/sound/ModelOscillatorStream.java | 14 +-
.../com/sun/media/sound/ModelPatch.java | 1 +
.../com/sun/media/sound/ModelPerformer.java | 7 +-
.../com/sun/media/sound/ModelSource.java | 1 +
.../media/sound/ModelStandardDirector.java | 4 +
.../sound/ModelStandardIndexedDirector.java | 4 +
.../media/sound/ModelStandardTransform.java | 2 +
.../com/sun/media/sound/ModelTransform.java | 3 +-
.../com/sun/media/sound/ModelWavetable.java | 21 +-
.../com/sun/media/sound/PCMtoPCMCodec.java | 38 +---
.../classes/com/sun/media/sound/Platform.java | 17 --
.../com/sun/media/sound/PortMixer.java | 57 +++--
.../sun/media/sound/PortMixerProvider.java | 17 +-
.../media/sound/RIFFInvalidDataException.java | 1 +
.../sound/RIFFInvalidFormatException.java | 1 +
.../com/sun/media/sound/RIFFReader.java | 1 +
.../com/sun/media/sound/RIFFWriter.java | 36 +++-
.../sun/media/sound/RealTimeSequencer.java | 194 +++++++++---------
.../media/sound/ReferenceCountingDevice.java | 6 +-
.../com/sun/media/sound/SF2GlobalRegion.java | 1 +
.../com/sun/media/sound/SF2Instrument.java | 14 +-
.../sun/media/sound/SF2InstrumentRegion.java | 1 +
.../classes/com/sun/media/sound/SF2Layer.java | 5 +-
.../com/sun/media/sound/SF2LayerRegion.java | 1 +
.../com/sun/media/sound/SF2Modulator.java | 1 +
.../com/sun/media/sound/SF2Region.java | 5 +-
.../com/sun/media/sound/SF2Sample.java | 4 +
.../com/sun/media/sound/SF2Soundbank.java | 40 ++--
.../sun/media/sound/SF2SoundbankReader.java | 5 +
.../com/sun/media/sound/SimpleInstrument.java | 9 +-
.../com/sun/media/sound/SimpleSoundbank.java | 14 +-
.../media/sound/SoftAbstractResampler.java | 10 +-
.../com/sun/media/sound/SoftAudioBuffer.java | 2 +-
.../sun/media/sound/SoftAudioProcessor.java | 16 +-
.../com/sun/media/sound/SoftAudioPusher.java | 3 +-
.../com/sun/media/sound/SoftChannel.java | 74 +++++--
.../com/sun/media/sound/SoftChannelProxy.java | 27 +++
.../com/sun/media/sound/SoftChorus.java | 10 +-
.../com/sun/media/sound/SoftControl.java | 3 +-
.../sun/media/sound/SoftCubicResampler.java | 7 +-
.../media/sound/SoftEnvelopeGenerator.java | 6 +-
.../com/sun/media/sound/SoftFilter.java | 1 +
.../com/sun/media/sound/SoftInstrument.java | 2 +
.../sun/media/sound/SoftJitterCorrector.java | 11 +-
.../sun/media/sound/SoftLanczosResampler.java | 7 +-
.../com/sun/media/sound/SoftLimiter.java | 10 +-
.../sun/media/sound/SoftLinearResampler.java | 8 +-
.../sun/media/sound/SoftLinearResampler2.java | 6 +-
.../sound/SoftLowFrequencyOscillator.java | 5 +
.../com/sun/media/sound/SoftMainMixer.java | 34 +--
.../media/sound/SoftMidiAudioFileReader.java | 2 +-
.../com/sun/media/sound/SoftMixingClip.java | 31 ++-
.../sun/media/sound/SoftMixingDataLine.java | 29 ++-
.../sun/media/sound/SoftMixingMainMixer.java | 10 +-
.../com/sun/media/sound/SoftMixingMixer.java | 36 +++-
.../media/sound/SoftMixingMixerProvider.java | 7 +-
.../media/sound/SoftMixingSourceDataLine.java | 35 +++-
.../com/sun/media/sound/SoftPerformer.java | 18 +-
.../sun/media/sound/SoftPointResampler.java | 8 +-
.../com/sun/media/sound/SoftProcess.java | 12 +-
.../com/sun/media/sound/SoftReceiver.java | 4 +
.../com/sun/media/sound/SoftResampler.java | 3 +-
.../media/sound/SoftResamplerStreamer.java | 4 +-
.../com/sun/media/sound/SoftReverb.java | 18 +-
.../com/sun/media/sound/SoftShortMessage.java | 4 +
.../sun/media/sound/SoftSincResampler.java | 8 +-
.../com/sun/media/sound/SoftSynthesizer.java | 81 +++++---
.../com/sun/media/sound/SoftTuning.java | 1 +
.../com/sun/media/sound/SoftVoice.java | 29 +--
.../media/sound/StandardMidiFileReader.java | 12 +-
.../media/sound/StandardMidiFileWriter.java | 14 +-
.../classes/com/sun/media/sound/SunCodec.java | 8 +-
.../com/sun/media/sound/SunFileWriter.java | 10 +-
.../classes/com/sun/media/sound/Toolkit.java | 7 -
.../com/sun/media/sound/UlawCodec.java | 32 +--
.../media/sound/WaveExtensibleFileReader.java | 4 +-
.../com/sun/media/sound/WaveFileFormat.java | 2 +-
.../com/sun/media/sound/WaveFileWriter.java | 6 +-
.../sun/media/sound/WaveFloatFileWriter.java | 2 +-
.../classes/javax/sound/midi/MetaMessage.java | 1 +
.../classes/javax/sound/midi/MidiDevice.java | 12 +-
.../javax/sound/midi/MidiFileFormat.java | 4 +-
.../classes/javax/sound/midi/MidiMessage.java | 1 +
.../classes/javax/sound/midi/Receiver.java | 1 +
.../classes/javax/sound/midi/Sequence.java | 2 +-
.../classes/javax/sound/midi/Sequencer.java | 6 +-
.../javax/sound/midi/ShortMessage.java | 1 +
.../javax/sound/midi/SysexMessage.java | 2 +
.../share/classes/javax/sound/midi/Track.java | 7 +-
.../classes/javax/sound/midi/Transmitter.java | 1 +
.../javax/sound/sampled/AudioFileFormat.java | 10 +-
.../javax/sound/sampled/AudioFormat.java | 4 +-
.../javax/sound/sampled/AudioInputStream.java | 2 +-
.../javax/sound/sampled/CompoundControl.java | 2 +-
.../classes/javax/sound/sampled/Control.java | 2 +-
.../javax/sound/sampled/EnumControl.java | 2 +-
.../javax/sound/sampled/FloatControl.java | 9 +-
.../javax/sound/sampled/LineEvent.java | 3 +-
.../classes/javax/sound/sampled/Port.java | 11 +-
.../javax/sound/sampled/ReverbType.java | 12 +-
160 files changed, 1369 insertions(+), 1031 deletions(-)
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java
index b0f85799049..96ca26c7b5b 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractDataLine.java
@@ -32,7 +32,6 @@ import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineUnavailableException;
-
/**
* AbstractDataLine
*
@@ -147,36 +146,35 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
}
}
-
public final void open(AudioFormat format) throws LineUnavailableException {
open(format, AudioSystem.NOT_SPECIFIED);
}
-
/**
* This implementation always returns 0.
*/
+ @Override
public int available() {
return 0;
}
-
/**
* This implementation does nothing.
*/
+ @Override
public void drain() {
if (Printer.trace) Printer.trace("AbstractDataLine: drain");
}
-
/**
* This implementation does nothing.
*/
+ @Override
public void flush() {
if (Printer.trace) Printer.trace("AbstractDataLine: flush");
}
-
+ @Override
public final void start() {
//$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
synchronized(mixer) {
@@ -200,7 +198,7 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
if (Printer.trace) Printer.trace("< "+getClass().getName()+".start() - AbstractDataLine");
}
-
+ @Override
public final void stop() {
//$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
@@ -245,15 +243,17 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
// in MixerSourceLine and MixerClip, and I want to touch as little
// code as possible to change isStarted() back to isRunning().
+ @Override
public final boolean isRunning() {
return started;
}
+ @Override
public final boolean isActive() {
return active;
}
-
+ @Override
public final long getMicrosecondPosition() {
long microseconds = getLongFramePosition();
@@ -263,12 +263,12 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
return microseconds;
}
-
+ @Override
public final AudioFormat getFormat() {
return format;
}
-
+ @Override
public final int getBufferSize() {
return bufferSize;
}
@@ -283,11 +283,11 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
/**
* This implementation returns AudioSystem.NOT_SPECIFIED.
*/
+ @Override
public final float getLevel() {
return (float)AudioSystem.NOT_SPECIFIED;
}
-
// HELPER METHODS
/**
@@ -317,19 +317,12 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
synchronized (this) {
- //if (Printer.debug) Printer.debug(" AbstractDataLine: setActive: this.active: " + this.active);
- //if (Printer.debug) Printer.debug(" active: " + active);
-
if (this.active != active) {
this.active = active;
//sendEvents = true;
}
}
- //if (Printer.debug) Printer.debug(" this.active: " + this.active);
- //if (Printer.debug) Printer.debug(" sendEvents: " + sendEvents);
-
-
// $$kk: 11.19.99: take ACTIVE / INACTIVE / EOM events out;
// putting them in is technically an API change.
// do not generate ACTIVE / INACTIVE events for now
@@ -356,18 +349,12 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
synchronized (this) {
- //if (Printer.debug) Printer.debug(" AbstractDataLine: setStarted: this.started: " + this.started);
- //if (Printer.debug) Printer.debug(" started: " + started);
-
if (this.started != started) {
this.started = started;
sendEvents = true;
}
}
- //if (Printer.debug) Printer.debug(" this.started: " + this.started);
- //if (Printer.debug) Printer.debug(" sendEvents: " + sendEvents);
-
if (sendEvents) {
if (started) {
@@ -379,7 +366,6 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
if (Printer.trace) Printer.trace("< AbstractDataLine: setStarted completed");
}
-
/**
* This method generates a STOP event and sets the started state to false.
* It is here for historic reasons when an EOM event existed.
@@ -393,9 +379,6 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
if (Printer.trace) Printer.trace("< AbstractDataLine: setEOM() completed");
}
-
-
-
// OVERRIDES OF ABSTRACT LINE METHODS
/**
@@ -404,6 +387,7 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
* line is open, this should return quietly because the values
* requested will match the current ones.
*/
+ @Override
public final void open() throws LineUnavailableException {
if (Printer.trace) Printer.trace("> "+getClass().getName()+".open() - AbstractDataLine");
@@ -413,11 +397,11 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
if (Printer.trace) Printer.trace("< "+getClass().getName()+".open() - AbstractDataLine");
}
-
/**
* This should also stop the line. The closed line should not be running or active.
* After we close the line, we reset the format and buffer size to the defaults.
*/
+ @Override
public final void close() {
//$$fb 2001-10-09: Bug #4517739: avoiding deadlock by synchronizing to mixer !
synchronized (mixer) {
@@ -445,12 +429,6 @@ abstract class AbstractDataLine extends AbstractLine implements DataLine {
if (Printer.trace) Printer.trace("< "+getClass().getName()+".close() - in AbstractDataLine");
}
-
- // IMPLEMENTATIONS OF ABSTRACT LINE ABSTRACE METHODS
-
-
- // ABSTRACT METHODS
-
abstract void implOpen(AudioFormat format, int bufferSize) throws LineUnavailableException;
abstract void implClose();
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java
index 6c349b968e8..53738c13353 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractLine.java
@@ -36,7 +36,6 @@ import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
-
/**
* AbstractLine
*
@@ -72,19 +71,19 @@ abstract class AbstractLine implements Line {
this.controls = controls;
}
-
// LINE METHODS
+ @Override
public final Line.Info getLineInfo() {
return info;
}
-
+ @Override
public final boolean isOpen() {
return open;
}
-
+ @Override
public final void addLineListener(LineListener listener) {
synchronized(listeners) {
if ( ! (listeners.contains(listener)) ) {
@@ -93,22 +92,22 @@ abstract class AbstractLine implements Line {
}
}
-
/**
* Removes an audio listener.
* @param listener listener to remove
*/
+ @Override
public final void removeLineListener(LineListener listener) {
listeners.removeElement(listener);
}
-
/**
* Obtains the set of controls supported by the
* line. If no controls are supported, returns an
* array of length 0.
* @return control set
*/
+ @Override
public final Control[] getControls() {
Control[] returnedArray = new Control[controls.length];
@@ -119,7 +118,7 @@ abstract class AbstractLine implements Line {
return returnedArray;
}
-
+ @Override
public final boolean isControlSupported(Control.Type controlType) {
// protect against a NullPointerException
if (controlType == null) {
@@ -135,7 +134,7 @@ abstract class AbstractLine implements Line {
return false;
}
-
+ @Override
public final Control getControl(Control.Type controlType) {
// protect against a NullPointerException
if (controlType != null) {
@@ -150,10 +149,8 @@ abstract class AbstractLine implements Line {
throw new IllegalArgumentException("Unsupported control type: " + controlType);
}
-
// HELPER METHODS
-
/**
* This method sets the open state and generates
* events if it changes.
@@ -182,7 +179,6 @@ abstract class AbstractLine implements Line {
if (Printer.trace) Printer.trace("< "+getClass().getName()+" (AbstractLine): setOpen(" + open + ") this.open: " + this.open);
}
-
/**
* Send line events.
*/
@@ -190,7 +186,6 @@ abstract class AbstractLine implements Line {
getEventDispatcher().sendAudioEvents(event, listeners);
}
-
/**
* This is an error in the API: getFramePosition
* should return a long value. At CD quality,
@@ -200,7 +195,6 @@ abstract class AbstractLine implements Line {
return (int) getLongFramePosition();
}
-
/**
* Return the frame position in a long value
* This implementation returns AudioSystem.NOT_SPECIFIED.
@@ -209,7 +203,6 @@ abstract class AbstractLine implements Line {
return AudioSystem.NOT_SPECIFIED;
}
-
// $$kk: 06.03.99: returns the mixer used in construction.
// this is a hold-over from when there was a public method like
// this on line and should be fixed!!
@@ -232,8 +225,8 @@ abstract class AbstractLine implements Line {
}
}
- // ABSTRACT METHODS
-
+ @Override
public abstract void open() throws LineUnavailableException;
+ @Override
public abstract void close();
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java
index e9cab2c2fa4..672b76f926b 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDevice.java
@@ -26,10 +26,17 @@
package com.sun.media.sound;
import java.util.ArrayList;
-import java.util.List;
import java.util.Collections;
+import java.util.List;
-import javax.sound.midi.*;
+import javax.sound.midi.InvalidMidiDataException;
+import javax.sound.midi.MidiDevice;
+import javax.sound.midi.MidiDeviceReceiver;
+import javax.sound.midi.MidiDeviceTransmitter;
+import javax.sound.midi.MidiMessage;
+import javax.sound.midi.MidiUnavailableException;
+import javax.sound.midi.Receiver;
+import javax.sound.midi.Transmitter;
/**
@@ -43,11 +50,8 @@ import javax.sound.midi.*;
*/
abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice {
- // STATIC VARIABLES
private static final boolean TRACE_TRANSMITTER = false;
- // INSTANCE VARIABLES
-
private ArrayList receiverList;
private TransmitterList transmitterList;
@@ -62,7 +66,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
private final MidiDevice.Info info;
-
// DEVICE STATE
private volatile boolean open;
@@ -73,15 +76,10 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
private List openKeepingObjects;
/**
- * This is the device handle returned from native code
+ * This is the device handle returned from native code.
*/
protected volatile long id;
-
-
- // CONSTRUCTOR
-
-
/**
* Constructs an AbstractMidiDevice with the specified info object.
* @param info the description of the device
@@ -99,9 +97,9 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
if(Printer.trace) Printer.trace("<< AbstractMidiDevice CONSTRUCTOR completed");
}
-
// MIDI DEVICE METHODS
+ @Override
public final MidiDevice.Info getDeviceInfo() {
return info;
}
@@ -111,6 +109,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
* opened the device implicitly from closing it. The only way to close the device after
* this call is a call to close().
*/
+ @Override
public final void open() throws MidiUnavailableException {
if (Printer.trace) Printer.trace("> AbstractMidiDevice: open()");
synchronized(this) {
@@ -120,8 +119,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
if (Printer.trace) Printer.trace("< AbstractMidiDevice: open() completed");
}
-
-
/** Open the device implicitly.
* This method is intended to be used by AbstractReceiver
* and BasicTransmitter. Actually, it is called by getReceiverReferenceCounting() and
@@ -146,7 +143,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
if (Printer.trace) Printer.trace("< AbstractMidiDevice: openInternal() completed");
}
-
private void doOpen() throws MidiUnavailableException {
if (Printer.trace) Printer.trace("> AbstractMidiDevice: doOpen()");
synchronized(this) {
@@ -158,7 +154,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
if (Printer.trace) Printer.trace("< AbstractMidiDevice: doOpen() completed");
}
-
+ @Override
public final void close() {
if (Printer.trace) Printer.trace("> AbstractMidiDevice: close()");
synchronized (this) {
@@ -168,7 +164,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
if (Printer.trace) Printer.trace("< AbstractMidiDevice: close() completed");
}
-
/** Close the device for an object that implicitely opened it.
* This method is intended to be used by Transmitter.close() and Receiver.close().
* Those methods should pass this for the object parameter. Since Transmitters or Receivers
@@ -196,7 +191,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
if (Printer.trace) Printer.trace("< AbstractMidiDevice: closeInternal() completed");
}
-
public final void doClose() {
if (Printer.trace) Printer.trace("> AbstractMidiDevice: doClose()");
synchronized(this) {
@@ -208,12 +202,11 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
if (Printer.trace) Printer.trace("< AbstractMidiDevice: doClose() completed");
}
-
+ @Override
public final boolean isOpen() {
return open;
}
-
protected void implClose() {
synchronized (traRecLock) {
if (receiverList != null) {
@@ -230,21 +223,21 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
}
}
-
/**
* This implementation always returns -1.
* Devices that actually provide this should over-ride
* this method.
*/
+ @Override
public long getMicrosecondPosition() {
return -1;
}
-
/** Return the maximum number of Receivers supported by this device.
Depending on the return value of hasReceivers(), this method returns either 0 or -1.
Subclasses should rather override hasReceivers() than override this method.
*/
+ @Override
public final int getMaxReceivers() {
if (hasReceivers()) {
return -1;
@@ -253,11 +246,11 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
}
}
-
/** Return the maximum number of Transmitters supported by this device.
Depending on the return value of hasTransmitters(), this method returns either 0 or -1.
Subclasses should override hasTransmitters().
*/
+ @Override
public final int getMaxTransmitters() {
if (hasTransmitters()) {
return -1;
@@ -266,7 +259,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
}
}
-
/** Retrieve a Receiver for this device.
This method returns the value returned by createReceiver(), if it doesn't throw
an exception. Subclasses should rather override createReceiver() than override
@@ -274,6 +266,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
If createReceiver returns a Receiver, it is added to the internal list
of Receivers (see getReceiversList)
*/
+ @Override
public final Receiver getReceiver() throws MidiUnavailableException {
Receiver receiver;
synchronized (traRecLock) {
@@ -283,7 +276,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return receiver;
}
-
+ @Override
@SuppressWarnings("unchecked") // Cast of result of clone
public final List getReceivers() {
List recs;
@@ -298,12 +291,12 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return recs;
}
-
/**
* This implementation uses createTransmitter, which may throw an exception.
* If a transmitter is returned in createTransmitter, it is added to the internal
* TransmitterList
*/
+ @Override
public final Transmitter getTransmitter() throws MidiUnavailableException {
Transmitter transmitter;
synchronized (traRecLock) {
@@ -313,7 +306,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return transmitter;
}
-
+ @Override
@SuppressWarnings("unchecked") // Cast of result of clone
public final List getTransmitters() {
List tras;
@@ -328,19 +321,16 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return tras;
}
-
- // HELPER METHODS
-
final long getId() {
return id;
}
-
// REFERENCE COUNTING
/** Retrieve a Receiver and open the device implicitly.
This method is called by MidiSystem.getReceiver().
*/
+ @Override
public final Receiver getReceiverReferenceCounting()
throws MidiUnavailableException {
/* Keep this order of commands! If getReceiver() throws an exception,
@@ -354,10 +344,10 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return receiver;
}
-
/** Retrieve a Transmitter and open the device implicitly.
This method is called by MidiSystem.getTransmitter().
*/
+ @Override
public final Transmitter getTransmitterReferenceCounting()
throws MidiUnavailableException {
/* Keep this order of commands! If getTransmitter() throws an exception,
@@ -371,7 +361,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return transmitter;
}
-
/** Return the list of objects that have opened the device implicitely.
*/
private synchronized List getOpenKeepingObjects() {
@@ -381,23 +370,19 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return openKeepingObjects;
}
-
-
// RECEIVER HANDLING METHODS
-
/** Return the internal list of Receivers, possibly creating it first.
*/
private List getReceiverList() {
synchronized (traRecLock) {
if (receiverList == null) {
- receiverList = new ArrayList();
+ receiverList = new ArrayList<>();
}
}
return receiverList;
}
-
/** Returns if this device supports Receivers.
Subclasses that use Receivers should override this method to
return true. They also should override createReceiver().
@@ -408,7 +393,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return false;
}
-
/** Create a Receiver object.
throwing an exception here means that Receivers aren't enabled.
Subclasses that use Receivers should override this method with
@@ -420,8 +404,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
throw new MidiUnavailableException("MIDI IN receiver not available");
}
-
-
// TRANSMITTER HANDLING
/** Return the internal list of Transmitters, possibly creating it first.
@@ -435,7 +417,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return transmitterList;
}
-
/** Returns if this device supports Transmitters.
Subclasses that use Transmitters should override this method to
return true. They also should override createTransmitter().
@@ -446,7 +427,6 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
return false;
}
-
/** Create a Transmitter object.
throwing an exception here means that Transmitters aren't enabled.
Subclasses that use Transmitters should override this method with
@@ -458,20 +438,16 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
throw new MidiUnavailableException("MIDI OUT transmitter not available");
}
- // ABSTRACT METHODS
-
protected abstract void implOpen() throws MidiUnavailableException;
-
/**
- * close this device if discarded by the garbage collector
+ * close this device if discarded by the garbage collector.
*/
+ @Override
protected final void finalize() {
close();
}
- // INNER CLASSES
-
/** Base class for Receivers.
Subclasses that use Receivers must use this base class, since it
contains magic necessary to manage implicit closing the device.
@@ -550,6 +526,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
this.tlist = tlist;
}
+ @Override
public final void setReceiver(Receiver receiver) {
if (tlist != null && this.receiver != receiver) {
if (Printer.debug) Printer.debug("Transmitter "+toString()+": set receiver "+receiver);
@@ -558,16 +535,17 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
}
}
+ @Override
public final Receiver getReceiver() {
return receiver;
}
-
/** Close the Transmitter.
* Here, the call to the magic method closeInternal() takes place.
* Therefore, subclasses that override this method must call
* 'super.close()'.
*/
+ @Override
public final void close() {
AbstractMidiDevice.this.closeInternal(this);
if (tlist != null) {
@@ -577,19 +555,19 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
}
}
+ @Override
public final MidiDevice getMidiDevice() {
return AbstractMidiDevice.this;
}
} // class BasicTransmitter
-
/**
- * a class to manage a list of transmitters
+ * a class to manage a list of transmitters.
*/
final class TransmitterList {
- private final ArrayList transmitters = new ArrayList();
+ private final ArrayList transmitters = new ArrayList<>();
private MidiOutDevice.MidiOutReceiver midiOutReceiver;
// how many transmitters must be present for optimized
@@ -712,9 +690,8 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
}
}
-
/**
- * Send this message to all transmitters
+ * Send this message to all transmitters.
*/
void sendMessage(MidiMessage message, long timeStamp) {
if (message instanceof FastShortMessage) {
@@ -746,8 +723,5 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
}
}
}
-
-
} // TransmitterList
-
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java
index 6ff1ccde6b0..563cb294766 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMidiDeviceProvider.java
@@ -52,7 +52,6 @@ public abstract class AbstractMidiDeviceProvider extends MidiDeviceProvider {
// also for memory's sake, do not initialize the arrays here
}
-
final synchronized void readDeviceInfos() {
Info[] infos = getInfoCache();
MidiDevice[] devices = getDeviceCache();
@@ -148,10 +147,6 @@ public abstract class AbstractMidiDeviceProvider extends MidiDeviceProvider {
throw MidiUtils.unsupportedDevice(info);
}
-
- // INNER CLASSES
-
-
/**
* Info class for MidiDevices. Adds an index value for
* making native references to a particular device.
@@ -182,9 +177,6 @@ public abstract class AbstractMidiDeviceProvider extends MidiDeviceProvider {
} // class Info
-
- // ABSTRACT METHODS
-
abstract int getNumDevices();
abstract MidiDevice[] getDeviceCache();
abstract void setDeviceCache(MidiDevice[] devices);
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java
index 83378615b77..7389e8dbeac 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java
@@ -28,9 +28,9 @@ package com.sun.media.sound;
import java.util.Vector;
import javax.sound.sampled.Control;
-import javax.sound.sampled.Mixer;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineUnavailableException;
+import javax.sound.sampled.Mixer;
/**
* Abstract Mixer. Implements Mixer (with abstract methods) and specifies
@@ -76,29 +76,18 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
*/
private boolean manuallyOpened = false;
-
- /**
- * Supported formats for the mixer.
- */
- //$$fb DELETE
- //protected Vector formats = new Vector();
-
-
// STATE VARIABLES
-
/**
- * Source lines (ports) currently open
+ * Source lines (ports) currently open.
*/
private final Vector sourceLines = new Vector<>();
-
/**
* Target lines currently open.
*/
private final Vector targetLines = new Vector<>();
-
/**
* Constructs a new AbstractMixer.
* @param mixer the mixer with which this line is associated
@@ -124,30 +113,28 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
this.targetLineInfo = targetLineInfo;
}
-
// MIXER METHODS
-
+ @Override
public final Mixer.Info getMixerInfo() {
return mixerInfo;
}
-
+ @Override
public final Line.Info[] getSourceLineInfo() {
Line.Info[] localArray = new Line.Info[sourceLineInfo.length];
System.arraycopy(sourceLineInfo, 0, localArray, 0, sourceLineInfo.length);
return localArray;
}
-
+ @Override
public final Line.Info[] getTargetLineInfo() {
-
Line.Info[] localArray = new Line.Info[targetLineInfo.length];
System.arraycopy(targetLineInfo, 0, localArray, 0, targetLineInfo.length);
return localArray;
}
-
+ @Override
public final Line.Info[] getSourceLineInfo(Line.Info info) {
int i;
@@ -168,7 +155,7 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
return returnedArray;
}
-
+ @Override
public final Line.Info[] getTargetLineInfo(Line.Info info) {
int i;
@@ -189,7 +176,7 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
return returnedArray;
}
-
+ @Override
public final boolean isLineSupported(Line.Info info) {
int i;
@@ -211,9 +198,10 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
return false;
}
-
+ @Override
public abstract Line getLine(Line.Info info) throws LineUnavailableException;
+ @Override
public abstract int getMaxLines(Line.Info info);
protected abstract void implOpen() throws LineUnavailableException;
@@ -221,7 +209,7 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
protected abstract void implStop();
protected abstract void implClose();
-
+ @Override
public final Line[] getSourceLines() {
Line[] localLines;
@@ -238,7 +226,7 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
return localLines;
}
-
+ @Override
public final Line[] getTargetLines() {
Line[] localLines;
@@ -255,37 +243,37 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
return localLines;
}
-
/**
* Default implementation always throws an exception.
*/
+ @Override
public final void synchronize(Line[] lines, boolean maintainSync) {
throw new IllegalArgumentException("Synchronization not supported by this mixer.");
}
-
/**
* Default implementation always throws an exception.
*/
+ @Override
public final void unsynchronize(Line[] lines) {
throw new IllegalArgumentException("Synchronization not supported by this mixer.");
}
-
/**
* Default implementation always returns false.
*/
+ @Override
public final boolean isSynchronizationSupported(Line[] lines,
boolean maintainSync) {
return false;
}
-
// OVERRIDES OF ABSTRACT DATA LINE METHODS
/**
* This implementation tries to open the mixer with its current format and buffer size settings.
*/
+ @Override
public final synchronized void open() throws LineUnavailableException {
open(true);
}
@@ -307,10 +295,8 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
if (Printer.trace) Printer.trace("<< AbstractMixer: open() succeeded");
}
-
// METHOD FOR INTERNAL IMPLEMENTATION USE
-
/**
* The default implementation of this method just determines whether
* this line is a source or target line, calls open(no-arg) on the
@@ -357,7 +343,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
if (Printer.trace) Printer.trace("<< AbstractMixer: open(" + line + ") completed");
}
-
/**
* Removes this line from the list of open source lines and
* open target lines, if it exists in either.
@@ -388,10 +373,10 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
if (Printer.trace) Printer.trace("<< AbstractMixer: close(" + line + ") succeeded");
}
-
/**
* Close all lines and then close this mixer.
*/
+ @Override
public final synchronized void close() {
if (Printer.trace) Printer.trace(">> AbstractMixer: close()");
if (isOpen()) {
@@ -439,7 +424,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
if (Printer.trace) Printer.trace("<< AbstractMixer: start(" + line + ") succeeded");
}
-
/**
* Stops the mixer if this was the last running line.
*/
@@ -492,8 +476,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
if (Printer.trace) Printer.trace("<< AbstractMixer: stop(" + line + ") succeeded");
}
-
-
/**
* Determines whether this is a source line for this mixer.
* Right now this just checks whether it's supported, but should
@@ -510,7 +492,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
return false;
}
-
/**
* Determines whether this is a target line for this mixer.
* Right now this just checks whether it's supported, but should
@@ -527,7 +508,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
return false;
}
-
/**
* Returns the first complete Line.Info object it finds that
* matches the one specified, or null if no matching Line.Info
@@ -551,8 +531,6 @@ abstract class AbstractMixer extends AbstractLine implements Mixer {
return targetLineInfo[i];
}
}
-
return null;
}
-
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java
index 010bd3d4b56..c7e4ccce344 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileFormat.java
@@ -87,5 +87,4 @@ final class AiffFileFormat extends StandardFileFormat {
int getSsndChunkOffset() {
return getHeaderSize()-16;
}
-
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java
index 20dc68409ff..c8d9cd8d2db 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AiffFileReader.java
@@ -29,7 +29,6 @@ import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
-import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java
index e117348dbdf..30dd2e8d726 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AlawCodec.java
@@ -33,7 +33,6 @@ import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
-
/**
* A-law encodes linear data, and decodes a-law data to linear data.
*
@@ -52,7 +51,7 @@ public final class AlawCodec extends SunCodec {
0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF};
/**
- * Initializes the decode tables
+ * Initializes the decode tables.
*/
static {
for (int i=0;i<256;i++) {
@@ -83,10 +82,7 @@ public final class AlawCodec extends SunCodec {
super(alawEncodings, alawEncodings);
}
- // NEW CODE
-
- /**
- */
+ @Override
public AudioFormat.Encoding[] getTargetEncodings(AudioFormat sourceFormat){
if( sourceFormat.getEncoding().equals( AudioFormat.Encoding.PCM_SIGNED )) {
@@ -117,8 +113,7 @@ public final class AlawCodec extends SunCodec {
}
}
- /**
- */
+ @Override
public AudioFormat[] getTargetFormats(AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat){
Objects.requireNonNull(sourceFormat);
if( (targetEncoding.equals( AudioFormat.Encoding.PCM_SIGNED ) && sourceFormat.getEncoding().equals( AudioFormat.Encoding.ALAW)) ||
@@ -129,8 +124,7 @@ public final class AlawCodec extends SunCodec {
}
}
- /**
- */
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream){
AudioFormat sourceFormat = sourceStream.getFormat();
AudioFormat.Encoding sourceEncoding = sourceFormat.getEncoding();
@@ -169,9 +163,7 @@ public final class AlawCodec extends SunCodec {
return getConvertedStream(targetFormat, sourceStream);
}
- /**
- * use old code...
- */
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream){
if (!isConversionSupported(targetFormat, sourceStream.getFormat()))
throw new IllegalArgumentException("Unsupported conversion: "
@@ -180,10 +172,6 @@ public final class AlawCodec extends SunCodec {
return getConvertedStream( targetFormat, sourceStream );
}
-
- // OLD CODE
-
-
/**
* Opens the codec with the specified parameters.
* @param stream stream from which data to be processed should be read
@@ -192,7 +180,6 @@ public final class AlawCodec extends SunCodec {
* @throws IllegalArgumentException if the format combination supplied is
* not supported.
*/
- /* public AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) { */
private AudioInputStream getConvertedStream(AudioFormat outputFormat, AudioInputStream stream) {
AudioInputStream cs = null;
@@ -201,7 +188,7 @@ public final class AlawCodec extends SunCodec {
if( inputFormat.matches(outputFormat) ) {
cs = stream;
} else {
- cs = (AudioInputStream) (new AlawCodecStream(stream, outputFormat));
+ cs = new AlawCodecStream(stream, outputFormat);
}
return cs;
@@ -214,7 +201,6 @@ public final class AlawCodec extends SunCodec {
* returns an array of length 0.
* @return array of supported output formats.
*/
- /* public AudioFormat[] getOutputFormats(AudioFormat inputFormat) { */
private AudioFormat[] getOutputFormats(AudioFormat inputFormat) {
@@ -343,18 +329,20 @@ public final class AlawCodec extends SunCodec {
* Note that this won't actually read anything; must read in
* two-byte units.
*/
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
return read(b, 0, b.length);
}
-
+ @Override
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
// don't read fractional frames
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java
index 11b0fa6ee6e..de9d124753f 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFileSoundbankReader.java
@@ -45,6 +45,7 @@ import javax.sound.sampled.UnsupportedAudioFileException;
*/
public final class AudioFileSoundbankReader extends SoundbankReader {
+ @Override
public Soundbank getSoundbank(URL url)
throws InvalidMidiDataException, IOException {
try {
@@ -59,6 +60,7 @@ public final class AudioFileSoundbankReader extends SoundbankReader {
}
}
+ @Override
public Soundbank getSoundbank(InputStream stream)
throws InvalidMidiDataException, IOException {
stream.mark(512);
@@ -108,6 +110,7 @@ public final class AudioFileSoundbankReader extends SoundbankReader {
}
}
+ @Override
public Soundbank getSoundbank(File file)
throws InvalidMidiDataException, IOException {
try {
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java
index 77930d05657..31d7ff51d5e 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatConverter.java
@@ -89,8 +89,9 @@ public abstract class AudioFloatConverter {
mask = (byte) 0xFF;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
byte[] ret = converter.toByteArray(in_buff, in_offset, in_len,
out_buff, out_offset);
@@ -102,8 +103,9 @@ public abstract class AudioFloatConverter {
return ret;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
if (mask_buffer == null || mask_buffer.length < in_buff.length)
mask_buffer = new byte[in_buff.length];
System.arraycopy(in_buff, 0, mask_buffer, 0, in_buff.length);
@@ -132,8 +134,9 @@ public abstract class AudioFloatConverter {
double[] double_buff = null;
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int in_len = out_len * 8;
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -154,8 +157,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int out_len = in_len * 8;
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -184,8 +188,9 @@ public abstract class AudioFloatConverter {
double[] double_buff = null;
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int in_len = out_len * 8;
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -206,8 +211,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int out_len = in_len * 8;
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -240,8 +246,9 @@ public abstract class AudioFloatConverter {
FloatBuffer floatbuffer = null;
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int in_len = out_len * 4;
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -255,8 +262,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int out_len = in_len * 4;
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -277,8 +285,9 @@ public abstract class AudioFloatConverter {
FloatBuffer floatbuffer = null;
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int in_len = out_len * 4;
if (bytebuffer == null || bytebuffer.capacity() < in_len) {
bytebuffer = ByteBuffer.allocate(in_len).order(
@@ -292,8 +301,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int out_len = in_len * 4;
if (bytebuffer == null || bytebuffer.capacity() < out_len) {
bytebuffer = ByteBuffer.allocate(out_len).order(
@@ -316,8 +326,9 @@ public abstract class AudioFloatConverter {
// PCM 8 bit, signed
private static class AudioFloatConversion8S extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -327,8 +338,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -341,8 +353,9 @@ public abstract class AudioFloatConverter {
// PCM 8 bit, unsigned
private static class AudioFloatConversion8U extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -352,8 +365,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -372,8 +386,9 @@ public abstract class AudioFloatConverter {
// PCM 16 bit, signed, little-endian
private static class AudioFloatConversion16SL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int len = out_offset + out_len;
for (int ox = out_offset; ox < len; ox++) {
@@ -383,8 +398,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ox = out_offset;
int len = in_offset + in_len;
for (int ix = in_offset; ix < len; ix++) {
@@ -399,8 +415,9 @@ public abstract class AudioFloatConverter {
// PCM 16 bit, signed, big-endian
private static class AudioFloatConversion16SB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -410,8 +427,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -426,8 +444,9 @@ public abstract class AudioFloatConverter {
// PCM 16 bit, unsigned, little-endian
private static class AudioFloatConversion16UL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -438,8 +457,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -454,8 +474,9 @@ public abstract class AudioFloatConverter {
// PCM 16 bit, unsigned, big-endian
private static class AudioFloatConversion16UB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -466,8 +487,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -488,8 +510,9 @@ public abstract class AudioFloatConverter {
// PCM 24 bit, signed, little-endian
private static class AudioFloatConversion24SL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -502,8 +525,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -521,8 +545,9 @@ public abstract class AudioFloatConverter {
// PCM 24 bit, signed, big-endian
private static class AudioFloatConversion24SB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -535,8 +560,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -554,8 +580,9 @@ public abstract class AudioFloatConverter {
// PCM 24 bit, unsigned, little-endian
private static class AudioFloatConversion24UL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -567,8 +594,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -585,8 +613,9 @@ public abstract class AudioFloatConverter {
// PCM 24 bit, unsigned, big-endian
private static class AudioFloatConversion24UB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -598,8 +627,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -622,8 +652,9 @@ public abstract class AudioFloatConverter {
// PCM 32 bit, signed, little-endian
private static class AudioFloatConversion32SL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -635,8 +666,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -652,8 +684,9 @@ public abstract class AudioFloatConverter {
// PCM 32 bit, signed, big-endian
private static class AudioFloatConversion32SB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -665,8 +698,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -682,8 +716,9 @@ public abstract class AudioFloatConverter {
// PCM 32 bit, unsigned, little-endian
private static class AudioFloatConversion32UL extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -696,8 +731,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -715,8 +751,9 @@ public abstract class AudioFloatConverter {
// PCM 32 bit, unsigned, big-endian
private static class AudioFloatConversion32UB extends AudioFloatConverter {
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -729,8 +766,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -760,8 +798,9 @@ public abstract class AudioFloatConverter {
this.xbytes = xbytes;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -774,8 +813,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -801,8 +841,9 @@ public abstract class AudioFloatConverter {
this.xbytes = xbytes;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -816,8 +857,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -843,8 +885,9 @@ public abstract class AudioFloatConverter {
this.xbytes = xbytes;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -858,8 +901,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
@@ -886,8 +930,9 @@ public abstract class AudioFloatConverter {
this.xbytes = xbytes;
}
+ @Override
public float[] toFloatArray(byte[] in_buff, int in_offset,
- float[] out_buff, int out_offset, int out_len) {
+ float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < out_len; i++) {
@@ -901,8 +946,9 @@ public abstract class AudioFloatConverter {
return out_buff;
}
+ @Override
public byte[] toByteArray(float[] in_buff, int in_offset, int in_len,
- byte[] out_buff, int out_offset) {
+ byte[] out_buff, int out_offset) {
int ix = in_offset;
int ox = out_offset;
for (int i = 0; i < in_len; i++) {
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java
index 21ee186cb71..d28729fd7c5 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatFormatConverter.java
@@ -32,9 +32,9 @@ import java.util.Arrays;
import java.util.Objects;
import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.spi.FormatConversionProvider;
/**
@@ -63,6 +63,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
fsize = ((targetFormat.getSampleSizeInBits() + 7) / 8);
}
+ @Override
public int read() throws IOException {
byte[] b = new byte[1];
int ret = read(b);
@@ -71,6 +72,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
return b[0] & 0xFF;
}
+ @Override
public int read(byte[] b, int off, int len) throws IOException {
int flen = len / fsize;
@@ -83,6 +85,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
return ret * fsize;
}
+ @Override
public int available() throws IOException {
int ret = stream.available();
if (ret < 0)
@@ -90,22 +93,27 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
return ret * fsize;
}
+ @Override
public void close() throws IOException {
stream.close();
}
+ @Override
public synchronized void mark(int readlimit) {
stream.mark(readlimit * fsize);
}
+ @Override
public boolean markSupported() {
return stream.markSupported();
}
+ @Override
public synchronized void reset() throws IOException {
stream.reset();
}
+ @Override
public long skip(long n) throws IOException {
long ret = stream.skip(n / fsize);
if (ret < 0)
@@ -141,30 +149,37 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
.isBigEndian());
}
+ @Override
public int available() throws IOException {
return (ais.available() / sourceChannels) * targetChannels;
}
+ @Override
public void close() throws IOException {
ais.close();
}
+ @Override
public AudioFormat getFormat() {
return targetFormat;
}
+ @Override
public long getFrameLength() {
return ais.getFrameLength();
}
+ @Override
public void mark(int readlimit) {
ais.mark((readlimit / targetChannels) * sourceChannels);
}
+ @Override
public boolean markSupported() {
return ais.markSupported();
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
int len2 = (len / targetChannels) * sourceChannels;
if (conversion_buffer == null || conversion_buffer.length < len2)
@@ -212,10 +227,12 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
return (ret / sourceChannels) * targetChannels;
}
+ @Override
public void reset() throws IOException {
ais.reset();
}
+ @Override
public long skip(long len) throws IOException {
long ret = ais.skip((len / targetChannels) * sourceChannels);
if (ret < 0)
@@ -305,22 +322,27 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
ibuffer_len = buffer_len;
}
+ @Override
public int available() throws IOException {
return 0;
}
+ @Override
public void close() throws IOException {
ais.close();
}
+ @Override
public AudioFormat getFormat() {
return targetFormat;
}
+ @Override
public long getFrameLength() {
return AudioSystem.NOT_SPECIFIED; // ais.getFrameLength();
}
+ @Override
public void mark(int readlimit) {
ais.mark((int) (readlimit * pitch[0]));
mark_ibuffer_index = ibuffer_index;
@@ -337,6 +359,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
}
}
+ @Override
public boolean markSupported() {
return ais.markSupported();
}
@@ -381,6 +404,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
if (cbuffer == null || cbuffer[0].length < len / nrofchannels) {
@@ -431,6 +455,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
return len - remain * nrofchannels;
}
+ @Override
public void reset() throws IOException {
ais.reset();
if (mark_ibuffer == null)
@@ -447,6 +472,7 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
}
+ @Override
public long skip(long len) throws IOException {
if (len < 0)
return 0;
@@ -474,8 +500,9 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
Encoding.PCM_UNSIGNED,
Encoding.PCM_FLOAT};
+ @Override
public AudioInputStream getAudioInputStream(Encoding targetEncoding,
- AudioInputStream sourceStream) {
+ AudioInputStream sourceStream) {
if (!isConversionSupported(targetEncoding, sourceStream.getFormat())) {
throw new IllegalArgumentException(
"Unsupported conversion: " + sourceStream.getFormat()
@@ -496,8 +523,9 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
return getAudioInputStream(targetFormat, sourceStream);
}
+ @Override
public AudioInputStream getAudioInputStream(AudioFormat targetFormat,
- AudioInputStream sourceStream) {
+ AudioInputStream sourceStream) {
if (!isConversionSupported(targetFormat, sourceStream.getFormat()))
throw new IllegalArgumentException("Unsupported conversion: "
+ sourceStream.getFormat().toString() + " to "
@@ -526,16 +554,19 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
.getFrameLength());
}
+ @Override
public Encoding[] getSourceEncodings() {
return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED,
Encoding.PCM_FLOAT };
}
+ @Override
public Encoding[] getTargetEncodings() {
return new Encoding[] { Encoding.PCM_SIGNED, Encoding.PCM_UNSIGNED,
Encoding.PCM_FLOAT };
}
+ @Override
public Encoding[] getTargetEncodings(AudioFormat sourceFormat) {
if (AudioFloatConverter.getConverter(sourceFormat) == null)
return new Encoding[0];
@@ -543,14 +574,15 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
Encoding.PCM_FLOAT };
}
+ @Override
public AudioFormat[] getTargetFormats(Encoding targetEncoding,
- AudioFormat sourceFormat) {
+ AudioFormat sourceFormat) {
Objects.requireNonNull(targetEncoding);
if (AudioFloatConverter.getConverter(sourceFormat) == null)
return new AudioFormat[0];
int channels = sourceFormat.getChannels();
- ArrayList formats = new ArrayList();
+ ArrayList formats = new ArrayList<>();
if (targetEncoding.equals(Encoding.PCM_SIGNED))
formats.add(new AudioFormat(Encoding.PCM_SIGNED,
@@ -598,8 +630,9 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
return formats.toArray(new AudioFormat[formats.size()]);
}
+ @Override
public boolean isConversionSupported(AudioFormat targetFormat,
- AudioFormat sourceFormat) {
+ AudioFormat sourceFormat) {
Objects.requireNonNull(targetFormat);
if (AudioFloatConverter.getConverter(sourceFormat) == null)
return false;
@@ -612,8 +645,9 @@ public final class AudioFloatFormatConverter extends FormatConversionProvider {
return true;
}
+ @Override
public boolean isConversionSupported(Encoding targetEncoding,
- AudioFormat sourceFormat) {
+ AudioFormat sourceFormat) {
Objects.requireNonNull(targetEncoding);
if (AudioFloatConverter.getConverter(sourceFormat) == null)
return false;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java
index a4fd10429c4..845312ca409 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioFloatInputStream.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.ByteArrayInputStream;
@@ -66,14 +67,17 @@ public abstract class AudioFloatInputStream {
}
+ @Override
public AudioFormat getFormat() {
return format;
}
+ @Override
public long getFrameLength() {
return buffer_len;// / format.getFrameSize();
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
if (b == null)
throw new NullPointerException();
@@ -91,6 +95,7 @@ public abstract class AudioFloatInputStream {
return len;
}
+ @Override
public long skip(long len) throws IOException {
if (pos >= buffer_len)
return -1;
@@ -102,21 +107,26 @@ public abstract class AudioFloatInputStream {
return len;
}
+ @Override
public int available() throws IOException {
return buffer_len - pos;
}
+ @Override
public void close() throws IOException {
}
+ @Override
public void mark(int readlimit) {
markpos = pos;
}
+ @Override
public boolean markSupported() {
return true;
}
+ @Override
public void reset() throws IOException {
pos = markpos;
}
@@ -163,14 +173,17 @@ public abstract class AudioFloatInputStream {
this.stream = stream;
}
+ @Override
public AudioFormat getFormat() {
return stream.getFormat();
}
+ @Override
public long getFrameLength() {
return stream.getFrameLength();
}
+ @Override
public int read(float[] b, int off, int len) throws IOException {
int b_len = len * framesize_pc;
if (buffer == null || buffer.length < b_len)
@@ -182,6 +195,7 @@ public abstract class AudioFloatInputStream {
return ret / framesize_pc;
}
+ @Override
public long skip(long len) throws IOException {
long b_len = len * framesize_pc;
long ret = stream.skip(b_len);
@@ -190,22 +204,27 @@ public abstract class AudioFloatInputStream {
return ret / framesize_pc;
}
+ @Override
public int available() throws IOException {
return stream.available() / framesize_pc;
}
+ @Override
public void close() throws IOException {
stream.close();
}
+ @Override
public void mark(int readlimit) {
stream.mark(readlimit * framesize_pc);
}
+ @Override
public boolean markSupported() {
return stream.markSupported();
}
+ @Override
public void reset() throws IOException {
stream.reset();
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java
index 7479357c580..b7d292a57e5 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java
@@ -22,9 +22,11 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.Map;
+
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Synthesizer;
import javax.sound.sampled.AudioFormat;
@@ -53,7 +55,7 @@ public interface AudioSynthesizer extends Synthesizer {
* @return current audio data format
* @see AudioFormat
*/
- public AudioFormat getFormat();
+ AudioFormat getFormat();
/**
* Gets information about the possible properties for the synthesizer.
@@ -63,8 +65,7 @@ public interface AudioSynthesizer extends Synthesizer {
* describing possible properties. This array may be an empty array if
* no properties are required.
*/
- public AudioSynthesizerPropertyInfo[] getPropertyInfo(
- Map info);
+ AudioSynthesizerPropertyInfo[] getPropertyInfo(Map info);
/**
* Opens the synthesizer and starts rendering audio into
@@ -93,7 +94,7 @@ public interface AudioSynthesizer extends Synthesizer {
* @see #close
* @see #isOpen
*/
- public void open(SourceDataLine line, Map info)
+ void open(SourceDataLine line, Map info)
throws MidiUnavailableException;
/**
@@ -123,6 +124,7 @@ public interface AudioSynthesizer extends Synthesizer {
* @see #close
* @see #isOpen
*/
- public AudioInputStream openStream(AudioFormat targetFormat,
- Map info) throws MidiUnavailableException;
+ AudioInputStream openStream(AudioFormat targetFormat,
+ Map info)
+ throws MidiUnavailableException;
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java
index 11f2b7e52c9..6c7272319f7 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizerPropertyInfo.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java
index 02c5119f22e..d0567ca3001 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoClosingClip.java
@@ -28,7 +28,7 @@ package com.sun.media.sound;
import javax.sound.sampled.Clip;
/**
- * Interface for Clip objects that close themselves automatically
+ * Interface for Clip objects that close themselves automatically.
*
* @author Florian Bomers
*/
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java
index 70df345586c..4dc8a107fe1 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AutoConnectSequencer.java
@@ -41,6 +41,5 @@ public interface AutoConnectSequencer {
* needs to re-connect itself to a suitable
* device in open().
*/
- public void setAutoConnect(Receiver autoConnectReceiver);
-
+ void setAutoConnect(Receiver autoConnectReceiver);
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java
index 708bf4b04ca..c25be39d290 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInfo.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java
index c7e6188a25c..c4f45e49cb1 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSInstrument.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -47,8 +48,8 @@ public final class DLSInstrument extends ModelInstrument {
boolean druminstrument = false;
byte[] guid = null;
DLSInfo info = new DLSInfo();
- List regions = new ArrayList();
- List modulators = new ArrayList();
+ List regions = new ArrayList<>();
+ List modulators = new ArrayList<>();
public DLSInstrument() {
super(null, null, null, null);
@@ -62,6 +63,7 @@ public final class DLSInstrument extends ModelInstrument {
return info;
}
+ @Override
public String getName() {
return info.name;
}
@@ -70,6 +72,7 @@ public final class DLSInstrument extends ModelInstrument {
info.name = name;
}
+ @Override
public ModelPatch getPatch() {
return new ModelPatch(bank, preset, druminstrument);
}
@@ -86,6 +89,7 @@ public final class DLSInstrument extends ModelInstrument {
}
}
+ @Override
public Object getData() {
return null;
}
@@ -98,6 +102,7 @@ public final class DLSInstrument extends ModelInstrument {
return modulators;
}
+ @Override
public String toString() {
if (druminstrument)
return "Drumkit: " + info.name
@@ -362,17 +367,17 @@ public final class DLSInstrument extends ModelInstrument {
return null;
}
+ @Override
public ModelPerformer[] getPerformers() {
- List performers = new ArrayList();
+ List performers = new ArrayList<>();
- Map modmap = new HashMap();
+ Map modmap = new HashMap<>();
for (DLSModulator mod: getModulators()) {
modmap.put(mod.getSource() + "x" + mod.getControl() + "=" +
mod.getDestination(), mod);
}
- Map insmodmap =
- new HashMap();
+ Map insmodmap = new HashMap<>();
for (DLSRegion zone: regions) {
ModelPerformer performer = new ModelPerformer();
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java
index 4cfa7d42a13..257777628b2 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSModulator.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java
index feb99823a98..b3456a31cbe 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSRegion.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -39,7 +40,7 @@ import java.util.List;
public final class DLSRegion {
public static final int OPTION_SELFNONEXCLUSIVE = 0x0001;
- List modulators = new ArrayList();
+ List modulators = new ArrayList<>();
int keyfrom;
int keyto;
int velfrom;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java
index 047783dfdab..61d0c2298a7 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSample.java
@@ -22,10 +22,12 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.InputStream;
import java.util.Arrays;
+
import javax.sound.midi.Soundbank;
import javax.sound.midi.SoundbankResource;
import javax.sound.sampled.AudioFormat;
@@ -60,6 +62,7 @@ public final class DLSSample extends SoundbankResource {
return info;
}
+ @Override
public Object getData() {
AudioFormat format = getFormat();
@@ -93,6 +96,7 @@ public final class DLSSample extends SoundbankResource {
this.data = new ModelByteBuffer(data, offset, length);
}
+ @Override
public String getName() {
return info.name;
}
@@ -109,6 +113,7 @@ public final class DLSSample extends SoundbankResource {
this.sampleoptions = sampleOptions;
}
+ @Override
public String toString() {
return "Sample: " + info.name;
}
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java
index 724815bd1bd..cd178d8af45 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleLoop.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
/**
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java
index 059f318f414..230b58fc7cd 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSampleOptions.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.util.ArrayList;
@@ -40,7 +41,7 @@ public final class DLSSampleOptions {
short finetune;
int attenuation;
long options;
- List loops = new ArrayList();
+ List loops = new ArrayList<>();
public int getAttenuation() {
return attenuation;
diff --git a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java
index db509a96eef..e2fd9743f7e 100644
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/DLSSoundbank.java
@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.media.sound;
import java.io.File;
@@ -42,9 +43,9 @@ import javax.sound.midi.Patch;
import javax.sound.midi.Soundbank;
import javax.sound.midi.SoundbankResource;
import javax.sound.sampled.AudioFormat;
+import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.AudioFormat.Encoding;
/**
* A DLS Level 1 and Level 2 soundbank reader (from files/url/streams).
@@ -100,10 +101,12 @@ public final class DLSSoundbank implements Soundbank {
return d;
}
+ @Override
public int hashCode() {
return (int)i1;
}
+ @Override
public boolean equals(Object obj) {
if (!(obj instanceof DLSID)) {
return false;
@@ -176,8 +179,8 @@ public final class DLSSoundbank implements Soundbank {
private final DLSInfo info = new DLSInfo();
- private final List instruments = new ArrayList();
- private final List samples = new ArrayList();
+ private final List instruments = new ArrayList<>();
+ private final List samples = new ArrayList<>();
private boolean largeFormat = false;
private File sampleFile;
@@ -300,7 +303,7 @@ public final class DLSSoundbank implements Soundbank {
DLSID uuid;
long x;
long y;
- Stack stack = new Stack();
+ Stack stack = new Stack<>();
while (riff.available() != 0) {
int opcode = riff.readUnsignedShort();
@@ -482,7 +485,7 @@ public final class DLSSoundbank implements Soundbank {
}
}
if (chunk.getType().equals("lart")) {
- List modlist = new ArrayList();
+ List modlist = new ArrayList<>();
while (chunk.hasNextChunk()) {
RIFFReader subchunk = chunk.nextChunk();
if (chunk.getFormat().equals("cdl ")) {
@@ -498,7 +501,7 @@ public final class DLSSoundbank implements Soundbank {
}
if (chunk.getType().equals("lar2")) {
// support for DLS level 2 ART
- List modlist = new ArrayList();
+ List modlist = new ArrayList<>();
while (chunk.hasNextChunk()) {
RIFFReader subchunk = chunk.nextChunk();
if (chunk.getFormat().equals("cdl ")) {
@@ -582,7 +585,7 @@ public final class DLSSoundbank implements Soundbank {
}
}
- private Map temp_rgnassign = new HashMap();
+ private Map temp_rgnassign = new HashMap<>();
private boolean readRgnChunk(DLSRegion split, RIFFReader riff)
throws IOException {
@@ -591,7 +594,7 @@ public final class DLSSoundbank implements Soundbank {
String format = chunk.getFormat();
if (format.equals("LIST")) {
if (chunk.getType().equals("lart")) {
- List modlist = new ArrayList();
+ List modlist = new ArrayList<>();
while (chunk.hasNextChunk()) {
RIFFReader subchunk = chunk.nextChunk();
if (chunk.getFormat().equals("cdl ")) {
@@ -607,7 +610,7 @@ public final class DLSSoundbank implements Soundbank {
}
if (chunk.getType().equals("lar2")) {
// support for DLS level 2 ART
- List modlist = new ArrayList