From 5a65ede5d43711098982995c4d2d6cd7f8eecad1 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Wed, 12 Jul 2023 10:18:31 +0300 Subject: Minor --- NEWS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 1454a2189..98867b0e6 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,7 @@ Overview of changes leading to 8.0.1 Wednesday, July 12, 2023 ==================================== -- Build fix on 32-bit arm. +- Build fix on 32-bit ARM. - More speed optimizations: - 60% speedup in retaingids subsetting SourceHanSans-VF. @@ -21,7 +21,7 @@ Sunday, July 9, 2023 For example fonts making use of the WASM shaper, see: - https://github.com/simoncozens/wasm-examples + https://github.com/harfbuzz/harfbuzz-wasm-examples - Improvements to Experimental features introduced in earlier releases: - Support for subsetting beyond-64k and VarComposites fonts. -- cgit v1.2.3 From f2aaeeb3016e10bf91c251296391a381d5fc6385 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 11:17:37 -0600 Subject: [subset/closure] Batch recursions in scheduled stages Going to revert. Doesn't pass tests and savings are minor. --- src/hb-ot-layout-gsub-table.hh | 9 +++++++-- src/hb-ot-layout-gsubgpos.hh | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index fd8a68be0..abde1c153 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -53,9 +53,14 @@ template /*static*/ typename hb_closure_context_t::return_t SubstLookup::closure_glyphs_recurse_func (hb_closure_context_t *c, unsigned lookup_index, hb_set_t *covered_seq_indices, unsigned seq_index, unsigned end_index) { const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index); - if (l.may_have_non_1to1 ()) + if (covered_seq_indices && l.may_have_non_1to1 ()) hb_set_add_range (covered_seq_indices, seq_index, end_index); - return l.dispatch (c); + + if (covered_seq_indices) + c->schedule (lookup_index); + else + l.dispatch (c); + return hb_empty_t (); } template <> diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index e10adb78b..a9c7017d8 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -183,8 +183,22 @@ struct hb_closure_context_t : void set_recurse_func (recurse_func_t func) { recurse_func = func; } + void schedule (unsigned lookup_index) + { + scheduled.add (lookup_index); + } + void flush () { + hb_set_t scheduled_copy; + while (scheduled) + { + scheduled_copy = scheduled; + scheduled.clear (); + for (unsigned lookup_index : scheduled_copy) + recurse (lookup_index, nullptr, 0, 0); + } + output->del_range (face->get_num_glyphs (), HB_SET_VALUE_INVALID); /* Remove invalid glyphs. */ glyphs->union_ (*output); output->clear (); @@ -196,6 +210,7 @@ struct hb_closure_context_t : hb_map_t *done_lookups_glyph_count; hb_hashmap_t> *done_lookups_glyph_set; unsigned int lookup_count = 0; + hb_set_t scheduled; }; -- cgit v1.2.3 From 915410e5267cba5bfc6154548c8856ae077bfefe Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 11:18:09 -0600 Subject: Revert "[priority-queue] Inline a couple more" This reverts commit 8704d73213da2294281687ecd7a40d408e9bf26a. --- src/hb-priority-queue.hh | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/hb-priority-queue.hh b/src/hb-priority-queue.hh index 938c02872..c006233d1 100644 --- a/src/hb-priority-queue.hh +++ b/src/hb-priority-queue.hh @@ -61,9 +61,7 @@ struct hb_priority_queue_t bubble_up (heap.length - 1); } -#ifndef HB_OPTIMIZE_SIZE HB_ALWAYS_INLINE -#endif item_t pop_minimum () { assert (!is_empty ()); @@ -109,7 +107,6 @@ struct hb_priority_queue_t return 2 * index + 2; } - HB_ALWAYS_INLINE void bubble_down (unsigned index) { repeat: -- cgit v1.2.3 From 5e42f7bb6d025f14955e60c94ea08aca472e08dd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 11:26:38 -0600 Subject: Revert "Revert "[priority-queue] Inline a couple more"" This reverts commit 915410e5267cba5bfc6154548c8856ae077bfefe. Mistake. --- src/hb-priority-queue.hh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-priority-queue.hh b/src/hb-priority-queue.hh index c006233d1..938c02872 100644 --- a/src/hb-priority-queue.hh +++ b/src/hb-priority-queue.hh @@ -61,7 +61,9 @@ struct hb_priority_queue_t bubble_up (heap.length - 1); } +#ifndef HB_OPTIMIZE_SIZE HB_ALWAYS_INLINE +#endif item_t pop_minimum () { assert (!is_empty ()); @@ -107,6 +109,7 @@ struct hb_priority_queue_t return 2 * index + 2; } + HB_ALWAYS_INLINE void bubble_down (unsigned index) { repeat: -- cgit v1.2.3 From d00b88737e0a704d2af3b6539592dd9bb33a4722 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 11:26:51 -0600 Subject: Revert "[subset/closure] Batch recursions in scheduled stages" This reverts commit f2aaeeb3016e10bf91c251296391a381d5fc6385. --- src/hb-ot-layout-gsub-table.hh | 9 ++------- src/hb-ot-layout-gsubgpos.hh | 15 --------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index abde1c153..fd8a68be0 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -53,14 +53,9 @@ template /*static*/ typename hb_closure_context_t::return_t SubstLookup::closure_glyphs_recurse_func (hb_closure_context_t *c, unsigned lookup_index, hb_set_t *covered_seq_indices, unsigned seq_index, unsigned end_index) { const SubstLookup &l = c->face->table.GSUB.get_relaxed ()->table->get_lookup (lookup_index); - if (covered_seq_indices && l.may_have_non_1to1 ()) + if (l.may_have_non_1to1 ()) hb_set_add_range (covered_seq_indices, seq_index, end_index); - - if (covered_seq_indices) - c->schedule (lookup_index); - else - l.dispatch (c); - return hb_empty_t (); + return l.dispatch (c); } template <> diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index a9c7017d8..e10adb78b 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -183,22 +183,8 @@ struct hb_closure_context_t : void set_recurse_func (recurse_func_t func) { recurse_func = func; } - void schedule (unsigned lookup_index) - { - scheduled.add (lookup_index); - } - void flush () { - hb_set_t scheduled_copy; - while (scheduled) - { - scheduled_copy = scheduled; - scheduled.clear (); - for (unsigned lookup_index : scheduled_copy) - recurse (lookup_index, nullptr, 0, 0); - } - output->del_range (face->get_num_glyphs (), HB_SET_VALUE_INVALID); /* Remove invalid glyphs. */ glyphs->union_ (*output); output->clear (); @@ -210,7 +196,6 @@ struct hb_closure_context_t : hb_map_t *done_lookups_glyph_count; hb_hashmap_t> *done_lookups_glyph_set; unsigned int lookup_count = 0; - hb_set_t scheduled; }; -- cgit v1.2.3 From d9cf9b5f071c77b385d92d4740d5fd053cf6f8c7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 12:19:10 -0600 Subject: [priority-queue] Inline insert() --- src/hb-priority-queue.hh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hb-priority-queue.hh b/src/hb-priority-queue.hh index 938c02872..baac7e1e6 100644 --- a/src/hb-priority-queue.hh +++ b/src/hb-priority-queue.hh @@ -54,6 +54,9 @@ struct hb_priority_queue_t bool in_error () const { return heap.in_error (); } +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif void insert (int64_t priority, unsigned value) { heap.push (item_t (priority, value)); @@ -139,6 +142,7 @@ struct hb_priority_queue_t goto repeat; } + HB_ALWAYS_INLINE void bubble_up (unsigned index) { repeat: -- cgit v1.2.3 From 7f1ff9c8819edc9cdb2e48cfc4042e38a05777a9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 12:22:24 -0600 Subject: [graph] Micro-optimize array access --- src/graph/graph.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 53d0bc94e..49cb4bdb0 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -1273,15 +1273,15 @@ struct graph_t { if (visited[link.objidx]) continue; - const auto& child = vertices_[link.objidx].obj; + const auto& child = vertices_.arrayZ[link.objidx].obj; unsigned link_width = link.width ? link.width : 4; // treat virtual offsets as 32 bits wide int64_t child_weight = (child.tail - child.head) + - ((int64_t) 1 << (link_width * 8)) * (vertices_[link.objidx].space + 1); + ((int64_t) 1 << (link_width * 8)) * (vertices_.arrayZ[link.objidx].space + 1); int64_t child_distance = next_distance + child_weight; - if (child_distance < vertices_[link.objidx].distance) + if (child_distance < vertices_.arrayZ[link.objidx].distance) { - vertices_[link.objidx].distance = child_distance; + vertices_.arrayZ[link.objidx].distance = child_distance; queue.insert (child_distance, link.objidx); } } -- cgit v1.2.3 From de1237fbf2660b5952dde4db171a62d9b1a77c92 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 12:38:56 -0600 Subject: [set] Add test_and_add / test_and_del Use in graph. --- src/graph/graph.hh | 17 +++++------------ src/hb-bit-page.hh | 25 +++++++++++++++++++++++++ src/hb-bit-set-invertible.hh | 2 ++ src/hb-bit-set.hh | 16 ++++++++++++++++ src/hb-set.hh | 2 ++ 5 files changed, 50 insertions(+), 12 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 49cb4bdb0..2e90bc849 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -762,16 +762,14 @@ struct graph_t void find_subgraph (unsigned node_idx, hb_set_t& subgraph) { - if (subgraph.has (node_idx)) return; - subgraph.add (node_idx); + if (!subgraph.test_and_add (node_idx)) return; for (const auto& link : vertices_[node_idx].obj.all_links ()) find_subgraph (link.objidx, subgraph); } size_t find_subgraph_size (unsigned node_idx, hb_set_t& subgraph, unsigned max_depth = -1) { - if (subgraph.has (node_idx)) return 0; - subgraph.add (node_idx); + if (!subgraph.test_and_add (node_idx)) return 0; const auto& o = vertices_[node_idx].obj; size_t size = o.tail - o.head; @@ -1159,8 +1157,7 @@ struct graph_t hb_set_t visited; for (unsigned p : vertices_[node_idx].parents) { - if (visited.has (p)) continue; - visited.add (p); + if (!visited.test_and_add (p)) continue; // Only real links can be wide for (const auto& l : vertices_[p].obj.real_links) @@ -1364,14 +1361,10 @@ struct graph_t hb_set_t& connected) { if (unlikely (!check_success (!visited.in_error ()))) return; - if (visited.has (start_idx)) return; - visited.add (start_idx); + if (!visited.test_and_add (start_idx)) return; - if (targets.has (start_idx)) - { - targets.del (start_idx); + if (targets.test_and_del (start_idx)) connected.add (start_idx); - } const auto& v = vertices_[start_idx]; diff --git a/src/hb-bit-page.hh b/src/hb-bit-page.hh index e1826e12a..a58150ff7 100644 --- a/src/hb-bit-page.hh +++ b/src/hb-bit-page.hh @@ -115,6 +115,31 @@ struct hb_bit_page_t void set (hb_codepoint_t g, bool value) { if (value) add (g); else del (g); } bool get (hb_codepoint_t g) const { return elt (g) & mask (g); } + bool test_and_add (hb_codepoint_t g) + { + elt_t *e = &elt (g); + elt_t m = mask (g); + + bool ret = !(*e & m); + if (ret) + { + *e |= m; dirty (); + } + return ret; + } + bool test_and_del (hb_codepoint_t g) + { + elt_t *e = &elt (g); + elt_t m = mask (g); + + bool ret = *e & m; + if (ret) + { + *e &= ~m; dirty (); + } + return ret; + } + void add_range (hb_codepoint_t a, hb_codepoint_t b) { elt_t *la = &elt (a); diff --git a/src/hb-bit-set-invertible.hh b/src/hb-bit-set-invertible.hh index e765a479a..7cd6e7082 100644 --- a/src/hb-bit-set-invertible.hh +++ b/src/hb-bit-set-invertible.hh @@ -104,6 +104,8 @@ struct hb_bit_set_invertible_t void add (hb_codepoint_t g) { unlikely (inverted) ? s.del (g) : s.add (g); } + bool test_and_add (hb_codepoint_t g) { return unlikely (inverted) ? s.test_and_del (g) : s.test_and_add (g); } + bool test_and_del (hb_codepoint_t g) { return unlikely (inverted) ? s.test_and_add (g) : s.test_and_del (g); } bool add_range (hb_codepoint_t a, hb_codepoint_t b) { return unlikely (inverted) ? ((void) s.del_range (a, b), true) : s.add_range (a, b); } diff --git a/src/hb-bit-set.hh b/src/hb-bit-set.hh index 17eb06541..de5c4ea70 100644 --- a/src/hb-bit-set.hh +++ b/src/hb-bit-set.hh @@ -154,6 +154,22 @@ struct hb_bit_set_t page_t *page = page_for (g, true); if (unlikely (!page)) return; page->add (g); } + bool test_and_add (hb_codepoint_t g) + { + if (unlikely (!successful)) return false; + if (unlikely (g == INVALID)) return false; + dirty (); + page_t *page = page_for (g, true); if (unlikely (!page)) return false; + return page->test_and_add (g); + } + bool test_and_del (hb_codepoint_t g) + { + if (unlikely (!successful)) return false; + if (unlikely (g == INVALID)) return false; + dirty (); + page_t *page = page_for (g); if (!page) return false; + return page->test_and_del (g); + } bool add_range (hb_codepoint_t a, hb_codepoint_t b) { if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */ diff --git a/src/hb-set.hh b/src/hb-set.hh index 7d1c941e4..7a61de7c8 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -84,6 +84,8 @@ struct hb_sparseset_t uint32_t hash () const { return s.hash (); } void add (hb_codepoint_t g) { s.add (g); } + bool test_and_add (hb_codepoint_t g) { return s.test_and_add (g); } + bool test_and_del (hb_codepoint_t g) { return s.test_and_del (g); } bool add_range (hb_codepoint_t a, hb_codepoint_t b) { return s.add_range (a, b); } template -- cgit v1.2.3 From 10b776b0c3afeefa19ec47c40196cf205a112c8b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 13:08:19 -0600 Subject: [graph] Micro-optimize --- src/graph/graph.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 2e90bc849..7f38b9ca3 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -749,10 +749,10 @@ struct graph_t { for (const auto& link : vertices_[node_idx].obj.all_links ()) { - const uint32_t *v; + uint32_t *v; if (subgraph.has (link.objidx, &v)) { - subgraph.set (link.objidx, *v + 1); + (*v)++; continue; } subgraph.set (link.objidx, 1); -- cgit v1.2.3 From 867640af31e8f88d65cd72a2c7f86f4632b98539 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 13:09:16 -0600 Subject: Revert "[set] Add test_and_add / test_and_del" This reverts commit de1237fbf2660b5952dde4db171a62d9b1a77c92. This seems to be a net loss. --- src/graph/graph.hh | 17 ++++++++++++----- src/hb-bit-page.hh | 25 ------------------------- src/hb-bit-set-invertible.hh | 2 -- src/hb-bit-set.hh | 16 ---------------- src/hb-set.hh | 2 -- 5 files changed, 12 insertions(+), 50 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 7f38b9ca3..0d86ae672 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -762,14 +762,16 @@ struct graph_t void find_subgraph (unsigned node_idx, hb_set_t& subgraph) { - if (!subgraph.test_and_add (node_idx)) return; + if (subgraph.has (node_idx)) return; + subgraph.add (node_idx); for (const auto& link : vertices_[node_idx].obj.all_links ()) find_subgraph (link.objidx, subgraph); } size_t find_subgraph_size (unsigned node_idx, hb_set_t& subgraph, unsigned max_depth = -1) { - if (!subgraph.test_and_add (node_idx)) return 0; + if (subgraph.has (node_idx)) return 0; + subgraph.add (node_idx); const auto& o = vertices_[node_idx].obj; size_t size = o.tail - o.head; @@ -1157,7 +1159,8 @@ struct graph_t hb_set_t visited; for (unsigned p : vertices_[node_idx].parents) { - if (!visited.test_and_add (p)) continue; + if (visited.has (p)) continue; + visited.add (p); // Only real links can be wide for (const auto& l : vertices_[p].obj.real_links) @@ -1361,10 +1364,14 @@ struct graph_t hb_set_t& connected) { if (unlikely (!check_success (!visited.in_error ()))) return; - if (!visited.test_and_add (start_idx)) return; + if (visited.has (start_idx)) return; + visited.add (start_idx); - if (targets.test_and_del (start_idx)) + if (targets.has (start_idx)) + { + targets.del (start_idx); connected.add (start_idx); + } const auto& v = vertices_[start_idx]; diff --git a/src/hb-bit-page.hh b/src/hb-bit-page.hh index a58150ff7..e1826e12a 100644 --- a/src/hb-bit-page.hh +++ b/src/hb-bit-page.hh @@ -115,31 +115,6 @@ struct hb_bit_page_t void set (hb_codepoint_t g, bool value) { if (value) add (g); else del (g); } bool get (hb_codepoint_t g) const { return elt (g) & mask (g); } - bool test_and_add (hb_codepoint_t g) - { - elt_t *e = &elt (g); - elt_t m = mask (g); - - bool ret = !(*e & m); - if (ret) - { - *e |= m; dirty (); - } - return ret; - } - bool test_and_del (hb_codepoint_t g) - { - elt_t *e = &elt (g); - elt_t m = mask (g); - - bool ret = *e & m; - if (ret) - { - *e &= ~m; dirty (); - } - return ret; - } - void add_range (hb_codepoint_t a, hb_codepoint_t b) { elt_t *la = &elt (a); diff --git a/src/hb-bit-set-invertible.hh b/src/hb-bit-set-invertible.hh index 7cd6e7082..e765a479a 100644 --- a/src/hb-bit-set-invertible.hh +++ b/src/hb-bit-set-invertible.hh @@ -104,8 +104,6 @@ struct hb_bit_set_invertible_t void add (hb_codepoint_t g) { unlikely (inverted) ? s.del (g) : s.add (g); } - bool test_and_add (hb_codepoint_t g) { return unlikely (inverted) ? s.test_and_del (g) : s.test_and_add (g); } - bool test_and_del (hb_codepoint_t g) { return unlikely (inverted) ? s.test_and_add (g) : s.test_and_del (g); } bool add_range (hb_codepoint_t a, hb_codepoint_t b) { return unlikely (inverted) ? ((void) s.del_range (a, b), true) : s.add_range (a, b); } diff --git a/src/hb-bit-set.hh b/src/hb-bit-set.hh index de5c4ea70..17eb06541 100644 --- a/src/hb-bit-set.hh +++ b/src/hb-bit-set.hh @@ -154,22 +154,6 @@ struct hb_bit_set_t page_t *page = page_for (g, true); if (unlikely (!page)) return; page->add (g); } - bool test_and_add (hb_codepoint_t g) - { - if (unlikely (!successful)) return false; - if (unlikely (g == INVALID)) return false; - dirty (); - page_t *page = page_for (g, true); if (unlikely (!page)) return false; - return page->test_and_add (g); - } - bool test_and_del (hb_codepoint_t g) - { - if (unlikely (!successful)) return false; - if (unlikely (g == INVALID)) return false; - dirty (); - page_t *page = page_for (g); if (!page) return false; - return page->test_and_del (g); - } bool add_range (hb_codepoint_t a, hb_codepoint_t b) { if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */ diff --git a/src/hb-set.hh b/src/hb-set.hh index 7a61de7c8..7d1c941e4 100644 --- a/src/hb-set.hh +++ b/src/hb-set.hh @@ -84,8 +84,6 @@ struct hb_sparseset_t uint32_t hash () const { return s.hash (); } void add (hb_codepoint_t g) { s.add (g); } - bool test_and_add (hb_codepoint_t g) { return s.test_and_add (g); } - bool test_and_del (hb_codepoint_t g) { return s.test_and_del (g); } bool add_range (hb_codepoint_t a, hb_codepoint_t b) { return s.add_range (a, b); } template -- cgit v1.2.3 From 07cb6bf87af604dcc1a025257aea43c9e991c065 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 13:38:33 -0600 Subject: [graph] Minor, type --- src/graph/graph.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 0d86ae672..a46524765 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -749,7 +749,7 @@ struct graph_t { for (const auto& link : vertices_[node_idx].obj.all_links ()) { - uint32_t *v; + hb_codepoint_t *v; if (subgraph.has (link.objidx, &v)) { (*v)++; -- cgit v1.2.3 From d1ddfc4d10e169c7fdd6187b38dd7a14f59e1def Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 14 Jul 2023 14:52:43 -0600 Subject: [graph] Use move instead of swap --- src/graph/graph.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index a46524765..8351fc2a9 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -465,7 +465,7 @@ struct graph_t { unsigned next_id = queue.pop_minimum().second; - hb_swap (sorted_graph[new_id], vertices_[next_id]); + sorted_graph[new_id] = std::move (vertices_[next_id]); const vertex_t& next = sorted_graph[new_id]; if (unlikely (!check_success(new_id >= 0))) { -- cgit v1.2.3 From 09706b04fce2afe42cade4cbf1b36db23edde94c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 13:11:04 -0600 Subject: [graph] Add a pre-alloc to map --- src/graph/graph.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 8351fc2a9..9e962cfc5 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -154,6 +154,7 @@ struct graph_t { hb_hashmap_t result; + result.alloc (obj.real_links.length); for (const auto& l : obj.real_links) { result.set (l.position, l.objidx); } -- cgit v1.2.3 From 548230e45e0bc9fa985d80714ede4c39a347d508 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 13:13:16 -0600 Subject: [graph] Early return from a function --- src/graph/graph.hh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 9e962cfc5..5a6fc1b82 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -213,7 +213,10 @@ struct graph_t for (unsigned i = 0; i < count; i++) { if (parents.arrayZ[i] == old_index) - parents.arrayZ[i] = new_index; + { + parents.arrayZ[i] = new_index; + break; + } } } -- cgit v1.2.3 From 326d319f93fe6173344602929fdbb5ba27412388 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 13:14:34 -0600 Subject: [graph] Micro-optimize --- src/graph/graph.hh | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 5a6fc1b82..9d35851a0 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -1252,12 +1252,8 @@ struct graph_t // (such as a fibonacci queue) with a fast decrease priority. unsigned count = vertices_.length; for (unsigned i = 0; i < count; i++) - { - if (i == vertices_.length - 1) - vertices_.arrayZ[i].distance = 0; - else - vertices_.arrayZ[i].distance = hb_int_max (int64_t); - } + vertices_.arrayZ[i].distance = hb_int_max (int64_t); + vertices_.tail ().distance = 0; hb_priority_queue_t queue; queue.insert (0, vertices_.length - 1); -- cgit v1.2.3 From a56288488c70036832414145c64ce9e42d7464a6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 13:59:10 -0600 Subject: [subset] Speed up a couple of set iteration loops Need to speed up set::next_range() for the second one to have any effect. --- src/hb-ot-layout-common.hh | 11 ++++++++++- src/hb-subset-plan.cc | 9 ++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index b3af128e0..e2e9bcbeb 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -1937,13 +1937,22 @@ struct ClassDefFormat2_4 { /* Match if there's any glyph that is not listed! */ hb_codepoint_t g = HB_SET_VALUE_INVALID; - for (auto &range : rangeRecord) + hb_codepoint_t last = HB_SET_VALUE_INVALID; + auto it = hb_iter (rangeRecord); + for (auto &range : it) { + if (it->first == last + 1) + { + it++; + continue; + } + if (!glyphs->next (&g)) break; if (g < range.first) return true; g = range.last; + last = g; } if (g != HB_SET_VALUE_INVALID && glyphs->next (&g)) return true; diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 9a00de3e6..33ca46d1f 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -605,11 +605,14 @@ _populate_unicodes_to_retain (const hb_set_t *unicodes, /* Add gids which where requested, but not mapped in cmap */ unsigned num_glyphs = plan->source->get_num_glyphs (); - for (hb_codepoint_t gid : *glyphs) + hb_codepoint_t first = HB_SET_VALUE_INVALID, last = HB_SET_VALUE_INVALID; + for (; glyphs->next_range (&first, &last); ) { - if (gid >= num_glyphs) + if (first >= num_glyphs) break; - plan->_glyphset_gsub.add (gid); + if (last >= num_glyphs) + last = num_glyphs - 1; + plan->_glyphset_gsub.add_range (first, last); } } -- cgit v1.2.3 From b2d648e41b5f963fdfe37536467c03c02cd99d2f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 14:26:06 -0600 Subject: [perf/benchmark-subset] Rename subset_codepoints to subset_unicodes --- perf/benchmark-subset.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/perf/benchmark-subset.cc b/perf/benchmark-subset.cc index 9f9ec5666..714f5401b 100644 --- a/perf/benchmark-subset.cc +++ b/perf/benchmark-subset.cc @@ -11,8 +11,8 @@ enum operation_t { - subset_codepoints, subset_glyphs, + subset_unicodes, instance, }; @@ -164,7 +164,7 @@ static void BM_subset (benchmark::State &state, switch (operation) { - case subset_codepoints: + case subset_unicodes: { hb_set_t* all_codepoints = hb_set_create (); hb_face_collect_unicodes (face, all_codepoints); @@ -264,7 +264,7 @@ int main(int argc, char** argv) #define TEST_OPERATION(op, time_unit) test_operation (op, #op, tests, num_tests, time_unit) TEST_OPERATION (subset_glyphs, benchmark::kMicrosecond); - TEST_OPERATION (subset_codepoints, benchmark::kMicrosecond); + TEST_OPERATION (subset_unicodes, benchmark::kMicrosecond); TEST_OPERATION (instance, benchmark::kMicrosecond); #undef TEST_OPERATION -- cgit v1.2.3 From 7b8e0bbb9f41561c2ee29a2868de9d7d155c9194 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 14:53:15 -0600 Subject: [ot-shape] Minor short-circuit --- src/hb-ot-shape.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index d84313f19..7d347be40 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -476,9 +476,15 @@ hb_set_unicode_props (hb_buffer_t *buffer) { _hb_glyph_info_set_unicode_props (&info[i], buffer); + unsigned gen_cat = _hb_glyph_info_get_general_category (&info[i]); + if (likely (FLAG_UNSAFE (gen_cat) & + (FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) | + FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER)))) + continue; + /* Marks are already set as continuation by the above line. * Handle Emoji_Modifier and ZWJ-continuation. */ - if (unlikely (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL && + if (unlikely (gen_cat == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL && hb_in_range (info[i].codepoint, 0x1F3FBu, 0x1F3FFu))) { _hb_glyph_info_set_continuation (&info[i]); -- cgit v1.2.3 From 765da4db1949b88eff921eb1b909dc4054e55f37 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 14:55:36 -0600 Subject: [ot-shape] Minor short-circuit --- src/hb-ot-shape.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 7d347be40..4338be7e1 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -477,9 +477,11 @@ hb_set_unicode_props (hb_buffer_t *buffer) _hb_glyph_info_set_unicode_props (&info[i], buffer); unsigned gen_cat = _hb_glyph_info_get_general_category (&info[i]); - if (likely (FLAG_UNSAFE (gen_cat) & - (FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) | - FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER)))) + if (FLAG_UNSAFE (gen_cat) & + (FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) | + FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) | + FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) | + FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER))) continue; /* Marks are already set as continuation by the above line. -- cgit v1.2.3 From 76de3451e68168912bfd4b1a500ddbc45200b706 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 15:00:23 -0600 Subject: [ot-shape] Short-circuit spaces as well --- src/hb-ot-shape.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 4338be7e1..aada05ec0 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -481,7 +481,8 @@ hb_set_unicode_props (hb_buffer_t *buffer) (FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) | FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) | FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) | - FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER))) + FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | + FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR))) continue; /* Marks are already set as continuation by the above line. -- cgit v1.2.3 From f94508edd60e26a015586c37c29104d6bdc26462 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 15 Jul 2023 15:28:19 -0600 Subject: [Ligature] Micro-optimize --- src/OT/Layout/GSUB/LigatureSet.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OT/Layout/GSUB/LigatureSet.hh b/src/OT/Layout/GSUB/LigatureSet.hh index 0ba262e90..cdd9822eb 100644 --- a/src/OT/Layout/GSUB/LigatureSet.hh +++ b/src/OT/Layout/GSUB/LigatureSet.hh @@ -125,7 +125,7 @@ struct LigatureSet { const auto &lig = this+ligature.arrayZ[i]; if (unlikely (lig.component.lenP1 <= 1) || - lig.component[1] == first) + lig.component.arrayZ[0] == first) { if (lig.apply (c)) { -- cgit v1.2.3 From 8cde4fa9a0e8cb6e42770a2ff7da158f2914cdb2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 06:01:06 -0600 Subject: [gsubgpos] Inline a couple methods --- src/hb-ot-layout-gsubgpos.hh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index e10adb78b..287b2e0ff 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -661,6 +661,7 @@ struct hb_ot_apply_context_t : return false; } + HB_ALWAYS_INLINE hb_codepoint_t get_glyph_data () { @@ -671,6 +672,7 @@ struct hb_ot_apply_context_t : #endif return 0; } + HB_ALWAYS_INLINE void advance_glyph_data () { -- cgit v1.2.3 From 5af80f349c4e040bfa853ee3f561ac16538b5988 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 07:27:28 -0600 Subject: [ChainContext] Cache two class values 7% speedup shaping Gulzar. --- src/hb-ot-layout-gsubgpos.hh | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 287b2e0ff..422cb63d0 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1220,6 +1220,28 @@ static inline bool match_class_cached (hb_glyph_info_t &info, unsigned value, co info.syllable() = klass; return klass == value; } +static inline bool match_class_cached1 (hb_glyph_info_t &info, unsigned value, const void *data) +{ + unsigned klass = info.syllable() & 0x0F; + if (klass < 15) + return klass == value; + const ClassDef &class_def = *reinterpret_cast(data); + klass = class_def.get_class (info.codepoint); + if (likely (klass < 15)) + info.syllable() = (info.syllable() & 0xF0) | klass; + return klass == value; +} +static inline bool match_class_cached2 (hb_glyph_info_t &info, unsigned value, const void *data) +{ + unsigned klass = (info.syllable() & 0xF0) >> 4; + if (klass < 15) + return klass == value; + const ClassDef &class_def = *reinterpret_cast(data); + klass = class_def.get_class (info.codepoint); + if (likely (klass < 15)) + info.syllable() = (info.syllable() & 0x0F) | (klass << 4); + return klass == value; +} static inline bool match_coverage (hb_glyph_info_t &info, unsigned value, const void *data) { Offset16To coverage; @@ -3618,20 +3640,12 @@ struct ChainContextFormat2_5 const ClassDef &input_class_def = this+inputClassDef; const ClassDef &lookahead_class_def = this+lookaheadClassDef; - /* For ChainContextFormat2_5 we cache the LookaheadClassDef instead of InputClassDef. - * The reason is that most heavy fonts want to identify a glyph in context and apply - * a lookup to it. In this scenario, the length of the input sequence is one, whereas - * the lookahead / backtrack are typically longer. The one glyph in input sequence is - * looked-up below and no input glyph is looked up in individual rules, whereas the - * lookahead and backtrack glyphs are tried. Since we match lookahead before backtrack, - * we should cache lookahead. This decisions showed a 20% improvement in shaping of - * the Gulzar font. - */ - + /* match_class_caches1 is slightly faster. Use it for lookahead, + * which is typically longer. */ struct ChainContextApplyLookupContext lookup_context = { {{cached && &backtrack_class_def == &lookahead_class_def ? match_class_cached : match_class, - cached && &input_class_def == &lookahead_class_def ? match_class_cached : match_class, - cached ? match_class_cached : match_class}}, + cached ? match_class_cached2 : match_class, + cached ? match_class_cached1 : match_class}}, {&backtrack_class_def, &input_class_def, &lookahead_class_def} -- cgit v1.2.3 From 4e641103d40b5ada7f77dba3b6f0891de60388bb Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 07:40:20 -0600 Subject: [buffer] Inline a method --- src/hb-buffer.hh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index 4d48b7f16..b0e68e66a 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -464,6 +464,9 @@ struct hb_buffer_t start, end, true); } +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif void unsafe_to_concat (unsigned int start = 0, unsigned int end = -1) { if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0)) @@ -478,6 +481,9 @@ struct hb_buffer_t start, end, true, true); } +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif void unsafe_to_concat_from_outbuffer (unsigned int start = 0, unsigned int end = -1) { if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0)) -- cgit v1.2.3 From c2f454c7e2e8f05636cfbf76f5e6b3dc3919378d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 08:23:59 -0600 Subject: [gsubgpos] Fix residual from 5af80f349c4e040bfa853ee3f561ac16538b5988 --- src/hb-ot-layout-gsubgpos.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 422cb63d0..9821f1fdc 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -3643,7 +3643,7 @@ struct ChainContextFormat2_5 /* match_class_caches1 is slightly faster. Use it for lookahead, * which is typically longer. */ struct ChainContextApplyLookupContext lookup_context = { - {{cached && &backtrack_class_def == &lookahead_class_def ? match_class_cached : match_class, + {{match_class, cached ? match_class_cached2 : match_class, cached ? match_class_cached1 : match_class}}, {&backtrack_class_def, -- cgit v1.2.3 From b9f364b8fcacf8ab32d0272190d8509f214e55f2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 08:42:36 -0600 Subject: [gsubgpos] Allocate iterators further up To avoid calling set_match_func repeatedly. Doesn't show speedup. Going to revert. --- src/OT/Layout/GSUB/Ligature.hh | 5 +- .../Layout/GSUB/ReverseChainSingleSubstFormat1.hh | 8 +- src/hb-ot-layout-gsubgpos.hh | 117 ++++++++++++--------- 3 files changed, 75 insertions(+), 55 deletions(-) diff --git a/src/OT/Layout/GSUB/Ligature.hh b/src/OT/Layout/GSUB/Ligature.hh index db3fc55f7..0ce2f69b4 100644 --- a/src/OT/Layout/GSUB/Ligature.hh +++ b/src/OT/Layout/GSUB/Ligature.hh @@ -94,10 +94,11 @@ struct Ligature unsigned int match_end = 0; unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; + c->iter_input.set_match_func (match_glyph, nullptr); + if (likely (!match_input (c, count, &component[1], - match_glyph, - nullptr, + c->iter_input, &match_end, match_positions, &total_component_count))) diff --git a/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh b/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh index 916fa281b..d74d68bde 100644 --- a/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh +++ b/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh @@ -120,14 +120,18 @@ struct ReverseChainSingleSubstFormat1 if (unlikely (index >= substitute.len)) return_trace (false); + skipping_iterator_t iter_backtrack {c->iter_context}, iter_lookahead {c->iter_context}; + iter_backtrack.set_match_func (match_coverage, this); + iter_lookahead.set_match_func (match_coverage, this); + unsigned int start_index = 0, end_index = 0; if (match_backtrack (c, backtrack.len, (HBUINT16 *) backtrack.arrayZ, - match_coverage, this, + iter_backtrack, &start_index) && match_lookahead (c, lookahead.len, (HBUINT16 *) lookahead.arrayZ, - match_coverage, this, + iter_lookahead, c->buffer->idx + 1, &end_index)) { c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index); diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 9821f1fdc..cf173c3f2 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -922,6 +922,7 @@ struct hb_ot_apply_context_t : (void) buffer->output_glyph (glyph_index); } }; +using skipping_iterator_t = hb_ot_apply_context_t::skipping_iterator_t; struct hb_accelerate_subtables_context_t : @@ -1083,11 +1084,11 @@ struct ContextCollectGlyphsFuncs { collect_glyphs_func_t collect; }; -struct ContextApplyFuncs +struct ContextWouldApplyFuncs { match_func_t match; }; -struct ChainContextApplyFuncs +struct ChainContextWouldApplyFuncs { match_func_t match[3]; }; @@ -1276,8 +1277,7 @@ HB_ALWAYS_INLINE static bool match_input (hb_ot_apply_context_t *c, unsigned int count, /* Including the first glyph (not matched) */ const HBUINT input[], /* Array of input values--start with second glyph */ - match_func_t match_func, - const void *match_data, + skipping_iterator_t &skippy_iter, unsigned int *end_position, unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], unsigned int *p_total_component_count = nullptr) @@ -1288,9 +1288,7 @@ static bool match_input (hb_ot_apply_context_t *c, hb_buffer_t *buffer = c->buffer; - hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, count - 1); - skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (input); /* @@ -1522,15 +1520,12 @@ HB_ALWAYS_INLINE static bool match_backtrack (hb_ot_apply_context_t *c, unsigned int count, const HBUINT backtrack[], - match_func_t match_func, - const void *match_data, + skipping_iterator_t &skippy_iter, unsigned int *match_start) { TRACE_APPLY (nullptr); - hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; skippy_iter.reset (c->buffer->backtrack_len (), count); - skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (backtrack); for (unsigned int i = 0; i < count; i++) @@ -1554,16 +1549,13 @@ HB_ALWAYS_INLINE static bool match_lookahead (hb_ot_apply_context_t *c, unsigned int count, const HBUINT lookahead[], - match_func_t match_func, - const void *match_data, + skipping_iterator_t &skippy_iter, unsigned int start_index, unsigned int *end_index) { TRACE_APPLY (nullptr); - hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; skippy_iter.reset (start_index - 1, count); - skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (lookahead); for (unsigned int i = 0; i < count; i++) @@ -1867,12 +1859,17 @@ struct ContextCollectGlyphsLookupContext const void *collect_data; }; -struct ContextApplyLookupContext +struct ContextWouldApplyLookupContext { - ContextApplyFuncs funcs; + ContextWouldApplyFuncs funcs; const void *match_data; }; +struct ContextApplyLookupContext +{ + skipping_iterator_t &iter; +}; + template static inline bool context_intersects (const hb_set_t *glyphs, unsigned int inputCount, /* Including the first glyph (not matched) */ @@ -1929,7 +1926,7 @@ static inline bool context_would_apply_lookup (hb_would_apply_context_t *c, const HBUINT input[], /* Array of input values--start with second glyph */ unsigned int lookupCount HB_UNUSED, const LookupRecord lookupRecord[] HB_UNUSED, - const ContextApplyLookupContext &lookup_context) + const ContextWouldApplyLookupContext &lookup_context) { return would_match_input (c, inputCount, input, @@ -1948,7 +1945,7 @@ static inline bool context_apply_lookup (hb_ot_apply_context_t *c, unsigned match_positions[HB_MAX_CONTEXT_LENGTH]; if (match_input (c, inputCount, input, - lookup_context.funcs.match, lookup_context.match_data, + lookup_context.iter, &match_end, match_positions)) { c->buffer->unsafe_to_break (c->buffer->idx, match_end); @@ -2010,7 +2007,7 @@ struct Rule } bool would_apply (hb_would_apply_context_t *c, - const ContextApplyLookupContext &lookup_context) const + const ContextWouldApplyLookupContext &lookup_context) const { const auto &lookupRecord = StructAfter> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); @@ -2141,7 +2138,7 @@ struct RuleSet } bool would_apply (hb_would_apply_context_t *c, - const ContextApplyLookupContext &lookup_context) const + const ContextWouldApplyLookupContext &lookup_context) const { return + hb_iter (rule) @@ -2294,9 +2291,9 @@ struct ContextFormat1_4 bool would_apply (hb_would_apply_context_t *c) const { const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])]; - struct ContextApplyLookupContext lookup_context = { + struct ContextWouldApplyLookupContext lookup_context = { {match_glyph}, - nullptr + nullptr, }; return rule_set.would_apply (c, lookup_context); } @@ -2311,9 +2308,10 @@ struct ContextFormat1_4 return_trace (false); const RuleSet &rule_set = this+ruleSet[index]; + skipping_iterator_t iter {c->iter_input}; + iter.set_match_func (match_glyph, nullptr); struct ContextApplyLookupContext lookup_context = { - {match_glyph}, - nullptr + iter }; return_trace (rule_set.apply (c, lookup_context)); } @@ -2487,7 +2485,7 @@ struct ContextFormat2_5 const ClassDef &class_def = this+classDef; unsigned int index = class_def.get_class (c->glyphs[0]); const RuleSet &rule_set = this+ruleSet[index]; - struct ContextApplyLookupContext lookup_context = { + struct ContextWouldApplyLookupContext lookup_context = { {match_class}, &class_def }; @@ -2532,9 +2530,10 @@ struct ContextFormat2_5 const ClassDef &class_def = this+classDef; + skipping_iterator_t iter {c->iter_input}; + iter.set_match_func (cached ? match_class_cached : match_class, &class_def); struct ContextApplyLookupContext lookup_context = { - {cached ? match_class_cached : match_class}, - &class_def + iter }; if (cached && c->buffer->cur().syllable() < 255) @@ -2702,7 +2701,7 @@ struct ContextFormat3 bool would_apply (hb_would_apply_context_t *c) const { const LookupRecord *lookupRecord = &StructAfter (coverageZ.as_array (glyphCount)); - struct ContextApplyLookupContext lookup_context = { + struct ContextWouldApplyLookupContext lookup_context = { {match_coverage}, this }; @@ -2721,9 +2720,10 @@ struct ContextFormat3 if (likely (index == NOT_COVERED)) return_trace (false); const LookupRecord *lookupRecord = &StructAfter (coverageZ.as_array (glyphCount)); + skipping_iterator_t iter {c->iter_input}; + iter.set_match_func (match_coverage, this); struct ContextApplyLookupContext lookup_context = { - {match_coverage}, - this + iter }; return_trace (context_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1), lookupCount, lookupRecord, lookup_context)); } @@ -2833,12 +2833,19 @@ struct ChainContextCollectGlyphsLookupContext const void *collect_data[3]; }; -struct ChainContextApplyLookupContext +struct ChainContextWouldApplyLookupContext { - ChainContextApplyFuncs funcs; + ChainContextWouldApplyFuncs funcs; const void *match_data[3]; }; +struct ChainContextApplyLookupContext +{ + skipping_iterator_t &iter_backtrack; + skipping_iterator_t &iter_input; + skipping_iterator_t &iter_lookahead; +}; + template static inline bool chain_context_intersects (const hb_set_t *glyphs, unsigned int backtrackCount, @@ -2929,7 +2936,7 @@ static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c const HBUINT lookahead[] HB_UNUSED, unsigned int lookupCount HB_UNUSED, const LookupRecord lookupRecord[] HB_UNUSED, - const ChainContextApplyLookupContext &lookup_context) + const ChainContextWouldApplyLookupContext &lookup_context) { return (c->zero_context ? !backtrackCount && !lookaheadCount : true) && would_match_input (c, @@ -2954,11 +2961,11 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c, unsigned match_positions[HB_MAX_CONTEXT_LENGTH]; if (!(match_input (c, inputCount, input, - lookup_context.funcs.match[1], lookup_context.match_data[1], + lookup_context.iter_input, &match_end, match_positions) && (end_index = match_end) && match_lookahead (c, lookaheadCount, lookahead, - lookup_context.funcs.match[2], lookup_context.match_data[2], + lookup_context.iter_lookahead, match_end, &end_index))) { c->buffer->unsafe_to_concat (c->buffer->idx, end_index); @@ -2968,7 +2975,7 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c, unsigned start_index = c->buffer->out_len; if (!match_backtrack (c, backtrackCount, backtrack, - lookup_context.funcs.match[0], lookup_context.match_data[0], + lookup_context.iter_backtrack, &start_index)) { c->buffer->unsafe_to_concat_from_outbuffer (start_index, end_index); @@ -3041,7 +3048,7 @@ struct ChainRule } bool would_apply (hb_would_apply_context_t *c, - const ChainContextApplyLookupContext &lookup_context) const + const ChainContextWouldApplyLookupContext &lookup_context) const { const auto &input = StructAfter (backtrack); const auto &lookahead = StructAfter (input); @@ -3221,7 +3228,7 @@ struct ChainRuleSet } bool would_apply (hb_would_apply_context_t *c, - const ChainContextApplyLookupContext &lookup_context) const + const ChainContextWouldApplyLookupContext &lookup_context) const { return + hb_iter (rule) @@ -3380,7 +3387,7 @@ struct ChainContextFormat1_4 bool would_apply (hb_would_apply_context_t *c) const { const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])]; - struct ChainContextApplyLookupContext lookup_context = { + struct ChainContextWouldApplyLookupContext lookup_context = { {{match_glyph, match_glyph, match_glyph}}, {nullptr, nullptr, nullptr} }; @@ -3396,9 +3403,12 @@ struct ChainContextFormat1_4 if (likely (index == NOT_COVERED)) return_trace (false); const ChainRuleSet &rule_set = this+ruleSet[index]; + skipping_iterator_t iter_backtrack {c->iter_context}, iter_input {c->iter_input}, iter_lookahead {c->iter_context}; + iter_backtrack.set_match_func (match_glyph, nullptr); + iter_input.set_match_func (match_glyph, nullptr); + iter_lookahead.set_match_func (match_glyph, nullptr); struct ChainContextApplyLookupContext lookup_context = { - {{match_glyph, match_glyph, match_glyph}}, - {nullptr, nullptr, nullptr} + iter_backtrack, iter_input, iter_lookahead, }; return_trace (rule_set.apply (c, lookup_context)); } @@ -3591,7 +3601,7 @@ struct ChainContextFormat2_5 unsigned int index = input_class_def.get_class (c->glyphs[0]); const ChainRuleSet &rule_set = this+ruleSet[index]; - struct ChainContextApplyLookupContext lookup_context = { + struct ChainContextWouldApplyLookupContext lookup_context = { {{match_class, match_class, match_class}}, {&backtrack_class_def, &input_class_def, @@ -3642,13 +3652,15 @@ struct ChainContextFormat2_5 /* match_class_caches1 is slightly faster. Use it for lookahead, * which is typically longer. */ + skipping_iterator_t iter_backtrack {c->iter_context}, iter_input {c->iter_input}, iter_lookahead {c->iter_context}; + iter_backtrack.set_match_func (match_class, + &backtrack_class_def); + iter_input.set_match_func (cached ? match_class_cached2 : match_class, + &input_class_def); + iter_lookahead.set_match_func (cached ? match_class_cached1 : match_class, + &lookahead_class_def); struct ChainContextApplyLookupContext lookup_context = { - {{match_class, - cached ? match_class_cached2 : match_class, - cached ? match_class_cached1 : match_class}}, - {&backtrack_class_def, - &input_class_def, - &lookahead_class_def} + iter_backtrack, iter_input, iter_lookahead, }; index = input_class_def.get_class (c->buffer->cur().codepoint); @@ -3853,7 +3865,7 @@ struct ChainContextFormat3 const auto &input = StructAfter (backtrack); const auto &lookahead = StructAfter (input); const auto &lookup = StructAfter (lookahead); - struct ChainContextApplyLookupContext lookup_context = { + struct ChainContextWouldApplyLookupContext lookup_context = { {{match_coverage, match_coverage, match_coverage}}, {this, this, this} }; @@ -3880,9 +3892,12 @@ struct ChainContextFormat3 const auto &lookahead = StructAfter (input); const auto &lookup = StructAfter (lookahead); + skipping_iterator_t iter_backtrack {c->iter_context}, iter_input {c->iter_input}, iter_lookahead {c->iter_context}; + iter_backtrack.set_match_func (match_coverage, this); + iter_input.set_match_func (match_coverage, this); + iter_lookahead.set_match_func (match_coverage, this); struct ChainContextApplyLookupContext lookup_context = { - {{match_coverage, match_coverage, match_coverage}}, - {this, this, this} + iter_backtrack, iter_input, iter_lookahead, }; return_trace (chain_context_apply_lookup (c, backtrack.len, (const HBUINT16 *) backtrack.arrayZ, -- cgit v1.2.3 From 62e10c9fa0fce0b4798ccc13640f9fe85206f227 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 08:43:18 -0600 Subject: Revert "[gsubgpos] Allocate iterators further up" This reverts commit b9f364b8fcacf8ab32d0272190d8509f214e55f2. --- src/OT/Layout/GSUB/Ligature.hh | 5 +- .../Layout/GSUB/ReverseChainSingleSubstFormat1.hh | 8 +- src/hb-ot-layout-gsubgpos.hh | 117 +++++++++------------ 3 files changed, 55 insertions(+), 75 deletions(-) diff --git a/src/OT/Layout/GSUB/Ligature.hh b/src/OT/Layout/GSUB/Ligature.hh index 0ce2f69b4..db3fc55f7 100644 --- a/src/OT/Layout/GSUB/Ligature.hh +++ b/src/OT/Layout/GSUB/Ligature.hh @@ -94,11 +94,10 @@ struct Ligature unsigned int match_end = 0; unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; - c->iter_input.set_match_func (match_glyph, nullptr); - if (likely (!match_input (c, count, &component[1], - c->iter_input, + match_glyph, + nullptr, &match_end, match_positions, &total_component_count))) diff --git a/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh b/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh index d74d68bde..916fa281b 100644 --- a/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh +++ b/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh @@ -120,18 +120,14 @@ struct ReverseChainSingleSubstFormat1 if (unlikely (index >= substitute.len)) return_trace (false); - skipping_iterator_t iter_backtrack {c->iter_context}, iter_lookahead {c->iter_context}; - iter_backtrack.set_match_func (match_coverage, this); - iter_lookahead.set_match_func (match_coverage, this); - unsigned int start_index = 0, end_index = 0; if (match_backtrack (c, backtrack.len, (HBUINT16 *) backtrack.arrayZ, - iter_backtrack, + match_coverage, this, &start_index) && match_lookahead (c, lookahead.len, (HBUINT16 *) lookahead.arrayZ, - iter_lookahead, + match_coverage, this, c->buffer->idx + 1, &end_index)) { c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index); diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index cf173c3f2..9821f1fdc 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -922,7 +922,6 @@ struct hb_ot_apply_context_t : (void) buffer->output_glyph (glyph_index); } }; -using skipping_iterator_t = hb_ot_apply_context_t::skipping_iterator_t; struct hb_accelerate_subtables_context_t : @@ -1084,11 +1083,11 @@ struct ContextCollectGlyphsFuncs { collect_glyphs_func_t collect; }; -struct ContextWouldApplyFuncs +struct ContextApplyFuncs { match_func_t match; }; -struct ChainContextWouldApplyFuncs +struct ChainContextApplyFuncs { match_func_t match[3]; }; @@ -1277,7 +1276,8 @@ HB_ALWAYS_INLINE static bool match_input (hb_ot_apply_context_t *c, unsigned int count, /* Including the first glyph (not matched) */ const HBUINT input[], /* Array of input values--start with second glyph */ - skipping_iterator_t &skippy_iter, + match_func_t match_func, + const void *match_data, unsigned int *end_position, unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], unsigned int *p_total_component_count = nullptr) @@ -1288,7 +1288,9 @@ static bool match_input (hb_ot_apply_context_t *c, hb_buffer_t *buffer = c->buffer; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, count - 1); + skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (input); /* @@ -1520,12 +1522,15 @@ HB_ALWAYS_INLINE static bool match_backtrack (hb_ot_apply_context_t *c, unsigned int count, const HBUINT backtrack[], - skipping_iterator_t &skippy_iter, + match_func_t match_func, + const void *match_data, unsigned int *match_start) { TRACE_APPLY (nullptr); + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; skippy_iter.reset (c->buffer->backtrack_len (), count); + skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (backtrack); for (unsigned int i = 0; i < count; i++) @@ -1549,13 +1554,16 @@ HB_ALWAYS_INLINE static bool match_lookahead (hb_ot_apply_context_t *c, unsigned int count, const HBUINT lookahead[], - skipping_iterator_t &skippy_iter, + match_func_t match_func, + const void *match_data, unsigned int start_index, unsigned int *end_index) { TRACE_APPLY (nullptr); + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; skippy_iter.reset (start_index - 1, count); + skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (lookahead); for (unsigned int i = 0; i < count; i++) @@ -1859,15 +1867,10 @@ struct ContextCollectGlyphsLookupContext const void *collect_data; }; -struct ContextWouldApplyLookupContext -{ - ContextWouldApplyFuncs funcs; - const void *match_data; -}; - struct ContextApplyLookupContext { - skipping_iterator_t &iter; + ContextApplyFuncs funcs; + const void *match_data; }; template @@ -1926,7 +1929,7 @@ static inline bool context_would_apply_lookup (hb_would_apply_context_t *c, const HBUINT input[], /* Array of input values--start with second glyph */ unsigned int lookupCount HB_UNUSED, const LookupRecord lookupRecord[] HB_UNUSED, - const ContextWouldApplyLookupContext &lookup_context) + const ContextApplyLookupContext &lookup_context) { return would_match_input (c, inputCount, input, @@ -1945,7 +1948,7 @@ static inline bool context_apply_lookup (hb_ot_apply_context_t *c, unsigned match_positions[HB_MAX_CONTEXT_LENGTH]; if (match_input (c, inputCount, input, - lookup_context.iter, + lookup_context.funcs.match, lookup_context.match_data, &match_end, match_positions)) { c->buffer->unsafe_to_break (c->buffer->idx, match_end); @@ -2007,7 +2010,7 @@ struct Rule } bool would_apply (hb_would_apply_context_t *c, - const ContextWouldApplyLookupContext &lookup_context) const + const ContextApplyLookupContext &lookup_context) const { const auto &lookupRecord = StructAfter> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); @@ -2138,7 +2141,7 @@ struct RuleSet } bool would_apply (hb_would_apply_context_t *c, - const ContextWouldApplyLookupContext &lookup_context) const + const ContextApplyLookupContext &lookup_context) const { return + hb_iter (rule) @@ -2291,9 +2294,9 @@ struct ContextFormat1_4 bool would_apply (hb_would_apply_context_t *c) const { const RuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])]; - struct ContextWouldApplyLookupContext lookup_context = { + struct ContextApplyLookupContext lookup_context = { {match_glyph}, - nullptr, + nullptr }; return rule_set.would_apply (c, lookup_context); } @@ -2308,10 +2311,9 @@ struct ContextFormat1_4 return_trace (false); const RuleSet &rule_set = this+ruleSet[index]; - skipping_iterator_t iter {c->iter_input}; - iter.set_match_func (match_glyph, nullptr); struct ContextApplyLookupContext lookup_context = { - iter + {match_glyph}, + nullptr }; return_trace (rule_set.apply (c, lookup_context)); } @@ -2485,7 +2487,7 @@ struct ContextFormat2_5 const ClassDef &class_def = this+classDef; unsigned int index = class_def.get_class (c->glyphs[0]); const RuleSet &rule_set = this+ruleSet[index]; - struct ContextWouldApplyLookupContext lookup_context = { + struct ContextApplyLookupContext lookup_context = { {match_class}, &class_def }; @@ -2530,10 +2532,9 @@ struct ContextFormat2_5 const ClassDef &class_def = this+classDef; - skipping_iterator_t iter {c->iter_input}; - iter.set_match_func (cached ? match_class_cached : match_class, &class_def); struct ContextApplyLookupContext lookup_context = { - iter + {cached ? match_class_cached : match_class}, + &class_def }; if (cached && c->buffer->cur().syllable() < 255) @@ -2701,7 +2702,7 @@ struct ContextFormat3 bool would_apply (hb_would_apply_context_t *c) const { const LookupRecord *lookupRecord = &StructAfter (coverageZ.as_array (glyphCount)); - struct ContextWouldApplyLookupContext lookup_context = { + struct ContextApplyLookupContext lookup_context = { {match_coverage}, this }; @@ -2720,10 +2721,9 @@ struct ContextFormat3 if (likely (index == NOT_COVERED)) return_trace (false); const LookupRecord *lookupRecord = &StructAfter (coverageZ.as_array (glyphCount)); - skipping_iterator_t iter {c->iter_input}; - iter.set_match_func (match_coverage, this); struct ContextApplyLookupContext lookup_context = { - iter + {match_coverage}, + this }; return_trace (context_apply_lookup (c, glyphCount, (const HBUINT16 *) (coverageZ.arrayZ + 1), lookupCount, lookupRecord, lookup_context)); } @@ -2833,17 +2833,10 @@ struct ChainContextCollectGlyphsLookupContext const void *collect_data[3]; }; -struct ChainContextWouldApplyLookupContext -{ - ChainContextWouldApplyFuncs funcs; - const void *match_data[3]; -}; - struct ChainContextApplyLookupContext { - skipping_iterator_t &iter_backtrack; - skipping_iterator_t &iter_input; - skipping_iterator_t &iter_lookahead; + ChainContextApplyFuncs funcs; + const void *match_data[3]; }; template @@ -2936,7 +2929,7 @@ static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c const HBUINT lookahead[] HB_UNUSED, unsigned int lookupCount HB_UNUSED, const LookupRecord lookupRecord[] HB_UNUSED, - const ChainContextWouldApplyLookupContext &lookup_context) + const ChainContextApplyLookupContext &lookup_context) { return (c->zero_context ? !backtrackCount && !lookaheadCount : true) && would_match_input (c, @@ -2961,11 +2954,11 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c, unsigned match_positions[HB_MAX_CONTEXT_LENGTH]; if (!(match_input (c, inputCount, input, - lookup_context.iter_input, + lookup_context.funcs.match[1], lookup_context.match_data[1], &match_end, match_positions) && (end_index = match_end) && match_lookahead (c, lookaheadCount, lookahead, - lookup_context.iter_lookahead, + lookup_context.funcs.match[2], lookup_context.match_data[2], match_end, &end_index))) { c->buffer->unsafe_to_concat (c->buffer->idx, end_index); @@ -2975,7 +2968,7 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c, unsigned start_index = c->buffer->out_len; if (!match_backtrack (c, backtrackCount, backtrack, - lookup_context.iter_backtrack, + lookup_context.funcs.match[0], lookup_context.match_data[0], &start_index)) { c->buffer->unsafe_to_concat_from_outbuffer (start_index, end_index); @@ -3048,7 +3041,7 @@ struct ChainRule } bool would_apply (hb_would_apply_context_t *c, - const ChainContextWouldApplyLookupContext &lookup_context) const + const ChainContextApplyLookupContext &lookup_context) const { const auto &input = StructAfter (backtrack); const auto &lookahead = StructAfter (input); @@ -3228,7 +3221,7 @@ struct ChainRuleSet } bool would_apply (hb_would_apply_context_t *c, - const ChainContextWouldApplyLookupContext &lookup_context) const + const ChainContextApplyLookupContext &lookup_context) const { return + hb_iter (rule) @@ -3387,7 +3380,7 @@ struct ChainContextFormat1_4 bool would_apply (hb_would_apply_context_t *c) const { const ChainRuleSet &rule_set = this+ruleSet[(this+coverage).get_coverage (c->glyphs[0])]; - struct ChainContextWouldApplyLookupContext lookup_context = { + struct ChainContextApplyLookupContext lookup_context = { {{match_glyph, match_glyph, match_glyph}}, {nullptr, nullptr, nullptr} }; @@ -3403,12 +3396,9 @@ struct ChainContextFormat1_4 if (likely (index == NOT_COVERED)) return_trace (false); const ChainRuleSet &rule_set = this+ruleSet[index]; - skipping_iterator_t iter_backtrack {c->iter_context}, iter_input {c->iter_input}, iter_lookahead {c->iter_context}; - iter_backtrack.set_match_func (match_glyph, nullptr); - iter_input.set_match_func (match_glyph, nullptr); - iter_lookahead.set_match_func (match_glyph, nullptr); struct ChainContextApplyLookupContext lookup_context = { - iter_backtrack, iter_input, iter_lookahead, + {{match_glyph, match_glyph, match_glyph}}, + {nullptr, nullptr, nullptr} }; return_trace (rule_set.apply (c, lookup_context)); } @@ -3601,7 +3591,7 @@ struct ChainContextFormat2_5 unsigned int index = input_class_def.get_class (c->glyphs[0]); const ChainRuleSet &rule_set = this+ruleSet[index]; - struct ChainContextWouldApplyLookupContext lookup_context = { + struct ChainContextApplyLookupContext lookup_context = { {{match_class, match_class, match_class}}, {&backtrack_class_def, &input_class_def, @@ -3652,15 +3642,13 @@ struct ChainContextFormat2_5 /* match_class_caches1 is slightly faster. Use it for lookahead, * which is typically longer. */ - skipping_iterator_t iter_backtrack {c->iter_context}, iter_input {c->iter_input}, iter_lookahead {c->iter_context}; - iter_backtrack.set_match_func (match_class, - &backtrack_class_def); - iter_input.set_match_func (cached ? match_class_cached2 : match_class, - &input_class_def); - iter_lookahead.set_match_func (cached ? match_class_cached1 : match_class, - &lookahead_class_def); struct ChainContextApplyLookupContext lookup_context = { - iter_backtrack, iter_input, iter_lookahead, + {{match_class, + cached ? match_class_cached2 : match_class, + cached ? match_class_cached1 : match_class}}, + {&backtrack_class_def, + &input_class_def, + &lookahead_class_def} }; index = input_class_def.get_class (c->buffer->cur().codepoint); @@ -3865,7 +3853,7 @@ struct ChainContextFormat3 const auto &input = StructAfter (backtrack); const auto &lookahead = StructAfter (input); const auto &lookup = StructAfter (lookahead); - struct ChainContextWouldApplyLookupContext lookup_context = { + struct ChainContextApplyLookupContext lookup_context = { {{match_coverage, match_coverage, match_coverage}}, {this, this, this} }; @@ -3892,12 +3880,9 @@ struct ChainContextFormat3 const auto &lookahead = StructAfter (input); const auto &lookup = StructAfter (lookahead); - skipping_iterator_t iter_backtrack {c->iter_context}, iter_input {c->iter_input}, iter_lookahead {c->iter_context}; - iter_backtrack.set_match_func (match_coverage, this); - iter_input.set_match_func (match_coverage, this); - iter_lookahead.set_match_func (match_coverage, this); struct ChainContextApplyLookupContext lookup_context = { - iter_backtrack, iter_input, iter_lookahead, + {{match_coverage, match_coverage, match_coverage}}, + {this, this, this} }; return_trace (chain_context_apply_lookup (c, backtrack.len, (const HBUINT16 *) backtrack.arrayZ, -- cgit v1.2.3 From 52237eb1fe6a53de649917ec64382adac89f8e54 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 09:07:25 -0600 Subject: [ChainContext] More caching --- src/hb-ot-layout-gsubgpos.hh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 9821f1fdc..f3b83c6a9 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2540,11 +2540,7 @@ struct ContextFormat2_5 if (cached && c->buffer->cur().syllable() < 255) index = c->buffer->cur().syllable (); else - { index = class_def.get_class (c->buffer->cur().codepoint); - if (cached && index < 255) - c->buffer->cur().syllable() = index; - } const RuleSet &rule_set = this+ruleSet[index]; return_trace (rule_set.apply (c, lookup_context)); } @@ -3651,7 +3647,11 @@ struct ChainContextFormat2_5 &lookahead_class_def} }; - index = input_class_def.get_class (c->buffer->cur().codepoint); + // Note: Corresponds to match_class_cached2 + if (cached && ((c->buffer->cur().syllable() & 0xF0) >> 4) < 15) + index = (c->buffer->cur().syllable () & 0xF0) >> 4; + else + index = input_class_def.get_class (c->buffer->cur().codepoint); const ChainRuleSet &rule_set = this+ruleSet[index]; return_trace (rule_set.apply (c, lookup_context)); } -- cgit v1.2.3 From 5c8f3b7fec330897d66bf72559aa2ac26862ae99 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 09:39:18 -0600 Subject: [gsubgpos] Conditionally cache backtrack again --- src/hb-ot-layout-gsubgpos.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index f3b83c6a9..8e3571b12 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -3639,7 +3639,7 @@ struct ChainContextFormat2_5 /* match_class_caches1 is slightly faster. Use it for lookahead, * which is typically longer. */ struct ChainContextApplyLookupContext lookup_context = { - {{match_class, + {{cached && &backtrack_class_def == &lookahead_class_def ? match_class_cached1 : match_class, cached ? match_class_cached2 : match_class, cached ? match_class_cached1 : match_class}}, {&backtrack_class_def, -- cgit v1.2.3 From 77080f86f85744600a052e4f10bea50f331c44b0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 11:26:32 -0600 Subject: . --- src/OT/Layout/GSUB/LigatureSet.hh | 7 +--- src/hb-ot-layout-gsubgpos.hh | 84 +++++++++++++++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/src/OT/Layout/GSUB/LigatureSet.hh b/src/OT/Layout/GSUB/LigatureSet.hh index cdd9822eb..25fc02453 100644 --- a/src/OT/Layout/GSUB/LigatureSet.hh +++ b/src/OT/Layout/GSUB/LigatureSet.hh @@ -72,11 +72,6 @@ struct LigatureSet ; } - static bool match_always (hb_glyph_info_t &info HB_UNUSED, unsigned value HB_UNUSED, const void *data HB_UNUSED) - { - return true; - } - bool apply (hb_ot_apply_context_t *c) const { TRACE_APPLY (this); @@ -118,6 +113,8 @@ struct LigatureSet goto slow; } } + else + goto slow; bool unsafe_to_concat = false; diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 8e3571b12..f814c7e2e 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1200,6 +1200,10 @@ static inline void collect_array (hb_collect_glyphs_context_t *c HB_UNUSED, } +static inline bool match_always (hb_glyph_info_t &info HB_UNUSED, unsigned value HB_UNUSED, const void *data HB_UNUSED) +{ + return true; +} static inline bool match_glyph (hb_glyph_info_t &info, unsigned value, const void *data HB_UNUSED) { return info.codepoint == value; @@ -2982,6 +2986,9 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c, template struct ChainRule { + template + friend struct ChainRuleSet; + bool intersects (const hb_set_t *glyphs, ChainContextClosureLookupContext &lookup_context) const { const auto &input = StructAfter (backtrack); @@ -3231,13 +3238,76 @@ struct ChainRuleSet const ChainContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - return_trace ( - + hb_iter (rule) - | hb_map (hb_add (this)) - | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); }) - | hb_any - ) - ; + + unsigned num_rules = rule.len; + + if (HB_OPTIMIZE_SIZE_VAL || num_rules <= 2) + { + slow: + return_trace ( + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); }) + | hb_any + ) + ; + } + + /* This version is optimized for speed by matching the first component + * of the rule here, instead of calling into the matching code. */ + + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + skippy_iter.reset (c->buffer->idx, 1); + skippy_iter.set_match_func (match_always, nullptr); + skippy_iter.set_glyph_data ((HBUINT16 *) nullptr); + unsigned unsafe_to; + hb_glyph_info_t *first = nullptr; + bool matched = skippy_iter.next (&unsafe_to); + if (likely (matched)) + { + first = &c->buffer->info[skippy_iter.idx]; + unsafe_to = skippy_iter.idx + 1; + + if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx])) + { + /* Can't use the fast path if eg. the next char is a default-ignorable + * or other skippable. */ + goto slow; + } + } + else + goto slow; + + bool unsafe_to_concat = false; + + for (unsigned int i = 0; i < num_rules; i++) + { + const auto &r = this+rule.arrayZ[i]; + + const auto &input = StructAfter (r.backtrack); + const auto &lookahead = StructAfter (input); + + if (input.lenP1 > 1 ? + (!lookup_context.funcs.match[1] || + lookup_context.funcs.match[1] (*first, input.arrayZ[0], lookup_context.match_data[1])) + : + (!lookahead.len || !lookup_context.funcs.match[2] || + lookup_context.funcs.match[2] (*first, lookahead.arrayZ[0], lookup_context.match_data[2]))) + { + if (r.apply (c, lookup_context)) + { + if (unsafe_to_concat) + c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); + return_trace (true); + } + } + else + unsafe_to_concat = true; + } + if (likely (unsafe_to_concat)) + c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); + + return_trace (false); } bool subset (hb_subset_context_t *c, -- cgit v1.2.3 From 645fabd1013e94693f6da2d4263b0edd3b0b014d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 11:36:59 -0600 Subject: [gsubgpos] Vastly speed up ChainRuleSet / RuleSet matching Match the first component in a fast loop. Idea replicated from LigatureSet. Speeds up Gulzar shaping by 22%! 37% in NotoNastaliqUrdu! --- src/OT/Layout/GSUB/LigatureSet.hh | 4 +- src/hb-ot-layout-gsubgpos.hh | 82 +++++++++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/src/OT/Layout/GSUB/LigatureSet.hh b/src/OT/Layout/GSUB/LigatureSet.hh index 25fc02453..67a4e0219 100644 --- a/src/OT/Layout/GSUB/LigatureSet.hh +++ b/src/OT/Layout/GSUB/LigatureSet.hh @@ -92,7 +92,9 @@ struct LigatureSet } /* This version is optimized for speed by matching the first component - * of the ligature here, instead of calling into the ligation code. */ + * of the ligature here, instead of calling into the ligation code. + * + * This is replicated in ChainRuleSet and RuleSet. */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (c->buffer->idx, 1); diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index f814c7e2e..703509277 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1972,6 +1972,9 @@ static inline bool context_apply_lookup (hb_ot_apply_context_t *c, template struct Rule { + template + friend struct RuleSet; + bool intersects (const hb_set_t *glyphs, ContextClosureLookupContext &lookup_context) const { return context_intersects (glyphs, @@ -2159,13 +2162,74 @@ struct RuleSet const ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); - return_trace ( - + hb_iter (rule) - | hb_map (hb_add (this)) - | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); }) - | hb_any - ) - ; + + unsigned num_rules = rule.len; + + if (HB_OPTIMIZE_SIZE_VAL || num_rules <= 2) + { + slow: + return_trace ( + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); }) + | hb_any + ) + ; + } + + /* This version is optimized for speed by matching the first component + * of the rule here, instead of calling into the matching code. + * + * Replicated from LigatureSet::apply(). */ + + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; + skippy_iter.reset (c->buffer->idx, 1); + skippy_iter.set_match_func (match_always, nullptr); + skippy_iter.set_glyph_data ((HBUINT16 *) nullptr); + unsigned unsafe_to; + hb_glyph_info_t *first = nullptr; + bool matched = skippy_iter.next (&unsafe_to); + if (likely (matched)) + { + first = &c->buffer->info[skippy_iter.idx]; + unsafe_to = skippy_iter.idx + 1; + + if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx])) + { + /* Can't use the fast path if eg. the next char is a default-ignorable + * or other skippable. */ + goto slow; + } + } + else + goto slow; + + bool unsafe_to_concat = false; + + for (unsigned int i = 0; i < num_rules; i++) + { + const auto &r = this+rule.arrayZ[i]; + + const auto &input = r.inputZ; + + if (r.inputCount <= 1 || + (!lookup_context.funcs.match || + lookup_context.funcs.match (*first, input.arrayZ[0], lookup_context.match_data))) + { + if (r.apply (c, lookup_context)) + { + if (unsafe_to_concat) + c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); + return_trace (true); + } + } + else + unsafe_to_concat = true; + } + if (likely (unsafe_to_concat)) + c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); + + return_trace (false); } bool subset (hb_subset_context_t *c, @@ -3254,7 +3318,9 @@ struct ChainRuleSet } /* This version is optimized for speed by matching the first component - * of the rule here, instead of calling into the matching code. */ + * of the rule here, instead of calling into the matching code. + * + * Replicated from LigatureSet::apply(). */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (c->buffer->idx, 1); -- cgit v1.2.3 From 49730531097cb0b29b6435fa62d10e5060852388 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 16 Jul 2023 13:09:49 -0600 Subject: Config --- src/OT/Layout/GSUB/LigatureSet.hh | 4 ++-- src/hb-config.hh | 2 +- src/hb-ot-layout-gsubgpos.hh | 8 ++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/OT/Layout/GSUB/LigatureSet.hh b/src/OT/Layout/GSUB/LigatureSet.hh index 67a4e0219..cacb2b362 100644 --- a/src/OT/Layout/GSUB/LigatureSet.hh +++ b/src/OT/Layout/GSUB/LigatureSet.hh @@ -78,8 +78,8 @@ struct LigatureSet unsigned int num_ligs = ligature.len; -#ifndef HB_NO_OT_LIGATURES_FAST_PATH - if (HB_OPTIMIZE_SIZE_VAL || num_ligs <= 2) +#ifndef HB_NO_OT_RULESETS_FAST_PATH + if (HB_OPTIMIZE_SIZE_VAL || num_ligs <= 4) #endif { slow: diff --git a/src/hb-config.hh b/src/hb-config.hh index 335c6976f..816c55c7d 100644 --- a/src/hb-config.hh +++ b/src/hb-config.hh @@ -183,7 +183,7 @@ #endif #ifdef HB_OPTIMIZE_SIZE_MORE -#define HB_NO_OT_LIGATURES_FAST_PATH +#define HB_NO_OT_RULESETS_FAST_PATH #endif #ifdef HB_MINIMIZE_MEMORY_USAGE diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 703509277..f9e7e3d74 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2165,7 +2165,9 @@ struct RuleSet unsigned num_rules = rule.len; - if (HB_OPTIMIZE_SIZE_VAL || num_rules <= 2) +#ifndef HB_NO_OT_RULESETS_FAST_PATH + if (HB_OPTIMIZE_SIZE_VAL || num_rules <= 4) +#endif { slow: return_trace ( @@ -3305,7 +3307,9 @@ struct ChainRuleSet unsigned num_rules = rule.len; - if (HB_OPTIMIZE_SIZE_VAL || num_rules <= 2) +#ifndef HB_NO_OT_RULESETS_FAST_PATH + if (HB_OPTIMIZE_SIZE_VAL || num_rules <= 4) +#endif { slow: return_trace ( -- cgit v1.2.3 From da84a078ee89d3d9cbd2a030722d01ee85f1bcde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:28:55 +0000 Subject: Bump meson from 1.1.1 to 1.2.0 in /.ci Bumps [meson](https://github.com/mesonbuild/meson) from 1.1.1 to 1.2.0. - [Release notes](https://github.com/mesonbuild/meson/releases) - [Commits](https://github.com/mesonbuild/meson/compare/1.1.1...1.2.0) --- updated-dependencies: - dependency-name: meson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .ci/requirements.in | 2 +- .ci/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.ci/requirements.in b/.ci/requirements.in index 7984b5e65..6288c6b28 100644 --- a/.ci/requirements.in +++ b/.ci/requirements.in @@ -1,4 +1,4 @@ -r requirements-fonttools.in -meson==1.1.1 +meson==1.2.0 gcovr==5.0 ninja diff --git a/.ci/requirements.txt b/.ci/requirements.txt index c4c0f59d3..a41cface8 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -179,9 +179,9 @@ markupsafe==2.1.3 \ --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 # via jinja2 -meson==1.1.1 \ - --hash=sha256:1c5a46660dfbe5f45ef7588d78429d04ebdb6f84b96b4b015033572d2facbbe5 \ - --hash=sha256:d04b541f97ca439fb82fab7d0d480988be4bd4e62563a5ca35fadb5400727b1c +meson==1.2.0 \ + --hash=sha256:10c0364edc67a1b3146f405800b300f0535f42b8736e79c744a8029a855b7c6b \ + --hash=sha256:1c0b634fe6b6a7072e398647f1bf392048577068a5c92ae44d04085dab0ded6f # via -r requirements.in ninja==1.11.1 \ --hash=sha256:1c474326e11fba3f8c2582715d79216292e327d3335367c0e87e9647a002cc4a \ -- cgit v1.2.3 From ae8fea081a09d478986427d4861c74eb0b9582d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:28:35 +0000 Subject: Bump fonttools from 4.40.0 to 4.41.0 in /.ci Bumps [fonttools](https://github.com/fonttools/fonttools) from 4.40.0 to 4.41.0. - [Release notes](https://github.com/fonttools/fonttools/releases) - [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst) - [Commits](https://github.com/fonttools/fonttools/compare/4.40.0...4.41.0) --- updated-dependencies: - dependency-name: fonttools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .ci/requirements-fonttools.txt | 72 +++++++++++++++++++++--------------------- .ci/requirements.txt | 70 ++++++++++++++++++++-------------------- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/.ci/requirements-fonttools.txt b/.ci/requirements-fonttools.txt index 9d28068b9..96e56a01c 100644 --- a/.ci/requirements-fonttools.txt +++ b/.ci/requirements-fonttools.txt @@ -4,39 +4,39 @@ # # pip-compile --generate-hashes .ci/requirements-fonttools.in # -fonttools==4.40.0 \ - --hash=sha256:00ab569b2a3e591e00425023ade87e8fef90380c1dde61be7691cb524ca5f743 \ - --hash=sha256:022c4a16b412293e7f1ce21b8bab7a6f9d12c4ffdf171fdc67122baddb973069 \ - --hash=sha256:05171f3c546f64d78569f10adc0de72561882352cac39ec7439af12304d8d8c0 \ - --hash=sha256:14037c31138fbd21847ad5e5441dfdde003e0a8f3feb5812a1a21fd1c255ffbd \ - --hash=sha256:15abb3d055c1b2dff9ce376b6c3db10777cb74b37b52b78f61657634fd348a0d \ - --hash=sha256:18ea64ac43e94c9e0c23d7a9475f1026be0e25b10dda8f236fc956188761df97 \ - --hash=sha256:1a003608400dd1cca3e089e8c94973c6b51a4fb1ef00ff6d7641617b9242e637 \ - --hash=sha256:1bc4c5b147be8dbc5df9cc8ac5e93ee914ad030fe2a201cc8f02f499db71011d \ - --hash=sha256:200729d12461e2038700d31f0d49ad5a7b55855dec7525074979a06b46f88505 \ - --hash=sha256:337b6e83d7ee73c40ea62407f2ce03b07c3459e213b6f332b94a69923b9e1cb9 \ - --hash=sha256:37467cee0f32cada2ec08bc16c9c31f9b53ea54b2f5604bf25a1246b5f50593a \ - --hash=sha256:425b74a608427499b0e45e433c34ddc350820b6f25b7c8761963a08145157a66 \ - --hash=sha256:530c5d35109f3e0cea2535742d6a3bc99c0786cf0cbd7bb2dc9212387f0d908c \ - --hash=sha256:56d4d85f5374b45b08d2f928517d1e313ea71b4847240398decd0ab3ebbca885 \ - --hash=sha256:5e00334c66f4e83535384cb5339526d01d02d77f142c23b2f97bd6a4f585497a \ - --hash=sha256:5fdf60f8a5c6bcce7d024a33f7e4bc7921f5b74e8ea13bccd204f2c8b86f3470 \ - --hash=sha256:6a8d71b9a5c884c72741868e845c0e563c5d83dcaf10bb0ceeec3b4b2eb14c67 \ - --hash=sha256:6d5adf4ba114f028fc3f5317a221fd8b0f4ef7a2e5524a2b1e0fd891b093791a \ - --hash=sha256:7449e5e306f3a930a8944c85d0cbc8429cba13503372a1a40f23124d6fb09b58 \ - --hash=sha256:7961575221e3da0841c75da53833272c520000d76f7f71274dbf43370f8a1065 \ - --hash=sha256:7f6e3fa3da923063c286320e728ba2270e49c73386e3a711aa680f4b0747d692 \ - --hash=sha256:882983279bf39afe4e945109772c2ffad2be2c90983d6559af8b75c19845a80a \ - --hash=sha256:8a917828dbfdb1cbe50cf40eeae6fbf9c41aef9e535649ed8f4982b2ef65c091 \ - --hash=sha256:8c4305b171b61040b1ee75d18f9baafe58bd3b798d1670078efe2c92436bfb63 \ - --hash=sha256:91784e21a1a085fac07c6a407564f4a77feb471b5954c9ee55a4f9165151f6c1 \ - --hash=sha256:94c915f6716589f78bc00fbc14c5b8de65cfd11ee335d32504f1ef234524cb24 \ - --hash=sha256:97d95b8301b62bdece1af943b88bcb3680fd385f88346a4a899ee145913b414a \ - --hash=sha256:a954b90d1473c85a22ecf305761d9fd89da93bbd31dae86e7dea436ad2cb5dc9 \ - --hash=sha256:aa83b3f151bc63970f39b2b42a06097c5a22fd7ed9f7ba008e618de4503d3895 \ - --hash=sha256:b802dcbf9bcff74672f292b2466f6589ab8736ce4dcf36f48eb994c2847c4b30 \ - --hash=sha256:bae8c13abbc2511e9a855d2142c0ab01178dd66b1a665798f357da0d06253e0d \ - --hash=sha256:c55f1b4109dbc3aeb496677b3e636d55ef46dc078c2a5e3f3db4e90f1c6d2907 \ - --hash=sha256:eb52c10fda31159c22c7ed85074e05f8b97da8773ea461706c273e31bcbea836 \ - --hash=sha256:ec468c022d09f1817c691cf884feb1030ef6f1e93e3ea6831b0d8144c06480d1 - # via -r .ci/requirements-fonttools.in +fonttools==4.41.0 \ + --hash=sha256:0614b6348866092d00df3dfb37e037fc06412ca67087de361a2777ea5ed62c16 \ + --hash=sha256:06eac087ea55b3ebb2207d93b5ac56c847163899f05f5a77e1910f688fe10030 \ + --hash=sha256:19d461c801b8904d201c6c38a99bfcfef673bfdfe0c7f026f582ef78896434e0 \ + --hash=sha256:381558eafffc1432d08ca58063e71c7376ecaae48e9318354a90a1049a644845 \ + --hash=sha256:3ee75b8ca48f6c48af25e967dce995ef94e46872b35c7d454b983c62c9c7006d \ + --hash=sha256:415cf7c806a3f56fb280dadcf3c92c85c0415e75665ca957b4a2a2e39c17a5c9 \ + --hash=sha256:465d0f24bf4f75160f441793b55076b7a080a57d3a1f738390af2c20bee24fbb \ + --hash=sha256:4c654b1facf1f3b742e4d9b2dcdf0fa867b1f007b1b4981cc58a75ef5dca2a3c \ + --hash=sha256:50f8bdb421270f71b54695c62785e300fab4bb6127be40bf9f3084962a0c3adb \ + --hash=sha256:5448a87f6ed57ed844b64a05d3792827af584a8584613f6289867f4e77eb603b \ + --hash=sha256:560ea1a604c927399f36742abf342a4c5f3fee8e8e8a484b774dfe9630bd9a91 \ + --hash=sha256:5b1c2b21b40229166a864f2b0aec06d37f0a204066deb1734c93370e0c76339d \ + --hash=sha256:69178674505ec81adf4af2a3bbacd0cb9a37ba7831bc3fca307f80e48ab2767b \ + --hash=sha256:69dbe0154e15b68dd671441ea8f23dad87488b24a6e650d45958f4722819a443 \ + --hash=sha256:6faff25991dec48f8cac882055a09ae1a29fd15bc160bc3d663e789e994664c2 \ + --hash=sha256:72d40a32d6443871ea0d147813caad58394b48729dfa4fbc45dcaac54f9506f2 \ + --hash=sha256:7e22d0144d735f6c7df770509b8c0c33414bf460df0d5dddc98a159e5dbb10eb \ + --hash=sha256:841c491fa3e9c54e8f9cd5dae059e88f45e086aea090c28be9d42f59c8b99e01 \ + --hash=sha256:86edb95c4d1fe4fae2111d7e0c10c6e42b7790b377bcf1952303469eee5b52bb \ + --hash=sha256:8f602dd5bcde7e4241419924f23c6f0d66723dd5408a58c3a2f781745c693f45 \ + --hash=sha256:9387b09694fbf8ac7dcf887069068f81fb4124d05e09557ac7daabfbec1744bd \ + --hash=sha256:b329ae7ce971b5c4148d6cdb8119c0ce4587265b2330d4f2f3776ef851bee020 \ + --hash=sha256:ba2a367ff478cd108d5319c0dc4fd4eb4ea3476dbfc45b00c45718e889cd9463 \ + --hash=sha256:bc9e7b1e268be7a23fc66471b615c324e99c5db39ce8c49dd6dd8e962c7bc1b8 \ + --hash=sha256:c890061915e95b619c1d3cc3c107c6fb021406b701c0c24b03e74830d522f210 \ + --hash=sha256:cc3324e4159e6d1f55c3615b4c1c211f87cc96cc0cc7c946c8447dc1319f2e9d \ + --hash=sha256:d2dae84a3d0f76884a6102c62f2795b2d6602c2c95cfcce74c8a590b6200e533 \ + --hash=sha256:d45f28c20bb67dee0f4a4caae709f40b0693d764b7b2bf2d58890f36b1bfcef0 \ + --hash=sha256:e38bd91eae257f36c2b7245c0278e9cd9d754f3a66b8d2b548c623ba66e387b6 \ + --hash=sha256:e43f6c7f9ba4f9d29edee530e45f9aa162872ec9549398b85971477a99f2a806 \ + --hash=sha256:ea879afd1d6189fca02a85a7868560c9bb8415dccff6b7ae6d81e4f06b3ab30d \ + --hash=sha256:eb9dfa87152bd97019adc387b2f29ef6af601de4386f36570ca537ace96d96ed \ + --hash=sha256:efd59e83223cb77952997fb850c7a7c2a958c9af0642060f536722c2a9e9d53b \ + --hash=sha256:f3fe90dfb297bd8265238c06787911cd81c2cb89ac5b13e1c911928bdabfce0f + # via -r requirements-fonttools.in diff --git a/.ci/requirements.txt b/.ci/requirements.txt index a41cface8..e585a585e 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -4,41 +4,41 @@ # # pip-compile --generate-hashes .ci/requirements.in # -fonttools==4.40.0 \ - --hash=sha256:00ab569b2a3e591e00425023ade87e8fef90380c1dde61be7691cb524ca5f743 \ - --hash=sha256:022c4a16b412293e7f1ce21b8bab7a6f9d12c4ffdf171fdc67122baddb973069 \ - --hash=sha256:05171f3c546f64d78569f10adc0de72561882352cac39ec7439af12304d8d8c0 \ - --hash=sha256:14037c31138fbd21847ad5e5441dfdde003e0a8f3feb5812a1a21fd1c255ffbd \ - --hash=sha256:15abb3d055c1b2dff9ce376b6c3db10777cb74b37b52b78f61657634fd348a0d \ - --hash=sha256:18ea64ac43e94c9e0c23d7a9475f1026be0e25b10dda8f236fc956188761df97 \ - --hash=sha256:1a003608400dd1cca3e089e8c94973c6b51a4fb1ef00ff6d7641617b9242e637 \ - --hash=sha256:1bc4c5b147be8dbc5df9cc8ac5e93ee914ad030fe2a201cc8f02f499db71011d \ - --hash=sha256:200729d12461e2038700d31f0d49ad5a7b55855dec7525074979a06b46f88505 \ - --hash=sha256:337b6e83d7ee73c40ea62407f2ce03b07c3459e213b6f332b94a69923b9e1cb9 \ - --hash=sha256:37467cee0f32cada2ec08bc16c9c31f9b53ea54b2f5604bf25a1246b5f50593a \ - --hash=sha256:425b74a608427499b0e45e433c34ddc350820b6f25b7c8761963a08145157a66 \ - --hash=sha256:530c5d35109f3e0cea2535742d6a3bc99c0786cf0cbd7bb2dc9212387f0d908c \ - --hash=sha256:56d4d85f5374b45b08d2f928517d1e313ea71b4847240398decd0ab3ebbca885 \ - --hash=sha256:5e00334c66f4e83535384cb5339526d01d02d77f142c23b2f97bd6a4f585497a \ - --hash=sha256:5fdf60f8a5c6bcce7d024a33f7e4bc7921f5b74e8ea13bccd204f2c8b86f3470 \ - --hash=sha256:6a8d71b9a5c884c72741868e845c0e563c5d83dcaf10bb0ceeec3b4b2eb14c67 \ - --hash=sha256:6d5adf4ba114f028fc3f5317a221fd8b0f4ef7a2e5524a2b1e0fd891b093791a \ - --hash=sha256:7449e5e306f3a930a8944c85d0cbc8429cba13503372a1a40f23124d6fb09b58 \ - --hash=sha256:7961575221e3da0841c75da53833272c520000d76f7f71274dbf43370f8a1065 \ - --hash=sha256:7f6e3fa3da923063c286320e728ba2270e49c73386e3a711aa680f4b0747d692 \ - --hash=sha256:882983279bf39afe4e945109772c2ffad2be2c90983d6559af8b75c19845a80a \ - --hash=sha256:8a917828dbfdb1cbe50cf40eeae6fbf9c41aef9e535649ed8f4982b2ef65c091 \ - --hash=sha256:8c4305b171b61040b1ee75d18f9baafe58bd3b798d1670078efe2c92436bfb63 \ - --hash=sha256:91784e21a1a085fac07c6a407564f4a77feb471b5954c9ee55a4f9165151f6c1 \ - --hash=sha256:94c915f6716589f78bc00fbc14c5b8de65cfd11ee335d32504f1ef234524cb24 \ - --hash=sha256:97d95b8301b62bdece1af943b88bcb3680fd385f88346a4a899ee145913b414a \ - --hash=sha256:a954b90d1473c85a22ecf305761d9fd89da93bbd31dae86e7dea436ad2cb5dc9 \ - --hash=sha256:aa83b3f151bc63970f39b2b42a06097c5a22fd7ed9f7ba008e618de4503d3895 \ - --hash=sha256:b802dcbf9bcff74672f292b2466f6589ab8736ce4dcf36f48eb994c2847c4b30 \ - --hash=sha256:bae8c13abbc2511e9a855d2142c0ab01178dd66b1a665798f357da0d06253e0d \ - --hash=sha256:c55f1b4109dbc3aeb496677b3e636d55ef46dc078c2a5e3f3db4e90f1c6d2907 \ - --hash=sha256:eb52c10fda31159c22c7ed85074e05f8b97da8773ea461706c273e31bcbea836 \ - --hash=sha256:ec468c022d09f1817c691cf884feb1030ef6f1e93e3ea6831b0d8144c06480d1 +fonttools==4.41.0 \ + --hash=sha256:0614b6348866092d00df3dfb37e037fc06412ca67087de361a2777ea5ed62c16 \ + --hash=sha256:06eac087ea55b3ebb2207d93b5ac56c847163899f05f5a77e1910f688fe10030 \ + --hash=sha256:19d461c801b8904d201c6c38a99bfcfef673bfdfe0c7f026f582ef78896434e0 \ + --hash=sha256:381558eafffc1432d08ca58063e71c7376ecaae48e9318354a90a1049a644845 \ + --hash=sha256:3ee75b8ca48f6c48af25e967dce995ef94e46872b35c7d454b983c62c9c7006d \ + --hash=sha256:415cf7c806a3f56fb280dadcf3c92c85c0415e75665ca957b4a2a2e39c17a5c9 \ + --hash=sha256:465d0f24bf4f75160f441793b55076b7a080a57d3a1f738390af2c20bee24fbb \ + --hash=sha256:4c654b1facf1f3b742e4d9b2dcdf0fa867b1f007b1b4981cc58a75ef5dca2a3c \ + --hash=sha256:50f8bdb421270f71b54695c62785e300fab4bb6127be40bf9f3084962a0c3adb \ + --hash=sha256:5448a87f6ed57ed844b64a05d3792827af584a8584613f6289867f4e77eb603b \ + --hash=sha256:560ea1a604c927399f36742abf342a4c5f3fee8e8e8a484b774dfe9630bd9a91 \ + --hash=sha256:5b1c2b21b40229166a864f2b0aec06d37f0a204066deb1734c93370e0c76339d \ + --hash=sha256:69178674505ec81adf4af2a3bbacd0cb9a37ba7831bc3fca307f80e48ab2767b \ + --hash=sha256:69dbe0154e15b68dd671441ea8f23dad87488b24a6e650d45958f4722819a443 \ + --hash=sha256:6faff25991dec48f8cac882055a09ae1a29fd15bc160bc3d663e789e994664c2 \ + --hash=sha256:72d40a32d6443871ea0d147813caad58394b48729dfa4fbc45dcaac54f9506f2 \ + --hash=sha256:7e22d0144d735f6c7df770509b8c0c33414bf460df0d5dddc98a159e5dbb10eb \ + --hash=sha256:841c491fa3e9c54e8f9cd5dae059e88f45e086aea090c28be9d42f59c8b99e01 \ + --hash=sha256:86edb95c4d1fe4fae2111d7e0c10c6e42b7790b377bcf1952303469eee5b52bb \ + --hash=sha256:8f602dd5bcde7e4241419924f23c6f0d66723dd5408a58c3a2f781745c693f45 \ + --hash=sha256:9387b09694fbf8ac7dcf887069068f81fb4124d05e09557ac7daabfbec1744bd \ + --hash=sha256:b329ae7ce971b5c4148d6cdb8119c0ce4587265b2330d4f2f3776ef851bee020 \ + --hash=sha256:ba2a367ff478cd108d5319c0dc4fd4eb4ea3476dbfc45b00c45718e889cd9463 \ + --hash=sha256:bc9e7b1e268be7a23fc66471b615c324e99c5db39ce8c49dd6dd8e962c7bc1b8 \ + --hash=sha256:c890061915e95b619c1d3cc3c107c6fb021406b701c0c24b03e74830d522f210 \ + --hash=sha256:cc3324e4159e6d1f55c3615b4c1c211f87cc96cc0cc7c946c8447dc1319f2e9d \ + --hash=sha256:d2dae84a3d0f76884a6102c62f2795b2d6602c2c95cfcce74c8a590b6200e533 \ + --hash=sha256:d45f28c20bb67dee0f4a4caae709f40b0693d764b7b2bf2d58890f36b1bfcef0 \ + --hash=sha256:e38bd91eae257f36c2b7245c0278e9cd9d754f3a66b8d2b548c623ba66e387b6 \ + --hash=sha256:e43f6c7f9ba4f9d29edee530e45f9aa162872ec9549398b85971477a99f2a806 \ + --hash=sha256:ea879afd1d6189fca02a85a7868560c9bb8415dccff6b7ae6d81e4f06b3ab30d \ + --hash=sha256:eb9dfa87152bd97019adc387b2f29ef6af601de4386f36570ca537ace96d96ed \ + --hash=sha256:efd59e83223cb77952997fb850c7a7c2a958c9af0642060f536722c2a9e9d53b \ + --hash=sha256:f3fe90dfb297bd8265238c06787911cd81c2cb89ac5b13e1c911928bdabfce0f # via -r requirements-fonttools.in gcovr==5.0 \ --hash=sha256:1d80264cbaadff356b3dda71b8c62b3aa803e5b3eb6d526a24932cd6660a2576 \ -- cgit v1.2.3 From b031bbde94c962b287528402985e2c8a8f4b83b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:22:45 +0000 Subject: Bump actions/setup-python from 4.6.1 to 4.7.0 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.6.1 to 4.7.0. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/bd6b4b6205c4dbad673328db7b31b7fab9e241c0...61a6322f88396a6271a6ee3565807d608ecaddd1) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/msvc-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/msvc-ci.yml b/.github/workflows/msvc-ci.yml index 6aadb8106..7ef067965 100644 --- a/.github/workflows/msvc-ci.yml +++ b/.github/workflows/msvc-ci.yml @@ -35,7 +35,7 @@ jobs: variant: sccache key: ${{ github.job }}-${{ matrix.os }}-${{ matrix.ARCH }} - name: Setup Python - uses: actions/setup-python@bd6b4b6205c4dbad673328db7b31b7fab9e241c0 # v4.6.1 + uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 with: python-version: '3.x' - name: Setup MSVC -- cgit v1.2.3 From af095d90e3ecd602feefad529ceaf6ee126103ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:22:42 +0000 Subject: Bump github/codeql-action from 2.20.3 to 2.20.4 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.20.3 to 2.20.4. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/46ed16ded91731b2df79a2893d3aea8e9f03b5c4...489225d82a57396c6f426a40e66d461b16b3461d) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 70bac362b..b422048fe 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@46ed16ded91731b2df79a2893d3aea8e9f03b5c4 # v2.20.3 + uses: github/codeql-action/upload-sarif@489225d82a57396c6f426a40e66d461b16b3461d # v2.20.4 with: sarif_file: results.sarif -- cgit v1.2.3 From e7ce633946e40e3f753880e8cfd4b86a51a878be Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jul 2023 08:52:12 -0600 Subject: [algs] Fix -Wcomma errors Fixes https://github.com/harfbuzz/harfbuzz/issues/4328 --- src/hb-algs.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index bfd83a269..6cabc7fb0 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -283,8 +283,8 @@ HB_FUNCOBJ (hb_bool); // Compression function for Merkle-Damgard construction. // This function is generated using the framework provided. #define mix(h) ( \ - (h) ^= (h) >> 23, \ - (h) *= 0x2127599bf4325c37ULL, \ + (void) ((h) ^= (h) >> 23), \ + (void) ((h) *= 0x2127599bf4325c37ULL), \ (h) ^= (h) >> 47) static inline uint64_t fasthash64(const void *buf, size_t len, uint64_t seed) -- cgit v1.2.3 From 4ea3737d04c575cd9b6ffda1e4e0f2c9d2b60d9c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jul 2023 09:50:28 -0600 Subject: [gsubgpos] Add fast-path for end-of-string in (Chain)RuleSet::apply() --- src/hb-ot-layout-gsubgpos.hh | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index f9e7e3d74..549d12999 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2204,7 +2204,18 @@ struct RuleSet } } else - goto slow; + { + /* Failed to match a next glyph. Only try applying rules that have + * no further input. */ + return_trace ( + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_filter ([&] (const Rule &_) { return _.inputCount <= 1; }) + | hb_map ([&] (const Rule &_) { return _.apply (c, lookup_context); }) + | hb_any + ) + ; + } bool unsafe_to_concat = false; @@ -3346,7 +3357,18 @@ struct ChainRuleSet } } else - goto slow; + { + /* Failed to match a next glyph. Only try applying rules that have + * no further input and lookahead. */ + return_trace ( + + hb_iter (rule) + | hb_map (hb_add (this)) + | hb_filter ([&] (const ChainRule &_) { return _.inputX.lenP1 <= 1 && _.lookaheadX.len == 0; }) + | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); }) + | hb_any + ) + ; + } bool unsafe_to_concat = false; -- cgit v1.2.3 From d92a7a58d83952782d2cf54391e129a09c4b306d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 17 Jul 2023 11:27:38 -0600 Subject: [gsubgpos] Inline a couple functions Produces smaller code. --- src/hb-ot-layout-gsubgpos.hh | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 549d12999..3cf4f1a0f 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1941,12 +1941,13 @@ static inline bool context_would_apply_lookup (hb_would_apply_context_t *c, } template -static inline bool context_apply_lookup (hb_ot_apply_context_t *c, - unsigned int inputCount, /* Including the first glyph (not matched) */ - const HBUINT input[], /* Array of input values--start with second glyph */ - unsigned int lookupCount, - const LookupRecord lookupRecord[], - const ContextApplyLookupContext &lookup_context) +HB_ALWAYS_INLINE +static bool context_apply_lookup (hb_ot_apply_context_t *c, + unsigned int inputCount, /* Including the first glyph (not matched) */ + const HBUINT input[], /* Array of input values--start with second glyph */ + unsigned int lookupCount, + const LookupRecord lookupRecord[], + const ContextApplyLookupContext &lookup_context) { unsigned match_end = 0; unsigned match_positions[HB_MAX_CONTEXT_LENGTH]; @@ -3015,16 +3016,17 @@ static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c } template -static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c, - unsigned int backtrackCount, - const HBUINT backtrack[], - unsigned int inputCount, /* Including the first glyph (not matched) */ - const HBUINT input[], /* Array of input values--start with second glyph */ - unsigned int lookaheadCount, - const HBUINT lookahead[], - unsigned int lookupCount, - const LookupRecord lookupRecord[], - const ChainContextApplyLookupContext &lookup_context) +HB_ALWAYS_INLINE +static bool chain_context_apply_lookup (hb_ot_apply_context_t *c, + unsigned int backtrackCount, + const HBUINT backtrack[], + unsigned int inputCount, /* Including the first glyph (not matched) */ + const HBUINT input[], /* Array of input values--start with second glyph */ + unsigned int lookaheadCount, + const HBUINT lookahead[], + unsigned int lookupCount, + const LookupRecord lookupRecord[], + const ChainContextApplyLookupContext &lookup_context) { unsigned end_index = c->buffer->idx; unsigned match_end = 0; -- cgit v1.2.3 From 165f3e60ace3a086a3d5741146da83d2c82a409b Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 17 Jul 2023 09:46:03 -0700 Subject: [instancer-solver] add renormalizeValue() and store axis->distances map --- src/hb-ot-var-fvar-table.hh | 7 +++++++ src/hb-subset-instancer-solver.cc | 43 +++++++++++++++++++++++++++++++++++++-- src/hb-subset-instancer-solver.hh | 24 +++++++++++++++++++++- src/hb-subset-plan-member-list.hh | 2 ++ src/hb-subset-plan.cc | 12 ++++++----- 5 files changed, 80 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index d8e789cb4..da0b85f6f 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -228,6 +228,13 @@ struct AxisRecord return defaultValue.to_float (); } + TripleDistances get_triple_distances () const + { + float min, default_, max; + get_coordinates (min, default_, max); + return TripleDistances (min, default_, max); + } + public: Tag axisTag; /* Tag identifying the design variation for the axis. */ protected: diff --git a/src/hb-subset-instancer-solver.cc b/src/hb-subset-instancer-solver.cc index c698d944c..0e8426aa0 100644 --- a/src/hb-subset-instancer-solver.cc +++ b/src/hb-subset-instancer-solver.cc @@ -392,8 +392,47 @@ static inline float normalizeValue (float v, const Triple &triple, bool extrapol } } +static inline TripleDistances _reverse_triple_distances (const TripleDistances &v) +{ return TripleDistances (v.positive, v.negative); } + +float renormalizeValue (float v, const Triple &triple, + const TripleDistances &triple_distances, bool extrapolate) +{ + float lower = triple.minimum, def = triple.middle, upper = triple.maximum; + assert (lower <= def && def <= upper); + + if (!extrapolate) + v = hb_max (hb_min (v, upper), lower); + + if (v == def) + return 0.f; + + if (def < 0.f) + return -renormalizeValue (-v, _reverse_negate (triple), + _reverse_triple_distances (triple_distances), extrapolate); + + /* default >= 0 and v != default */ + if (v > def) + return (v - def) / (upper - def); + + /* v < def */ + if (lower >= 0.f) + return (v - def) / (def - lower); + + /* lower < 0 and v < default */ + float total_distance = triple_distances.negative * (-lower) + triple_distances.positive * def; + + float v_distance; + if (v >= 0.f) + v_distance = (def - v) * triple_distances.positive; + else + v_distance = (-v) * triple_distances.negative + triple_distances.positive * def; + + return (-v_distance) /total_distance; +} + result_t -rebase_tent (Triple tent, Triple axisLimit) +rebase_tent (Triple tent, Triple axisLimit, TripleDistances axis_triple_distances) { assert (-1.f <= axisLimit.minimum && axisLimit.minimum <= axisLimit.middle && axisLimit.middle <= axisLimit.maximum && axisLimit.maximum <= +1.f); assert (-2.f <= tent.minimum && tent.minimum <= tent.middle && tent.middle <= tent.maximum && tent.maximum <= +2.f); @@ -401,7 +440,7 @@ rebase_tent (Triple tent, Triple axisLimit) result_t sols = _solve (tent, axisLimit); - auto n = [&axisLimit] (float v) { return normalizeValue (v, axisLimit, true); }; + auto n = [&axisLimit, &axis_triple_distances] (float v) { return renormalizeValue (v, axisLimit, axis_triple_distances); }; result_t out; for (auto &p : sols) diff --git a/src/hb-subset-instancer-solver.hh b/src/hb-subset-instancer-solver.hh index b1f859493..563fccbb5 100644 --- a/src/hb-subset-instancer-solver.hh +++ b/src/hb-subset-instancer-solver.hh @@ -27,6 +27,21 @@ #include "hb.hh" +/* pre-normalized distances */ +struct TripleDistances +{ + TripleDistances (): negative (1.f), positive (1.f) {} + TripleDistances (float neg_, float pos_): negative (neg_), positive (pos_) {} + TripleDistances (float min, float default_, float max) + { + negative = default_ - min; + positive = max - default_; + } + + float negative; + float positive; +}; + struct Triple { Triple () : @@ -66,6 +81,7 @@ struct Triple { return current; } + float minimum; float middle; float maximum; @@ -74,6 +90,12 @@ struct Triple { using result_item_t = hb_pair_t; using result_t = hb_vector_t; +/* renormalize a normalized value v to the range of an axis, + * considering the prenormalized distances as well as the new axis limits. + * Ported from fonttools */ +HB_INTERNAL float renormalizeValue (float v, const Triple &triple, + const TripleDistances &triple_distances, + bool extrapolate = true); /* Given a tuple (lower,peak,upper) "tent" and new axis limits * (axisMin,axisDefault,axisMax), solves how to represent the tent * under the new axis configuration. All values are in normalized @@ -85,6 +107,6 @@ using result_t = hb_vector_t; * If tent value is Triple{}, that is a special deltaset that should * be always-enabled (called "gain"). */ -HB_INTERNAL result_t rebase_tent (Triple tent, Triple axisLimit); +HB_INTERNAL result_t rebase_tent (Triple tent, Triple axisLimit, TripleDistances axis_triple_distances); #endif /* HB_SUBSET_INSTANCER_SOLVER_HH */ diff --git a/src/hb-subset-plan-member-list.hh b/src/hb-subset-plan-member-list.hh index be29e67ec..8e61055f4 100644 --- a/src/hb-subset-plan-member-list.hh +++ b/src/hb-subset-plan-member-list.hh @@ -105,6 +105,8 @@ HB_SUBSET_PLAN_MEMBER (hb_vector_t, normalized_coords) //user specified axes range map HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(), user_axes_location) +//axis->TripleDistances map (distances in the pre-normalized space) +HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E(), axes_triple_distances) //retained old axis index -> new axis index mapping in fvar axis array HB_SUBSET_PLAN_MEMBER (hb_map_t, axes_index_map) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 33ca46d1f..93823d30f 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -930,12 +930,14 @@ _normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan) new_axis_idx++; } - if (plan->user_axes_location.has (axis_tag)) + Triple *axis_range; + if (plan->user_axes_location.has (axis_tag, &axis_range)) { - Triple axis_range = plan->user_axes_location.get (axis_tag); - int normalized_min = axis.normalize_axis_value (axis_range.minimum); - int normalized_default = axis.normalize_axis_value (axis_range.middle); - int normalized_max = axis.normalize_axis_value (axis_range.maximum); + plan->axes_triple_distances.set (axis_tag, axis.get_triple_distances ()); + + int normalized_min = axis.normalize_axis_value (axis_range->minimum); + int normalized_default = axis.normalize_axis_value (axis_range->middle); + int normalized_max = axis.normalize_axis_value (axis_range->maximum); if (has_avar && old_axis_idx < avar_axis_count) { -- cgit v1.2.3 From 12be4cb184c6600f26285f8a56b9b27b80931f22 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 17 Jul 2023 11:08:54 -0700 Subject: [instancer-solver] fix APIs calling rebase_tent() with TripleDistances --- src/hb-ot-var-common.hh | 21 ++++++++++++++------- src/hb-ot-var-cvar-table.hh | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 6bbb4d6f1..95ca86ea1 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -533,7 +533,8 @@ struct tuple_delta_t return *this; } - hb_vector_t change_tuple_var_axis_limit (hb_tag_t axis_tag, Triple axis_limit) const + hb_vector_t change_tuple_var_axis_limit (hb_tag_t axis_tag, Triple axis_limit, + TripleDistances axis_triple_distances) const { hb_vector_t out; Triple *tent; @@ -553,7 +554,7 @@ struct tuple_delta_t return out; } - result_t solutions = rebase_tent (*tent, axis_limit); + result_t solutions = rebase_tent (*tent, axis_limit, axis_triple_distances); for (auto t : solutions) { tuple_delta_t new_var = *this; @@ -1006,16 +1007,21 @@ struct TupleVariationData return true; } - void change_tuple_variations_axis_limits (const hb_hashmap_t *normalized_axes_location) + void change_tuple_variations_axis_limits (const hb_hashmap_t& normalized_axes_location, + const hb_hashmap_t& axes_triple_distances) { - for (auto _ : *normalized_axes_location) + for (auto _ : normalized_axes_location) { hb_tag_t axis_tag = _.first; Triple axis_limit = _.second; + TripleDistances axis_triple_distances{1.f, 1.f}; + if (axes_triple_distances.has (axis_tag)) + axis_triple_distances = axes_triple_distances.get (axis_tag); + hb_vector_t new_vars; for (const tuple_delta_t& var : tuple_vars) { - hb_vector_t out = var.change_tuple_var_axis_limit (axis_tag, axis_limit); + hb_vector_t out = var.change_tuple_var_axis_limit (axis_tag, axis_limit, axis_triple_distances); if (!out) continue; unsigned new_len = new_vars.length + out.length; @@ -1196,9 +1202,10 @@ struct TupleVariationData return res; } - void instantiate (const hb_hashmap_t& normalized_axes_location) + void instantiate (const hb_hashmap_t& normalized_axes_location, + const hb_hashmap_t& axes_triple_distances) { - change_tuple_variations_axis_limits (&normalized_axes_location); + change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances); merge_tuple_variations (); } diff --git a/src/hb-ot-var-cvar-table.hh b/src/hb-ot-var-cvar-table.hh index de5433930..9c0b696bf 100644 --- a/src/hb-ot-var-cvar-table.hh +++ b/src/hb-ot-var-cvar-table.hh @@ -167,7 +167,7 @@ struct cvar tuple_variations)) return_trace (false); - tuple_variations.instantiate (c->plan->axes_location); + tuple_variations.instantiate (c->plan->axes_location, c->plan->axes_triple_distances); if (!tuple_variations.compile_bytes (c->plan->axes_index_map, c->plan->axes_old_index_tag_map)) return_trace (false); -- cgit v1.2.3 From 350423df8d7bc3c87b030c6304c9611136e60e68 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 17 Jul 2023 11:10:19 -0700 Subject: [instancer-solver] fix tests --- src/test-subset-instancer-solver.cc | 59 +++++++++++++++++++------------------ src/test-tuple-varstore.cc | 5 +++- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/test-subset-instancer-solver.cc b/src/test-subset-instancer-solver.cc index ca473d94f..e0dfab6a0 100644 --- a/src/test-subset-instancer-solver.cc +++ b/src/test-subset-instancer-solver.cc @@ -41,12 +41,13 @@ static inline bool approx (float a, float b) int main (int argc, char **argv) { + TripleDistances default_axis_distances{1.f, 1.f}; /* Case 1 */ { /* pin axis*/ Triple tent (0.f, 1.f, 1.f); Triple axis_range (0.f, 0.f, 0.f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 0); } @@ -54,7 +55,7 @@ main (int argc, char **argv) /* pin axis*/ Triple tent (0.f, 1.f, 1.f); Triple axis_range (0.5f, 0.5f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 0.5f); assert (out[0].second == Triple ()); @@ -64,7 +65,7 @@ main (int argc, char **argv) /* tent falls outside the new axis range */ Triple tent (0.3f, 0.5f, 0.8f); Triple axis_range (0.1f, 0.2f, 0.3f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 0); } @@ -72,7 +73,7 @@ main (int argc, char **argv) { Triple tent (0.f, 1.f, 1.f); Triple axis_range (-1.f, 0.f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 0.5f); assert (out[0].second == Triple (0.f, 1.f, 1.f)); @@ -82,7 +83,7 @@ main (int argc, char **argv) { Triple tent (0.f, 1.f, 1.f); Triple axis_range (-1.f, 0.f, 0.75f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 0.75f); assert (out[0].second == Triple (0.f, 1.f, 1.f)); @@ -93,7 +94,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.2f, 1.f); Triple axis_range (-1.f, 0.f, 0.8f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 1.f); assert (out[0].second == Triple (0.f, 0.25f, 1.25f)); @@ -103,7 +104,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.4f, 1.f); Triple axis_range (-1.f, 0.f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 1.f); assert (out[0].second == Triple (0.f, 0.8f, 32767/(float) (1 << 14))); @@ -113,7 +114,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.25f, 1.f); Triple axis_range (-1.f, 0.f, 0.4f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 2); assert (out[0].first == 1.f); assert (out[0].second == Triple (0.f, 0.625f, 1.f)); @@ -125,7 +126,7 @@ main (int argc, char **argv) { Triple tent (0.25f, 0.3f, 1.05f); Triple axis_range (0.f, 0.2f, 0.4f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 2); assert (out[0].first == 1.f); assert (approx (out[0].second, Triple (0.25f, 0.5f, 1.f))); @@ -137,7 +138,7 @@ main (int argc, char **argv) { Triple tent (0.25f, 0.5f, 1.f); Triple axis_range (0.f, 0.25f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 1.f); assert (out[0].second == Triple (0.f, 1.f, 1.f)); @@ -148,7 +149,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.5f, 1.f); Triple axis_range (0.f, 0.5f, 1.f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 3); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); @@ -161,7 +162,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.5f, 1.f); Triple axis_range (0.f, 0.5f, 0.75f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 3); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); @@ -174,7 +175,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.5f, 1.f); Triple axis_range (0.f, 0.25f, 0.8f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 4); assert (out[0].first == 0.5f); assert (out[0].second == Triple ()); @@ -190,7 +191,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.5f, 2.f); Triple axis_range (0.2f, 0.5f, 0.8f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 3); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); @@ -204,7 +205,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.5f, 2.f); Triple axis_range (0.2f, 0.5f, 1.f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 3); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); @@ -218,7 +219,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.5f, 1.f); Triple axis_range (0.25f, 0.25f, 0.75f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 2); assert (out[0].first == 0.5f); assert (out[0].second == Triple ()); @@ -230,7 +231,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.5f, 1.f); Triple axis_range (0.f, 0.25f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 3); assert (out[0].first == 0.5f); assert (out[0].second == Triple ()); @@ -244,7 +245,7 @@ main (int argc, char **argv) { Triple tent (0.05f, 0.55f, 1.f); Triple axis_range (0.f, 0.25f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 4); assert (approx (out[0].first, 0.4f)); assert (out[0].second == Triple ()); @@ -260,7 +261,7 @@ main (int argc, char **argv) { Triple tent (-1.f, -0.55f, -0.05f); Triple axis_range (-0.5f, -0.25f, 0.f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 4); assert (approx (out[0].first, 0.4f)); assert (out[0].second == Triple ()); @@ -276,7 +277,7 @@ main (int argc, char **argv) { Triple tent (0.5f, 0.5f, 0.5f); Triple axis_range (0.5f, 0.5f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); @@ -285,7 +286,7 @@ main (int argc, char **argv) { Triple tent (0.3f, 0.5f, 0.7f); Triple axis_range (0.1f, 0.5f, 0.9f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 5); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); @@ -302,7 +303,7 @@ main (int argc, char **argv) { Triple tent (0.5f, 0.5f, 0.5f); Triple axis_range (0.25f, 0.25f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 1.f); assert (out[0].second == Triple (1.f, 1.f, 1.f)); @@ -311,7 +312,7 @@ main (int argc, char **argv) { Triple tent (0.5f, 0.5f, 0.5f); Triple axis_range (0.25f, 0.35f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 1.f); assert (out[0].second == Triple (1.f, 1.f, 1.f)); @@ -320,7 +321,7 @@ main (int argc, char **argv) { Triple tent (0.5f, 0.5f, 0.55f); Triple axis_range (0.25f, 0.35f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 1.f); assert (out[0].second == Triple (1.f, 1.f, 1.f)); @@ -329,7 +330,7 @@ main (int argc, char **argv) { Triple tent (0.5f, 0.5f, 1.f); Triple axis_range (0.5f, 0.5f, 1.f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 2); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); @@ -340,7 +341,7 @@ main (int argc, char **argv) { Triple tent (0.25f, 0.5f, 1.f); Triple axis_range (0.5f, 0.5f, 1.f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 2); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); @@ -351,7 +352,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.2f, 1.f); Triple axis_range (0.f, 0.f, 0.5f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 1); assert (out[0].first == 1.f); assert (out[0].second == Triple (0.f, 0.4f, 32767/(float) (1 << 14))); @@ -361,7 +362,7 @@ main (int argc, char **argv) { Triple tent (0.f, 0.5f, 1.f); Triple axis_range (-1.f, 0.25f, 1.f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 5); assert (out[0].first == 0.5f); assert (out[0].second == Triple ()); @@ -378,7 +379,7 @@ main (int argc, char **argv) { Triple tent (0.5f, 0.5f, 0.5f); Triple axis_range (0.f, 0.5f, 1.f); - result_t out = rebase_tent (tent, axis_range); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); assert (out.length == 5); assert (out[0].first == 1.f); assert (out[0].second == Triple ()); diff --git a/src/test-tuple-varstore.cc b/src/test-tuple-varstore.cc index c1fb747e5..32d2ea457 100644 --- a/src/test-tuple-varstore.cc +++ b/src/test-tuple-varstore.cc @@ -80,7 +80,10 @@ test_decompile_cvar () hb_hashmap_t normalized_axes_location; normalized_axes_location.set (axis_tag, Triple (-0.512817f, 0.f, 0.700012f)); - tuple_variations.change_tuple_variations_axis_limits (&normalized_axes_location); + hb_hashmap_t axes_triple_distances; + axes_triple_distances.set (axis_tag, TripleDistances (1.f, 1.f)); + + tuple_variations.change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances); tuple_variations.merge_tuple_variations (); assert (tuple_variations.tuple_vars[0].indices.length == 65); -- cgit v1.2.3 From 73ce3015bbaa04ce5a2a9da358e3695c7db10c44 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 17 Jul 2023 13:46:57 -0700 Subject: [instancer-solver] port optimization and more tests from fonttools --- src/hb-subset-instancer-solver.cc | 5 ++--- src/test-subset-instancer-solver.cc | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/hb-subset-instancer-solver.cc b/src/hb-subset-instancer-solver.cc index 0e8426aa0..c88131a8a 100644 --- a/src/hb-subset-instancer-solver.cc +++ b/src/hb-subset-instancer-solver.cc @@ -253,9 +253,8 @@ _solve (Triple tent, Triple axisLimit, bool negative = false) * axisDef axisMax */ float newUpper = peak + (1 - gain) * (upper - peak); - // I feel like the first condition is always true because - // outGain >= gain. - if (axisMax <= newUpper && newUpper <= axisDef + (axisMax - axisDef) * 2) + assert (axisMax <= newUpper); // Because outGain >= gain + if (newUpper <= axisDef + (axisMax - axisDef) * 2) { upper = newUpper; if (!negative && axisDef + (axisMax - axisDef) * MAX_F2DOT14 < upper) diff --git a/src/test-subset-instancer-solver.cc b/src/test-subset-instancer-solver.cc index e0dfab6a0..e8294cfa8 100644 --- a/src/test-subset-instancer-solver.cc +++ b/src/test-subset-instancer-solver.cc @@ -392,5 +392,24 @@ main (int argc, char **argv) assert (out[4].first == -1.f); assert (out[4].second == Triple (-1.f, -1.f, -2/(float) (1 << 14))); } + + { + Triple tent (0.f, 1.f, 1.f); + Triple axis_range (-1.f, -0.5f, 1.f); + result_t out = rebase_tent (tent, axis_range, default_axis_distances); + assert (out.length == 1); + assert (out[0].first == 1.f); + assert (out[0].second == Triple (1.f/3, 1.f, 1.f)); + } + + { + Triple tent (0.f, 1.f, 1.f); + Triple axis_range (-1.f, -0.5f, 1.f); + TripleDistances axis_distances{2.f, 1.f}; + result_t out = rebase_tent (tent, axis_range, axis_distances); + assert (out.length == 1); + assert (out[0].first == 1.f); + assert (out[0].second == Triple (0.5f, 1.f, 1.f)); + } } -- cgit v1.2.3 From 6c25c752f608dfaa0b153b4c62bd96225c670080 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 17 Jul 2023 13:47:38 -0700 Subject: [instancer] use renormalized values when instantiating Condition table --- src/hb-ot-layout-common.hh | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index e2e9bcbeb..7456380cd 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2937,9 +2937,29 @@ struct ConditionFormat1 const hb_map_t *index_map = &c->plan->axes_index_map; if (index_map->is_empty ()) return_trace (true); - if (!index_map->has (axisIndex)) + const hb_map_t& axes_old_index_tag_map = c->plan->axes_old_index_tag_map; + hb_codepoint_t *axis_tag; + if (!axes_old_index_tag_map.has (axisIndex, &axis_tag) || + !index_map->has (axisIndex)) return_trace (false); + const hb_hashmap_t& normalized_axes_location = c->plan->axes_location; + Triple axis_limit{-1.f, 0.f, 1.f}; + Triple *normalized_limit; + if (normalized_axes_location.has (*axis_tag, &normalized_limit)) + axis_limit = *normalized_limit; + + const hb_hashmap_t& axes_triple_distances = c->plan->axes_triple_distances; + TripleDistances axis_triple_distances{1.f, 1.f}; + TripleDistances *triple_dists; + if (axes_triple_distances.has (*axis_tag, &triple_dists)) + axis_triple_distances = *triple_dists; + + float normalized_min = renormalizeValue (filterRangeMinValue.to_float (), axis_limit, axis_triple_distances, false); + float normalized_max = renormalizeValue (filterRangeMaxValue.to_float (), axis_limit, axis_triple_distances, false); + out->filterRangeMinValue.set_float (normalized_min); + out->filterRangeMaxValue.set_float (normalized_max); + return_trace (c->serializer->check_assign (out->axisIndex, index_map->get (axisIndex), HB_SERIALIZE_ERROR_INT_OVERFLOW)); } -- cgit v1.2.3 From 5ee015ecf60aac27ea3cd6309b1b1fb3c3566196 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 17 Jul 2023 13:54:34 -0700 Subject: [instancer-solver] remove unused normalizeValue() code --- src/hb-subset-instancer-solver.cc | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/src/hb-subset-instancer-solver.cc b/src/hb-subset-instancer-solver.cc index c88131a8a..4cb3f8a48 100644 --- a/src/hb-subset-instancer-solver.cc +++ b/src/hb-subset-instancer-solver.cc @@ -361,36 +361,6 @@ _solve (Triple tent, Triple axisLimit, bool negative = false) return out; } -/* Normalizes value based on a min/default/max triple. */ -static inline float normalizeValue (float v, const Triple &triple, bool extrapolate = false) -{ - /* - >>> normalizeValue(400, (100, 400, 900)) - 0.0 - >>> normalizeValue(100, (100, 400, 900)) - -1.0 - >>> normalizeValue(650, (100, 400, 900)) - 0.5 - */ - float lower = triple.minimum, def = triple.middle, upper = triple.maximum; - assert (lower <= def && def <= upper); - - if (!extrapolate) - v = hb_max (hb_min (v, upper), lower); - - if ((v == def) || (lower == upper)) - return 0.f; - - if ((v < def && lower != def) || (v > def && upper == def)) - return (v - def) / (def - lower); - else - { - assert ((v > def && upper != def) || - (v < def && lower == def)); - return (v - def) / (upper - def); - } -} - static inline TripleDistances _reverse_triple_distances (const TripleDistances &v) { return TripleDistances (v.positive, v.negative); } -- cgit v1.2.3 From 7a2f9dcfb9cd892191f295c8fd9ca39d6675d9ed Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jul 2023 04:36:15 -0600 Subject: [matcher] Move initializers inline --- src/hb-ot-layout-gsubgpos.hh | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 3cf4f1a0f..95e8fb84d 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -402,16 +402,6 @@ struct hb_ot_apply_context_t : { struct matcher_t { - matcher_t () : - lookup_props (0), - mask (-1), - ignore_zwnj (false), - ignore_zwj (false), - per_syllable (false), - syllable {0}, - match_func (nullptr), - match_data (nullptr) {} - typedef bool (*match_func_t) (hb_glyph_info_t &info, unsigned value, const void *data); void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; } @@ -470,14 +460,14 @@ struct hb_ot_apply_context_t : } protected: - unsigned int lookup_props; - hb_mask_t mask; - bool ignore_zwnj; - bool ignore_zwj; - bool per_syllable; - uint8_t syllable; - match_func_t match_func; - const void *match_data; + unsigned int lookup_props = 0; + hb_mask_t mask = -1; + bool ignore_zwnj = false; + bool ignore_zwj = false; + bool per_syllable = false; + uint8_t syllable = 0; + match_func_t match_func = nullptr; + const void *match_data = nullptr; }; struct skipping_iterator_t -- cgit v1.2.3 From e583c9e904d3825b6f6e7a2996d555d16c67753b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jul 2023 10:34:26 -0600 Subject: [ReverseChain] Add max-size --- src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh b/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh index 916fa281b..a45d86055 100644 --- a/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh +++ b/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh @@ -27,6 +27,7 @@ struct ReverseChainSingleSubstFormat1 * GlyphIDs--ordered by Coverage Index */ public: DEFINE_SIZE_MIN (10); + DEFINE_SIZE_MAX (4 + 65536 * (2 * Offset16::static_size + HBGlyphID16::static_size)); bool sanitize (hb_sanitize_context_t *c) const { -- cgit v1.2.3 From aa381ae963fedadc227afcc154e3cf95d9aa84c1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 18 Jul 2023 10:42:13 -0600 Subject: [ReverseChain] Remove SIZE_MAX Oops. Can't set it since the struct has offsets. --- src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh b/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh index a45d86055..916fa281b 100644 --- a/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh +++ b/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh @@ -27,7 +27,6 @@ struct ReverseChainSingleSubstFormat1 * GlyphIDs--ordered by Coverage Index */ public: DEFINE_SIZE_MIN (10); - DEFINE_SIZE_MAX (4 + 65536 * (2 * Offset16::static_size + HBGlyphID16::static_size)); bool sanitize (hb_sanitize_context_t *c) const { -- cgit v1.2.3 From efbd257a325fedcf9000a9cccbf2d97d38769b98 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 18 Jul 2023 14:50:32 -0700 Subject: [instancer] memory leak fix in cvar --- src/hb-ot-var-cvar-table.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-ot-var-cvar-table.hh b/src/hb-ot-var-cvar-table.hh index 9c0b696bf..fee39eff3 100644 --- a/src/hb-ot-var-cvar-table.hh +++ b/src/hb-ot-var-cvar-table.hh @@ -161,6 +161,7 @@ struct cvar const hb_tag_t cvt = HB_TAG('c','v','t',' '); hb_blob_t *cvt_blob = hb_face_reference_table (c->plan->source, cvt); unsigned point_count = hb_blob_get_length (cvt_blob) / FWORD::static_size; + hb_blob_destroy (cvt_blob); if (!decompile_tuple_variations (axis_count, point_count, false, &(c->plan->axes_old_index_tag_map), -- cgit v1.2.3 From 730f579f68c9062b0f493d400f445946f2ee032d Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 18 Jul 2023 15:09:36 -0700 Subject: [instancer] store float value rather than F2DOT14 int value in axes_location map --- src/hb-ot-layout-common.hh | 19 +++++++++++-------- src/hb-subset-plan.cc | 6 +++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 7456380cd..0831e4499 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2975,15 +2975,16 @@ struct ConditionFormat1 hb_tag_t axis_tag = c->axes_index_tag_map->get (axisIndex); Triple axis_range (-1.f, 0.f, 1.f); - if (c->axes_location->has (axis_tag)) - axis_range = c->axes_location->get (axis_tag); + Triple *axis_limit; + if (c->axes_location->has (axis_tag, &axis_limit)) + axis_range = *axis_limit; - int axis_min_val = axis_range.minimum; - int axis_default_val = axis_range.middle; - int axis_max_val = axis_range.maximum; + float axis_min_val = axis_range.minimum; + float axis_default_val = axis_range.middle; + float axis_max_val = axis_range.maximum; - int16_t filter_min_val = filterRangeMinValue.to_int (); - int16_t filter_max_val = filterRangeMaxValue.to_int (); + float filter_min_val = filterRangeMinValue.to_float (); + float filter_max_val = filterRangeMaxValue.to_float (); if (axis_default_val < filter_min_val || axis_default_val > filter_max_val) @@ -3003,7 +3004,9 @@ struct ConditionFormat1 { // add axisIndex->value into the hashmap so we can check if the record is // unique with variations - hb_codepoint_t val = (filter_max_val << 16) + filter_min_val; + int16_t int_filter_max_val = filterRangeMaxValue.to_int (); + int16_t int_filter_min_val = filterRangeMinValue.to_int (); + hb_codepoint_t val = (int_filter_max_val << 16) + int_filter_min_val; condition_map->set (axisIndex, val); return KEEP_COND_WITH_VAR; diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 93823d30f..a2090b727 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -945,9 +945,9 @@ _normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan) normalized_default = seg_maps->map (normalized_default); normalized_max = seg_maps->map (normalized_max); } - plan->axes_location.set (axis_tag, Triple (static_cast (normalized_min), - static_cast (normalized_default), - static_cast (normalized_max))); + plan->axes_location.set (axis_tag, Triple (static_cast (normalized_min / 16384.f), + static_cast (normalized_default / 16384.f), + static_cast (normalized_max / 16384.f))); if (normalized_default != 0) plan->pinned_at_default = false; -- cgit v1.2.3 From 02b00d774368bb82b97348436b0620b9ffe1bf0f Mon Sep 17 00:00:00 2001 From: "Richard Dodd (dodj)" Date: Wed, 19 Jul 2023 11:22:07 +0100 Subject: Update wasm-shaper.md (just a small typo) --- docs/wasm-shaper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wasm-shaper.md b/docs/wasm-shaper.md index 5343aa398..bc3740083 100644 --- a/docs/wasm-shaper.md +++ b/docs/wasm-shaper.md @@ -357,7 +357,7 @@ void debugprint(char* str) void debugprint1(char* str, int32 arg1) void debugprint2(char* str, int32 arg1, int32 arg2) void debugprint3(char* str, int32 arg1, int32 arg2, int32 arg3) -void debugprint3( +void debugprint4( char* str, int32 arg1, int32 arg2, -- cgit v1.2.3 From 73d94dbde35f5e01014f7858730e7d60b369aefd Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 19 Jul 2023 10:33:57 -0700 Subject: [instancer] bug fixes in fvar: add missing instanceCount, update axis limit --- src/hb-ot-var-fvar-table.hh | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-var-fvar-table.hh b/src/hb-ot-var-fvar-table.hh index da0b85f6f..4c4957bd7 100644 --- a/src/hb-ot-var-fvar-table.hh +++ b/src/hb-ot-var-fvar-table.hh @@ -99,16 +99,16 @@ struct InstanceRecord for (unsigned i = 0 ; i < axis_count; i++) { uint32_t *axis_tag; + Triple *axis_limit; // only keep instances whose coordinates == pinned axis location - if (!c->plan->axes_old_index_tag_map.has (i, &axis_tag)) continue; - if (axes_location->has (*axis_tag)) + if (!c->plan->axes_old_index_tag_map.has (i, &axis_tag)) return_trace (false); + if (axes_location->has (*axis_tag, &axis_limit)) { - Triple axis_limit = axes_location->get (*axis_tag); - if (!axis_coord_pinned_or_within_axis_range (coords, i, axis_limit)) + if (!axis_coord_pinned_or_within_axis_range (coords, i, *axis_limit)) return_trace (false); //skip pinned axis - if (axis_limit.is_point ()) + if (axis_limit->is_point ()) continue; } @@ -235,6 +235,23 @@ struct AxisRecord return TripleDistances (min, default_, max); } + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + auto *out = c->serializer->embed (this); + if (unlikely (!out)) return_trace (false); + + const hb_hashmap_t& user_axes_location = c->plan->user_axes_location; + Triple *axis_limit; + if (user_axes_location.has (axisTag, &axis_limit)) + { + out->minValue.set_float (axis_limit->minimum); + out->defaultValue.set_float (axis_limit->middle); + out->maxValue.set_float (axis_limit->maximum); + } + return_trace (true); + } + public: Tag axisTag; /* Tag identifying the design variation for the axis. */ protected: @@ -423,21 +440,25 @@ struct fvar for (unsigned i = 0 ; i < (unsigned)axisCount; i++) { if (!c->plan->axes_index_map.has (i)) continue; - if (unlikely (!c->serializer->embed (axes_records[i]))) + if (unlikely (!axes_records[i].subset (c))) return_trace (false); } if (!c->serializer->check_assign (out->firstAxis, get_size (), HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false); + unsigned num_retained_instances = 0; for (unsigned i = 0 ; i < (unsigned)instanceCount; i++) { const InstanceRecord *instance = get_instance (i); auto snap = c->serializer->snapshot (); if (!instance->subset (c, axisCount, has_postscript_nameid)) c->serializer->revert (snap); + else + num_retained_instances++; } - return_trace (true); + + return_trace (c->serializer->check_assign (out->instanceCount, num_retained_instances, HB_SERIALIZE_ERROR_INT_OVERFLOW)); } public: -- cgit v1.2.3 From b5de54e1d49701073c1a9356c5e689e135cd8aec Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jul 2023 11:19:06 -0600 Subject: [gsubgpos] Also match second component in (Chain)RuleSet::apply() Another 40% speedup in shaping Gulzar-Regular. --- src/hb-ot-layout-gsubgpos.hh | 98 +++++++++++++++++++++++++++++++++----------- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 95e8fb84d..e4ea60e31 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2170,18 +2170,18 @@ struct RuleSet ; } - /* This version is optimized for speed by matching the first component - * of the rule here, instead of calling into the matching code. + /* This version is optimized for speed by matching the first & second + * components of the rule here, instead of calling into the matching code. * * Replicated from LigatureSet::apply(). */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (c->buffer->idx, 1); + skippy_iter.reset (c->buffer->idx, 2); skippy_iter.set_match_func (match_always, nullptr); skippy_iter.set_glyph_data ((HBUINT16 *) nullptr); - unsigned unsafe_to; - hb_glyph_info_t *first = nullptr; - bool matched = skippy_iter.next (&unsafe_to); + unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0; + hb_glyph_info_t *first = nullptr, *second = nullptr; + bool matched = skippy_iter.next (); if (likely (matched)) { first = &c->buffer->info[skippy_iter.idx]; @@ -2207,6 +2207,12 @@ struct RuleSet ) ; } + matched = skippy_iter.next (); + if (likely (matched && !skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))) + { + second = &c->buffer->info[skippy_iter.idx]; + unsafe_to2 = skippy_iter.idx + 1; + } bool unsafe_to_concat = false; @@ -2220,15 +2226,34 @@ struct RuleSet (!lookup_context.funcs.match || lookup_context.funcs.match (*first, input.arrayZ[0], lookup_context.match_data))) { - if (r.apply (c, lookup_context)) + if (!second || + (r.inputCount <= 2 || + (!lookup_context.funcs.match || + lookup_context.funcs.match (*second, input.arrayZ[1], lookup_context.match_data))) + ) { - if (unsafe_to_concat) - c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); - return_trace (true); + if (r.apply (c, lookup_context)) + { + if (unsafe_to_concat) + c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); + return_trace (true); + } + } + else + { + if (second) + { + unsafe_to_concat = true; + unsafe_to = unsafe_to2; + } } } else - unsafe_to_concat = true; + { + unsafe_to_concat = true; + if (unsafe_to == (unsigned) -1) + unsafe_to = unsafe_to1; + } } if (likely (unsafe_to_concat)) c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); @@ -3324,22 +3349,22 @@ struct ChainRuleSet ; } - /* This version is optimized for speed by matching the first component - * of the rule here, instead of calling into the matching code. + /* This version is optimized for speed by matching the first & second + * components of the rule here, instead of calling into the matching code. * * Replicated from LigatureSet::apply(). */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (c->buffer->idx, 1); + skippy_iter.reset (c->buffer->idx, 2); skippy_iter.set_match_func (match_always, nullptr); skippy_iter.set_glyph_data ((HBUINT16 *) nullptr); - unsigned unsafe_to; - hb_glyph_info_t *first = nullptr; - bool matched = skippy_iter.next (&unsafe_to); + unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0; + hb_glyph_info_t *first = nullptr, *second = nullptr; + bool matched = skippy_iter.next (); if (likely (matched)) { first = &c->buffer->info[skippy_iter.idx]; - unsafe_to = skippy_iter.idx + 1; + unsafe_to1 = skippy_iter.idx + 1; if (skippy_iter.may_skip (c->buffer->info[skippy_iter.idx])) { @@ -3361,6 +3386,12 @@ struct ChainRuleSet ) ; } + matched = skippy_iter.next (); + if (likely (matched && !skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))) + { + second = &c->buffer->info[skippy_iter.idx]; + unsafe_to2 = skippy_iter.idx + 1; + } bool unsafe_to_concat = false; @@ -3378,15 +3409,36 @@ struct ChainRuleSet (!lookahead.len || !lookup_context.funcs.match[2] || lookup_context.funcs.match[2] (*first, lookahead.arrayZ[0], lookup_context.match_data[2]))) { - if (r.apply (c, lookup_context)) + if (!second || + (input.lenP1 > 2 ? + (!lookup_context.funcs.match[1] || + lookup_context.funcs.match[1] (*second, input.arrayZ[1], lookup_context.match_data[1])) + : + (lookahead.len <= 2 - input.lenP1 || !lookup_context.funcs.match[2] || + lookup_context.funcs.match[2] (*second, lookahead.arrayZ[2 - input.lenP1], lookup_context.match_data[2])))) + { + if (r.apply (c, lookup_context)) + { + if (unsafe_to_concat) + c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); + return_trace (true); + } + } + else { - if (unsafe_to_concat) - c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); - return_trace (true); + if (second) + { + unsafe_to_concat = true; + unsafe_to = unsafe_to2; + } } } else - unsafe_to_concat = true; + { + unsafe_to_concat = true; + if (unsafe_to == (unsigned) -1) + unsafe_to = unsafe_to1; + } } if (likely (unsafe_to_concat)) c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); -- cgit v1.2.3 From 42c6a3a18a7d9106e0daf063371a1ba00543f73b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jul 2023 12:07:19 -0600 Subject: [gsubgpos] Remove unnecessary condition Second is always set in this branch. --- src/hb-ot-layout-gsubgpos.hh | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index e4ea60e31..d6185aad5 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2241,11 +2241,8 @@ struct RuleSet } else { - if (second) - { - unsafe_to_concat = true; - unsafe_to = unsafe_to2; - } + unsafe_to_concat = true; + unsafe_to = unsafe_to2; } } else @@ -3426,11 +3423,8 @@ struct ChainRuleSet } else { - if (second) - { - unsafe_to_concat = true; - unsafe_to = unsafe_to2; - } + unsafe_to_concat = true; + unsafe_to = unsafe_to2; } } else -- cgit v1.2.3 From a0bb2d3a9b107d45d1f5f4e2ce27a0cbd46710ed Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 19 Jul 2023 11:21:01 -0700 Subject: [instancer] support STAT table for all instancing operations --- src/hb-subset.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/hb-subset.cc b/src/hb-subset.cc index f497700ed..f6be8d304 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -517,9 +517,7 @@ _subset_table (hb_subset_plan_t *plan, if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); return _subset (plan, buf); case HB_OT_TAG_STAT: - /*TODO(qxliu): change the condition as we support more complex - * instancing operation*/ - if (plan->all_axes_pinned) return _subset (plan, buf); + if (!plan->user_axes_location.is_empty ()) return _subset (plan, buf); else return _passthrough (plan, tag); case HB_TAG ('c', 'v', 't', ' '): -- cgit v1.2.3 From ee5f200bf1a61f43538e36716ba96cd229ebb1ba Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jul 2023 12:26:50 -0600 Subject: [gsubgpos] Remove un unnecessary variable --- src/hb-ot-layout-gsubgpos.hh | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index d6185aad5..630e44a40 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2214,8 +2214,6 @@ struct RuleSet unsafe_to2 = skippy_iter.idx + 1; } - bool unsafe_to_concat = false; - for (unsigned int i = 0; i < num_rules; i++) { const auto &r = this+rule.arrayZ[i]; @@ -2234,25 +2232,21 @@ struct RuleSet { if (r.apply (c, lookup_context)) { - if (unsafe_to_concat) + if (unsafe_to != (unsigned) -1) c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); return_trace (true); } } else - { - unsafe_to_concat = true; unsafe_to = unsafe_to2; - } } else { - unsafe_to_concat = true; if (unsafe_to == (unsigned) -1) unsafe_to = unsafe_to1; } } - if (likely (unsafe_to_concat)) + if (likely (unsafe_to != (unsigned) -1)) c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); return_trace (false); @@ -3390,8 +3384,6 @@ struct ChainRuleSet unsafe_to2 = skippy_iter.idx + 1; } - bool unsafe_to_concat = false; - for (unsigned int i = 0; i < num_rules; i++) { const auto &r = this+rule.arrayZ[i]; @@ -3416,25 +3408,21 @@ struct ChainRuleSet { if (r.apply (c, lookup_context)) { - if (unsafe_to_concat) + if (unsafe_to != (unsigned) -1) c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); return_trace (true); } } else - { - unsafe_to_concat = true; unsafe_to = unsafe_to2; - } } else { - unsafe_to_concat = true; if (unsafe_to == (unsigned) -1) unsafe_to = unsafe_to1; } } - if (likely (unsafe_to_concat)) + if (likely (unsafe_to != (unsigned) -1)) c->buffer->unsafe_to_concat (c->buffer->idx, unsafe_to); return_trace (false); -- cgit v1.2.3 From b01c165034ebd26cc6d76301a6a272a813d42526 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jul 2023 16:35:10 -0600 Subject: [gsubgpos] Minor error handling --- src/hb-ot-layout-gsubgpos.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 630e44a40..83580c716 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -3403,8 +3403,8 @@ struct ChainRuleSet (!lookup_context.funcs.match[1] || lookup_context.funcs.match[1] (*second, input.arrayZ[1], lookup_context.match_data[1])) : - (lookahead.len <= 2 - input.lenP1 || !lookup_context.funcs.match[2] || - lookup_context.funcs.match[2] (*second, lookahead.arrayZ[2 - input.lenP1], lookup_context.match_data[2])))) + (lookahead.len <= 2 - hb_max ((unsigned) input.lenP1, 1u) || !lookup_context.funcs.match[2] || + lookup_context.funcs.match[2] (*second, lookahead.arrayZ[2 - hb_max ((unsigned) input.lenP1, 1u)], lookup_context.match_data[2])))) { if (r.apply (c, lookup_context)) { -- cgit v1.2.3 From 0ccd61a3b2ff0d94a9c72fe3ce965221ef6a7d5b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 19 Jul 2023 16:42:30 -0600 Subject: [gsubgpos] Micro-optimize --- src/hb-ot-layout-gsubgpos.hh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 83580c716..00fe03a8d 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -3391,7 +3391,8 @@ struct ChainRuleSet const auto &input = StructAfter (r.backtrack); const auto &lookahead = StructAfter (input); - if (input.lenP1 > 1 ? + unsigned lenP1 = hb_max ((unsigned) input.lenP1, 1u); + if (lenP1 > 1 ? (!lookup_context.funcs.match[1] || lookup_context.funcs.match[1] (*first, input.arrayZ[0], lookup_context.match_data[1])) : @@ -3399,12 +3400,12 @@ struct ChainRuleSet lookup_context.funcs.match[2] (*first, lookahead.arrayZ[0], lookup_context.match_data[2]))) { if (!second || - (input.lenP1 > 2 ? + (lenP1 > 2 ? (!lookup_context.funcs.match[1] || lookup_context.funcs.match[1] (*second, input.arrayZ[1], lookup_context.match_data[1])) : - (lookahead.len <= 2 - hb_max ((unsigned) input.lenP1, 1u) || !lookup_context.funcs.match[2] || - lookup_context.funcs.match[2] (*second, lookahead.arrayZ[2 - hb_max ((unsigned) input.lenP1, 1u)], lookup_context.match_data[2])))) + (lookahead.len <= 2 - lenP1 || !lookup_context.funcs.match[2] || + lookup_context.funcs.match[2] (*second, lookahead.arrayZ[2 - lenP1], lookup_context.match_data[2])))) { if (r.apply (c, lookup_context)) { -- cgit v1.2.3 From e8de5cb08f209ce3901c53e86eade2238e0fb894 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jul 2023 11:31:13 -0600 Subject: [gsubgpos] Use a couple variables --- src/hb-ot-layout-gsubgpos.hh | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 00fe03a8d..bc793ebf3 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2214,6 +2214,8 @@ struct RuleSet unsafe_to2 = skippy_iter.idx + 1; } + auto match_input = lookup_context.funcs.match; + auto *input_data = lookup_context.match_data; for (unsigned int i = 0; i < num_rules; i++) { const auto &r = this+rule.arrayZ[i]; @@ -2221,13 +2223,13 @@ struct RuleSet const auto &input = r.inputZ; if (r.inputCount <= 1 || - (!lookup_context.funcs.match || - lookup_context.funcs.match (*first, input.arrayZ[0], lookup_context.match_data))) + (!match_input || + match_input (*first, input.arrayZ[0], input_data))) { if (!second || (r.inputCount <= 2 || - (!lookup_context.funcs.match || - lookup_context.funcs.match (*second, input.arrayZ[1], lookup_context.match_data))) + (!match_input || + match_input (*second, input.arrayZ[1], input_data))) ) { if (r.apply (c, lookup_context)) @@ -3384,6 +3386,10 @@ struct ChainRuleSet unsafe_to2 = skippy_iter.idx + 1; } + auto match_input = lookup_context.funcs.match[1]; + auto match_lookahead = lookup_context.funcs.match[2]; + auto *input_data = lookup_context.match_data[1]; + auto *lookahead_data = lookup_context.match_data[2]; for (unsigned int i = 0; i < num_rules; i++) { const auto &r = this+rule.arrayZ[i]; @@ -3393,19 +3399,19 @@ struct ChainRuleSet unsigned lenP1 = hb_max ((unsigned) input.lenP1, 1u); if (lenP1 > 1 ? - (!lookup_context.funcs.match[1] || - lookup_context.funcs.match[1] (*first, input.arrayZ[0], lookup_context.match_data[1])) + (!match_input || + match_input (*first, input.arrayZ[0], input_data)) : - (!lookahead.len || !lookup_context.funcs.match[2] || - lookup_context.funcs.match[2] (*first, lookahead.arrayZ[0], lookup_context.match_data[2]))) + (!lookahead.len || !match_lookahead || + match_lookahead (*first, lookahead.arrayZ[0], lookahead_data))) { if (!second || (lenP1 > 2 ? - (!lookup_context.funcs.match[1] || - lookup_context.funcs.match[1] (*second, input.arrayZ[1], lookup_context.match_data[1])) + (!match_input || + match_input (*second, input.arrayZ[1], input_data)) : - (lookahead.len <= 2 - lenP1 || !lookup_context.funcs.match[2] || - lookup_context.funcs.match[2] (*second, lookahead.arrayZ[2 - lenP1], lookup_context.match_data[2])))) + (lookahead.len <= 2 - lenP1 || !match_lookahead || + match_lookahead (*second, lookahead.arrayZ[2 - lenP1], lookahead_data)))) { if (r.apply (c, lookup_context)) { -- cgit v1.2.3 From 7de2f515a0792048556078a0860c940a1ee32739 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jul 2023 12:46:54 -0600 Subject: [set] Remove dependency on hb-machinery.hh --- src/hb-bit-set.hh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/hb-bit-set.hh b/src/hb-bit-set.hh index 17eb06541..9e60cb934 100644 --- a/src/hb-bit-set.hh +++ b/src/hb-bit-set.hh @@ -30,7 +30,6 @@ #include "hb.hh" #include "hb-bit-page.hh" -#include "hb-machinery.hh" struct hb_bit_set_t @@ -183,6 +182,16 @@ struct hb_bit_set_t return true; } + /* Duplicated here from hb-machinery.hh to avoid including it. */ + template + static inline const Type& StructAtOffsetUnaligned(const void *P, unsigned int offset) + { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-align" + return * reinterpret_cast ((const char *) P + offset); +#pragma GCC diagnostic pop + } + template void set_array (bool v, const T *array, unsigned int count, unsigned int stride=sizeof(T)) { -- cgit v1.2.3 From 0ab906715e51859f5c88bae2a9e7611e3c251bec Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jul 2023 12:57:16 -0600 Subject: [sanitize/Coverage] Keep a map of sane coverages Fonts like Gulzar reuse the same coverage over a thousand times sometimes. However, this doesn't speed up sanitize unfortunately. Looks like calling Coverage::sanitize() is already very fast. We're just doing A LOT of it. The map slowed it down in fact. A set was even slower. Going to revert. --- src/OT/Layout/Common/Coverage.hh | 22 +++++++++++++++++----- src/hb-sanitize.hh | 3 +++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/OT/Layout/Common/Coverage.hh b/src/OT/Layout/Common/Coverage.hh index 25056c9bc..2065416ba 100644 --- a/src/OT/Layout/Common/Coverage.hh +++ b/src/OT/Layout/Common/Coverage.hh @@ -62,18 +62,30 @@ struct Coverage #endif bool sanitize (hb_sanitize_context_t *c) const { + uintptr_t offset = (uintptr_t) this - (uintptr_t) c->start; + if (offset < HB_SET_VALUE_INVALID && + c->sane_coverages.has ((hb_codepoint_t) offset)) + return true; + + bool ret; + TRACE_SANITIZE (this); if (!u.format.sanitize (c)) return_trace (false); switch (u.format) { - case 1: return_trace (u.format1.sanitize (c)); - case 2: return_trace (u.format2.sanitize (c)); + case 1: ret = u.format1.sanitize (c); break; + case 2: ret = u.format2.sanitize (c); break; #ifndef HB_NO_BEYOND_64K - case 3: return_trace (u.format3.sanitize (c)); - case 4: return_trace (u.format4.sanitize (c)); + case 3: ret = u.format3.sanitize (c); break; + case 4: ret = u.format4.sanitize (c); break; #endif - default:return_trace (true); + default:ret = true; break; } + + if (likely (offset < HB_SET_VALUE_INVALID && ret)) + c->sane_coverages.set ((hb_codepoint_t) offset, 1); + + return_trace (ret); } /* Has interface. */ diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 2d338c51c..7c8250703 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -32,6 +32,7 @@ #include "hb.hh" #include "hb-blob.hh" #include "hb-dispatch.hh" +#include "hb-map.hh" /* @@ -228,6 +229,7 @@ struct hb_sanitize_context_t : this->edit_count = 0; this->debug_depth = 0; this->recursion_depth = 0; + this->sane_coverages.clear (); DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1, "start [%p..%p] (%lu bytes)", @@ -505,6 +507,7 @@ struct hb_sanitize_context_t : bool num_glyphs_set; public: bool lazy_some_gpos; + hb_map_t sane_coverages; }; struct hb_sanitize_with_object_t -- cgit v1.2.3 From 837885f0fabdd99f7c804adbb449d1eab67401a8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jul 2023 12:58:16 -0600 Subject: Revert "[sanitize/Coverage] Keep a map of sane coverages" This reverts commit a689114898cc3e8f1c6ba7cc49cd6c3639d91250. --- src/OT/Layout/Common/Coverage.hh | 22 +++++----------------- src/hb-sanitize.hh | 3 --- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/src/OT/Layout/Common/Coverage.hh b/src/OT/Layout/Common/Coverage.hh index 2065416ba..25056c9bc 100644 --- a/src/OT/Layout/Common/Coverage.hh +++ b/src/OT/Layout/Common/Coverage.hh @@ -62,30 +62,18 @@ struct Coverage #endif bool sanitize (hb_sanitize_context_t *c) const { - uintptr_t offset = (uintptr_t) this - (uintptr_t) c->start; - if (offset < HB_SET_VALUE_INVALID && - c->sane_coverages.has ((hb_codepoint_t) offset)) - return true; - - bool ret; - TRACE_SANITIZE (this); if (!u.format.sanitize (c)) return_trace (false); switch (u.format) { - case 1: ret = u.format1.sanitize (c); break; - case 2: ret = u.format2.sanitize (c); break; + case 1: return_trace (u.format1.sanitize (c)); + case 2: return_trace (u.format2.sanitize (c)); #ifndef HB_NO_BEYOND_64K - case 3: ret = u.format3.sanitize (c); break; - case 4: ret = u.format4.sanitize (c); break; + case 3: return_trace (u.format3.sanitize (c)); + case 4: return_trace (u.format4.sanitize (c)); #endif - default:ret = true; break; + default:return_trace (true); } - - if (likely (offset < HB_SET_VALUE_INVALID && ret)) - c->sane_coverages.set ((hb_codepoint_t) offset, 1); - - return_trace (ret); } /* Has interface. */ diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 7c8250703..2d338c51c 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -32,7 +32,6 @@ #include "hb.hh" #include "hb-blob.hh" #include "hb-dispatch.hh" -#include "hb-map.hh" /* @@ -229,7 +228,6 @@ struct hb_sanitize_context_t : this->edit_count = 0; this->debug_depth = 0; this->recursion_depth = 0; - this->sane_coverages.clear (); DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1, "start [%p..%p] (%lu bytes)", @@ -507,7 +505,6 @@ struct hb_sanitize_context_t : bool num_glyphs_set; public: bool lazy_some_gpos; - hb_map_t sane_coverages; }; struct hb_sanitize_with_object_t -- cgit v1.2.3 From 13f05ab9b39202aed98923b8ed0488b344e88a6f Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 20 Jul 2023 09:57:02 -0700 Subject: [instancer] support avar table partial instancing --- src/hb-ot-var-avar-table.hh | 164 ++++++++++++++++++++++++++++++++++++++++++++ src/hb-subset-input.cc | 1 - src/hb-subset.cc | 4 ++ 3 files changed, 168 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-var-avar-table.hh b/src/hb-ot-var-avar-table.hh index 3449b3049..f3754aa6b 100644 --- a/src/hb-ot-var-avar-table.hh +++ b/src/hb-ot-var-avar-table.hh @@ -72,6 +72,65 @@ struct AxisValueMap return_trace (c->check_struct (this)); } + void set_mapping (float from_coord, float to_coord) + { + coords[0].set_float (from_coord); + coords[1].set_float (to_coord); + } + + bool is_outside_axis_range (const Triple& axis_range) const + { + float from_coord = coords[0].to_float (); + return !axis_range.contains (from_coord); + } + + bool must_include () const + { + float from_coord = coords[0].to_float (); + float to_coord = coords[1].to_float (); + return (from_coord == -1.f && to_coord == -1.f) || + (from_coord == 0.f && to_coord == 0.f) || + (from_coord == 1.f && to_coord == 1.f); + } + + void instantiate (const Triple& axis_range, + const Triple& unmapped_range, + const TripleDistances& triple_distances) + { + float from_coord = coords[0].to_float (); + float to_coord = coords[1].to_float (); + + from_coord = renormalizeValue (from_coord, unmapped_range, triple_distances); + to_coord = renormalizeValue (to_coord, axis_range, triple_distances); + + coords[0].set_float (from_coord); + coords[1].set_float (to_coord); + } + + HB_INTERNAL static int cmp (const void *pa, const void *pb) + { + const AxisValueMap *a = (const AxisValueMap *) pa; + const AxisValueMap *b = (const AxisValueMap *) pb; + + int a_from = a->coords[0].to_int (); + int b_from = b->coords[0].to_int (); + if (a_from != b_from) + return a_from - b_from; + + /* this should never be reached. according to the spec, all of the axis + * value map records for a given axis must have different fromCoord values + * */ + int a_to = a->coords[1].to_int (); + int b_to = b->coords[1].to_int (); + return a_to - b_to; + } + + bool serialize (hb_serialize_context_t *c) const + { + TRACE_SERIALIZE (this); + return_trace (c->embed (this)); + } + public: F2DOT14 coords[2]; // F2DOT14 fromCoord; /* A normalized coordinate value obtained using @@ -122,6 +181,78 @@ struct SegmentMaps : Array16Of int unmap (int value) const { return map (value, 1, 0); } + Triple unmap_axis_range (const Triple& axis_range) const + { + F2DOT14 val, unmapped_val; + + val.set_float (axis_range.minimum); + unmapped_val.set_int (unmap (val.to_int ())); + float unmapped_min = unmapped_val.to_float (); + + val.set_float (axis_range.middle); + unmapped_val.set_int (unmap (val.to_int ())); + float unmapped_middle = unmapped_val.to_float (); + + val.set_float (axis_range.maximum); + unmapped_val.set_int (unmap (val.to_int ())); + float unmapped_max = unmapped_val.to_float (); + + return Triple{unmapped_min, unmapped_middle, unmapped_max}; + } + + bool subset (hb_subset_context_t *c, hb_tag_t axis_tag) const + { + TRACE_SUBSET (this); + /* avar mapped normalized axis range*/ + Triple *axis_range; + if (!c->plan->axes_location.has (axis_tag, &axis_range)) + return c->serializer->embed (*this); + + TripleDistances *axis_triple_distances; + if (!c->plan->axes_triple_distances.has (axis_tag, &axis_triple_distances)) + return_trace (false); + + auto *out = c->serializer->start_embed (this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + + Triple unmapped_range = unmap_axis_range (*axis_range); + + /* create a vector of retained mappings and sort */ + hb_vector_t value_mappings; + for (const auto& _ : as_array ()) + { + if (_.is_outside_axis_range (unmapped_range)) + continue; + AxisValueMap mapping; + mapping = _; + mapping.instantiate (*axis_range, unmapped_range, *axis_triple_distances); + /* (-1, -1), (0, 0), (1, 1) mappings will be added later, so avoid + * duplicates here */ + if (mapping.must_include ()) + continue; + value_mappings.push (std::move (mapping)); + } + + AxisValueMap m; + m.set_mapping (-1.f, -1.f); + value_mappings.push (m); + + m.set_mapping (0.f, 0.f); + value_mappings.push (m); + + m.set_mapping (1.f, 1.f); + value_mappings.push (m); + + value_mappings.qsort (); + + for (const auto& _ : value_mappings) + { + if (!_.serialize (c->serializer)) + return_trace (false); + } + return_trace (c->serializer->check_assign (out->len, value_mappings.length, HB_SERIALIZE_ERROR_INT_OVERFLOW)); + } + public: DEFINE_SIZE_ARRAY (2, *this); }; @@ -225,6 +356,39 @@ struct avar } } + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + unsigned retained_axis_count = c->plan->axes_index_map.get_population (); + if (!retained_axis_count) //all axes are pinned/dropped + return_trace (false); + + avar *out = c->serializer->allocate_min (); + if (unlikely (!out)) return_trace (false); + + out->version.major = 1; + out->version.minor = 0; + if (!c->serializer->check_assign (out->axisCount, retained_axis_count, HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); + + const hb_map_t& axes_index_map = c->plan->axes_index_map; + const SegmentMaps *map = &firstAxisSegmentMaps; + unsigned count = axisCount; + for (unsigned int i = 0; i < count; i++) + { + if (axes_index_map.has (i)) + { + hb_tag_t *axis_tag; + if (!c->plan->axes_old_index_tag_map.has (i, &axis_tag)) + return_trace (false); + if (!map->subset (c, *axis_tag)) + return_trace (false); + } + map = &StructAfter (*map); + } + return_trace (true); + } + protected: FixedVersion<>version; /* Version of the avar table * initially set to 0x00010000u */ diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index e6b23df70..93f961f2d 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -69,7 +69,6 @@ hb_subset_input_t::hb_subset_input_t () sets.drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables)); hb_tag_t default_no_subset_tables[] = { - HB_TAG ('a', 'v', 'a', 'r'), HB_TAG ('g', 'a', 's', 'p'), HB_TAG ('f', 'p', 'g', 'm'), HB_TAG ('p', 'r', 'e', 'p'), diff --git a/src/hb-subset.cc b/src/hb-subset.cc index f6be8d304..1f97dbed2 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -50,6 +50,7 @@ #include "hb-ot-name-table.hh" #include "hb-ot-layout-gsub-table.hh" #include "hb-ot-layout-gpos-table.hh" +#include "hb-ot-var-avar-table.hh" #include "hb-ot-var-cvar-table.hh" #include "hb-ot-var-fvar-table.hh" #include "hb-ot-var-gvar-table.hh" @@ -516,6 +517,9 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_fvar: if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); return _subset (plan, buf); + case HB_OT_TAG_avar: + if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); + return _subset (plan, buf); case HB_OT_TAG_STAT: if (!plan->user_axes_location.is_empty ()) return _subset (plan, buf); else return _passthrough (plan, tag); -- cgit v1.2.3 From 36c7ec443b9e5881502f2056331abb6c8508db28 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jul 2023 18:56:46 -0600 Subject: [sanitize] Simplify a return --- src/hb-sanitize.hh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 2d338c51c..8d9ecce8d 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -258,7 +258,8 @@ struct hb_sanitize_context_t : this->max_ops = -1; return false; } - return (this->max_ops -= (int) count) > 0; + this->max_ops -= (int) count; + return true; } #ifndef HB_OPTIMIZE_SIZE -- cgit v1.2.3 From e8948a4e86902202005193f5859980e6602ff2b4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 20 Jul 2023 22:12:53 -0600 Subject: [gsubgpos] Fix optimization Fixes https://github.com/harfbuzz/harfbuzz/issues/4336 --- src/hb-ot-layout-gsubgpos.hh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index bc793ebf3..c48a8b2cf 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -3373,7 +3373,12 @@ struct ChainRuleSet return_trace ( + hb_iter (rule) | hb_map (hb_add (this)) - | hb_filter ([&] (const ChainRule &_) { return _.inputX.lenP1 <= 1 && _.lookaheadX.len == 0; }) + | hb_filter ([&] (const ChainRule &_) + { + const auto &input = StructAfter (_.backtrack); + const auto &lookahead = StructAfter (input); + return input.lenP1 <= 1 && lookahead.len == 0; + }) | hb_map ([&] (const ChainRule &_) { return _.apply (c, lookup_context); }) | hb_any ) -- cgit v1.2.3 From c91899be14c82ae3d27c4cba2a1b920b6989a4f7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 21 Jul 2023 11:43:47 -0600 Subject: [gdef] Use set-digest for mark-filterint-sets Speeds up Noto Duployan-Regular.otf by 45% percent! --- src/OT/Layout/GDEF/GDEF.hh | 33 +++++++++++++++++++++++++++++++++ src/hb-null.hh | 2 +- src/hb-ot-layout-gsubgpos.hh | 2 +- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/OT/Layout/GDEF/GDEF.hh b/src/OT/Layout/GDEF/GDEF.hh index d995ba0d4..4f85d3ce5 100644 --- a/src/OT/Layout/GDEF/GDEF.hh +++ b/src/OT/Layout/GDEF/GDEF.hh @@ -439,6 +439,16 @@ struct MarkGlyphSetsFormat1 bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; } + template + void collect_coverage (hb_vector_t &sets) const + { + for (const auto &offset : coverage) + { + const auto &cov = this+offset; + cov.collect_coverage (sets.push ()); + } + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); @@ -492,6 +502,15 @@ struct MarkGlyphSets } } + template + void collect_coverage (hb_vector_t &sets) const + { + switch (u.format) { + case 1: u.format1.collect_coverage (sets); return; + default:return; + } + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); @@ -856,6 +875,10 @@ struct GDEF hb_blob_destroy (table.get_blob ()); table = hb_blob_get_empty (); } + +#ifndef HB_NO_GDEF_CACHE + table->get_mark_glyph_sets ().collect_coverage (mark_glyph_set_digests); +#endif } ~accelerator_t () { table.destroy (); } @@ -879,8 +902,18 @@ struct GDEF } + bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const + { + return +#ifndef HB_NO_GDEF_CACHE + mark_glyph_set_digests[set_index].may_have (glyph_id) && +#endif + table->mark_set_covers (set_index, glyph_id); + } + hb_blob_ptr_t table; #ifndef HB_NO_GDEF_CACHE + hb_vector_t mark_glyph_set_digests; mutable hb_cache_t<21, 3, 8> glyph_props_cache; #endif }; diff --git a/src/hb-null.hh b/src/hb-null.hh index 298251628..342f9db76 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -37,7 +37,7 @@ /* Global nul-content Null pool. Enlarge as necessary. */ -#define HB_NULL_POOL_SIZE 520 +#define HB_NULL_POOL_SIZE 640 template struct _hb_has_min_size : hb_false_type {}; diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index c48a8b2cf..0139927b6 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -818,7 +818,7 @@ struct hb_ot_apply_context_t : * match_props has the set index. */ if (match_props & LookupFlag::UseMarkFilteringSet) - return gdef.mark_set_covers (match_props >> 16, glyph); + return gdef_accel.mark_set_covers (match_props >> 16, glyph); /* The second byte of match_props has the meaning * "ignore marks of attachment type different than -- cgit v1.2.3 From 55f41e287f8ff846584269cb0dbbc730402cab75 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 21 Jul 2023 12:10:46 -0600 Subject: [perf] Add duployan.txt From https://kaltashwawa.ca/2022/01/20/lovecraft-in-chinook-puspus-kopa-ulthar-tawn/ --- perf/texts/duployan.txt | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 perf/texts/duployan.txt diff --git a/perf/texts/duployan.txt b/perf/texts/duployan.txt new file mode 100644 index 000000000..f330fc909 --- /dev/null +++ b/perf/texts/duployan.txt @@ -0,0 +1,27 @@ +𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰅𛱄‌𛰂𛱁 𛱛𛰆𛰑𛱁𛰋 𛰃𛱚𛰚 + +𛱇𛰣 𛰂𛱆 𛰆𛱄𛰉𛰅𛰋𛱁𛰄𛰃 + +𛱁𛰆𛱇𛰅𛰜 𛰅𛱄𛰈 𛱊𛱁‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛱛‌𛰅𛱛𛰅 𛰜𛱇𛱇‌𛰜𛱇𛰙 𛰅𛱄‌𛰂𛱁 𛰣𛱇‌𛰚𛱛𛰅 + +𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱜‌𛱜 𛰅𛱄‌𛰂𛱁 𛱛𛰆𛰑𛱁𛰋 𛰃𛱚𛰚 𛱆‌𛰚𛱁‌𛰃𛱁𛱆 𛰅𛱄‌𛰂𛱁 𛰜𛰅𛱂𛱆 𛰜𛰃𛱂‌𛰆𛱄͏͏͏, 𛱞𛰅 𛰃𛰆𛱛𛰜 𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰅‌𛰜𛰃𛱂 𛰙𛱁‌𛰙𛱛𛰅 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜; 𛰂𛱆 𛰚𛱁𛱋‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰚𛱁‌𛱞‌𛰃𛰅𛱁, 𛰂𛱛͏͏͏𛰜 𛰚𛱁𛱋‌𛰅𛱁 𛰚𛱁‌𛰚𛱇𛰣 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛱇𛰆𛱇𛰂 𛰅𛱄‌𛰂𛱁 𛰂𛱁‌𛱊𛱁 𛰂𛱆 𛱜‌𛱜 𛰅𛱁‌𛰅𛱜 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛰅𛱁‌𛰅𛱜 𛰂𛱛͏͏͏𛰜 𛱆𛰂‌𛰜𛱛𛰃 𛱛‌𛰅𛱛𛰅 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛰅𛱁‌𛰚𛱁‌𛱞 𛱆𛰅‌𛰃𛱂 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜: 𛱛‌𛰅𛱛𛰅 𛰚𛰜𛱁𛱆‌𛰅𛱁 𛱇𛰆𛱄͏͏͏ 𛰚𛱁‌𛰚𛱇𛰣. 𛱁‌𛱊𛱁𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰚𛱇𛰙 𛰅𛱄‌𛰂𛱁 𛱇𛰛𛱇𛰂𛰃 𛱇𛰆𛱇‌𛰀𛱇. 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛰅𛱁‌𛰃𛱂 𛱛‌𛰅𛱛𛰅 𛱁𛰚‌𛰅𛱁‌𛰃𛱇 𛰃𛱚𛰚 𛰙𛱇𛰋𛱄𛱆 𛰂𛱆 𛱄͏͏͏𛰄𛱆𛰋. 𛱛‌𛰅𛱛𛰅 𛰃𛱂‌𛱇𛱇 𛰅𛱄‌𛰂𛱁 𛰜𛰃𛱇𛰅, 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙, 𛰂𛱆 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛰅𛱁‌𛰚𛱁‌𛱞 𛱆𛰅‌𛰃𛱂 𛱆𛰂‌𛰜𛱛𛰃 𛰅𛱄‌𛰂𛱁 𛱂𛰄𛰋𛱇𛰅𛱁. 𛱞𛰀𛰃 𛰜𛰄𛱆𛰚𛰅𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙, 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛱊𛱁‌𛰅𛱁 𛱜‌𛱜; 𛰂𛱆 𛱇𛰆𛱇𛰂 𛰅𛱄‌𛰂𛱁 𛰜𛰄𛱆𛰚𛰅𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛱇𛰆𛱇‌𛰀𛱇, 𛰂𛱆 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱁𛰛 𛰃𛱄𛰙‌𛰃𛱄𛰙 𛱆𛰅‌𛰃𛱂 𛱁𛰚‌𛰅𛱁‌𛰃𛱇 𛰜𛰄𛱆𛰚𛰅𛰜 𛰙𛱁𛰛 𛰃𛱄𛰙‌𛰃𛱄𛰙. + +𛰅𛱄‌𛰂𛱁 𛱛𛰆𛰑𛱁𛰋 𛰃𛱚𛰚 𛱇𛰆𛱇𛰂 𛰂𛱛͏͏͏𛰜 𛰃𛱂‌𛱇𛱇 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛱄‌𛰂𛱁 𛱛𛰆𛰑𛱁𛰋 𛰙𛱁‌𛰙𛱛𛰅 𛰆𛱄͏͏͏ 𛰂𛱛͏͏͏𛰜 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰜𛰅‌𛰜𛰃𛱂 𛰙𛱁‌𛰙𛱛𛰅 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜, 𛱆𛰀𛰃 𛱄𛰆‌𛰙𛱁𛰚 𛰂𛱆 𛱊𛱁‌𛰅𛱁 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚 𛱁‌𛱊𛱁𛰜 𛰃𛱇‌𛰅𛱆 𛱇𛰜‌𛰅𛱄𛰙 𛰂𛱆 𛰙𛱁‌𛰙𛱛𛰅 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛱇𛰆𛱄͏͏͏ 𛰚𛱁𛱋‌𛰅𛱁 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛱆𛰅‌𛰃𛱂 𛰙𛱁‌𛰙𛱛𛰅 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰅𛱁‌𛰅𛱜; 𛰅𛱄‌𛰂𛱆𛰃 𛰚𛱁𛱋‌𛰅𛱁 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛰂𛱛͏͏͏𛰜 𛱁‌𛱑 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛱇𛰆𛱄͏͏͏ 𛰃𛱇‌𛰅𛱆 𛱛‌𛰅𛱛𛰅 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛱜‌𛱜 𛰅𛱄‌𛰂𛱁 𛰂𛱛‌𛰆𛱂‌𛰅𛰆𛱇 𛰂𛱆 𛱆𛰂‌𛰜𛱛𛰃 𛰅𛱛‌𛰆𛱇 𛰅𛱄‌𛰂𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰊𛱁𛰋𛰈𛱇𛰚 𛰂𛱆 𛱇𛰆𛱇‌𛰀𛱇. 𛰅𛱁𛰆‌𛰃𛱁𛰛 𛰂𛱛͏͏͏𛰜 𛰅𛱁‌𛰅𛱜, 𛱛‌𛰅𛱛𛰅 𛰙𛱁𛰚 𛰂𛱆 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚 𛱁‌𛱊𛱁𛰜 𛰃𛱇‌𛰅𛱆 𛱇𛰜‌𛰅𛱄𛰙 𛰂𛱆 𛰙𛱁‌𛰙𛱛𛰅 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛰅𛱁‌𛰚𛱁‌𛱞 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛱞𛰅 𛰜𛱁‌𛱊𛱁 𛰅𛱄‌𛰂𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱂‌𛰚𛱁𛰜 𛰀𛱚𛰜. 𛰂𛱛‌𛰆𛱂‌𛰅𛰆𛱇 𛰈𛰋𛱇𛰃 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛱜‌𛱜 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰔𛱄‌𛰆𛱁𛰚 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰃𛱂‌𛰚𛱁𛰜 𛰀𛱚𛰜: 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰅‌𛰜𛰃𛱂 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛰅𛱁‌𛰃𛱂 𛰂𛱛͏͏͏𛰜 𛱛‌𛰅𛱛𛰅 𛰙𛱁𛰚 𛰂𛱆 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚 𛰙𛱁‌𛰙𛱛𛰅 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛱛‌𛰅𛱛𛰅 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛰂𛱆 𛱇𛰆𛱄͏͏͏ 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛱜‌𛱜 𛱆𛰅‌𛰃𛱂 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰙𛱁𛰚 𛰂𛱆 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚. 𛱞𛰅 𛰃𛰆𛱛𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰜𛱇𛱂‌𛰀𛱛𛰜 𛱛‌𛰅𛱛𛰅 𛰙𛱁𛰚 𛰂𛱆 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚 𛰂𛱆 𛰅𛱁‌𛰅𛱜 𛰂𛱛͏͏͏𛰜 𛱆𛰂‌𛰜𛱛𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱂‌𛰚𛱁𛰜 𛰀𛱚𛰜 𛰅𛱆‌𛰅𛱛‌𛰆𛱇 𛰅𛱄‌𛰂𛱁 𛱁‌𛱊𛱁𛰜 𛰜𛰃𛱇𛰅 𛰅𛱄‌𛰂𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱁𛰆‌𛰃𛱁𛰛 𛱇𛰆𛱇‌𛰀𛱇. 𛱇𛰆𛱄͏͏͏ 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰃𛱇‌𛰅𛱆 𛱛‌𛰅𛱛𛰅 𛰙𛱄𛰅𛰜𛰃 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙. 𛰂𛱆 𛱇𛰆𛱇𛰂 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱜͏͏͏𛰛 𛰅𛰆𛱁𛰜‌𛰅𛱁. 𛱇𛰆𛱄͏͏͏ 𛱆𛰅‌𛰃𛱂 𛰜𛱁‌𛰆𛱇𛰅𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱜‌𛱜 𛰅𛱄‌𛰂𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁. 𛰅𛱄‌𛰂𛱆𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛰆𛱛𛰜 𛰚𛱁‌𛰚𛱇𛰣 𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰜𛱁‌𛱊𛱁 𛰅𛱄‌𛰂𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱂‌𛰚𛱁𛰜 𛰀𛱚𛰜 𛰅𛱆‌𛰅𛱛‌𛰆𛱇 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰜𛰃𛱇𛰅. 𛰂𛱛͏͏͏𛰜 𛱆𛰀𛰃 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱂‌𛰃𛱜͏͏͏ 𛰅𛱄‌𛰂𛱁 𛱊𛱁‌𛱜 𛰂𛱆 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰔𛱄‌𛰆𛱁𛰚 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛱜‌𛱜 𛰅𛱄‌𛰂𛱁 𛰀𛱚𛰜, 𛰅𛱄‌𛰂𛱆𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱁‌𛱑 𛱜‌𛱜. 𛰂𛱆 𛰅𛱄‌𛰂𛱁 𛰅𛱁𛰆‌𛰃𛱁𛰛 𛱛‌𛰅𛱛𛰅. 𛰅𛱄‌𛰂𛱆𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱜‌𛱜 𛰙𛱇𛰋𛰜𛱇 𛰂𛱛͏͏͏𛰜 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱂‌𛰚𛱁𛰜 𛰅𛰆𛱂‌𛰃𛱜͏͏͏ 𛰅𛱄‌𛰂𛱁 𛱊𛱁‌𛱜 𛰂𛱆 𛰣𛱁‌𛰅𛱄 𛱇𛰆𛱄͏͏͏. 𛱇𛰆𛱄͏͏͏ 𛱁‌𛱑 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜. 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛰅𛱄‌𛰂𛱁 𛰅𛱁𛰀 𛰣𛱁‌𛰅𛱄 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. + +𛱆𛰀𛰃 𛰜𛱄𛰚 𛱁‌𛱑 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰔𛱄 𛰅𛱄‌𛰂𛱁 𛱛𛰆𛰑𛱁𛰋 𛰃𛱚𛰚 𛱊𛱁‌𛰅𛱁 𛰜𛰃𛱄𛰚 𛱄𛱇‌𛰀𛱁𛰃. 𛱇𛰆𛱄͏͏͏ 𛰅𛱁‌𛰅𛱜 𛱛‌𛰅𛱛𛰅 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛱜‌𛰚𛱇‌𛰜𛱇𛰙 𛰚𛱁‌𛰚𛱇𛰣 𛰅𛱄‌𛰂𛱁 𛱄𛱇‌𛰀𛱁𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁. 𛰅𛱄‌𛰂𛱁 𛰙𛱁‌𛰅𛱛𛰅 𛰀𛱚𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱂‌𛰙𛱁‌𛰚𛱜͏͏𛰜: 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱜‌𛱜 𛱆𛰅‌𛰃𛱂 𛱁𛰆‌𛰅𛱆 𛰣𛱁‌𛰅𛱄 𛰂𛱆 𛰙𛱁‌𛰅𛱛𛰅 𛰃𛰆𛱛𛰜 𛰅𛱁‌𛰙𛱄‌𛰜𛱁𛰅. 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰅‌𛰜𛰃𛱂 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛱆𛰅‌𛰃𛱂 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱇𛰆𛱇‌𛰀𛱇. 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰜𛰅𛱛‌𛰅𛱛𛰙 𛰃𛱄𛰙‌𛰃𛱄𛰙 𛰅𛱄‌𛰂𛱁 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰜𛰃𛱒‌𛱇𛰆 𛱛‌𛰅𛱛𛰅 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙, 𛰂𛱆 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰂𛱆𛰚𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰥𛱇𛰅‌𛰥𛱇𛰅 𛰅𛱄‌𛰂𛱁 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰂𛱆 𛰙𛱛𛰜‌𛰙𛱛𛰜 𛰆𛱂‌𛰃𛱇𛰃, 𛰅𛱁𛰆𛱂‌𛰅𛱁𛰆𛱂, 𛰙𛱁𛰚 𛰆𛱂‌𛰙𛱛‌𛰃𛱄͏͏͏, 𛰂𛱆 𛰆𛱁𛱆𛰚𛰜. 𛰃𛱂‌𛱇𛱇 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰆𛱄͏͏͏‌𛰆𛱄͏͏͏ 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰜𛱇𛱂‌𛰂𛱛𛰃𛰆 𛰅𛱄‌𛰂𛱁 𛰙𛱄𛰅𛰜𛰃 𛰀𛱄𛰋𛰚 𛰂𛱆 𛱆𛰀𛰃 𛰅𛱄‌𛱑‌𛰅𛱄‌𛱑 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰅𛱁‌𛰚𛱁‌𛰙𛱄𛰅𛰜𛰃 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰀𛱄𛰋𛰚. + +𛰅𛱁‌𛰚𛱁‌𛰙𛱄𛰅𛰜𛰃 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛱆𛰀𛰃 𛰃𛱂‌𛰚𛱁𛰜 𛰙𛱁𛰚; 𛱇𛰆𛱄͏͏͏ 𛱊𛱁‌𛰅𛱁 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰙𛱁‌𛰙𛱁 𛰂𛱆 𛰂𛱁‌𛰂𛱁, 𛰅𛱄‌𛰂𛱆𛰃 𛱆𛰀𛰃 𛰃𛱂‌𛰚𛱁𛰜 𛰃𛰆𛱇𛰆 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛱊𛱁‌𛰅𛱁 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃. 𛰂𛱆 𛱊𛱁‌𛰅𛱁 𛱁‌𛱊𛱁𛰜 𛰃𛱇‌𛰅𛱆 𛱛‌𛰅𛱛𛰅 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛱁‌𛱊𛱁𛰜 𛰜𛱇𛰅 𛰙𛱁‌𛰙𛱛𛰅 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛱊𛱁‌𛰅𛱁 𛰙𛱁‌𛰙𛱁 𛰂𛱆 𛰂𛱁‌𛰂𛱁, 𛰂𛱆 𛰅𛱄‌𛰂𛱆𛰃 𛱛‌𛰅𛱛𛰅 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰙𛱁‌𛰙𛱛𛰅 𛰃𛰆𛱛𛰜 𛱊𛱁‌𛰅𛱁 𛰃𛱄𛰙‌𛰃𛱄𛰙 𛱁𛰆‌𛰃𛱂. 𛰅𛱁‌𛰚𛱁‌𛱞 𛰃𛱂‌𛰚𛱁𛰜 𛱁‌𛱊𛱁𛰜 𛰃𛱇‌𛰅𛱆 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰂𛱆 𛰃𛱇‌𛰅𛱆 𛰚𛱁‌𛰚𛱇𛰣 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰂𛰆𛱇. 𛰅𛱁‌𛰅𛱜, 𛱇𛰆𛱄͏͏͏ 𛱁‌𛱑 𛱊𛱁‌𛰅𛱁 𛰅𛰋𛱁𛱆. 𛱛‌𛰅𛱛𛰅 𛰃𛱂‌𛰚𛱁𛰜 𛰙𛱁𛰚 𛱊𛱁‌𛰅𛱁 𛰚𛱇𛰙 𛰙𛱇𛰚𛱇𛰜 𛰃𛰆𛱛𛰜 𛰃𛱄𛰙‌𛰃𛱄𛰙 𛰂𛱛͏͏͏𛰜 𛱊𛱁‌𛰅𛱁 𛰂𛰆𛱇 𛰅𛱄‌𛰂𛱁 𛱊𛱁‌𛰅𛱁 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛱞𛰅 𛰜𛱁‌𛱊𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰥𛱇𛰅‌𛰥𛱇𛰅. + +𛰣𛱁‌𛰅𛱄 𛰃𛰆𛱛𛰚 𛰃𛱂‌𛰚𛱁𛰜 𛰜𛱄𛰚 𛰅𛱁𛰀 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛱛𛰆𛰑𛱁𛰋 𛰃𛱚𛰚, 𛰂𛱆 𛱞𛰅 𛰅𛱁‌𛰃𛱂 𛰙𛱇𛰚𛱇𛰜 𛰃𛰆𛱁𛰂 𛱊𛱁‌𛰅𛱁 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛰂𛱛͏͏͏𛰜 𛱊𛱁‌𛰅𛱁 𛰅𛰋𛱁𛱆 𛰅𛱄‌𛰂𛱁 𛰙𛱁‌𛰅𛱛𛰅 𛰀𛱚𛰜, 𛰅𛱁𛰚‌𛰜𛱇𛰀 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰙𛱁‌𛰙𛱛𛰅 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛰅𛱄‌𛰂𛱁 𛱊𛱁‌𛰅𛱁 𛰅𛱁‌𛰃𛱂 𛱛‌𛰅𛱛𛰅 𛱄𛰆‌𛰙𛱁𛰚 𛰂𛱆 𛱊𛱁‌𛰅𛱁 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚, 𛰂𛱆 𛱞𛰀𛰃 𛰅𛱁‌𛰃𛱂 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛱜‌𛱜 𛰅𛱄‌𛰂𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰀𛱚𛰜 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰔𛱄‌𛰆𛱁𛰚 𛱛‌𛰅𛱛𛰅 𛰂𛱛‌𛰆𛱂‌𛰅𛰆𛱇. 𛰂𛱛͏͏͏𛰜 𛰙𛱇𛰚𛱇𛰜 𛰔𛱄‌𛰆𛱁𛰚 𛱛‌𛰅𛱛𛰅 𛰜𛱇𛱇‌𛰜𛱇𛰙, 𛱊𛱁‌𛰅𛱁 𛰅𛱄‌𛰂𛱆𛰃 𛰅𛰋𛱁𛱆. 𛰣𛱇 𛱊𛱁‌𛰅𛱁 𛰜𛰃𛱒‌𛱇𛰆. 𛱊𛱁‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰜𛱁‌𛰀𛱁‌𛰆𛱇 𛱊𛱁‌𛰅𛱁 𛰆𛱇‌𛰙𛱁 𛰅𛱄‌𛰂𛱁 𛰜𛰅𛱂𛱆 𛰂𛱆 𛱜‌𛱜 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰆𛱂‌𛰆𛱁𛰚𛰊 𛰜𛰃𛱒‌𛱇𛰆: 𛱇𛰆𛱄͏͏͏ 𛱛‌𛰅𛱛𛰅 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛱆𛰅‌𛰃𛱂 𛱊𛱁‌𛰅𛱁 𛱜‌𛱜. 𛰂𛱆 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱇‌𛰅𛱆 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜. 𛰅𛱄‌𛰂𛱆𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰚𛱁‌𛰚𛱇𛰣 𛰜𛱁‌𛰀𛱁‌𛰆𛱇: 𛱛‌𛰅𛱛𛰅 𛰜𛰅𛱂𛱆 𛰂𛱆 𛰅𛰆𛱚𛰈𛰜 𛰣𛱁‌𛰅𛱄 𛰀𛰆𛱄𛱆‌𛰙𛱁. 𛱁‌𛱊𛱁𛰜 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛱛‌𛰅𛱛𛰅. 𛰂𛱛͏͏͏𛰜 𛱛‌𛰅𛱛𛰅 𛰃𛱂‌𛰚𛱁𛰜 𛰙𛱁𛰚 𛰜𛰃𛱒‌𛱇𛰆, 𛱛‌𛰅𛱛𛰅 𛰅𛰆𛱚𛰈𛰜 𛰣𛱁‌𛰅𛱄 𛰅𛱁‌𛰅𛱜 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰙𛱁‌𛱞𛰣: 𛰅𛱁‌𛰅𛱜 𛱁‌𛱑 𛰙𛱁‌𛱞𛰣 𛰣𛱁‌𛰅𛱄 𛰙𛱇𛰅𛰜𛰃 𛰅𛱁‌𛰚𛱁‌𛰙𛱄𛰅𛰜𛰃. 𛰂𛱆 𛰅𛱜‌𛰚𛱇‌𛰜𛱇𛰙 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰚𛱁‌𛰚𛱇𛰣 𛱆𛰅‌𛰃𛱂 𛰅𛱁‌𛰅𛱜 𛰂𛱛͏͏͏𛰜 𛰃𛱛͏͏͏‌𛰙𛱁𛰣 𛰚𛱁‌𛱞‌𛰃𛰅𛱁 𛰃𛱄𛰙‌𛰃𛱄𛰙 𛰅𛰆𛱁𛰜‌𛰅𛱁… + +𛱛‌𛰅𛱛𛰅 𛰂𛱛‌𛰆𛱂‌𛰅𛰆𛱇 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰙𛱁𛰛 𛱛𛰆𛰑𛱁𛰋 𛰃𛱚𛰚 𛰂𛱆 𛱞𛰅 𛰅𛱁𛰚‌𛰜𛱇𛰀 𛱞𛰀𛰃 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰚𛱁‌𛰚𛱇𛰣 𛰅𛰆𛱁𛰜‌𛰅𛱁. 𛰂𛱆 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰣𛱁‌𛰅𛱄 𛰅𛱜͏͏͏𛰛: 𛱇𛰆𛱄͏͏͏ 𛱆𛰀𛰃 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰚𛱁‌𛰚𛱇𛰣 𛰅𛱄‌𛰂𛱁 𛰃𛱚𛰚. 𛰅𛱄‌𛰂𛱁 𛰅𛱁‌𛰚𛱁‌𛱞 𛰀𛱚𛰜 𛱛‌𛰅𛱛𛰅 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰣𛱁‌𛰅𛱄 𛱇𛰆𛱄͏͏͏: 𛱁‌𛱊𛱁𛰜 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰂𛱆 𛰃𛱂‌𛰚𛱁𛰜, 𛰃𛰆𛱇𛰆, 𛰆𛱇‌𛰊𛰆𛱇, 𛰆𛱇‌𛰅𛰋𛱇𛰙, 𛰃𛰆𛱇𛰆. 𛱄𛰆‌𛰙𛱁𛰚 𛰅𛰋𛱁𛰚𛱄𛰚, 𛰃𛱂‌𛱇𛱇 𛰅𛱄‌𛰂𛱁 𛰃𛱚𛰚, 𛱊𛱁‌𛰅𛱁 𛱜‌𛱜 𛰂𛱛͏͏͏𛰜 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛱁𛰂‌𛰛𛱜‌𛰆𛱂 𛱛‌𛰅𛱛𛰅 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛰅𛰆𛱛͏͏͏‌𛰚𛱁𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱇‌𛰅𛱆 𛰂𛱁‌𛰃𛰆𛱁𛰣 𛰆𛱂‌𛰂𛱆‌𛰆𛱇‌𛰃𛱁𛰜 𛰅𛱄‌𛰂𛱁 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙. 𛱊𛱁‌𛰅𛱁 𛰙𛱁‌𛰜𛱁‌𛰣𛱇 𛱜‌𛱜 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰂𛱆 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰥𛱇𛰅‌𛰥𛱇𛰅. 𛰂𛱆 𛱆𛰀𛰃 𛰙𛱁𛰚, 𛱊𛱁‌𛰅𛱁 𛰚𛱇𛰙 𛰚𛱇𛰑 𛰂𛱆 𛱊𛱁‌𛰅𛱁 𛰃𛰆𛱛𛰜 𛰚𛱁‌𛰚𛱇𛰣 𛰂𛱆‌𛰂𛱁, 𛱊𛱁‌𛰅𛱁 𛱜‌𛱜 “𛰃𛰆𛱛𛰜 𛱛‌𛰅𛱛𛰅 𛰙𛱁‌𛰜𛱁‌𛰣𛱇 𛰙𛱁𛰚 𛰂𛱆 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚 𛰃𛰆𛱁𛰂 𛱛‌𛰅𛱛𛰅 𛰆𛱂‌𛰂𛱆‌𛰆𛱇‌𛰃𛱁𛰜”. 𛰂𛱆 𛰚𛱁‌𛱞‌𛰃𛰅𛱁 𛱛‌𛰅𛱛𛰅 𛰙𛱁𛰚 𛰂𛱆 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚 𛰅𛱜‌𛰚𛱇‌𛰜𛱇𛰙 𛰙𛱁‌𛰙𛱛𛰅 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛱇𛰆𛱇𛰂 𛱁‌𛱑 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛰂𛱆 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰅‌𛰜𛰃𛱂 𛰃𛱇‌𛰅𛱆 𛰙𛱁‌𛰙𛱛𛰅 𛰅𛱄𛰋𛰃 𛰀𛱚𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁. 𛱞𛰀𛰃 𛰇𛱁𛰋𛰅𛱆𛰂 𛱊𛱁‌𛰅𛱁 𛰃𛱂‌𛰚𛱁𛰜 𛰙𛱁𛰚 𛱁𛰃𛱁𛰆 𛱜‌𛱜 𛰂𛱛͏͏͏𛰜 𛰆𛱁𛰜𛰃 𛰂𛱛‌𛰆𛱂‌𛰅𛰆𛱇 𛱊𛱁‌𛰅𛱁 𛰚𛱁‌𛰚𛱇𛰣 𛰅𛱁‌𛰚𛱁‌𛱞 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰅𛰆𛱂‌𛰀𛱁‌𛰚𛱇 𛰅𛱄‌𛰂𛱁 𛰙𛱁‌𛰜𛱁‌𛰣𛱇 𛰙𛱁𛰚 𛱊𛱁‌𛰅𛱁 𛰀𛱚𛰜, 𛰅𛱆‌𛰅𛱛‌𛰆𛱇 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰜𛰃𛱇𛰅. 𛰃𛰆𛱂‌𛱜 𛱛‌𛰅𛱛𛰅 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱂‌𛰃𛱜͏͏͏ 𛰋𛱚𛰚 𛱛‌𛰅𛱛𛰅 𛰀𛱚𛰜. 𛰙𛱄𛰅𛰜𛰃 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰅𛱆𛰙‌𛰃𛱂 𛰅𛱄‌𛰂𛱁 𛰙𛱄𛰅𛰜𛰃 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜, 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛰆𛱂‌𛰃𛱜͏͏͏ 𛰋𛱚𛰚. 𛰅𛱁‌𛰅𛱜 𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰙𛱁‌𛱞𛰣 𛰃𛱂‌𛰙𛱁‌𛰚𛱜͏͏𛰜. 𛱇𛰆𛱄͏͏͏ 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛱄𛰙‌𛰃𛱁𛰅𛰜 𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰚𛱁‌𛱞‌𛰃𛰅𛱁 𛱛‌𛰅𛱛𛰅 𛰃𛱂‌𛰚𛱁𛰜 𛰙𛱁𛰚. 𛰈𛰋𛱇𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱜͏͏͏𛰛 𛱛‌𛰅𛱛𛰅 𛱄𛰆‌𛰙𛱁𛰚 𛰂𛱆 𛰅𛱄‌𛰂𛱆𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛱇‌𛰅𛱆 𛰙𛱁‌𛰙𛱛𛰅 𛰅𛱄𛰋𛰃 𛰀𛱚𛰜 𛱊𛱁‌𛰅𛱁 𛰂𛱛͏͏͏𛰜 𛱊𛱁‌𛰅𛱁 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰅𛰆𛱂‌𛰀𛱁‌𛰚𛱇 𛰅𛱄‌𛰂𛱁 𛱊𛱁‌𛰅𛱁 𛰀𛱚𛰜 𛰂𛱆 𛰜𛱁‌𛱊𛱁 𛰅𛱄‌𛰂𛱁 𛱊𛱁‌𛰅𛱁 𛰅𛱁𛰆‌𛰃𛱁𛰛 𛱇𛰆𛱇‌𛰀𛱇. + +𛰅𛱁‌𛰅𛱜, 𛰅𛱁𛰆‌𛰃𛱁𛰛 𛱛‌𛰅𛱛𛰅 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰣𛱁‌𛰅𛱄 𛰜𛱁‌𛰆𛱇𛰅𛰜, 𛰂𛱆 𛰅𛰆𛱂‌𛰃𛱜͏͏͏ 𛰜𛰆𛱇𛰂. 𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰊𛱆𛰃‌𛱄͏͏͏𛰂 𛰃𛱂‌𛰚𛱁𛰜 𛰜𛱄𛰚: 𛰀𛱜! 𛱞𛰀𛰃 𛰅𛱁‌𛰚𛱁‌𛱞 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰅𛱄‌𛰂𛱁 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰀𛱚𛰜! 𛱁‌𛱊𛱁𛰜 𛰂𛱆 𛰃𛱂‌𛰚𛱁𛰜, 𛰃𛰆𛱇𛰆, 𛰆𛱇‌𛰊𛰆𛱇, 𛰆𛱇‌𛰅𛰋𛱇𛰙, 𛰂𛱆 𛰃𛰅𛱄𛰂. 𛱇𛰆𛱄͏͏͏ 𛱆𛰀𛰃 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰣𛱁‌𛰅𛱄 𛱇𛰆𛱄͏͏͏. 𛰂𛱆 𛱁‌𛱊𛱁𛰜 𛰊𛰋𛱇𛰜 𛱛‌𛰅𛱛𛰅 𛰂𛱛‌𛰂𛱛͏͏͏𛰜, 𛰂𛱆 𛱁‌𛱊𛱁𛰜 𛰃𛰆𛱛𛰜 𛰃𛱄𛰙‌𛰃𛱄𛰙 𛰅𛰆𛱁𛰜‌𛰅𛱁. 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛱁‌𛱑 𛱜‌𛱜 𛰅𛱁‌𛰚𛱁‌𛰙𛱄𛰅𛰜𛰃 𛰅𛱁‌𛰃𛱂 𛱛‌𛰅𛱛𛰅, 𛰂𛱆 𛰃𛰆𛱁𛰂 𛰜𛰅𛱛‌𛰅𛱛𛰙 𛰃𛱄𛰙‌𛰃𛱄𛰙. 𛱄𛰆‌𛰙𛱁𛰚 𛰅𛰋𛱁𛰚𛱄𛰚 𛱞𛰀𛰃 𛱊𛱁‌𛰅𛱁 𛱜‌𛱜 𛰂𛱛͏͏͏𛰜 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛱁𛰂‌𛰛𛱜‌𛰆𛱂 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. 𛱞𛰅 𛰅𛱁𛰚‌𛰜𛱇𛰀 𛱁𛰚‌𛰅𛱁‌𛰃𛱇 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰅𛱆‌𛰆𛱂‌𛰂𛱂𛱆 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰙𛱁‌𛰜𛱁‌𛰣𛱇 𛰙𛱁𛰚 𛱊𛱁‌𛰅𛱁 𛰀𛱚𛰜. 𛰂𛱆 𛰅𛱁‌𛰚𛱁‌𛱞 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛱆𛰀𛰃 𛰃𛱄𛰙‌𛰃𛱄𛰙 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅: 𛱇𛰆𛱄͏͏͏ 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰃𛱇‌𛰅𛱆 𛰙𛱁𛰅‌𛰙𛱁𛰅 𛱛‌𛰅𛱛𛰅 𛰃𛱂‌𛰚𛱁𛰜 𛰜𛱄𛰚, 𛰂𛱆 𛱁‌𛱊𛱁𛰜 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛱛‌𛰅𛱛𛰅. 𛰙𛱄𛰅𛰜𛰃 𛰜𛱄𛰚 𛱛‌𛰅𛱛𛰅 𛰊𛰋𛱇𛰜 𛰂𛱆 𛰆𛱇‌𛰜𛱇 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛱇𛰆𛱄͏͏͏ 𛰃𛱇‌𛰅𛱆 𛰙𛱁𛰅‌𛰙𛱁𛰅: 𛰅𛱄‌𛰂𛱆𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱁𛰆‌𛰃𛱁𛰛 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛱞𛰅 𛰜𛱁‌𛱊𛱁 𛰅𛱄‌𛰂𛱁 𛰂𛱁‌𛱊𛱁 𛰂𛱆 𛰅𛱄‌𛰂𛱁 𛰜𛱄𛰚. + +𛰅𛱄‌𛰂𛱆𛰃 𛰅𛱁‌𛰚𛱁‌𛱞 𛱆𛰀𛰃 𛰜𛱄𛰚‌𛰈𛱇 𛰂𛱆 𛱛𛰆𛰑𛱁𛰋 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰚𛱁‌𛰚𛱇𛰣 𛱇𛰆𛱄͏͏͏ 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰆𛱂𛱆𛰃 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰙𛱁‌𛰜𛱁‌𛰣𛱇 𛰙𛱁𛰚 𛱊𛱁‌𛰅𛱁 𛰀𛱚𛰜 𛰅𛱆‌𛰅𛱛‌𛰆𛱇 𛰅𛱄‌𛰂𛱁 𛰜𛰃𛱇𛰅. 𛰃𛱂‌𛰚𛱁𛰜 𛰚𛱇𛰑 𛱜‌𛱜 𛰂𛱛͏͏͏𛰜, 𛰅𛱄‌𛰂𛱆𛰃 𛱛‌𛰅𛱛𛰅 𛰂𛱛‌𛰆𛱂‌𛰅𛰆𛱇 𛰅𛱁𛰀 𛰣𛱁‌𛰅𛱄 𛱇𛰆𛱄͏͏͏ 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜, 𛱇𛰆𛱄͏͏͏ 𛰅𛰆𛱁𛰅‌𛰜𛰃𛱂 𛰚𛱁‌𛰚𛱇𛰣 𛱛‌𛰅𛱛𛰅 𛱄𛰆‌𛰙𛱁𛰚 𛰂𛱆 𛱊𛱁‌𛰅𛱁 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚. 𛰅𛱄‌𛰂𛱆𛰃 𛱆𛰀𛰃 𛱞𛰀𛰃 𛰜𛱄𛰚‌𛰈𛱇 𛰂𛱆 𛰃𛱂‌𛱇𛱇 𛰅𛱄‌𛰂𛱁 𛰃𛱚𛰚 𛰙𛱁‌𛰙𛱛𛰅 𛰃𛱄𛰙‌𛰃𛱄𛰙 𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱂‌𛰃𛱜͏͏͏ 𛱜‌𛱜 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰙𛱄𛰅𛰜𛰃 𛰙𛱁‌𛰜𛱁‌𛰣𛱇 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙. 𛱊𛱁‌𛰅𛱁 𛰅𛰆𛱂‌𛰃𛱜͏͏͏ 𛰅𛱁‌𛰚𛱁‌𛰙𛱄𛰅𛰜𛰃 𛰛𛱁𛰚𛰊 𛰂𛱆 𛰑𛱛𛰆 𛰂𛱛͏͏͏𛰜 𛱞𛰀𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰚𛱁‌𛰚𛱇𛰣. 𛰛𛱁𛰚𛰊 𛰙𛱁‌𛰙𛱛𛰅 𛰣𛱇𛰅‌𛰙𛱇𛰚 𛱆𛰅‌𛰃𛱁𛰜 𛰂𛱆 𛰑𛱛𛰆 𛱊𛱁‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰅𛱑𛰃 𛰜𛰃𛱄𛰚. 𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛰀𛱁‌𛰆𛱁𛰅 𛱛‌𛰅𛱛𛰅 𛰀𛱚𛰜 𛱊𛱁‌𛰅𛱁 𛰆𛱂‌𛰂𛱄𛰋𛰃, 𛰅𛱄‌𛰂𛱆𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰚𛱁‌𛰚𛱇𛰣 𛱛‌𛰅𛱛𛰅: 𛰙𛱄𛰅𛰜𛰃 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰇𛱄𛰚 𛰙𛱆𛰃‌𛰆𛱂𛱆𛰃 𛰅𛱄‌𛰂𛱁 𛱇𛰆𛱇‌𛰀𛱇, 𛰂𛱆 𛰅𛱄‌𛰂𛱁 𛰂𛱛‌𛰆𛱂‌𛰅𛰆𛱇 𛰃𛱂‌𛰚𛱁𛰜 𛱁‌𛱑 𛰇𛱆‌𛰃𛱇𛰆 𛰅𛱛‌𛰆𛱇 𛰋𛱚𛰚. + +𛱊𛱁‌𛱜 𛰃𛱂‌𛱇𛱇 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛱄‌𛰂𛱁 𛱛𛰆𛰑𛱁𛰋 𛰃𛱚𛰚 𛱁‌𛱑 𛱜‌𛱜 𛰅𛱁‌𛰚𛱁‌𛰙𛱄𛰅𛰜𛰃. 𛰜𛱁𛰑, 𛱛‌𛰅𛱛𛰅 𛰙𛱁𛰚 𛱊𛱁‌𛰅𛱁 𛰃𛰆𛱛𛰜 𛰚𛱁‌𛰚𛱇𛰣 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛰃𛱇‌𛰆𛱇‌𛰅𛱛𛰙, 𛱁‌𛱑 𛱜‌𛱜 𛰅𛱁‌𛰚𛱁‌𛰙𛱄𛰅𛰜𛰃 𛰚𛱇𛰑, 𛱛‌𛰅𛱛𛰅 𛰙𛱁𛰚 𛱊𛱁‌𛰅𛱁 𛰃𛰆𛱛𛰜 𛰚𛱁‌𛰚𛱇𛰣 𛰂𛱆‌𛰂𛱁; 𛰅𛱁‌𛰚𛱁‌𛱞 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱁‌𛱑 𛱁𛰜𛰅 𛱄𛰆‌𛰙𛱁𛰚 𛰅𛰋𛱁𛰚𛱄𛰚 𛰂𛱆 𛰛𛱁𛰚𛰊 𛰂𛱆 𛰑𛱛𛰆. 𛱞𛰀𛰃 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱁‌𛱑 𛱁𛰜𛰅 𛰃𛱂‌𛰚𛱁𛰜 𛱁𛰃𛱁𛰆, 𛰇𛱁𛰋𛰅𛱆𛰂 𛱊𛱁‌𛰅𛱁 𛰃𛱂‌𛰚𛱁𛰜 𛰙𛱁𛰚, 𛰂𛱆 𛰂𛱁‌𛰃𛰆𛱁𛰣 𛰅𛱁𛰚‌𛰈𛱇 𛰅𛱄‌𛰂𛱁 𛱊𛱁‌𛰅𛱁. 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛱁‌𛱑 𛱜‌𛱜 𛰅𛱁‌𛰃𛱂 𛱛‌𛰅𛱛𛰅 𛰙𛱁‌𛰜𛱁‌𛰣𛱇 𛱄𛰆‌𛰙𛱁𛰚 𛰂𛱆 𛱊𛱁‌𛰅𛱁 𛰅𛰆𛱛𛰣‌𛰙𛱇𛰚, 𛰅𛱁‌𛰃𛱂 𛱛‌𛰅𛱛𛰅 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙, 𛰅𛱁‌𛰃𛱂 𛱛‌𛰅𛱛𛰅 𛰃𛱂‌𛰚𛱁𛰜 𛰙𛱇𛰚𛱇𛰜 𛰂𛱆 𛱊𛱁‌𛰅𛱁 𛰃𛰆𛱇𛰆 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜, 𛰅𛱁‌𛰃𛱂 𛰙𛱇𛰚𛱇𛰜 𛱊𛱁‌𛰅𛱁 𛰜𛰃𛱒‌𛱇𛰆, 𛰅𛱁‌𛰃𛱂 𛰜𛰅𛱂𛱆 𛰂𛱛͏͏͏𛰜 𛱊𛱁‌𛰅𛱁 𛰜𛰃𛱒‌𛱇𛰆, 𛱆𛰅‌𛰃𛱂 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜 𛰙𛱁‌𛰙𛱛𛰅 𛱛‌𛰅𛱛𛰅 𛰂𛱛‌𛰆𛱂‌𛰅𛰆𛱇 𛰅𛱁𛰀 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰙𛱁𛰛 𛱛𛰆𛰑𛱁𛰋 𛰃𛱚𛰚, 𛰂𛱆 𛱆𛰅‌𛰃𛱂 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰃𛰆𛱁𛰂 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰃𛱂‌𛰚𛱁𛰜 𛰀𛱚𛰜 𛰅𛱆‌𛰅𛱛‌𛰆𛱇 𛰅𛱄‌𛰂𛱁 𛰜𛰃𛱇𛰅 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰅𛱁𛰆‌𛰃𛱁𛰛 𛱇𛰆𛱇‌𛰀𛱇. + +𛰅𛱄‌𛰂𛱆𛰃 𛱛‌𛰅𛱛𛰅, 𛰃𛱂‌𛱇𛱇 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰙𛱁‌𛰙𛱛𛰅 𛱁‌𛱊𛱁𛰜 𛰀𛰆𛱄𛱆‌𛰙𛱁 𛰆𛱄͏͏͏: 𛰅𛱁‌𛰚𛱁‌𛱞 𛰅𛱄‌𛰂𛱁 𛰀𛱁𛰑𛱇𛰊 𛰙𛱁‌𛰅𛱛𛰅 𛰀𛱚𛰜 𛰂𛱆 𛱛‌𛰅𛱛𛰅 𛰃𛱇‌𛰆𛱇‌𛰅𛱄𛰙 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰅𛱛‌𛰆𛱇 𛰅𛱄‌𛰂𛱁 𛰚𛱇𛰋 𛱇𛰆𛱇‌𛰀𛱇 𛰅𛱜‌𛰚𛱇‌𛰜𛱇𛰙 𛱁‌𛱑 𛱜‌𛱜 𛰅𛱄‌𛰂𛱁 𛱛‌𛰅𛱛𛰅 𛰆𛱄͏͏͏. 𛰅𛰆𛱁𛰜‌𛰅𛱁 𛰙𛱁‌𛰙𛱛𛰅 𛱛‌𛰅𛱛𛰅 𛰆𛱄͏͏͏: 𛱞𛰅 𛰃𛰆𛱛𛰜 𛰂𛱛͏͏͏𛰜 𛰅𛰆𛱁𛰅‌𛰜𛰃𛱂 𛰙𛱁‌𛰙𛱛𛰅 𛰙𛱇𛰙‌𛰆𛱛𛰜 𛰂𛱛͏͏͏𛰜‌𛰂𛱛͏͏͏𛰜. + +𛰅𛱄‌𛰂𛱆𛰃 𛰅𛱁‌𛰅𛱜 𛱛‌𛰅𛱛𛰅 𛰜𛱇𛱇‌𛰜𛱇𛰙 -- cgit v1.2.3 From a32278acd89a5e29774c7a03b0d11b669cfbb3fc Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Sun, 23 Jul 2023 22:19:51 +0100 Subject: Fix example code --- docs/wasm-shaper.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/wasm-shaper.md b/docs/wasm-shaper.md index bc3740083..77df5c6e9 100644 --- a/docs/wasm-shaper.md +++ b/docs/wasm-shaper.md @@ -506,9 +506,9 @@ pub fn shape(_shape_plan:u32, font_ref: u32, buf_ref: u32, _features: u32, _num_ let mut buffer = GlyphBuffer::from_ref(buf_ref); for mut item in buffer.glyphs.iter_mut() { // Map character to glyph - item.codepoint = font.get_glyph(codepoint, 0); + item.codepoint = font.get_glyph(item.codepoint, 0); // Set advance width - item.h_advance = font.get_glyph_h_advance(item.codepoint); + item.x_advance = font.get_glyph_h_advance(item.codepoint); } 1 } -- cgit v1.2.3 From ca7e7e925b920ee54a0d0ad256f4a7daa0763684 Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Sun, 23 Jul 2023 22:20:09 +0100 Subject: Fix wasm-micro-runtime build instructions --- docs/wasm-shaper.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/wasm-shaper.md b/docs/wasm-shaper.md index 77df5c6e9..58a1d6495 100644 --- a/docs/wasm-shaper.md +++ b/docs/wasm-shaper.md @@ -370,17 +370,14 @@ Produces a debugging message in the host shaper's log output; the variants `debu ## Enabling the WASM shaper when building Harfbuzz -First, you will need the `wasm-micro-runtime` library installed on your computer. Download `wasm-micro-runtime` from [its GitHub repository](https://github.com/bytecodealliance/wasm-micro-runtime/tree/main); then follow [the instructions for building](https://github.com/bytecodealliance/wasm-micro-runtime/blob/main/product-mini/README.md), except add the `-DWAMR_BUILD_REF_TYPES=1` flag to the `cmake` line. (You may want to enable "fast JIT".) Follow this with a `make install`. +First, you will need the `wasm-micro-runtime` library installed on your computer. Download `wasm-micro-runtime` from [its GitHub repository](https://github.com/bytecodealliance/wasm-micro-runtime/tree/main); then follow [the instructions for building](https://github.com/bytecodealliance/wasm-micro-runtime/blob/main/product-mini/README.md), except run the cmake command from the repository root directory and add the `-DWAMR_BUILD_REF_TYPES=1` flag to the `cmake` line. (You may want to enable "fast JIT".) Then, install it. So, for example: ``` -$ cd product-mini/platforms/darwin -$ mkdir build -$ cd build -$ cmake .. -DWAMR_BUILD_REF_TYPES=1 -DWAMR_BUILD_FAST_JIT=1 -$ make -$ make install +$ cmake -B build -DWAMR_BUILD_REF_TYPES=1 -DWAMR_BUILD_FAST_JIT=1 +$ cmake --build build --parallel +$ sudo cmake --build build --target install ``` (If you don't want to install `wasm-micro-runtime` globally, you can copy `libiwasm.*` and `libvmlib.a` into a directory that your compiler can see when building Harfbuzz.) -- cgit v1.2.3 From 1a267f22ff3a608e5a8370224557268b0504f857 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 11:01:01 +0000 Subject: Bump fonttools from 4.41.0 to 4.41.1 in /.ci Bumps [fonttools](https://github.com/fonttools/fonttools) from 4.41.0 to 4.41.1. - [Release notes](https://github.com/fonttools/fonttools/releases) - [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst) - [Commits](https://github.com/fonttools/fonttools/compare/4.41.0...4.41.1) --- updated-dependencies: - dependency-name: fonttools dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .ci/requirements-fonttools.txt | 70 +++++++++++++++++++++--------------------- .ci/requirements.txt | 70 +++++++++++++++++++++--------------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/.ci/requirements-fonttools.txt b/.ci/requirements-fonttools.txt index 96e56a01c..345c41b80 100644 --- a/.ci/requirements-fonttools.txt +++ b/.ci/requirements-fonttools.txt @@ -4,39 +4,39 @@ # # pip-compile --generate-hashes .ci/requirements-fonttools.in # -fonttools==4.41.0 \ - --hash=sha256:0614b6348866092d00df3dfb37e037fc06412ca67087de361a2777ea5ed62c16 \ - --hash=sha256:06eac087ea55b3ebb2207d93b5ac56c847163899f05f5a77e1910f688fe10030 \ - --hash=sha256:19d461c801b8904d201c6c38a99bfcfef673bfdfe0c7f026f582ef78896434e0 \ - --hash=sha256:381558eafffc1432d08ca58063e71c7376ecaae48e9318354a90a1049a644845 \ - --hash=sha256:3ee75b8ca48f6c48af25e967dce995ef94e46872b35c7d454b983c62c9c7006d \ - --hash=sha256:415cf7c806a3f56fb280dadcf3c92c85c0415e75665ca957b4a2a2e39c17a5c9 \ - --hash=sha256:465d0f24bf4f75160f441793b55076b7a080a57d3a1f738390af2c20bee24fbb \ - --hash=sha256:4c654b1facf1f3b742e4d9b2dcdf0fa867b1f007b1b4981cc58a75ef5dca2a3c \ - --hash=sha256:50f8bdb421270f71b54695c62785e300fab4bb6127be40bf9f3084962a0c3adb \ - --hash=sha256:5448a87f6ed57ed844b64a05d3792827af584a8584613f6289867f4e77eb603b \ - --hash=sha256:560ea1a604c927399f36742abf342a4c5f3fee8e8e8a484b774dfe9630bd9a91 \ - --hash=sha256:5b1c2b21b40229166a864f2b0aec06d37f0a204066deb1734c93370e0c76339d \ - --hash=sha256:69178674505ec81adf4af2a3bbacd0cb9a37ba7831bc3fca307f80e48ab2767b \ - --hash=sha256:69dbe0154e15b68dd671441ea8f23dad87488b24a6e650d45958f4722819a443 \ - --hash=sha256:6faff25991dec48f8cac882055a09ae1a29fd15bc160bc3d663e789e994664c2 \ - --hash=sha256:72d40a32d6443871ea0d147813caad58394b48729dfa4fbc45dcaac54f9506f2 \ - --hash=sha256:7e22d0144d735f6c7df770509b8c0c33414bf460df0d5dddc98a159e5dbb10eb \ - --hash=sha256:841c491fa3e9c54e8f9cd5dae059e88f45e086aea090c28be9d42f59c8b99e01 \ - --hash=sha256:86edb95c4d1fe4fae2111d7e0c10c6e42b7790b377bcf1952303469eee5b52bb \ - --hash=sha256:8f602dd5bcde7e4241419924f23c6f0d66723dd5408a58c3a2f781745c693f45 \ - --hash=sha256:9387b09694fbf8ac7dcf887069068f81fb4124d05e09557ac7daabfbec1744bd \ - --hash=sha256:b329ae7ce971b5c4148d6cdb8119c0ce4587265b2330d4f2f3776ef851bee020 \ - --hash=sha256:ba2a367ff478cd108d5319c0dc4fd4eb4ea3476dbfc45b00c45718e889cd9463 \ - --hash=sha256:bc9e7b1e268be7a23fc66471b615c324e99c5db39ce8c49dd6dd8e962c7bc1b8 \ - --hash=sha256:c890061915e95b619c1d3cc3c107c6fb021406b701c0c24b03e74830d522f210 \ - --hash=sha256:cc3324e4159e6d1f55c3615b4c1c211f87cc96cc0cc7c946c8447dc1319f2e9d \ - --hash=sha256:d2dae84a3d0f76884a6102c62f2795b2d6602c2c95cfcce74c8a590b6200e533 \ - --hash=sha256:d45f28c20bb67dee0f4a4caae709f40b0693d764b7b2bf2d58890f36b1bfcef0 \ - --hash=sha256:e38bd91eae257f36c2b7245c0278e9cd9d754f3a66b8d2b548c623ba66e387b6 \ - --hash=sha256:e43f6c7f9ba4f9d29edee530e45f9aa162872ec9549398b85971477a99f2a806 \ - --hash=sha256:ea879afd1d6189fca02a85a7868560c9bb8415dccff6b7ae6d81e4f06b3ab30d \ - --hash=sha256:eb9dfa87152bd97019adc387b2f29ef6af601de4386f36570ca537ace96d96ed \ - --hash=sha256:efd59e83223cb77952997fb850c7a7c2a958c9af0642060f536722c2a9e9d53b \ - --hash=sha256:f3fe90dfb297bd8265238c06787911cd81c2cb89ac5b13e1c911928bdabfce0f +fonttools==4.41.1 \ + --hash=sha256:1df1b6f4c7c4bc8201eb47f3b268adbf2539943aa43c400f84556557e3e109c0 \ + --hash=sha256:2a22b2c425c698dcd5d6b0ff0b566e8e9663172118db6fd5f1941f9b8063da9b \ + --hash=sha256:33191f062549e6bb1a4782c22a04ebd37009c09360e2d6686ac5083774d06d95 \ + --hash=sha256:38cdecd8f1fd4bf4daae7fed1b3170dfc1b523388d6664b2204b351820aa78a7 \ + --hash=sha256:3ae64303ba670f8959fdaaa30ba0c2dabe75364fdec1caeee596c45d51ca3425 \ + --hash=sha256:3d1f9471134affc1e3b1b806db6e3e2ad3fa99439e332f1881a474c825101096 \ + --hash=sha256:4e3334d51f0e37e2c6056e67141b2adabc92613a968797e2571ca8a03bd64773 \ + --hash=sha256:4edc795533421e98f60acee7d28fc8d941ff5ac10f44668c9c3635ad72ae9045 \ + --hash=sha256:547ab36a799dded58a46fa647266c24d0ed43a66028cd1cd4370b246ad426cac \ + --hash=sha256:59eba8b2e749a1de85760da22333f3d17c42b66e03758855a12a2a542723c6e7 \ + --hash=sha256:704bccd69b0abb6fab9f5e4d2b75896afa48b427caa2c7988792a2ffce35b441 \ + --hash=sha256:73ef0bb5d60eb02ba4d3a7d23ada32184bd86007cb2de3657cfcb1175325fc83 \ + --hash=sha256:7763316111df7b5165529f4183a334aa24c13cdb5375ffa1dc8ce309c8bf4e5c \ + --hash=sha256:849ec722bbf7d3501a0e879e57dec1fc54919d31bff3f690af30bb87970f9784 \ + --hash=sha256:891cfc5a83b0307688f78b9bb446f03a7a1ad981690ac8362f50518bc6153975 \ + --hash=sha256:952cb405f78734cf6466252fec42e206450d1a6715746013f64df9cbd4f896fa \ + --hash=sha256:a7bbb290d13c6dd718ec2c3db46fe6c5f6811e7ea1e07f145fd8468176398224 \ + --hash=sha256:a9b3cc10dc9e0834b6665fd63ae0c6964c6bc3d7166e9bc84772e0edd09f9fa2 \ + --hash=sha256:aaaef294d8e411f0ecb778a0aefd11bb5884c9b8333cc1011bdaf3b58ca4bd75 \ + --hash=sha256:afce2aeb80be72b4da7dd114f10f04873ff512793d13ce0b19d12b2a4c44c0f0 \ + --hash=sha256:b0938ebbeccf7c80bb9a15e31645cf831572c3a33d5cc69abe436e7000c61b14 \ + --hash=sha256:b2d1ee95be42b80d1f002d1ee0a51d7a435ea90d36f1a5ae331be9962ee5a3f1 \ + --hash=sha256:b927e5f466d99c03e6e20961946314b81d6e3490d95865ef88061144d9f62e38 \ + --hash=sha256:bdd729744ae7ecd7f7311ad25d99da4999003dcfe43b436cf3c333d4e68de73d \ + --hash=sha256:c2071267deaa6d93cb16288613419679c77220543551cbe61da02c93d92df72f \ + --hash=sha256:cac73bbef7734e78c60949da11c4903ee5837168e58772371bd42a75872f4f82 \ + --hash=sha256:da2c2964bdc827ba6b8a91dc6de792620be4da3922c4cf0599f36a488c07e2b2 \ + --hash=sha256:e16a9449f21a93909c5be2f5ed5246420f2316e94195dbfccb5238aaa38f9751 \ + --hash=sha256:e5c2b0a95a221838991e2f0e455dec1ca3a8cc9cd54febd68cc64d40fdb83669 \ + --hash=sha256:ec453a45778524f925a8f20fd26a3326f398bfc55d534e37bab470c5e415caa1 \ + --hash=sha256:edee0900cf0eedb29d17c7876102d6e5a91ee333882b1f5abc83e85b934cadb5 \ + --hash=sha256:f14f3ccea4cc7dd1b277385adf3c3bf18f9860f87eab9c2fb650b0af16800f55 \ + --hash=sha256:f240d9adf0583ac8fc1646afe7f4ac039022b6f8fa4f1575a2cfa53675360b69 \ + --hash=sha256:f48602c0b3fd79cd83a34c40af565fe6db7ac9085c8823b552e6e751e3a5b8be # via -r requirements-fonttools.in diff --git a/.ci/requirements.txt b/.ci/requirements.txt index e585a585e..00c4437e1 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -4,41 +4,41 @@ # # pip-compile --generate-hashes .ci/requirements.in # -fonttools==4.41.0 \ - --hash=sha256:0614b6348866092d00df3dfb37e037fc06412ca67087de361a2777ea5ed62c16 \ - --hash=sha256:06eac087ea55b3ebb2207d93b5ac56c847163899f05f5a77e1910f688fe10030 \ - --hash=sha256:19d461c801b8904d201c6c38a99bfcfef673bfdfe0c7f026f582ef78896434e0 \ - --hash=sha256:381558eafffc1432d08ca58063e71c7376ecaae48e9318354a90a1049a644845 \ - --hash=sha256:3ee75b8ca48f6c48af25e967dce995ef94e46872b35c7d454b983c62c9c7006d \ - --hash=sha256:415cf7c806a3f56fb280dadcf3c92c85c0415e75665ca957b4a2a2e39c17a5c9 \ - --hash=sha256:465d0f24bf4f75160f441793b55076b7a080a57d3a1f738390af2c20bee24fbb \ - --hash=sha256:4c654b1facf1f3b742e4d9b2dcdf0fa867b1f007b1b4981cc58a75ef5dca2a3c \ - --hash=sha256:50f8bdb421270f71b54695c62785e300fab4bb6127be40bf9f3084962a0c3adb \ - --hash=sha256:5448a87f6ed57ed844b64a05d3792827af584a8584613f6289867f4e77eb603b \ - --hash=sha256:560ea1a604c927399f36742abf342a4c5f3fee8e8e8a484b774dfe9630bd9a91 \ - --hash=sha256:5b1c2b21b40229166a864f2b0aec06d37f0a204066deb1734c93370e0c76339d \ - --hash=sha256:69178674505ec81adf4af2a3bbacd0cb9a37ba7831bc3fca307f80e48ab2767b \ - --hash=sha256:69dbe0154e15b68dd671441ea8f23dad87488b24a6e650d45958f4722819a443 \ - --hash=sha256:6faff25991dec48f8cac882055a09ae1a29fd15bc160bc3d663e789e994664c2 \ - --hash=sha256:72d40a32d6443871ea0d147813caad58394b48729dfa4fbc45dcaac54f9506f2 \ - --hash=sha256:7e22d0144d735f6c7df770509b8c0c33414bf460df0d5dddc98a159e5dbb10eb \ - --hash=sha256:841c491fa3e9c54e8f9cd5dae059e88f45e086aea090c28be9d42f59c8b99e01 \ - --hash=sha256:86edb95c4d1fe4fae2111d7e0c10c6e42b7790b377bcf1952303469eee5b52bb \ - --hash=sha256:8f602dd5bcde7e4241419924f23c6f0d66723dd5408a58c3a2f781745c693f45 \ - --hash=sha256:9387b09694fbf8ac7dcf887069068f81fb4124d05e09557ac7daabfbec1744bd \ - --hash=sha256:b329ae7ce971b5c4148d6cdb8119c0ce4587265b2330d4f2f3776ef851bee020 \ - --hash=sha256:ba2a367ff478cd108d5319c0dc4fd4eb4ea3476dbfc45b00c45718e889cd9463 \ - --hash=sha256:bc9e7b1e268be7a23fc66471b615c324e99c5db39ce8c49dd6dd8e962c7bc1b8 \ - --hash=sha256:c890061915e95b619c1d3cc3c107c6fb021406b701c0c24b03e74830d522f210 \ - --hash=sha256:cc3324e4159e6d1f55c3615b4c1c211f87cc96cc0cc7c946c8447dc1319f2e9d \ - --hash=sha256:d2dae84a3d0f76884a6102c62f2795b2d6602c2c95cfcce74c8a590b6200e533 \ - --hash=sha256:d45f28c20bb67dee0f4a4caae709f40b0693d764b7b2bf2d58890f36b1bfcef0 \ - --hash=sha256:e38bd91eae257f36c2b7245c0278e9cd9d754f3a66b8d2b548c623ba66e387b6 \ - --hash=sha256:e43f6c7f9ba4f9d29edee530e45f9aa162872ec9549398b85971477a99f2a806 \ - --hash=sha256:ea879afd1d6189fca02a85a7868560c9bb8415dccff6b7ae6d81e4f06b3ab30d \ - --hash=sha256:eb9dfa87152bd97019adc387b2f29ef6af601de4386f36570ca537ace96d96ed \ - --hash=sha256:efd59e83223cb77952997fb850c7a7c2a958c9af0642060f536722c2a9e9d53b \ - --hash=sha256:f3fe90dfb297bd8265238c06787911cd81c2cb89ac5b13e1c911928bdabfce0f +fonttools==4.41.1 \ + --hash=sha256:1df1b6f4c7c4bc8201eb47f3b268adbf2539943aa43c400f84556557e3e109c0 \ + --hash=sha256:2a22b2c425c698dcd5d6b0ff0b566e8e9663172118db6fd5f1941f9b8063da9b \ + --hash=sha256:33191f062549e6bb1a4782c22a04ebd37009c09360e2d6686ac5083774d06d95 \ + --hash=sha256:38cdecd8f1fd4bf4daae7fed1b3170dfc1b523388d6664b2204b351820aa78a7 \ + --hash=sha256:3ae64303ba670f8959fdaaa30ba0c2dabe75364fdec1caeee596c45d51ca3425 \ + --hash=sha256:3d1f9471134affc1e3b1b806db6e3e2ad3fa99439e332f1881a474c825101096 \ + --hash=sha256:4e3334d51f0e37e2c6056e67141b2adabc92613a968797e2571ca8a03bd64773 \ + --hash=sha256:4edc795533421e98f60acee7d28fc8d941ff5ac10f44668c9c3635ad72ae9045 \ + --hash=sha256:547ab36a799dded58a46fa647266c24d0ed43a66028cd1cd4370b246ad426cac \ + --hash=sha256:59eba8b2e749a1de85760da22333f3d17c42b66e03758855a12a2a542723c6e7 \ + --hash=sha256:704bccd69b0abb6fab9f5e4d2b75896afa48b427caa2c7988792a2ffce35b441 \ + --hash=sha256:73ef0bb5d60eb02ba4d3a7d23ada32184bd86007cb2de3657cfcb1175325fc83 \ + --hash=sha256:7763316111df7b5165529f4183a334aa24c13cdb5375ffa1dc8ce309c8bf4e5c \ + --hash=sha256:849ec722bbf7d3501a0e879e57dec1fc54919d31bff3f690af30bb87970f9784 \ + --hash=sha256:891cfc5a83b0307688f78b9bb446f03a7a1ad981690ac8362f50518bc6153975 \ + --hash=sha256:952cb405f78734cf6466252fec42e206450d1a6715746013f64df9cbd4f896fa \ + --hash=sha256:a7bbb290d13c6dd718ec2c3db46fe6c5f6811e7ea1e07f145fd8468176398224 \ + --hash=sha256:a9b3cc10dc9e0834b6665fd63ae0c6964c6bc3d7166e9bc84772e0edd09f9fa2 \ + --hash=sha256:aaaef294d8e411f0ecb778a0aefd11bb5884c9b8333cc1011bdaf3b58ca4bd75 \ + --hash=sha256:afce2aeb80be72b4da7dd114f10f04873ff512793d13ce0b19d12b2a4c44c0f0 \ + --hash=sha256:b0938ebbeccf7c80bb9a15e31645cf831572c3a33d5cc69abe436e7000c61b14 \ + --hash=sha256:b2d1ee95be42b80d1f002d1ee0a51d7a435ea90d36f1a5ae331be9962ee5a3f1 \ + --hash=sha256:b927e5f466d99c03e6e20961946314b81d6e3490d95865ef88061144d9f62e38 \ + --hash=sha256:bdd729744ae7ecd7f7311ad25d99da4999003dcfe43b436cf3c333d4e68de73d \ + --hash=sha256:c2071267deaa6d93cb16288613419679c77220543551cbe61da02c93d92df72f \ + --hash=sha256:cac73bbef7734e78c60949da11c4903ee5837168e58772371bd42a75872f4f82 \ + --hash=sha256:da2c2964bdc827ba6b8a91dc6de792620be4da3922c4cf0599f36a488c07e2b2 \ + --hash=sha256:e16a9449f21a93909c5be2f5ed5246420f2316e94195dbfccb5238aaa38f9751 \ + --hash=sha256:e5c2b0a95a221838991e2f0e455dec1ca3a8cc9cd54febd68cc64d40fdb83669 \ + --hash=sha256:ec453a45778524f925a8f20fd26a3326f398bfc55d534e37bab470c5e415caa1 \ + --hash=sha256:edee0900cf0eedb29d17c7876102d6e5a91ee333882b1f5abc83e85b934cadb5 \ + --hash=sha256:f14f3ccea4cc7dd1b277385adf3c3bf18f9860f87eab9c2fb650b0af16800f55 \ + --hash=sha256:f240d9adf0583ac8fc1646afe7f4ac039022b6f8fa4f1575a2cfa53675360b69 \ + --hash=sha256:f48602c0b3fd79cd83a34c40af565fe6db7ac9085c8823b552e6e751e3a5b8be # via -r requirements-fonttools.in gcovr==5.0 \ --hash=sha256:1d80264cbaadff356b3dda71b8c62b3aa803e5b3eb6d526a24932cd6660a2576 \ -- cgit v1.2.3 From 9ffea6328e71fbaea159116e609d3b0c005564a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 10:37:25 +0000 Subject: Bump github/codeql-action from 2.20.4 to 2.21.0 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.20.4 to 2.21.0. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/489225d82a57396c6f426a40e66d461b16b3461d...1813ca74c3faaa3a2da2070b9b8a0b3e7373a0d8) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index b422048fe..6aaae1c05 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@489225d82a57396c6f426a40e66d461b16b3461d # v2.20.4 + uses: github/codeql-action/upload-sarif@1813ca74c3faaa3a2da2070b9b8a0b3e7373a0d8 # v2.21.0 with: sarif_file: results.sarif -- cgit v1.2.3 From e322949b9b94b3d28d952d0b7f337abb4b05c1fb Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 24 Jul 2023 20:28:37 -0600 Subject: [ArrayOf] Remove fast-path for offset to max-sized objects Fixes timeout https://oss-fuzz.com/testcase-detail/6153196517851136 --- src/hb-open-type.hh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 6d464a353..7de5a9b7a 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -718,10 +718,16 @@ struct ArrayOf return_trace (out); } - /* Special-case ArrayOf Offset16To structs with a maximum size. */ + /* Special-case ArrayOf Offset16To structs with a maximum size. + * + * Currently disabled, because this throws off max_op accounting + * and can cause timeouts in further operations. + * https://oss-fuzz.com/testcase-detail/6153196517851136 + */ template HB_ALWAYS_INLINE bool sanitize (hb_sanitize_context_t *c, const Base *base) const -- cgit v1.2.3 From 8eb7889fd4cd03f84c78eb84514e05927fb6bd2c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 24 Jul 2023 20:31:12 -0600 Subject: Add max-size to static-size objects --- src/hb-machinery.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh index cde1e99d6..70aed5426 100644 --- a/src/hb-machinery.hh +++ b/src/hb-machinery.hh @@ -104,6 +104,7 @@ static inline Type& StructAfter(TObject &X) unsigned int get_size () const { return (size); } \ static constexpr unsigned null_size = (size); \ static constexpr unsigned min_size = (size); \ + static constexpr unsigned max_size = (size); \ static constexpr unsigned static_size = (size) #define DEFINE_SIZE_UNION(size, _member) \ -- cgit v1.2.3 From 60db142784bb145426e4a02635bbad4f2f260d16 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 24 Jul 2023 20:49:32 -0600 Subject: [layout] Remove unused "max-size" cruft --- src/OT/Layout/GPOS/PairValueRecord.hh | 1 - src/OT/Layout/GSUB/Ligature.hh | 1 - src/hb-machinery.hh | 5 ----- src/hb-null.hh | 9 --------- src/hb-open-type.hh | 30 ------------------------------ src/hb-ot-layout-gsubgpos.hh | 2 -- 6 files changed, 48 deletions(-) diff --git a/src/OT/Layout/GPOS/PairValueRecord.hh b/src/OT/Layout/GPOS/PairValueRecord.hh index c99a38699..72bf0e99b 100644 --- a/src/OT/Layout/GPOS/PairValueRecord.hh +++ b/src/OT/Layout/GPOS/PairValueRecord.hh @@ -23,7 +23,6 @@ struct PairValueRecord * followed by for second glyph */ public: DEFINE_SIZE_ARRAY (Types::HBGlyphID::static_size, values); - DEFINE_SIZE_MAX (Types::HBGlyphID::static_size + 2 * Value::static_size * 8 * sizeof (ValueFormat)); int cmp (hb_codepoint_t k) const { return secondGlyph.cmp (k); } diff --git a/src/OT/Layout/GSUB/Ligature.hh b/src/OT/Layout/GSUB/Ligature.hh index db3fc55f7..402ed12ae 100644 --- a/src/OT/Layout/GSUB/Ligature.hh +++ b/src/OT/Layout/GSUB/Ligature.hh @@ -19,7 +19,6 @@ struct Ligature * in writing direction */ public: DEFINE_SIZE_ARRAY (Types::size + 2, component); - DEFINE_SIZE_MAX (65536 * Types::HBGlyphID::static_size); bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-machinery.hh b/src/hb-machinery.hh index 70aed5426..ecff94f1b 100644 --- a/src/hb-machinery.hh +++ b/src/hb-machinery.hh @@ -104,7 +104,6 @@ static inline Type& StructAfter(TObject &X) unsigned int get_size () const { return (size); } \ static constexpr unsigned null_size = (size); \ static constexpr unsigned min_size = (size); \ - static constexpr unsigned max_size = (size); \ static constexpr unsigned static_size = (size) #define DEFINE_SIZE_UNION(size, _member) \ @@ -132,10 +131,6 @@ static inline Type& StructAfter(TObject &X) unsigned int get_size () const { return (size - (array).min_size + (array).get_size ()); } \ DEFINE_SIZE_ARRAY(size, array) -#define DEFINE_SIZE_MAX(size) \ - DEFINE_INSTANCE_ASSERTION (sizeof (*this) <= (size)) \ - static constexpr unsigned max_size = (size) - /* diff --git a/src/hb-null.hh b/src/hb-null.hh index 342f9db76..6796906ba 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -48,15 +48,6 @@ template using hb_has_min_size = _hb_has_min_size; #define hb_has_min_size(T) hb_has_min_size::value -template -struct _hb_has_max_size : hb_false_type {}; -template -struct _hb_has_max_size> - : hb_true_type {}; -template -using hb_has_max_size = _hb_has_max_size; -#define hb_has_max_size(T) hb_has_max_size::value - template struct _hb_has_null_size : hb_false_type {}; template diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 7de5a9b7a..d3fdd1caf 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -718,36 +718,6 @@ struct ArrayOf return_trace (out); } - /* Special-case ArrayOf Offset16To structs with a maximum size. - * - * Currently disabled, because this throws off max_op accounting - * and can cause timeouts in further operations. - * https://oss-fuzz.com/testcase-detail/6153196517851136 - */ - template - HB_ALWAYS_INLINE - bool sanitize (hb_sanitize_context_t *c, const Base *base) const - { - TRACE_SANITIZE (this); - - if (unlikely (!sanitize_shallow (c))) return_trace (false); - - unsigned max_len = 65536 + Type::target_t::max_size; - - if (unlikely (c->check_range_fast (base, max_len))) - return_trace (true); - - unsigned int count = len; - for (unsigned int i = 0; i < count; i++) - if (unlikely (!c->dispatch (arrayZ[i], base))) - return_trace (false); - return_trace (true); - } - template HB_ALWAYS_INLINE bool sanitize (hb_sanitize_context_t *c, Ts&&... ds) const diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 0139927b6..136e088ab 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2087,7 +2087,6 @@ struct Rule * design order */ public: DEFINE_SIZE_ARRAY (4, inputZ); - DEFINE_SIZE_MAX (65536 * (Types::HBUINT::static_size + LookupRecord::static_size)); }; template @@ -3262,7 +3261,6 @@ struct ChainRule * design order) */ public: DEFINE_SIZE_MIN (8); - DEFINE_SIZE_MAX (65536 * (3 * Types::HBUINT::static_size + LookupRecord::static_size)); }; template -- cgit v1.2.3 From 62e6f7835c1e2520108bba2e3b6ded43f93339bc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 25 Jul 2023 08:32:21 -0600 Subject: [Cursive] round --- src/OT/Layout/GPOS/CursivePosFormat1.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/OT/Layout/GPOS/CursivePosFormat1.hh index a459124df..675bb83bc 100644 --- a/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -200,8 +200,8 @@ struct CursivePosFormat1 * Arabic. */ unsigned int child = i; unsigned int parent = j; - hb_position_t x_offset = entry_x - exit_x; - hb_position_t y_offset = entry_y - exit_y; + hb_position_t x_offset = roundf (entry_x - exit_x); + hb_position_t y_offset = roundf (entry_y - exit_y); if (!(c->lookup_props & LookupFlag::RightToLeft)) { unsigned int k = child; -- cgit v1.2.3 From a3b18062b7b19345f8c2818669d3d08f678d0bce Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 25 Jul 2023 11:11:07 -0600 Subject: [trak] Fix a couple return values --- src/hb-aat-layout-trak-table.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-aat-layout-trak-table.hh b/src/hb-aat-layout-trak-table.hh index 2ba9355b0..c72c0865d 100644 --- a/src/hb-aat-layout-trak-table.hh +++ b/src/hb-aat-layout-trak-table.hh @@ -111,13 +111,13 @@ struct TrackData break; } } - if (!trackTableEntry) return 0.; + if (!trackTableEntry) return 0; /* * Choose size. */ unsigned int sizes = nSizes; - if (!sizes) return 0.; + if (!sizes) return 0; if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes); hb_array_t size_table ((base+sizeTable).arrayZ, sizes); -- cgit v1.2.3 From 5690840ceb190341f9960d2b975c4366566ae86b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jul 2023 09:53:32 -0600 Subject: [map] Another try at fixing archaic clang Fixes (?) https://github.com/harfbuzz/harfbuzz/issues/4138 --- src/hb-map.hh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index e8abeec63..42604ef7c 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -78,6 +78,10 @@ struct hb_hashmap_t hash (0), value () {} + // Needed for https://github.com/harfbuzz/harfbuzz/issues/4138 + K& get_key () { return key; } + V& get_value () { return value; } + bool is_used () const { return is_used_; } void set_used (bool is_used) { is_used_ = is_used; } void set_real (bool is_real) { is_real_ = is_real; } @@ -405,23 +409,21 @@ struct hb_hashmap_t auto keys_ref () const HB_AUTO_RETURN ( + iter_items () - | hb_map (&item_t::key) + | hb_map (&item_t::get_key) ) auto keys () const HB_AUTO_RETURN ( - + iter_items () - | hb_map (&item_t::key) + + keys_ref () | hb_map (hb_ridentity) ) auto values_ref () const HB_AUTO_RETURN ( + iter_items () - | hb_map (&item_t::value) + | hb_map (&item_t::get_value) ) auto values () const HB_AUTO_RETURN ( - + iter_items () - | hb_map (&item_t::value) + + values_ref () | hb_map (hb_ridentity) ) -- cgit v1.2.3 From bccdcf5b18861fbdb599189ab1dcb45e339b02b2 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 21 Jul 2023 10:17:43 -0700 Subject: [instancer] fix a bug in compiling deltas_y for gvar --- src/hb-ot-var-common.hh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 95ca86ea1..01f6531c8 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -719,6 +719,8 @@ struct tuple_delta_t } if (j != rounded_deltas.length) return false; + /* reset i because we reuse rounded_deltas for deltas_y */ + i = 0; encoded_len += encode_delta_run (i, compiled_deltas.as_array ().sub_array (encoded_len), rounded_deltas); } return compiled_deltas.resize (encoded_len); -- cgit v1.2.3 From 515f85d545debf3c769b6aa7aa8c90908ce2f7f6 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 24 Jul 2023 11:10:17 -0700 Subject: [instancer] fix incorrect encoded_len --- src/hb-ot-var-common.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 01f6531c8..c9fed0415 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -876,6 +876,7 @@ struct tuple_delta_t if (run_length) { *it++ = (DELTAS_ARE_WORDS | (run_length - 1)); + encoded_len++; while (start < i) { int16_t delta_val = deltas[start++]; -- cgit v1.2.3 From 5cab0709a4f7267a01eb6f254c02d8bbcb4832e6 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 26 Jul 2023 09:56:07 -0700 Subject: [instancer] fix for missing to update tuple indices flag in operator += --- src/hb-ot-var-common.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index c9fed0415..a3b316b91 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -508,6 +508,7 @@ struct tuple_delta_t else { if (!o.indices.arrayZ[i]) continue; + indices.arrayZ[i] = true; deltas_x[i] = o.deltas_x[i]; if (deltas_y && o.deltas_y) deltas_y[i] = o.deltas_y[i]; -- cgit v1.2.3 From b36b100ef1c94012456c807167b2ac07443380ce Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jul 2023 14:42:46 -0600 Subject: [var] Remove byte_data_t; use hb_bytes_t Now that we have hopefully fixed the bug preventing hb_bytes_t use, remove the hack. Ref. 5690840ceb190341f9960d2b975c4366566ae86b https://github.com/harfbuzz/harfbuzz/issues/4138 --- src/hb-ot-var-common.hh | 55 ++++++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index a3b316b91..34d459c6a 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -424,25 +424,6 @@ struct TupleVariationHeader DEFINE_SIZE_MIN (4); }; -/* not using hb_bytes_t: avoid potential build issues with some compilers */ -struct byte_data_t -{ - hb_bytes_t bytes; - - byte_data_t () = default; - byte_data_t (const char *p_, unsigned len_) : bytes (hb_bytes_t (p_, len_)) {} - - void fini () { bytes.fini (); } - - bool operator == (const byte_data_t& o) const - { return bytes.arrayZ == o.bytes.arrayZ && bytes.length == o.bytes.length; } - - explicit operator bool () const { return bytes.length; } - - void copy (hb_serialize_context_t *c) const - { c->embed (bytes.arrayZ, bytes.length); } -}; - enum packed_delta_flag_t { DELTAS_ARE_ZERO = 0x80, @@ -925,7 +906,7 @@ struct TupleVariationData private: /* referenced point set->compiled point data map */ - hb_hashmap_t*, byte_data_t> point_data_map; + hb_hashmap_t*, hb_bytes_t> point_data_map; /* referenced point set-> count map, used in finding shared points */ hb_hashmap_t*, unsigned> point_set_count_map; @@ -1067,7 +1048,7 @@ struct TupleVariationData tuple_vars = std::move (new_vars); } - byte_data_t compile_point_set (const hb_vector_t &point_indices) + hb_bytes_t compile_point_set (const hb_vector_t &point_indices) { unsigned num_points = 0; for (bool i : point_indices) @@ -1079,15 +1060,15 @@ struct TupleVariationData if (num_points == indices_length) { char *p = (char *) hb_calloc (1, sizeof (char)); - if (unlikely (!p)) return byte_data_t (); + if (unlikely (!p)) return hb_bytes_t (); - return byte_data_t (p, 1); + return hb_bytes_t (p, 1); } /* allocate enough memories: 2 bytes for count + 3 bytes for each point */ unsigned num_bytes = 2 + 3 *num_points; char *p = (char *) hb_calloc (num_bytes, sizeof (char)); - if (unlikely (!p)) return byte_data_t (); + if (unlikely (!p)) return hb_bytes_t (); unsigned pos = 0; /* binary data starts with the total number of reference points */ @@ -1150,10 +1131,10 @@ struct TupleVariationData else p[header_pos] = (run_length - 1) | 0x80; } - return byte_data_t (p, pos); + return hb_bytes_t (p, pos); } - /* compile all point set and store byte data in a point_set->byte_data_t hashmap, + /* compile all point set and store byte data in a point_set->hb_bytes_t hashmap, * also update point_set->count map, which will be used in finding shared * point set*/ bool compile_all_point_sets () @@ -1170,8 +1151,8 @@ struct TupleVariationData continue; } - byte_data_t compiled_data = compile_point_set (*points_set); - if (unlikely (compiled_data == byte_data_t ())) + hb_bytes_t compiled_data = compile_point_set (*points_set); + if (unlikely (compiled_data == hb_bytes_t ())) return false; if (!point_data_map.set (points_set, compiled_data) || @@ -1182,19 +1163,19 @@ struct TupleVariationData } /* find shared points set which saves most bytes */ - byte_data_t find_shared_points () + hb_bytes_t find_shared_points () { unsigned max_saved_bytes = 0; - byte_data_t res{}; + hb_bytes_t res{}; for (const auto& _ : point_data_map.iter ()) { const hb_vector_t* points_set = _.first; - unsigned data_length = _.second.bytes.length; + unsigned data_length = _.second.length; unsigned *count; if (unlikely (!point_set_count_map.has (points_set, &count) || *count <= 1)) - return byte_data_t (); + return hb_bytes_t (); unsigned saved_bytes = data_length * ((*count) -1); if (saved_bytes > max_saved_bytes) @@ -1223,14 +1204,14 @@ struct TupleVariationData for (auto& tuple: tuple_vars) { const hb_vector_t* points_set = &(tuple.indices); - byte_data_t *points_data; + hb_bytes_t *points_data; if (unlikely (!point_data_map.has (points_set, &points_data))) return false; if (!tuple.compile_deltas ()) return false; - if (!tuple.compile_tuple_var_header (axes_index_map, points_data->bytes.length, axes_old_index_tag_map)) + if (!tuple.compile_tuple_var_header (axes_index_map, points_data->length, axes_old_index_tag_map)) return false; } return true; @@ -1241,7 +1222,7 @@ struct TupleVariationData TRACE_SERIALIZE (this); for (const auto& tuple: tuple_vars) { - byte_data_t compiled_bytes {tuple.compiled_tuple_header.arrayZ, tuple.compiled_tuple_header.length}; + hb_bytes_t compiled_bytes {tuple.compiled_tuple_header.arrayZ, tuple.compiled_tuple_header.length}; compiled_bytes.copy (c); if (c->in_error ()) return_trace (false); total_header_len += tuple.compiled_tuple_header.length; @@ -1255,12 +1236,12 @@ struct TupleVariationData for (const auto& tuple: tuple_vars) { const hb_vector_t* points_set = &(tuple.indices); - byte_data_t *point_data; + hb_bytes_t *point_data; if (!point_data_map.has (points_set, &point_data)) return_trace (false); point_data->copy (c); - byte_data_t compiled_bytes {tuple.compiled_deltas.arrayZ, tuple.compiled_deltas.length}; + hb_bytes_t compiled_bytes {tuple.compiled_deltas.arrayZ, tuple.compiled_deltas.length}; compiled_bytes.copy (c); if (c->in_error ()) return_trace (false); } -- cgit v1.2.3 From c8f67ac28eb18e65adda75818e2c472ad3936874 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jul 2023 10:34:45 -0600 Subject: [cff] Use float instead of double Reduces memory usage slightly. --- src/hb-cff-interp-common.hh | 14 +++++++------- src/hb-cff-interp-dict-common.hh | 4 ++-- src/hb-cff2-interp-cs.hh | 8 ++++---- src/hb-subset-cff2.cc | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/hb-cff-interp-common.hh b/src/hb-cff-interp-common.hh index 1d1f10f2b..ec81d628b 100644 --- a/src/hb-cff-interp-common.hh +++ b/src/hb-cff-interp-common.hh @@ -222,14 +222,14 @@ struct number_t void set_int (int v) { value = v; } int to_int () const { return value; } - void set_fixed (int32_t v) { value = v / 65536.0; } - int32_t to_fixed () const { return value * 65536.0; } + void set_fixed (int32_t v) { value = v / 65536.0f; } + int32_t to_fixed () const { return value * 65536.0f; } - void set_real (double v) { value = v; } - double to_real () const { return value; } + void set_real (float v) { value = v; } + float to_real () const { return value; } bool in_int_range () const - { return ((double) (int16_t) to_int () == value); } + { return ((float) (int16_t) to_int () == value); } bool operator > (const number_t &n) const { return value > n.to_real (); } bool operator < (const number_t &n) const { return n > *this; } @@ -244,7 +244,7 @@ struct number_t } protected: - double value = 0.; + float value = 0.; }; /* byte string */ @@ -439,7 +439,7 @@ struct arg_stack_t : cff_stack_t n.set_fixed (v); } - void push_real (double v) + void push_real (float v) { ARG &n = S::push (); n.set_real (v); diff --git a/src/hb-cff-interp-dict-common.hh b/src/hb-cff-interp-dict-common.hh index 53226b227..9642b1e49 100644 --- a/src/hb-cff-interp-dict-common.hh +++ b/src/hb-cff-interp-dict-common.hh @@ -78,7 +78,7 @@ struct dict_opset_t : opset_t } /* Turns CFF's BCD format into strtod understandable string */ - static double parse_bcd (byte_str_ref_t& str_ref) + static float parse_bcd (byte_str_ref_t& str_ref) { if (unlikely (str_ref.in_error ())) return .0; @@ -107,7 +107,7 @@ struct dict_opset_t : opset_t double pv; if (unlikely (!hb_parse_double (&p, p + count, &pv, true/* whole buffer */))) break; - return pv; + return (float) pv; } else { diff --git a/src/hb-cff2-interp-cs.hh b/src/hb-cff2-interp-cs.hh index 915b10cf3..c76d45eaa 100644 --- a/src/hb-cff2-interp-cs.hh +++ b/src/hb-cff2-interp-cs.hh @@ -37,7 +37,7 @@ struct blend_arg_t : number_t { void set_int (int v) { reset_blends (); number_t::set_int (v); } void set_fixed (int32_t v) { reset_blends (); number_t::set_fixed (v); } - void set_real (double v) { reset_blends (); number_t::set_real (v); } + void set_real (float v) { reset_blends (); number_t::set_real (v); } void set_blends (unsigned int numValues_, unsigned int valueIndex_, hb_array_t blends_) @@ -148,16 +148,16 @@ struct cff2_cs_interp_env_t : cs_interp_env_t void set_ivs (unsigned int ivs_) { ivs = ivs_; } bool seen_vsindex () const { return seen_vsindex_; } - double blend_deltas (hb_array_t deltas) const + float blend_deltas (hb_array_t deltas) const { - double v = 0; + float v = 0; if (do_blend) { if (likely (scalars.length == deltas.length)) { unsigned count = scalars.length; for (unsigned i = 0; i < count; i++) - v += (double) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); + v += (float) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); } } return v; diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index 3c52fb9c2..32aefcceb 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -266,14 +266,14 @@ struct cff2_private_blend_encoder_param_t } } - double blend_deltas (hb_array_t deltas) const + float blend_deltas (hb_array_t deltas) const { - double v = 0; + float v = 0; if (likely (scalars.length == deltas.length)) { unsigned count = scalars.length; for (unsigned i = 0; i < count; i++) - v += (double) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); + v += (float) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); } return v; } -- cgit v1.2.3 From cb320d22228d366c06dd97d43bf06f7ad7afd5f2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jul 2023 10:43:07 -0600 Subject: Revert "[cff] Use float instead of double" This reverts commit c8f67ac28eb18e65adda75818e2c472ad3936874. Tests failing. --- src/hb-cff-interp-common.hh | 14 +++++++------- src/hb-cff-interp-dict-common.hh | 4 ++-- src/hb-cff2-interp-cs.hh | 8 ++++---- src/hb-subset-cff2.cc | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/hb-cff-interp-common.hh b/src/hb-cff-interp-common.hh index ec81d628b..1d1f10f2b 100644 --- a/src/hb-cff-interp-common.hh +++ b/src/hb-cff-interp-common.hh @@ -222,14 +222,14 @@ struct number_t void set_int (int v) { value = v; } int to_int () const { return value; } - void set_fixed (int32_t v) { value = v / 65536.0f; } - int32_t to_fixed () const { return value * 65536.0f; } + void set_fixed (int32_t v) { value = v / 65536.0; } + int32_t to_fixed () const { return value * 65536.0; } - void set_real (float v) { value = v; } - float to_real () const { return value; } + void set_real (double v) { value = v; } + double to_real () const { return value; } bool in_int_range () const - { return ((float) (int16_t) to_int () == value); } + { return ((double) (int16_t) to_int () == value); } bool operator > (const number_t &n) const { return value > n.to_real (); } bool operator < (const number_t &n) const { return n > *this; } @@ -244,7 +244,7 @@ struct number_t } protected: - float value = 0.; + double value = 0.; }; /* byte string */ @@ -439,7 +439,7 @@ struct arg_stack_t : cff_stack_t n.set_fixed (v); } - void push_real (float v) + void push_real (double v) { ARG &n = S::push (); n.set_real (v); diff --git a/src/hb-cff-interp-dict-common.hh b/src/hb-cff-interp-dict-common.hh index 9642b1e49..53226b227 100644 --- a/src/hb-cff-interp-dict-common.hh +++ b/src/hb-cff-interp-dict-common.hh @@ -78,7 +78,7 @@ struct dict_opset_t : opset_t } /* Turns CFF's BCD format into strtod understandable string */ - static float parse_bcd (byte_str_ref_t& str_ref) + static double parse_bcd (byte_str_ref_t& str_ref) { if (unlikely (str_ref.in_error ())) return .0; @@ -107,7 +107,7 @@ struct dict_opset_t : opset_t double pv; if (unlikely (!hb_parse_double (&p, p + count, &pv, true/* whole buffer */))) break; - return (float) pv; + return pv; } else { diff --git a/src/hb-cff2-interp-cs.hh b/src/hb-cff2-interp-cs.hh index c76d45eaa..915b10cf3 100644 --- a/src/hb-cff2-interp-cs.hh +++ b/src/hb-cff2-interp-cs.hh @@ -37,7 +37,7 @@ struct blend_arg_t : number_t { void set_int (int v) { reset_blends (); number_t::set_int (v); } void set_fixed (int32_t v) { reset_blends (); number_t::set_fixed (v); } - void set_real (float v) { reset_blends (); number_t::set_real (v); } + void set_real (double v) { reset_blends (); number_t::set_real (v); } void set_blends (unsigned int numValues_, unsigned int valueIndex_, hb_array_t blends_) @@ -148,16 +148,16 @@ struct cff2_cs_interp_env_t : cs_interp_env_t void set_ivs (unsigned int ivs_) { ivs = ivs_; } bool seen_vsindex () const { return seen_vsindex_; } - float blend_deltas (hb_array_t deltas) const + double blend_deltas (hb_array_t deltas) const { - float v = 0; + double v = 0; if (do_blend) { if (likely (scalars.length == deltas.length)) { unsigned count = scalars.length; for (unsigned i = 0; i < count; i++) - v += (float) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); + v += (double) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); } } return v; diff --git a/src/hb-subset-cff2.cc b/src/hb-subset-cff2.cc index 32aefcceb..3c52fb9c2 100644 --- a/src/hb-subset-cff2.cc +++ b/src/hb-subset-cff2.cc @@ -266,14 +266,14 @@ struct cff2_private_blend_encoder_param_t } } - float blend_deltas (hb_array_t deltas) const + double blend_deltas (hb_array_t deltas) const { - float v = 0; + double v = 0; if (likely (scalars.length == deltas.length)) { unsigned count = scalars.length; for (unsigned i = 0; i < count; i++) - v += (float) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); + v += (double) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); } return v; } -- cgit v1.2.3 From 45a0d65c6219c755245ea1df24b2e8d644420971 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 27 Jul 2023 09:06:02 -0700 Subject: [instancer] cosmetic change --- src/hb-ot-var-common.hh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 34d459c6a..9e813f6d2 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1222,8 +1222,7 @@ struct TupleVariationData TRACE_SERIALIZE (this); for (const auto& tuple: tuple_vars) { - hb_bytes_t compiled_bytes {tuple.compiled_tuple_header.arrayZ, tuple.compiled_tuple_header.length}; - compiled_bytes.copy (c); + tuple.compiled_tuple_header.as_array ().copy (c); if (c->in_error ()) return_trace (false); total_header_len += tuple.compiled_tuple_header.length; } @@ -1241,8 +1240,7 @@ struct TupleVariationData return_trace (false); point_data->copy (c); - hb_bytes_t compiled_bytes {tuple.compiled_deltas.arrayZ, tuple.compiled_deltas.length}; - compiled_bytes.copy (c); + tuple.compiled_deltas.as_array ().copy (c); if (c->in_error ()) return_trace (false); } return_trace (true); -- cgit v1.2.3 From d3b997ee70e87d4e6b3e22ce99a21372c94d5a14 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 26 Jul 2023 15:39:14 -0600 Subject: [graph] Use a hb_map_t to keep parents, instead of hb_vector_t In some fonts, for example Noto Duployan-Regular, nodes can have over a thousand parents... Speeds up 10% subsetting. --- src/graph/classdef-graph.hh | 2 +- src/graph/coverage-graph.hh | 2 +- src/graph/graph.hh | 94 +++++++++++++++++++++++++++++---------------- src/graph/gsubgpos-graph.hh | 6 +-- src/graph/pairpos-graph.hh | 2 +- 5 files changed, 66 insertions(+), 40 deletions(-) diff --git a/src/graph/classdef-graph.hh b/src/graph/classdef-graph.hh index 4ae0c13ac..c1432883f 100644 --- a/src/graph/classdef-graph.hh +++ b/src/graph/classdef-graph.hh @@ -72,7 +72,7 @@ struct ClassDef : public OT::ClassDef class_def_link->width = SmallTypes::size; class_def_link->objidx = class_def_prime_id; class_def_link->position = link_position; - class_def_prime_vertex.parents.push (parent_id); + class_def_prime_vertex.add_parent (parent_id); return true; } diff --git a/src/graph/coverage-graph.hh b/src/graph/coverage-graph.hh index bd6e91a1f..4f44e076d 100644 --- a/src/graph/coverage-graph.hh +++ b/src/graph/coverage-graph.hh @@ -96,7 +96,7 @@ struct Coverage : public OT::Layout::Common::Coverage coverage_link->width = SmallTypes::size; coverage_link->objidx = coverage_prime_id; coverage_link->position = link_position; - coverage_prime_vertex.parents.push (parent_id); + coverage_prime_vertex.add_parent (parent_id); return (Coverage*) coverage_prime_vertex.obj.head; } diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 9d35851a0..48c0548d6 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -44,10 +44,11 @@ struct graph_t hb_serialize_context_t::object_t obj; int64_t distance = 0 ; int64_t space = 0 ; - hb_vector_t parents; unsigned start = 0; unsigned end = 0; unsigned priority = 0; + unsigned incoming_edges_ = 0; + hb_hashmap_t parents; bool link_positions_valid (unsigned num_objects, bool removed_nil) @@ -144,6 +145,7 @@ struct graph_t hb_swap (a.distance, b.distance); hb_swap (a.space, b.space); hb_swap (a.parents, b.parents); + hb_swap (a.incoming_edges_, b.incoming_edges_); hb_swap (a.start, b.start); hb_swap (a.end, b.end); hb_swap (a.priority, b.priority); @@ -164,22 +166,36 @@ struct graph_t bool is_shared () const { - return parents.length > 1; + return parents.get_population () > 1; } unsigned incoming_edges () const { - return parents.length; + return incoming_edges_; + } + + void reset_parents () + { + incoming_edges_ = 0; + parents.reset (); + } + + void add_parent (unsigned parent_index) + { + incoming_edges_++; + parents.set (parent_index, parents[parent_index] + 1); } void remove_parent (unsigned parent_index) { - unsigned count = parents.length; - for (unsigned i = 0; i < count; i++) + unsigned *v; + if (parents.has (parent_index, &v)) { - if (parents.arrayZ[i] != parent_index) continue; - parents.remove_unordered (i); - break; + incoming_edges_--; + if (*v > 1) + *v -= 1; + else + parents.del (parent_index); } } @@ -202,21 +218,35 @@ struct graph_t void remap_parents (const hb_vector_t& id_map) { - unsigned count = parents.length; - for (unsigned i = 0; i < count; i++) - parents.arrayZ[i] = id_map[parents.arrayZ[i]]; + if (parents.get_population () == 1) + { + // Fast path for the common case. + const auto &_ = *parents.iter_ref (); + unsigned old_index = _.first; + unsigned new_index = id_map[old_index]; + if (old_index != new_index) + { + unsigned v = _.second; + parents.del (old_index); + parents.set (new_index, v); + } + return; + } + + hb_map_t new_parents; + new_parents.alloc (parents.get_population ()); + for (auto _ : parents) + new_parents.set (id_map[_.first], _.second); + + parents = std::move (new_parents); } void remap_parent (unsigned old_index, unsigned new_index) { - unsigned count = parents.length; - for (unsigned i = 0; i < count; i++) + if (parents.has (old_index)) { - if (parents.arrayZ[i] == old_index) - { - parents.arrayZ[i] = new_index; - break; - } + remove_parent (old_index); + add_parent (new_index); } } @@ -423,7 +453,7 @@ struct graph_t link->width = 2; link->objidx = child_id; link->position = (char*) offset - (char*) v.obj.head; - vertices_[child_id].parents.push (parent_id); + vertices_[child_id].add_parent (parent_id); } /* @@ -609,7 +639,7 @@ struct graph_t { unsigned child_idx = index_for_offset (node_idx, offset); auto& child = vertices_[child_idx]; - for (unsigned p : child.parents) + for (unsigned p : child.parents.keys ()) { if (p != node_idx) { return duplicate (node_idx, child_idx); @@ -828,7 +858,7 @@ struct graph_t new_link->position = (const char*) new_offset - (const char*) new_v.obj.head; auto& child = vertices_[child_id]; - child.parents.push (new_parent_idx); + child.add_parent (new_parent_idx); old_v.remove_real_link (child_id, old_offset); child.remove_parent (old_parent_idx); @@ -872,18 +902,18 @@ struct graph_t clone->obj.tail = child.obj.tail; clone->distance = child.distance; clone->space = child.space; - clone->parents.reset (); + clone->reset_parents (); unsigned clone_idx = vertices_.length - 2; for (const auto& l : child.obj.real_links) { clone->obj.real_links.push (l); - vertices_[l.objidx].parents.push (clone_idx); + vertices_[l.objidx].add_parent (clone_idx); } for (const auto& l : child.obj.virtual_links) { clone->obj.virtual_links.push (l); - vertices_[l.objidx].parents.push (clone_idx); + vertices_[l.objidx].add_parent (clone_idx); } check_success (!clone->obj.real_links.in_error ()); @@ -1136,7 +1166,7 @@ struct graph_t return 0; } - return space_for (node.parents[0], root); + return space_for (*node.parents.keys (), root); } void err_other_error () { this->successful = false; } @@ -1160,12 +1190,8 @@ struct graph_t unsigned wide_parents (unsigned node_idx, hb_set_t& parents) const { unsigned count = 0; - hb_set_t visited; - for (unsigned p : vertices_[node_idx].parents) + for (unsigned p : vertices_[node_idx].parents.keys ()) { - if (visited.has (p)) continue; - visited.add (p); - // Only real links can be wide for (const auto& l : vertices_[p].obj.real_links) { @@ -1195,13 +1221,13 @@ struct graph_t unsigned count = vertices_.length; for (unsigned i = 0; i < count; i++) - vertices_.arrayZ[i].parents.reset (); + vertices_.arrayZ[i].reset_parents (); for (unsigned p = 0; p < count; p++) { for (auto& l : vertices_.arrayZ[p].obj.all_links ()) { - vertices_[l.objidx].parents.push (p); + vertices_[l.objidx].add_parent (p); } } @@ -1309,7 +1335,7 @@ struct graph_t unsigned old_idx = link.objidx; link.objidx = new_idx; vertices_[old_idx].remove_parent (parent_idx); - vertices_[new_idx].parents.push (parent_idx); + vertices_[new_idx].add_parent (parent_idx); } /* @@ -1379,7 +1405,7 @@ struct graph_t for (const auto& l : v.obj.all_links ()) find_connected_nodes (l.objidx, targets, visited, connected); - for (unsigned p : v.parents) + for (unsigned p : v.parents.keys ()) find_connected_nodes (p, targets, visited, connected); } diff --git a/src/graph/gsubgpos-graph.hh b/src/graph/gsubgpos-graph.hh index 78d509632..303517f68 100644 --- a/src/graph/gsubgpos-graph.hh +++ b/src/graph/gsubgpos-graph.hh @@ -225,7 +225,7 @@ struct Lookup : public OT::Lookup if (is_ext) { unsigned ext_id = create_extension_subtable (c, subtable_id, type); - c.graph.vertices_[subtable_id].parents.push (ext_id); + c.graph.vertices_[subtable_id].add_parent (ext_id); subtable_id = ext_id; } @@ -234,7 +234,7 @@ struct Lookup : public OT::Lookup link->objidx = subtable_id; link->position = (char*) &new_lookup->subTable[offset_index++] - (char*) new_lookup; - c.graph.vertices_[subtable_id].parents.push (this_index); + c.graph.vertices_[subtable_id].add_parent (this_index); } } @@ -315,7 +315,7 @@ struct Lookup : public OT::Lookup // Make extension point at the subtable. auto& ext_vertex = c.graph.vertices_[ext_index]; auto& subtable_vertex = c.graph.vertices_[subtable_index]; - ext_vertex.parents.push (lookup_index); + ext_vertex.add_parent (lookup_index); subtable_vertex.remap_parent (lookup_index, ext_index); return true; diff --git a/src/graph/pairpos-graph.hh b/src/graph/pairpos-graph.hh index f655b7155..ad158cc9e 100644 --- a/src/graph/pairpos-graph.hh +++ b/src/graph/pairpos-graph.hh @@ -419,7 +419,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4width = SmallTypes::size; class_def_link->objidx = class_def_2_id; class_def_link->position = 10; - graph.vertices_[class_def_2_id].parents.push (pair_pos_prime_id); + graph.vertices_[class_def_2_id].add_parent (pair_pos_prime_id); graph.duplicate (pair_pos_prime_id, class_def_2_id); return pair_pos_prime_id; -- cgit v1.2.3 From f3d0b11d570eb790bb1ef5114f48fb59fbb260b6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jul 2023 12:20:39 -0600 Subject: [graph] Make parents private --- src/graph/graph.hh | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 48c0548d6..378488469 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -47,9 +47,20 @@ struct graph_t unsigned start = 0; unsigned end = 0; unsigned priority = 0; + private: unsigned incoming_edges_ = 0; hb_hashmap_t parents; + public: + auto parents_iter () const HB_AUTO_RETURN + ( + parents.keys () + ) + + bool parents_in_error () const + { + return parents.in_error (); + } bool link_positions_valid (unsigned num_objects, bool removed_nil) { @@ -639,7 +650,7 @@ struct graph_t { unsigned child_idx = index_for_offset (node_idx, offset); auto& child = vertices_[child_idx]; - for (unsigned p : child.parents.keys ()) + for (unsigned p : child.parents_iter ()) { if (p != node_idx) { return duplicate (node_idx, child_idx); @@ -1042,13 +1053,13 @@ struct graph_t { update_parents(); - if (root().parents) + if (root().incoming_edges ()) // Root cannot have parents. return false; for (unsigned i = 0; i < root_idx (); i++) { - if (!vertices_[i].parents) + if (!vertices_[i].incoming_edges ()) return false; } return true; @@ -1112,14 +1123,14 @@ struct graph_t parents_invalid = true; update_parents(); - if (root().parents) { + if (root().incoming_edges ()) { DEBUG_MSG (SUBSET_REPACK, nullptr, "Root node has incoming edges."); } for (unsigned i = 0; i < root_idx (); i++) { const auto& v = vertices_[i]; - if (!v.parents) + if (!v.incoming_edges ()) DEBUG_MSG (SUBSET_REPACK, nullptr, "Node %u is orphaned.", i); } } @@ -1159,14 +1170,14 @@ struct graph_t return node.space; } - if (!node.parents) + if (!node.incoming_edges ()) { if (root) *root = index; return 0; } - return space_for (*node.parents.keys (), root); + return space_for (*node.parents_iter (), root); } void err_other_error () { this->successful = false; } @@ -1190,7 +1201,7 @@ struct graph_t unsigned wide_parents (unsigned node_idx, hb_set_t& parents) const { unsigned count = 0; - for (unsigned p : vertices_[node_idx].parents.keys ()) + for (unsigned p : vertices_[node_idx].parents_iter ()) { // Only real links can be wide for (const auto& l : vertices_[p].obj.real_links) @@ -1234,7 +1245,7 @@ struct graph_t for (unsigned i = 0; i < count; i++) // parents arrays must be accurate or downstream operations like cycle detection // and sorting won't work correctly. - check_success (!vertices_.arrayZ[i].parents.in_error ()); + check_success (!vertices_.arrayZ[i].parents_in_error ()); parents_invalid = false; } @@ -1405,7 +1416,7 @@ struct graph_t for (const auto& l : v.obj.all_links ()) find_connected_nodes (l.objidx, targets, visited, connected); - for (unsigned p : v.parents.keys ()) + for (unsigned p : v.parents_iter ()) find_connected_nodes (p, targets, visited, connected); } -- cgit v1.2.3 From 1b5abb178197876d73584a4f51325323563b50dc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jul 2023 12:41:43 -0600 Subject: [graph] Speed-up vertices having only one parent --- src/graph/graph.hh | 55 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 378488469..8c07e7c0e 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -49,12 +49,16 @@ struct graph_t unsigned priority = 0; private: unsigned incoming_edges_ = 0; + unsigned single_parent = (unsigned) -1; hb_hashmap_t parents; public: - auto parents_iter () const HB_AUTO_RETURN + const auto parents_iter () const HB_AUTO_RETURN ( - parents.keys () + hb_concat ( + hb_iter (&single_parent, single_parent != (unsigned) -1), + parents.keys_ref () + ) ) bool parents_in_error () const @@ -155,6 +159,7 @@ struct graph_t hb_swap (a.obj, b.obj); hb_swap (a.distance, b.distance); hb_swap (a.space, b.space); + hb_swap (a.single_parent, b.single_parent); hb_swap (a.parents, b.parents); hb_swap (a.incoming_edges_, b.incoming_edges_); hb_swap (a.start, b.start); @@ -188,17 +193,37 @@ struct graph_t void reset_parents () { incoming_edges_ = 0; + single_parent = (unsigned) -1; parents.reset (); } void add_parent (unsigned parent_index) { + if (incoming_edges_ == 0) + { + single_parent = parent_index; + incoming_edges_ = 1; + return; + } + else if (single_parent != (unsigned) -1) + { + parents.set (single_parent, 1); + single_parent = (unsigned) -1; + } + incoming_edges_++; parents.set (parent_index, parents[parent_index] + 1); } void remove_parent (unsigned parent_index) { + if (parent_index == single_parent) + { + single_parent = (unsigned) -1; + incoming_edges_--; + return; + } + unsigned *v; if (parents.has (parent_index, &v)) { @@ -207,6 +232,12 @@ struct graph_t *v -= 1; else parents.del (parent_index); + + if (incoming_edges_ == 1) + { + single_parent = *parents.keys (); + parents.reset (); + } } } @@ -229,18 +260,9 @@ struct graph_t void remap_parents (const hb_vector_t& id_map) { - if (parents.get_population () == 1) + if (single_parent != (unsigned) -1) { - // Fast path for the common case. - const auto &_ = *parents.iter_ref (); - unsigned old_index = _.first; - unsigned new_index = id_map[old_index]; - if (old_index != new_index) - { - unsigned v = _.second; - parents.del (old_index); - parents.set (new_index, v); - } + single_parent = id_map[single_parent]; return; } @@ -254,6 +276,13 @@ struct graph_t void remap_parent (unsigned old_index, unsigned new_index) { + if (single_parent != (unsigned) -1) + { + if (single_parent == old_index) + single_parent = new_index; + return; + } + if (parents.has (old_index)) { remove_parent (old_index); -- cgit v1.2.3 From 6bb61708ed2059abdbbb6eb7e8a9b721de64dd73 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jul 2023 13:02:55 -0600 Subject: [graph] Try fixing bots --- src/graph/graph.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 8c07e7c0e..c6376c6f1 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -53,7 +53,7 @@ struct graph_t hb_hashmap_t parents; public: - const auto parents_iter () const HB_AUTO_RETURN + auto parents_iter () const HB_AUTO_RETURN ( hb_concat ( hb_iter (&single_parent, single_parent != (unsigned) -1), @@ -266,7 +266,7 @@ struct graph_t return; } - hb_map_t new_parents; + hb_hashmap_t new_parents; new_parents.alloc (parents.get_population ()); for (auto _ : parents) new_parents.set (id_map[_.first], _.second); -- cgit v1.2.3 From db3314c1f860ee5cf68c81ccce5771b9b0366bca Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jul 2023 13:20:32 -0600 Subject: [graph] Minor space type change --- src/graph/graph.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index c6376c6f1..8681de365 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -43,7 +43,7 @@ struct graph_t { hb_serialize_context_t::object_t obj; int64_t distance = 0 ; - int64_t space = 0 ; + unsigned space = 0 ; unsigned start = 0; unsigned end = 0; unsigned priority = 0; -- cgit v1.2.3 From bb1f53c2540a1e45c18eb8fbe4935b9c4e4fefa8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jul 2023 13:29:56 -0600 Subject: [graph] Try fixing infinite loop found by CIFuzz under malloc fail --- src/graph/graph.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 8681de365..6c2b8b2db 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -211,8 +211,8 @@ struct graph_t single_parent = (unsigned) -1; } - incoming_edges_++; - parents.set (parent_index, parents[parent_index] + 1); + if (parents.set (parent_index, parents[parent_index] + 1)) + incoming_edges_++; } void remove_parent (unsigned parent_index) -- cgit v1.2.3 From 3bedb0eeed62aaab3c6be849480a54214a59715b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 27 Jul 2023 16:04:01 -0600 Subject: [graph] Minor rename --- src/graph/graph.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 6c2b8b2db..a844af285 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -61,7 +61,7 @@ struct graph_t ) ) - bool parents_in_error () const + bool in_error () const { return parents.in_error (); } @@ -1274,7 +1274,7 @@ struct graph_t for (unsigned i = 0; i < count; i++) // parents arrays must be accurate or downstream operations like cycle detection // and sorting won't work correctly. - check_success (!vertices_.arrayZ[i].parents_in_error ()); + check_success (!vertices_.arrayZ[i].in_error ()); parents_invalid = false; } -- cgit v1.2.3 From 04f4909257b2da56d76c24872075f6f655ae4438 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 28 Jul 2023 14:37:52 -0600 Subject: [graph] Use a move instead of swap --- src/graph/graph.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index a844af285..3462c9f66 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -568,7 +568,7 @@ struct graph_t check_success (!sorted_graph.in_error ()); remap_all_obj_indices (id_map, &sorted_graph); - hb_swap (vertices_, sorted_graph); + vertices_ = std::move (sorted_graph); if (!check_success (new_id == -1)) print_orphaned_nodes (); -- cgit v1.2.3 From 23838e5a2e7f5627d77fb85c50a0bfd9e004d6a8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 29 Jul 2023 13:20:14 -0600 Subject: [graph] Error handling --- src/graph/graph.hh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 3462c9f66..2b89b9996 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -207,7 +207,8 @@ struct graph_t } else if (single_parent != (unsigned) -1) { - parents.set (single_parent, 1); + if (!parents.set (single_parent, 1)) + return; single_parent = (unsigned) -1; } -- cgit v1.2.3 From f3e86937df345d7709de879af1d1a1502e84e1e9 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sun, 30 Jul 2023 08:28:23 -0400 Subject: Require numerator and denominator in auto fraction --- src/hb-ot-shape.cc | 2 ++ test/shape/data/in-house/tests/automatic-fractions.tests | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index aada05ec0..c76775267 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -765,6 +765,8 @@ hb_ot_shape_setup_masks_fraction (const hb_ot_shape_context_t *c) _hb_glyph_info_get_general_category (&info[end]) == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) end++; + if (start == i || end == i + 1) + continue; buffer->unsafe_to_break (start, end); diff --git a/test/shape/data/in-house/tests/automatic-fractions.tests b/test/shape/data/in-house/tests/automatic-fractions.tests index 36f5796ca..5bc393e29 100644 --- a/test/shape/data/in-house/tests/automatic-fractions.tests +++ b/test/shape/data/in-house/tests/automatic-fractions.tests @@ -1,3 +1,7 @@ ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036;[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600] ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l --script=arab;U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036;[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600] ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+0661,U+0662,U+0663,U+2044,U+0664,U+0665,U+0666;[uni0661.numr=0+600|uni0662.numr=1+600|uni0663.numr=2+600|fraction=3+252|uni0664.small=4+600|uni0665.small=5+600|uni0666.small=6+600] +../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+0031,U+0032,U+0033,U+2044;[one=0+1090|two=1+1090|three=2+1090|fraction=3+252] +../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+0661,U+0662,U+0663,U+2044;[uni0661=0+1200|uni0662=1+1200|uni0663=2+1200|fraction=3+252] +../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+2044,U+0034,U+0035,U+0036;[fraction=0+252|four=1+1090|five=2+1090|six=3+1090] +../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+2044,U+0664,U+0665,U+0666;[fraction=0+252|uni0664=1+1200|uni0665=2+1200|uni0666=3+1200] -- cgit v1.2.3 From 8fe506e153c530affd529e7175e813c3a878faed Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 10:43:28 -0600 Subject: Revert "Require numerator and denominator in auto fraction" This reverts commit f3e86937df345d7709de879af1d1a1502e84e1e9. --- src/hb-ot-shape.cc | 2 -- test/shape/data/in-house/tests/automatic-fractions.tests | 4 ---- 2 files changed, 6 deletions(-) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index c76775267..aada05ec0 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -765,8 +765,6 @@ hb_ot_shape_setup_masks_fraction (const hb_ot_shape_context_t *c) _hb_glyph_info_get_general_category (&info[end]) == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) end++; - if (start == i || end == i + 1) - continue; buffer->unsafe_to_break (start, end); diff --git a/test/shape/data/in-house/tests/automatic-fractions.tests b/test/shape/data/in-house/tests/automatic-fractions.tests index 5bc393e29..36f5796ca 100644 --- a/test/shape/data/in-house/tests/automatic-fractions.tests +++ b/test/shape/data/in-house/tests/automatic-fractions.tests @@ -1,7 +1,3 @@ ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036;[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600] ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l --script=arab;U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036;[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600] ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+0661,U+0662,U+0663,U+2044,U+0664,U+0665,U+0666;[uni0661.numr=0+600|uni0662.numr=1+600|uni0663.numr=2+600|fraction=3+252|uni0664.small=4+600|uni0665.small=5+600|uni0666.small=6+600] -../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+0031,U+0032,U+0033,U+2044;[one=0+1090|two=1+1090|three=2+1090|fraction=3+252] -../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+0661,U+0662,U+0663,U+2044;[uni0661=0+1200|uni0662=1+1200|uni0663=2+1200|fraction=3+252] -../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+2044,U+0034,U+0035,U+0036;[fraction=0+252|four=1+1090|five=2+1090|six=3+1090] -../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+2044,U+0664,U+0665,U+0666;[fraction=0+252|uni0664=1+1200|uni0665=2+1200|uni0666=3+1200] -- cgit v1.2.3 From b2a73166d4d7874565ac61dcfca74f651f922e5c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 11:23:19 -0600 Subject: [buffer] Fix unsafe_to_concat() Ouch! --- src/hb-buffer.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-buffer.hh b/src/hb-buffer.hh index b0e68e66a..f04ad58f1 100644 --- a/src/hb-buffer.hh +++ b/src/hb-buffer.hh @@ -473,7 +473,7 @@ struct hb_buffer_t return; _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_CONCAT, start, end, - true); + false); } void unsafe_to_break_from_outbuffer (unsigned int start = 0, unsigned int end = -1) { -- cgit v1.2.3 From f19ca24a8ed92373342adb0c69ac5975b44f50e1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 11:26:11 -0600 Subject: Revert "Revert "Require numerator and denominator in auto fraction"" This reverts commit 8fe506e153c530affd529e7175e813c3a878faed. --- src/hb-ot-shape.cc | 2 ++ test/shape/data/in-house/tests/automatic-fractions.tests | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index aada05ec0..c76775267 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -765,6 +765,8 @@ hb_ot_shape_setup_masks_fraction (const hb_ot_shape_context_t *c) _hb_glyph_info_get_general_category (&info[end]) == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) end++; + if (start == i || end == i + 1) + continue; buffer->unsafe_to_break (start, end); diff --git a/test/shape/data/in-house/tests/automatic-fractions.tests b/test/shape/data/in-house/tests/automatic-fractions.tests index 36f5796ca..5bc393e29 100644 --- a/test/shape/data/in-house/tests/automatic-fractions.tests +++ b/test/shape/data/in-house/tests/automatic-fractions.tests @@ -1,3 +1,7 @@ ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036;[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600] ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l --script=arab;U+0031,U+0032,U+0033,U+2044,U+0034,U+0035,U+0036;[one.numr=0+600|two.numr=1+600|three.numr=2+600|fraction=3+252|four.small=4+600|five.small=5+600|six.small=6+600] ../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+0661,U+0662,U+0663,U+2044,U+0664,U+0665,U+0666;[uni0661.numr=0+600|uni0662.numr=1+600|uni0663.numr=2+600|fraction=3+252|uni0664.small=4+600|uni0665.small=5+600|uni0666.small=6+600] +../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+0031,U+0032,U+0033,U+2044;[one=0+1090|two=1+1090|three=2+1090|fraction=3+252] +../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+0661,U+0662,U+0663,U+2044;[uni0661=0+1200|uni0662=1+1200|uni0663=2+1200|fraction=3+252] +../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;;U+2044,U+0034,U+0035,U+0036;[fraction=0+252|four=1+1090|five=2+1090|six=3+1090] +../fonts/15dfc433a135a658b9f4b1a861b5cdd9658ccbb9.ttf;--direction=l;U+2044,U+0664,U+0665,U+0666;[fraction=0+252|uni0664=1+1200|uni0665=2+1200|uni0666=3+1200] -- cgit v1.2.3 From 35a026c89ab4f55a962f0e837a7b7650eb3e7c31 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 11:28:59 -0600 Subject: [shape] Unsafe-to-concat around fraction slash --- src/hb-ot-shape.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index c76775267..9c1c2a950 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -766,7 +766,13 @@ hb_ot_shape_setup_masks_fraction (const hb_ot_shape_context_t *c) HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) end++; if (start == i || end == i + 1) + { + if (start == i) + buffer->unsafe_to_concat (start, start + 1); + if (end == i + 1) + buffer->unsafe_to_concat (end - 1, end); continue; + } buffer->unsafe_to_break (start, end); -- cgit v1.2.3 From 202888ec3ed27f1ac575a13d93688776545a62bf Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 11:49:08 -0600 Subject: Fix mac bot I think the new unsafe-to-concat is correct... --- src/hb-ot-shaper-use-machine.hh | 1893 ++++++++++++++-------------- test/shape/data/in-house/tests/macos.tests | 2 +- 2 files changed, 971 insertions(+), 924 deletions(-) diff --git a/src/hb-ot-shaper-use-machine.hh b/src/hb-ot-shaper-use-machine.hh index 7249c3335..80a9b09d8 100644 --- a/src/hb-ot-shaper-use-machine.hh +++ b/src/hb-ot-shaper-use-machine.hh @@ -1,32 +1,31 @@ - #line 1 "hb-ot-shaper-use-machine.rl" /* - * Copyright © 2015 Mozilla Foundation. - * Copyright © 2015 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. - * - * Mozilla Author(s): Jonathan Kew - * Google Author(s): Behdad Esfahbod - */ +* Copyright © 2015 Mozilla Foundation. +* Copyright © 2015 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. +* +* Mozilla Author(s): Jonathan Kew +* Google Author(s): Behdad Esfahbod +*/ #ifndef HB_OT_SHAPER_USE_MACHINE_HH #define HB_OT_SHAPER_USE_MACHINE_HH @@ -41,15 +40,15 @@ #define USE(Cat) use_syllable_machine_ex_##Cat enum use_syllable_type_t { - use_virama_terminated_cluster, - use_sakot_terminated_cluster, - use_standard_cluster, - use_number_joiner_terminated_cluster, - use_numeral_cluster, - use_symbol_cluster, - use_hieroglyph_cluster, - use_broken_cluster, - use_non_cluster, + use_virama_terminated_cluster, + use_sakot_terminated_cluster, + use_standard_cluster, + use_number_joiner_terminated_cluster, + use_numeral_cluster, + use_symbol_cluster, + use_hieroglyph_cluster, + use_broken_cluster, + use_non_cluster, }; @@ -99,724 +98,592 @@ enum use_syllable_type_t { #line 96 "hb-ot-shaper-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, - 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, - 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, - 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 11u, 53u, 14u, 42u, 14u, 42u, 11u, 53u, - 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, - 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, - 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, - 1u, 14u, 1u, 14u, 1u, 48u, 13u, 14u, 4u, 14u, 11u, 53u, 11u, 53u, 1u, 53u, - 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, - 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, - 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, - 1u, 48u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, - 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, - 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, - 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 4u, 14u, 13u, 14u, 1u, 53u, 11u, 53u, - 14u, 42u, 14u, 42u, 1u, 5u, 14u, 52u, 14u, 52u, 14u, 51u, 0 + 0u, 39u, 5u, 39u, 5u, 39u, 1u, 39u, + 8u, 34u, 8u, 33u, 8u, 33u, 8u, 33u, + 8u, 32u, 8u, 32u, 8u, 8u, 8u, 34u, + 8u, 34u, 8u, 34u, 1u, 8u, 8u, 34u, + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, + 6u, 39u, 8u, 39u, 6u, 39u, 6u, 39u, + 6u, 39u, 5u, 39u, 1u, 8u, 1u, 34u, + 8u, 28u, 8u, 28u, 5u, 39u, 1u, 39u, + 8u, 34u, 8u, 33u, 8u, 33u, 8u, 33u, + 8u, 32u, 8u, 32u, 8u, 8u, 8u, 34u, + 8u, 34u, 8u, 34u, 1u, 8u, 8u, 34u, + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, + 6u, 39u, 8u, 39u, 6u, 39u, 6u, 39u, + 6u, 39u, 5u, 39u, 1u, 8u, 1u, 8u, + 1u, 34u, 7u, 8u, 3u, 8u, 5u, 39u, + 5u, 39u, 1u, 39u, 8u, 34u, 8u, 33u, + 8u, 33u, 8u, 33u, 8u, 32u, 8u, 32u, + 8u, 8u, 8u, 34u, 8u, 34u, 8u, 34u, + 1u, 8u, 8u, 34u, 8u, 39u, 8u, 39u, + 8u, 39u, 8u, 39u, 6u, 39u, 8u, 39u, + 6u, 39u, 6u, 39u, 6u, 39u, 5u, 39u, + 1u, 8u, 1u, 8u, 1u, 34u, 5u, 39u, + 1u, 39u, 8u, 34u, 8u, 33u, 8u, 33u, + 8u, 33u, 8u, 32u, 8u, 32u, 8u, 8u, + 8u, 34u, 8u, 34u, 8u, 34u, 1u, 8u, + 8u, 34u, 8u, 39u, 8u, 39u, 8u, 39u, + 8u, 39u, 6u, 39u, 8u, 39u, 6u, 39u, + 6u, 39u, 6u, 39u, 5u, 39u, 1u, 8u, + 1u, 34u, 3u, 8u, 7u, 8u, 1u, 39u, + 8u, 28u, 8u, 28u, 1u, 4u, 8u, 38u, + 8u, 38u, 8u, 37u, 0u }; -static const char _use_syllable_machine_key_spans[] = { - 54, 43, 43, 53, 35, 34, 34, 34, - 33, 33, 1, 35, 35, 35, 14, 35, - 40, 40, 40, 40, 42, 40, 42, 42, - 42, 43, 14, 48, 43, 29, 29, 43, - 43, 53, 35, 34, 34, 34, 33, 33, - 1, 35, 35, 35, 14, 35, 40, 40, - 40, 40, 42, 40, 42, 42, 42, 43, - 14, 14, 48, 2, 11, 43, 43, 53, - 35, 34, 34, 34, 33, 33, 1, 35, - 35, 35, 14, 35, 40, 40, 40, 40, - 42, 40, 42, 42, 42, 43, 14, 14, - 48, 43, 43, 53, 35, 34, 34, 34, - 33, 33, 1, 35, 35, 35, 14, 35, - 40, 40, 40, 40, 42, 40, 42, 42, - 42, 43, 14, 48, 11, 2, 53, 43, - 29, 29, 5, 39, 39, 38 +static const signed char _use_syllable_machine_char_class[] = { + 0, 1, 2, 2, 3, 4, 2, 2, + 2, 2, 2, 5, 6, 7, 8, 2, + 2, 2, 9, 2, 2, 2, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 2, 24, 25, 26, + 2, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 0 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 55, 99, 143, 197, 233, 268, 303, - 338, 372, 406, 408, 444, 480, 516, 531, - 567, 608, 649, 690, 731, 774, 815, 858, - 901, 944, 988, 1003, 1052, 1096, 1126, 1156, - 1200, 1244, 1298, 1334, 1369, 1404, 1439, 1473, - 1507, 1509, 1545, 1581, 1617, 1632, 1668, 1709, - 1750, 1791, 1832, 1875, 1916, 1959, 2002, 2045, - 2089, 2104, 2119, 2168, 2171, 2183, 2227, 2271, - 2325, 2361, 2396, 2431, 2466, 2500, 2534, 2536, - 2572, 2608, 2644, 2659, 2695, 2736, 2777, 2818, - 2859, 2902, 2943, 2986, 3029, 3072, 3116, 3131, - 3146, 3195, 3239, 3283, 3337, 3373, 3408, 3443, - 3478, 3512, 3546, 3548, 3584, 3620, 3656, 3671, - 3707, 3748, 3789, 3830, 3871, 3914, 3955, 3998, - 4041, 4084, 4128, 4143, 4192, 4204, 4207, 4261, - 4305, 4335, 4365, 4371, 4411, 4451 + 0, 40, 75, 110, 149, 176, 202, 228, + 254, 279, 304, 305, 332, 359, 386, 394, + 421, 453, 485, 517, 549, 583, 615, 649, + 683, 717, 752, 760, 794, 815, 836, 871, + 910, 937, 963, 989, 1015, 1040, 1065, 1066, + 1093, 1120, 1147, 1155, 1182, 1214, 1246, 1278, + 1310, 1344, 1376, 1410, 1444, 1478, 1513, 1521, + 1529, 1563, 1565, 1571, 1606, 1641, 1680, 1707, + 1733, 1759, 1785, 1810, 1835, 1836, 1863, 1890, + 1917, 1925, 1952, 1984, 2016, 2048, 2080, 2114, + 2146, 2180, 2214, 2248, 2283, 2291, 2299, 2333, + 2368, 2407, 2434, 2460, 2486, 2512, 2537, 2562, + 2563, 2590, 2617, 2644, 2652, 2679, 2711, 2743, + 2775, 2807, 2841, 2873, 2907, 2941, 2975, 3010, + 3018, 3052, 3058, 3060, 3099, 3120, 3141, 3145, + 3176, 3207, 0 +}; + +static const short _use_syllable_machine_indicies[] = { + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 6, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 30, 34, 3, 35, 3, 36, + 38, 39, 37, 40, 37, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 38, 50, + 51, 52, 53, 54, 55, 56, 57, 58, + 37, 59, 60, 61, 62, 59, 37, 37, + 37, 37, 63, 38, 39, 37, 40, 37, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 38, 50, 51, 52, 53, 54, 55, + 56, 37, 37, 37, 59, 60, 61, 62, + 59, 37, 37, 37, 37, 63, 38, 37, + 37, 37, 37, 37, 37, 40, 37, 37, + 42, 43, 44, 45, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 54, 55, 56, + 37, 37, 37, 37, 60, 61, 62, 64, + 37, 37, 37, 37, 42, 40, 37, 37, + 42, 43, 44, 45, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 54, 55, 56, + 37, 37, 37, 37, 60, 61, 62, 64, + 40, 37, 37, 37, 43, 44, 45, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 60, + 61, 62, 40, 37, 37, 37, 37, 44, + 45, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 60, 61, 62, 40, 37, 37, 37, + 37, 37, 45, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 60, 61, 62, 40, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 60, 61, 40, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 61, + 40, 40, 37, 37, 37, 43, 44, 45, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 54, 55, 56, 37, 37, 37, 37, + 60, 61, 62, 64, 40, 37, 37, 37, + 43, 44, 45, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 55, 56, 37, + 37, 37, 37, 60, 61, 62, 64, 40, + 37, 37, 37, 43, 44, 45, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 56, 37, 37, 37, 37, 60, 61, + 62, 64, 65, 37, 37, 37, 37, 37, + 37, 40, 40, 37, 37, 37, 43, 44, + 45, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 60, 61, 62, 64, 40, 37, 41, + 42, 43, 44, 45, 37, 37, 37, 37, + 37, 37, 51, 52, 53, 54, 55, 56, + 37, 37, 37, 37, 60, 61, 62, 64, + 37, 37, 37, 37, 42, 40, 37, 37, + 42, 43, 44, 45, 37, 37, 37, 37, + 37, 37, 51, 52, 53, 54, 55, 56, + 37, 37, 37, 37, 60, 61, 62, 64, + 37, 37, 37, 37, 42, 40, 37, 37, + 42, 43, 44, 45, 37, 37, 37, 37, + 37, 37, 37, 52, 53, 54, 55, 56, + 37, 37, 37, 37, 60, 61, 62, 64, + 37, 37, 37, 37, 42, 40, 37, 37, + 42, 43, 44, 45, 37, 37, 37, 37, + 37, 37, 37, 37, 53, 54, 55, 56, + 37, 37, 37, 37, 60, 61, 62, 64, + 37, 37, 37, 37, 42, 66, 37, 40, + 37, 41, 42, 43, 44, 45, 37, 47, + 48, 37, 37, 37, 51, 52, 53, 54, + 55, 56, 37, 37, 37, 37, 60, 61, + 62, 64, 37, 37, 37, 37, 42, 40, + 37, 37, 42, 43, 44, 45, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 54, + 55, 56, 37, 37, 37, 37, 60, 61, + 62, 64, 37, 37, 37, 37, 42, 66, + 37, 40, 37, 41, 42, 43, 44, 45, + 37, 37, 48, 37, 37, 37, 51, 52, + 53, 54, 55, 56, 37, 37, 37, 37, + 60, 61, 62, 64, 37, 37, 37, 37, + 42, 66, 37, 40, 37, 41, 42, 43, + 44, 45, 37, 37, 37, 37, 37, 37, + 51, 52, 53, 54, 55, 56, 37, 37, + 37, 37, 60, 61, 62, 64, 37, 37, + 37, 37, 42, 66, 37, 40, 37, 41, + 42, 43, 44, 45, 46, 47, 48, 37, + 37, 37, 51, 52, 53, 54, 55, 56, + 37, 37, 37, 37, 60, 61, 62, 64, + 37, 37, 37, 37, 42, 38, 39, 37, + 40, 37, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 37, 50, 51, 52, 53, + 54, 55, 56, 37, 37, 37, 59, 60, + 61, 62, 59, 37, 37, 37, 37, 63, + 38, 37, 37, 37, 37, 37, 37, 40, + 38, 37, 37, 37, 37, 37, 37, 40, + 37, 37, 42, 43, 44, 45, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 54, + 55, 56, 37, 37, 37, 37, 60, 61, + 62, 64, 40, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 57, 58, 40, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 58, 2, 68, 67, 69, + 67, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 2, 79, 80, 81, 82, 83, + 84, 85, 67, 67, 67, 86, 87, 88, + 89, 90, 67, 67, 67, 67, 91, 2, + 67, 67, 67, 67, 67, 67, 69, 67, + 67, 71, 72, 73, 74, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 83, 84, + 85, 67, 67, 67, 67, 87, 88, 89, + 92, 67, 67, 67, 67, 71, 69, 67, + 67, 71, 72, 73, 74, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 83, 84, + 85, 67, 67, 67, 67, 87, 88, 89, + 92, 69, 67, 67, 67, 72, 73, 74, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 87, 88, 89, 69, 67, 67, 67, 67, + 73, 74, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 87, 88, 89, 69, 67, 67, + 67, 67, 67, 74, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 87, 88, 89, 69, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 87, 88, + 69, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 88, 69, 69, 67, 67, 67, 72, 73, + 74, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 83, 84, 85, 67, 67, 67, + 67, 87, 88, 89, 92, 69, 67, 67, + 67, 72, 73, 74, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 84, 85, + 67, 67, 67, 67, 87, 88, 89, 92, + 69, 67, 67, 67, 72, 73, 74, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 85, 67, 67, 67, 67, 87, + 88, 89, 92, 94, 93, 93, 93, 93, + 93, 93, 95, 69, 67, 67, 67, 72, + 73, 74, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 87, 88, 89, 92, 69, 67, + 70, 71, 72, 73, 74, 67, 67, 67, + 67, 67, 67, 80, 81, 82, 83, 84, + 85, 67, 67, 67, 67, 87, 88, 89, + 92, 67, 67, 67, 67, 71, 69, 67, + 67, 71, 72, 73, 74, 67, 67, 67, + 67, 67, 67, 80, 81, 82, 83, 84, + 85, 67, 67, 67, 67, 87, 88, 89, + 92, 67, 67, 67, 67, 71, 69, 67, + 67, 71, 72, 73, 74, 67, 67, 67, + 67, 67, 67, 67, 81, 82, 83, 84, + 85, 67, 67, 67, 67, 87, 88, 89, + 92, 67, 67, 67, 67, 71, 69, 67, + 67, 71, 72, 73, 74, 67, 67, 67, + 67, 67, 67, 67, 67, 82, 83, 84, + 85, 67, 67, 67, 67, 87, 88, 89, + 92, 67, 67, 67, 67, 71, 96, 67, + 69, 67, 70, 71, 72, 73, 74, 67, + 76, 77, 67, 67, 67, 80, 81, 82, + 83, 84, 85, 67, 67, 67, 67, 87, + 88, 89, 92, 67, 67, 67, 67, 71, + 69, 67, 67, 71, 72, 73, 74, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 83, 84, 85, 67, 67, 67, 67, 87, + 88, 89, 92, 67, 67, 67, 67, 71, + 96, 67, 69, 67, 70, 71, 72, 73, + 74, 67, 67, 77, 67, 67, 67, 80, + 81, 82, 83, 84, 85, 67, 67, 67, + 67, 87, 88, 89, 92, 67, 67, 67, + 67, 71, 96, 67, 69, 67, 70, 71, + 72, 73, 74, 67, 67, 67, 67, 67, + 67, 80, 81, 82, 83, 84, 85, 67, + 67, 67, 67, 87, 88, 89, 92, 67, + 67, 67, 67, 71, 96, 67, 69, 67, + 70, 71, 72, 73, 74, 75, 76, 77, + 67, 67, 67, 80, 81, 82, 83, 84, + 85, 67, 67, 67, 67, 87, 88, 89, + 92, 67, 67, 67, 67, 71, 2, 68, + 67, 69, 67, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 67, 79, 80, 81, + 82, 83, 84, 85, 67, 67, 67, 86, + 87, 88, 89, 90, 67, 67, 67, 67, + 91, 2, 97, 97, 97, 97, 97, 97, + 98, 2, 93, 93, 93, 93, 93, 93, + 95, 2, 67, 67, 67, 67, 67, 67, + 69, 67, 67, 71, 72, 73, 74, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 83, 84, 85, 67, 67, 67, 67, 87, + 88, 89, 92, 100, 101, 4, 102, 102, + 102, 102, 103, 104, 105, 67, 69, 67, + 106, 107, 108, 109, 110, 111, 112, 113, + 114, 104, 115, 116, 117, 118, 119, 120, + 121, 57, 58, 67, 122, 123, 124, 125, + 126, 67, 67, 67, 67, 127, 104, 105, + 67, 69, 67, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 104, 115, 116, 117, + 118, 119, 120, 121, 67, 67, 67, 122, + 123, 124, 125, 126, 67, 67, 67, 67, + 127, 104, 67, 67, 67, 67, 67, 67, + 69, 67, 67, 107, 108, 109, 110, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 119, 120, 121, 67, 67, 67, 67, 123, + 124, 125, 128, 67, 67, 67, 67, 107, + 69, 67, 67, 107, 108, 109, 110, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 119, 120, 121, 67, 67, 67, 67, 123, + 124, 125, 128, 69, 67, 67, 67, 108, + 109, 110, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 123, 124, 125, 69, 67, 67, + 67, 67, 109, 110, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 123, 124, 125, 69, + 67, 67, 67, 67, 67, 110, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 123, 124, + 125, 69, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 123, 124, 69, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 124, 69, 69, 67, 67, 67, + 108, 109, 110, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 119, 120, 121, 67, + 67, 67, 67, 123, 124, 125, 128, 69, + 67, 67, 67, 108, 109, 110, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 120, 121, 67, 67, 67, 67, 123, 124, + 125, 128, 69, 67, 67, 67, 108, 109, + 110, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 121, 67, 67, 67, + 67, 123, 124, 125, 128, 129, 93, 93, + 93, 93, 93, 93, 95, 69, 67, 67, + 67, 108, 109, 110, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 123, 124, 125, 128, + 69, 67, 106, 107, 108, 109, 110, 67, + 67, 67, 67, 67, 67, 116, 117, 118, + 119, 120, 121, 67, 67, 67, 67, 123, + 124, 125, 128, 67, 67, 67, 67, 107, + 69, 67, 67, 107, 108, 109, 110, 67, + 67, 67, 67, 67, 67, 116, 117, 118, + 119, 120, 121, 67, 67, 67, 67, 123, + 124, 125, 128, 67, 67, 67, 67, 107, + 69, 67, 67, 107, 108, 109, 110, 67, + 67, 67, 67, 67, 67, 67, 117, 118, + 119, 120, 121, 67, 67, 67, 67, 123, + 124, 125, 128, 67, 67, 67, 67, 107, + 69, 67, 67, 107, 108, 109, 110, 67, + 67, 67, 67, 67, 67, 67, 67, 118, + 119, 120, 121, 67, 67, 67, 67, 123, + 124, 125, 128, 67, 67, 67, 67, 107, + 130, 67, 69, 67, 106, 107, 108, 109, + 110, 67, 112, 113, 67, 67, 67, 116, + 117, 118, 119, 120, 121, 67, 67, 67, + 67, 123, 124, 125, 128, 67, 67, 67, + 67, 107, 69, 67, 67, 107, 108, 109, + 110, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 119, 120, 121, 67, 67, 67, + 67, 123, 124, 125, 128, 67, 67, 67, + 67, 107, 130, 67, 69, 67, 106, 107, + 108, 109, 110, 67, 67, 113, 67, 67, + 67, 116, 117, 118, 119, 120, 121, 67, + 67, 67, 67, 123, 124, 125, 128, 67, + 67, 67, 67, 107, 130, 67, 69, 67, + 106, 107, 108, 109, 110, 67, 67, 67, + 67, 67, 67, 116, 117, 118, 119, 120, + 121, 67, 67, 67, 67, 123, 124, 125, + 128, 67, 67, 67, 67, 107, 130, 67, + 69, 67, 106, 107, 108, 109, 110, 111, + 112, 113, 67, 67, 67, 116, 117, 118, + 119, 120, 121, 67, 67, 67, 67, 123, + 124, 125, 128, 67, 67, 67, 67, 107, + 104, 105, 67, 69, 67, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 67, 115, + 116, 117, 118, 119, 120, 121, 67, 67, + 67, 122, 123, 124, 125, 126, 67, 67, + 67, 67, 127, 104, 97, 97, 97, 97, + 97, 97, 98, 104, 93, 93, 93, 93, + 93, 93, 95, 104, 67, 67, 67, 67, + 67, 67, 69, 67, 67, 107, 108, 109, + 110, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 119, 120, 121, 67, 67, 67, + 67, 123, 124, 125, 128, 6, 7, 131, + 9, 131, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 6, 20, 21, 22, 23, + 24, 25, 26, 131, 131, 131, 30, 31, + 32, 33, 30, 131, 131, 131, 131, 36, + 6, 131, 131, 131, 131, 131, 131, 9, + 131, 131, 12, 13, 14, 15, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 24, + 25, 26, 131, 131, 131, 131, 31, 32, + 33, 132, 131, 131, 131, 131, 12, 9, + 131, 131, 12, 13, 14, 15, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 24, + 25, 26, 131, 131, 131, 131, 31, 32, + 33, 132, 9, 131, 131, 131, 13, 14, + 15, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 31, 32, 33, 9, 131, 131, 131, + 131, 14, 15, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 31, 32, 33, 9, 131, + 131, 131, 131, 131, 15, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 31, 32, 33, + 9, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 31, + 32, 9, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 32, 9, 9, 131, 131, 131, 13, + 14, 15, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 24, 25, 26, 131, 131, + 131, 131, 31, 32, 33, 132, 9, 131, + 131, 131, 13, 14, 15, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 25, + 26, 131, 131, 131, 131, 31, 32, 33, + 132, 9, 131, 131, 131, 13, 14, 15, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 26, 131, 131, 131, 131, + 31, 32, 33, 132, 133, 131, 131, 131, + 131, 131, 131, 9, 9, 131, 131, 131, + 13, 14, 15, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 31, 32, 33, 132, 9, + 131, 11, 12, 13, 14, 15, 131, 131, + 131, 131, 131, 131, 21, 22, 23, 24, + 25, 26, 131, 131, 131, 131, 31, 32, + 33, 132, 131, 131, 131, 131, 12, 9, + 131, 131, 12, 13, 14, 15, 131, 131, + 131, 131, 131, 131, 21, 22, 23, 24, + 25, 26, 131, 131, 131, 131, 31, 32, + 33, 132, 131, 131, 131, 131, 12, 9, + 131, 131, 12, 13, 14, 15, 131, 131, + 131, 131, 131, 131, 131, 22, 23, 24, + 25, 26, 131, 131, 131, 131, 31, 32, + 33, 132, 131, 131, 131, 131, 12, 9, + 131, 131, 12, 13, 14, 15, 131, 131, + 131, 131, 131, 131, 131, 131, 23, 24, + 25, 26, 131, 131, 131, 131, 31, 32, + 33, 132, 131, 131, 131, 131, 12, 134, + 131, 9, 131, 11, 12, 13, 14, 15, + 131, 17, 18, 131, 131, 131, 21, 22, + 23, 24, 25, 26, 131, 131, 131, 131, + 31, 32, 33, 132, 131, 131, 131, 131, + 12, 9, 131, 131, 12, 13, 14, 15, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 24, 25, 26, 131, 131, 131, 131, + 31, 32, 33, 132, 131, 131, 131, 131, + 12, 134, 131, 9, 131, 11, 12, 13, + 14, 15, 131, 131, 18, 131, 131, 131, + 21, 22, 23, 24, 25, 26, 131, 131, + 131, 131, 31, 32, 33, 132, 131, 131, + 131, 131, 12, 134, 131, 9, 131, 11, + 12, 13, 14, 15, 131, 131, 131, 131, + 131, 131, 21, 22, 23, 24, 25, 26, + 131, 131, 131, 131, 31, 32, 33, 132, + 131, 131, 131, 131, 12, 134, 131, 9, + 131, 11, 12, 13, 14, 15, 16, 17, + 18, 131, 131, 131, 21, 22, 23, 24, + 25, 26, 131, 131, 131, 131, 31, 32, + 33, 132, 131, 131, 131, 131, 12, 6, + 7, 131, 9, 131, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 131, 20, 21, + 22, 23, 24, 25, 26, 131, 131, 131, + 30, 31, 32, 33, 30, 131, 131, 131, + 131, 36, 6, 131, 131, 131, 131, 131, + 131, 9, 6, 131, 131, 131, 131, 131, + 131, 9, 131, 131, 12, 13, 14, 15, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 24, 25, 26, 131, 131, 131, 131, + 31, 32, 33, 132, 135, 131, 131, 131, + 131, 9, 8, 9, 2, 131, 131, 2, + 6, 7, 8, 9, 131, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 6, 20, + 21, 22, 23, 24, 25, 26, 27, 28, + 131, 30, 31, 32, 33, 30, 131, 131, + 131, 131, 36, 9, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 27, 28, + 9, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 28, 2, 136, 136, + 2, 138, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 139, 137, 34, + 138, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 34, 139, 137, 139, 138, + 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 34, 137, 35, 0 }; -static const unsigned char _use_syllable_machine_indicies[] = { - 0, 1, 2, 2, 3, 4, 2, 2, - 2, 2, 2, 5, 6, 7, 8, 2, - 2, 2, 9, 2, 2, 2, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 2, 24, 25, 26, - 2, 27, 28, 29, 30, 31, 32, 33, - 30, 34, 2, 35, 2, 36, 2, 38, - 39, 37, 40, 37, 37, 37, 37, 37, - 37, 37, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, - 37, 55, 56, 57, 37, 58, 59, 37, - 60, 61, 62, 63, 60, 37, 37, 37, - 37, 64, 37, 38, 39, 37, 40, 37, - 37, 37, 37, 37, 37, 37, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 51, - 51, 52, 53, 54, 37, 55, 56, 57, - 37, 37, 37, 37, 60, 61, 62, 63, - 60, 37, 37, 37, 37, 64, 37, 38, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 40, 37, 37, 37, - 37, 37, 37, 37, 37, 42, 43, 44, - 45, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 55, 56, 57, 37, 37, - 37, 37, 37, 61, 62, 63, 65, 37, - 37, 37, 37, 42, 37, 40, 37, 37, - 37, 37, 37, 37, 37, 37, 42, 43, - 44, 45, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 55, 56, 57, 37, - 37, 37, 37, 37, 61, 62, 63, 65, - 37, 40, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 43, 44, 45, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 61, 62, 63, 37, 40, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 44, - 45, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 61, 62, 63, 37, 40, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 45, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 61, 62, - 63, 37, 40, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 61, 62, 37, 40, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 62, 37, 40, 37, - 40, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 43, 44, 45, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 55, - 56, 57, 37, 37, 37, 37, 37, 61, - 62, 63, 65, 37, 40, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 43, 44, - 45, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 56, 57, 37, 37, - 37, 37, 37, 61, 62, 63, 65, 37, - 40, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 43, 44, 45, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 57, 37, 37, 37, 37, 37, 61, - 62, 63, 65, 37, 66, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 40, 37, 40, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 43, 44, 45, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 61, 62, 63, 65, 37, 40, - 37, 37, 37, 37, 37, 37, 37, 41, - 42, 43, 44, 45, 37, 37, 37, 37, - 37, 37, 52, 53, 54, 37, 55, 56, - 57, 37, 37, 37, 37, 37, 61, 62, - 63, 65, 37, 37, 37, 37, 42, 37, - 40, 37, 37, 37, 37, 37, 37, 37, - 37, 42, 43, 44, 45, 37, 37, 37, - 37, 37, 37, 52, 53, 54, 37, 55, - 56, 57, 37, 37, 37, 37, 37, 61, - 62, 63, 65, 37, 37, 37, 37, 42, - 37, 40, 37, 37, 37, 37, 37, 37, - 37, 37, 42, 43, 44, 45, 37, 37, - 37, 37, 37, 37, 37, 53, 54, 37, - 55, 56, 57, 37, 37, 37, 37, 37, - 61, 62, 63, 65, 37, 37, 37, 37, - 42, 37, 40, 37, 37, 37, 37, 37, - 37, 37, 37, 42, 43, 44, 45, 37, - 37, 37, 37, 37, 37, 37, 37, 54, - 37, 55, 56, 57, 37, 37, 37, 37, - 37, 61, 62, 63, 65, 37, 37, 37, - 37, 42, 37, 67, 37, 40, 37, 37, - 37, 37, 37, 37, 37, 41, 42, 43, - 44, 45, 37, 47, 48, 37, 37, 37, - 52, 53, 54, 37, 55, 56, 57, 37, - 37, 37, 37, 37, 61, 62, 63, 65, - 37, 37, 37, 37, 42, 37, 40, 37, - 37, 37, 37, 37, 37, 37, 37, 42, - 43, 44, 45, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 55, 56, 57, - 37, 37, 37, 37, 37, 61, 62, 63, - 65, 37, 37, 37, 37, 42, 37, 67, - 37, 40, 37, 37, 37, 37, 37, 37, - 37, 41, 42, 43, 44, 45, 37, 37, - 48, 37, 37, 37, 52, 53, 54, 37, - 55, 56, 57, 37, 37, 37, 37, 37, - 61, 62, 63, 65, 37, 37, 37, 37, - 42, 37, 67, 37, 40, 37, 37, 37, - 37, 37, 37, 37, 41, 42, 43, 44, - 45, 37, 37, 37, 37, 37, 37, 52, - 53, 54, 37, 55, 56, 57, 37, 37, - 37, 37, 37, 61, 62, 63, 65, 37, - 37, 37, 37, 42, 37, 67, 37, 40, - 37, 37, 37, 37, 37, 37, 37, 41, - 42, 43, 44, 45, 46, 47, 48, 37, - 37, 37, 52, 53, 54, 37, 55, 56, - 57, 37, 37, 37, 37, 37, 61, 62, - 63, 65, 37, 37, 37, 37, 42, 37, - 38, 39, 37, 40, 37, 37, 37, 37, - 37, 37, 37, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 37, 51, 52, 53, - 54, 37, 55, 56, 57, 37, 37, 37, - 37, 60, 61, 62, 63, 60, 37, 37, - 37, 37, 64, 37, 38, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 40, 37, 38, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 40, 37, 37, 37, 37, 37, 37, 37, - 37, 42, 43, 44, 45, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 55, - 56, 57, 37, 37, 37, 37, 37, 61, - 62, 63, 65, 37, 38, 39, 37, 40, - 37, 37, 37, 37, 37, 37, 37, 41, - 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 37, 55, 56, - 57, 37, 37, 37, 37, 60, 61, 62, - 63, 60, 37, 37, 37, 37, 64, 37, - 40, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 58, 59, 37, 40, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 59, 37, 69, 70, 68, 71, - 68, 68, 68, 68, 68, 68, 68, 72, - 73, 74, 75, 76, 77, 78, 79, 80, - 1, 81, 82, 83, 84, 68, 85, 86, - 87, 68, 68, 68, 68, 88, 89, 90, - 91, 92, 68, 68, 68, 68, 93, 68, - 69, 70, 68, 71, 68, 68, 68, 68, - 68, 68, 68, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 81, 82, 83, - 84, 68, 85, 86, 87, 68, 68, 68, - 68, 88, 89, 90, 91, 92, 68, 68, - 68, 68, 93, 68, 69, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 71, 68, 68, 68, 68, 68, 68, - 68, 68, 73, 74, 75, 76, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 85, 86, 87, 68, 68, 68, 68, 68, - 89, 90, 91, 94, 68, 68, 68, 68, - 73, 68, 71, 68, 68, 68, 68, 68, - 68, 68, 68, 73, 74, 75, 76, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 85, 86, 87, 68, 68, 68, 68, - 68, 89, 90, 91, 94, 68, 71, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 74, 75, 76, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 89, 90, 91, - 68, 71, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 75, 76, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 89, 90, 91, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 76, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 89, 90, 91, 68, 71, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 89, 90, - 68, 71, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 90, 68, 71, 68, 71, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 74, - 75, 76, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 85, 86, 87, 68, - 68, 68, 68, 68, 89, 90, 91, 94, - 68, 71, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 74, 75, 76, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 86, 87, 68, 68, 68, 68, 68, - 89, 90, 91, 94, 68, 71, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 74, - 75, 76, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 87, 68, - 68, 68, 68, 68, 89, 90, 91, 94, - 68, 96, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 97, 95, - 71, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 74, 75, 76, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 89, - 90, 91, 94, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 72, 73, 74, 75, - 76, 68, 68, 68, 68, 68, 68, 82, - 83, 84, 68, 85, 86, 87, 68, 68, - 68, 68, 68, 89, 90, 91, 94, 68, - 68, 68, 68, 73, 68, 71, 68, 68, - 68, 68, 68, 68, 68, 68, 73, 74, - 75, 76, 68, 68, 68, 68, 68, 68, - 82, 83, 84, 68, 85, 86, 87, 68, - 68, 68, 68, 68, 89, 90, 91, 94, - 68, 68, 68, 68, 73, 68, 71, 68, - 68, 68, 68, 68, 68, 68, 68, 73, - 74, 75, 76, 68, 68, 68, 68, 68, - 68, 68, 83, 84, 68, 85, 86, 87, - 68, 68, 68, 68, 68, 89, 90, 91, - 94, 68, 68, 68, 68, 73, 68, 71, - 68, 68, 68, 68, 68, 68, 68, 68, - 73, 74, 75, 76, 68, 68, 68, 68, - 68, 68, 68, 68, 84, 68, 85, 86, - 87, 68, 68, 68, 68, 68, 89, 90, - 91, 94, 68, 68, 68, 68, 73, 68, - 98, 68, 71, 68, 68, 68, 68, 68, - 68, 68, 72, 73, 74, 75, 76, 68, - 78, 79, 68, 68, 68, 82, 83, 84, - 68, 85, 86, 87, 68, 68, 68, 68, - 68, 89, 90, 91, 94, 68, 68, 68, - 68, 73, 68, 71, 68, 68, 68, 68, - 68, 68, 68, 68, 73, 74, 75, 76, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 85, 86, 87, 68, 68, 68, - 68, 68, 89, 90, 91, 94, 68, 68, - 68, 68, 73, 68, 98, 68, 71, 68, - 68, 68, 68, 68, 68, 68, 72, 73, - 74, 75, 76, 68, 68, 79, 68, 68, - 68, 82, 83, 84, 68, 85, 86, 87, - 68, 68, 68, 68, 68, 89, 90, 91, - 94, 68, 68, 68, 68, 73, 68, 98, - 68, 71, 68, 68, 68, 68, 68, 68, - 68, 72, 73, 74, 75, 76, 68, 68, - 68, 68, 68, 68, 82, 83, 84, 68, - 85, 86, 87, 68, 68, 68, 68, 68, - 89, 90, 91, 94, 68, 68, 68, 68, - 73, 68, 98, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 72, 73, 74, 75, - 76, 77, 78, 79, 68, 68, 68, 82, - 83, 84, 68, 85, 86, 87, 68, 68, - 68, 68, 68, 89, 90, 91, 94, 68, - 68, 68, 68, 73, 68, 69, 70, 68, - 71, 68, 68, 68, 68, 68, 68, 68, - 72, 73, 74, 75, 76, 77, 78, 79, - 80, 68, 81, 82, 83, 84, 68, 85, - 86, 87, 68, 68, 68, 68, 88, 89, - 90, 91, 92, 68, 68, 68, 68, 93, - 68, 69, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 100, 99, - 69, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 97, 95, 69, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 68, 73, 74, 75, - 76, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 85, 86, 87, 68, 68, - 68, 68, 68, 89, 90, 91, 94, 68, - 102, 103, 101, 3, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 105, 104, 106, - 107, 68, 71, 68, 68, 68, 68, 68, - 68, 68, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, - 68, 122, 123, 124, 68, 58, 59, 68, - 125, 126, 127, 128, 129, 68, 68, 68, - 68, 130, 68, 106, 107, 68, 71, 68, - 68, 68, 68, 68, 68, 68, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 118, - 118, 119, 120, 121, 68, 122, 123, 124, - 68, 68, 68, 68, 125, 126, 127, 128, - 129, 68, 68, 68, 68, 130, 68, 106, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 68, 109, 110, 111, - 112, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 122, 123, 124, 68, 68, - 68, 68, 68, 126, 127, 128, 131, 68, - 68, 68, 68, 109, 68, 71, 68, 68, - 68, 68, 68, 68, 68, 68, 109, 110, - 111, 112, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 122, 123, 124, 68, - 68, 68, 68, 68, 126, 127, 128, 131, - 68, 71, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 110, 111, 112, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 126, 127, 128, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 111, - 112, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 126, 127, 128, 68, 71, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 112, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 126, 127, - 128, 68, 71, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 126, 127, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 127, 68, 71, 68, - 71, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 110, 111, 112, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 122, - 123, 124, 68, 68, 68, 68, 68, 126, - 127, 128, 131, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 110, 111, - 112, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 123, 124, 68, 68, - 68, 68, 68, 126, 127, 128, 131, 68, - 71, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 110, 111, 112, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 124, 68, 68, 68, 68, 68, 126, - 127, 128, 131, 68, 132, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, - 95, 97, 95, 71, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 110, 111, 112, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 126, 127, 128, 131, 68, 71, - 68, 68, 68, 68, 68, 68, 68, 108, - 109, 110, 111, 112, 68, 68, 68, 68, - 68, 68, 119, 120, 121, 68, 122, 123, - 124, 68, 68, 68, 68, 68, 126, 127, - 128, 131, 68, 68, 68, 68, 109, 68, - 71, 68, 68, 68, 68, 68, 68, 68, - 68, 109, 110, 111, 112, 68, 68, 68, - 68, 68, 68, 119, 120, 121, 68, 122, - 123, 124, 68, 68, 68, 68, 68, 126, - 127, 128, 131, 68, 68, 68, 68, 109, - 68, 71, 68, 68, 68, 68, 68, 68, - 68, 68, 109, 110, 111, 112, 68, 68, - 68, 68, 68, 68, 68, 120, 121, 68, - 122, 123, 124, 68, 68, 68, 68, 68, - 126, 127, 128, 131, 68, 68, 68, 68, - 109, 68, 71, 68, 68, 68, 68, 68, - 68, 68, 68, 109, 110, 111, 112, 68, - 68, 68, 68, 68, 68, 68, 68, 121, - 68, 122, 123, 124, 68, 68, 68, 68, - 68, 126, 127, 128, 131, 68, 68, 68, - 68, 109, 68, 133, 68, 71, 68, 68, - 68, 68, 68, 68, 68, 108, 109, 110, - 111, 112, 68, 114, 115, 68, 68, 68, - 119, 120, 121, 68, 122, 123, 124, 68, - 68, 68, 68, 68, 126, 127, 128, 131, - 68, 68, 68, 68, 109, 68, 71, 68, - 68, 68, 68, 68, 68, 68, 68, 109, - 110, 111, 112, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 122, 123, 124, - 68, 68, 68, 68, 68, 126, 127, 128, - 131, 68, 68, 68, 68, 109, 68, 133, - 68, 71, 68, 68, 68, 68, 68, 68, - 68, 108, 109, 110, 111, 112, 68, 68, - 115, 68, 68, 68, 119, 120, 121, 68, - 122, 123, 124, 68, 68, 68, 68, 68, - 126, 127, 128, 131, 68, 68, 68, 68, - 109, 68, 133, 68, 71, 68, 68, 68, - 68, 68, 68, 68, 108, 109, 110, 111, - 112, 68, 68, 68, 68, 68, 68, 119, - 120, 121, 68, 122, 123, 124, 68, 68, - 68, 68, 68, 126, 127, 128, 131, 68, - 68, 68, 68, 109, 68, 133, 68, 71, - 68, 68, 68, 68, 68, 68, 68, 108, - 109, 110, 111, 112, 113, 114, 115, 68, - 68, 68, 119, 120, 121, 68, 122, 123, - 124, 68, 68, 68, 68, 68, 126, 127, - 128, 131, 68, 68, 68, 68, 109, 68, - 106, 107, 68, 71, 68, 68, 68, 68, - 68, 68, 68, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 68, 118, 119, 120, - 121, 68, 122, 123, 124, 68, 68, 68, - 68, 125, 126, 127, 128, 129, 68, 68, - 68, 68, 130, 68, 106, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 100, 99, 106, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, - 97, 95, 106, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 71, - 68, 68, 68, 68, 68, 68, 68, 68, - 109, 110, 111, 112, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 122, 123, - 124, 68, 68, 68, 68, 68, 126, 127, - 128, 131, 68, 106, 107, 68, 71, 68, - 68, 68, 68, 68, 68, 68, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 68, 122, 123, 124, - 68, 68, 68, 68, 125, 126, 127, 128, - 129, 68, 68, 68, 68, 130, 68, 5, - 6, 134, 8, 134, 134, 134, 134, 134, - 134, 134, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 20, 20, 21, 22, 23, - 134, 24, 25, 26, 134, 134, 134, 134, - 30, 31, 32, 33, 30, 134, 134, 134, - 134, 36, 134, 5, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 8, 134, 134, 134, 134, 134, 134, 134, - 134, 11, 12, 13, 14, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 24, - 25, 26, 134, 134, 134, 134, 134, 31, - 32, 33, 135, 134, 134, 134, 134, 11, - 134, 8, 134, 134, 134, 134, 134, 134, - 134, 134, 11, 12, 13, 14, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 24, 25, 26, 134, 134, 134, 134, 134, - 31, 32, 33, 135, 134, 8, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 12, - 13, 14, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 31, 32, 33, 134, - 8, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 13, 14, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 31, - 32, 33, 134, 8, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 14, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 31, 32, 33, 134, 8, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 31, 32, 134, - 8, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 32, 134, 8, 134, 8, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 12, 13, - 14, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 24, 25, 26, 134, 134, - 134, 134, 134, 31, 32, 33, 135, 134, - 8, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 12, 13, 14, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 25, 26, 134, 134, 134, 134, 134, 31, - 32, 33, 135, 134, 8, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 12, 13, - 14, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 26, 134, 134, - 134, 134, 134, 31, 32, 33, 135, 134, - 136, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 8, 134, 8, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 12, 13, 14, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 31, 32, - 33, 135, 134, 8, 134, 134, 134, 134, - 134, 134, 134, 10, 11, 12, 13, 14, - 134, 134, 134, 134, 134, 134, 21, 22, - 23, 134, 24, 25, 26, 134, 134, 134, - 134, 134, 31, 32, 33, 135, 134, 134, - 134, 134, 11, 134, 8, 134, 134, 134, - 134, 134, 134, 134, 134, 11, 12, 13, - 14, 134, 134, 134, 134, 134, 134, 21, - 22, 23, 134, 24, 25, 26, 134, 134, - 134, 134, 134, 31, 32, 33, 135, 134, - 134, 134, 134, 11, 134, 8, 134, 134, - 134, 134, 134, 134, 134, 134, 11, 12, - 13, 14, 134, 134, 134, 134, 134, 134, - 134, 22, 23, 134, 24, 25, 26, 134, - 134, 134, 134, 134, 31, 32, 33, 135, - 134, 134, 134, 134, 11, 134, 8, 134, - 134, 134, 134, 134, 134, 134, 134, 11, - 12, 13, 14, 134, 134, 134, 134, 134, - 134, 134, 134, 23, 134, 24, 25, 26, - 134, 134, 134, 134, 134, 31, 32, 33, - 135, 134, 134, 134, 134, 11, 134, 137, - 134, 8, 134, 134, 134, 134, 134, 134, - 134, 10, 11, 12, 13, 14, 134, 16, - 17, 134, 134, 134, 21, 22, 23, 134, - 24, 25, 26, 134, 134, 134, 134, 134, - 31, 32, 33, 135, 134, 134, 134, 134, - 11, 134, 8, 134, 134, 134, 134, 134, - 134, 134, 134, 11, 12, 13, 14, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 24, 25, 26, 134, 134, 134, 134, - 134, 31, 32, 33, 135, 134, 134, 134, - 134, 11, 134, 137, 134, 8, 134, 134, - 134, 134, 134, 134, 134, 10, 11, 12, - 13, 14, 134, 134, 17, 134, 134, 134, - 21, 22, 23, 134, 24, 25, 26, 134, - 134, 134, 134, 134, 31, 32, 33, 135, - 134, 134, 134, 134, 11, 134, 137, 134, - 8, 134, 134, 134, 134, 134, 134, 134, - 10, 11, 12, 13, 14, 134, 134, 134, - 134, 134, 134, 21, 22, 23, 134, 24, - 25, 26, 134, 134, 134, 134, 134, 31, - 32, 33, 135, 134, 134, 134, 134, 11, - 134, 137, 134, 8, 134, 134, 134, 134, - 134, 134, 134, 10, 11, 12, 13, 14, - 15, 16, 17, 134, 134, 134, 21, 22, - 23, 134, 24, 25, 26, 134, 134, 134, - 134, 134, 31, 32, 33, 135, 134, 134, - 134, 134, 11, 134, 5, 6, 134, 8, - 134, 134, 134, 134, 134, 134, 134, 10, - 11, 12, 13, 14, 15, 16, 17, 18, - 134, 20, 21, 22, 23, 134, 24, 25, - 26, 134, 134, 134, 134, 30, 31, 32, - 33, 30, 134, 134, 134, 134, 36, 134, - 5, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 8, 134, 5, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 8, 134, 134, 134, - 134, 134, 134, 134, 134, 11, 12, 13, - 14, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 24, 25, 26, 134, 134, - 134, 134, 134, 31, 32, 33, 135, 134, - 138, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 8, 134, 7, 8, 134, 1, - 134, 134, 134, 1, 134, 134, 134, 134, - 134, 5, 6, 7, 8, 134, 134, 134, - 134, 134, 134, 134, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 134, 24, 25, 26, 134, 27, - 28, 134, 30, 31, 32, 33, 30, 134, - 134, 134, 134, 36, 134, 5, 6, 134, - 8, 134, 134, 134, 134, 134, 134, 134, - 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 134, 24, - 25, 26, 134, 134, 134, 134, 30, 31, - 32, 33, 30, 134, 134, 134, 134, 36, - 134, 8, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 27, 28, 134, 8, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 28, 134, 1, 139, 139, - 139, 1, 139, 141, 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, - 140, 34, 140, 141, 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, 34, 142, - 140, 142, 140, 141, 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, 34, 140, - 35, 140, 0 +static const short _use_syllable_machine_index_defaults[] = { + 3, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 93, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 97, 93, + 67, 99, 102, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 93, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 97, 93, 67, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 136, 137, + 137, 137, 0 }; -static const char _use_syllable_machine_trans_targs[] = { - 1, 31, 0, 59, 61, 90, 91, 116, - 0, 118, 104, 92, 93, 94, 95, 108, - 110, 111, 112, 119, 113, 105, 106, 107, - 99, 100, 101, 120, 121, 122, 114, 96, - 97, 98, 123, 125, 115, 0, 2, 3, - 0, 16, 4, 5, 6, 7, 20, 22, - 23, 24, 28, 25, 17, 18, 19, 11, - 12, 13, 29, 30, 26, 8, 9, 10, - 27, 14, 15, 21, 0, 32, 33, 0, - 46, 34, 35, 36, 37, 50, 52, 53, - 54, 55, 47, 48, 49, 41, 42, 43, - 56, 38, 39, 40, 57, 58, 44, 0, - 45, 0, 51, 0, 0, 0, 60, 0, - 0, 0, 62, 63, 76, 64, 65, 66, - 67, 80, 82, 83, 84, 89, 85, 77, - 78, 79, 71, 72, 73, 86, 68, 69, - 70, 87, 88, 74, 75, 81, 0, 102, - 103, 109, 117, 0, 0, 0, 124 +static const signed char _use_syllable_machine_cond_targs[] = { + 0, 1, 30, 0, 57, 59, 87, 88, + 113, 0, 115, 101, 89, 90, 91, 92, + 105, 107, 108, 109, 110, 102, 103, 104, + 96, 97, 98, 116, 117, 118, 111, 93, + 94, 95, 119, 121, 112, 0, 2, 3, + 0, 16, 4, 5, 6, 7, 20, 22, + 23, 24, 25, 17, 18, 19, 11, 12, + 13, 28, 29, 26, 8, 9, 10, 27, + 14, 15, 21, 0, 31, 0, 44, 32, + 33, 34, 35, 48, 50, 51, 52, 53, + 45, 46, 47, 39, 40, 41, 54, 36, + 37, 38, 55, 56, 42, 0, 43, 0, + 49, 0, 0, 0, 58, 0, 0, 0, + 60, 61, 74, 62, 63, 64, 65, 78, + 80, 81, 82, 83, 75, 76, 77, 69, + 70, 71, 84, 66, 67, 68, 85, 86, + 72, 73, 79, 0, 99, 100, 106, 114, + 0, 0, 0, 120, 0 }; -static const char _use_syllable_machine_trans_actions[] = { - 0, 0, 3, 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, 5, 0, 0, - 6, 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, 7, 0, 0, 8, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, - 0, 10, 0, 11, 12, 13, 0, 14, - 15, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 0, - 0, 0, 0, 18, 19, 20, 0 +static const signed char _use_syllable_machine_cond_actions[] = { + 0, 0, 0, 3, 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, 5, 0, 0, + 6, 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, 7, 0, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 10, + 0, 11, 12, 13, 0, 14, 15, 16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 0, + 18, 19, 20, 0, 0 }; -static const char _use_syllable_machine_to_state_actions[] = { - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 +static const signed char _use_syllable_machine_to_state_actions[] = { + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 }; -static const char _use_syllable_machine_from_state_actions[] = { - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 +static const signed char _use_syllable_machine_from_state_actions[] = { + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 0, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 96, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 100, 96, 69, 102, 105, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 96, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 100, 96, - 69, 69, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 140, 141, 141, 141 + 1, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 94, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 98, 94, + 68, 100, 103, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 94, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 98, 94, 68, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 137, 138, + 138, 138, 0 }; static const int use_syllable_machine_start = 0; @@ -834,65 +701,65 @@ static const int use_syllable_machine_en_main = 0; #define found_syllable(syllable_type) \ - HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %u..%u %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \ - for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (syllable_serial == 16) syllable_serial = 1; \ - } HB_STMT_END +HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %u..%u %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \ + for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (syllable_serial == 16) syllable_serial = 1; \ + } HB_STMT_END template struct machine_index_t : - hb_iter_with_fallback_t, - typename Iter::item_t> +hb_iter_with_fallback_t, +typename Iter::item_t> { - machine_index_t (const Iter& it) : it (it) {} - machine_index_t (const machine_index_t& o) : hb_iter_with_fallback_t, - typename Iter::item_t> (), - it (o.it), is_null (o.is_null) {} - - static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; - static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; - - typename Iter::item_t __item__ () const { return *it; } - typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; } - unsigned __len__ () const { return it.len (); } - void __next__ () { ++it; } - void __forward__ (unsigned n) { it += n; } - void __prev__ () { --it; } - void __rewind__ (unsigned n) { it -= n; } - - void operator = (unsigned n) - { - assert (n == 0); - is_null = true; - } - explicit operator bool () { return !is_null; } - - void operator = (const machine_index_t& o) - { - is_null = o.is_null; - unsigned index = (*it).first; - unsigned n = (*o.it).first; - if (index < n) it += n - index; else if (index > n) it -= index - n; - } - bool operator == (const machine_index_t& o) const - { return is_null ? o.is_null : !o.is_null && (*it).first == (*o.it).first; } - bool operator != (const machine_index_t& o) const { return !(*this == o); } - - private: - Iter it; - bool is_null = false; + machine_index_t (const Iter& it) : it (it) {} + machine_index_t (const machine_index_t& o) : hb_iter_with_fallback_t, + typename Iter::item_t> (), + it (o.it), is_null (o.is_null) {} + + static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; + static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; + + typename Iter::item_t __item__ () const { return *it; } + typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; } + unsigned __len__ () const { return it.len (); } + void __next__ () { ++it; } + void __forward__ (unsigned n) { it += n; } + void __prev__ () { --it; } + void __rewind__ (unsigned n) { it -= n; } + + void operator = (unsigned n) + { + assert (n == 0); + is_null = true; + } + explicit operator bool () { return !is_null; } + + void operator = (const machine_index_t& o) + { + is_null = o.is_null; + unsigned index = (*it).first; + unsigned n = (*o.it).first; + if (index < n) it += n - index; else if (index > n) it -= index - n; + } + bool operator == (const machine_index_t& o) const + { return is_null ? o.is_null : !o.is_null && (*it).first == (*o.it).first; } + bool operator != (const machine_index_t& o) const { return !(*this == o); } + + private: + Iter it; + bool is_null = false; }; struct { - template - machine_index_t> - operator () (Iter&& it) const - { return machine_index_t> (hb_iter (it)); } + template + machine_index_t> + operator () (Iter&& it) const + { return machine_index_t> (hb_iter (it)); } } HB_FUNCOBJ (machine_index); @@ -905,172 +772,352 @@ not_ccs_default_ignorable (const hb_glyph_info_t &i) static inline void find_syllables_use (hb_buffer_t *buffer) { - hb_glyph_info_t *info = buffer->info; - auto p = - + hb_iter (info, buffer->len) - | hb_enumerate - | hb_filter ([] (const hb_glyph_info_t &i) { return not_ccs_default_ignorable (i); }, - hb_second) - | hb_filter ([&] (const hb_pair_t p) - { - if (p.second.use_category() == USE(ZWNJ)) - for (unsigned i = p.first + 1; i < buffer->len; ++i) - if (not_ccs_default_ignorable (info[i])) - return !_hb_glyph_info_is_unicode_mark (&info[i]); - return true; - }) - | hb_enumerate - | machine_index - ; - auto pe = p + p.len (); - auto eof = +pe; - auto ts = +p; - auto te = +p; - unsigned int act HB_UNUSED; - int cs; - -#line 922 "hb-ot-shaper-use-machine.hh" + hb_glyph_info_t *info = buffer->info; + auto p = + + hb_iter (info, buffer->len) + | hb_enumerate + | hb_filter ([] (const hb_glyph_info_t &i) { return not_ccs_default_ignorable (i); }, + hb_second) + | hb_filter ([&] (const hb_pair_t p) { - cs = use_syllable_machine_start; - ts = 0; - te = 0; - act = 0; - } + if (p.second.use_category() == USE(ZWNJ)) + for (unsigned i = p.first + 1; i < buffer->len; ++i) + if (not_ccs_default_ignorable (info[i])) + return !_hb_glyph_info_is_unicode_mark (&info[i]); + return true; + }) + | hb_enumerate + | machine_index + ; + auto pe = p + p.len (); + auto eof = +pe; + auto ts = +p; + auto te = +p; + unsigned int act HB_UNUSED; + int cs; +#line 792 "hb-ot-shaper-use-machine.hh" + { + cs = (int)use_syllable_machine_start; + ts = 0; + te = 0; + } + #line 282 "hb-ot-shaper-use-machine.rl" + + unsigned int syllable_serial = 1; - unsigned int syllable_serial = 1; - -#line 931 "hb-ot-shaper-use-machine.hh" +#line 801 "hb-ot-shaper-use-machine.hh" { - int _slen; - int _trans; - const unsigned char *_keys; - const unsigned char *_inds; - if ( p == pe ) - goto _test_eof; -_resume: - switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 2: + unsigned int _trans = 0; + const unsigned char * _keys; + const short * _inds; + int _ic; + _resume: {} + if ( p == pe && p != eof ) + goto _out; + switch ( _use_syllable_machine_from_state_actions[cs] ) { + case 2: { + { #line 1 "NONE" - {ts = p;} - break; -#line 943 "hb-ot-shaper-use-machine.hh" - } - - _keys = _use_syllable_machine_trans_keys + (cs<<1); - _inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs]; + {ts = p;}} + +#line 815 "hb-ot-shaper-use-machine.hh" - _slen = _use_syllable_machine_key_spans[cs]; - _trans = _inds[ _slen > 0 && _keys[0] <=( (*p).second.second.use_category()) && - ( (*p).second.second.use_category()) <= _keys[1] ? - ( (*p).second.second.use_category()) - _keys[0] : _slen ]; - -_eof_trans: - cs = _use_syllable_machine_trans_targs[_trans]; - - if ( _use_syllable_machine_trans_actions[_trans] == 0 ) - goto _again; - - switch ( _use_syllable_machine_trans_actions[_trans] ) { - case 12: + + break; + } + } + + if ( p == eof ) { + if ( _use_syllable_machine_eof_trans[cs] > 0 ) { + _trans = (unsigned int)_use_syllable_machine_eof_trans[cs] - 1; + } + } + else { + _keys = ( _use_syllable_machine_trans_keys + ((cs<<1))); + _inds = ( _use_syllable_machine_indicies + (_use_syllable_machine_index_offsets[cs])); + + if ( ((*p).second.second.use_category()) <= 53 ) { + _ic = (int)_use_syllable_machine_char_class[(int)((*p).second.second.use_category()) - 0]; + if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) + _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); + else + _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; + } + else { + _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; + } + + } + cs = (int)_use_syllable_machine_cond_targs[_trans]; + + if ( _use_syllable_machine_cond_actions[_trans] != 0 ) { + + switch ( _use_syllable_machine_cond_actions[_trans] ) { + case 12: { + { +#line 170 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ #line 170 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_virama_terminated_cluster); }} - break; - case 10: + found_syllable (use_virama_terminated_cluster); } + }} + +#line 855 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 10: { + { +#line 171 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ #line 171 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_sakot_terminated_cluster); }} - break; - case 8: + found_syllable (use_sakot_terminated_cluster); } + }} + +#line 867 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 8: { + { +#line 172 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ #line 172 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_standard_cluster); }} - break; - case 16: + found_syllable (use_standard_cluster); } + }} + +#line 879 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 16: { + { +#line 173 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ #line 173 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_number_joiner_terminated_cluster); }} - break; - case 14: + found_syllable (use_number_joiner_terminated_cluster); } + }} + +#line 891 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 14: { + { +#line 174 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ #line 174 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_numeral_cluster); }} - break; - case 6: + found_syllable (use_numeral_cluster); } + }} + +#line 903 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 6: { + { +#line 175 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ #line 175 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_symbol_cluster); }} - break; - case 20: + found_syllable (use_symbol_cluster); } + }} + +#line 915 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 20: { + { #line 176 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_hieroglyph_cluster); }} - break; - case 4: + {te = p+1;{ +#line 176 "hb-ot-shaper-use-machine.rl" + found_syllable (use_hieroglyph_cluster); } + }} + +#line 927 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 4: { + { #line 177 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} - break; - case 3: + {te = p+1;{ +#line 177 "hb-ot-shaper-use-machine.rl" + found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; } + }} + +#line 939 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 3: { + { #line 178 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ found_syllable (use_non_cluster); }} - break; - case 11: + {te = p+1;{ +#line 178 "hb-ot-shaper-use-machine.rl" + found_syllable (use_non_cluster); } + }} + +#line 951 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 11: { + { #line 170 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_virama_terminated_cluster); }} - break; - case 9: + {te = p;p = p - 1;{ +#line 170 "hb-ot-shaper-use-machine.rl" + found_syllable (use_virama_terminated_cluster); } + }} + +#line 963 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 9: { + { #line 171 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_sakot_terminated_cluster); }} - break; - case 7: + {te = p;p = p - 1;{ +#line 171 "hb-ot-shaper-use-machine.rl" + found_syllable (use_sakot_terminated_cluster); } + }} + +#line 975 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 7: { + { #line 172 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_standard_cluster); }} - break; - case 15: + {te = p;p = p - 1;{ +#line 172 "hb-ot-shaper-use-machine.rl" + found_syllable (use_standard_cluster); } + }} + +#line 987 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 15: { + { #line 173 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_number_joiner_terminated_cluster); }} - break; - case 13: + {te = p;p = p - 1;{ +#line 173 "hb-ot-shaper-use-machine.rl" + found_syllable (use_number_joiner_terminated_cluster); } + }} + +#line 999 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 13: { + { +#line 174 "hb-ot-shaper-use-machine.rl" + {te = p;p = p - 1;{ #line 174 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_numeral_cluster); }} - break; - case 5: + found_syllable (use_numeral_cluster); } + }} + +#line 1011 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 5: { + { +#line 175 "hb-ot-shaper-use-machine.rl" + {te = p;p = p - 1;{ #line 175 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_symbol_cluster); }} - break; - case 19: + found_syllable (use_symbol_cluster); } + }} + +#line 1023 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 19: { + { +#line 176 "hb-ot-shaper-use-machine.rl" + {te = p;p = p - 1;{ #line 176 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_hieroglyph_cluster); }} - break; - case 17: + found_syllable (use_hieroglyph_cluster); } + }} + +#line 1035 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 17: { + { +#line 177 "hb-ot-shaper-use-machine.rl" + {te = p;p = p - 1;{ #line 177 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} - break; - case 18: + found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; } + }} + +#line 1047 "hb-ot-shaper-use-machine.hh" + + + break; + } + case 18: { + { #line 178 "hb-ot-shaper-use-machine.rl" - {te = p;p--;{ found_syllable (use_non_cluster); }} - break; -#line 1014 "hb-ot-shaper-use-machine.hh" - } + {te = p;p = p - 1;{ +#line 178 "hb-ot-shaper-use-machine.rl" + found_syllable (use_non_cluster); } + }} + +#line 1059 "hb-ot-shaper-use-machine.hh" -_again: - switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 1: + + break; + } + } + + } + + if ( p == eof ) { + if ( cs >= 0 ) + goto _out; + } + else { + switch ( _use_syllable_machine_to_state_actions[cs] ) { + case 1: { + { #line 1 "NONE" - {ts = 0;} - break; -#line 1021 "hb-ot-shaper-use-machine.hh" - } + {ts = 0;}} + +#line 1078 "hb-ot-shaper-use-machine.hh" - if ( ++p != pe ) - goto _resume; - _test_eof: {} - if ( p == eof ) - { - if ( _use_syllable_machine_eof_trans[cs] > 0 ) { - _trans = _use_syllable_machine_eof_trans[cs] - 1; - goto _eof_trans; - } + + break; + } + } + + p += 1; + goto _resume; + } + _out: {} } - - } - + #line 287 "hb-ot-shaper-use-machine.rl" } diff --git a/test/shape/data/in-house/tests/macos.tests b/test/shape/data/in-house/tests/macos.tests index 918b03ad3..44e1ce00b 100644 --- a/test/shape/data/in-house/tests/macos.tests +++ b/test/shape/data/in-house/tests/macos.tests @@ -18,7 +18,7 @@ /System/Library/Fonts/ヒラギノ丸ゴ\ ProN\ W4.ttc;--features=palt;U+FF11;[gid781=0@-78,0+842] # https://github.com/harfbuzz/harfbuzz/pull/2871 -/System/Library/Fonts/LucidaGrande.ttc;--font-funcs ot --show-flags;U+0041,U+0042,U+0043,U+0044;[A=0+1413|B=1+1178#2|C=2+1417#2|D=3+1534#2] +/System/Library/Fonts/LucidaGrande.ttc;--font-funcs ot --show-flags;U+0041,U+0042,U+0043,U+0044;[A=0+1413#2|B=1+1178#2|C=2+1417#2|D=3+1534#2] # 10.12.6 https;//gist.github.com/ebraminio/1704341fa16b06979e605aafd88198cf /System/Library/Fonts/Helvetica.dfont@c7bec2785a4c402b7809b5e35337c3d24c18e281;--font-funcs ot;U+006D,U+0300;[m=0+1706|gravecmb=0@-284,10+0] -- cgit v1.2.3 From ebdfa9838bd0170ee2f3bc766dbdad659a0e870c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 12:22:55 -0600 Subject: [perf] Measure freetype face loading as well --- perf/benchmark-font.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/perf/benchmark-font.cc b/perf/benchmark-font.cc index dfe1fa27f..244e06ad4 100644 --- a/perf/benchmark-font.cc +++ b/perf/benchmark-font.cc @@ -203,6 +203,19 @@ static void BM_Font (benchmark::State &state, hb_font_t *font = hb_font_create (face); hb_face_destroy (face); + switch (backend) + { + case HARFBUZZ: + hb_ot_font_set_funcs (font); + break; + + case FREETYPE: +#ifdef HAVE_FREETYPE + hb_ft_font_set_funcs (font); +#endif + break; + } + hb_buffer_t *buffer = hb_buffer_create (); hb_buffer_add_utf8 (buffer, " ", -1, 0, -1); hb_buffer_guess_segment_properties (buffer); -- cgit v1.2.3 From dc35a0fbcb960f57df6c09a548651028c19e9790 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 16:32:11 -0600 Subject: [ot-map] Speed up feature finding New API: - hb_ot_layout_collect_feature_map() --- docs/harfbuzz-sections.txt | 1 + src/hb-ot-layout.cc | 39 ++++++++++++++++++++++++++++++++++++++- src/hb-ot-layout.h | 7 +++++++ src/hb-ot-map.cc | 22 +++++++++++++++------- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt index fd07b81fe..46d0a16d9 100644 --- a/docs/harfbuzz-sections.txt +++ b/docs/harfbuzz-sections.txt @@ -619,6 +619,7 @@ hb_ot_tags_from_script_and_language hb_ot_tags_to_script_and_language hb_ot_layout_collect_lookups hb_ot_layout_collect_features +hb_ot_layout_collect_features_map hb_ot_layout_feature_get_characters hb_ot_layout_feature_get_lookups hb_ot_layout_feature_get_name_ids diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 020b8a6c8..e6bd74b33 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1241,7 +1241,7 @@ script_collect_features (hb_collect_features_context_t *c, * terminated by %HB_TAG_NONE * @features: (nullable) (array zero-terminated=1): The array of features to collect, * terminated by %HB_TAG_NONE - * @feature_indexes: (out): The array of feature indexes found for the query + * @feature_indexes: (out): The set of feature indexes found for the query * * Fetches a list of all feature indexes in the specified face's GSUB table * or GPOS table, underneath the specified scripts, languages, and features. @@ -1282,6 +1282,43 @@ hb_ot_layout_collect_features (hb_face_t *face, } } +/** + * hb_ot_layout_collect_features_map: + * @face: #hb_face_t to work upon + * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS + * @script_index: The index of the requested script tag + * @language_index: The index of the requested language tag + * @feature_map: (out): The map of feature tag to feature index. + * + * Fetches the mapping from feature tags to feature indexes for + * the specified script and language. + * + * XSince: REPLACEME + **/ +void +hb_ot_layout_collect_features_map (hb_face_t *face, + hb_tag_t table_tag, + unsigned script_index, + unsigned language_index, + hb_map_t *feature_map /* OUT */) +{ + const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag); + const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index); + + unsigned int count = l.get_feature_indexes (0, nullptr, nullptr); + + for (unsigned int i = 0; i < count; i++) + { + unsigned feature_index = 0; + unsigned feature_count = 1; + l.get_feature_indexes (i, &feature_count, &feature_index); + if (!feature_count) + break; + hb_tag_t feature_tag = g.get_feature_tag (feature_index); + feature_map->set (feature_tag, feature_index); + } +} + /** * hb_ot_layout_collect_lookups: diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h index b0fae3707..386b98d58 100644 --- a/src/hb-ot-layout.h +++ b/src/hb-ot-layout.h @@ -324,6 +324,13 @@ hb_ot_layout_collect_features (hb_face_t *face, const hb_tag_t *features, hb_set_t *feature_indexes /* OUT */); +HB_EXTERN void +hb_ot_layout_collect_features_map (hb_face_t *face, + hb_tag_t table_tag, + unsigned script_index, + unsigned language_index, + hb_map_t *feature_map /* OUT */); + HB_EXTERN void hb_ot_layout_collect_lookups (hb_face_t *face, hb_tag_t table_tag, diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc index bacd56ef3..fac73eb34 100644 --- a/src/hb-ot-map.cc +++ b/src/hb-ot-map.cc @@ -239,6 +239,13 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, feature_infos.shrink (j + 1); } + hb_map_t feature_indices[2]; + for (unsigned int table_index = 0; table_index < 2; table_index++) + hb_ot_layout_collect_features_map (face, + table_tags[table_index], + script_index[table_index], + language_index[table_index], + &feature_indices[table_index]); /* Allocate bits now */ static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), ""); @@ -261,7 +268,6 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, if (!info->max_value || next_bit + bits_needed >= global_bit_shift) continue; /* Feature disabled, or not enough bits. */ - bool found = false; unsigned int feature_index[2]; for (unsigned int table_index = 0; table_index < 2; table_index++) @@ -269,12 +275,14 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, if (required_feature_tag[table_index] == info->tag) required_feature_stage[table_index] = info->stage[table_index]; - found |= (bool) hb_ot_layout_language_find_feature (face, - table_tags[table_index], - script_index[table_index], - language_index[table_index], - info->tag, - &feature_index[table_index]); + hb_codepoint_t *index; + if (feature_indices[table_index].has (info->tag, &index)) + { + feature_index[table_index] = *index; + found = true; + } + else + feature_index[table_index] = HB_OT_LAYOUT_NO_FEATURE_INDEX; } if (!found && (info->flags & F_GLOBAL_SEARCH)) { -- cgit v1.2.3 From a41368bd7a0bf14c54b311a4455f7fdc5aa2df4b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 17:04:02 -0600 Subject: [buffer] Minor micro-optimize --- src/hb-buffer.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index ace2a104f..749ef9bd4 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -499,12 +499,12 @@ hb_buffer_t::set_masks (hb_mask_t value, unsigned int cluster_start, unsigned int cluster_end) { - hb_mask_t not_mask = ~mask; - value &= mask; - if (!mask) return; + hb_mask_t not_mask = ~mask; + value &= mask; + unsigned int count = len; for (unsigned int i = 0; i < count; i++) if (cluster_start <= info[i].cluster && info[i].cluster < cluster_end) -- cgit v1.2.3 From 29ad9304e2b0cd84fbf125dfa907cd20d141fc70 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 30 Jul 2023 17:06:25 -0600 Subject: [layout] Minor add prealloc --- src/hb-ot-layout.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index e6bd74b33..7ee48f800 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1306,6 +1306,7 @@ hb_ot_layout_collect_features_map (hb_face_t *face, const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index); unsigned int count = l.get_feature_indexes (0, nullptr, nullptr); + feature_map->alloc (count); for (unsigned int i = 0; i < count; i++) { -- cgit v1.2.3 From d9c4d3edf0e2dcc8e1653cffad114110a59f691d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 12:43:12 -0600 Subject: [uniscribe] Fix warnings --- src/hb-uniscribe.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc index 9648e0266..1b8ac367e 100644 --- a/src/hb-uniscribe.cc +++ b/src/hb-uniscribe.cc @@ -699,7 +699,7 @@ retry: script_tags, &item_count); if (unlikely (FAILED (hr))) - FAIL ("ScriptItemizeOpenType() failed: 0x%08lx", hr); + FAIL ("ScriptItemizeOpenType() failed: 0x%08lx", (unsigned long) hr); #undef MAX_ITEMS @@ -785,7 +785,7 @@ retry: } if (unlikely (FAILED (hr))) { - FAIL ("ScriptShapeOpenType() failed: 0x%08lx", hr); + FAIL ("ScriptShapeOpenType() failed: 0x%08lx", (unsigned long) hr); } for (unsigned int j = chars_offset; j < chars_offset + item_chars_len; j++) @@ -811,7 +811,7 @@ retry: offsets + glyphs_offset, nullptr); if (unlikely (FAILED (hr))) - FAIL ("ScriptPlaceOpenType() failed: 0x%08lx", hr); + FAIL ("ScriptPlaceOpenType() failed: 0x%08lx", (unsigned long) hr); if (DEBUG_ENABLED (UNISCRIBE)) fprintf (stderr, "Item %d RTL %d LayoutRTL %d LogicalOrder %d ScriptTag %c%c%c%c\n", -- cgit v1.2.3 From bd84458a951e2e8e7390ec45d3c0b0bfc30eca19 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 13:27:15 -0600 Subject: [ci] Try uploading msys artefacts (#4353) * [ci] Try uploading msys artefacts * [ci] Always upload DLLs from msys2 * [ci] Rename artifacts * Another try --- .github/workflows/msys2-ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/msys2-ci.yml b/.github/workflows/msys2-ci.yml index 030aee4e0..8665433d9 100644 --- a/.github/workflows/msys2-ci.yml +++ b/.github/workflows/msys2-ci.yml @@ -71,3 +71,9 @@ jobs: run: meson compile -Cbuild - name: Test run: meson test --print-errorlogs --suite=harfbuzz -Cbuild + - name: Upload DLL + if: always() + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: libharfbuzz-0.dll-${{ matrix.MSYS2_ARCH }} + path: ./build/src/libharfbuzz-0.dll -- cgit v1.2.3 From 59f5f2651525c9d41d3394f9ef021f624b097346 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 15:09:11 -0600 Subject: [ci/msys] Don't install freetype (#4354) * [ci/msys] Try deleting system harfbuzz DLL --- .github/workflows/msys2-ci.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/msys2-ci.yml b/.github/workflows/msys2-ci.yml index 8665433d9..52e8cfeb5 100644 --- a/.github/workflows/msys2-ci.yml +++ b/.github/workflows/msys2-ci.yml @@ -54,6 +54,9 @@ jobs: mingw-w64-${{ matrix.MSYS2_ARCH }}-pkg-config mingw-w64-${{ matrix.MSYS2_ARCH }}-python mingw-w64-${{ matrix.MSYS2_ARCH }}-python-pip + - name: Remove installed HarfBuzz DLLs + run: | + rm -f -v /ming*/bin/libharfbuzz-*.dll - name: Install Python Dependencies run: | pip3 install -r .ci/requirements-fonttools.txt --require-hashes @@ -71,9 +74,9 @@ jobs: run: meson compile -Cbuild - name: Test run: meson test --print-errorlogs --suite=harfbuzz -Cbuild - - name: Upload DLL + - name: Upload DLLs if: always() uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: - name: libharfbuzz-0.dll-${{ matrix.MSYS2_ARCH }} - path: ./build/src/libharfbuzz-0.dll + name: libharfbuzz-${{ matrix.MSYS2_ARCH }} + path: ./build/src/libharfbuzz-*.dll -- cgit v1.2.3 From db608229d1633f9cbea3b5223d6548e803fb08c7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 15:16:43 -0600 Subject: [README] Update --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 87f5755cb..cb075e3af 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,9 @@ HarfBuzz is a text shaping engine. It primarily supports [OpenType][1], but also [Apple Advanced Typography][2]. HarfBuzz is used in Android, Chrome, -ChromeOS, Firefox, GNOME, GTK+, KDE, LibreOffice, OpenJDK, PlayStation, Qt, -XeTeX, and other places. +ChromeOS, Firefox, GNOME, GTK+, KDE, Qt, LibreOffice, OpenJDK, XeTeX, +PlayStation, Microsoft Edge, Photoshop, Illustrator, InDesign, +and other places. For bug reports, mailing list, and other information please visit: -- cgit v1.2.3 From 847e4a7607b6ddd97bd9d59c047d18736a566428 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 15:21:51 -0600 Subject: Bump github/codeql-action from 2.21.0 to 2.21.2 (#4352) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.21.0 to 2.21.2. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/1813ca74c3faaa3a2da2070b9b8a0b3e7373a0d8...0ba4244466797eb048eb91a6cd43d5c03ca8bd05) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 6aaae1c05..3432dbec9 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@1813ca74c3faaa3a2da2070b9b8a0b3e7373a0d8 # v2.21.0 + uses: github/codeql-action/upload-sarif@0ba4244466797eb048eb91a6cd43d5c03ca8bd05 # v2.21.2 with: sarif_file: results.sarif -- cgit v1.2.3 From fcb9e5915f5d20b20576612efd4ee15d9da04c8a Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Tue, 1 Aug 2023 00:57:06 +0300 Subject: 8.1.0 --- NEWS | 21 +++++++++++++++++++-- configure.ac | 2 +- docs/harfbuzz-docs.xml | 1 + meson.build | 2 +- src/hb-ot-layout.cc | 2 +- src/hb-version.h | 6 +++--- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index 98867b0e6..ef21e1e17 100644 --- a/NEWS +++ b/NEWS @@ -1,12 +1,29 @@ +Overview of changes leading to 8.1.0 +Tuesday, August 1, 2023 +==================================== +- Fix long-standing build issue with the AIX compiler and older Apple clang. + +- Revert optimization that could cause timeout during subsetting with malicious fonts. + +- More optimization work: + - 45% speed up in shaping Noto Duployan font. + - 10% speed up in subsetting Noto Duployan font. + - Another 8% speed up in shaping Gulzar. + - 5% speed up in loading Roboto. + +- New API: ++hb_ot_layout_collect_features_map() + + Overview of changes leading to 8.0.1 Wednesday, July 12, 2023 ==================================== - Build fix on 32-bit ARM. - More speed optimizations: - - 60% speedup in retaingids subsetting SourceHanSans-VF. - - 38% speed up in subsetting (beyond-64k) mega-merged Noto. + - 60% speed up in retain-gid (used for IFT) subsetting of SourceHanSans-VF. - 16% speed up in retain-gid (used for IFT) subsetting of NotoSansCJKkr. + - 38% speed up in subsetting (beyond-64k) mega-merged Noto. Overview of changes leading to 8.0.0 diff --git a/configure.ac b/configure.ac index 3de964bc5..d6361b0db 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [8.0.1], + [8.1.0], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/docs/harfbuzz-docs.xml b/docs/harfbuzz-docs.xml index 952705af9..53b0a79a1 100644 --- a/docs/harfbuzz-docs.xml +++ b/docs/harfbuzz-docs.xml @@ -120,6 +120,7 @@ API Index Index of deprecated API + Index of new symbols in 8.1.0 Index of new symbols in 8.0.0 Index of new symbols in 7.3.0 Index of new symbols in 7.1.0 diff --git a/meson.build b/meson.build index c3062c72f..2e459ce96 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('harfbuzz', 'c', 'cpp', meson_version: '>= 0.55.0', - version: '8.0.1', + version: '8.1.0', default_options: [ 'cpp_eh=none', # Just to support msvc, we are passing -fno-exceptions also anyway 'cpp_rtti=false', # Just to support msvc, we are passing -fno-rtti also anyway diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 7ee48f800..5ce36693a 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1293,7 +1293,7 @@ hb_ot_layout_collect_features (hb_face_t *face, * Fetches the mapping from feature tags to feature indexes for * the specified script and language. * - * XSince: REPLACEME + * Since: 8.1.0 **/ void hb_ot_layout_collect_features_map (hb_face_t *face, diff --git a/src/hb-version.h b/src/hb-version.h index c29012232..1b5f05cef 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -47,20 +47,20 @@ HB_BEGIN_DECLS * * The minor component of the library version available at compile-time. */ -#define HB_VERSION_MINOR 0 +#define HB_VERSION_MINOR 1 /** * HB_VERSION_MICRO: * * The micro component of the library version available at compile-time. */ -#define HB_VERSION_MICRO 1 +#define HB_VERSION_MICRO 0 /** * HB_VERSION_STRING: * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "8.0.1" +#define HB_VERSION_STRING "8.1.0" /** * HB_VERSION_ATLEAST: -- cgit v1.2.3 From b382e616cc807fe16da0fe7baca6dc2335fab987 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 16:29:28 -0600 Subject: [GPOS] Sanitize Cursive positioning anchors lazily Speeds up Duployan-Regular.otf load time by 30%. Doesn't seem to slow down shaping in a measurable way. --- src/OT/Layout/GPOS/CursivePosFormat1.hh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/OT/Layout/GPOS/CursivePosFormat1.hh index 675bb83bc..626c9171c 100644 --- a/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -91,7 +91,13 @@ struct CursivePosFormat1 bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (coverage.sanitize (c, this) && entryExitRecord.sanitize (c, this)); + if (unlikely (!coverage.sanitize (c, this))) + return_trace (false); + + if (c->lazy_some_gpos) + return_trace (entryExitRecord.sanitize_shallow (c)); + else + return_trace (entryExitRecord.sanitize (c, this)); } bool intersects (const hb_set_t *glyphs) const @@ -120,6 +126,7 @@ struct CursivePosFormat1 const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)]; if (!this_record.entryAnchor) return_trace (false); + if (unlikely (!this_record.sanitize (&c->sanitizer, this))) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset_fast (buffer->idx, 1); @@ -136,6 +143,7 @@ struct CursivePosFormat1 buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1); return_trace (false); } + if (unlikely (!prev_record.sanitize (&c->sanitizer, this))) return_trace (false); unsigned int i = skippy_iter.idx; unsigned int j = buffer->idx; -- cgit v1.2.3 From 44026aa8a992b7105a615f1fbaaf0e342b634efa Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 16:47:06 -0600 Subject: [Cursive] Minor, adjust unsafe-to-concat if prev didn't sanitize --- src/OT/Layout/GPOS/CursivePosFormat1.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/OT/Layout/GPOS/CursivePosFormat1.hh index 626c9171c..e6127b220 100644 --- a/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -125,8 +125,8 @@ struct CursivePosFormat1 hb_buffer_t *buffer = c->buffer; const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)]; - if (!this_record.entryAnchor) return_trace (false); - if (unlikely (!this_record.sanitize (&c->sanitizer, this))) return_trace (false); + if (!this_record.entryAnchor || + unlikely (!this_record.sanitize (&c->sanitizer, this))) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset_fast (buffer->idx, 1); @@ -138,12 +138,12 @@ struct CursivePosFormat1 } const EntryExitRecord &prev_record = entryExitRecord[(this+coverage).get_coverage (buffer->info[skippy_iter.idx].codepoint)]; - if (!prev_record.exitAnchor) + if (!prev_record.exitAnchor || + unlikely (!prev_record.sanitize (&c->sanitizer, this))) { buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1); return_trace (false); } - if (unlikely (!prev_record.sanitize (&c->sanitizer, this))) return_trace (false); unsigned int i = skippy_iter.idx; unsigned int j = buffer->idx; -- cgit v1.2.3 From 25e9defa516d63b12a659282a13dc9e1fe522cc8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 17:12:07 -0600 Subject: [sanitize] Inline check_struct Though seems like the compiler was always inlining it anyway. --- src/hb-sanitize.hh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index 8d9ecce8d..efb5adde5 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -382,6 +382,9 @@ struct hb_sanitize_context_t : } template +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif bool check_struct (const Type *obj) const { if (sizeof (uintptr_t) == sizeof (uint32_t)) -- cgit v1.2.3 From 9cdc043c16d319268677a9098c83dc572d279c99 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 18:53:29 -0600 Subject: [Cursive] Only sanitize what we use --- src/OT/Layout/GPOS/CursivePosFormat1.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/OT/Layout/GPOS/CursivePosFormat1.hh index e6127b220..d4a53fc86 100644 --- a/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -126,7 +126,7 @@ struct CursivePosFormat1 const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)]; if (!this_record.entryAnchor || - unlikely (!this_record.sanitize (&c->sanitizer, this))) return_trace (false); + unlikely (!this_record.entryAnchor.sanitize (&c->sanitizer, this))) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset_fast (buffer->idx, 1); @@ -139,7 +139,7 @@ struct CursivePosFormat1 const EntryExitRecord &prev_record = entryExitRecord[(this+coverage).get_coverage (buffer->info[skippy_iter.idx].codepoint)]; if (!prev_record.exitAnchor || - unlikely (!prev_record.sanitize (&c->sanitizer, this))) + unlikely (!prev_record.exitAnchor.sanitize (&c->sanitizer, this))) { buffer->unsafe_to_concat_from_outbuffer (skippy_iter.idx, buffer->idx + 1); return_trace (false); -- cgit v1.2.3 From e3fd69c88958fead68a62cecef7454990f7757fd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 19:07:42 -0600 Subject: [layout] Inline another function Code is smaller too. --- src/hb-ot-layout-gsubgpos.hh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 136e088ab..f46fb4e03 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -4353,6 +4353,9 @@ struct hb_ot_layout_lookup_accelerator_t bool may_have (hb_codepoint_t g) const { return digest.may_have (g); } +#ifndef HB_OPTIMIZE_SIZE + HB_ALWAYS_INLINE +#endif bool apply (hb_ot_apply_context_t *c, unsigned subtables_count, bool use_cache) const { #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE -- cgit v1.2.3 From fd79c7cecdf68fe4626943f29bd5edf1e603d2b2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 19:52:15 -0600 Subject: [gsubgpos] Keep another digest in the applicable_t The digest for all the remaining subtables combined. The idea is to get out of the subtable look as soon as no more can be applied. Doesn't seem to speed up anything I tested. Going to revert. --- src/hb-ot-layout-gsubgpos.hh | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index f46fb4e03..bfd6963a2 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1002,6 +1002,7 @@ struct hb_accelerate_subtables_context_t : hb_cache_func_t cache_func; #endif hb_set_digest_t digest; + hb_set_digest_t digest_rest; }; #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE @@ -4339,6 +4340,12 @@ struct hb_ot_layout_lookup_accelerator_t thiz->digest.init (); for (auto& subtable : hb_iter (thiz->subtables, count)) thiz->digest.add (subtable.digest); + if (count) + for (unsigned int i = count - 1; i; i--) + { + thiz->subtables[i - 1].digest_rest.add (thiz->subtables[i].digest); + thiz->subtables[i - 1].digest_rest.add (thiz->subtables[i].digest_rest); + } #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE thiz->cache_user_idx = c_accelerate_subtables.cache_user_idx; @@ -4358,23 +4365,28 @@ struct hb_ot_layout_lookup_accelerator_t #endif bool apply (hb_ot_apply_context_t *c, unsigned subtables_count, bool use_cache) const { + hb_codepoint_t g = c->buffer->cur().codepoint; #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE if (use_cache) { - return - + hb_iter (hb_iter (subtables, subtables_count)) - | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply_cached (c); }) - | hb_any - ; + for (const auto &subtable : hb_iter (subtables, subtables_count)) + { + if (subtable.apply_cached (c)) + return true; + if (!subtable.digest_rest.may_have (g)) + return false; + } } else #endif { - return - + hb_iter (hb_iter (subtables, subtables_count)) - | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply (c); }) - | hb_any - ; + for (const auto &subtable : hb_iter (subtables, subtables_count)) + { + if (subtable.apply (c)) + return true; + if (!subtable.digest_rest.may_have (g)) + return false; + } } return false; } -- cgit v1.2.3 From 2feac50b40f1dff06655c8efcadcc55088b34dad Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 31 Jul 2023 19:53:06 -0600 Subject: Revert "[gsubgpos] Keep another digest in the applicable_t" This reverts commit fd79c7cecdf68fe4626943f29bd5edf1e603d2b2. --- src/hb-ot-layout-gsubgpos.hh | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index bfd6963a2..f46fb4e03 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1002,7 +1002,6 @@ struct hb_accelerate_subtables_context_t : hb_cache_func_t cache_func; #endif hb_set_digest_t digest; - hb_set_digest_t digest_rest; }; #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE @@ -4340,12 +4339,6 @@ struct hb_ot_layout_lookup_accelerator_t thiz->digest.init (); for (auto& subtable : hb_iter (thiz->subtables, count)) thiz->digest.add (subtable.digest); - if (count) - for (unsigned int i = count - 1; i; i--) - { - thiz->subtables[i - 1].digest_rest.add (thiz->subtables[i].digest); - thiz->subtables[i - 1].digest_rest.add (thiz->subtables[i].digest_rest); - } #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE thiz->cache_user_idx = c_accelerate_subtables.cache_user_idx; @@ -4365,28 +4358,23 @@ struct hb_ot_layout_lookup_accelerator_t #endif bool apply (hb_ot_apply_context_t *c, unsigned subtables_count, bool use_cache) const { - hb_codepoint_t g = c->buffer->cur().codepoint; #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE if (use_cache) { - for (const auto &subtable : hb_iter (subtables, subtables_count)) - { - if (subtable.apply_cached (c)) - return true; - if (!subtable.digest_rest.may_have (g)) - return false; - } + return + + hb_iter (hb_iter (subtables, subtables_count)) + | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply_cached (c); }) + | hb_any + ; } else #endif { - for (const auto &subtable : hb_iter (subtables, subtables_count)) - { - if (subtable.apply (c)) - return true; - if (!subtable.digest_rest.may_have (g)) - return false; - } + return + + hb_iter (hb_iter (subtables, subtables_count)) + | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply (c); }) + | hb_any + ; } return false; } -- cgit v1.2.3 From 7a9aac1ae3f7b836ddb314636d6f50d8ad7ec5d2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 12:05:22 -0600 Subject: [graph] Fixes to parent handling --- src/graph/graph.hh | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 2b89b9996..e464d1746 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -199,6 +199,7 @@ struct graph_t void add_parent (unsigned parent_index) { + assert (parent_index != (unsigned) -1); if (incoming_edges_ == 0) { single_parent = parent_index; @@ -207,12 +208,19 @@ struct graph_t } else if (single_parent != (unsigned) -1) { + assert (incoming_edges_ == 1); if (!parents.set (single_parent, 1)) return; single_parent = (unsigned) -1; } - if (parents.set (parent_index, parents[parent_index] + 1)) + unsigned *v; + if (parents.has (parent_index, &v)) + { + (*v)++; + incoming_edges_++; + } + else if (parents.set (parent_index, 1)) incoming_edges_++; } @@ -230,7 +238,7 @@ struct graph_t { incoming_edges_--; if (*v > 1) - *v -= 1; + (*v)--; else parents.del (parent_index); @@ -284,10 +292,11 @@ struct graph_t return; } - if (parents.has (old_index)) + unsigned *v; + if (parents.has (old_index, &v)) { - remove_parent (old_index); - add_parent (new_index); + if (parents.set (new_index, *v)) + parents.del (old_index); } } -- cgit v1.2.3 From 07e7033076d9acfeeaa7a91ea878fa130a022824 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 12:25:45 -0600 Subject: [graph] Error check --- src/graph/graph.hh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index e464d1746..18f329b64 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -280,7 +280,8 @@ struct graph_t for (auto _ : parents) new_parents.set (id_map[_.first], _.second); - parents = std::move (new_parents); + if (!new_parents.in_error ()) + parents = std::move (new_parents); } void remap_parent (unsigned old_index, unsigned new_index) -- cgit v1.2.3 From 3b386c3773f24e30ec26bbbf86422ac67a6fb7b9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 14:12:43 -0600 Subject: [graph] Minor assert --- src/graph/graph.hh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 18f329b64..b98e3f2d5 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -271,6 +271,7 @@ struct graph_t { if (single_parent != (unsigned) -1) { + assert (single_parent < id_map.length); single_parent = id_map[single_parent]; return; } @@ -278,7 +279,10 @@ struct graph_t hb_hashmap_t new_parents; new_parents.alloc (parents.get_population ()); for (auto _ : parents) + { + assert (_.first < id_map.length); new_parents.set (id_map[_.first], _.second); + } if (!new_parents.in_error ()) parents = std::move (new_parents); -- cgit v1.2.3 From 7946984b9624338b8d15fa53ac21664a734e93d3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 14:18:03 -0600 Subject: [graph] More assert --- src/graph/graph.hh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index b98e3f2d5..929b82268 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -280,8 +280,9 @@ struct graph_t new_parents.alloc (parents.get_population ()); for (auto _ : parents) { - assert (_.first < id_map.length); - new_parents.set (id_map[_.first], _.second); + assert (_.first < id_map.length); + assert (!new_parents.has (id_map[_.first])); + new_parents.set (id_map[_.first], _.second); } if (!new_parents.in_error ()) -- cgit v1.2.3 From 8d00476fbf99f770608644e424712cf95d3950b8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 14:27:37 -0600 Subject: [graph] Minor restructure a condition --- src/graph/graph.hh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 929b82268..595def5dc 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -298,12 +298,10 @@ struct graph_t return; } - unsigned *v; - if (parents.has (old_index, &v)) - { - if (parents.set (new_index, *v)) - parents.del (old_index); - } + const unsigned *v; + if (parents.has (old_index, &v) && + parents.set (new_index, *v)) + parents.del (old_index); } bool is_leaf () const @@ -1207,6 +1205,7 @@ struct graph_t unsigned space_for (unsigned index, unsigned* root = nullptr) const { + assert (index < vertices_.length); const auto& node = vertices_[index]; if (node.space) { -- cgit v1.2.3 From 603920e911dc0fde79dc0ddde2be393f5c123d30 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 14:58:33 -0600 Subject: [graph] Minor asserts --- src/graph/graph.hh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 595def5dc..acbd85e7e 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -187,6 +187,9 @@ struct graph_t unsigned incoming_edges () const { + if (HB_DEBUG_SUBSET_REPACK) + assert (incoming_edges_ == (single_parent != (unsigned) -1) + + (parents.values_ref () | hb_reduce (hb_add, 0))); return incoming_edges_; } @@ -776,12 +779,15 @@ struct graph_t subgraph.set (root_idx, wide_parents (root_idx, parents)); find_subgraph (root_idx, subgraph); } + if (subgraph.in_error ()) + return false; unsigned original_root_idx = root_idx (); hb_map_t index_map; bool made_changes = false; for (auto entry : subgraph.iter ()) { + assert (entry.first < vertices_.length); const auto& node = vertices_[entry.first]; unsigned subgraph_incoming_edges = entry.second; @@ -1281,9 +1287,7 @@ struct graph_t for (unsigned p = 0; p < count; p++) { for (auto& l : vertices_.arrayZ[p].obj.all_links ()) - { vertices_[l.objidx].add_parent (p); - } } for (unsigned i = 0; i < count; i++) -- cgit v1.2.3 From 94d4283b12037d66ceb3b195f47d3bca96eb6627 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 15:05:17 -0600 Subject: [graph] Handle a malloc fail Fixes https://oss-fuzz.com/testcase-detail/4579249263345664 --- src/graph/graph.hh | 19 ++++++++++++------- ...ase-minimized-hb-repacker-fuzzer-4579249263345664 | Bin 0 -> 173466 bytes 2 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-4579249263345664 diff --git a/src/graph/graph.hh b/src/graph/graph.hh index acbd85e7e..d43d4a07f 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -270,13 +270,13 @@ struct graph_t } } - void remap_parents (const hb_vector_t& id_map) + bool remap_parents (const hb_vector_t& id_map) { if (single_parent != (unsigned) -1) { assert (single_parent < id_map.length); single_parent = id_map[single_parent]; - return; + return true; } hb_hashmap_t new_parents; @@ -288,8 +288,11 @@ struct graph_t new_parents.set (id_map[_.first], _.second); } - if (!new_parents.in_error ()) - parents = std::move (new_parents); + if (new_parents.in_error ()) + return false; + + parents = std::move (new_parents); + return true; } void remap_parent (unsigned old_index, unsigned new_index) @@ -584,7 +587,7 @@ struct graph_t check_success (!queue.in_error ()); check_success (!sorted_graph.in_error ()); - remap_all_obj_indices (id_map, &sorted_graph); + check_success (remap_all_obj_indices (id_map, &sorted_graph)); vertices_ = std::move (sorted_graph); if (!check_success (new_id == -1)) @@ -1422,18 +1425,20 @@ struct graph_t /* * Updates all objidx's in all links using the provided mapping. */ - void remap_all_obj_indices (const hb_vector_t& id_map, + bool remap_all_obj_indices (const hb_vector_t& id_map, hb_vector_t* sorted_graph) const { unsigned count = sorted_graph->length; for (unsigned i = 0; i < count; i++) { - (*sorted_graph)[i].remap_parents (id_map); + if (!(*sorted_graph)[i].remap_parents (id_map)) + return false; for (auto& link : sorted_graph->arrayZ[i].obj.all_links_writer ()) { link.objidx = id_map[link.objidx]; } } + return true; } /* diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-4579249263345664 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-4579249263345664 new file mode 100644 index 000000000..636a8678d Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-4579249263345664 differ -- cgit v1.2.3 From 70b3fbed2850f310658b65a68a058232b78ebeee Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 15:16:16 -0600 Subject: [graph] Fix invalid read when map gets resized I don't fully understand how the old code was wrong, since *v should be evaluated before the set() method call. Yet this seems to fix a bug that could be reproduced with HB_DEBUG_SUBSET_REPACK enabled and the following: $ hb-repacker-fuzzer test/fuzzing/graphs/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6419865171525632 --- src/graph/graph.hh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index d43d4a07f..5062a024b 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -188,8 +188,10 @@ struct graph_t unsigned incoming_edges () const { if (HB_DEBUG_SUBSET_REPACK) + { assert (incoming_edges_ == (single_parent != (unsigned) -1) + (parents.values_ref () | hb_reduce (hb_add, 0))); + } return incoming_edges_; } @@ -304,10 +306,13 @@ struct graph_t return; } - const unsigned *v; - if (parents.has (old_index, &v) && - parents.set (new_index, *v)) + const unsigned *pv; + if (parents.has (old_index, &pv)) + { + unsigned v = *pv; + parents.set (new_index, v); parents.del (old_index); + } } bool is_leaf () const -- cgit v1.2.3 From 39048099cb421095e24cdcc027b9cdc2a7fcf93e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 19:41:12 -0600 Subject: [skippy-iter] Remove early stop The optimization in (Chain)RuleSet matching relies on matching one, even if num_items is out of range. Fixes https://github.com/harfbuzz/harfbuzz/issues/4358 --- src/hb-ot-layout-gsubgpos.hh | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index f46fb4e03..73e79a502 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -584,11 +584,7 @@ struct hb_ot_apply_context_t : bool next (unsigned *unsafe_to = nullptr) { assert (num_items > 0); - /* The alternate condition below is faster at string boundaries, - * but produces subpar "unsafe-to-concat" values. */ - signed stop = (signed) end - (signed) num_items; - if (c->buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) - stop = (signed) end - 1; + const signed stop = (signed) end - 1; while ((signed) idx < stop) { idx++; @@ -620,11 +616,7 @@ struct hb_ot_apply_context_t : bool prev (unsigned *unsafe_from = nullptr) { assert (num_items > 0); - /* The alternate condition below is faster at string boundaries, - * but produces subpar "unsafe-to-concat" values. */ - unsigned stop = num_items - 1; - if (c->buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) - stop = 1 - 1; + const unsigned stop = 0; while (idx > stop) { idx--; -- cgit v1.2.3 From 5b337130e28eeaef3b5cfe884b514059417e3384 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 20:02:21 -0600 Subject: Add test for previous commit --- .../fonts/bef923f4ccb474f961c43b63a9c74b7d9b7a023f.ttf | Bin 0 -> 2180 bytes test/shape/data/in-house/tests/context-matching.tests | 1 + 2 files changed, 1 insertion(+) create mode 100644 test/shape/data/in-house/fonts/bef923f4ccb474f961c43b63a9c74b7d9b7a023f.ttf diff --git a/test/shape/data/in-house/fonts/bef923f4ccb474f961c43b63a9c74b7d9b7a023f.ttf b/test/shape/data/in-house/fonts/bef923f4ccb474f961c43b63a9c74b7d9b7a023f.ttf new file mode 100644 index 000000000..7dff0cc12 Binary files /dev/null and b/test/shape/data/in-house/fonts/bef923f4ccb474f961c43b63a9c74b7d9b7a023f.ttf differ diff --git a/test/shape/data/in-house/tests/context-matching.tests b/test/shape/data/in-house/tests/context-matching.tests index b0d66fffa..a0067362b 100644 --- a/test/shape/data/in-house/tests/context-matching.tests +++ b/test/shape/data/in-house/tests/context-matching.tests @@ -3,3 +3,4 @@ ../fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf;;U+09B0,U+09CD,U+09A5,U+09CD,U+09AF,U+09C0;[gid1=0+1320|gid13=0+523|gid18=0+545] ../fonts/5bbf3712e6f79775c66a4407837a90e591efbef2.ttf;;U+1F1FA,U+1F1FC;[gid3=0+2550] ../fonts/a59fd13f1525a91cbe529c882e93d9d1fbb80463.ttf;;U+0041,U+0042;[gid4=0+1366|gid4=0+1366|gid4=0+1366|gid4=0+1366|gid5=1+1366] +../fonts/bef923f4ccb474f961c43b63a9c74b7d9b7a023f.ttf;;U+0061,U+002E,U+002E,U+002E;[a=0+600|SPC=1+600|SPC=2+600|period_period_period.liga=3+600] -- cgit v1.2.3 From dcd3afcabfeb447a075b189f20cd523e177a0a9d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 1 Aug 2023 20:09:34 -0600 Subject: [skippy-iter] Remove unused num_items --- src/OT/Layout/GPOS/CursivePosFormat1.hh | 2 +- src/OT/Layout/GPOS/MarkMarkPosFormat1.hh | 2 +- src/OT/Layout/GPOS/PairPosFormat1.hh | 2 +- src/OT/Layout/GPOS/PairPosFormat2.hh | 2 +- src/OT/Layout/GSUB/LigatureSet.hh | 2 +- src/hb-kern.hh | 2 +- src/hb-ot-layout-gsubgpos.hh | 24 +++++++----------------- 7 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/OT/Layout/GPOS/CursivePosFormat1.hh index d4a53fc86..54852aae7 100644 --- a/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -129,7 +129,7 @@ struct CursivePosFormat1 unlikely (!this_record.entryAnchor.sanitize (&c->sanitizer, this))) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset_fast (buffer->idx, 1); + skippy_iter.reset_fast (buffer->idx); unsigned unsafe_from; if (unlikely (!skippy_iter.prev (&unsafe_from))) { diff --git a/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh b/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh index 9dae5ce5d..72535f4c9 100644 --- a/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh +++ b/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh @@ -100,7 +100,7 @@ struct MarkMarkPosFormat1_2 /* now we search backwards for a suitable mark glyph until a non-mark glyph */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset_fast (buffer->idx, 1); + skippy_iter.reset_fast (buffer->idx); skippy_iter.set_lookup_props (c->lookup_props & ~(uint32_t)LookupFlag::IgnoreFlags); unsigned unsafe_from; if (unlikely (!skippy_iter.prev (&unsafe_from))) diff --git a/src/OT/Layout/GPOS/PairPosFormat1.hh b/src/OT/Layout/GPOS/PairPosFormat1.hh index 714b4bec7..e4a2006fb 100644 --- a/src/OT/Layout/GPOS/PairPosFormat1.hh +++ b/src/OT/Layout/GPOS/PairPosFormat1.hh @@ -110,7 +110,7 @@ struct PairPosFormat1_3 if (likely (index == NOT_COVERED)) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset_fast (buffer->idx, 1); + skippy_iter.reset_fast (buffer->idx); unsigned unsafe_to; if (unlikely (!skippy_iter.next (&unsafe_to))) { diff --git a/src/OT/Layout/GPOS/PairPosFormat2.hh b/src/OT/Layout/GPOS/PairPosFormat2.hh index 05e6c0fa5..1bde9e755 100644 --- a/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -131,7 +131,7 @@ struct PairPosFormat2_4 if (likely (index == NOT_COVERED)) return_trace (false); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset_fast (buffer->idx, 1); + skippy_iter.reset_fast (buffer->idx); unsigned unsafe_to; if (unlikely (!skippy_iter.next (&unsafe_to))) { diff --git a/src/OT/Layout/GSUB/LigatureSet.hh b/src/OT/Layout/GSUB/LigatureSet.hh index cacb2b362..08665438c 100644 --- a/src/OT/Layout/GSUB/LigatureSet.hh +++ b/src/OT/Layout/GSUB/LigatureSet.hh @@ -97,7 +97,7 @@ struct LigatureSet * This is replicated in ChainRuleSet and RuleSet. */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (c->buffer->idx, 1); + skippy_iter.reset (c->buffer->idx); skippy_iter.set_match_func (match_always, nullptr); skippy_iter.set_glyph_data ((HBUINT16 *) nullptr); unsigned unsafe_to; diff --git a/src/hb-kern.hh b/src/hb-kern.hh index 9ac744c9d..0462a0ea8 100644 --- a/src/hb-kern.hh +++ b/src/hb-kern.hh @@ -70,7 +70,7 @@ struct hb_kern_machine_t continue; } - skippy_iter.reset (idx, 1); + skippy_iter.reset (idx); unsigned unsafe_to; if (!skippy_iter.next (&unsafe_to)) { diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 73e79a502..662ec9d3e 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -518,11 +518,9 @@ struct hb_ot_apply_context_t : #ifndef HB_OPTIMIZE_SIZE HB_ALWAYS_INLINE #endif - void reset (unsigned int start_index_, - unsigned int num_items_) + void reset (unsigned int start_index_) { idx = start_index_; - num_items = num_items_; end = c->buffer->len; matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0); } @@ -530,17 +528,14 @@ struct hb_ot_apply_context_t : #ifndef HB_OPTIMIZE_SIZE HB_ALWAYS_INLINE #endif - void reset_fast (unsigned int start_index_, - unsigned int num_items_) + void reset_fast (unsigned int start_index_) { // Doesn't set end or syllable. Used by GPOS which doesn't care / change. idx = start_index_; - num_items = num_items_; } void reject () { - num_items++; backup_glyph_data (); } @@ -583,7 +578,6 @@ struct hb_ot_apply_context_t : #endif bool next (unsigned *unsafe_to = nullptr) { - assert (num_items > 0); const signed stop = (signed) end - 1; while ((signed) idx < stop) { @@ -592,7 +586,6 @@ struct hb_ot_apply_context_t : { case MATCH: { - num_items--; advance_glyph_data (); return true; } @@ -615,7 +608,6 @@ struct hb_ot_apply_context_t : #endif bool prev (unsigned *unsafe_from = nullptr) { - assert (num_items > 0); const unsigned stop = 0; while (idx > stop) { @@ -624,7 +616,6 @@ struct hb_ot_apply_context_t : { case MATCH: { - num_items--; advance_glyph_data (); return true; } @@ -683,7 +674,6 @@ struct hb_ot_apply_context_t : const HBUINT24 *match_glyph_data24; #endif - unsigned int num_items; unsigned int end; }; @@ -1275,7 +1265,7 @@ static bool match_input (hb_ot_apply_context_t *c, hb_buffer_t *buffer = c->buffer; hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (buffer->idx, count - 1); + skippy_iter.reset (buffer->idx); skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (input); @@ -1515,7 +1505,7 @@ static bool match_backtrack (hb_ot_apply_context_t *c, TRACE_APPLY (nullptr); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; - skippy_iter.reset (c->buffer->backtrack_len (), count); + skippy_iter.reset (c->buffer->backtrack_len ()); skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (backtrack); @@ -1548,7 +1538,7 @@ static bool match_lookahead (hb_ot_apply_context_t *c, TRACE_APPLY (nullptr); hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_context; - skippy_iter.reset (start_index - 1, count); + skippy_iter.reset (start_index - 1); skippy_iter.set_match_func (match_func, match_data); skippy_iter.set_glyph_data (lookahead); @@ -2167,7 +2157,7 @@ struct RuleSet * Replicated from LigatureSet::apply(). */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (c->buffer->idx, 2); + skippy_iter.reset (c->buffer->idx); skippy_iter.set_match_func (match_always, nullptr); skippy_iter.set_glyph_data ((HBUINT16 *) nullptr); unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0; @@ -3338,7 +3328,7 @@ struct ChainRuleSet * Replicated from LigatureSet::apply(). */ hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; - skippy_iter.reset (c->buffer->idx, 2); + skippy_iter.reset (c->buffer->idx); skippy_iter.set_match_func (match_always, nullptr); skippy_iter.set_glyph_data ((HBUINT16 *) nullptr); unsigned unsafe_to = (unsigned) -1, unsafe_to1 = 0, unsafe_to2 = 0; -- cgit v1.2.3 From 91c449a64a6924afd2aee4d3eb0b80c8c7d9ad07 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 2 Aug 2023 14:40:55 -0600 Subject: [graph] Make space_for non-recursive It was tail-recursive so perhaps the compiler did the same. Anyway, make it explicit now. --- src/graph/graph.hh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 5062a024b..068095819 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -1219,6 +1219,7 @@ struct graph_t unsigned space_for (unsigned index, unsigned* root = nullptr) const { + loop: assert (index < vertices_.length); const auto& node = vertices_[index]; if (node.space) @@ -1235,7 +1236,8 @@ struct graph_t return 0; } - return space_for (*node.parents_iter (), root); + index = *node.parents_iter (); + goto loop; } void err_other_error () { this->successful = false; } -- cgit v1.2.3 From 1d665c2b521512cdd56964138fc601debd1f1177 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Wed, 2 Aug 2023 23:44:56 +0300 Subject: 8.1.1 --- NEWS | 8 ++++++++ configure.ac | 2 +- meson.build | 2 +- src/hb-version.h | 4 ++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index ef21e1e17..0a7b94b58 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,11 @@ +Overview of changes leading to 8.1.1 +Wednesday, August 2, 2023 +==================================== +- Fix shaping of contextual rules at the end of string, introduced in 8.1.0 +- Fix stack-overflow in repacker with malicious fonts. +- 30% speed up loading Noto Duployan font. + + Overview of changes leading to 8.1.0 Tuesday, August 1, 2023 ==================================== diff --git a/configure.ac b/configure.ac index d6361b0db..94257081b 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [8.1.0], + [8.1.1], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/meson.build b/meson.build index 2e459ce96..85e453d72 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('harfbuzz', 'c', 'cpp', meson_version: '>= 0.55.0', - version: '8.1.0', + version: '8.1.1', default_options: [ 'cpp_eh=none', # Just to support msvc, we are passing -fno-exceptions also anyway 'cpp_rtti=false', # Just to support msvc, we are passing -fno-rtti also anyway diff --git a/src/hb-version.h b/src/hb-version.h index 1b5f05cef..773395fb2 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -53,14 +53,14 @@ HB_BEGIN_DECLS * * The micro component of the library version available at compile-time. */ -#define HB_VERSION_MICRO 0 +#define HB_VERSION_MICRO 1 /** * HB_VERSION_STRING: * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "8.1.0" +#define HB_VERSION_STRING "8.1.1" /** * HB_VERSION_ATLEAST: -- cgit v1.2.3 From 7989702abadc8fff69a99a47cfad2db08f5b8184 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 6 Aug 2023 14:17:50 -0600 Subject: Audit and fix up serialize_subset uses Fixes https://github.com/harfbuzz/harfbuzz/issues/4362 --- src/OT/Color/COLR/COLR.hh | 11 ++++++----- src/OT/Layout/GPOS/AnchorMatrix.hh | 5 +++-- src/OT/Layout/GPOS/CursivePosFormat1.hh | 11 +++++------ src/OT/Layout/GPOS/LigatureArray.hh | 13 +++++++------ src/OT/Layout/GPOS/MarkArray.hh | 6 +++--- src/OT/Layout/GPOS/MarkBasePosFormat1.hh | 15 +++++++-------- src/OT/Layout/GPOS/MarkLigPosFormat1.hh | 14 +++++++------- src/OT/Layout/GPOS/MarkMarkPosFormat1.hh | 12 +++++++----- src/OT/Layout/GPOS/MarkRecord.hh | 11 +++++------ src/hb-ot-layout-common.hh | 3 +-- 10 files changed, 51 insertions(+), 50 deletions(-) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index 6591bb438..744774e63 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -1425,8 +1425,8 @@ struct PaintComposite auto *out = c->serializer->embed (this); if (unlikely (!out)) return_trace (false); - if (!out->src.serialize_subset (c, src, this, instancer)) return_trace (false); - return_trace (out->backdrop.serialize_subset (c, backdrop, this, instancer)); + return_trace (out->src.serialize_subset (c, src, this, instancer) | + out->backdrop.serialize_subset (c, backdrop, this, instancer)); } bool sanitize (hb_sanitize_context_t *c) const @@ -1898,15 +1898,16 @@ struct LayerList : Array32OfOffset32To auto *out = c->serializer->start_embed (this); if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + bool ret = false; for (const auto& _ : + hb_enumerate (*this) | hb_filter (c->plan->colrv1_layers, hb_first)) { auto *o = out->serialize_append (c->serializer); - if (unlikely (!o) || !o->serialize_subset (c, _.second, this, instancer)) - return_trace (false); + if (unlikely (!o)) return_trace (false); + ret |= o->serialize_subset (c, _.second, this, instancer); } - return_trace (true); + return_trace (ret); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/src/OT/Layout/GPOS/AnchorMatrix.hh b/src/OT/Layout/GPOS/AnchorMatrix.hh index bd9b18973..37ba7916f 100644 --- a/src/OT/Layout/GPOS/AnchorMatrix.hh +++ b/src/OT/Layout/GPOS/AnchorMatrix.hh @@ -65,14 +65,15 @@ struct AnchorMatrix if (unlikely (!c->serializer->extend_min (out))) return_trace (false); out->rows = num_rows; + bool ret = false; for (const unsigned i : index_iter) { auto *offset = c->serializer->embed (matrixZ[i]); if (!offset) return_trace (false); - offset->serialize_subset (c, matrixZ[i], this); + ret |= offset->serialize_subset (c, matrixZ[i], this); } - return_trace (true); + return_trace (ret); } }; diff --git a/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/OT/Layout/GPOS/CursivePosFormat1.hh index 54852aae7..0f9aee26c 100644 --- a/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -24,16 +24,15 @@ struct EntryExitRecord (src_base+exitAnchor).collect_variation_indices (c); } - EntryExitRecord* subset (hb_subset_context_t *c, - const void *src_base) const + bool subset (hb_subset_context_t *c, + const void *src_base) const { TRACE_SERIALIZE (this); auto *out = c->serializer->embed (this); - if (unlikely (!out)) return_trace (nullptr); + if (unlikely (!out)) return_trace (false); - out->entryAnchor.serialize_subset (c, entryAnchor, src_base); - out->exitAnchor.serialize_subset (c, exitAnchor, src_base); - return_trace (out); + return_trace (out->entryAnchor.serialize_subset (c, entryAnchor, src_base) | + out->exitAnchor.serialize_subset (c, exitAnchor, src_base)); } protected: diff --git a/src/OT/Layout/GPOS/LigatureArray.hh b/src/OT/Layout/GPOS/LigatureArray.hh index a2d807cc3..59cca40aa 100644 --- a/src/OT/Layout/GPOS/LigatureArray.hh +++ b/src/OT/Layout/GPOS/LigatureArray.hh @@ -27,6 +27,7 @@ struct LigatureArray : List16OfOffset16To auto *out = c->serializer->start_embed (this); if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + bool ret = false; for (const auto _ : + hb_zip (coverage, *this) | hb_filter (glyphset, hb_first)) { @@ -38,13 +39,13 @@ struct LigatureArray : List16OfOffset16To + hb_range (src.rows * class_count) | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); }) ; - matrix->serialize_subset (c, - _.second, - this, - src.rows, - indexes); + ret |= matrix->serialize_subset (c, + _.second, + this, + src.rows, + indexes); } - return_trace (this->len); + return_trace (ret); } }; diff --git a/src/OT/Layout/GPOS/MarkArray.hh b/src/OT/Layout/GPOS/MarkArray.hh index 34e2ab8f6..0887cc158 100644 --- a/src/OT/Layout/GPOS/MarkArray.hh +++ b/src/OT/Layout/GPOS/MarkArray.hh @@ -82,10 +82,10 @@ struct MarkArray : Array16Of /* Array of MarkRecords--in Cove | hb_map (hb_second) ; + bool ret = false; unsigned new_length = 0; for (const auto& mark_record : mark_iter) { - if (unlikely (!mark_record.subset (c, this, klass_mapping))) - return_trace (false); + ret |= mark_record.subset (c, this, klass_mapping); new_length++; } @@ -93,7 +93,7 @@ struct MarkArray : Array16Of /* Array of MarkRecords--in Cove HB_SERIALIZE_ERROR_ARRAY_OVERFLOW))) return_trace (false); - return_trace (true); + return_trace (ret); } }; diff --git a/src/OT/Layout/GPOS/MarkBasePosFormat1.hh b/src/OT/Layout/GPOS/MarkBasePosFormat1.hh index eb4712049..1b8f3c80a 100644 --- a/src/OT/Layout/GPOS/MarkBasePosFormat1.hh +++ b/src/OT/Layout/GPOS/MarkBasePosFormat1.hh @@ -197,9 +197,10 @@ struct MarkBasePosFormat1_2 if (!out->markCoverage.serialize_serialize (c->serializer, new_coverage.iter ())) return_trace (false); - out->markArray.serialize_subset (c, markArray, this, - (this+markCoverage).iter (), - &klass_mapping); + if (unlikely (!out->markArray.serialize_subset (c, markArray, this, + (this+markCoverage).iter (), + &klass_mapping))) + return_trace (false); unsigned basecount = (this+baseArray).rows; auto base_iter = @@ -228,11 +229,9 @@ struct MarkBasePosFormat1_2 ; } - out->baseArray.serialize_subset (c, baseArray, this, - base_iter.len (), - base_indexes.iter ()); - - return_trace (true); + return_trace (out->baseArray.serialize_subset (c, baseArray, this, + base_iter.len (), + base_indexes.iter ())); } }; diff --git a/src/OT/Layout/GPOS/MarkLigPosFormat1.hh b/src/OT/Layout/GPOS/MarkLigPosFormat1.hh index 92e83a0e9..af8b4723a 100644 --- a/src/OT/Layout/GPOS/MarkLigPosFormat1.hh +++ b/src/OT/Layout/GPOS/MarkLigPosFormat1.hh @@ -195,9 +195,10 @@ struct MarkLigPosFormat1_2 if (!out->markCoverage.serialize_serialize (c->serializer, new_mark_coverage)) return_trace (false); - out->markArray.serialize_subset (c, markArray, this, - (this+markCoverage).iter (), - &klass_mapping); + if (unlikely (!out->markArray.serialize_subset (c, markArray, this, + (this+markCoverage).iter (), + &klass_mapping))) + return_trace (false); auto new_ligature_coverage = + hb_iter (this + ligatureCoverage) @@ -208,10 +209,9 @@ struct MarkLigPosFormat1_2 if (!out->ligatureCoverage.serialize_serialize (c->serializer, new_ligature_coverage)) return_trace (false); - out->ligatureArray.serialize_subset (c, ligatureArray, this, - hb_iter (this+ligatureCoverage), classCount, &klass_mapping); - - return_trace (true); + return_trace (out->ligatureArray.serialize_subset (c, ligatureArray, this, + hb_iter (this+ligatureCoverage), + classCount, &klass_mapping)); } }; diff --git a/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh b/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh index 72535f4c9..70cf07166 100644 --- a/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh +++ b/src/OT/Layout/GPOS/MarkMarkPosFormat1.hh @@ -183,9 +183,10 @@ struct MarkMarkPosFormat1_2 if (!out->mark1Coverage.serialize_serialize (c->serializer, new_coverage.iter ())) return_trace (false); - out->mark1Array.serialize_subset (c, mark1Array, this, - (this+mark1Coverage).iter (), - &klass_mapping); + if (unlikely (!out->mark1Array.serialize_subset (c, mark1Array, this, + (this+mark1Coverage).iter (), + &klass_mapping))) + return_trace (false); unsigned mark2count = (this+mark2Array).rows; auto mark2_iter = @@ -214,9 +215,10 @@ struct MarkMarkPosFormat1_2 ; } - out->mark2Array.serialize_subset (c, mark2Array, this, mark2_iter.len (), mark2_indexes.iter ()); + return_trace (out->mark2Array.serialize_subset (c, mark2Array, this, + mark2_iter.len (), + mark2_indexes.iter ())); - return_trace (true); } }; diff --git a/src/OT/Layout/GPOS/MarkRecord.hh b/src/OT/Layout/GPOS/MarkRecord.hh index a7d489d2a..3d11c7773 100644 --- a/src/OT/Layout/GPOS/MarkRecord.hh +++ b/src/OT/Layout/GPOS/MarkRecord.hh @@ -24,17 +24,16 @@ struct MarkRecord return_trace (c->check_struct (this) && markAnchor.sanitize (c, base)); } - MarkRecord *subset (hb_subset_context_t *c, - const void *src_base, - const hb_map_t *klass_mapping) const + bool subset (hb_subset_context_t *c, + const void *src_base, + const hb_map_t *klass_mapping) const { TRACE_SUBSET (this); auto *out = c->serializer->embed (this); - if (unlikely (!out)) return_trace (nullptr); + if (unlikely (!out)) return_trace (false); out->klass = klass_mapping->get (klass); - out->markAnchor.serialize_subset (c, markAnchor, src_base); - return_trace (out); + return_trace (out->markAnchor.serialize_subset (c, markAnchor, src_base)); } void collect_variation_indices (hb_collect_variation_indices_context_t *c, diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 0831e4499..2cc509802 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -3215,8 +3215,7 @@ struct FeatureTableSubstitutionRecord if (unlikely (!out)) return_trace (false); out->featureIndex = c->feature_index_map->get (featureIndex); - bool ret = out->feature.serialize_subset (c->subset_context, feature, base, c); - return_trace (ret); + return_trace (out->feature.serialize_subset (c->subset_context, feature, base, c)); } bool sanitize (hb_sanitize_context_t *c, const void *base) const -- cgit v1.2.3 From 483d4a8741890ac72fa22d167ed53d4e39e9bd1d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 6 Aug 2023 14:40:45 -0600 Subject: Fix bot --- src/OT/Layout/GPOS/CursivePosFormat1.hh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/OT/Layout/GPOS/CursivePosFormat1.hh index 0f9aee26c..7c42c3f77 100644 --- a/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -31,8 +31,10 @@ struct EntryExitRecord auto *out = c->serializer->embed (this); if (unlikely (!out)) return_trace (false); - return_trace (out->entryAnchor.serialize_subset (c, entryAnchor, src_base) | - out->exitAnchor.serialize_subset (c, exitAnchor, src_base)); + bool ret = false; + ret |= out->entryAnchor.serialize_subset (c, entryAnchor, src_base); + ret |= out->exitAnchor.serialize_subset (c, exitAnchor, src_base); + return_trace (ret); } protected: -- cgit v1.2.3 From 49dbe0cd30a47258af0523822c924e9698a3e845 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 6 Aug 2023 15:07:57 -0600 Subject: Another try --- src/OT/Color/COLR/COLR.hh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index 744774e63..76f4c08ff 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -1425,8 +1425,10 @@ struct PaintComposite auto *out = c->serializer->embed (this); if (unlikely (!out)) return_trace (false); - return_trace (out->src.serialize_subset (c, src, this, instancer) | - out->backdrop.serialize_subset (c, backdrop, this, instancer)); + bool ret = false; + ret |= out->src.serialize_subset (c, src, this, instancer); + ret |= out->backdrop.serialize_subset (c, backdrop, this, instancer); + return_trace (ret); } bool sanitize (hb_sanitize_context_t *c) const -- cgit v1.2.3 From cb92210b4cf93f6d7986dc75632c831092b4de19 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Tue, 8 Aug 2023 00:19:30 +0700 Subject: Improve Markdown formatting. (#4366) --- BUILD.md | 23 +++++++++++++---------- README.md | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/BUILD.md b/BUILD.md index 8e822738c..55e950ea7 100644 --- a/BUILD.md +++ b/BUILD.md @@ -1,20 +1,23 @@ On Linux, install the development packages for FreeType, Cairo, and GLib. For example, on Ubuntu / Debian, you would do: -$ sudo apt-get install meson pkg-config ragel gtk-doc-tools gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev + $ sudo apt-get install meson pkg-config ragel gtk-doc-tools gcc g++ libfreetype6-dev libglib2.0-dev libcairo2-dev whereas on Fedora, RHEL, CentOS, and other Red Hat based systems you would do: -$ sudo dnf install meson pkgconfig gtk-doc gcc gcc-c++ freetype-devel glib2-devel cairo-devel + $ sudo dnf install meson pkgconfig gtk-doc gcc gcc-c++ freetype-devel glib2-devel cairo-devel and on ArchLinux and Manjaro: -$ sudo pacman -Suy meson pkg-config ragel gcc freetype2 glib2 cairo + $ sudo pacman -Suy meson pkg-config ragel gcc freetype2 glib2 cairo -then use meson to build the project like `meson build && meson test -Cbuild`. +On macOS: -On macOS, `brew install pkg-config ragel gtk-doc freetype glib cairo meson` -then use meson like above. + brew install pkg-config ragel gtk-doc freetype glib cairo meson + +Then use meson to build the project like: + + meson build && meson test -Cbuild On Windows, meson can build the project like above if a working MSVC's cl.exe (`vcvarsall.bat`) or gcc/clang is already on your path, and if you use @@ -22,8 +25,8 @@ something like `meson build --wrap-mode=default` it fetches and compiles most of the dependencies also. It is recommended to install CMake either manually or via the Visual Studio installer when building with MSVC, using meson. -Our CI configurations is also a good source of learning how to build HarfBuzz. +Our CI configurations are also a good source of learning how to build HarfBuzz. -There is also amalgam source provided with HarfBuzz which reduces whole process -of building HarfBuzz like `g++ src/harfbuzz.cc -fno-exceptions` but there is -not guarantee provided with buildability and reliability of features you get. +There is also amalgamated source provided with HarfBuzz which reduces whole process +of building HarfBuzz to `g++ src/harfbuzz.cc -fno-exceptions` but there is +no guarantee provided with buildability and reliability of features you get. diff --git a/README.md b/README.md index cb075e3af..099d4b771 100644 --- a/README.md +++ b/README.md @@ -29,8 +29,8 @@ For user manual as well as API documentation, check: https://harfbuzz.github.io ## Download For tarball releases of HarfBuzz, look [here][3]. At the same place you -will also find Win32/Win64 binary bundles that include libharfbuzz DLL, -hb-view.exe, hb-shape.exe, and all dependencies. +will also find Win32/Win64 binary bundles that include `libharfbuzz` DLL, +`hb-view.exe`, `hb-shape.exe`, and all dependencies. The canonical source tree is available on [github][4]. -- cgit v1.2.3 From a0f810effcb497e77be25328a251e608b5863999 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 28 Jul 2023 15:04:47 -0700 Subject: [instancer] add struct glyph_variations_t for gvar -Add compile_peak_coords () in tuple_delta_t -Add compile_shared_tuples () for glyph_variations_t --- src/hb-ot-var-common.hh | 33 ++++++++++++++ src/hb-ot-var-gvar-table.hh | 105 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 9e813f6d2..caddfe416 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -449,6 +449,9 @@ struct tuple_delta_t hb_vector_t compiled_tuple_header; hb_vector_t compiled_deltas; + /* compiled peak coords, empty for non-gvar tuples */ + hb_vector_t compiled_peak_coords; + tuple_delta_t () = default; tuple_delta_t (const tuple_delta_t& o) = default; @@ -552,6 +555,36 @@ struct tuple_delta_t return out; } + bool compile_peak_coords (const hb_map_t& axes_index_map, + const hb_map_t& axes_old_index_tag_map) + { + unsigned axis_count = axes_index_map.get_population (); + if (unlikely (!compiled_peak_coords.alloc (axis_count * F2DOT14::static_size))) + return false; + + unsigned orig_axis_count = axes_old_index_tag_map.get_population (); + for (unsigned i = 0; i < orig_axis_count; i++) + { + if (!axes_index_map.has (i)) + continue; + + hb_tag_t axis_tag = axes_old_index_tag_map.get (i); + Triple *coords; + F2DOT14 peak_coord; + if (axis_tuples.has (axis_tag, &coords)) + peak_coord.set_float (coords->middle); + else + peak_coord.set_int (0); + + /* push F2DOT14 value into char vector */ + int16_t val = peak_coord.to_int (); + compiled_peak_coords.push (static_cast (val >> 8)); + compiled_peak_coords.push (static_cast (val & 0xFF)); + } + + return !compiled_peak_coords.in_error (); + } + /* deltas should be compiled already before we compile tuple * variation header cause we need to fill in the size of the * serialized data for this tuple variation */ diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index b5099ac07..66da68295 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -76,6 +76,111 @@ struct contour_point_vector_t : hb_vector_t struct GlyphVariationData : TupleVariationData {}; +struct glyph_variations_t +{ + using tuple_variations_t = TupleVariationData::tuple_variations_t; + hb_vector_t glyph_variations; + + hb_vector_t compiled_shared_tuples; + private: + unsigned shared_tuples_count = 0; + + /* shared coords-> index map after instantiation */ + hb_hashmap_t*, unsigned> shared_tuples_idx_map; + + public: + unsigned compiled_shared_tuples_count () const + { return shared_tuples_count; } + + bool compile_shared_tuples (const hb_map_t& axes_index_map, + const hb_map_t& axes_old_index_tag_map) + { + /* key is pointer to compiled_peak_coords inside each tuple, hashing + * function will always deref pointers first */ + hb_hashmap_t*, unsigned> coords_count_map; + + /* count the num of shared coords */ + for (tuple_variations_t& vars: glyph_variations) + { + for (tuple_delta_t& var : vars.tuple_vars) + { + if (!var.compile_peak_coords (axes_index_map, axes_old_index_tag_map)) + return false; + unsigned* count; + if (coords_count_map.has (&(var.compiled_peak_coords), &count)) + coords_count_map.set (&(var.compiled_peak_coords), *count + 1); + else + coords_count_map.set (&(var.compiled_peak_coords), 1); + } + } + + if (!coords_count_map || coords_count_map.in_error ()) + return false; + + /* add only those coords that are used more than once into the vector and sort */ + hb_vector_t*> shared_coords; + if (unlikely (!shared_coords.alloc (coords_count_map.get_population ()))) + return false; + + for (const auto _ : coords_count_map.iter ()) + { + if (_.second == 1) continue; + shared_coords.push (_.first); + } + + /* no shared tuples: no coords are used more than once */ + if (!shared_coords) return true; + /* sorting based on the coords frequency first (high to low), then compare + * the coords bytes */ + hb_qsort (shared_coords.arrayZ, shared_coords.length, sizeof (hb_vector_t*), _cmp_coords, (void *) (&coords_count_map)); + + /* build shared_coords->idx map and shared tuples byte array */ + + shared_tuples_count = hb_min (0xFFFu + 1, shared_coords.length); + unsigned len = shared_tuples_count * (shared_coords[0]->length); + if (unlikely (!compiled_shared_tuples.alloc (len))) + return false; + + for (unsigned i = 0; i < shared_tuples_count; i++) + { + shared_tuples_idx_map.set (shared_coords[i], i); + /* add a concat() in hb_vector_t? */ + for (char c : shared_coords[i]->iter ()) + compiled_shared_tuples.push (c); + } + + return true; + } + + static int _cmp_coords (const void *pa, const void *pb, void *arg) + { + const hb_hashmap_t*, unsigned>* coords_count_map = + reinterpret_cast*, unsigned>*> (arg); + + /* shared_coords is hb_vector_t*> so casting pa/pb + * to be a pointer to a pointer */ + const hb_vector_t** a = reinterpret_cast**> (const_cast(pa)); + const hb_vector_t** b = reinterpret_cast**> (const_cast(pb)); + + bool has_a = coords_count_map->has (*a); + bool has_b = coords_count_map->has (*b); + + if (has_a && has_b) + { + unsigned a_num = coords_count_map->get (*a); + unsigned b_num = coords_count_map->get (*b); + + if (a_num != b_num) + return b_num - a_num; + + return (*b)->as_array().cmp ((*a)->as_array ()); + } + else if (has_a) return -1; + else if (has_b) return 1; + else return 0; + } +}; + struct gvar { static constexpr hb_tag_t tableTag = HB_OT_TAG_gvar; -- cgit v1.2.3 From eb116e163e0bb8476cdd53a07630389d25ec3b97 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 28 Jul 2023 15:27:07 -0700 Subject: [instancer] Add new_gid->contour_points vector map in subset plan - Add an API in Glyph to export original contour_points vector, which is needed by infer_deltas when merging tuple variations with the same tent --- src/OT/glyf/Glyph.hh | 57 +++++++++++++++++++++++++++++++++++++++ src/hb-ot-var-gvar-table.hh | 34 ----------------------- src/hb-subset-plan-member-list.hh | 3 +++ src/hb-subset-plan.cc | 32 ++++++++++++++++++++++ src/hb-subset-plan.hh | 34 +++++++++++++++++++++++ 5 files changed, 126 insertions(+), 34 deletions(-) diff --git a/src/OT/glyf/Glyph.hh b/src/OT/glyf/Glyph.hh index 2611c1e21..2b2184fea 100644 --- a/src/OT/glyf/Glyph.hh +++ b/src/OT/glyf/Glyph.hh @@ -103,6 +103,63 @@ struct Glyph } } + bool get_all_points_without_var (const hb_face_t *face, + contour_point_vector_t &points /* OUT */) const + { + switch (type) { + case SIMPLE: + if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points))) + return false; + break; + case COMPOSITE: + { + for (auto &item : get_composite_iterator ()) + if (unlikely (!item.get_points (points))) return false; + break; + } +#ifndef HB_NO_VAR_COMPOSITES + case VAR_COMPOSITE: + { + for (auto &item : get_var_composite_iterator ()) + if (unlikely (!item.get_points (points))) return false; + break; + } +#endif + case EMPTY: + break; + } + + /* Init phantom points */ + if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false; + hb_array_t phantoms = points.as_array ().sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT); + { + int lsb = 0; + int h_delta = face->table.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb) ? + (int) header->xMin - lsb : 0; + HB_UNUSED int tsb = 0; + int v_orig = (int) header->yMax + +#ifndef HB_NO_VERTICAL + ((void) face->table.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb), tsb) +#else + 0 +#endif + ; + unsigned h_adv = face->table.hmtx->get_advance_without_var_unscaled (gid); + unsigned v_adv = +#ifndef HB_NO_VERTICAL + face->table.vmtx->get_advance_without_var_unscaled (gid) +#else + - face->get_upem () +#endif + ; + phantoms[PHANTOM_LEFT].x = h_delta; + phantoms[PHANTOM_RIGHT].x = (int) h_adv + h_delta; + phantoms[PHANTOM_TOP].y = v_orig; + phantoms[PHANTOM_BOTTOM].y = v_orig - (int) v_adv; + } + return true; + } + void update_mtx (const hb_subset_plan_t *plan, int xMin, int xMax, int yMin, int yMax, diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 66da68295..180d9058c 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -39,40 +39,6 @@ namespace OT { -struct contour_point_t -{ - void init (float x_ = 0.f, float y_ = 0.f, bool is_end_point_ = false) - { flag = 0; x = x_; y = y_; is_end_point = is_end_point_; } - - void transform (const float (&matrix)[4]) - { - float x_ = x * matrix[0] + y * matrix[2]; - y = x * matrix[1] + y * matrix[3]; - x = x_; - } - HB_ALWAYS_INLINE - void translate (const contour_point_t &p) { x += p.x; y += p.y; } - - - float x; - float y; - uint8_t flag; - bool is_end_point; -}; - -struct contour_point_vector_t : hb_vector_t -{ - void extend (const hb_array_t &a) - { - unsigned int old_len = length; - if (unlikely (!resize (old_len + a.length, false))) - return; - auto arrayZ = this->arrayZ + old_len; - unsigned count = a.length; - hb_memcpy (arrayZ, a.arrayZ, count * sizeof (arrayZ[0])); - } -}; - struct GlyphVariationData : TupleVariationData {}; diff --git a/src/hb-subset-plan-member-list.hh b/src/hb-subset-plan-member-list.hh index 8e61055f4..01d8b0f8b 100644 --- a/src/hb-subset-plan-member-list.hh +++ b/src/hb-subset-plan-member-list.hh @@ -123,6 +123,9 @@ HB_SUBSET_PLAN_MEMBER (mutable hb_vector_t, bounds_width_vec) //boundsHeight map: new gid->boundsHeight, boundsHeight=yMax - yMin HB_SUBSET_PLAN_MEMBER (mutable hb_vector_t, bounds_height_vec) +//map: new_gid -> contour points vector +HB_SUBSET_PLAN_MEMBER (mutable hb_hashmap_t E(), new_gid_contour_points_map) + #ifdef HB_EXPERIMENTAL_API // name table overrides map: hb_ot_name_record_ids_t-> name string new value or // None to indicate should remove diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index a2090b727..c293ba3ba 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -1045,6 +1045,36 @@ _update_instance_metrics_map_from_cff2 (hb_subset_plan_t *plan) if (vvar_store_cache) _vmtx.var_table->get_var_store ().destroy_cache (vvar_store_cache); } + +static bool +_get_instance_glyphs_contour_points (hb_subset_plan_t *plan) +{ + /* contour_points vector only needed for updating gvar table (infer delta) + * during partial instancing */ + if (plan->user_axes_location.is_empty () || plan->all_axes_pinned) + return true; + + OT::glyf_accelerator_t glyf (plan->source); + + for (auto &_ : plan->new_to_old_gid_list) + { + hb_codepoint_t new_gid = _.first; + contour_point_vector_t all_points; + if (new_gid == 0 && !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE)) + { + if (unlikely (!plan->new_gid_contour_points_map.set (new_gid, all_points))) + return false; + continue; + } + + hb_codepoint_t old_gid = _.second; + if (unlikely (!glyf.glyph_for_gid (old_gid).get_all_points_without_var (plan->source, all_points))) + return false; + if (unlikely (!plan->new_gid_contour_points_map.set (new_gid, all_points))) + return false; + } + return true; +} #endif hb_subset_plan_t::hb_subset_plan_t (hb_face_t *face, @@ -1148,6 +1178,8 @@ hb_subset_plan_t::hb_subset_plan_t (hb_face_t *face, #ifndef HB_NO_VAR _update_instance_metrics_map_from_cff2 (this); + if (!check_success (_get_instance_glyphs_contour_points (this))) + return; #endif if (attach_accelerator_data) diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index d156de05d..a05d1d1a6 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -67,6 +67,40 @@ struct head_maxp_info_t typedef struct head_maxp_info_t head_maxp_info_t; +struct contour_point_t +{ + void init (float x_ = 0.f, float y_ = 0.f, bool is_end_point_ = false) + { flag = 0; x = x_; y = y_; is_end_point = is_end_point_; } + + void transform (const float (&matrix)[4]) + { + float x_ = x * matrix[0] + y * matrix[2]; + y = x * matrix[1] + y * matrix[3]; + x = x_; + } + HB_ALWAYS_INLINE + void translate (const contour_point_t &p) { x += p.x; y += p.y; } + + + float x; + float y; + uint8_t flag; + bool is_end_point; +}; + +struct contour_point_vector_t : hb_vector_t +{ + void extend (const hb_array_t &a) + { + unsigned int old_len = length; + if (unlikely (!resize (old_len + a.length, false))) + return; + auto arrayZ = this->arrayZ + old_len; + unsigned count = a.length; + hb_memcpy (arrayZ, a.arrayZ, count * sizeof (arrayZ[0])); + } +}; + namespace OT { struct cff1_subset_accelerator_t; struct cff2_subset_accelerator_t; -- cgit v1.2.3 From 198612c1c83d3b19b953a2fcc73406287104e5a2 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 28 Jul 2023 15:41:54 -0700 Subject: [instancer] add decompile_glyph_variations () for gvar --- src/hb-ot-var-common.hh | 1 + src/hb-ot-var-gvar-table.hh | 81 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index caddfe416..2c8f21309 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1488,6 +1488,7 @@ struct TupleVariationData bool has_shared_point_numbers () const { return ((*this) & SharedPointNumbers); } unsigned int get_count () const { return (*this) & CountMask; } TupleVarCount& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; } + explicit operator bool () const { return get_count (); } protected: enum Flags diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 180d9058c..0cb7939ba 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -58,6 +58,50 @@ struct glyph_variations_t unsigned compiled_shared_tuples_count () const { return shared_tuples_count; } + bool create_from_glyphs_var_data (unsigned axis_count, + const hb_array_t shared_tuples, + const hb_subset_plan_t *plan, + const hb_hashmap_t& new_gid_var_data_map) + { + if (unlikely (!glyph_variations.alloc (plan->new_to_old_gid_list.length, true))) + return false; + + auto it = hb_iter (plan->new_to_old_gid_list); + for (auto &_ : it) + { + hb_codepoint_t new_gid = _.first; + contour_point_vector_t *all_contour_points; + if (!new_gid_var_data_map.has (new_gid) || + !plan->new_gid_contour_points_map.has (new_gid, &all_contour_points)) + return false; + hb_bytes_t var_data = new_gid_var_data_map.get (new_gid); + + const GlyphVariationData* p = reinterpret_cast (var_data.arrayZ); + hb_vector_t shared_indices; + GlyphVariationData::tuple_iterator_t iterator; + tuple_variations_t tuple_vars; + + /* in case variation data is empty, push an empty struct into the vector, + * keep the vector in sync with the new_to_old_gid_list */ + if (!var_data || ! p->has_data () || !all_contour_points->length || + !GlyphVariationData::get_tuple_iterator (var_data, axis_count, + var_data.arrayZ, + shared_indices, &iterator)) + { + glyph_variations.push (std::move (tuple_vars)); + continue; + } + + if (!p->decompile_tuple_variations (all_contour_points->length, true /* is_gvar */, + iterator, &(plan->axes_old_index_tag_map), + shared_indices, shared_tuples, + tuple_vars /* OUT */)) + return false; + glyph_variations.push (std::move (tuple_vars)); + } + return !glyph_variations.in_error () && glyph_variations.length == plan->new_to_old_gid_list.length; + } + bool compile_shared_tuples (const hb_map_t& axes_index_map, const hb_map_t& axes_old_index_tag_map) { @@ -165,6 +209,32 @@ struct gvar bool sanitize (hb_sanitize_context_t *c) const { return sanitize_shallow (c); } + bool decompile_glyph_variations (const hb_subset_plan_t *plan, + glyph_variations_t& glyph_vars /* OUT */) const + { + + hb_hashmap_t new_gid_var_data_map; + auto it = hb_iter (plan->new_to_old_gid_list); + if (it->first == 0 && !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE)) + { + new_gid_var_data_map.set (0, hb_bytes_t ()); + it++; + } + + for (auto &_ : it) + { + hb_codepoint_t new_gid = _.first; + hb_codepoint_t old_gid = _.second; + hb_bytes_t var_data_bytes = get_glyph_var_data_bytes (old_gid); + new_gid_var_data_map.set (new_gid, var_data_bytes); + } + + if (new_gid_var_data_map.in_error ()) return false; + + hb_array_t shared_tuples = (this+sharedTuples).as_array ((unsigned) sharedTupleCount * (unsigned) axisCount); + return glyph_vars.create_from_glyphs_var_data (axisCount, shared_tuples, plan, new_gid_var_data_map); + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); @@ -282,6 +352,17 @@ struct gvar return likely (var_data.length >= GlyphVariationData::min_size) ? var_data : hb_bytes_t (); } + const hb_bytes_t get_glyph_var_data_bytes (hb_codepoint_t gid) const + { + unsigned start_offset = get_offset (glyphCountX, gid); + unsigned end_offset = get_offset (glyphCountX, gid+1); + if (unlikely (end_offset < start_offset)) return hb_bytes_t (); + unsigned length = end_offset - start_offset; + const char *p = (const char*) this + (unsigned) dataZ + start_offset; + hb_bytes_t var_data{p, length}; + return likely (length >= GlyphVariationData::min_size) ? var_data : hb_bytes_t (); + } + bool is_long_offset () const { return flags & 1; } unsigned get_offset (unsigned glyph_count, unsigned i) const -- cgit v1.2.3 From 3c86b096a9bf310a00086a7ed566cf1436da786c Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 28 Jul 2023 16:18:51 -0700 Subject: [instancer] Add instantiate () and compile_bytes() for gvar -Also add support for using shared_points and shared_tuples --- src/hb-ot-var-common.hh | 85 +++++++++++++++++++++++++++++++++++++-------- src/hb-ot-var-cvar-table.hh | 7 ++-- src/hb-ot-var-gvar-table.hh | 29 ++++++++++++++++ src/test-tuple-varstore.cc | 2 +- 4 files changed, 106 insertions(+), 17 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 2c8f21309..76d9db82e 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -588,10 +588,10 @@ struct tuple_delta_t /* deltas should be compiled already before we compile tuple * variation header cause we need to fill in the size of the * serialized data for this tuple variation */ - //TODO(qxliu):add option to use sharedTuples in gvar bool compile_tuple_var_header (const hb_map_t& axes_index_map, unsigned points_data_length, - const hb_map_t& axes_old_index_tag_map) + const hb_map_t& axes_old_index_tag_map, + const hb_hashmap_t*, unsigned>* shared_tuples_idx_map) { if (!compiled_deltas) return false; @@ -607,14 +607,25 @@ struct tuple_delta_t hb_array_t coords (p, end - p); /* encode peak coords */ - unsigned peak_count = encode_peak_coords(coords, flag, axes_index_map, axes_old_index_tag_map); - if (!peak_count) return false; + unsigned peak_count = 0; + unsigned *shared_tuple_idx; + if (shared_tuples_idx_map && + shared_tuples_idx_map->has (&compiled_peak_coords, &shared_tuple_idx)) + { + flag = *shared_tuple_idx; + } + else + { + peak_count = encode_peak_coords(coords, flag, axes_index_map, axes_old_index_tag_map); + if (!peak_count) return false; + } /* encode interim coords, it's optional so returned num could be 0 */ unsigned interim_count = encode_interm_coords (coords.sub_array (peak_count), flag, axes_index_map, axes_old_index_tag_map); - //TODO(qxliu): add option to use shared_points in gvar - flag |= TupleVariationHeader::TuppleIndex::PrivatePointNumbers; + /* pointdata length = 0 implies "use shared points" */ + if (points_data_length) + flag |= TupleVariationHeader::TuppleIndex::PrivatePointNumbers; unsigned serialized_data_size = points_data_length + compiled_deltas.length; TupleVariationHeader *o = reinterpret_cast (compiled_tuple_header.begin ()); @@ -943,6 +954,16 @@ struct TupleVariationData /* referenced point set-> count map, used in finding shared points */ hb_hashmap_t*, unsigned> point_set_count_map; + /* empty for non-gvar tuples. + * shared_points_bytes is just a copy of some value in the point_data_map, + * which will be freed during map destruction. Save it for serialization, so + * no need to do find_shared_points () again */ + hb_bytes_t shared_points_bytes; + + /* total compiled byte size as TupleVariationData format, initialized to its + * min_size: 4 */ + unsigned compiled_byte_size = 4; + public: ~tuple_variations_t () { fini (); } void fini () @@ -955,7 +976,15 @@ struct TupleVariationData } unsigned get_var_count () const - { return tuple_vars.length; } + { + unsigned count = tuple_vars.length; + if (shared_points_bytes.length) + count |= TupleVarCount::SharedPointNumbers; + return count; + } + + unsigned get_compiled_byte_size () const + { return compiled_byte_size; } bool create_from_tuple_var_data (tuple_iterator_t iterator, unsigned tuple_var_count, @@ -1220,19 +1249,30 @@ struct TupleVariationData return res; } - void instantiate (const hb_hashmap_t& normalized_axes_location, - const hb_hashmap_t& axes_triple_distances) + bool instantiate (const hb_hashmap_t& normalized_axes_location, + const hb_hashmap_t& axes_triple_distances, + contour_point_vector_t* contour_points = nullptr) { + if (!tuple_vars) return true; change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances); merge_tuple_variations (); + return !tuple_vars.in_error (); } bool compile_bytes (const hb_map_t& axes_index_map, - const hb_map_t& axes_old_index_tag_map) + const hb_map_t& axes_old_index_tag_map, + bool use_shared_points, + const hb_hashmap_t*, unsigned>* shared_tuples_idx_map = nullptr) { // compile points set and store data in hashmap if (!compile_all_point_sets ()) return false; + + if (use_shared_points) + { + shared_points_bytes = find_shared_points (); + compiled_byte_size += shared_points_bytes.length; + } // compile delta and tuple var header for each tuple variation for (auto& tuple: tuple_vars) { @@ -1244,8 +1284,11 @@ struct TupleVariationData if (!tuple.compile_deltas ()) return false; - if (!tuple.compile_tuple_var_header (axes_index_map, points_data->length, axes_old_index_tag_map)) + unsigned points_data_length = (*points_data != shared_points_bytes) ? points_data->length : 0; + if (!tuple.compile_tuple_var_header (axes_index_map, points_data_length, axes_old_index_tag_map, + shared_tuples_idx_map)) return false; + compiled_byte_size += tuple.compiled_tuple_header.length + points_data_length + tuple.compiled_deltas.length; } return true; } @@ -1262,9 +1305,12 @@ struct TupleVariationData return_trace (true); } - bool serialize_var_data (hb_serialize_context_t *c) const + bool serialize_var_data (hb_serialize_context_t *c, bool is_gvar) const { TRACE_SERIALIZE (this); + if (is_gvar) + shared_points_bytes.copy (c); + for (const auto& tuple: tuple_vars) { const hb_vector_t* points_set = &(tuple.indices); @@ -1272,10 +1318,20 @@ struct TupleVariationData if (!point_data_map.has (points_set, &point_data)) return_trace (false); - point_data->copy (c); + if (!is_gvar || *point_data != shared_points_bytes) + point_data->copy (c); + tuple.compiled_deltas.as_array ().copy (c); if (c->in_error ()) return_trace (false); } + + /* padding for gvar */ + if (is_gvar && (compiled_byte_size % 2)) + { + HBUINT8 pad; + pad = 0; + if (!c->embed (pad)) return_trace (false); + } return_trace (true); } }; @@ -1479,12 +1535,13 @@ struct TupleVariationData if (!is_gvar) data_offset += 4; if (!c->check_assign (out->data, data_offset, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false); - return tuple_variations.serialize_var_data (c); + return tuple_variations.serialize_var_data (c, is_gvar); } protected: struct TupleVarCount : HBUINT16 { + friend struct tuple_variations_t; bool has_shared_point_numbers () const { return ((*this) & SharedPointNumbers); } unsigned int get_count () const { return (*this) & CountMask; } TupleVarCount& operator = (uint16_t i) { HBUINT16::operator= (i); return *this; } diff --git a/src/hb-ot-var-cvar-table.hh b/src/hb-ot-var-cvar-table.hh index fee39eff3..99c435e34 100644 --- a/src/hb-ot-var-cvar-table.hh +++ b/src/hb-ot-var-cvar-table.hh @@ -168,8 +168,11 @@ struct cvar tuple_variations)) return_trace (false); - tuple_variations.instantiate (c->plan->axes_location, c->plan->axes_triple_distances); - if (!tuple_variations.compile_bytes (c->plan->axes_index_map, c->plan->axes_old_index_tag_map)) + if (!tuple_variations.instantiate (c->plan->axes_location, c->plan->axes_triple_distances)) + return_trace (false); + + if (!tuple_variations.compile_bytes (c->plan->axes_index_map, c->plan->axes_old_index_tag_map, + false /* do not use shared points */)) return_trace (false); return_trace (serialize (c->serializer, tuple_variations)); diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 0cb7939ba..5e05ed0af 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -102,6 +102,35 @@ struct glyph_variations_t return !glyph_variations.in_error () && glyph_variations.length == plan->new_to_old_gid_list.length; } + bool instantiate (const hb_subset_plan_t *plan) + { + unsigned count = plan->new_to_old_gid_list.length; + for (unsigned i = 0; i < count; i++) + { + hb_codepoint_t new_gid = plan->new_to_old_gid_list[i].first; + contour_point_vector_t *all_points; + if (!plan->new_gid_contour_points_map.has (new_gid, &all_points)) + return false; + if (!glyph_variations[i].instantiate (plan->axes_location, plan->axes_triple_distances, all_points)) + return false; + } + return true; + } + + bool compile_bytes (const hb_map_t& axes_index_map, + const hb_map_t& axes_old_index_tag_map) + { + if (!compile_shared_tuples (axes_index_map, axes_old_index_tag_map)) + return false; + for (tuple_variations_t& vars: glyph_variations) + if (!vars.compile_bytes (axes_index_map, axes_old_index_tag_map, + true, /* use shared points*/ + &shared_tuples_idx_map)) + return false; + + return true; + } + bool compile_shared_tuples (const hb_map_t& axes_index_map, const hb_map_t& axes_old_index_tag_map) { diff --git a/src/test-tuple-varstore.cc b/src/test-tuple-varstore.cc index 32d2ea457..c9086b93c 100644 --- a/src/test-tuple-varstore.cc +++ b/src/test-tuple-varstore.cc @@ -115,7 +115,7 @@ test_decompile_cvar () hb_map_t axes_index_map; axes_index_map.set (0, 0); - bool res = tuple_variations.compile_bytes (axes_index_map, axis_idx_tag_map); + bool res = tuple_variations.compile_bytes (axes_index_map, axis_idx_tag_map, false); assert (res); assert (tuple_variations.tuple_vars[0].compiled_tuple_header.length == 6); const char tuple_var_header_1[] = "\x0\x51\xa0\x0\xc0\x0"; -- cgit v1.2.3 From 746b112faf6adcd4a9d7325b067c4ba46a973a95 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 7 Aug 2023 09:26:42 -0700 Subject: [instancer] add serialize () for gvar --- src/hb-ot-var-common.hh | 6 ++- src/hb-ot-var-cvar-table.hh | 1 + src/hb-ot-var-gvar-table.hh | 114 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 76d9db82e..ae1f3785b 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -975,6 +975,7 @@ struct TupleVariationData tuple_vars.fini (); } + explicit operator bool () const { return bool (tuple_vars); } unsigned get_var_count () const { unsigned count = tuple_vars.length; @@ -1517,9 +1518,12 @@ struct TupleVariationData bool serialize (hb_serialize_context_t *c, bool is_gvar, - tuple_variations_t& tuple_variations) const + const tuple_variations_t& tuple_variations) const { TRACE_SERIALIZE (this); + /* empty tuple variations, just return and skip serialization. */ + if (!tuple_variations) return_trace (true); + auto *out = c->start_embed (this); if (unlikely (!c->extend_min (out))) return_trace (false); diff --git a/src/hb-ot-var-cvar-table.hh b/src/hb-ot-var-cvar-table.hh index 99c435e34..adb81769b 100644 --- a/src/hb-ot-var-cvar-table.hh +++ b/src/hb-ot-var-cvar-table.hh @@ -131,6 +131,7 @@ struct cvar TupleVariationData::tuple_variations_t& tuple_variations) const { TRACE_SERIALIZE (this); + if (!tuple_variations) return_trace (false); if (unlikely (!c->embed (version))) return_trace (false); return_trace (tupleVariationData.serialize (c, false, tuple_variations)); diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 5e05ed0af..5b9e64243 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -58,6 +58,15 @@ struct glyph_variations_t unsigned compiled_shared_tuples_count () const { return shared_tuples_count; } + unsigned compiled_byte_size () const + { + unsigned byte_size = 0; + for (const auto& _ : glyph_variations) + byte_size += _.get_compiled_byte_size (); + + return byte_size; + } + bool create_from_glyphs_var_data (unsigned axis_count, const hb_array_t shared_tuples, const hb_subset_plan_t *plan, @@ -218,6 +227,66 @@ struct glyph_variations_t else if (has_b) return 1; else return 0; } + + template + bool serialize_glyph_var_data (hb_serialize_context_t *c, + Iterator it, + bool long_offset, + unsigned num_glyphs, + char* glyph_var_data_offsets /* OUT: glyph var data offsets array */) const + { + TRACE_SERIALIZE (this); + + if (long_offset) + { + ((HBUINT32 *) glyph_var_data_offsets)[0] = 0; + glyph_var_data_offsets += 4; + } + else + { + ((HBUINT16 *) glyph_var_data_offsets)[0] = 0; + glyph_var_data_offsets += 2; + } + unsigned glyph_offset = 0; + hb_codepoint_t last_gid = 0; + unsigned idx = 0; + + TupleVariationData* cur_glyph = c->start_embed (); + if (!cur_glyph) return_trace (false); + for (auto &_ : it) + { + hb_codepoint_t gid = _.first; + if (long_offset) + for (; last_gid < gid; last_gid++) + ((HBUINT32 *) glyph_var_data_offsets)[last_gid] = glyph_offset; + else + for (; last_gid < gid; last_gid++) + ((HBUINT16 *) glyph_var_data_offsets)[last_gid] = glyph_offset / 2; + + if (idx >= glyph_variations.length) return_trace (false); + if (!cur_glyph->serialize (c, true, glyph_variations[idx])) return_trace (false); + TupleVariationData* next_glyph = c->start_embed (); + glyph_offset += (char *) next_glyph - (char *) cur_glyph; + + if (long_offset) + ((HBUINT32 *) glyph_var_data_offsets)[gid] = glyph_offset; + else + ((HBUINT16 *) glyph_var_data_offsets)[gid] = glyph_offset / 2; + + last_gid++; + idx++; + cur_glyph = next_glyph; + } + + if (long_offset) + for (; last_gid < num_glyphs; last_gid++) + ((HBUINT32 *) glyph_var_data_offsets)[last_gid] = glyph_offset; + else + for (; last_gid < num_glyphs; last_gid++) + ((HBUINT16 *) glyph_var_data_offsets)[last_gid] = glyph_offset / 2; + return_trace (true); + } }; struct gvar @@ -264,6 +333,51 @@ struct gvar return glyph_vars.create_from_glyphs_var_data (axisCount, shared_tuples, plan, new_gid_var_data_map); } + template + bool serialize (hb_serialize_context_t *c, + const glyph_variations_t& glyph_vars, + Iterator it, + unsigned axis_count, + unsigned num_glyphs) const + { + TRACE_SERIALIZE (this); + gvar *out = c->allocate_min (); + if (unlikely (!out)) return_trace (false); + + out->version.major = 1; + out->version.minor = 0; + out->axisCount = axis_count; + out->glyphCountX = hb_min (0xFFFFu, num_glyphs); + + unsigned glyph_var_data_size = glyph_vars.compiled_byte_size (); + bool long_offset = glyph_var_data_size & ~0xFFFFu; + out->flags = long_offset ? 1 : 0; + + HBUINT8 *glyph_var_data_offsets = c->allocate_size ((long_offset ? 4 : 2) * (num_glyphs + 1), false); + if (!glyph_var_data_offsets) return_trace (false); + + /* shared tuples */ + unsigned shared_tuple_count = glyph_vars.compiled_shared_tuples_count (); + out->sharedTupleCount = shared_tuple_count; + + if (!shared_tuple_count) + out->sharedTuples = 0; + else + { + hb_array_t shared_tuples = glyph_vars.compiled_shared_tuples.as_array ().copy (c); + if (!shared_tuples.arrayZ) return_trace (false); + out->sharedTuples = shared_tuples.arrayZ - (char *) out; + } + + char *glyph_var_data = c->start_embed (); + if (!glyph_var_data) return_trace (false); + out->dataZ = glyph_var_data - (char *) out; + + return_trace (glyph_vars.serialize_glyph_var_data (c, it, long_offset, num_glyphs, + (char *) glyph_var_data_offsets)); + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); -- cgit v1.2.3 From fb44727401d36adc14615deda91574a6e7ec2cd6 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 7 Aug 2023 09:44:41 -0700 Subject: [instancer] add instantiate () for gvar --- src/hb-ot-var-common.hh | 11 ++++++++--- src/hb-ot-var-gvar-table.hh | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index ae1f3785b..e1de07901 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1088,7 +1088,7 @@ struct TupleVariationData void merge_tuple_variations () { hb_vector_t new_vars; - hb_hashmap_t, unsigned> m; + hb_hashmap_t*, unsigned> m; unsigned i = 0; for (const tuple_delta_t& var : tuple_vars) { @@ -1096,14 +1096,14 @@ struct TupleVariationData if (var.axis_tuples.is_empty ()) continue; unsigned *idx; - if (m.has (var.axis_tuples, &idx)) + if (m.has (&(var.axis_tuples), &idx)) { new_vars[*idx] += var; } else { new_vars.push (var); - m.set (var.axis_tuples, i); + m.set (&(var.axis_tuples), i); i++; } } @@ -1256,6 +1256,11 @@ struct TupleVariationData { if (!tuple_vars) return true; change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances); + /* compute inferred deltas only for gvar */ + if (contour_points) + if (!calc_inferred_deltas (*contour_points)) + return false; + merge_tuple_variations (); return !tuple_vars.in_error (); } diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 5b9e64243..3f9e10612 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -378,9 +378,31 @@ struct gvar (char *) glyph_var_data_offsets)); } + bool instantiate (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + glyph_variations_t glyph_vars; + if (!decompile_glyph_variations (c->plan, glyph_vars)) + return_trace (false); + + if (!glyph_vars.instantiate (c->plan)) return_trace (false); + if (!glyph_vars.compile_bytes (c->plan->axes_index_map, c->plan->axes_old_index_tag_map)) + return_trace (false); + + unsigned axis_count = c->plan->axes_index_map.get_population (); + unsigned num_glyphs = c->plan->num_output_glyphs (); + auto it = hb_iter (c->plan->new_to_old_gid_list); + return_trace (serialize (c->serializer, glyph_vars, it, axis_count, num_glyphs)); + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); + if (c->plan->all_axes_pinned) + return_trace (false); + + if (c->plan->normalized_coords) + return_trace (instantiate (c)); unsigned glyph_count = version.to_int () ? c->plan->source->get_num_glyphs () : 0; -- cgit v1.2.3 From 5a4694b6934f9e3ca3dc89cc905b4351920085b6 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 7 Aug 2023 09:55:30 -0700 Subject: [instancer] add calc_inferred_deltas() for gvar --- src/hb-ot-var-common.hh | 104 +++++++++++++++++++++++++++++++++++++++++++++ src/test-tuple-varstore.cc | 3 +- 2 files changed, 105 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index e1de07901..b0b870198 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -914,6 +914,99 @@ struct tuple_delta_t } return encoded_len; } + + bool calc_inferred_deltas (const contour_point_vector_t& orig_points) + { + unsigned point_count = orig_points.length; + if (point_count != indices.length) + return false; + + unsigned ref_count = 0; + hb_vector_t end_points; + + for (unsigned i = 0; i < point_count; i++) + { + if (indices.arrayZ[i]) + ref_count++; + if (orig_points.arrayZ[i].is_end_point) + end_points.push (i); + } + /* all points are referened, nothing to do */ + if (ref_count == point_count) + return true; + if (unlikely (end_points.in_error ())) return false; + + hb_set_t inferred_idxes; + unsigned start_point = 0; + for (unsigned end_point : end_points) + { + /* Check the number of unreferenced points in a contour. If no unref points or no ref points, nothing to do. */ + unsigned unref_count = 0; + for (unsigned i = start_point; i < end_point + 1; i++) + unref_count += indices.arrayZ[i]; + unref_count = (end_point - start_point + 1) - unref_count; + + unsigned j = start_point; + if (unref_count == 0 || unref_count > end_point - start_point) + goto no_more_gaps; + for (;;) + { + /* Locate the next gap of unreferenced points between two referenced points prev and next. + * Note that a gap may wrap around at left (start_point) and/or at right (end_point). + */ + unsigned int prev, next, i; + for (;;) + { + i = j; + j = next_index (i, start_point, end_point); + if (indices.arrayZ[i] && !indices.arrayZ[j]) break; + } + prev = j = i; + for (;;) + { + i = j; + j = next_index (i, start_point, end_point); + if (!indices.arrayZ[i] && indices.arrayZ[j]) break; + } + next = j; + /* Infer deltas for all unref points in the gap between prev and next */ + i = prev; + for (;;) + { + i = next_index (i, start_point, end_point); + if (i == next) break; + deltas_x.arrayZ[i] = infer_delta (orig_points.arrayZ[i].x, orig_points.arrayZ[prev].x, orig_points.arrayZ[next].x, + deltas_x.arrayZ[prev], deltas_x.arrayZ[next]); + deltas_y.arrayZ[i] = infer_delta (orig_points.arrayZ[i].y, orig_points.arrayZ[prev].y, orig_points.arrayZ[next].y, + deltas_y.arrayZ[prev], deltas_y.arrayZ[next]); + inferred_idxes.add (i); + if (--unref_count == 0) goto no_more_gaps; + } + } + no_more_gaps: + start_point = end_point + 1; + } + + for (unsigned i : inferred_idxes) + indices[i] = true; + return true; + } + + static float infer_delta (float target_val, float prev_val, float next_val, float prev_delta, float next_delta) + { + if (prev_val == next_val) + return (prev_delta == next_delta) ? prev_delta : 0.f; + else if (target_val <= hb_min (prev_val, next_val)) + return (prev_val < next_val) ? prev_delta : next_delta; + else if (target_val >= hb_max (prev_val, next_val)) + return (prev_val > next_val) ? prev_delta : next_delta; + + float r = (target_val - prev_val) / (next_val - prev_val); + return prev_delta + r * (next_delta - prev_delta); + } + + static unsigned int next_index (unsigned int i, unsigned int start, unsigned int end) + { return (i >= end) ? start : (i + 1); } }; struct TupleVariationData @@ -1055,6 +1148,7 @@ struct TupleVariationData return true; } + private: void change_tuple_variations_axis_limits (const hb_hashmap_t& normalized_axes_location, const hb_hashmap_t& axes_triple_distances) { @@ -1250,6 +1344,16 @@ struct TupleVariationData return res; } + bool calc_inferred_deltas (contour_point_vector_t& contour_points) + { + for (tuple_delta_t& var : tuple_vars) + if (!var.calc_inferred_deltas (contour_points)) + return false; + + return true; + } + + public: bool instantiate (const hb_hashmap_t& normalized_axes_location, const hb_hashmap_t& axes_triple_distances, contour_point_vector_t* contour_points = nullptr) diff --git a/src/test-tuple-varstore.cc b/src/test-tuple-varstore.cc index c9086b93c..f1286e749 100644 --- a/src/test-tuple-varstore.cc +++ b/src/test-tuple-varstore.cc @@ -83,8 +83,7 @@ test_decompile_cvar () hb_hashmap_t axes_triple_distances; axes_triple_distances.set (axis_tag, TripleDistances (1.f, 1.f)); - tuple_variations.change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances); - tuple_variations.merge_tuple_variations (); + tuple_variations.instantiate (normalized_axes_location, axes_triple_distances); assert (tuple_variations.tuple_vars[0].indices.length == 65); assert (tuple_variations.tuple_vars[1].indices.length == 65); -- cgit v1.2.3 From 1d91622ddf082cd0777e9ae67876fe13fc7e454d Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 18 Jul 2023 09:52:40 -0700 Subject: [instancer] add a hashing impl for floating point type --- src/hb-algs.hh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hb-algs.hh b/src/hb-algs.hh index 6cabc7fb0..ea9705716 100644 --- a/src/hb-algs.hh +++ b/src/hb-algs.hh @@ -367,6 +367,10 @@ struct hb_enable_if (std::is_integral::value && sizeof (T) > sizeof (uint32_t))> constexpr auto impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, (uint32_t) (v ^ (v >> 32)) * 2654435761u /* Knuth's multiplicative hash */) + template ::value)> constexpr auto + impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, fasthash32 (std::addressof (v), sizeof (T), 0xf437ffe6)) + template constexpr auto impl (const T& v, hb_priority<0>) const HB_RETURN (uint32_t, std::hash>{} (hb_deref (v))) -- cgit v1.2.3 From 366ffd1ef0f26cf719ee45e08f59fc9fb4b38a05 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 7 Aug 2023 10:32:47 -0700 Subject: [instancer] fix move constructor for tuple_delta_t --- src/hb-ot-var-common.hh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index b0b870198..0a92e00df 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -455,14 +455,20 @@ struct tuple_delta_t tuple_delta_t () = default; tuple_delta_t (const tuple_delta_t& o) = default; - tuple_delta_t (tuple_delta_t&& o) : tuple_delta_t () + friend void swap (tuple_delta_t& a, tuple_delta_t& b) { - axis_tuples = std::move (o.axis_tuples); - indices = std::move (o.indices); - deltas_x = std::move (o.deltas_x); - deltas_y = std::move (o.deltas_y); + hb_swap (a.axis_tuples, b.axis_tuples); + hb_swap (a.indices, b.indices); + hb_swap (a.deltas_x, b.deltas_x); + hb_swap (a.deltas_y, b.deltas_y); + hb_swap (a.compiled_tuple_header, b.compiled_tuple_header); + hb_swap (a.compiled_deltas, b.compiled_deltas); + hb_swap (a.compiled_peak_coords, b.compiled_peak_coords); } + tuple_delta_t (tuple_delta_t&& o) : tuple_delta_t () + { hb_swap (*this, o); } + tuple_delta_t& operator = (tuple_delta_t&& o) { hb_swap (*this, o); -- cgit v1.2.3 From 0ba4d539b365039b602d9f88133fc0cae9cd0e30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 11:49:03 -0600 Subject: Bump fonttools from 4.41.1 to 4.42.0 in /.ci (#4365) Bumps [fonttools](https://github.com/fonttools/fonttools) from 4.41.1 to 4.42.0. - [Release notes](https://github.com/fonttools/fonttools/releases) - [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst) - [Commits](https://github.com/fonttools/fonttools/compare/4.41.1...4.42.0) --- updated-dependencies: - dependency-name: fonttools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .ci/requirements-fonttools.txt | 70 +++++++++++++++++++++--------------------- .ci/requirements.txt | 70 +++++++++++++++++++++--------------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/.ci/requirements-fonttools.txt b/.ci/requirements-fonttools.txt index 345c41b80..f2db967f4 100644 --- a/.ci/requirements-fonttools.txt +++ b/.ci/requirements-fonttools.txt @@ -4,39 +4,39 @@ # # pip-compile --generate-hashes .ci/requirements-fonttools.in # -fonttools==4.41.1 \ - --hash=sha256:1df1b6f4c7c4bc8201eb47f3b268adbf2539943aa43c400f84556557e3e109c0 \ - --hash=sha256:2a22b2c425c698dcd5d6b0ff0b566e8e9663172118db6fd5f1941f9b8063da9b \ - --hash=sha256:33191f062549e6bb1a4782c22a04ebd37009c09360e2d6686ac5083774d06d95 \ - --hash=sha256:38cdecd8f1fd4bf4daae7fed1b3170dfc1b523388d6664b2204b351820aa78a7 \ - --hash=sha256:3ae64303ba670f8959fdaaa30ba0c2dabe75364fdec1caeee596c45d51ca3425 \ - --hash=sha256:3d1f9471134affc1e3b1b806db6e3e2ad3fa99439e332f1881a474c825101096 \ - --hash=sha256:4e3334d51f0e37e2c6056e67141b2adabc92613a968797e2571ca8a03bd64773 \ - --hash=sha256:4edc795533421e98f60acee7d28fc8d941ff5ac10f44668c9c3635ad72ae9045 \ - --hash=sha256:547ab36a799dded58a46fa647266c24d0ed43a66028cd1cd4370b246ad426cac \ - --hash=sha256:59eba8b2e749a1de85760da22333f3d17c42b66e03758855a12a2a542723c6e7 \ - --hash=sha256:704bccd69b0abb6fab9f5e4d2b75896afa48b427caa2c7988792a2ffce35b441 \ - --hash=sha256:73ef0bb5d60eb02ba4d3a7d23ada32184bd86007cb2de3657cfcb1175325fc83 \ - --hash=sha256:7763316111df7b5165529f4183a334aa24c13cdb5375ffa1dc8ce309c8bf4e5c \ - --hash=sha256:849ec722bbf7d3501a0e879e57dec1fc54919d31bff3f690af30bb87970f9784 \ - --hash=sha256:891cfc5a83b0307688f78b9bb446f03a7a1ad981690ac8362f50518bc6153975 \ - --hash=sha256:952cb405f78734cf6466252fec42e206450d1a6715746013f64df9cbd4f896fa \ - --hash=sha256:a7bbb290d13c6dd718ec2c3db46fe6c5f6811e7ea1e07f145fd8468176398224 \ - --hash=sha256:a9b3cc10dc9e0834b6665fd63ae0c6964c6bc3d7166e9bc84772e0edd09f9fa2 \ - --hash=sha256:aaaef294d8e411f0ecb778a0aefd11bb5884c9b8333cc1011bdaf3b58ca4bd75 \ - --hash=sha256:afce2aeb80be72b4da7dd114f10f04873ff512793d13ce0b19d12b2a4c44c0f0 \ - --hash=sha256:b0938ebbeccf7c80bb9a15e31645cf831572c3a33d5cc69abe436e7000c61b14 \ - --hash=sha256:b2d1ee95be42b80d1f002d1ee0a51d7a435ea90d36f1a5ae331be9962ee5a3f1 \ - --hash=sha256:b927e5f466d99c03e6e20961946314b81d6e3490d95865ef88061144d9f62e38 \ - --hash=sha256:bdd729744ae7ecd7f7311ad25d99da4999003dcfe43b436cf3c333d4e68de73d \ - --hash=sha256:c2071267deaa6d93cb16288613419679c77220543551cbe61da02c93d92df72f \ - --hash=sha256:cac73bbef7734e78c60949da11c4903ee5837168e58772371bd42a75872f4f82 \ - --hash=sha256:da2c2964bdc827ba6b8a91dc6de792620be4da3922c4cf0599f36a488c07e2b2 \ - --hash=sha256:e16a9449f21a93909c5be2f5ed5246420f2316e94195dbfccb5238aaa38f9751 \ - --hash=sha256:e5c2b0a95a221838991e2f0e455dec1ca3a8cc9cd54febd68cc64d40fdb83669 \ - --hash=sha256:ec453a45778524f925a8f20fd26a3326f398bfc55d534e37bab470c5e415caa1 \ - --hash=sha256:edee0900cf0eedb29d17c7876102d6e5a91ee333882b1f5abc83e85b934cadb5 \ - --hash=sha256:f14f3ccea4cc7dd1b277385adf3c3bf18f9860f87eab9c2fb650b0af16800f55 \ - --hash=sha256:f240d9adf0583ac8fc1646afe7f4ac039022b6f8fa4f1575a2cfa53675360b69 \ - --hash=sha256:f48602c0b3fd79cd83a34c40af565fe6db7ac9085c8823b552e6e751e3a5b8be +fonttools==4.42.0 \ + --hash=sha256:01cfe02416b6d416c5c8d15e30315cbcd3e97d1b50d3b34b0ce59f742ef55258 \ + --hash=sha256:0a1466713e54bdbf5521f2f73eebfe727a528905ff5ec63cda40961b4b1eea95 \ + --hash=sha256:0df8ef75ba5791e873c9eac2262196497525e3f07699a2576d3ab9ddf41cb619 \ + --hash=sha256:10dac980f2b975ef74532e2a94bb00e97a95b4595fb7f98db493c474d5f54d0e \ + --hash=sha256:150122ed93127a26bc3670ebab7e2add1e0983d30927733aec327ebf4255b072 \ + --hash=sha256:1f81ed9065b4bd3f4f3ce8e4873cd6a6b3f4e92b1eddefde35d332c6f414acc3 \ + --hash=sha256:27ec3246a088555629f9f0902f7412220c67340553ca91eb540cf247aacb1983 \ + --hash=sha256:2d6dc3fa91414ff4daa195c05f946e6a575bd214821e26d17ca50f74b35b0fe4 \ + --hash=sha256:329341ba3d86a36e482610db56b30705384cb23bd595eac8cbb045f627778e9d \ + --hash=sha256:3fb2a69870bfe143ec20b039a1c8009e149dd7780dd89554cc8a11f79e5de86b \ + --hash=sha256:4655c480a1a4d706152ff54f20e20cf7609084016f1df3851cce67cef768f40a \ + --hash=sha256:48e82d776d2e93f88ca56567509d102266e7ab2fb707a0326f032fe657335238 \ + --hash=sha256:57b68eab183fafac7cd7d464a7bfa0fcd4edf6c67837d14fb09c1c20516cf20b \ + --hash=sha256:58c1165f9b2662645de9b19a8c8bdd636b36294ccc07e1b0163856b74f10bafc \ + --hash=sha256:614b1283dca88effd20ee48160518e6de275ce9b5456a3134d5f235523fc5065 \ + --hash=sha256:685a4dd6cf31593b50d6d441feb7781a4a7ef61e19551463e14ed7c527b86f9f \ + --hash=sha256:6bd7e4777bff1dcb7c4eff4786998422770f3bfbef8be401c5332895517ba3fa \ + --hash=sha256:703101eb0490fae32baf385385d47787b73d9ea55253df43b487c89ec767e0d7 \ + --hash=sha256:83b98be5d291e08501bd4fc0c4e0f8e6e05b99f3924068b17c5c9972af6fff84 \ + --hash=sha256:8ece1886d12bb36c48c00b2031518877f41abae317e3a55620d38e307d799b7e \ + --hash=sha256:9c456d1f23deff64ffc8b5b098718e149279abdea4d8692dba69172fb6a0d597 \ + --hash=sha256:9cd2363ea7728496827658682d049ffb2e98525e2247ca64554864a8cc945568 \ + --hash=sha256:a9b55d2a3b360e0c7fc5bd8badf1503ca1c11dd3a1cd20f2c26787ffa145a9c7 \ + --hash=sha256:ae7df0ae9ee2f3f7676b0ff6f4ebe48ad0acaeeeaa0b6839d15dbf0709f2c5ef \ + --hash=sha256:ae881e484702efdb6cf756462622de81d4414c454edfd950b137e9a7352b3cb9 \ + --hash=sha256:b8600ae7dce6ec3ddfb201abb98c9d53abbf8064d7ac0c8a0d8925e722ccf2a0 \ + --hash=sha256:c36c904ce0322df01e590ba814d5d69e084e985d7e4c2869378671d79662a7d4 \ + --hash=sha256:c8bf88f9e3ce347c716921804ef3a8330cb128284eb6c0b6c4b3574f3c580023 \ + --hash=sha256:d40673b2e927f7cd0819c6f04489dfbeb337b4a7b10fc633c89bf4f34ecb9620 \ + --hash=sha256:d54e600a2bcfa5cdaa860237765c01804a03b08404d6affcd92942fa7315ffba \ + --hash=sha256:dfe7fa7e607f7e8b58d0c32501a3a7cac148538300626d1b930082c90ae7f6bd \ + --hash=sha256:e35bed436726194c5e6e094fdfb423fb7afaa0211199f9d245e59e11118c576c \ + --hash=sha256:f0290ea7f9945174bd4dfd66e96149037441eb2008f3649094f056201d99e293 \ + --hash=sha256:fae4e801b774cc62cecf4a57b1eae4097903fced00c608d9e2bc8f84cd87b54a # via -r requirements-fonttools.in diff --git a/.ci/requirements.txt b/.ci/requirements.txt index 00c4437e1..c06a0d244 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -4,41 +4,41 @@ # # pip-compile --generate-hashes .ci/requirements.in # -fonttools==4.41.1 \ - --hash=sha256:1df1b6f4c7c4bc8201eb47f3b268adbf2539943aa43c400f84556557e3e109c0 \ - --hash=sha256:2a22b2c425c698dcd5d6b0ff0b566e8e9663172118db6fd5f1941f9b8063da9b \ - --hash=sha256:33191f062549e6bb1a4782c22a04ebd37009c09360e2d6686ac5083774d06d95 \ - --hash=sha256:38cdecd8f1fd4bf4daae7fed1b3170dfc1b523388d6664b2204b351820aa78a7 \ - --hash=sha256:3ae64303ba670f8959fdaaa30ba0c2dabe75364fdec1caeee596c45d51ca3425 \ - --hash=sha256:3d1f9471134affc1e3b1b806db6e3e2ad3fa99439e332f1881a474c825101096 \ - --hash=sha256:4e3334d51f0e37e2c6056e67141b2adabc92613a968797e2571ca8a03bd64773 \ - --hash=sha256:4edc795533421e98f60acee7d28fc8d941ff5ac10f44668c9c3635ad72ae9045 \ - --hash=sha256:547ab36a799dded58a46fa647266c24d0ed43a66028cd1cd4370b246ad426cac \ - --hash=sha256:59eba8b2e749a1de85760da22333f3d17c42b66e03758855a12a2a542723c6e7 \ - --hash=sha256:704bccd69b0abb6fab9f5e4d2b75896afa48b427caa2c7988792a2ffce35b441 \ - --hash=sha256:73ef0bb5d60eb02ba4d3a7d23ada32184bd86007cb2de3657cfcb1175325fc83 \ - --hash=sha256:7763316111df7b5165529f4183a334aa24c13cdb5375ffa1dc8ce309c8bf4e5c \ - --hash=sha256:849ec722bbf7d3501a0e879e57dec1fc54919d31bff3f690af30bb87970f9784 \ - --hash=sha256:891cfc5a83b0307688f78b9bb446f03a7a1ad981690ac8362f50518bc6153975 \ - --hash=sha256:952cb405f78734cf6466252fec42e206450d1a6715746013f64df9cbd4f896fa \ - --hash=sha256:a7bbb290d13c6dd718ec2c3db46fe6c5f6811e7ea1e07f145fd8468176398224 \ - --hash=sha256:a9b3cc10dc9e0834b6665fd63ae0c6964c6bc3d7166e9bc84772e0edd09f9fa2 \ - --hash=sha256:aaaef294d8e411f0ecb778a0aefd11bb5884c9b8333cc1011bdaf3b58ca4bd75 \ - --hash=sha256:afce2aeb80be72b4da7dd114f10f04873ff512793d13ce0b19d12b2a4c44c0f0 \ - --hash=sha256:b0938ebbeccf7c80bb9a15e31645cf831572c3a33d5cc69abe436e7000c61b14 \ - --hash=sha256:b2d1ee95be42b80d1f002d1ee0a51d7a435ea90d36f1a5ae331be9962ee5a3f1 \ - --hash=sha256:b927e5f466d99c03e6e20961946314b81d6e3490d95865ef88061144d9f62e38 \ - --hash=sha256:bdd729744ae7ecd7f7311ad25d99da4999003dcfe43b436cf3c333d4e68de73d \ - --hash=sha256:c2071267deaa6d93cb16288613419679c77220543551cbe61da02c93d92df72f \ - --hash=sha256:cac73bbef7734e78c60949da11c4903ee5837168e58772371bd42a75872f4f82 \ - --hash=sha256:da2c2964bdc827ba6b8a91dc6de792620be4da3922c4cf0599f36a488c07e2b2 \ - --hash=sha256:e16a9449f21a93909c5be2f5ed5246420f2316e94195dbfccb5238aaa38f9751 \ - --hash=sha256:e5c2b0a95a221838991e2f0e455dec1ca3a8cc9cd54febd68cc64d40fdb83669 \ - --hash=sha256:ec453a45778524f925a8f20fd26a3326f398bfc55d534e37bab470c5e415caa1 \ - --hash=sha256:edee0900cf0eedb29d17c7876102d6e5a91ee333882b1f5abc83e85b934cadb5 \ - --hash=sha256:f14f3ccea4cc7dd1b277385adf3c3bf18f9860f87eab9c2fb650b0af16800f55 \ - --hash=sha256:f240d9adf0583ac8fc1646afe7f4ac039022b6f8fa4f1575a2cfa53675360b69 \ - --hash=sha256:f48602c0b3fd79cd83a34c40af565fe6db7ac9085c8823b552e6e751e3a5b8be +fonttools==4.42.0 \ + --hash=sha256:01cfe02416b6d416c5c8d15e30315cbcd3e97d1b50d3b34b0ce59f742ef55258 \ + --hash=sha256:0a1466713e54bdbf5521f2f73eebfe727a528905ff5ec63cda40961b4b1eea95 \ + --hash=sha256:0df8ef75ba5791e873c9eac2262196497525e3f07699a2576d3ab9ddf41cb619 \ + --hash=sha256:10dac980f2b975ef74532e2a94bb00e97a95b4595fb7f98db493c474d5f54d0e \ + --hash=sha256:150122ed93127a26bc3670ebab7e2add1e0983d30927733aec327ebf4255b072 \ + --hash=sha256:1f81ed9065b4bd3f4f3ce8e4873cd6a6b3f4e92b1eddefde35d332c6f414acc3 \ + --hash=sha256:27ec3246a088555629f9f0902f7412220c67340553ca91eb540cf247aacb1983 \ + --hash=sha256:2d6dc3fa91414ff4daa195c05f946e6a575bd214821e26d17ca50f74b35b0fe4 \ + --hash=sha256:329341ba3d86a36e482610db56b30705384cb23bd595eac8cbb045f627778e9d \ + --hash=sha256:3fb2a69870bfe143ec20b039a1c8009e149dd7780dd89554cc8a11f79e5de86b \ + --hash=sha256:4655c480a1a4d706152ff54f20e20cf7609084016f1df3851cce67cef768f40a \ + --hash=sha256:48e82d776d2e93f88ca56567509d102266e7ab2fb707a0326f032fe657335238 \ + --hash=sha256:57b68eab183fafac7cd7d464a7bfa0fcd4edf6c67837d14fb09c1c20516cf20b \ + --hash=sha256:58c1165f9b2662645de9b19a8c8bdd636b36294ccc07e1b0163856b74f10bafc \ + --hash=sha256:614b1283dca88effd20ee48160518e6de275ce9b5456a3134d5f235523fc5065 \ + --hash=sha256:685a4dd6cf31593b50d6d441feb7781a4a7ef61e19551463e14ed7c527b86f9f \ + --hash=sha256:6bd7e4777bff1dcb7c4eff4786998422770f3bfbef8be401c5332895517ba3fa \ + --hash=sha256:703101eb0490fae32baf385385d47787b73d9ea55253df43b487c89ec767e0d7 \ + --hash=sha256:83b98be5d291e08501bd4fc0c4e0f8e6e05b99f3924068b17c5c9972af6fff84 \ + --hash=sha256:8ece1886d12bb36c48c00b2031518877f41abae317e3a55620d38e307d799b7e \ + --hash=sha256:9c456d1f23deff64ffc8b5b098718e149279abdea4d8692dba69172fb6a0d597 \ + --hash=sha256:9cd2363ea7728496827658682d049ffb2e98525e2247ca64554864a8cc945568 \ + --hash=sha256:a9b55d2a3b360e0c7fc5bd8badf1503ca1c11dd3a1cd20f2c26787ffa145a9c7 \ + --hash=sha256:ae7df0ae9ee2f3f7676b0ff6f4ebe48ad0acaeeeaa0b6839d15dbf0709f2c5ef \ + --hash=sha256:ae881e484702efdb6cf756462622de81d4414c454edfd950b137e9a7352b3cb9 \ + --hash=sha256:b8600ae7dce6ec3ddfb201abb98c9d53abbf8064d7ac0c8a0d8925e722ccf2a0 \ + --hash=sha256:c36c904ce0322df01e590ba814d5d69e084e985d7e4c2869378671d79662a7d4 \ + --hash=sha256:c8bf88f9e3ce347c716921804ef3a8330cb128284eb6c0b6c4b3574f3c580023 \ + --hash=sha256:d40673b2e927f7cd0819c6f04489dfbeb337b4a7b10fc633c89bf4f34ecb9620 \ + --hash=sha256:d54e600a2bcfa5cdaa860237765c01804a03b08404d6affcd92942fa7315ffba \ + --hash=sha256:dfe7fa7e607f7e8b58d0c32501a3a7cac148538300626d1b930082c90ae7f6bd \ + --hash=sha256:e35bed436726194c5e6e094fdfb423fb7afaa0211199f9d245e59e11118c576c \ + --hash=sha256:f0290ea7f9945174bd4dfd66e96149037441eb2008f3649094f056201d99e293 \ + --hash=sha256:fae4e801b774cc62cecf4a57b1eae4097903fced00c608d9e2bc8f84cd87b54a # via -r requirements-fonttools.in gcovr==5.0 \ --hash=sha256:1d80264cbaadff356b3dda71b8c62b3aa803e5b3eb6d526a24932cd6660a2576 \ -- cgit v1.2.3 From 0065658e96c79f8b51c2a702908e84d9d23e0971 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 7 Aug 2023 11:12:02 -0700 Subject: [instancer] enable cvar instancing code --- src/hb-subset-input.cc | 1 - src/hb-subset.cc | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index 93f961f2d..c16160a25 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -75,7 +75,6 @@ hb_subset_input_t::hb_subset_input_t () HB_TAG ('V', 'D', 'M', 'X'), HB_TAG ('D', 'S', 'I', 'G'), HB_TAG ('M', 'V', 'A', 'R'), - HB_TAG ('c', 'v', 'a', 'r'), }; sets.no_subset_tables->add_array (default_no_subset_tables, ARRAY_LENGTH (default_no_subset_tables)); diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 1f97dbed2..100ce87d5 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -520,6 +520,9 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_avar: if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); return _subset (plan, buf); + case HB_OT_TAG_cvar: + if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); + return _subset (plan, buf); case HB_OT_TAG_STAT: if (!plan->user_axes_location.is_empty ()) return _subset (plan, buf); else return _passthrough (plan, tag); -- cgit v1.2.3 From 32cfa37e2edd6a8dbc07c75c010fd2fc68c4346a Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 8 May 2023 13:30:39 -0700 Subject: [instancer] command line support for partial instancing -Also updated hb_subset_input_set_axis_range (), so user can define default value as well --- src/hb-subset-input.cc | 19 ++++++++---- src/hb-subset.h | 3 +- util/hb-subset.cc | 80 ++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 80 insertions(+), 22 deletions(-) diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index c16160a25..aade5585f 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -478,16 +478,21 @@ hb_subset_input_pin_axis_location (hb_subset_input_t *input, * @axis_tag: Tag of the axis * @axis_min_value: Minimum value of the axis variation range to set * @axis_max_value: Maximum value of the axis variation range to set + * @axis_def_value: Default value of the axis variation range to set, in case of + * null, it'll be determined automatically * * Restricting the range of variation on an axis in the given subset input object. - * New min/max values will be clamped if they're not within the fvar axis range. + * New min/default/max values will be clamped if they're not within the fvar axis range. + * If the new default value is null: + * If the fvar axis default value is within the new range, then new default + * value is the same as original default value. * If the fvar axis default value is not within the new range, the new default * value will be changed to the new min or max value, whichever is closer to the fvar * axis default. * - * Note: input min value can not be bigger than input max value - * Note: currently this API does not support changing axis limits yet.It'd be only - * used internally for setting axis limits in the internal data structures + * Note: input min value can not be bigger than input max value. If the input + * default value is not within the new min/max range, it'll be clamped. + * Note: currently it supports gvar and cvar tables only. * * Return value: `true` if success, `false` otherwise * @@ -498,7 +503,8 @@ hb_subset_input_set_axis_range (hb_subset_input_t *input, hb_face_t *face, hb_tag_t axis_tag, float axis_min_value, - float axis_max_value) + float axis_max_value, + float *axis_def_value /* IN, maybe NULL */) { if (axis_min_value > axis_max_value) return false; @@ -509,7 +515,8 @@ hb_subset_input_set_axis_range (hb_subset_input_t *input, float new_min_val = hb_clamp(axis_min_value, axis_info.min_value, axis_info.max_value); float new_max_val = hb_clamp(axis_max_value, axis_info.min_value, axis_info.max_value); - float new_default_val = hb_clamp(axis_info.default_value, new_min_val, new_max_val); + float new_default_val = axis_def_value ? *axis_def_value : axis_info.default_value; + new_default_val = hb_clamp(new_default_val, new_min_val, new_max_val); return input->axes_location.set (axis_tag, Triple (new_min_val, new_default_val, new_max_val)); } #endif diff --git a/src/hb-subset.h b/src/hb-subset.h index 93f1f7f10..4c356997f 100644 --- a/src/hb-subset.h +++ b/src/hb-subset.h @@ -181,7 +181,8 @@ hb_subset_input_set_axis_range (hb_subset_input_t *input, hb_face_t *face, hb_tag_t axis_tag, float axis_min_value, - float axis_max_value); + float axis_max_value, + float *axis_def_value); HB_EXTERN hb_bool_t hb_subset_input_override_name_table (hb_subset_input_t *input, diff --git a/util/hb-subset.cc b/util/hb-subset.cc index 599c7dc4e..e416db238 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -707,32 +707,82 @@ parse_instance (const char *name, return false; } - if (strcmp (s, "drop") == 0) + char *pp = s; + pp = strpbrk (pp, ":"); + if (pp) // partial instancing { - if (!hb_subset_input_pin_axis_to_default (subset_main->input, subset_main->face, axis_tag)) + errno = 0; + char *pend; + float min_val = strtof (s, &pend); + if (errno || s == pend || pend != pp) { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, - "Cannot pin axis: '%c%c%c%c', not present in fvar", HB_UNTAG (axis_tag)); + "Failed parsing axis value at: '%s'", s); return false; } - } - else - { - errno = 0; - char *p; - float axis_value = strtof (s, &p); - if (errno || s == p) + pp++; + float max_val = strtof (pp, &pend); + /* we need to specify 2 values or 3 values for partial instancing: + * at least new min and max values, new default is optional */ + if (errno || pp == pend || (*pend != ':' && *pend != '\0')) { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "Failed parsing axis value at: '%s'", s); return false; } - - if (!hb_subset_input_pin_axis_location (subset_main->input, subset_main->face, axis_tag, axis_value)) + /* 3 values are specified */ + float *def_val_p = nullptr; + float def_val; + if (*pend == ':') { - g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, - "Cannot pin axis: '%c%c%c%c', not present in fvar", HB_UNTAG (axis_tag)); - return false; + def_val = max_val; + def_val_p = &def_val; + pp = pend + 1; + max_val = strtof (pp, &pend); + if (errno || pp == pend || *pend != '\0') + { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Failed parsing axis value at: '%s'", s); + return false; + } + } + if (!hb_subset_input_set_axis_range (subset_main->input, subset_main->face, axis_tag, min_val, max_val, def_val_p)) + { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Error: axis: '%c%c%c%c', not present in fvar or invalid range with min:%.6f max:%.6f", + HB_UNTAG (axis_tag), min_val, max_val); + return false; + } + } + else + { + if (strcmp (s, "drop") == 0) + { + if (!hb_subset_input_pin_axis_to_default (subset_main->input, subset_main->face, axis_tag)) + { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Cannot pin axis: '%c%c%c%c', not present in fvar", HB_UNTAG (axis_tag)); + return false; + } + } + else + { + errno = 0; + char *p; + float axis_value = strtof (s, &p); + if (errno || s == p) + { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Failed parsing axis value at: '%s'", s); + return false; + } + + if (!hb_subset_input_pin_axis_location (subset_main->input, subset_main->face, axis_tag, axis_value)) + { + g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, + "Cannot pin axis: '%c%c%c%c', not present in fvar", HB_UNTAG (axis_tag)); + return false; + } } } s = strtok(nullptr, "="); -- cgit v1.2.3 From 77b158c72d355e8e5e32f0d9748174041fddc8dd Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 7 Aug 2023 16:02:02 -0700 Subject: [instancer] add tests for gvar partial instancing --- test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ....retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 0 -> 8256 bytes ...iations.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 0 -> 7244 bytes ....retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 0 -> 7452 bytes ...iations.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 0 -> 6780 bytes .../data/profiles/no-tables-with-item-variations.txt | 1 + test/subset/data/tests/glyf_partial_instancing.tests | 13 +++++++++++++ test/subset/generate-expected-outputs.py | 1 + test/subset/meson.build | 1 + 10 files changed, 18 insertions(+) create mode 100644 test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf create mode 100644 test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf create mode 100644 test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf create mode 100644 test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf create mode 100644 test/subset/data/profiles/no-tables-with-item-variations.txt create mode 100644 test/subset/data/tests/glyf_partial_instancing.tests diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 980bddb07..4d46a6151 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -72,6 +72,7 @@ EXTRA_DIST += \ expected/collect_name_ids \ expected/instantiate_colrv1 \ expected/instantiate_cff2_update_metrics \ + expected/glyf_partial_instancing \ fonts \ profiles \ $(NULL) diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 919ec7391..ba2a1a2f4 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -63,6 +63,7 @@ TESTS = \ tests/collect_name_ids.tests \ tests/instantiate_colrv1.tests \ tests/instantiate_cff2_update_metrics.tests \ + tests/glyf_partial_instancing.tests \ $(NULL) # TODO: re-enable once colrv1 subsetting is stabilized. diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf new file mode 100644 index 000000000..92b190bed Binary files /dev/null and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf new file mode 100644 index 000000000..7fa245244 Binary files /dev/null and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf new file mode 100644 index 000000000..503c75583 Binary files /dev/null and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf new file mode 100644 index 000000000..74343354d Binary files /dev/null and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ diff --git a/test/subset/data/profiles/no-tables-with-item-variations.txt b/test/subset/data/profiles/no-tables-with-item-variations.txt new file mode 100644 index 000000000..df2b423d1 --- /dev/null +++ b/test/subset/data/profiles/no-tables-with-item-variations.txt @@ -0,0 +1 @@ +--drop-tables+=MVAR,HVAR,VVAR,GDEF,COLR,GPOS diff --git a/test/subset/data/tests/glyf_partial_instancing.tests b/test/subset/data/tests/glyf_partial_instancing.tests new file mode 100644 index 000000000..c0cb12967 --- /dev/null +++ b/test/subset/data/tests/glyf_partial_instancing.tests @@ -0,0 +1,13 @@ +FONTS: +Roboto-Variable.ABC.ttf +Roboto-Variable.composite.ttf + +PROFILES: +no-tables-with-item-variations.txt + +SUBSETS: +* + +INSTANCES: +wght=300:600,wdth=85 +wght=200:300:500,wdth=80:90 diff --git a/test/subset/generate-expected-outputs.py b/test/subset/generate-expected-outputs.py index 5f21f80c4..4e375627f 100755 --- a/test/subset/generate-expected-outputs.py +++ b/test/subset/generate-expected-outputs.py @@ -34,6 +34,7 @@ def generate_expected_output(input_file, unicodes, profile_flags, instance_flags args = ["fonttools", "varLib.instancer", "--no-overlap-flag", "--no-recalc-timestamp", + "--no-optimize", "--output=%s" % instance_path, input_file] args.extend(instance_flags) diff --git a/test/subset/meson.build b/test/subset/meson.build index 45cd70ed0..9a993c19d 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -65,6 +65,7 @@ tests = [ 'collect_name_ids', 'instantiate_colrv1', 'instantiate_cff2_update_metrics', + 'glyf_partial_instancing', ] repack_tests = [ -- cgit v1.2.3 From 0aa5dafefd85d01d486d0d26b75387df3a2927e3 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 8 Aug 2023 08:33:11 -0700 Subject: fix bots. -Also disable partial instancing tests for now, cause the command option is wrapped by experimental_api --- test/subset/data/Makefile.am | 1 - test/subset/data/Makefile.sources | 1 - test/subset/meson.build | 2 +- util/hb-subset.cc | 4 ++++ 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 4d46a6151..980bddb07 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -72,7 +72,6 @@ EXTRA_DIST += \ expected/collect_name_ids \ expected/instantiate_colrv1 \ expected/instantiate_cff2_update_metrics \ - expected/glyf_partial_instancing \ fonts \ profiles \ $(NULL) diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index ba2a1a2f4..919ec7391 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -63,7 +63,6 @@ TESTS = \ tests/collect_name_ids.tests \ tests/instantiate_colrv1.tests \ tests/instantiate_cff2_update_metrics.tests \ - tests/glyf_partial_instancing.tests \ $(NULL) # TODO: re-enable once colrv1 subsetting is stabilized. diff --git a/test/subset/meson.build b/test/subset/meson.build index 9a993c19d..188d3dadd 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -65,7 +65,7 @@ tests = [ 'collect_name_ids', 'instantiate_colrv1', 'instantiate_cff2_update_metrics', - 'glyf_partial_instancing', + #'glyf_partial_instancing', ] repack_tests = [ diff --git a/util/hb-subset.cc b/util/hb-subset.cc index e416db238..bd3df8f57 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -707,6 +707,7 @@ parse_instance (const char *name, return false; } +#ifdef HB_EXPERIMENTAL_API char *pp = s; pp = strpbrk (pp, ":"); if (pp) // partial instancing @@ -756,6 +757,7 @@ parse_instance (const char *name, } else { +#endif if (strcmp (s, "drop") == 0) { if (!hb_subset_input_pin_axis_to_default (subset_main->input, subset_main->face, axis_tag)) @@ -784,7 +786,9 @@ parse_instance (const char *name, return false; } } +#ifdef HB_EXPERIMENTAL_API } +#endif s = strtok(nullptr, "="); } -- cgit v1.2.3 From 40bfabd1f97d7ad665140ba764157a6058e6a3b7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 8 Aug 2023 12:17:25 -0600 Subject: [arabic/stch] Zero advances This was working for our test suite because those glyphs were declared mark and their advances zeroed automatically. But is not the case in eg. the font posted at: https://github.com/harfbuzz/harfbuzz/issues/4369 --- src/hb-ot-shaper-arabic.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hb-ot-shaper-arabic.cc b/src/hb-ot-shaper-arabic.cc index 256f8f1d1..12c7da22f 100644 --- a/src/hb-ot-shaper-arabic.cc +++ b/src/hb-ot-shaper-arabic.cc @@ -599,6 +599,7 @@ apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED, DEBUG_MSG (ARABIC, nullptr, "appending %u copies of glyph %u; j=%u", repeat, info[k - 1].codepoint, j); + pos[k - 1].x_advance = 0; for (unsigned int n = 0; n < repeat; n++) { x_offset -= width; -- cgit v1.2.3 From 313c772989ca838f7ba9c2119ffb953ba8a4418b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 8 Aug 2023 13:06:12 -0600 Subject: [arabic/stch] Also work in left-to-right direction Fixes https://github.com/harfbuzz/harfbuzz/issues/4369 --- src/hb-ot-shaper-arabic.cc | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-shaper-arabic.cc b/src/hb-ot-shaper-arabic.cc index 12c7da22f..1bd730be2 100644 --- a/src/hb-ot-shaper-arabic.cc +++ b/src/hb-ot-shaper-arabic.cc @@ -486,8 +486,10 @@ apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED, 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. */ + bool rtl = buffer->props.direction == HB_DIRECTION_RTL; + + if (!rtl) + buffer->reverse (); /* We do a two pass implementation: * First pass calculates the exact number of extra glyphs we need, @@ -602,14 +604,24 @@ apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED, pos[k - 1].x_advance = 0; for (unsigned int n = 0; n < repeat; n++) { - x_offset -= width; - if (n > 0) - x_offset += extra_repeat_overlap; + if (rtl) + { + 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 (!rtl) + { + x_offset += width; + if (n > 0) + x_offset -= extra_repeat_overlap; + } } } } @@ -626,6 +638,9 @@ apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED, buffer->len = new_len; } } + + if (!rtl) + buffer->reverse (); } -- cgit v1.2.3 From 9daef6ed4eda12e13628b1ae8bff590d4e6adaf6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 8 Aug 2023 13:33:11 -0600 Subject: [arabic] Add test for previous commit --- .../fonts/507637795ce4f2975593da54d12b46f76c7cc4cc.ttf | Bin 0 -> 2200 bytes test/shape/data/in-house/tests/arabic-stch.tests | 1 + 2 files changed, 1 insertion(+) create mode 100644 test/shape/data/in-house/fonts/507637795ce4f2975593da54d12b46f76c7cc4cc.ttf diff --git a/test/shape/data/in-house/fonts/507637795ce4f2975593da54d12b46f76c7cc4cc.ttf b/test/shape/data/in-house/fonts/507637795ce4f2975593da54d12b46f76c7cc4cc.ttf new file mode 100644 index 000000000..e25dccaf8 Binary files /dev/null and b/test/shape/data/in-house/fonts/507637795ce4f2975593da54d12b46f76c7cc4cc.ttf differ diff --git a/test/shape/data/in-house/tests/arabic-stch.tests b/test/shape/data/in-house/tests/arabic-stch.tests index 491b24299..9221d31bb 100644 --- a/test/shape/data/in-house/tests/arabic-stch.tests +++ b/test/shape/data/in-house/tests/arabic-stch.tests @@ -1 +1,2 @@ ../fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf;--no-glyph-names;U+0718,U+070F,U+0718,U+0718,U+002E;[1=4+168|3=3+502|3=2+502|4=1@-1004,0+0|5=1@-876,0+0|5=1@-799,0+0|5=1@-722,0+0|5=1@-645,0+0|4=1@-566,0+0|5=1@-438,0+0|5=1@-361,0+0|5=1@-284,0+0|5=1@-207,0+0|4=1@-128,0+0|3=0+502] +../fonts/507637795ce4f2975593da54d12b46f76c7cc4cc.ttf;--direction=l;U+0891,U+0661,U+0662,U+0663,U+0664,U+066B;[piastre-ar.head=0+0|piastre-ar.repeat=0@644,0+0|piastre-ar.repeat=0@778,0+0|piastre-ar.repeat=0@897,0+0|piastre-ar.repeat=0@1016,0+0|piastre-ar.repeat=0@1135,0+0|piastre-ar.repeat=0@1254,0+0|piastre-ar.repeat=0@1373,0+0|piastre-ar.repeat=0@1492,0+0|piastre-ar.tail=0@1611,0+0|one-ar=1+449|two-ar=2+449|three-ar=3+449|four-ar=4+449|decimalseparator-ar=5+222] -- cgit v1.2.3 From 483bc0a3847ae55860bd55fa0eb214f899a02b31 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 8 Aug 2023 15:58:20 -0600 Subject: [arabic/stch] Center the stretched group over the digits Mostly relevant when there's one digit only. https://github.com/harfbuzz/harfbuzz/issues/4369#issuecomment-1670361856 --- src/hb-ot-shaper-arabic.cc | 5 ++++- test/shape/data/in-house/tests/arabic-stch.tests | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-shaper-arabic.cc b/src/hb-ot-shaper-arabic.cc index 1bd730be2..72dcc84df 100644 --- a/src/hb-ot-shaper-arabic.cc +++ b/src/hb-ot-shaper-arabic.cc @@ -579,7 +579,10 @@ apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED, ++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); + w_remaining = 0; + } } if (step == MEASURE) @@ -590,7 +593,7 @@ apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED, else { buffer->unsafe_to_break (context, end); - hb_position_t x_offset = 0; + hb_position_t x_offset = w_remaining / 2; for (unsigned int k = end; k > start; k--) { hb_position_t width = font->get_glyph_h_advance (info[k - 1].codepoint); diff --git a/test/shape/data/in-house/tests/arabic-stch.tests b/test/shape/data/in-house/tests/arabic-stch.tests index 9221d31bb..890d8bf11 100644 --- a/test/shape/data/in-house/tests/arabic-stch.tests +++ b/test/shape/data/in-house/tests/arabic-stch.tests @@ -1,2 +1,3 @@ ../fonts/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf;--no-glyph-names;U+0718,U+070F,U+0718,U+0718,U+002E;[1=4+168|3=3+502|3=2+502|4=1@-1004,0+0|5=1@-876,0+0|5=1@-799,0+0|5=1@-722,0+0|5=1@-645,0+0|4=1@-566,0+0|5=1@-438,0+0|5=1@-361,0+0|5=1@-284,0+0|5=1@-207,0+0|4=1@-128,0+0|3=0+502] ../fonts/507637795ce4f2975593da54d12b46f76c7cc4cc.ttf;--direction=l;U+0891,U+0661,U+0662,U+0663,U+0664,U+066B;[piastre-ar.head=0+0|piastre-ar.repeat=0@644,0+0|piastre-ar.repeat=0@778,0+0|piastre-ar.repeat=0@897,0+0|piastre-ar.repeat=0@1016,0+0|piastre-ar.repeat=0@1135,0+0|piastre-ar.repeat=0@1254,0+0|piastre-ar.repeat=0@1373,0+0|piastre-ar.repeat=0@1492,0+0|piastre-ar.tail=0@1611,0+0|one-ar=1+449|two-ar=2+449|three-ar=3+449|four-ar=4+449|decimalseparator-ar=5+222] +../fonts/507637795ce4f2975593da54d12b46f76c7cc4cc.ttf;--direction=l;U+0661,U+0662,U+0663,U+0891,U+0664,U+066B;[one-ar=0+449|two-ar=1+449|three-ar=2+449|piastre-ar.head=3@-192,0+0|piastre-ar.repeat=3@452,0+0|piastre-ar.tail=3@586,0+0|four-ar=4+449|decimalseparator-ar=5+222] -- cgit v1.2.3 From 45c1ad05126c33408ccf862a0fde69f608147f04 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 9 Aug 2023 10:27:45 -0600 Subject: [paint] Add tracing --- src/OT/Color/COLR/COLR.hh | 22 ++++++++++++++++++++++ src/hb-debug.hh | 19 +++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index 76f4c08ff..a762959f1 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -53,6 +53,7 @@ struct Paint; struct hb_paint_context_t : hb_dispatch_context_t { + const char *get_name () { return "PAINT"; } template return_t dispatch (const T &obj) { obj.paint_glyph (this); return hb_empty_t (); } static return_t default_return_value () { return hb_empty_t (); } @@ -261,6 +262,7 @@ struct Variable void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); value.paint_glyph (c, varIdxBase); } @@ -315,6 +317,7 @@ struct NoVariable void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); value.paint_glyph (c, varIdxBase); } @@ -558,6 +561,7 @@ struct Affine2x3 void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); c->funcs->push_transform (c->data, xx.to_float (c->instancer (varIdxBase, 0)), yx.to_float (c->instancer (varIdxBase, 1)), @@ -639,6 +643,7 @@ struct PaintSolid void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); hb_bool_t is_foreground; hb_color_t color; @@ -693,6 +698,7 @@ struct PaintLinearGradient void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); hb_color_line_t cl = { (void *) &(this+colorLine), (this+colorLine).static_get_color_stops, c, @@ -759,6 +765,7 @@ struct PaintRadialGradient void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); hb_color_line_t cl = { (void *) &(this+colorLine), (this+colorLine).static_get_color_stops, c, @@ -823,6 +830,7 @@ struct PaintSweepGradient void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); hb_color_line_t cl = { (void *) &(this+colorLine), (this+colorLine).static_get_color_stops, c, @@ -874,6 +882,7 @@ struct PaintGlyph void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); c->funcs->push_inverse_root_transform (c->data, c->font); c->funcs->push_clip_glyph (c->data, gid, c->font); c->funcs->push_root_transform (c->data, c->font); @@ -946,6 +955,7 @@ struct PaintTransform void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); (this+transform).paint_glyph (c); c->recurse (this+src); c->funcs->pop_transform (c->data); @@ -990,6 +1000,7 @@ struct PaintTranslate void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float ddx = dx + c->instancer (varIdxBase, 0); float ddy = dy + c->instancer (varIdxBase, 1); @@ -1038,6 +1049,7 @@ struct PaintScale void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float sx = scaleX.to_float (c->instancer (varIdxBase, 0)); float sy = scaleY.to_float (c->instancer (varIdxBase, 1)); @@ -1088,6 +1100,7 @@ struct PaintScaleAroundCenter void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float sx = scaleX.to_float (c->instancer (varIdxBase, 0)); float sy = scaleY.to_float (c->instancer (varIdxBase, 1)); float tCenterX = centerX + c->instancer (varIdxBase, 2); @@ -1141,6 +1154,7 @@ struct PaintScaleUniform void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float s = scale.to_float (c->instancer (varIdxBase, 0)); bool p1 = c->funcs->push_scale (c->data, s, s); @@ -1188,6 +1202,7 @@ struct PaintScaleUniformAroundCenter void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float s = scale.to_float (c->instancer (varIdxBase, 0)); float tCenterX = centerX + c->instancer (varIdxBase, 1); float tCenterY = centerY + c->instancer (varIdxBase, 2); @@ -1239,6 +1254,7 @@ struct PaintRotate void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float a = angle.to_float (c->instancer (varIdxBase, 0)); bool p1 = c->funcs->push_rotate (c->data, a); @@ -1286,6 +1302,7 @@ struct PaintRotateAroundCenter void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float a = angle.to_float (c->instancer (varIdxBase, 0)); float tCenterX = centerX + c->instancer (varIdxBase, 1); float tCenterY = centerY + c->instancer (varIdxBase, 2); @@ -1340,6 +1357,7 @@ struct PaintSkew void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float sx = xSkewAngle.to_float(c->instancer (varIdxBase, 0)); float sy = ySkewAngle.to_float(c->instancer (varIdxBase, 1)); @@ -1390,6 +1408,7 @@ struct PaintSkewAroundCenter void paint_glyph (hb_paint_context_t *c, uint32_t varIdxBase) const { + TRACE_PAINT (this); float sx = xSkewAngle.to_float(c->instancer (varIdxBase, 0)); float sy = ySkewAngle.to_float(c->instancer (varIdxBase, 1)); float tCenterX = centerX + c->instancer (varIdxBase, 2); @@ -1442,6 +1461,7 @@ struct PaintComposite void paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); c->recurse (this+backdrop); c->funcs->push_group (c->data); c->recurse (this+src); @@ -2402,6 +2422,7 @@ hb_paint_context_t::recurse (const Paint &paint) void PaintColrLayers::paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); const LayerList &paint_offset_lists = c->get_colr_table ()->get_layerList (); for (unsigned i = firstLayerIndex; i < firstLayerIndex + numLayers; i++) { @@ -2414,6 +2435,7 @@ void PaintColrLayers::paint_glyph (hb_paint_context_t *c) const void PaintColrGlyph::paint_glyph (hb_paint_context_t *c) const { + TRACE_PAINT (this); const COLR *colr_table = c->get_colr_table (); const Paint *paint = colr_table->get_base_glyph_paint (gid); diff --git a/src/hb-debug.hh b/src/hb-debug.hh index 6055fce96..559db4067 100644 --- a/src/hb-debug.hh +++ b/src/hb-debug.hh @@ -265,8 +265,9 @@ static inline void _hb_warn_no_return (bool returned) } } template <> -/*static*/ inline void _hb_warn_no_return (bool returned HB_UNUSED) -{} +/*static*/ inline void _hb_warn_no_return (bool returned HB_UNUSED) {} +template <> +/*static*/ inline void _hb_warn_no_return (bool returned HB_UNUSED) {} template struct hb_auto_trace_t @@ -450,12 +451,26 @@ struct hb_no_trace_t { #define HB_DEBUG_SUBSET_REPACK (HB_DEBUG+0) #endif +#ifndef HB_DEBUG_PAINT +#define HB_DEBUG_PAINT (HB_DEBUG+0) +#endif +#if HB_DEBUG_PAINT +#define TRACE_PAINT(this) \ + HB_UNUSED hb_auto_trace_t trace \ + (&c->debug_depth, c->get_name (), this, HB_FUNC, \ + " ") +#else +#define TRACE_PAINT(this) HB_UNUSED hb_no_trace_t trace +#endif + + #ifndef HB_DEBUG_DISPATCH #define HB_DEBUG_DISPATCH ( \ HB_DEBUG_APPLY + \ HB_DEBUG_SANITIZE + \ HB_DEBUG_SERIALIZE + \ HB_DEBUG_SUBSET + \ + HB_DEBUG_PAINT + \ 0) #endif #if HB_DEBUG_DISPATCH -- cgit v1.2.3 From 077c4308cc2650bcd761b60c2b64eea77c5d399c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 9 Aug 2023 10:41:04 -0600 Subject: [limits] Increase COLRv1 edge-count We have a "pixel" color font that was easily hitting the limit... --- src/hb-limits.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-limits.hh b/src/hb-limits.hh index c503b3065..25c1e71e1 100644 --- a/src/hb-limits.hh +++ b/src/hb-limits.hh @@ -106,7 +106,7 @@ #endif #ifndef HB_COLRV1_MAX_EDGE_COUNT -#define HB_COLRV1_MAX_EDGE_COUNT 1024 +#define HB_COLRV1_MAX_EDGE_COUNT 65536 #endif -- cgit v1.2.3 From 9a7afe922b7c661267ecd2211b5199f5ae4df180 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 9 Aug 2023 12:00:41 -0600 Subject: [perf] Benchmark glyph painting --- perf/benchmark-font.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/perf/benchmark-font.cc b/perf/benchmark-font.cc index 244e06ad4..67e051767 100644 --- a/perf/benchmark-font.cc +++ b/perf/benchmark-font.cc @@ -42,6 +42,7 @@ enum operation_t glyph_h_advances, glyph_extents, draw_glyph, + paint_glyph, load_face_and_shape, }; @@ -192,6 +193,17 @@ static void BM_Font (benchmark::State &state, hb_draw_funcs_destroy (draw_funcs); break; } + case paint_glyph: + { + hb_paint_funcs_t *paint_funcs = hb_paint_funcs_create (); + for (auto _ : state) + { + for (unsigned gid = 0; gid < num_glyphs; ++gid) + hb_font_paint_glyph (font, gid, paint_funcs, nullptr, 0, 0); + } + hb_paint_funcs_destroy (paint_funcs); + break; + } case load_face_and_shape: { for (auto _ : state) @@ -294,6 +306,7 @@ int main(int argc, char** argv) TEST_OPERATION (glyph_h_advances, benchmark::kMicrosecond); TEST_OPERATION (glyph_extents, benchmark::kMicrosecond); TEST_OPERATION (draw_glyph, benchmark::kMicrosecond); + TEST_OPERATION (paint_glyph, benchmark::kMillisecond); TEST_OPERATION (load_face_and_shape, benchmark::kMicrosecond); #undef TEST_OPERATION -- cgit v1.2.3 From e8eb1dc5ff695427abc137d3d15c4eec64ab6c78 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 9 Aug 2023 15:35:59 -0600 Subject: [parse_tag] Accept non-ALNUM in tag name --- src/hb-common.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-common.cc b/src/hb-common.cc index 282a8e4d0..bd4cd88e3 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -815,7 +815,7 @@ parse_tag (const char **pp, const char *end, hb_tag_t *tag) } const char *p = *pp; - while (*pp < end && (ISALNUM(**pp) || **pp == '_')) + while (*pp < end && (**pp != ' ' && **pp != '=' && **pp != '[')) (*pp)++; if (p == *pp || *pp - p > 4) -- cgit v1.2.3 From a8fb56e0f313558dc1f18df2d76ca691567330b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 10:36:33 +0000 Subject: Bump meson from 1.2.0 to 1.2.1 in /.ci Bumps [meson](https://github.com/mesonbuild/meson) from 1.2.0 to 1.2.1. - [Release notes](https://github.com/mesonbuild/meson/releases) - [Commits](https://github.com/mesonbuild/meson/compare/1.2.0...1.2.1) --- updated-dependencies: - dependency-name: meson dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .ci/requirements.in | 2 +- .ci/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.ci/requirements.in b/.ci/requirements.in index 6288c6b28..72fe69798 100644 --- a/.ci/requirements.in +++ b/.ci/requirements.in @@ -1,4 +1,4 @@ -r requirements-fonttools.in -meson==1.2.0 +meson==1.2.1 gcovr==5.0 ninja diff --git a/.ci/requirements.txt b/.ci/requirements.txt index c06a0d244..95b3646ca 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -179,9 +179,9 @@ markupsafe==2.1.3 \ --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 # via jinja2 -meson==1.2.0 \ - --hash=sha256:10c0364edc67a1b3146f405800b300f0535f42b8736e79c744a8029a855b7c6b \ - --hash=sha256:1c0b634fe6b6a7072e398647f1bf392048577068a5c92ae44d04085dab0ded6f +meson==1.2.1 \ + --hash=sha256:08f83fc17513e99cd6e82c7554c1f58af70425211887f8f9c7363b2a90209462 \ + --hash=sha256:b1db3a153087549497ee52b1c938d2134e0338214fe14f7efd16fecd57b639f5 # via -r requirements.in ninja==1.11.1 \ --hash=sha256:1c474326e11fba3f8c2582715d79216292e327d3335367c0e87e9647a002cc4a \ -- cgit v1.2.3 From 8d44562b429afc1cca8cf5472905ae189929a506 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 10:50:49 +0000 Subject: Bump hendrikmuhs/ccache-action from 1.2.9 to 1.2.10 Bumps [hendrikmuhs/ccache-action](https://github.com/hendrikmuhs/ccache-action) from 1.2.9 to 1.2.10. - [Release notes](https://github.com/hendrikmuhs/ccache-action/releases) - [Commits](https://github.com/hendrikmuhs/ccache-action/compare/ca3acd2731eef11f1572ccb126356c2f9298d35e...6d1841ec156c39a52b1b23a810da917ab98da1f4) --- updated-dependencies: - dependency-name: hendrikmuhs/ccache-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/linux-ci.yml | 2 +- .github/workflows/macos-ci.yml | 2 +- .github/workflows/msvc-ci.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 950e4ed6c..05ec95fce 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -18,7 +18,7 @@ jobs: - name: Checkout uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup Ccache - uses: hendrikmuhs/ccache-action@ca3acd2731eef11f1572ccb126356c2f9298d35e # v1.2.9 + uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: key: ${{ github.job }}-${{ runner.os }}-${{ runner.arch }} - name: Install Dependencies diff --git a/.github/workflows/macos-ci.yml b/.github/workflows/macos-ci.yml index abf2864a7..c57a5f3ff 100644 --- a/.github/workflows/macos-ci.yml +++ b/.github/workflows/macos-ci.yml @@ -17,7 +17,7 @@ jobs: - name: Checkout uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup Ccache - uses: hendrikmuhs/ccache-action@ca3acd2731eef11f1572ccb126356c2f9298d35e # v1.2.9 + uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: key: ${{ github.job }}-${{ runner.os }}-${{ runner.arch }} - name: Install Dependencies diff --git a/.github/workflows/msvc-ci.yml b/.github/workflows/msvc-ci.yml index 7ef067965..518b0ae06 100644 --- a/.github/workflows/msvc-ci.yml +++ b/.github/workflows/msvc-ci.yml @@ -30,7 +30,7 @@ jobs: - name: Checkout uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup Ccache - uses: hendrikmuhs/ccache-action@ca3acd2731eef11f1572ccb126356c2f9298d35e # v1.2.9 + uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: variant: sccache key: ${{ github.job }}-${{ matrix.os }}-${{ matrix.ARCH }} -- cgit v1.2.3 From 1da4c61550ed8216c811765de6d8904727df0e65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 10:51:00 +0000 Subject: Bump github/codeql-action from 2.21.2 to 2.21.3 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.21.2 to 2.21.3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/0ba4244466797eb048eb91a6cd43d5c03ca8bd05...5b6282e01c62d02e720b81eb8a51204f527c3624) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 3432dbec9..d6b5ce1cf 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@0ba4244466797eb048eb91a6cd43d5c03ca8bd05 # v2.21.2 + uses: github/codeql-action/upload-sarif@5b6282e01c62d02e720b81eb8a51204f527c3624 # v2.21.3 with: sarif_file: results.sarif -- cgit v1.2.3 From 8d19274c2d6e7205dc32d416c60c3542a3f353e9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 14 Aug 2023 14:40:26 -0600 Subject: [layout] Speed up VarStoreInstancer --- src/hb-ot-var-common.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 9e813f6d2..fd3b64040 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -230,7 +230,7 @@ struct VarStoreInstancer /* according to the spec, if colr table has varStore but does not have * varIdxMap, then an implicit identity mapping is used */ float operator() (uint32_t varIdx, unsigned short offset = 0) const - { return varStore->get_delta (varIdxMap ? varIdxMap->map (VarIdx::add (varIdx, offset)) : varIdx + offset, coords); } + { return coords ? varStore->get_delta (varIdxMap ? varIdxMap->map (VarIdx::add (varIdx, offset)) : varIdx + offset, coords) : 0; } const VariationStore *varStore; const DeltaSetIndexMap *varIdxMap; -- cgit v1.2.3 From 74527670fc5b0517e1d2cba2c26e3695547302e1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 14 Aug 2023 15:57:24 -0600 Subject: [COLR/cairo] Add paint_color_glyph func Implement in cairo to use scaled-font's glyph cache. --- src/OT/Color/COLR/COLR.hh | 4 ++++ src/hb-cairo.cc | 19 ++++++++++++++++++ src/hb-paint.cc | 25 +++++++++++++++++++++++ src/hb-paint.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++ src/hb-paint.hh | 8 ++++++++ 5 files changed, 107 insertions(+) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index a762959f1..717d2b4e8 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -2436,6 +2436,10 @@ void PaintColrLayers::paint_glyph (hb_paint_context_t *c) const void PaintColrGlyph::paint_glyph (hb_paint_context_t *c) const { TRACE_PAINT (this); + + if (c->funcs->color_glyph (c->data, gid, c->font)) + return; + const COLR *colr_table = c->get_colr_table (); const Paint *paint = colr_table->get_base_glyph_paint (gid); diff --git a/src/hb-cairo.cc b/src/hb-cairo.cc index 68c7bc064..6c80dd55a 100644 --- a/src/hb-cairo.cc +++ b/src/hb-cairo.cc @@ -166,6 +166,24 @@ hb_cairo_pop_transform (hb_paint_funcs_t *pfuncs HB_UNUSED, cairo_restore (cr); } +static hb_bool_t +hb_cairo_paint_color_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, + void *paint_data, + hb_codepoint_t glyph, + hb_font_t *font, + void *user_data HB_UNUSED) +{ + hb_cairo_context_t *c = (hb_cairo_context_t *) paint_data; + cairo_t *cr = c->cr; + + cairo_glyph_t cairo_glyph = { glyph, 0, 0 }; + cairo_set_scaled_font (cr, c->scaled_font); + cairo_set_font_size (cr, hb_face_get_upem (hb_font_get_face (font))); + cairo_show_glyphs (cr, &cairo_glyph, 1); + + return true; +} + static void hb_cairo_push_clip_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, void *paint_data, @@ -397,6 +415,7 @@ static struct hb_cairo_paint_funcs_lazy_loader_t : hb_paint_funcs_lazy_loader_t< hb_paint_funcs_set_push_transform_func (funcs, hb_cairo_push_transform, nullptr, nullptr); hb_paint_funcs_set_pop_transform_func (funcs, hb_cairo_pop_transform, nullptr, nullptr); + hb_paint_funcs_set_color_glyph_func (funcs, hb_cairo_paint_color_glyph, nullptr, nullptr); hb_paint_funcs_set_push_clip_glyph_func (funcs, hb_cairo_push_clip_glyph, nullptr, nullptr); hb_paint_funcs_set_push_clip_rectangle_func (funcs, hb_cairo_push_clip_rectangle, nullptr, nullptr); hb_paint_funcs_set_pop_clip_func (funcs, hb_cairo_pop_clip, nullptr, nullptr); diff --git a/src/hb-paint.cc b/src/hb-paint.cc index 28150f163..0a5384552 100644 --- a/src/hb-paint.cc +++ b/src/hb-paint.cc @@ -54,6 +54,12 @@ static void hb_paint_pop_transform_nil (hb_paint_funcs_t *funcs, void *paint_data, void *user_data) {} +static hb_bool_t +hb_paint_color_glyph_nil (hb_paint_funcs_t *funcs, void *paint_data, + hb_codepoint_t glyph, + hb_font_t *font, + void *user_data) { return false; } + static void hb_paint_push_clip_glyph_nil (hb_paint_funcs_t *funcs, void *paint_data, hb_codepoint_t glyph, @@ -473,6 +479,25 @@ hb_paint_pop_transform (hb_paint_funcs_t *funcs, void *paint_data) funcs->pop_transform (paint_data); } +/** + * hb_paint_color_glyph: + * @funcs: paint functions + * @paint_data: associated data passed by the caller + * @glyph: the glyph ID + * @font: the font + * + * Perform a "color-glyph" paint operation. + * + * XSince: REPLACEME + */ +hb_bool_t +hb_paint_color_glyph (hb_paint_funcs_t *funcs, void *paint_data, + hb_codepoint_t glyph, + hb_font_t *font) +{ + return funcs->color_glyph (paint_data, glyph, font); +} + /** * hb_paint_push_clip_glyph: * @funcs: paint functions diff --git a/src/hb-paint.h b/src/hb-paint.h index 543382780..1a7e14d62 100644 --- a/src/hb-paint.h +++ b/src/hb-paint.h @@ -136,6 +136,35 @@ typedef void (*hb_paint_pop_transform_func_t) (hb_paint_funcs_t *funcs, void *paint_data, void *user_data); +/** + * hb_paint_color_glyph_func_t: + * @funcs: paint functions object + * @paint_data: The data accompanying the paint functions in hb_font_paint_glyph() + * @glyph: the glyph ID + * @font: the font + * @user_data: User data pointer passed to hb_paint_funcs_set_color_glyph_func() + * + * A virtual method for the #hb_paint_funcs_t to render a color glyph by glyph index. + * + * XXX + * + * The coordinates of the glyph outline are interpreted according + * to the current transform. + * + * This clip is applied in addition to the current clip, + * and remains in effect until a matching call to + * the #hb_paint_funcs_pop_clip_func_t vfunc. + * + * Return value: %true if the glyph was painted, %false otherwise. + * + * XSince: REPLACEME + */ +typedef hb_bool_t (*hb_paint_color_glyph_func_t) (hb_paint_funcs_t *funcs, + void *paint_data, + hb_codepoint_t glyph, + hb_font_t *font, + void *user_data); + /** * hb_paint_push_clip_glyph_func_t: * @funcs: paint functions object @@ -723,6 +752,23 @@ hb_paint_funcs_set_pop_transform_func (hb_paint_funcs_t *funcs, void *user_data, hb_destroy_func_t destroy); +/** + * hb_paint_funcs_set_color_glyph_func: + * @funcs: A paint functions struct + * @func: (closure user_data) (destroy destroy) (scope notified): The color-glyph callback + * @user_data: Data to pass to @func + * @destroy: (nullable): Function to call when @user_data is no longer needed + * + * Sets the color-glyph callback on the paint functions struct. + * + * Since: 7.0.0 + */ +HB_EXTERN void +hb_paint_funcs_set_color_glyph_func (hb_paint_funcs_t *funcs, + hb_paint_color_glyph_func_t func, + void *user_data, + hb_destroy_func_t destroy); + /** * hb_paint_funcs_set_push_clip_glyph_func: * @funcs: A paint functions struct @@ -922,6 +968,11 @@ hb_paint_push_transform (hb_paint_funcs_t *funcs, void *paint_data, HB_EXTERN void hb_paint_pop_transform (hb_paint_funcs_t *funcs, void *paint_data); +HB_EXTERN hb_bool_t +hb_paint_color_glyph (hb_paint_funcs_t *funcs, void *paint_data, + hb_codepoint_t glyph, + hb_font_t *font); + HB_EXTERN void hb_paint_push_clip_glyph (hb_paint_funcs_t *funcs, void *paint_data, hb_codepoint_t glyph, diff --git a/src/hb-paint.hh b/src/hb-paint.hh index d291a4b97..56b790dbe 100644 --- a/src/hb-paint.hh +++ b/src/hb-paint.hh @@ -32,6 +32,7 @@ #define HB_PAINT_FUNCS_IMPLEMENT_CALLBACKS \ HB_PAINT_FUNC_IMPLEMENT (push_transform) \ HB_PAINT_FUNC_IMPLEMENT (pop_transform) \ + HB_PAINT_FUNC_IMPLEMENT (color_glyph) \ HB_PAINT_FUNC_IMPLEMENT (push_clip_glyph) \ HB_PAINT_FUNC_IMPLEMENT (push_clip_rectangle) \ HB_PAINT_FUNC_IMPLEMENT (pop_clip) \ @@ -77,6 +78,13 @@ struct hb_paint_funcs_t void pop_transform (void *paint_data) { func.pop_transform (this, paint_data, !user_data ? nullptr : user_data->pop_transform); } + bool color_glyph (void *paint_data, + hb_codepoint_t glyph, + hb_font_t *font) + { return func.color_glyph (this, paint_data, + glyph, + font, + !user_data ? nullptr : user_data->push_clip_glyph); } void push_clip_glyph (void *paint_data, hb_codepoint_t glyph, hb_font_t *font) -- cgit v1.2.3 From 58effbcc4f1b6aa1870738f0da3d999f4f1810be Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 14 Aug 2023 16:47:01 -0600 Subject: . --- src/OT/Color/COLR/COLR.hh | 5 +++++ src/hb-cairo.cc | 10 +++++++++- test/api/results/test-154 | 6 +++++- test/api/test-paint.c | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index 717d2b4e8..6e46fa31e 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -2437,8 +2437,13 @@ void PaintColrGlyph::paint_glyph (hb_paint_context_t *c) const { TRACE_PAINT (this); + c->funcs->push_inverse_root_transform (c->data, c->font); if (c->funcs->color_glyph (c->data, gid, c->font)) + { + c->funcs->pop_transform (c->data); return; + } + c->funcs->pop_transform (c->data); const COLR *colr_table = c->get_colr_table (); const Paint *paint = colr_table->get_base_glyph_paint (gid); diff --git a/src/hb-cairo.cc b/src/hb-cairo.cc index 6c80dd55a..f4f9f54ab 100644 --- a/src/hb-cairo.cc +++ b/src/hb-cairo.cc @@ -176,11 +176,19 @@ hb_cairo_paint_color_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, hb_cairo_context_t *c = (hb_cairo_context_t *) paint_data; cairo_t *cr = c->cr; + cairo_save (cr); + + hb_position_t x_scale, y_scale; + hb_font_get_scale (font, &x_scale, &y_scale); + cairo_scale (cr, x_scale, y_scale); + cairo_glyph_t cairo_glyph = { glyph, 0, 0 }; cairo_set_scaled_font (cr, c->scaled_font); - cairo_set_font_size (cr, hb_face_get_upem (hb_font_get_face (font))); + cairo_set_font_size (cr, 1); cairo_show_glyphs (cr, &cairo_glyph, 1); + cairo_restore (cr); + return true; } diff --git a/test/api/results/test-154 b/test/api/results/test-154 index 8b329cf79..1a86fe3f2 100644 --- a/test/api/results/test-154 +++ b/test/api/results/test-154 @@ -1,10 +1,14 @@ -# random seed: R02S9ffd1e4fb7cd9c50371f61b259bb32b5 +# random seed: R02S33c307340a09918aefe09266feb15798 # Start of hb tests # Start of paint tests # Start of ot tests start clip rectangle 0 500 500 1e+03 start transform 1 0 0 1 0 0 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 100 100 900 900 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 0 1e+03 1e+03 start transform 1 0 -0 1 0 0 start clip glyph 2 diff --git a/test/api/test-paint.c b/test/api/test-paint.c index 13b71c5e3..e1044edd1 100644 --- a/test/api/test-paint.c +++ b/test/api/test-paint.c @@ -389,7 +389,7 @@ test_hb_paint (gconstpointer d, /* Run * - * GENERATE_DATA=1 G_TEST_SRCDIR=./test/api ./build/test/api/test-ot-color -p TESTCASE > test/api/results/OUTPUT + * GENERATE_DATA=1 G_TEST_SRCDIR=./test/api ./build/test/api/test-paint -p TESTCASE > test/api/results/OUTPUT * * to produce the expected results file. */ -- cgit v1.2.3 From 47231bdc701df1f3ba0dafb901dc92db54e7ff78 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 14 Aug 2023 16:52:44 -0600 Subject: [COLR/cairo/ft] Fixups to paint-color-glyph and implement for hb-ft --- docs/harfbuzz-sections.txt | 3 +++ src/hb-ft-colr.hh | 11 ++++++++ test/api/results/bad-154 | 66 ++++++++++++++++++++++++++++++++++++++++++++- test/api/results/testvf-154 | 6 ++++- 4 files changed, 84 insertions(+), 2 deletions(-) diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt index 46d0a16d9..a9307f291 100644 --- a/docs/harfbuzz-sections.txt +++ b/docs/harfbuzz-sections.txt @@ -244,6 +244,8 @@ hb_paint_push_transform_func_t hb_paint_funcs_set_push_transform_func hb_paint_pop_transform_func_t hb_paint_funcs_set_pop_transform_func +hb_paint_color_glyph_func_t +hb_paint_funcs_set_color_glyph_func hb_paint_push_clip_glyph_func_t hb_paint_funcs_set_push_clip_glyph_func hb_paint_push_clip_rectangle_func_t @@ -280,6 +282,7 @@ hb_paint_funcs_set_custom_palette_color_func hb_paint_push_transform hb_paint_pop_transform +hb_paint_color_glyph hb_paint_push_clip_glyph hb_paint_push_clip_rectangle hb_paint_pop_clip diff --git a/src/hb-ft-colr.hh b/src/hb-ft-colr.hh index fa5712f9b..a78028221 100644 --- a/src/hb-ft-colr.hh +++ b/src/hb-ft-colr.hh @@ -320,6 +320,17 @@ _hb_ft_paint (hb_ft_paint_context_t *c, break; case FT_COLR_PAINTFORMAT_COLR_GLYPH: { + c->funcs->push_inverse_root_transform (c->data, c->font); + c->ft_font->lock.unlock (); + if (c->funcs->color_glyph (c->data, paint.u.colr_glyph.glyphID, c->font)) + { + c->ft_font->lock.lock (); + c->funcs->pop_transform (c->data); + return; + } + c->ft_font->lock.lock (); + c->funcs->pop_transform (c->data); + FT_OpaquePaint other_paint = {0}; if (FT_Get_Color_Glyph_Paint (ft_face, paint.u.colr_glyph.glyphID, FT_COLOR_NO_ROOT_TRANSFORM, diff --git a/test/api/results/bad-154 b/test/api/results/bad-154 index 2f4bdfc7a..ce8e4ff69 100644 --- a/test/api/results/bad-154 +++ b/test/api/results/bad-154 @@ -1,40 +1,104 @@ -# random seed: R02S345aec86e0be01a834deb6fc61057f9c +# random seed: R02S0cee2d366e5dbd296a38859c4a84c045 # Start of hb tests # Start of paint tests # Start of ot tests start clip rectangle 0 500 500 1e+03 start transform 1 0 0 1 0 0 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 500 500 1e+03 end clip push group diff --git a/test/api/results/testvf-154 b/test/api/results/testvf-154 index 6da136fbf..f497751cf 100644 --- a/test/api/results/testvf-154 +++ b/test/api/results/testvf-154 @@ -1,10 +1,14 @@ -# random seed: R02S2212d33e4705ca20b6475a83d116b9ab +# random seed: R02S08067256908fbfc782c2c2c09d648be6 # Start of hb tests # Start of paint tests # Start of ot tests start clip rectangle 0 500 500 1e+03 start transform 1 0 0 1 0 0 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 100 100 900 900 + start transform 1 0 -0 1 0 0 + end transform start clip rectangle 0 0 1e+03 1e+03 start transform 1 0 -0 1 0 0 start clip glyph 2 -- cgit v1.2.3 From 5560eb60d75945a331427b0e8112282dc4ff0d94 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 14 Aug 2023 17:05:22 -0600 Subject: [paint] Fix docs --- src/hb-paint.h | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/hb-paint.h b/src/hb-paint.h index 1a7e14d62..74f49f047 100644 --- a/src/hb-paint.h +++ b/src/hb-paint.h @@ -146,15 +146,6 @@ typedef void (*hb_paint_pop_transform_func_t) (hb_paint_funcs_t *funcs, * * A virtual method for the #hb_paint_funcs_t to render a color glyph by glyph index. * - * XXX - * - * The coordinates of the glyph outline are interpreted according - * to the current transform. - * - * This clip is applied in addition to the current clip, - * and remains in effect until a matching call to - * the #hb_paint_funcs_pop_clip_func_t vfunc. - * * Return value: %true if the glyph was painted, %false otherwise. * * XSince: REPLACEME -- cgit v1.2.3 From 7d7541e35d5701953e5e768ac1ef41b23223edb1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 14 Aug 2023 17:55:09 -0600 Subject: [test-paint] Print paint-color-glyph --- test/api/results/bad-154 | 34 +++++++++++++++++++++++++++++++++- test/api/results/test-154 | 4 +++- test/api/results/testvf-154 | 4 +++- test/api/test-paint.c | 15 +++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/test/api/results/bad-154 b/test/api/results/bad-154 index ce8e4ff69..8fbf7f424 100644 --- a/test/api/results/bad-154 +++ b/test/api/results/bad-154 @@ -1,103 +1,135 @@ -# random seed: R02S0cee2d366e5dbd296a38859c4a84c045 +# random seed: R02S8a247191e9c73c84f166b360a40567c1 # Start of hb tests # Start of paint tests # Start of ot tests start clip rectangle 0 500 500 1e+03 start transform 1 0 0 1 0 0 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 start transform 1 0 -0 1 0 0 + paint color glyph 154; acting as failed end transform start clip rectangle 0 500 500 1e+03 end clip diff --git a/test/api/results/test-154 b/test/api/results/test-154 index 1a86fe3f2..f108da8d7 100644 --- a/test/api/results/test-154 +++ b/test/api/results/test-154 @@ -1,13 +1,15 @@ -# random seed: R02S33c307340a09918aefe09266feb15798 +# random seed: R02S46170a7a8abc3ad07d2b70fd08efc176 # Start of hb tests # Start of paint tests # Start of ot tests start clip rectangle 0 500 500 1e+03 start transform 1 0 0 1 0 0 start transform 1 0 -0 1 0 0 + paint color glyph 164; acting as failed end transform start clip rectangle 100 100 900 900 start transform 1 0 -0 1 0 0 + paint color glyph 93; acting as failed end transform start clip rectangle 0 0 1e+03 1e+03 start transform 1 0 -0 1 0 0 diff --git a/test/api/results/testvf-154 b/test/api/results/testvf-154 index f497751cf..cd6e9b9b9 100644 --- a/test/api/results/testvf-154 +++ b/test/api/results/testvf-154 @@ -1,13 +1,15 @@ -# random seed: R02S08067256908fbfc782c2c2c09d648be6 +# random seed: R02Sd6c6e6b574cffce42448b4c7ec9ed3b1 # Start of hb tests # Start of paint tests # Start of ot tests start clip rectangle 0 500 500 1e+03 start transform 1 0 0 1 0 0 start transform 1 0 -0 1 0 0 + paint color glyph 164; acting as failed end transform start clip rectangle 100 100 900 900 start transform 1 0 -0 1 0 0 + paint color glyph 93; acting as failed end transform start clip rectangle 0 0 1e+03 1e+03 start transform 1 0 -0 1 0 0 diff --git a/test/api/test-paint.c b/test/api/test-paint.c index e1044edd1..810b7aced 100644 --- a/test/api/test-paint.c +++ b/test/api/test-paint.c @@ -97,6 +97,20 @@ pop_transform (hb_paint_funcs_t *funcs, print (data, "end transform"); } +static hb_bool_t +paint_color_glyph (hb_paint_funcs_t *funcs, + void *paint_data, + hb_codepoint_t glyph, + hb_font_t *font, + void *user_data) +{ + paint_data_t *data = paint_data; + + print (data, "paint color glyph %u; acting as failed", glyph); + + return FALSE; +} + static void push_clip_glyph (hb_paint_funcs_t *funcs, void *paint_data, @@ -286,6 +300,7 @@ get_test_paint_funcs (void) hb_paint_funcs_set_push_transform_func (funcs, push_transform, NULL, NULL); hb_paint_funcs_set_pop_transform_func (funcs, pop_transform, NULL, NULL); + hb_paint_funcs_set_color_glyph_func (funcs, paint_color_glyph, NULL, NULL); hb_paint_funcs_set_push_clip_glyph_func (funcs, push_clip_glyph, NULL, NULL); hb_paint_funcs_set_push_clip_rectangle_func (funcs, push_clip_rectangle, NULL, NULL); hb_paint_funcs_set_pop_clip_func (funcs, pop_clip, NULL, NULL); -- cgit v1.2.3 From 21a894f055bbff6afb45cbcceed89ac92091bb3e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 15 Aug 2023 10:21:26 -0600 Subject: [cairo] Protect against infinite loops Fixes https://github.com/harfbuzz/harfbuzz/issues/4375 Maybe we should do this in hb-ft and COLR instead? --- src/hb-cairo-utils.hh | 3 +++ src/hb-cairo.cc | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/hb-cairo-utils.hh b/src/hb-cairo-utils.hh index a26bf59d9..54355632b 100644 --- a/src/hb-cairo-utils.hh +++ b/src/hb-cairo-utils.hh @@ -30,11 +30,14 @@ #include "hb.hh" #include "hb-cairo.h" +#include "hb-set.hh" + typedef struct { cairo_scaled_font_t *scaled_font; cairo_t *cr; + hb_set_t current_glyphs; hb_map_t *color_cache; } hb_cairo_context_t; diff --git a/src/hb-cairo.cc b/src/hb-cairo.cc index f4f9f54ab..29461be80 100644 --- a/src/hb-cairo.cc +++ b/src/hb-cairo.cc @@ -176,6 +176,11 @@ hb_cairo_paint_color_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, hb_cairo_context_t *c = (hb_cairo_context_t *) paint_data; cairo_t *cr = c->cr; + if (unlikely (c->current_glyphs.has (glyph))) + return true; + + c->current_glyphs.add (glyph); + cairo_save (cr); hb_position_t x_scale, y_scale; @@ -189,6 +194,8 @@ hb_cairo_paint_color_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, cairo_restore (cr); + c->current_glyphs.del (glyph); + return true; } @@ -634,6 +641,7 @@ hb_cairo_render_color_glyph (cairo_scaled_font_t *scaled_font, c.scaled_font = scaled_font; c.cr = cr; c.color_cache = (hb_map_t *) cairo_scaled_font_get_user_data (scaled_font, &color_cache_key); + c.current_glyphs.add (glyph); hb_font_paint_glyph (font, glyph, hb_cairo_paint_get_funcs (), &c, palette, color); -- cgit v1.2.3 From 0c80aec10b38c8880b0f353b4774b8843a4b4126 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 15 Aug 2023 10:30:38 -0600 Subject: [COLR] Move cycle-detection to the renderer instead of cairo Alternative fix for https://github.com/harfbuzz/harfbuzz/issues/4375 --- src/OT/Color/COLR/COLR.hh | 10 ++ src/hb-cairo-utils.hh | 3 - src/hb-cairo.cc | 8 - src/hb-ft-colr.hh | 17 +- test/api/results/bad-154 | 440 +--------------------------------------------- 5 files changed, 26 insertions(+), 452 deletions(-) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index 6e46fa31e..955166bb3 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -69,6 +69,7 @@ public: unsigned int palette_index; hb_color_t foreground; VarStoreInstancer &instancer; + hb_set_t current_glyphs; int depth_left = HB_MAX_NESTING_LEVEL; int edge_count = HB_COLRV1_MAX_EDGE_COUNT; @@ -2307,6 +2308,7 @@ struct COLR &(this+varIdxMap), hb_array (font->coords, font->num_coords)); hb_paint_context_t c (this, funcs, data, font, palette_index, foreground, instancer); + c.current_glyphs.add (glyph); if (version == 1) { @@ -2437,10 +2439,16 @@ void PaintColrGlyph::paint_glyph (hb_paint_context_t *c) const { TRACE_PAINT (this); + if (unlikely (c->current_glyphs.has (gid))) + return; + + c->current_glyphs.add (gid); + c->funcs->push_inverse_root_transform (c->data, c->font); if (c->funcs->color_glyph (c->data, gid, c->font)) { c->funcs->pop_transform (c->data); + c->current_glyphs.del (gid); return; } c->funcs->pop_transform (c->data); @@ -2463,6 +2471,8 @@ void PaintColrGlyph::paint_glyph (hb_paint_context_t *c) const if (has_clip_box) c->funcs->pop_clip (c->data); + + c->current_glyphs.del (gid); } } /* namespace OT */ diff --git a/src/hb-cairo-utils.hh b/src/hb-cairo-utils.hh index 54355632b..a26bf59d9 100644 --- a/src/hb-cairo-utils.hh +++ b/src/hb-cairo-utils.hh @@ -30,14 +30,11 @@ #include "hb.hh" #include "hb-cairo.h" -#include "hb-set.hh" - typedef struct { cairo_scaled_font_t *scaled_font; cairo_t *cr; - hb_set_t current_glyphs; hb_map_t *color_cache; } hb_cairo_context_t; diff --git a/src/hb-cairo.cc b/src/hb-cairo.cc index 29461be80..f4f9f54ab 100644 --- a/src/hb-cairo.cc +++ b/src/hb-cairo.cc @@ -176,11 +176,6 @@ hb_cairo_paint_color_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, hb_cairo_context_t *c = (hb_cairo_context_t *) paint_data; cairo_t *cr = c->cr; - if (unlikely (c->current_glyphs.has (glyph))) - return true; - - c->current_glyphs.add (glyph); - cairo_save (cr); hb_position_t x_scale, y_scale; @@ -194,8 +189,6 @@ hb_cairo_paint_color_glyph (hb_paint_funcs_t *pfuncs HB_UNUSED, cairo_restore (cr); - c->current_glyphs.del (glyph); - return true; } @@ -641,7 +634,6 @@ hb_cairo_render_color_glyph (cairo_scaled_font_t *scaled_font, c.scaled_font = scaled_font; c.cr = cr; c.color_cache = (hb_map_t *) cairo_scaled_font_get_user_data (scaled_font, &color_cache_key); - c.current_glyphs.add (glyph); hb_font_paint_glyph (font, glyph, hb_cairo_paint_get_funcs (), &c, palette, color); diff --git a/src/hb-ft-colr.hh b/src/hb-ft-colr.hh index a78028221..7992c8805 100644 --- a/src/hb-ft-colr.hh +++ b/src/hb-ft-colr.hh @@ -105,6 +105,7 @@ struct hb_ft_paint_context_t FT_Color *palette; unsigned palette_index; hb_color_t foreground; + hb_set_t current_glyphs; int depth_left = HB_MAX_NESTING_LEVEL; int edge_count = HB_COLRV1_MAX_EDGE_COUNT; }; @@ -320,19 +321,27 @@ _hb_ft_paint (hb_ft_paint_context_t *c, break; case FT_COLR_PAINTFORMAT_COLR_GLYPH: { + hb_codepoint_t gid = paint.u.colr_glyph.glyphID; + + if (unlikely (c->current_glyphs.has (gid))) + return; + + c->current_glyphs.add (gid); + c->funcs->push_inverse_root_transform (c->data, c->font); c->ft_font->lock.unlock (); - if (c->funcs->color_glyph (c->data, paint.u.colr_glyph.glyphID, c->font)) + if (c->funcs->color_glyph (c->data, gid, c->font)) { c->ft_font->lock.lock (); c->funcs->pop_transform (c->data); + c->current_glyphs.del (gid); return; } c->ft_font->lock.lock (); c->funcs->pop_transform (c->data); FT_OpaquePaint other_paint = {0}; - if (FT_Get_Color_Glyph_Paint (ft_face, paint.u.colr_glyph.glyphID, + if (FT_Get_Color_Glyph_Paint (ft_face, gid, FT_COLOR_NO_ROOT_TRANSFORM, &other_paint)) { @@ -361,6 +370,8 @@ _hb_ft_paint (hb_ft_paint_context_t *c, if (has_clip_box) c->funcs->pop_clip (c->data); + + c->current_glyphs.del (gid); } } break; @@ -485,6 +496,7 @@ hb_ft_paint_glyph_colr (hb_font_t *font, hb_ft_paint_context_t c (ft_font, font, paint_funcs, paint_data, palette, palette_index, foreground); + c.current_glyphs.add (gid); bool is_bounded = true; FT_ClipBox clip_box; @@ -508,6 +520,7 @@ hb_ft_paint_glyph_colr (hb_font_t *font, hb_ft_paint_context_t ce (ft_font, font, extents_funcs, &extents_data, palette, palette_index, foreground); + ce.current_glyphs.add (gid); ce.funcs->push_root_transform (ce.data, font); ce.recurse (paint); ce.funcs->pop_transform (ce.data); diff --git a/test/api/results/bad-154 b/test/api/results/bad-154 index 8fbf7f424..5f88e0309 100644 --- a/test/api/results/bad-154 +++ b/test/api/results/bad-154 @@ -1,447 +1,9 @@ -# random seed: R02S8a247191e9c73c84f166b360a40567c1 +# random seed: R02S13f44c97ec7b03f792b3b9650a81b62a # Start of hb tests # Start of paint tests # Start of ot tests start clip rectangle 0 500 500 1e+03 start transform 1 0 0 1 0 0 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - start transform 1 0 -0 1 0 0 - paint color glyph 154; acting as failed - end transform - start clip rectangle 0 500 500 1e+03 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip - push group - start transform 1 0 -0 1 0 0 - start clip glyph 159 - start transform 1 0 0 1 0 0 - solid 128 128 128 102 - end transform - end clip - end transform - pop group mode 3 - end clip push group start transform 1 0 -0 1 0 0 start clip glyph 159 -- cgit v1.2.3 From 8f039ab4d624c545dd472e477c705c3f013f66c6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 15 Aug 2023 11:27:19 -0600 Subject: [COLR] Avoid infinite-loop through PaintColrLayers Fixes https://github.com/harfbuzz/harfbuzz/issues/4376 Fixes https://oss-fuzz.com/testcase-detail/5717524023738368 --- src/OT/Color/COLR/COLR.hh | 8 ++++++++ src/hb-ft-colr.hh | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index 955166bb3..3618a02a9 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -70,6 +70,7 @@ public: hb_color_t foreground; VarStoreInstancer &instancer; hb_set_t current_glyphs; + hb_set_t current_layers; int depth_left = HB_MAX_NESTING_LEVEL; int edge_count = HB_COLRV1_MAX_EDGE_COUNT; @@ -2428,10 +2429,17 @@ void PaintColrLayers::paint_glyph (hb_paint_context_t *c) const const LayerList &paint_offset_lists = c->get_colr_table ()->get_layerList (); for (unsigned i = firstLayerIndex; i < firstLayerIndex + numLayers; i++) { + if (unlikely (c->current_layers.has (i))) + continue; + + c->current_layers.add (i); + const Paint &paint = paint_offset_lists.get_paint (i); c->funcs->push_group (c->data); c->recurse (paint); c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER); + + c->current_layers.del (i); } } diff --git a/src/hb-ft-colr.hh b/src/hb-ft-colr.hh index 7992c8805..26903164a 100644 --- a/src/hb-ft-colr.hh +++ b/src/hb-ft-colr.hh @@ -106,6 +106,7 @@ struct hb_ft_paint_context_t unsigned palette_index; hb_color_t foreground; hb_set_t current_glyphs; + hb_set_t current_layers; int depth_left = HB_MAX_NESTING_LEVEL; int edge_count = HB_COLRV1_MAX_EDGE_COUNT; }; @@ -221,9 +222,18 @@ _hb_ft_paint (hb_ft_paint_context_t *c, &paint.u.colr_layers.layer_iterator, &other_paint)) { + unsigned i = paint.u.colr_layers.layer_iterator.layer; + + if (unlikely (c->current_layers.has (i))) + continue; + + c->current_layers.add (i); + c->funcs->push_group (c->data); c->recurse (other_paint); c->funcs->pop_group (c->data, HB_PAINT_COMPOSITE_MODE_SRC_OVER); + + c->current_layers.del (i); } } break; -- cgit v1.2.3 From b530e485cdcd466cdfd7f80fd341a67883fb8c71 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 15 Aug 2023 14:31:40 -0600 Subject: [glyf] Don't recuse into alread-active composite glyphs Deny loops. --- src/OT/glyf/Glyph.hh | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/OT/glyf/Glyph.hh b/src/OT/glyf/Glyph.hh index 2611c1e21..9117fe82a 100644 --- a/src/OT/glyf/Glyph.hh +++ b/src/OT/glyf/Glyph.hh @@ -293,6 +293,7 @@ struct Glyph bool use_my_metrics = true, bool phantom_only = false, hb_array_t coords = hb_array_t (), + hb_set_t *current_glyphs = nullptr, unsigned int depth = 0, unsigned *edge_count = nullptr) const { @@ -302,6 +303,10 @@ struct Glyph if (unlikely (*edge_count > HB_GLYF_MAX_EDGE_COUNT)) return false; (*edge_count)++; + hb_set_t current_glyphs_stack; + if (current_glyphs == nullptr) + current_glyphs = ¤t_glyphs_stack; + if (head_maxp_info) { head_maxp_info->maxComponentDepth = hb_max (head_maxp_info->maxComponentDepth, depth); @@ -396,10 +401,17 @@ struct Glyph unsigned int comp_index = 0; for (auto &item : get_composite_iterator ()) { + hb_codepoint_t item_gid = item.get_gid (); + + if (unlikely (current_glyphs->has (item_gid))) + continue; + + current_glyphs->add (item_gid); + unsigned old_count = all_points.length; if (unlikely ((!phantom_only || (use_my_metrics && item.is_use_my_metrics ())) && - !glyf_accelerator.glyph_for_gid (item.get_gid ()) + !glyf_accelerator.glyph_for_gid (item_gid) .get_points (font, glyf_accelerator, all_points, @@ -410,9 +422,13 @@ struct Glyph use_my_metrics, phantom_only, coords, + current_glyphs, depth + 1, edge_count))) + { + current_glyphs->del (item_gid); return false; + } auto comp_points = all_points.as_array ().sub_array (old_count); @@ -448,9 +464,13 @@ struct Glyph all_points.resize (all_points.length - PHANTOM_COUNT); if (all_points.length > HB_GLYF_MAX_POINTS) + { + current_glyphs->del (item_gid); return false; + } comp_index++; + current_glyphs->del (item_gid); } if (head_maxp_info && depth == 0) @@ -468,6 +488,13 @@ struct Glyph hb_array_t points_left = points.as_array (); for (auto &item : get_var_composite_iterator ()) { + hb_codepoint_t item_gid = item.get_gid (); + + if (unlikely (current_glyphs->has (item_gid))) + continue; + + current_glyphs->add (item_gid); + unsigned item_num_points = item.get_num_points (); hb_array_t record_points = points_left.sub_array (0, item_num_points); assert (record_points.length == item_num_points); @@ -485,7 +512,7 @@ struct Glyph unsigned old_count = all_points.length; if (unlikely ((!phantom_only || (use_my_metrics && item.is_use_my_metrics ())) && - !glyf_accelerator.glyph_for_gid (item.get_gid ()) + !glyf_accelerator.glyph_for_gid (item_gid) .get_points (font, glyf_accelerator, all_points, @@ -496,9 +523,13 @@ struct Glyph use_my_metrics, phantom_only, coord_setter.get_coords (), + current_glyphs, depth + 1, edge_count))) + { + current_glyphs->del (item_gid); return false; + } auto comp_points = all_points.as_array ().sub_array (old_count); @@ -514,9 +545,14 @@ struct Glyph all_points.resize (all_points.length - PHANTOM_COUNT); if (all_points.length > HB_GLYF_MAX_POINTS) + { + current_glyphs->del (item_gid); return false; + } points_left += item_num_points; + + current_glyphs->del (item_gid); } all_points.extend (phantoms); } break; -- cgit v1.2.3 From 06ff3bcb8db2ac9eac80bef21644c4d70f60573a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 15 Aug 2023 14:41:18 -0600 Subject: [COLR,glyf] Use map instead of set for tracking current glyphs / layers --- src/OT/Color/COLR/COLR.hh | 4 ++-- src/OT/glyf/Glyph.hh | 4 ++-- src/hb-ft-colr.hh | 4 ++-- src/hb-map.hh | 5 +++++ 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index 3618a02a9..012c38146 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -69,8 +69,8 @@ public: unsigned int palette_index; hb_color_t foreground; VarStoreInstancer &instancer; - hb_set_t current_glyphs; - hb_set_t current_layers; + hb_map_t current_glyphs; + hb_map_t current_layers; int depth_left = HB_MAX_NESTING_LEVEL; int edge_count = HB_COLRV1_MAX_EDGE_COUNT; diff --git a/src/OT/glyf/Glyph.hh b/src/OT/glyf/Glyph.hh index 9117fe82a..1aed3ae47 100644 --- a/src/OT/glyf/Glyph.hh +++ b/src/OT/glyf/Glyph.hh @@ -293,7 +293,7 @@ struct Glyph bool use_my_metrics = true, bool phantom_only = false, hb_array_t coords = hb_array_t (), - hb_set_t *current_glyphs = nullptr, + hb_map_t *current_glyphs = nullptr, unsigned int depth = 0, unsigned *edge_count = nullptr) const { @@ -303,7 +303,7 @@ struct Glyph if (unlikely (*edge_count > HB_GLYF_MAX_EDGE_COUNT)) return false; (*edge_count)++; - hb_set_t current_glyphs_stack; + hb_map_t current_glyphs_stack; if (current_glyphs == nullptr) current_glyphs = ¤t_glyphs_stack; diff --git a/src/hb-ft-colr.hh b/src/hb-ft-colr.hh index 26903164a..1afbbbb18 100644 --- a/src/hb-ft-colr.hh +++ b/src/hb-ft-colr.hh @@ -105,8 +105,8 @@ struct hb_ft_paint_context_t FT_Color *palette; unsigned palette_index; hb_color_t foreground; - hb_set_t current_glyphs; - hb_set_t current_layers; + hb_map_t current_glyphs; + hb_map_t current_layers; int depth_left = HB_MAX_NESTING_LEVEL; int edge_count = HB_COLRV1_MAX_EDGE_COUNT; }; diff --git a/src/hb-map.hh b/src/hb-map.hh index 42604ef7c..6ea416658 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -276,6 +276,11 @@ struct hb_hashmap_t uint32_t hash = hb_hash (key); return set_with_hash (std::move (key), hash, std::forward (value), overwrite); } + bool add (const K &key) + { + uint32_t hash = hb_hash (key); + return set_with_hash (key, hash, item_t::default_value ()); + } const V& get_with_hash (const K &key, uint32_t hash) const { -- cgit v1.2.3 From bea26446d2063cadb0cd83c1c627d3eed95cbcf6 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 15 Aug 2023 14:20:54 -0700 Subject: [instancer] reference all points for gvar If a point is not referenced and delta is not inferred, set delta to 0 --- src/hb-ot-var-common.hh | 16 ++++++++++++++-- ...tain-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 7452 -> 7292 bytes ...ions.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 6780 -> 6760 bytes 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 0a92e00df..d35b10cd1 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -993,8 +993,20 @@ struct tuple_delta_t start_point = end_point + 1; } - for (unsigned i : inferred_idxes) - indices[i] = true; + for (unsigned i = 0; i < point_count; i++) + { + /* if points are not referenced and deltas are not inferred, set to 0. + * reference all points for gvar */ + if ( !indices[i]) + { + if (!inferred_idxes.has (i)) + { + deltas_x.arrayZ[i] = 0.f; + deltas_y.arrayZ[i] = 0.f; + } + indices[i] = true; + } + } return true; } diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf index 503c75583..2e5565305 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf index 74343354d..fc890fb96 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ -- cgit v1.2.3 From e714e7d4f3d3bd1a49c460f6c3bd2c3f09192722 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 16 Aug 2023 09:54:08 -0700 Subject: [hb-view] Work around old cairo Fixes https://github.com/harfbuzz/harfbuzz/issues/4378 --- util/view-cairo.hh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/view-cairo.hh b/util/view-cairo.hh index d737b85dd..b44b77b44 100644 --- a/util/view-cairo.hh +++ b/util/view-cairo.hh @@ -202,6 +202,8 @@ view_cairo_t::render (const font_options_t *font_opts) cairo_restore (cr); } + // https://github.com/harfbuzz/harfbuzz/issues/4378 +#if CAIRO_VERSION >= 11700 if (l.num_clusters) cairo_show_text_glyphs (cr, l.utf8, l.utf8_len, @@ -209,6 +211,7 @@ view_cairo_t::render (const font_options_t *font_opts) l.clusters, l.num_clusters, l.cluster_flags); else +#endif cairo_show_glyphs (cr, l.glyphs, l.num_glyphs); } -- cgit v1.2.3 From c7f2d440f463be31ae24cbae7ceb6ea72a15e990 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 16 Aug 2023 09:55:23 -0700 Subject: [hb-view] Better cairo version check --- util/view-cairo.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/view-cairo.hh b/util/view-cairo.hh index b44b77b44..c96003c1f 100644 --- a/util/view-cairo.hh +++ b/util/view-cairo.hh @@ -203,7 +203,7 @@ view_cairo_t::render (const font_options_t *font_opts) } // https://github.com/harfbuzz/harfbuzz/issues/4378 -#if CAIRO_VERSION >= 11700 +#if CAIRO_VERSION >= 11705 if (l.num_clusters) cairo_show_text_glyphs (cr, l.utf8, l.utf8_len, -- cgit v1.2.3 From ca906e8747ac45ccf235c3f3e9ee9b69a693d7e4 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 16 Aug 2023 23:37:03 +0000 Subject: [repacker] fix fuzzer timeout. Corrects some mistakes in the handling of incoming_edges_ when memory allocation failures happen. --- src/graph/graph.hh | 11 +++++++++-- ...stcase-minimized-hb-repacker-fuzzer-6697168080338944 | Bin 0 -> 68766 bytes 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6697168080338944 diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 068095819..f81bed81e 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -290,7 +290,7 @@ struct graph_t new_parents.set (id_map[_.first], _.second); } - if (new_parents.in_error ()) + if (parents.in_error() || new_parents.in_error ()) return false; parents = std::move (new_parents); @@ -310,8 +310,15 @@ struct graph_t if (parents.has (old_index, &pv)) { unsigned v = *pv; - parents.set (new_index, v); + if (!parents.set (new_index, v)) + incoming_edges_ -= v; parents.del (old_index); + + if (incoming_edges_ == 1) + { + single_parent = *parents.keys (); + parents.reset (); + } } } diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6697168080338944 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6697168080338944 new file mode 100644 index 000000000..1859841d5 Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6697168080338944 differ -- cgit v1.2.3 From 6c7aed1000c52a7236f2368aae2bbedab6b133ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:52:43 +0000 Subject: Bump fonttools from 4.42.0 to 4.42.1 in /.ci Bumps [fonttools](https://github.com/fonttools/fonttools) from 4.42.0 to 4.42.1. - [Release notes](https://github.com/fonttools/fonttools/releases) - [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst) - [Commits](https://github.com/fonttools/fonttools/compare/4.42.0...4.42.1) --- updated-dependencies: - dependency-name: fonttools dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .ci/requirements-fonttools.txt | 70 +++++++++++++++++++++--------------------- .ci/requirements.txt | 70 +++++++++++++++++++++--------------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/.ci/requirements-fonttools.txt b/.ci/requirements-fonttools.txt index f2db967f4..754a2c844 100644 --- a/.ci/requirements-fonttools.txt +++ b/.ci/requirements-fonttools.txt @@ -4,39 +4,39 @@ # # pip-compile --generate-hashes .ci/requirements-fonttools.in # -fonttools==4.42.0 \ - --hash=sha256:01cfe02416b6d416c5c8d15e30315cbcd3e97d1b50d3b34b0ce59f742ef55258 \ - --hash=sha256:0a1466713e54bdbf5521f2f73eebfe727a528905ff5ec63cda40961b4b1eea95 \ - --hash=sha256:0df8ef75ba5791e873c9eac2262196497525e3f07699a2576d3ab9ddf41cb619 \ - --hash=sha256:10dac980f2b975ef74532e2a94bb00e97a95b4595fb7f98db493c474d5f54d0e \ - --hash=sha256:150122ed93127a26bc3670ebab7e2add1e0983d30927733aec327ebf4255b072 \ - --hash=sha256:1f81ed9065b4bd3f4f3ce8e4873cd6a6b3f4e92b1eddefde35d332c6f414acc3 \ - --hash=sha256:27ec3246a088555629f9f0902f7412220c67340553ca91eb540cf247aacb1983 \ - --hash=sha256:2d6dc3fa91414ff4daa195c05f946e6a575bd214821e26d17ca50f74b35b0fe4 \ - --hash=sha256:329341ba3d86a36e482610db56b30705384cb23bd595eac8cbb045f627778e9d \ - --hash=sha256:3fb2a69870bfe143ec20b039a1c8009e149dd7780dd89554cc8a11f79e5de86b \ - --hash=sha256:4655c480a1a4d706152ff54f20e20cf7609084016f1df3851cce67cef768f40a \ - --hash=sha256:48e82d776d2e93f88ca56567509d102266e7ab2fb707a0326f032fe657335238 \ - --hash=sha256:57b68eab183fafac7cd7d464a7bfa0fcd4edf6c67837d14fb09c1c20516cf20b \ - --hash=sha256:58c1165f9b2662645de9b19a8c8bdd636b36294ccc07e1b0163856b74f10bafc \ - --hash=sha256:614b1283dca88effd20ee48160518e6de275ce9b5456a3134d5f235523fc5065 \ - --hash=sha256:685a4dd6cf31593b50d6d441feb7781a4a7ef61e19551463e14ed7c527b86f9f \ - --hash=sha256:6bd7e4777bff1dcb7c4eff4786998422770f3bfbef8be401c5332895517ba3fa \ - --hash=sha256:703101eb0490fae32baf385385d47787b73d9ea55253df43b487c89ec767e0d7 \ - --hash=sha256:83b98be5d291e08501bd4fc0c4e0f8e6e05b99f3924068b17c5c9972af6fff84 \ - --hash=sha256:8ece1886d12bb36c48c00b2031518877f41abae317e3a55620d38e307d799b7e \ - --hash=sha256:9c456d1f23deff64ffc8b5b098718e149279abdea4d8692dba69172fb6a0d597 \ - --hash=sha256:9cd2363ea7728496827658682d049ffb2e98525e2247ca64554864a8cc945568 \ - --hash=sha256:a9b55d2a3b360e0c7fc5bd8badf1503ca1c11dd3a1cd20f2c26787ffa145a9c7 \ - --hash=sha256:ae7df0ae9ee2f3f7676b0ff6f4ebe48ad0acaeeeaa0b6839d15dbf0709f2c5ef \ - --hash=sha256:ae881e484702efdb6cf756462622de81d4414c454edfd950b137e9a7352b3cb9 \ - --hash=sha256:b8600ae7dce6ec3ddfb201abb98c9d53abbf8064d7ac0c8a0d8925e722ccf2a0 \ - --hash=sha256:c36c904ce0322df01e590ba814d5d69e084e985d7e4c2869378671d79662a7d4 \ - --hash=sha256:c8bf88f9e3ce347c716921804ef3a8330cb128284eb6c0b6c4b3574f3c580023 \ - --hash=sha256:d40673b2e927f7cd0819c6f04489dfbeb337b4a7b10fc633c89bf4f34ecb9620 \ - --hash=sha256:d54e600a2bcfa5cdaa860237765c01804a03b08404d6affcd92942fa7315ffba \ - --hash=sha256:dfe7fa7e607f7e8b58d0c32501a3a7cac148538300626d1b930082c90ae7f6bd \ - --hash=sha256:e35bed436726194c5e6e094fdfb423fb7afaa0211199f9d245e59e11118c576c \ - --hash=sha256:f0290ea7f9945174bd4dfd66e96149037441eb2008f3649094f056201d99e293 \ - --hash=sha256:fae4e801b774cc62cecf4a57b1eae4097903fced00c608d9e2bc8f84cd87b54a +fonttools==4.42.1 \ + --hash=sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64 \ + --hash=sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341 \ + --hash=sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca \ + --hash=sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a \ + --hash=sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e \ + --hash=sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35 \ + --hash=sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff \ + --hash=sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360 \ + --hash=sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d \ + --hash=sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967 \ + --hash=sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136 \ + --hash=sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40 \ + --hash=sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec \ + --hash=sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b \ + --hash=sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5 \ + --hash=sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd \ + --hash=sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861 \ + --hash=sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b \ + --hash=sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf \ + --hash=sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d \ + --hash=sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853 \ + --hash=sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71 \ + --hash=sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8 \ + --hash=sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd \ + --hash=sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249 \ + --hash=sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d \ + --hash=sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4 \ + --hash=sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760 \ + --hash=sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868 \ + --hash=sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa \ + --hash=sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c \ + --hash=sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c \ + --hash=sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0 \ + --hash=sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b # via -r requirements-fonttools.in diff --git a/.ci/requirements.txt b/.ci/requirements.txt index 95b3646ca..173508e25 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -4,41 +4,41 @@ # # pip-compile --generate-hashes .ci/requirements.in # -fonttools==4.42.0 \ - --hash=sha256:01cfe02416b6d416c5c8d15e30315cbcd3e97d1b50d3b34b0ce59f742ef55258 \ - --hash=sha256:0a1466713e54bdbf5521f2f73eebfe727a528905ff5ec63cda40961b4b1eea95 \ - --hash=sha256:0df8ef75ba5791e873c9eac2262196497525e3f07699a2576d3ab9ddf41cb619 \ - --hash=sha256:10dac980f2b975ef74532e2a94bb00e97a95b4595fb7f98db493c474d5f54d0e \ - --hash=sha256:150122ed93127a26bc3670ebab7e2add1e0983d30927733aec327ebf4255b072 \ - --hash=sha256:1f81ed9065b4bd3f4f3ce8e4873cd6a6b3f4e92b1eddefde35d332c6f414acc3 \ - --hash=sha256:27ec3246a088555629f9f0902f7412220c67340553ca91eb540cf247aacb1983 \ - --hash=sha256:2d6dc3fa91414ff4daa195c05f946e6a575bd214821e26d17ca50f74b35b0fe4 \ - --hash=sha256:329341ba3d86a36e482610db56b30705384cb23bd595eac8cbb045f627778e9d \ - --hash=sha256:3fb2a69870bfe143ec20b039a1c8009e149dd7780dd89554cc8a11f79e5de86b \ - --hash=sha256:4655c480a1a4d706152ff54f20e20cf7609084016f1df3851cce67cef768f40a \ - --hash=sha256:48e82d776d2e93f88ca56567509d102266e7ab2fb707a0326f032fe657335238 \ - --hash=sha256:57b68eab183fafac7cd7d464a7bfa0fcd4edf6c67837d14fb09c1c20516cf20b \ - --hash=sha256:58c1165f9b2662645de9b19a8c8bdd636b36294ccc07e1b0163856b74f10bafc \ - --hash=sha256:614b1283dca88effd20ee48160518e6de275ce9b5456a3134d5f235523fc5065 \ - --hash=sha256:685a4dd6cf31593b50d6d441feb7781a4a7ef61e19551463e14ed7c527b86f9f \ - --hash=sha256:6bd7e4777bff1dcb7c4eff4786998422770f3bfbef8be401c5332895517ba3fa \ - --hash=sha256:703101eb0490fae32baf385385d47787b73d9ea55253df43b487c89ec767e0d7 \ - --hash=sha256:83b98be5d291e08501bd4fc0c4e0f8e6e05b99f3924068b17c5c9972af6fff84 \ - --hash=sha256:8ece1886d12bb36c48c00b2031518877f41abae317e3a55620d38e307d799b7e \ - --hash=sha256:9c456d1f23deff64ffc8b5b098718e149279abdea4d8692dba69172fb6a0d597 \ - --hash=sha256:9cd2363ea7728496827658682d049ffb2e98525e2247ca64554864a8cc945568 \ - --hash=sha256:a9b55d2a3b360e0c7fc5bd8badf1503ca1c11dd3a1cd20f2c26787ffa145a9c7 \ - --hash=sha256:ae7df0ae9ee2f3f7676b0ff6f4ebe48ad0acaeeeaa0b6839d15dbf0709f2c5ef \ - --hash=sha256:ae881e484702efdb6cf756462622de81d4414c454edfd950b137e9a7352b3cb9 \ - --hash=sha256:b8600ae7dce6ec3ddfb201abb98c9d53abbf8064d7ac0c8a0d8925e722ccf2a0 \ - --hash=sha256:c36c904ce0322df01e590ba814d5d69e084e985d7e4c2869378671d79662a7d4 \ - --hash=sha256:c8bf88f9e3ce347c716921804ef3a8330cb128284eb6c0b6c4b3574f3c580023 \ - --hash=sha256:d40673b2e927f7cd0819c6f04489dfbeb337b4a7b10fc633c89bf4f34ecb9620 \ - --hash=sha256:d54e600a2bcfa5cdaa860237765c01804a03b08404d6affcd92942fa7315ffba \ - --hash=sha256:dfe7fa7e607f7e8b58d0c32501a3a7cac148538300626d1b930082c90ae7f6bd \ - --hash=sha256:e35bed436726194c5e6e094fdfb423fb7afaa0211199f9d245e59e11118c576c \ - --hash=sha256:f0290ea7f9945174bd4dfd66e96149037441eb2008f3649094f056201d99e293 \ - --hash=sha256:fae4e801b774cc62cecf4a57b1eae4097903fced00c608d9e2bc8f84cd87b54a +fonttools==4.42.1 \ + --hash=sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64 \ + --hash=sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341 \ + --hash=sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca \ + --hash=sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a \ + --hash=sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e \ + --hash=sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35 \ + --hash=sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff \ + --hash=sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360 \ + --hash=sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d \ + --hash=sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967 \ + --hash=sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136 \ + --hash=sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40 \ + --hash=sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec \ + --hash=sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b \ + --hash=sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5 \ + --hash=sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd \ + --hash=sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861 \ + --hash=sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b \ + --hash=sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf \ + --hash=sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d \ + --hash=sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853 \ + --hash=sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71 \ + --hash=sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8 \ + --hash=sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd \ + --hash=sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249 \ + --hash=sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d \ + --hash=sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4 \ + --hash=sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760 \ + --hash=sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868 \ + --hash=sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa \ + --hash=sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c \ + --hash=sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c \ + --hash=sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0 \ + --hash=sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b # via -r requirements-fonttools.in gcovr==5.0 \ --hash=sha256:1d80264cbaadff356b3dda71b8c62b3aa803e5b3eb6d526a24932cd6660a2576 \ -- cgit v1.2.3 From 970d2c438f849700b879d76e8c183c2edfbaccdb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:10:17 +0000 Subject: Bump github/codeql-action from 2.21.3 to 2.21.4 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.21.3 to 2.21.4. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/5b6282e01c62d02e720b81eb8a51204f527c3624...a09933a12a80f87b87005513f0abb1494c27a716) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index d6b5ce1cf..3f25667e1 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@5b6282e01c62d02e720b81eb8a51204f527c3624 # v2.21.3 + uses: github/codeql-action/upload-sarif@a09933a12a80f87b87005513f0abb1494c27a716 # v2.21.4 with: sarif_file: results.sarif -- cgit v1.2.3 From dd8d35766bb31ef43848180c419c621be302ac5d Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 22 Aug 2023 12:54:50 -0700 Subject: [instancer] enable partial instancing tests when experimental api is on --- src/hb-ot-var-common.hh | 2 +- test/subset/meson.build | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index d35b10cd1..1d8be0568 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -937,7 +937,7 @@ struct tuple_delta_t if (orig_points.arrayZ[i].is_end_point) end_points.push (i); } - /* all points are referened, nothing to do */ + /* all points are referenced, nothing to do */ if (ref_count == point_count) return true; if (unlikely (end_points.in_error ())) return false; diff --git a/test/subset/meson.build b/test/subset/meson.build index 188d3dadd..be4f69bbf 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -65,9 +65,12 @@ tests = [ 'collect_name_ids', 'instantiate_colrv1', 'instantiate_cff2_update_metrics', - #'glyf_partial_instancing', ] +if get_option('experimental_api') + tests += 'glyf_partial_instancing' +endif + repack_tests = [ 'basic', 'prioritization', -- cgit v1.2.3 From 56e8a290328c6628a92971c7837f773194e7584f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 22 Aug 2023 15:49:00 -0600 Subject: Fix static_size declaration I have a vague memory that it was intentionally written that way, but I can't recall :-(. --- src/OT/Color/COLR/COLR.hh | 4 ++-- src/hb-null.hh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OT/Color/COLR/COLR.hh b/src/OT/Color/COLR/COLR.hh index 012c38146..60b094ecb 100644 --- a/src/OT/Color/COLR/COLR.hh +++ b/src/OT/Color/COLR/COLR.hh @@ -285,7 +285,7 @@ struct Variable public: VarIdx varIdxBase; public: - DEFINE_SIZE_STATIC (4 + T::static_size); + DEFINE_SIZE_MIN (VarIdx::static_size + T::min_size); }; template @@ -337,7 +337,7 @@ struct NoVariable T value; public: - DEFINE_SIZE_STATIC (T::static_size); + DEFINE_SIZE_MIN (T::min_size); }; // Color structures diff --git a/src/hb-null.hh b/src/hb-null.hh index 6796906ba..854485d3d 100644 --- a/src/hb-null.hh +++ b/src/hb-null.hh @@ -85,7 +85,7 @@ using hb_null_size = _hb_null_size; template struct _hb_static_size : hb_integral_constant {}; template -struct _hb_static_size> : hb_integral_constant {}; +struct _hb_static_size> : hb_integral_constant {}; template using hb_static_size = _hb_static_size; #define hb_static_size(T) hb_static_size::value -- cgit v1.2.3 From 5587247d5bb46e3ff5d0c4601b145dfbae50e27c Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 23 Aug 2023 21:54:15 +0000 Subject: [repacker] create only one extension subtable per physical subtable. During extension promotion when multiple lookups refer to a shared subtable node create and reuse a single extension subtable for it. Fixes: https://github.com/fonttools/fonttools/issues/3260. --- src/graph/graph.hh | 12 +++++++++++ src/graph/gsubgpos-context.hh | 1 + src/graph/gsubgpos-graph.hh | 19 +++++++++++++---- src/test-repacker.cc | 47 +++++++++++++++++++++++++++++++++++++------ 4 files changed, 69 insertions(+), 10 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index f81bed81e..2b742eff2 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -474,6 +474,18 @@ struct graph_t return root ().equals (other.root (), *this, other, 0); } + void print () const { + for (int i = vertices_.length - 1; i >= 0; i--) + { + const auto& v = vertices_[i]; + printf("%d: %lu [", i, v.table_size()); + for (const auto &l : v.obj.real_links) { + printf("%u, ", l.objidx); + } + printf("]\n"); + } + } + // Sorts links of all objects in a consistent manner and zeroes all offsets. void normalize () { diff --git a/src/graph/gsubgpos-context.hh b/src/graph/gsubgpos-context.hh index 26b7cfe4d..e7c7a7b00 100644 --- a/src/graph/gsubgpos-context.hh +++ b/src/graph/gsubgpos-context.hh @@ -40,6 +40,7 @@ struct gsubgpos_graph_context_t graph_t& graph; unsigned lookup_list_index; hb_hashmap_t lookups; + hb_map_t subtable_to_extension; HB_INTERNAL gsubgpos_graph_context_t (hb_tag_t table_tag_, diff --git a/src/graph/gsubgpos-graph.hh b/src/graph/gsubgpos-graph.hh index 303517f68..12fcbdc49 100644 --- a/src/graph/gsubgpos-graph.hh +++ b/src/graph/gsubgpos-graph.hh @@ -299,24 +299,35 @@ struct Lookup : public OT::Lookup unsigned subtable_index) { unsigned type = lookupType; + unsigned ext_index = -1; + unsigned* existing_ext_index = nullptr; + if (c.subtable_to_extension.has(subtable_index, &existing_ext_index)) { + ext_index = *existing_ext_index; + } else { + ext_index = create_extension_subtable(c, subtable_index, type); + c.subtable_to_extension.set(subtable_index, ext_index); + } - unsigned ext_index = create_extension_subtable(c, subtable_index, type); if (ext_index == (unsigned) -1) return false; + auto& subtable_vertex = c.graph.vertices_[subtable_index]; auto& lookup_vertex = c.graph.vertices_[lookup_index]; for (auto& l : lookup_vertex.obj.real_links.writer ()) { - if (l.objidx == subtable_index) + if (l.objidx == subtable_index) { // Change lookup to point at the extension. l.objidx = ext_index; + if (existing_ext_index) + subtable_vertex.remove_parent(lookup_index); + } } // Make extension point at the subtable. auto& ext_vertex = c.graph.vertices_[ext_index]; - auto& subtable_vertex = c.graph.vertices_[subtable_index]; ext_vertex.add_parent (lookup_index); - subtable_vertex.remap_parent (lookup_index, ext_index); + if (!existing_ext_index) + subtable_vertex.remap_parent (lookup_index, ext_index); return true; } diff --git a/src/test-repacker.cc b/src/test-repacker.cc index 94ff0849a..950e7d267 100644 --- a/src/test-repacker.cc +++ b/src/test-repacker.cc @@ -448,6 +448,7 @@ static void run_resolve_overflow_test (const char* name, name); graph_t graph (overflowing.object_graph ()); + graph_t expected_graph (expected.object_graph ()); if (graph::will_overflow (expected_graph)) { @@ -473,6 +474,12 @@ static void run_resolve_overflow_test (const char* name, // Check the graphs are equivalent graph.normalize (); expected_graph.normalize (); + if (!(graph == expected_graph)) { + printf("## Expected:\n"); + expected_graph.print(); + printf("## Result:\n"); + graph.print(); + } assert (graph == expected_graph); } @@ -1239,7 +1246,8 @@ populate_serializer_with_24_and_32_bit_offsets (hb_serialize_context_t* c) static void populate_serializer_with_extension_promotion (hb_serialize_context_t* c, - int num_extensions = 0) + int num_extensions = 0, + bool shared_subtables = false) { constexpr int num_lookups = 5; constexpr int num_subtables = num_lookups * 2; @@ -1252,15 +1260,13 @@ populate_serializer_with_extension_promotion (hb_serialize_context_t* c, for (int i = num_subtables - 1; i >= 0; i--) - subtables[i] = add_object(large_string.c_str (), 15000, c); + subtables[i] = add_object(large_string.c_str (), 15000 + i, c); for (int i = num_subtables - 1; i >= (num_lookups - num_extensions) * 2; i--) { - unsigned ext_index = i - (num_lookups - num_extensions) * 2; - unsigned subtable_index = num_subtables - ext_index - 1; - extensions[i] = add_extension (subtables[subtable_index], 5, c); + extensions[i] = add_extension (subtables[i], 5, c); } for (int i = num_lookups - 1; i >= 0; i--) @@ -1268,13 +1274,19 @@ populate_serializer_with_extension_promotion (hb_serialize_context_t* c, bool is_ext = (i >= (num_lookups - num_extensions)); start_lookup (is_ext ? (char) 7 : (char) 5, - 2, + shared_subtables && i > 2 ? 3 : 2, c); if (is_ext) { + if (shared_subtables && i > 2) { + add_offset (extensions[i * 2 - 1], c); + } add_offset (extensions[i * 2], c); add_offset (extensions[i * 2 + 1], c); } else { + if (shared_subtables && i > 2) { + add_offset (subtables[i * 2 - 1], c); + } add_offset (subtables[i * 2], c); add_offset (subtables[i * 2 + 1], c); } @@ -1837,6 +1849,28 @@ static void test_resolve_with_extension_promotion () free (expected_buffer); } +static void test_resolve_with_shared_extension_promotion () +{ + size_t buffer_size = 200000; + void* buffer = malloc (buffer_size); + assert (buffer); + hb_serialize_context_t c (buffer, buffer_size); + populate_serializer_with_extension_promotion (&c, 0, true); + + void* expected_buffer = malloc (buffer_size); + assert (expected_buffer); + hb_serialize_context_t e (expected_buffer, buffer_size); + populate_serializer_with_extension_promotion (&e, 3, true); + + run_resolve_overflow_test ("test_resolve_with_extension_promotion", + c, + e, + 20, + true); + free (buffer); + free (expected_buffer); +} + static void test_resolve_with_basic_pair_pos_1_split () { size_t buffer_size = 200000; @@ -2122,6 +2156,7 @@ main (int argc, char **argv) test_virtual_link (); test_shared_node_with_virtual_links (); test_resolve_with_extension_promotion (); + test_resolve_with_shared_extension_promotion (); test_resolve_with_basic_pair_pos_1_split (); test_resolve_with_extension_pair_pos_1_split (); test_resolve_with_basic_pair_pos_2_split (); -- cgit v1.2.3 From d7ee328f807cd4890b701d5b2dab5993270ace7f Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 23 Aug 2023 22:06:55 +0000 Subject: [repacker] include the size of all lookup tables in the layer size estimates from the start. In extension promotion previously we incrementally added the contribution of the lookup table to the layer size estimates as the lookups were processed. However, this isn't quite correct as regardless of the promotion decision the full lookup table size will be incurred. So the size should be added to the initial sizes. --- src/hb-repacker.hh | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/hb-repacker.hh b/src/hb-repacker.hh index cd57ade07..e30422563 100644 --- a/src/hb-repacker.hh +++ b/src/hb-repacker.hh @@ -114,11 +114,15 @@ bool _promote_extensions_if_needed (graph::gsubgpos_graph_context_t& ext_context // TODO(grieger): skip this for the 24 bit case. if (!ext_context.lookups) return true; + unsigned total_lookup_table_sizes = 0; hb_vector_t lookup_sizes; lookup_sizes.alloc (ext_context.lookups.get_population (), true); for (unsigned lookup_index : ext_context.lookups.keys ()) { + const auto& lookup_v = ext_context.graph.vertices_[lookup_index]; + total_lookup_table_sizes += lookup_v.table_size (); + const graph::Lookup* lookup = ext_context.lookups.get(lookup_index); hb_set_t visited; lookup_sizes.push (lookup_size_t { @@ -131,14 +135,16 @@ bool _promote_extensions_if_needed (graph::gsubgpos_graph_context_t& ext_context lookup_sizes.qsort (); size_t lookup_list_size = ext_context.graph.vertices_[ext_context.lookup_list_index].table_size (); - size_t l2_l3_size = lookup_list_size; // Lookup List + Lookups - size_t l3_l4_size = 0; // Lookups + SubTables + size_t l2_l3_size = lookup_list_size + total_lookup_table_sizes; // Lookup List + Lookups + size_t l3_l4_size = total_lookup_table_sizes; // Lookups + SubTables size_t l4_plus_size = 0; // SubTables + their descendants // Start by assuming all lookups are using extension subtables, this size will be removed later // if it's decided to not make a lookup extension. for (auto p : lookup_sizes) { + // TODO(garretrieger): this overestimates the extension subtables size because some extension subtables may be + // reused. However, we can't correct this until we have connected component analysis in place. unsigned subtables_size = p.num_subtables * 8; l3_l4_size += subtables_size; l4_plus_size += subtables_size; @@ -159,8 +165,7 @@ bool _promote_extensions_if_needed (graph::gsubgpos_graph_context_t& ext_context size_t subtables_size = ext_context.graph.find_subgraph_size (p.lookup_index, visited, 1) - lookup_size; size_t remaining_size = p.size - subtables_size - lookup_size; - l2_l3_size += lookup_size; - l3_l4_size += lookup_size + subtables_size; + l3_l4_size += subtables_size; l3_l4_size -= p.num_subtables * 8; l4_plus_size += subtables_size + remaining_size; -- cgit v1.2.3 From c28fdc39b25269aadafca2ba0507c149b2779da2 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 23 Aug 2023 22:16:39 +0000 Subject: [repacker] fix bot failure. --- src/graph/gsubgpos-context.hh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/graph/gsubgpos-context.hh b/src/graph/gsubgpos-context.hh index e7c7a7b00..b25d538fe 100644 --- a/src/graph/gsubgpos-context.hh +++ b/src/graph/gsubgpos-context.hh @@ -40,8 +40,7 @@ struct gsubgpos_graph_context_t graph_t& graph; unsigned lookup_list_index; hb_hashmap_t lookups; - hb_map_t subtable_to_extension; - + hb_hashmap_t subtable_to_extension; HB_INTERNAL gsubgpos_graph_context_t (hb_tag_t table_tag_, graph_t& graph_); -- cgit v1.2.3 From f380a32825a1b2c51bbe21dc7acb9b3cc0921f69 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Fri, 25 Aug 2023 14:01:01 +0700 Subject: Fix some typos. --- CONFIG.md | 2 +- src/OT/Layout/GPOS/PairPosFormat2.hh | 2 +- src/hb-bimap.hh | 2 +- src/hb-bit-set.hh | 4 ++-- src/hb-buffer.cc | 4 ++-- src/hb-buffer.h | 2 +- src/hb-font.cc | 2 +- src/hb-map.cc | 2 +- src/hb-ot-shape.cc | 2 +- src/hb-sanitize.hh | 2 +- src/hb-set.cc | 24 ++++++++++++------------ src/hb-vector.hh | 2 +- src/hb-wasm-shape.cc | 2 +- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 0faa359e6..f0fc065c7 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -144,7 +144,7 @@ the macro `HB_CONFIG_OVERRIDE_H` to the string containing to that header file's name. HarfBuzz will then include that file at the appropriate place during configuration. -Up until HarfBuzz 3.1.2 the the configuration override header file's name was +Up until HarfBuzz 3.1.2, the configuration override header file's name was fixed and called `config-override.h`, and was activated by defining the macro `HAVE_CONFIG_OVERRIDE_H`. That still works. diff --git a/src/OT/Layout/GPOS/PairPosFormat2.hh b/src/OT/Layout/GPOS/PairPosFormat2.hh index 1bde9e755..4adb1ef60 100644 --- a/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -163,7 +163,7 @@ struct PairPosFormat2_4 /* Isolate simple kerning and apply it half to each side. - * Results in better cursor positinoing / underline drawing. + * Results in better cursor positioning / underline drawing. * * Disabled, because causes issues... :-( * https://github.com/harfbuzz/harfbuzz/issues/3408 diff --git a/src/hb-bimap.hh b/src/hb-bimap.hh index 64dbf2e86..f54147254 100644 --- a/src/hb-bimap.hh +++ b/src/hb-bimap.hh @@ -93,7 +93,7 @@ struct hb_bimap_t auto iter () const HB_AUTO_RETURN (+ forw_map.iter()) }; -/* Inremental bimap: only lhs is given, rhs is incrementally assigned */ +/* Incremental bimap: only lhs is given, rhs is incrementally assigned */ struct hb_inc_bimap_t { bool in_error () const { return forw_map.in_error () || back_map.in_error (); } diff --git a/src/hb-bit-set.hh b/src/hb-bit-set.hh index 9e60cb934..1dbcce5cb 100644 --- a/src/hb-bit-set.hh +++ b/src/hb-bit-set.hh @@ -913,7 +913,7 @@ struct hb_bit_set_t /* The extra page_map length is necessary; can't just rely on vector here, * since the next check would be tricked because a null page also has - * major==0, which we can't distinguish from an actualy major==0 page... */ + * major==0, which we can't distinguish from an actually major==0 page... */ unsigned i = last_page_lookup; if (likely (i < page_map.length)) { @@ -947,7 +947,7 @@ struct hb_bit_set_t /* The extra page_map length is necessary; can't just rely on vector here, * since the next check would be tricked because a null page also has - * major==0, which we can't distinguish from an actualy major==0 page... */ + * major==0, which we can't distinguish from an actually major==0 page... */ unsigned i = last_page_lookup; if (likely (i < page_map.length)) { diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc index 749ef9bd4..934c6c212 100644 --- a/src/hb-buffer.cc +++ b/src/hb-buffer.cc @@ -1327,7 +1327,7 @@ hb_buffer_get_invisible_glyph (const hb_buffer_t *buffer) * Sets the #hb_codepoint_t that replaces characters not found in * the font during shaping. * - * The not-found glyph defaults to zero, sometimes knows as the + * The not-found glyph defaults to zero, sometimes known as the * ".notdef" glyph. This API allows for differentiating the two. * * Since: 3.1.0 @@ -2076,7 +2076,7 @@ hb_buffer_t::sort (unsigned int start, unsigned int end, int(*compar)(const hb_g * hb_buffer_diff: * @buffer: a buffer. * @reference: other buffer to compare to. - * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1. + * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepoint_t) -1. * @position_fuzz: allowed absolute difference in position values. * * If dottedcircle_glyph is (hb_codepoint_t) -1 then #HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT diff --git a/src/hb-buffer.h b/src/hb-buffer.h index bff78543c..3573127ff 100644 --- a/src/hb-buffer.h +++ b/src/hb-buffer.h @@ -99,7 +99,7 @@ typedef struct hb_glyph_info_t { * layout, by avoiding re-shaping of each line * after line-breaking, by limiting the * reshaping to a small piece around the - * breaking positin only, even if the breaking + * breaking position only, even if the breaking * position carries the * #HB_GLYPH_FLAG_UNSAFE_TO_BREAK or when * hyphenation or other text transformation diff --git a/src/hb-font.cc b/src/hb-font.cc index f062bfaf7..00f1f6d38 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -1066,7 +1066,7 @@ hb_font_get_nominal_glyph (hb_font_t *font, * @glyph_stride: The stride between successive glyph IDs * * Fetches the nominal glyph IDs for a sequence of Unicode code points. Glyph - * IDs must be returned in a #hb_codepoint_t output parameter. Stopes at the + * IDs must be returned in a #hb_codepoint_t output parameter. Stops at the * first unsupported glyph ID. * * Return value: the number of code points processed diff --git a/src/hb-map.cc b/src/hb-map.cc index 5d67cd9a1..0dc9246f1 100644 --- a/src/hb-map.cc +++ b/src/hb-map.cc @@ -365,7 +365,7 @@ hb_map_update (hb_map_t *map, * @key: (out): Key retrieved * @value: (out): Value retrieved * - * Fetches the next key/value paire in @map. + * Fetches the next key/value pair in @map. * * Set @idx to -1 to get started. * diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 9c1c2a950..90f596ae7 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -1054,7 +1054,7 @@ hb_ot_position_plan (const hb_ot_shape_context_t *c) * direction is backward we don't shift and it will end up * hanging over the next glyph after the final reordering. * - * Note: If fallback positinoing happens, we don't care about + * Note: If fallback positioning happens, we don't care about * this as it will be overridden. */ bool adjust_offsets_when_zeroing = c->plan->adjust_mark_positioning_when_zeroing && diff --git a/src/hb-sanitize.hh b/src/hb-sanitize.hh index efb5adde5..f2b7da167 100644 --- a/src/hb-sanitize.hh +++ b/src/hb-sanitize.hh @@ -453,7 +453,7 @@ struct hb_sanitize_context_t : edit_count = 0; sane = t->sanitize (this); if (edit_count) { - DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILLING", edit_count); + DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count); sane = false; } } diff --git a/src/hb-set.cc b/src/hb-set.cc index 97caddb22..a9386c5c9 100644 --- a/src/hb-set.cc +++ b/src/hb-set.cc @@ -200,7 +200,7 @@ hb_set_copy (const hb_set_t *set) void hb_set_clear (hb_set_t *set) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->clear (); } @@ -251,7 +251,7 @@ void hb_set_add (hb_set_t *set, hb_codepoint_t codepoint) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->add (codepoint); } @@ -272,7 +272,7 @@ hb_set_add_sorted_array (hb_set_t *set, const hb_codepoint_t *sorted_codepoints, unsigned int num_codepoints) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->add_sorted_array (sorted_codepoints, num_codepoints, sizeof(hb_codepoint_t)); @@ -294,7 +294,7 @@ hb_set_add_range (hb_set_t *set, hb_codepoint_t first, hb_codepoint_t last) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->add_range (first, last); } @@ -311,7 +311,7 @@ void hb_set_del (hb_set_t *set, hb_codepoint_t codepoint) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->del (codepoint); } @@ -334,7 +334,7 @@ hb_set_del_range (hb_set_t *set, hb_codepoint_t first, hb_codepoint_t last) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->del_range (first, last); } @@ -405,7 +405,7 @@ void hb_set_set (hb_set_t *set, const hb_set_t *other) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->set (*other); } @@ -422,7 +422,7 @@ void hb_set_union (hb_set_t *set, const hb_set_t *other) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->union_ (*other); } @@ -439,7 +439,7 @@ void hb_set_intersect (hb_set_t *set, const hb_set_t *other) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->intersect (*other); } @@ -456,7 +456,7 @@ void hb_set_subtract (hb_set_t *set, const hb_set_t *other) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->subtract (*other); } @@ -474,7 +474,7 @@ void hb_set_symmetric_difference (hb_set_t *set, const hb_set_t *other) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->symmetric_difference (*other); } @@ -489,7 +489,7 @@ hb_set_symmetric_difference (hb_set_t *set, void hb_set_invert (hb_set_t *set) { - /* Immutible-safe. */ + /* Immutable-safe. */ set->invert (); } diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 23a96d708..f41ea6f09 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -102,7 +102,7 @@ struct hb_vector_t void fini () { - /* We allow a hack to make the vector point to a foriegn array + /* We allow a hack to make the vector point to a foreign array * by the user. In that case length/arrayZ are non-zero but * allocated is zero. Don't free anything. */ if (allocated) diff --git a/src/hb-wasm-shape.cc b/src/hb-wasm-shape.cc index 79442e99e..a70b76664 100644 --- a/src/hb-wasm-shape.cc +++ b/src/hb-wasm-shape.cc @@ -48,7 +48,7 @@ * * - Build your font's wasm code importing the shared modules with the desired * name. This can be done eg.: __attribute__((import_module("graphite2"))) - * before each symbol in the the shared-module's headers. + * before each symbol in the shared-module's headers. * * - Try shaping your font and hope for the best... * -- cgit v1.2.3 From a1f034eaacb5547fdfc62fd1c4df23f9d2b40104 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Mon, 28 Aug 2023 21:10:16 +0000 Subject: [repacker] fix fuzzer failure. Fixes: https://oss-fuzz.com/testcase-detail/6490945267564544 --- src/graph/markbasepos-graph.hh | 4 +++- ...tcase-minimized-hb-repacker-fuzzer-6490945267564544 | Bin 0 -> 358352 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6490945267564544 diff --git a/src/graph/markbasepos-graph.hh b/src/graph/markbasepos-graph.hh index 5e9d5aea3..e10e1cf3e 100644 --- a/src/graph/markbasepos-graph.hh +++ b/src/graph/markbasepos-graph.hh @@ -318,7 +318,9 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2 class_to_info; - unsigned class_count= classCount; + unsigned class_count = classCount; + if (!class_count) return class_to_info; + if (!class_to_info.resize (class_count)) return hb_vector_t(); diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6490945267564544 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6490945267564544 new file mode 100644 index 000000000..20dc975fb Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-repacker-fuzzer-6490945267564544 differ -- cgit v1.2.3 From 8d22a57065d286dd2e920ece70c12bba5f59a8b1 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Mon, 28 Aug 2023 18:33:31 +0000 Subject: [repacker] fix potential use after free in repacker. During table splitting we iterate over the lookups map which can be modified during table splitting. This can result in a use after free in the iterator. Create a local copy of the lookup indices to avoid this. --- src/hb-repacker.hh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hb-repacker.hh b/src/hb-repacker.hh index e30422563..e9cd376ad 100644 --- a/src/hb-repacker.hh +++ b/src/hb-repacker.hh @@ -79,7 +79,12 @@ bool _presplit_subtables_if_needed (graph::gsubgpos_graph_context_t& ext_context // pass after this processing is done. Not super necessary as splits are // only done where overflow is likely, so de-dup probably will get undone // later anyways. - for (unsigned lookup_index : ext_context.lookups.keys ()) + + // The loop below can modify the contents of ext_context.lookups if new subtables are added + // to a lookup during a split. So save the initial set of lookup indices so the iteration doesn't + // risk access free'd memory if ext_context.lookups gets resized. + hb_set_t lookup_indices(ext_context.lookups.keys ()); + for (unsigned lookup_index : lookup_indices) { graph::Lookup* lookup = ext_context.lookups.get(lookup_index); if (!lookup->split_subtables_if_needed (ext_context, lookup_index)) -- cgit v1.2.3 From 4668b43e2cbc9d2ae19a9e9b53ad694da35240a1 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Thu, 31 Aug 2023 19:33:29 +0200 Subject: [meson] add source fallback URL to freetype2 wrap --- subprojects/freetype2.wrap | 1 + 1 file changed, 1 insertion(+) diff --git a/subprojects/freetype2.wrap b/subprojects/freetype2.wrap index d071daa69..fe325d84e 100644 --- a/subprojects/freetype2.wrap +++ b/subprojects/freetype2.wrap @@ -1,6 +1,7 @@ [wrap-file] directory = freetype-2.13.0 source_url = https://download.savannah.gnu.org/releases/freetype/freetype-2.13.0.tar.xz +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/freetype2_2.13.0-1/freetype-2.13.0.tar.xz source_filename = freetype-2.13.0.tar.xz source_hash = 5ee23abd047636c24b2d43c6625dcafc66661d1aca64dec9e0d05df29592624c -- cgit v1.2.3 From 4cfc6d8e173e800df086d7be078da2e8c5cfca19 Mon Sep 17 00:00:00 2001 From: Ben Wagner Date: Thu, 31 Aug 2023 13:54:34 -0400 Subject: Specify tuple_variations_t special member functions Building with clang complains about the use of `tuple_variations_t`'s implicit copy constructor and copy assignment operator, since automatic generation of these is deprecated when declaring a non-default destructor. This is a good warning because it isn't obvious that copies were being made instead of the object being moved and this struct should be moved and not copied. Declare all the special member functions, defaulting the moves and deleting the copies. After making `tuple_variations_t` move only, an issue is revealed in `hb_vector_t::push` which has been requiring that objects be copyable. Remove the old non-emplacing `push` now that this works with all existing objects and make a single `push` which is more like `std::vector::emplace_back` since that is somewhat what the newer `push` is attempting to do. --- src/hb-ot-var-common.hh | 5 +++++ src/hb-vector.hh | 22 ++-------------------- 2 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index d1c617e11..23d7f7cc3 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1076,6 +1076,11 @@ struct TupleVariationData unsigned compiled_byte_size = 4; public: + tuple_variations_t () = default; + tuple_variations_t (const tuple_variations_t&) = delete; + tuple_variations_t& operator=(const tuple_variations_t&) = delete; + tuple_variations_t (tuple_variations_t&&) = default; + tuple_variations_t& operator=(tuple_variations_t&&) = default; ~tuple_variations_t () { fini (); } void fini () { diff --git a/src/hb-vector.hh b/src/hb-vector.hh index f41ea6f09..66e687a1a 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -208,25 +208,7 @@ struct hb_vector_t return std::addressof (Crap (Type)); return std::addressof (arrayZ[length - 1]); } - template ::value && - std::is_copy_assignable::value)> - Type *push (T&& v) - { - Type *p = push (); - if (p == std::addressof (Crap (Type))) - // If push failed to allocate then don't copy v, since this may cause - // the created copy to leak memory since we won't have stored a - // reference to it. - return p; - *p = std::forward (v); - return p; - } - template ::value)> - Type *push (T&& v) + template Type *push (Args&&... args) { if (unlikely ((int) length >= allocated && !alloc (length + 1))) // If push failed to allocate then don't copy v, since this may cause @@ -236,7 +218,7 @@ struct hb_vector_t /* Emplace. */ Type *p = std::addressof (arrayZ[length++]); - return new (p) Type (std::forward (v)); + return new (p) Type (std::forward (args)...); } bool in_error () const { return allocated < 0; } -- cgit v1.2.3 From a0b758f7d779376f4582c968d6fc3c5e7cde1e50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 10:34:27 +0000 Subject: Bump github/codeql-action from 2.21.4 to 2.21.5 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.21.4 to 2.21.5. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/a09933a12a80f87b87005513f0abb1494c27a716...00e563ead9f72a8461b24876bee2d0c2e8bd2ee8) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 3f25667e1..b646d3df9 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@a09933a12a80f87b87005513f0abb1494c27a716 # v2.21.4 + uses: github/codeql-action/upload-sarif@00e563ead9f72a8461b24876bee2d0c2e8bd2ee8 # v2.21.5 with: sarif_file: results.sarif -- cgit v1.2.3 From 0340ba1c50da110787a420a633a7b8b2dabe42c4 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 5 Sep 2023 14:56:09 +0300 Subject: [bit-page] Add a few operators --- src/hb-bit-page.hh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hb-bit-page.hh b/src/hb-bit-page.hh index e1826e12a..869c67895 100644 --- a/src/hb-bit-page.hh +++ b/src/hb-bit-page.hh @@ -97,6 +97,7 @@ struct hb_bit_page_t static inline constexpr unsigned len () { return ARRAY_LENGTH_CONST (v); } + operator bool () const { return !is_empty (); } bool is_empty () const { if (has_population ()) return !population; @@ -218,6 +219,7 @@ struct hb_bit_page_t return count; } + bool operator == (const hb_bit_page_t &other) const { return is_equal (other); } bool is_equal (const hb_bit_page_t &other) const { for (unsigned i = 0; i < len (); i++) @@ -225,6 +227,7 @@ struct hb_bit_page_t return false; return true; } + bool operator <= (const hb_bit_page_t &larger_page) const { return is_subset (larger_page); } bool is_subset (const hb_bit_page_t &larger_page) const { if (has_population () && larger_page.has_population () && -- cgit v1.2.3 From fd3eb2c6723c3ce241011f1d3429e48c3226af1c Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 24 Aug 2023 08:59:18 -0700 Subject: fuzzer fix: https://oss-fuzz.com/testcase-detail/6032126569742336 --- src/hb-ot-var-gvar-table.hh | 24 ++++++--------------- ...ase-minimized-hb-subset-fuzzer-6032126569742336 | Bin 0 -> 1970 bytes 2 files changed, 6 insertions(+), 18 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6032126569742336 diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 3f9e10612..8ef9f0ec4 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -307,13 +307,12 @@ struct gvar bool sanitize (hb_sanitize_context_t *c) const { return sanitize_shallow (c); } - bool decompile_glyph_variations (const hb_subset_plan_t *plan, + bool decompile_glyph_variations (hb_subset_context_t *c, glyph_variations_t& glyph_vars /* OUT */) const { - hb_hashmap_t new_gid_var_data_map; - auto it = hb_iter (plan->new_to_old_gid_list); - if (it->first == 0 && !(plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE)) + auto it = hb_iter (c->plan->new_to_old_gid_list); + if (it->first == 0 && !(c->plan->flags & HB_SUBSET_FLAGS_NOTDEF_OUTLINE)) { new_gid_var_data_map.set (0, hb_bytes_t ()); it++; @@ -323,14 +322,14 @@ struct gvar { hb_codepoint_t new_gid = _.first; hb_codepoint_t old_gid = _.second; - hb_bytes_t var_data_bytes = get_glyph_var_data_bytes (old_gid); + hb_bytes_t var_data_bytes = get_glyph_var_data_bytes (c->source_blob, glyphCountX, old_gid); new_gid_var_data_map.set (new_gid, var_data_bytes); } if (new_gid_var_data_map.in_error ()) return false; hb_array_t shared_tuples = (this+sharedTuples).as_array ((unsigned) sharedTupleCount * (unsigned) axisCount); - return glyph_vars.create_from_glyphs_var_data (axisCount, shared_tuples, plan, new_gid_var_data_map); + return glyph_vars.create_from_glyphs_var_data (axisCount, shared_tuples, c->plan, new_gid_var_data_map); } templateplan, glyph_vars)) + if (!decompile_glyph_variations (c, glyph_vars)) return_trace (false); if (!glyph_vars.instantiate (c->plan)) return_trace (false); @@ -517,17 +516,6 @@ struct gvar return likely (var_data.length >= GlyphVariationData::min_size) ? var_data : hb_bytes_t (); } - const hb_bytes_t get_glyph_var_data_bytes (hb_codepoint_t gid) const - { - unsigned start_offset = get_offset (glyphCountX, gid); - unsigned end_offset = get_offset (glyphCountX, gid+1); - if (unlikely (end_offset < start_offset)) return hb_bytes_t (); - unsigned length = end_offset - start_offset; - const char *p = (const char*) this + (unsigned) dataZ + start_offset; - hb_bytes_t var_data{p, length}; - return likely (length >= GlyphVariationData::min_size) ? var_data : hb_bytes_t (); - } - bool is_long_offset () const { return flags & 1; } unsigned get_offset (unsigned glyph_count, unsigned i) const diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6032126569742336 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6032126569742336 new file mode 100644 index 000000000..0bc881d15 Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-6032126569742336 differ -- cgit v1.2.3 From 15bc9e342f989c7cd27de3a3fb68933259bf59e2 Mon Sep 17 00:00:00 2001 From: "L. E. Segovia" Date: Thu, 31 Aug 2023 23:37:08 -0300 Subject: [meson] Detect Microsoft compilers through _MSC_FULL_VER Microsoft ships three compilers nowadays: MSVC, clang-cl, and Clang. The latter is always skipped by `compiler.get_argument_syntax()`, which leads to the incorrect export macro being applied. This commit also removes the tests that are affected in Microsoft Clang. --- src/meson.build | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/meson.build b/src/meson.build index 4d63ecf90..87e8962d5 100644 --- a/src/meson.build +++ b/src/meson.build @@ -560,7 +560,7 @@ defs_list = [harfbuzz_def] version = '0.@0@.0'.format(hb_version_int) extra_hb_cpp_args = [] -if cpp.get_argument_syntax() == 'msvc' +if cpp.get_define('_MSC_FULL_VER') != '' if get_option('default_library') != 'static' extra_hb_cpp_args += '-DHB_DLL_EXPORT' endif @@ -680,18 +680,31 @@ endif if get_option('tests').enabled() # TODO: MSVC gives the following, # error LNK2019: unresolved external symbol "unsigned __int64 const * const _hb_NullPool" - if cpp.get_argument_syntax() != 'msvc' + if cpp.get_define('_MSC_FULL_VER') == '' noinst_programs = { 'main': 'main.cc', + 'test-algs': ['test-algs.cc', 'hb-static.cc'], 'test-basics': 'test.cc', + 'test-bimap': ['test-bimap.cc', 'hb-static.cc'], 'test-buffer-serialize': 'test-buffer-serialize.cc', + 'test-classdef-graph': ['graph/test-classdef-graph.cc', 'hb-static.cc', 'graph/gsubgpos-context.cc'], + 'test-instancer-solver': ['test-subset-instancer-solver.cc', 'hb-subset-instancer-solver.cc', 'hb-static.cc'], + 'test-iter': ['test-iter.cc', 'hb-static.cc'], + 'test-map': ['test-map.cc', 'hb-static.cc'], + 'test-multimap': ['test-multimap.cc', 'hb-static.cc'], 'test-ot-meta': 'test-ot-meta.cc', 'test-ot-name': 'test-ot-name.cc', 'test-ot-glyphname': 'test-ot-glyphname.cc', 'test-ot-gpos-size-params': 'test-gpos-size-params.cc', 'test-ot-gsub-get-alternates': 'test-gsub-get-alternates.cc', 'test-ot-gsub-would-substitute': 'test-gsub-would-substitute.cc', + 'test-priority-queue': ['test-priority-queue.cc', 'hb-static.cc'], + 'test-repacker': ['test-repacker.cc', 'hb-static.cc', 'graph/gsubgpos-context.cc'], + 'test-serialize': ['test-serialize.cc', 'hb-static.cc'], + 'test-set': ['test-set.cc', 'hb-static.cc'], + 'test-tuple-varstore': ['test-tuple-varstore.cc', 'hb-subset-instancer-solver.cc', 'hb-static.cc'], 'test-use-table': 'test-use-table.cc', + 'test-vector': ['test-vector.cc', 'hb-static.cc'], } foreach name, source : noinst_programs executable(name, source, @@ -704,24 +717,11 @@ if get_option('tests').enabled() endif compiled_tests = { - 'test-algs': ['test-algs.cc', 'hb-static.cc'], 'test-array': ['test-array.cc'], - 'test-iter': ['test-iter.cc', 'hb-static.cc'], 'test-machinery': ['test-machinery.cc', 'hb-static.cc'], - 'test-map': ['test-map.cc', 'hb-static.cc'], - 'test-multimap': ['test-multimap.cc', 'hb-static.cc'], 'test-number': ['test-number.cc', 'hb-number.cc'], 'test-ot-tag': ['hb-ot-tag.cc'], - 'test-priority-queue': ['test-priority-queue.cc', 'hb-static.cc'], - 'test-repacker': ['test-repacker.cc', 'hb-static.cc', 'graph/gsubgpos-context.cc'], - 'test-classdef-graph': ['graph/test-classdef-graph.cc', 'hb-static.cc', 'graph/gsubgpos-context.cc'], - 'test-set': ['test-set.cc', 'hb-static.cc'], - 'test-serialize': ['test-serialize.cc', 'hb-static.cc'], 'test-unicode-ranges': ['test-unicode-ranges.cc'], - 'test-vector': ['test-vector.cc', 'hb-static.cc'], - 'test-bimap': ['test-bimap.cc', 'hb-static.cc'], - 'test-instancer-solver': ['test-subset-instancer-solver.cc', 'hb-subset-instancer-solver.cc', 'hb-static.cc'], - 'test-tuple-varstore': ['test-tuple-varstore.cc', 'hb-subset-instancer-solver.cc', 'hb-static.cc'], } foreach name, source : compiled_tests if cpp.get_argument_syntax() == 'msvc' and source.contains('hb-static.cc') -- cgit v1.2.3 From 617e44785476178107c4216964f185937e312a09 Mon Sep 17 00:00:00 2001 From: "L. E. Segovia" Date: Thu, 31 Aug 2023 23:39:29 -0300 Subject: [meson] Set C++14 as minimum as implied by MSVC support Microsoft's STL uses C++14 as minimum. Using C++11 is actually enforced by clang-cl and clang, which will lead to all sorts of compilation errors. --- meson.build | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 85e453d72..768f663c2 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project('harfbuzz', 'c', 'cpp', version: '8.1.1', default_options: [ 'cpp_eh=none', # Just to support msvc, we are passing -fno-exceptions also anyway - 'cpp_rtti=false', # Just to support msvc, we are passing -fno-rtti also anyway + # 'cpp_rtti=false', # Do NOT enable, wraps inherit it and ICU needs RTTI 'cpp_std=c++11', 'wrap_mode=nofallback', # Use --wrap-mode=default to revert, https://github.com/harfbuzz/harfbuzz/pull/2548 ], @@ -22,6 +22,11 @@ pkgmod = import('pkgconfig') cpp = meson.get_compiler('cpp') null_dep = dependency('', required: false) +# Enforce C++14 requirement for MSVC STL +if ['clang', 'clang-cl'].contains(cpp.get_id()) and cpp.get_define('_MSC_FULL_VER') != '' + add_project_arguments('-std=c++14', language: 'cpp') +endif + if cpp.get_argument_syntax() == 'msvc' # Ignore several spurious warnings for things HarfBuzz does very commonly. # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it -- cgit v1.2.3 From d5cb1a315380e9bd78ff377a586b78bc42abafa6 Mon Sep 17 00:00:00 2001 From: "L. E. Segovia" Date: Thu, 31 Aug 2023 23:41:10 -0300 Subject: [meson] Add gitignore entries for wrap sources --- subprojects/.gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/subprojects/.gitignore b/subprojects/.gitignore index 9cdd68801..c84575172 100644 --- a/subprojects/.gitignore +++ b/subprojects/.gitignore @@ -1,4 +1,7 @@ -/freetype2 +/freetype-* +/icu +/libpng-* +/zlib-* /glib /packagecache /benchmark-* -- cgit v1.2.3 From c1eb66d4159fec311334aee5c0a59384491d3989 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Fri, 8 Sep 2023 21:54:32 +0300 Subject: 8.2.0 --- NEWS | 12 ++++++++++++ configure.ac | 2 +- docs/harfbuzz-docs.xml | 1 + meson.build | 2 +- src/hb-paint.cc | 2 +- src/hb-paint.h | 4 ++-- src/hb-version.h | 6 +++--- 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index 0a7b94b58..35e9eefdc 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,15 @@ +Overview of changes leading to 8.2.0 +Friday, September 8, 2023 +==================================== +- Various build and fuzzing fixes +- Improvements to COLRv1 painting. + +- New API: ++hb_paint_color_glyph_func_t ++hb_paint_funcs_set_color_glyph_func ++hb_paint_color_glyph + + Overview of changes leading to 8.1.1 Wednesday, August 2, 2023 ==================================== diff --git a/configure.ac b/configure.ac index 94257081b..6de79ae08 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [8.1.1], + [8.2.0], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/docs/harfbuzz-docs.xml b/docs/harfbuzz-docs.xml index 53b0a79a1..59bf8210a 100644 --- a/docs/harfbuzz-docs.xml +++ b/docs/harfbuzz-docs.xml @@ -120,6 +120,7 @@ API Index Index of deprecated API + Index of new symbols in 8.2.0 Index of new symbols in 8.1.0 Index of new symbols in 8.0.0 Index of new symbols in 7.3.0 diff --git a/meson.build b/meson.build index 768f663c2..3bc98e2be 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('harfbuzz', 'c', 'cpp', meson_version: '>= 0.55.0', - version: '8.1.1', + version: '8.2.0', default_options: [ 'cpp_eh=none', # Just to support msvc, we are passing -fno-exceptions also anyway # 'cpp_rtti=false', # Do NOT enable, wraps inherit it and ICU needs RTTI diff --git a/src/hb-paint.cc b/src/hb-paint.cc index 0a5384552..8eb24eb28 100644 --- a/src/hb-paint.cc +++ b/src/hb-paint.cc @@ -488,7 +488,7 @@ hb_paint_pop_transform (hb_paint_funcs_t *funcs, void *paint_data) * * Perform a "color-glyph" paint operation. * - * XSince: REPLACEME + * Since: 8.2.0 */ hb_bool_t hb_paint_color_glyph (hb_paint_funcs_t *funcs, void *paint_data, diff --git a/src/hb-paint.h b/src/hb-paint.h index 74f49f047..b0cd384e2 100644 --- a/src/hb-paint.h +++ b/src/hb-paint.h @@ -148,7 +148,7 @@ typedef void (*hb_paint_pop_transform_func_t) (hb_paint_funcs_t *funcs, * * Return value: %true if the glyph was painted, %false otherwise. * - * XSince: REPLACEME + * Since: 8.2.0 */ typedef hb_bool_t (*hb_paint_color_glyph_func_t) (hb_paint_funcs_t *funcs, void *paint_data, @@ -752,7 +752,7 @@ hb_paint_funcs_set_pop_transform_func (hb_paint_funcs_t *funcs, * * Sets the color-glyph callback on the paint functions struct. * - * Since: 7.0.0 + * Since: 8.2.0 */ HB_EXTERN void hb_paint_funcs_set_color_glyph_func (hb_paint_funcs_t *funcs, diff --git a/src/hb-version.h b/src/hb-version.h index 773395fb2..902d51ec0 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -47,20 +47,20 @@ HB_BEGIN_DECLS * * The minor component of the library version available at compile-time. */ -#define HB_VERSION_MINOR 1 +#define HB_VERSION_MINOR 2 /** * HB_VERSION_MICRO: * * The micro component of the library version available at compile-time. */ -#define HB_VERSION_MICRO 1 +#define HB_VERSION_MICRO 0 /** * HB_VERSION_STRING: * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "8.1.1" +#define HB_VERSION_STRING "8.2.0" /** * HB_VERSION_ATLEAST: -- cgit v1.2.3 From 17ee3cd7f4e3123d8289694f59a03c782035103f Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Sun, 10 Sep 2023 07:29:08 +0200 Subject: fix warning with unsigned long --- src/graph/graph.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 2b742eff2..49424488e 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -478,7 +478,7 @@ struct graph_t for (int i = vertices_.length - 1; i >= 0; i--) { const auto& v = vertices_[i]; - printf("%d: %lu [", i, v.table_size()); + printf("%d: %u [", i, (unsigned int)v.table_size()); for (const auto &l : v.obj.real_links) { printf("%u, ", l.objidx); } -- cgit v1.2.3 From 978918c32a66af41df86386510cf73a4c0e8d393 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 11 Sep 2023 11:04:08 +0100 Subject: [aat] Simplify complex condition Based on https://github.com/RazrFalcon/rustybuzz/discussions/79#discussioncomment-6960324 --- src/hb-aat-layout-common.hh | 72 ++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 37 deletions(-) diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 7d53c354d..672f80e0d 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -851,43 +851,41 @@ struct StateTableDriver * * https://github.com/harfbuzz/harfbuzz/issues/2860 */ - const EntryT *wouldbe_entry; - bool safe_to_break = - /* 1. */ - !c->is_actionable (this, entry) - && - /* 2. */ - ( - /* 2a. */ - state == StateTableT::STATE_START_OF_TEXT - || - /* 2b. */ - ( - (entry.flags & context_t::DontAdvance) && - next_state == StateTableT::STATE_START_OF_TEXT - ) - || - /* 2c. */ - ( - wouldbe_entry = &machine.get_entry (StateTableT::STATE_START_OF_TEXT, klass) - , - /* 2c'. */ - !c->is_actionable (this, *wouldbe_entry) - && - /* 2c". */ - ( - next_state == machine.new_state (wouldbe_entry->newState) - && - (entry.flags & context_t::DontAdvance) == (wouldbe_entry->flags & context_t::DontAdvance) - ) - ) - ) - && - /* 3. */ - !c->is_actionable (this, machine.get_entry (state, StateTableT::CLASS_END_OF_TEXT)) - ; - - if (!safe_to_break && buffer->backtrack_len () && buffer->idx < buffer->len) + + const auto is_safe_to_break_extra = [&]() + { + /* 2c. */ + const auto wouldbe_entry = machine.get_entry(StateTableT::STATE_START_OF_TEXT, klass); + + /* 2c'. */ + if (c->is_actionable (this, wouldbe_entry)) + return false; + + /* 2c". */ + return next_state == machine.new_state(wouldbe_entry.newState) + && (entry.flags & context_t::DontAdvance) == (wouldbe_entry.flags & context_t::DontAdvance); + }; + + const auto is_safe_to_break = [&]() + { + /* 1. */ + if (c->is_actionable (this, entry)) + return false; + + /* 2. */ + // This one is meh, I know... + const auto ok = + state == StateTableT::STATE_START_OF_TEXT + || ((entry.flags & context_t::DontAdvance) && next_state == StateTableT::STATE_START_OF_TEXT) + || is_safe_to_break_extra(); + if (!ok) + return false; + + /* 3. */ + return !c->is_actionable (this, machine.get_entry (state, StateTableT::CLASS_END_OF_TEXT)); + }; + + if (!is_safe_to_break () && buffer->backtrack_len () && buffer->idx < buffer->len) buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1); c->transition (this, entry); -- cgit v1.2.3 From 7384aaae4300da4380ce13adbca0aa7c6fe443e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 10:33:29 +0000 Subject: Bump actions/upload-artifact from 3.1.2 to 3.1.3 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/0b7f8abb1508181956e8e162db84b466c27e18ce...a8a3f3ad30e3422c9c7b888a15615d19a852ae32) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/cifuzz.yml | 2 +- .github/workflows/msys2-ci.yml | 2 +- .github/workflows/scorecard.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml index 5b6a52d58..f3dd5873a 100644 --- a/.github/workflows/cifuzz.yml +++ b/.github/workflows/cifuzz.yml @@ -21,7 +21,7 @@ jobs: fuzz-seconds: 600 dry-run: false - name: Upload Crash - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 if: failure() && steps.build.outcome == 'success' with: name: artifacts diff --git a/.github/workflows/msys2-ci.yml b/.github/workflows/msys2-ci.yml index 52e8cfeb5..7184b73f9 100644 --- a/.github/workflows/msys2-ci.yml +++ b/.github/workflows/msys2-ci.yml @@ -76,7 +76,7 @@ jobs: run: meson test --print-errorlogs --suite=harfbuzz -Cbuild - name: Upload DLLs if: always() - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 with: name: libharfbuzz-${{ matrix.MSYS2_ARCH }} path: ./build/src/libharfbuzz-*.dll diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index b646d3df9..4488f261e 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -51,7 +51,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 with: name: SARIF file path: results.sarif -- cgit v1.2.3 From 37457412b3212463c5f53119080cd1af375aae23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 10:33:26 +0000 Subject: Bump actions/checkout from 3.5.3 to 4.0.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 3.5.3 to 4.0.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/c85c95e3d7251135ab7dc9ce3241c5835cc595a9...3df4ab11eba7bda6032a0b82a6bb43b11571feac) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/arm-ci.yml | 2 +- .github/workflows/configs-build.yml | 2 +- .github/workflows/coverity-scan.yml | 2 +- .github/workflows/linux-ci.yml | 2 +- .github/workflows/macos-ci.yml | 2 +- .github/workflows/msvc-ci.yml | 2 +- .github/workflows/msys2-ci.yml | 2 +- .github/workflows/scorecard.yml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/arm-ci.yml b/.github/workflows/arm-ci.yml index 282977d08..9f3c70cb7 100644 --- a/.github/workflows/arm-ci.yml +++ b/.github/workflows/arm-ci.yml @@ -15,7 +15,7 @@ jobs: container: image: devkitpro/devkitarm:latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - name: Configure CMake run: | cmake -S . -B build \ diff --git a/.github/workflows/configs-build.yml b/.github/workflows/configs-build.yml index 5042aba9f..e9103137e 100644 --- a/.github/workflows/configs-build.yml +++ b/.github/workflows/configs-build.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - name: install dependencies run: sudo apt-get install gcc - name: HB_DISABLE_DEPRECATED diff --git a/.github/workflows/coverity-scan.yml b/.github/workflows/coverity-scan.yml index 100196734..6f2e5a9dc 100644 --- a/.github/workflows/coverity-scan.yml +++ b/.github/workflows/coverity-scan.yml @@ -11,7 +11,7 @@ jobs: latest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - run: sudo apt-get install gcc clang wget git curl pkg-config libfreetype6-dev libglib2.0-dev libicu-dev libgraphite2-dev diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 05ec95fce..720bc1287 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - name: Setup Ccache uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: diff --git a/.github/workflows/macos-ci.yml b/.github/workflows/macos-ci.yml index c57a5f3ff..9a1d4a87b 100644 --- a/.github/workflows/macos-ci.yml +++ b/.github/workflows/macos-ci.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - name: Setup Ccache uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: diff --git a/.github/workflows/msvc-ci.yml b/.github/workflows/msvc-ci.yml index 518b0ae06..f9ef58420 100644 --- a/.github/workflows/msvc-ci.yml +++ b/.github/workflows/msvc-ci.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - name: Setup Ccache uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: diff --git a/.github/workflows/msys2-ci.yml b/.github/workflows/msys2-ci.yml index 7184b73f9..9677fd8a9 100644 --- a/.github/workflows/msys2-ci.yml +++ b/.github/workflows/msys2-ci.yml @@ -33,7 +33,7 @@ jobs: shell: msys2 {0} steps: - name: Checkout - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - name: Setup MSYS2 uses: msys2/setup-msys2@cf96e00c0aab3788743aaf63b64146f0d383cee9 # v2 with: diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 4488f261e..16b81766e 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 with: persist-credentials: false -- cgit v1.2.3 From 02c2e24749b9d20ec6371766d7faeb4d5d2caa67 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 09:22:43 -0400 Subject: Regenerate files using Ragel 6.10 --- src/hb-buffer-deserialize-json.hh | 8 +- src/hb-buffer-deserialize-text-glyphs.hh | 10 +- src/hb-buffer-deserialize-text-unicode.hh | 10 +- src/hb-number-parser.hh | 8 +- src/hb-ot-shaper-indic-machine.hh | 14 +- src/hb-ot-shaper-khmer-machine.hh | 14 +- src/hb-ot-shaper-myanmar-machine.hh | 14 +- src/hb-ot-shaper-use-machine.hh | 1875 ++++++++++++++--------------- 8 files changed, 942 insertions(+), 1011 deletions(-) diff --git a/src/hb-buffer-deserialize-json.hh b/src/hb-buffer-deserialize-json.hh index 004a9fb8b..1deaaafd8 100644 --- a/src/hb-buffer-deserialize-json.hh +++ b/src/hb-buffer-deserialize-json.hh @@ -32,7 +32,7 @@ #include "hb.hh" -#line 33 "hb-buffer-deserialize-json.hh" +#line 36 "hb-buffer-deserialize-json.hh" static const unsigned char _deserialize_json_trans_keys[] = { 0u, 0u, 9u, 123u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, @@ -555,12 +555,12 @@ _hb_buffer_deserialize_json (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 552 "hb-buffer-deserialize-json.hh" +#line 559 "hb-buffer-deserialize-json.hh" { cs = deserialize_json_start; } -#line 555 "hb-buffer-deserialize-json.hh" +#line 564 "hb-buffer-deserialize-json.hh" { int _slen; int _trans; @@ -772,7 +772,7 @@ _resume: *end_ptr = p; } break; -#line 733 "hb-buffer-deserialize-json.hh" +#line 776 "hb-buffer-deserialize-json.hh" } _again: diff --git a/src/hb-buffer-deserialize-text-glyphs.hh b/src/hb-buffer-deserialize-text-glyphs.hh index 5fe75659b..ea81273b3 100644 --- a/src/hb-buffer-deserialize-text-glyphs.hh +++ b/src/hb-buffer-deserialize-text-glyphs.hh @@ -32,7 +32,7 @@ #include "hb.hh" -#line 33 "hb-buffer-deserialize-text-glyphs.hh" +#line 36 "hb-buffer-deserialize-text-glyphs.hh" static const unsigned char _deserialize_text_glyphs_trans_keys[] = { 0u, 0u, 48u, 57u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 43u, 124u, 9u, 124u, 9u, 124u, @@ -349,12 +349,12 @@ _hb_buffer_deserialize_text_glyphs (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 346 "hb-buffer-deserialize-text-glyphs.hh" +#line 353 "hb-buffer-deserialize-text-glyphs.hh" { cs = deserialize_text_glyphs_start; } -#line 349 "hb-buffer-deserialize-text-glyphs.hh" +#line 358 "hb-buffer-deserialize-text-glyphs.hh" { int _slen; int _trans; @@ -550,7 +550,7 @@ _resume: *end_ptr = p; } break; -#line 516 "hb-buffer-deserialize-text-glyphs.hh" +#line 554 "hb-buffer-deserialize-text-glyphs.hh" } _again: @@ -667,7 +667,7 @@ _again: *end_ptr = p; } break; -#line 616 "hb-buffer-deserialize-text-glyphs.hh" +#line 671 "hb-buffer-deserialize-text-glyphs.hh" } } diff --git a/src/hb-buffer-deserialize-text-unicode.hh b/src/hb-buffer-deserialize-text-unicode.hh index 8ca73bf25..a8cdf67e7 100644 --- a/src/hb-buffer-deserialize-text-unicode.hh +++ b/src/hb-buffer-deserialize-text-unicode.hh @@ -32,7 +32,7 @@ #include "hb.hh" -#line 33 "hb-buffer-deserialize-text-unicode.hh" +#line 36 "hb-buffer-deserialize-text-unicode.hh" static const unsigned char _deserialize_text_unicode_trans_keys[] = { 0u, 0u, 9u, 117u, 43u, 102u, 48u, 102u, 48u, 57u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 0 @@ -197,12 +197,12 @@ _hb_buffer_deserialize_text_unicode (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; const hb_glyph_position_t pos = {0}; -#line 194 "hb-buffer-deserialize-text-unicode.hh" +#line 201 "hb-buffer-deserialize-text-unicode.hh" { cs = deserialize_text_unicode_start; } -#line 197 "hb-buffer-deserialize-text-unicode.hh" +#line 206 "hb-buffer-deserialize-text-unicode.hh" { int _slen; int _trans; @@ -269,7 +269,7 @@ _resume: *end_ptr = p; } break; -#line 256 "hb-buffer-deserialize-text-unicode.hh" +#line 273 "hb-buffer-deserialize-text-unicode.hh" } _again: @@ -307,7 +307,7 @@ _again: *end_ptr = p; } break; -#line 289 "hb-buffer-deserialize-text-unicode.hh" +#line 311 "hb-buffer-deserialize-text-unicode.hh" } } diff --git a/src/hb-number-parser.hh b/src/hb-number-parser.hh index ec68c3a72..1a9dbba6d 100644 --- a/src/hb-number-parser.hh +++ b/src/hb-number-parser.hh @@ -31,7 +31,7 @@ #include "hb.hh" -#line 32 "hb-number-parser.hh" +#line 35 "hb-number-parser.hh" static const unsigned char _double_parser_trans_keys[] = { 0u, 0u, 43u, 57u, 46u, 57u, 48u, 57u, 43u, 57u, 48u, 57u, 48u, 101u, 48u, 57u, 46u, 101u, 0 @@ -135,12 +135,12 @@ strtod_rl (const char *p, const char **end_ptr /* IN/OUT */) int cs; -#line 132 "hb-number-parser.hh" +#line 139 "hb-number-parser.hh" { cs = double_parser_start; } -#line 135 "hb-number-parser.hh" +#line 144 "hb-number-parser.hh" { int _slen; int _trans; @@ -198,7 +198,7 @@ _resume: exp_overflow = true; } break; -#line 187 "hb-number-parser.hh" +#line 202 "hb-number-parser.hh" } _again: diff --git a/src/hb-ot-shaper-indic-machine.hh b/src/hb-ot-shaper-indic-machine.hh index 7dd47755a..353e32d32 100644 --- a/src/hb-ot-shaper-indic-machine.hh +++ b/src/hb-ot-shaper-indic-machine.hh @@ -53,7 +53,7 @@ enum indic_syllable_type_t { }; -#line 54 "hb-ot-shaper-indic-machine.hh" +#line 57 "hb-ot-shaper-indic-machine.hh" #define indic_syllable_machine_ex_A 9u #define indic_syllable_machine_ex_C 1u #define indic_syllable_machine_ex_CM 16u @@ -76,7 +76,7 @@ enum indic_syllable_type_t { #define indic_syllable_machine_ex_ZWNJ 5u -#line 75 "hb-ot-shaper-indic-machine.hh" +#line 80 "hb-ot-shaper-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { 8u, 8u, 4u, 13u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 8u, 8u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, @@ -460,7 +460,7 @@ find_syllables_indic (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 453 "hb-ot-shaper-indic-machine.hh" +#line 464 "hb-ot-shaper-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -476,7 +476,7 @@ find_syllables_indic (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 465 "hb-ot-shaper-indic-machine.hh" +#line 480 "hb-ot-shaper-indic-machine.hh" { int _slen; int _trans; @@ -490,7 +490,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 477 "hb-ot-shaper-indic-machine.hh" +#line 494 "hb-ot-shaper-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -593,7 +593,7 @@ _eof_trans: #line 114 "hb-ot-shaper-indic-machine.rl" {act = 6;} break; -#line 559 "hb-ot-shaper-indic-machine.hh" +#line 597 "hb-ot-shaper-indic-machine.hh" } _again: @@ -602,7 +602,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 566 "hb-ot-shaper-indic-machine.hh" +#line 606 "hb-ot-shaper-indic-machine.hh" } if ( ++p != pe ) diff --git a/src/hb-ot-shaper-khmer-machine.hh b/src/hb-ot-shaper-khmer-machine.hh index 848ed231f..f1e7a91f0 100644 --- a/src/hb-ot-shaper-khmer-machine.hh +++ b/src/hb-ot-shaper-khmer-machine.hh @@ -48,7 +48,7 @@ enum khmer_syllable_type_t { }; -#line 49 "hb-ot-shaper-khmer-machine.hh" +#line 52 "hb-ot-shaper-khmer-machine.hh" #define khmer_syllable_machine_ex_C 1u #define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u #define khmer_syllable_machine_ex_H 4u @@ -66,7 +66,7 @@ enum khmer_syllable_type_t { #define khmer_syllable_machine_ex_ZWNJ 5u -#line 65 "hb-ot-shaper-khmer-machine.hh" +#line 70 "hb-ot-shaper-khmer-machine.hh" static const unsigned char _khmer_syllable_machine_trans_keys[] = { 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, @@ -294,7 +294,7 @@ find_syllables_khmer (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 287 "hb-ot-shaper-khmer-machine.hh" +#line 298 "hb-ot-shaper-khmer-machine.hh" { cs = khmer_syllable_machine_start; ts = 0; @@ -310,7 +310,7 @@ find_syllables_khmer (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 299 "hb-ot-shaper-khmer-machine.hh" +#line 314 "hb-ot-shaper-khmer-machine.hh" { int _slen; int _trans; @@ -324,7 +324,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 311 "hb-ot-shaper-khmer-machine.hh" +#line 328 "hb-ot-shaper-khmer-machine.hh" } _keys = _khmer_syllable_machine_trans_keys + (cs<<1); @@ -394,7 +394,7 @@ _eof_trans: #line 98 "hb-ot-shaper-khmer-machine.rl" {act = 3;} break; -#line 368 "hb-ot-shaper-khmer-machine.hh" +#line 398 "hb-ot-shaper-khmer-machine.hh" } _again: @@ -403,7 +403,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 375 "hb-ot-shaper-khmer-machine.hh" +#line 407 "hb-ot-shaper-khmer-machine.hh" } if ( ++p != pe ) diff --git a/src/hb-ot-shaper-myanmar-machine.hh b/src/hb-ot-shaper-myanmar-machine.hh index 809f6eefb..f7b456b11 100644 --- a/src/hb-ot-shaper-myanmar-machine.hh +++ b/src/hb-ot-shaper-myanmar-machine.hh @@ -50,7 +50,7 @@ enum myanmar_syllable_type_t { }; -#line 51 "hb-ot-shaper-myanmar-machine.hh" +#line 54 "hb-ot-shaper-myanmar-machine.hh" #define myanmar_syllable_machine_ex_A 9u #define myanmar_syllable_machine_ex_As 32u #define myanmar_syllable_machine_ex_C 1u @@ -77,7 +77,7 @@ enum myanmar_syllable_type_t { #define myanmar_syllable_machine_ex_ZWNJ 5u -#line 76 "hb-ot-shaper-myanmar-machine.hh" +#line 81 "hb-ot-shaper-myanmar-machine.hh" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 1u, 41u, 3u, 41u, 5u, 39u, 5u, 8u, 3u, 41u, 3u, 39u, 3u, 39u, 5u, 39u, 5u, 39u, 3u, 39u, 3u, 39u, 3u, 41u, 5u, 39u, 1u, 15u, 3u, 39u, 3u, 39u, @@ -443,7 +443,7 @@ find_syllables_myanmar (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 436 "hb-ot-shaper-myanmar-machine.hh" +#line 447 "hb-ot-shaper-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -459,7 +459,7 @@ find_syllables_myanmar (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 448 "hb-ot-shaper-myanmar-machine.hh" +#line 463 "hb-ot-shaper-myanmar-machine.hh" { int _slen; int _trans; @@ -473,7 +473,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 460 "hb-ot-shaper-myanmar-machine.hh" +#line 477 "hb-ot-shaper-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -519,7 +519,7 @@ _eof_trans: #line 113 "hb-ot-shaper-myanmar-machine.rl" {te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }} break; -#line 498 "hb-ot-shaper-myanmar-machine.hh" +#line 523 "hb-ot-shaper-myanmar-machine.hh" } _again: @@ -528,7 +528,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 505 "hb-ot-shaper-myanmar-machine.hh" +#line 532 "hb-ot-shaper-myanmar-machine.hh" } if ( ++p != pe ) diff --git a/src/hb-ot-shaper-use-machine.hh b/src/hb-ot-shaper-use-machine.hh index 80a9b09d8..307bb1ce1 100644 --- a/src/hb-ot-shaper-use-machine.hh +++ b/src/hb-ot-shaper-use-machine.hh @@ -1,31 +1,32 @@ + #line 1 "hb-ot-shaper-use-machine.rl" /* -* Copyright © 2015 Mozilla Foundation. -* Copyright © 2015 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. -* -* Mozilla Author(s): Jonathan Kew -* Google Author(s): Behdad Esfahbod -*/ + * Copyright © 2015 Mozilla Foundation. + * Copyright © 2015 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. + * + * Mozilla Author(s): Jonathan Kew + * Google Author(s): Behdad Esfahbod + */ #ifndef HB_OT_SHAPER_USE_MACHINE_HH #define HB_OT_SHAPER_USE_MACHINE_HH @@ -40,19 +41,19 @@ #define USE(Cat) use_syllable_machine_ex_##Cat enum use_syllable_type_t { - use_virama_terminated_cluster, - use_sakot_terminated_cluster, - use_standard_cluster, - use_number_joiner_terminated_cluster, - use_numeral_cluster, - use_symbol_cluster, - use_hieroglyph_cluster, - use_broken_cluster, - use_non_cluster, + use_virama_terminated_cluster, + use_sakot_terminated_cluster, + use_standard_cluster, + use_number_joiner_terminated_cluster, + use_numeral_cluster, + use_symbol_cluster, + use_hieroglyph_cluster, + use_broken_cluster, + use_non_cluster, }; -#line 54 "hb-ot-shaper-use-machine.hh" +#line 57 "hb-ot-shaper-use-machine.hh" #define use_syllable_machine_ex_B 1u #define use_syllable_machine_ex_CGJ 6u #define use_syllable_machine_ex_CMAbv 31u @@ -96,594 +97,704 @@ enum use_syllable_type_t { #define use_syllable_machine_ex_ZWNJ 14u -#line 96 "hb-ot-shaper-use-machine.hh" +#line 101 "hb-ot-shaper-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 0u, 39u, 5u, 39u, 5u, 39u, 1u, 39u, - 8u, 34u, 8u, 33u, 8u, 33u, 8u, 33u, - 8u, 32u, 8u, 32u, 8u, 8u, 8u, 34u, - 8u, 34u, 8u, 34u, 1u, 8u, 8u, 34u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 6u, 39u, 8u, 39u, 6u, 39u, 6u, 39u, - 6u, 39u, 5u, 39u, 1u, 8u, 1u, 34u, - 8u, 28u, 8u, 28u, 5u, 39u, 1u, 39u, - 8u, 34u, 8u, 33u, 8u, 33u, 8u, 33u, - 8u, 32u, 8u, 32u, 8u, 8u, 8u, 34u, - 8u, 34u, 8u, 34u, 1u, 8u, 8u, 34u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 6u, 39u, 8u, 39u, 6u, 39u, 6u, 39u, - 6u, 39u, 5u, 39u, 1u, 8u, 1u, 8u, - 1u, 34u, 7u, 8u, 3u, 8u, 5u, 39u, - 5u, 39u, 1u, 39u, 8u, 34u, 8u, 33u, - 8u, 33u, 8u, 33u, 8u, 32u, 8u, 32u, - 8u, 8u, 8u, 34u, 8u, 34u, 8u, 34u, - 1u, 8u, 8u, 34u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 6u, 39u, 8u, 39u, - 6u, 39u, 6u, 39u, 6u, 39u, 5u, 39u, - 1u, 8u, 1u, 8u, 1u, 34u, 5u, 39u, - 1u, 39u, 8u, 34u, 8u, 33u, 8u, 33u, - 8u, 33u, 8u, 32u, 8u, 32u, 8u, 8u, - 8u, 34u, 8u, 34u, 8u, 34u, 1u, 8u, - 8u, 34u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 6u, 39u, 8u, 39u, 6u, 39u, - 6u, 39u, 6u, 39u, 5u, 39u, 1u, 8u, - 1u, 34u, 3u, 8u, 7u, 8u, 1u, 39u, - 8u, 28u, 8u, 28u, 1u, 4u, 8u, 38u, - 8u, 38u, 8u, 37u, 0u + 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, + 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, + 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, + 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 14u, 42u, 14u, 42u, 11u, 53u, 1u, 53u, + 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, + 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, + 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, + 1u, 48u, 13u, 14u, 4u, 14u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, + 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, + 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, + 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, 1u, 48u, 11u, 53u, + 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, + 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, + 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, + 1u, 48u, 4u, 14u, 13u, 14u, 1u, 53u, 14u, 42u, 14u, 42u, 1u, 5u, 14u, 52u, + 14u, 52u, 14u, 51u, 0 }; -static const signed char _use_syllable_machine_char_class[] = { - 0, 1, 2, 2, 3, 4, 2, 2, - 2, 2, 2, 5, 6, 7, 8, 2, - 2, 2, 9, 2, 2, 2, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 2, 24, 25, 26, - 2, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 0 +static const char _use_syllable_machine_key_spans[] = { + 54, 43, 43, 53, 35, 34, 34, 34, + 33, 33, 1, 35, 35, 35, 14, 35, + 40, 40, 40, 40, 42, 40, 42, 42, + 42, 43, 14, 48, 29, 29, 43, 53, + 35, 34, 34, 34, 33, 33, 1, 35, + 35, 35, 14, 35, 40, 40, 40, 40, + 42, 40, 42, 42, 42, 43, 14, 14, + 48, 2, 11, 43, 43, 53, 35, 34, + 34, 34, 33, 33, 1, 35, 35, 35, + 14, 35, 40, 40, 40, 40, 42, 40, + 42, 42, 42, 43, 14, 14, 48, 43, + 53, 35, 34, 34, 34, 33, 33, 1, + 35, 35, 35, 14, 35, 40, 40, 40, + 40, 42, 40, 42, 42, 42, 43, 14, + 48, 11, 2, 53, 29, 29, 5, 39, + 39, 38 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 40, 75, 110, 149, 176, 202, 228, - 254, 279, 304, 305, 332, 359, 386, 394, - 421, 453, 485, 517, 549, 583, 615, 649, - 683, 717, 752, 760, 794, 815, 836, 871, - 910, 937, 963, 989, 1015, 1040, 1065, 1066, - 1093, 1120, 1147, 1155, 1182, 1214, 1246, 1278, - 1310, 1344, 1376, 1410, 1444, 1478, 1513, 1521, - 1529, 1563, 1565, 1571, 1606, 1641, 1680, 1707, - 1733, 1759, 1785, 1810, 1835, 1836, 1863, 1890, - 1917, 1925, 1952, 1984, 2016, 2048, 2080, 2114, - 2146, 2180, 2214, 2248, 2283, 2291, 2299, 2333, - 2368, 2407, 2434, 2460, 2486, 2512, 2537, 2562, - 2563, 2590, 2617, 2644, 2652, 2679, 2711, 2743, - 2775, 2807, 2841, 2873, 2907, 2941, 2975, 3010, - 3018, 3052, 3058, 3060, 3099, 3120, 3141, 3145, - 3176, 3207, 0 -}; - -static const short _use_syllable_machine_indicies[] = { - 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 6, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 30, 34, 3, 35, 3, 36, - 38, 39, 37, 40, 37, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 38, 50, - 51, 52, 53, 54, 55, 56, 57, 58, - 37, 59, 60, 61, 62, 59, 37, 37, - 37, 37, 63, 38, 39, 37, 40, 37, - 41, 42, 43, 44, 45, 46, 47, 48, - 49, 38, 50, 51, 52, 53, 54, 55, - 56, 37, 37, 37, 59, 60, 61, 62, - 59, 37, 37, 37, 37, 63, 38, 37, - 37, 37, 37, 37, 37, 40, 37, 37, - 42, 43, 44, 45, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 54, 55, 56, - 37, 37, 37, 37, 60, 61, 62, 64, - 37, 37, 37, 37, 42, 40, 37, 37, - 42, 43, 44, 45, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 54, 55, 56, - 37, 37, 37, 37, 60, 61, 62, 64, - 40, 37, 37, 37, 43, 44, 45, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 60, - 61, 62, 40, 37, 37, 37, 37, 44, - 45, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 60, 61, 62, 40, 37, 37, 37, - 37, 37, 45, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 60, 61, 62, 40, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 60, 61, 40, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 61, - 40, 40, 37, 37, 37, 43, 44, 45, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 54, 55, 56, 37, 37, 37, 37, - 60, 61, 62, 64, 40, 37, 37, 37, - 43, 44, 45, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 55, 56, 37, - 37, 37, 37, 60, 61, 62, 64, 40, - 37, 37, 37, 43, 44, 45, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 56, 37, 37, 37, 37, 60, 61, - 62, 64, 65, 37, 37, 37, 37, 37, - 37, 40, 40, 37, 37, 37, 43, 44, - 45, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 60, 61, 62, 64, 40, 37, 41, - 42, 43, 44, 45, 37, 37, 37, 37, - 37, 37, 51, 52, 53, 54, 55, 56, - 37, 37, 37, 37, 60, 61, 62, 64, - 37, 37, 37, 37, 42, 40, 37, 37, - 42, 43, 44, 45, 37, 37, 37, 37, - 37, 37, 51, 52, 53, 54, 55, 56, - 37, 37, 37, 37, 60, 61, 62, 64, - 37, 37, 37, 37, 42, 40, 37, 37, - 42, 43, 44, 45, 37, 37, 37, 37, - 37, 37, 37, 52, 53, 54, 55, 56, - 37, 37, 37, 37, 60, 61, 62, 64, - 37, 37, 37, 37, 42, 40, 37, 37, - 42, 43, 44, 45, 37, 37, 37, 37, - 37, 37, 37, 37, 53, 54, 55, 56, - 37, 37, 37, 37, 60, 61, 62, 64, - 37, 37, 37, 37, 42, 66, 37, 40, - 37, 41, 42, 43, 44, 45, 37, 47, - 48, 37, 37, 37, 51, 52, 53, 54, - 55, 56, 37, 37, 37, 37, 60, 61, - 62, 64, 37, 37, 37, 37, 42, 40, - 37, 37, 42, 43, 44, 45, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 54, - 55, 56, 37, 37, 37, 37, 60, 61, - 62, 64, 37, 37, 37, 37, 42, 66, - 37, 40, 37, 41, 42, 43, 44, 45, - 37, 37, 48, 37, 37, 37, 51, 52, - 53, 54, 55, 56, 37, 37, 37, 37, - 60, 61, 62, 64, 37, 37, 37, 37, - 42, 66, 37, 40, 37, 41, 42, 43, - 44, 45, 37, 37, 37, 37, 37, 37, - 51, 52, 53, 54, 55, 56, 37, 37, - 37, 37, 60, 61, 62, 64, 37, 37, - 37, 37, 42, 66, 37, 40, 37, 41, - 42, 43, 44, 45, 46, 47, 48, 37, - 37, 37, 51, 52, 53, 54, 55, 56, - 37, 37, 37, 37, 60, 61, 62, 64, - 37, 37, 37, 37, 42, 38, 39, 37, - 40, 37, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 37, 50, 51, 52, 53, - 54, 55, 56, 37, 37, 37, 59, 60, - 61, 62, 59, 37, 37, 37, 37, 63, - 38, 37, 37, 37, 37, 37, 37, 40, - 38, 37, 37, 37, 37, 37, 37, 40, - 37, 37, 42, 43, 44, 45, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 54, - 55, 56, 37, 37, 37, 37, 60, 61, - 62, 64, 40, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 57, 58, 40, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 58, 2, 68, 67, 69, - 67, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 2, 79, 80, 81, 82, 83, - 84, 85, 67, 67, 67, 86, 87, 88, - 89, 90, 67, 67, 67, 67, 91, 2, - 67, 67, 67, 67, 67, 67, 69, 67, - 67, 71, 72, 73, 74, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 83, 84, - 85, 67, 67, 67, 67, 87, 88, 89, - 92, 67, 67, 67, 67, 71, 69, 67, - 67, 71, 72, 73, 74, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 83, 84, - 85, 67, 67, 67, 67, 87, 88, 89, - 92, 69, 67, 67, 67, 72, 73, 74, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 87, 88, 89, 69, 67, 67, 67, 67, - 73, 74, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 87, 88, 89, 69, 67, 67, - 67, 67, 67, 74, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 87, 88, 89, 69, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 87, 88, - 69, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 88, 69, 69, 67, 67, 67, 72, 73, - 74, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 83, 84, 85, 67, 67, 67, - 67, 87, 88, 89, 92, 69, 67, 67, - 67, 72, 73, 74, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 84, 85, - 67, 67, 67, 67, 87, 88, 89, 92, - 69, 67, 67, 67, 72, 73, 74, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 85, 67, 67, 67, 67, 87, - 88, 89, 92, 94, 93, 93, 93, 93, - 93, 93, 95, 69, 67, 67, 67, 72, - 73, 74, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 87, 88, 89, 92, 69, 67, - 70, 71, 72, 73, 74, 67, 67, 67, - 67, 67, 67, 80, 81, 82, 83, 84, - 85, 67, 67, 67, 67, 87, 88, 89, - 92, 67, 67, 67, 67, 71, 69, 67, - 67, 71, 72, 73, 74, 67, 67, 67, - 67, 67, 67, 80, 81, 82, 83, 84, - 85, 67, 67, 67, 67, 87, 88, 89, - 92, 67, 67, 67, 67, 71, 69, 67, - 67, 71, 72, 73, 74, 67, 67, 67, - 67, 67, 67, 67, 81, 82, 83, 84, - 85, 67, 67, 67, 67, 87, 88, 89, - 92, 67, 67, 67, 67, 71, 69, 67, - 67, 71, 72, 73, 74, 67, 67, 67, - 67, 67, 67, 67, 67, 82, 83, 84, - 85, 67, 67, 67, 67, 87, 88, 89, - 92, 67, 67, 67, 67, 71, 96, 67, - 69, 67, 70, 71, 72, 73, 74, 67, - 76, 77, 67, 67, 67, 80, 81, 82, - 83, 84, 85, 67, 67, 67, 67, 87, - 88, 89, 92, 67, 67, 67, 67, 71, - 69, 67, 67, 71, 72, 73, 74, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 83, 84, 85, 67, 67, 67, 67, 87, - 88, 89, 92, 67, 67, 67, 67, 71, - 96, 67, 69, 67, 70, 71, 72, 73, - 74, 67, 67, 77, 67, 67, 67, 80, - 81, 82, 83, 84, 85, 67, 67, 67, - 67, 87, 88, 89, 92, 67, 67, 67, - 67, 71, 96, 67, 69, 67, 70, 71, - 72, 73, 74, 67, 67, 67, 67, 67, - 67, 80, 81, 82, 83, 84, 85, 67, - 67, 67, 67, 87, 88, 89, 92, 67, - 67, 67, 67, 71, 96, 67, 69, 67, - 70, 71, 72, 73, 74, 75, 76, 77, - 67, 67, 67, 80, 81, 82, 83, 84, - 85, 67, 67, 67, 67, 87, 88, 89, - 92, 67, 67, 67, 67, 71, 2, 68, - 67, 69, 67, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 67, 79, 80, 81, - 82, 83, 84, 85, 67, 67, 67, 86, - 87, 88, 89, 90, 67, 67, 67, 67, - 91, 2, 97, 97, 97, 97, 97, 97, - 98, 2, 93, 93, 93, 93, 93, 93, - 95, 2, 67, 67, 67, 67, 67, 67, - 69, 67, 67, 71, 72, 73, 74, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 83, 84, 85, 67, 67, 67, 67, 87, - 88, 89, 92, 100, 101, 4, 102, 102, - 102, 102, 103, 104, 105, 67, 69, 67, - 106, 107, 108, 109, 110, 111, 112, 113, - 114, 104, 115, 116, 117, 118, 119, 120, - 121, 57, 58, 67, 122, 123, 124, 125, - 126, 67, 67, 67, 67, 127, 104, 105, - 67, 69, 67, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 104, 115, 116, 117, - 118, 119, 120, 121, 67, 67, 67, 122, - 123, 124, 125, 126, 67, 67, 67, 67, - 127, 104, 67, 67, 67, 67, 67, 67, - 69, 67, 67, 107, 108, 109, 110, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 119, 120, 121, 67, 67, 67, 67, 123, - 124, 125, 128, 67, 67, 67, 67, 107, - 69, 67, 67, 107, 108, 109, 110, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 119, 120, 121, 67, 67, 67, 67, 123, - 124, 125, 128, 69, 67, 67, 67, 108, - 109, 110, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 123, 124, 125, 69, 67, 67, - 67, 67, 109, 110, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 123, 124, 125, 69, - 67, 67, 67, 67, 67, 110, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 123, 124, - 125, 69, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 123, 124, 69, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 124, 69, 69, 67, 67, 67, - 108, 109, 110, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 119, 120, 121, 67, - 67, 67, 67, 123, 124, 125, 128, 69, - 67, 67, 67, 108, 109, 110, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 120, 121, 67, 67, 67, 67, 123, 124, - 125, 128, 69, 67, 67, 67, 108, 109, - 110, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 121, 67, 67, 67, - 67, 123, 124, 125, 128, 129, 93, 93, - 93, 93, 93, 93, 95, 69, 67, 67, - 67, 108, 109, 110, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 123, 124, 125, 128, - 69, 67, 106, 107, 108, 109, 110, 67, - 67, 67, 67, 67, 67, 116, 117, 118, - 119, 120, 121, 67, 67, 67, 67, 123, - 124, 125, 128, 67, 67, 67, 67, 107, - 69, 67, 67, 107, 108, 109, 110, 67, - 67, 67, 67, 67, 67, 116, 117, 118, - 119, 120, 121, 67, 67, 67, 67, 123, - 124, 125, 128, 67, 67, 67, 67, 107, - 69, 67, 67, 107, 108, 109, 110, 67, - 67, 67, 67, 67, 67, 67, 117, 118, - 119, 120, 121, 67, 67, 67, 67, 123, - 124, 125, 128, 67, 67, 67, 67, 107, - 69, 67, 67, 107, 108, 109, 110, 67, - 67, 67, 67, 67, 67, 67, 67, 118, - 119, 120, 121, 67, 67, 67, 67, 123, - 124, 125, 128, 67, 67, 67, 67, 107, - 130, 67, 69, 67, 106, 107, 108, 109, - 110, 67, 112, 113, 67, 67, 67, 116, - 117, 118, 119, 120, 121, 67, 67, 67, - 67, 123, 124, 125, 128, 67, 67, 67, - 67, 107, 69, 67, 67, 107, 108, 109, - 110, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 119, 120, 121, 67, 67, 67, - 67, 123, 124, 125, 128, 67, 67, 67, - 67, 107, 130, 67, 69, 67, 106, 107, - 108, 109, 110, 67, 67, 113, 67, 67, - 67, 116, 117, 118, 119, 120, 121, 67, - 67, 67, 67, 123, 124, 125, 128, 67, - 67, 67, 67, 107, 130, 67, 69, 67, - 106, 107, 108, 109, 110, 67, 67, 67, - 67, 67, 67, 116, 117, 118, 119, 120, - 121, 67, 67, 67, 67, 123, 124, 125, - 128, 67, 67, 67, 67, 107, 130, 67, - 69, 67, 106, 107, 108, 109, 110, 111, - 112, 113, 67, 67, 67, 116, 117, 118, - 119, 120, 121, 67, 67, 67, 67, 123, - 124, 125, 128, 67, 67, 67, 67, 107, - 104, 105, 67, 69, 67, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 67, 115, - 116, 117, 118, 119, 120, 121, 67, 67, - 67, 122, 123, 124, 125, 126, 67, 67, - 67, 67, 127, 104, 97, 97, 97, 97, - 97, 97, 98, 104, 93, 93, 93, 93, - 93, 93, 95, 104, 67, 67, 67, 67, - 67, 67, 69, 67, 67, 107, 108, 109, - 110, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 119, 120, 121, 67, 67, 67, - 67, 123, 124, 125, 128, 6, 7, 131, - 9, 131, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 6, 20, 21, 22, 23, - 24, 25, 26, 131, 131, 131, 30, 31, - 32, 33, 30, 131, 131, 131, 131, 36, - 6, 131, 131, 131, 131, 131, 131, 9, - 131, 131, 12, 13, 14, 15, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 24, - 25, 26, 131, 131, 131, 131, 31, 32, - 33, 132, 131, 131, 131, 131, 12, 9, - 131, 131, 12, 13, 14, 15, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 24, - 25, 26, 131, 131, 131, 131, 31, 32, - 33, 132, 9, 131, 131, 131, 13, 14, - 15, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 31, 32, 33, 9, 131, 131, 131, - 131, 14, 15, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 31, 32, 33, 9, 131, - 131, 131, 131, 131, 15, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 31, 32, 33, - 9, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 31, - 32, 9, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 32, 9, 9, 131, 131, 131, 13, - 14, 15, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 24, 25, 26, 131, 131, - 131, 131, 31, 32, 33, 132, 9, 131, - 131, 131, 13, 14, 15, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 25, - 26, 131, 131, 131, 131, 31, 32, 33, - 132, 9, 131, 131, 131, 13, 14, 15, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 26, 131, 131, 131, 131, - 31, 32, 33, 132, 133, 131, 131, 131, - 131, 131, 131, 9, 9, 131, 131, 131, - 13, 14, 15, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 31, 32, 33, 132, 9, - 131, 11, 12, 13, 14, 15, 131, 131, - 131, 131, 131, 131, 21, 22, 23, 24, - 25, 26, 131, 131, 131, 131, 31, 32, - 33, 132, 131, 131, 131, 131, 12, 9, - 131, 131, 12, 13, 14, 15, 131, 131, - 131, 131, 131, 131, 21, 22, 23, 24, - 25, 26, 131, 131, 131, 131, 31, 32, - 33, 132, 131, 131, 131, 131, 12, 9, - 131, 131, 12, 13, 14, 15, 131, 131, - 131, 131, 131, 131, 131, 22, 23, 24, - 25, 26, 131, 131, 131, 131, 31, 32, - 33, 132, 131, 131, 131, 131, 12, 9, - 131, 131, 12, 13, 14, 15, 131, 131, - 131, 131, 131, 131, 131, 131, 23, 24, - 25, 26, 131, 131, 131, 131, 31, 32, - 33, 132, 131, 131, 131, 131, 12, 134, - 131, 9, 131, 11, 12, 13, 14, 15, - 131, 17, 18, 131, 131, 131, 21, 22, - 23, 24, 25, 26, 131, 131, 131, 131, - 31, 32, 33, 132, 131, 131, 131, 131, - 12, 9, 131, 131, 12, 13, 14, 15, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 24, 25, 26, 131, 131, 131, 131, - 31, 32, 33, 132, 131, 131, 131, 131, - 12, 134, 131, 9, 131, 11, 12, 13, - 14, 15, 131, 131, 18, 131, 131, 131, - 21, 22, 23, 24, 25, 26, 131, 131, - 131, 131, 31, 32, 33, 132, 131, 131, - 131, 131, 12, 134, 131, 9, 131, 11, - 12, 13, 14, 15, 131, 131, 131, 131, - 131, 131, 21, 22, 23, 24, 25, 26, - 131, 131, 131, 131, 31, 32, 33, 132, - 131, 131, 131, 131, 12, 134, 131, 9, - 131, 11, 12, 13, 14, 15, 16, 17, - 18, 131, 131, 131, 21, 22, 23, 24, - 25, 26, 131, 131, 131, 131, 31, 32, - 33, 132, 131, 131, 131, 131, 12, 6, - 7, 131, 9, 131, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 131, 20, 21, - 22, 23, 24, 25, 26, 131, 131, 131, - 30, 31, 32, 33, 30, 131, 131, 131, - 131, 36, 6, 131, 131, 131, 131, 131, - 131, 9, 6, 131, 131, 131, 131, 131, - 131, 9, 131, 131, 12, 13, 14, 15, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 24, 25, 26, 131, 131, 131, 131, - 31, 32, 33, 132, 135, 131, 131, 131, - 131, 9, 8, 9, 2, 131, 131, 2, - 6, 7, 8, 9, 131, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 6, 20, - 21, 22, 23, 24, 25, 26, 27, 28, - 131, 30, 31, 32, 33, 30, 131, 131, - 131, 131, 36, 9, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 27, 28, - 9, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 28, 2, 136, 136, - 2, 138, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 139, 137, 34, - 138, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 34, 139, 137, 139, 138, - 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 34, 137, 35, 0 + 0, 55, 99, 143, 197, 233, 268, 303, + 338, 372, 406, 408, 444, 480, 516, 531, + 567, 608, 649, 690, 731, 774, 815, 858, + 901, 944, 988, 1003, 1052, 1082, 1112, 1156, + 1210, 1246, 1281, 1316, 1351, 1385, 1419, 1421, + 1457, 1493, 1529, 1544, 1580, 1621, 1662, 1703, + 1744, 1787, 1828, 1871, 1914, 1957, 2001, 2016, + 2031, 2080, 2083, 2095, 2139, 2183, 2237, 2273, + 2308, 2343, 2378, 2412, 2446, 2448, 2484, 2520, + 2556, 2571, 2607, 2648, 2689, 2730, 2771, 2814, + 2855, 2898, 2941, 2984, 3028, 3043, 3058, 3107, + 3151, 3205, 3241, 3276, 3311, 3346, 3380, 3414, + 3416, 3452, 3488, 3524, 3539, 3575, 3616, 3657, + 3698, 3739, 3782, 3823, 3866, 3909, 3952, 3996, + 4011, 4060, 4072, 4075, 4129, 4159, 4189, 4195, + 4235, 4275 }; -static const short _use_syllable_machine_index_defaults[] = { - 3, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 93, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 97, 93, - 67, 99, 102, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 93, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 97, 93, 67, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 136, 137, - 137, 137, 0 +static const unsigned char _use_syllable_machine_indicies[] = { + 0, 1, 2, 2, 3, 4, 2, 2, + 2, 2, 2, 5, 6, 7, 8, 2, + 2, 2, 9, 2, 2, 2, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 5, + 19, 20, 21, 22, 2, 23, 24, 25, + 2, 26, 27, 28, 29, 30, 31, 32, + 29, 33, 2, 34, 2, 35, 2, 37, + 38, 36, 39, 36, 36, 36, 36, 36, + 36, 36, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 37, 49, 50, 51, 52, + 36, 53, 54, 55, 36, 56, 57, 36, + 58, 59, 60, 61, 58, 36, 36, 36, + 36, 62, 36, 37, 38, 36, 39, 36, + 36, 36, 36, 36, 36, 36, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 37, + 49, 50, 51, 52, 36, 53, 54, 55, + 36, 36, 36, 36, 58, 59, 60, 61, + 58, 36, 36, 36, 36, 62, 36, 37, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 39, 36, 36, 36, + 36, 36, 36, 36, 36, 41, 42, 43, + 44, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 53, 54, 55, 36, 36, + 36, 36, 36, 59, 60, 61, 63, 36, + 36, 36, 36, 41, 36, 39, 36, 36, + 36, 36, 36, 36, 36, 36, 41, 42, + 43, 44, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 53, 54, 55, 36, + 36, 36, 36, 36, 59, 60, 61, 63, + 36, 39, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 42, 43, 44, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 59, 60, 61, 36, 39, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 43, + 44, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 59, 60, 61, 36, 39, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 44, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 59, 60, + 61, 36, 39, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 59, 60, 36, 39, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 60, 36, 39, 36, + 39, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 42, 43, 44, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 53, + 54, 55, 36, 36, 36, 36, 36, 59, + 60, 61, 63, 36, 39, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 42, 43, + 44, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 54, 55, 36, 36, + 36, 36, 36, 59, 60, 61, 63, 36, + 39, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 42, 43, 44, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 55, 36, 36, 36, 36, 36, 59, + 60, 61, 63, 36, 64, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 39, 36, 39, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 42, 43, 44, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 59, 60, 61, 63, 36, 39, + 36, 36, 36, 36, 36, 36, 36, 40, + 41, 42, 43, 44, 36, 36, 36, 36, + 36, 36, 50, 51, 52, 36, 53, 54, + 55, 36, 36, 36, 36, 36, 59, 60, + 61, 63, 36, 36, 36, 36, 41, 36, + 39, 36, 36, 36, 36, 36, 36, 36, + 36, 41, 42, 43, 44, 36, 36, 36, + 36, 36, 36, 50, 51, 52, 36, 53, + 54, 55, 36, 36, 36, 36, 36, 59, + 60, 61, 63, 36, 36, 36, 36, 41, + 36, 39, 36, 36, 36, 36, 36, 36, + 36, 36, 41, 42, 43, 44, 36, 36, + 36, 36, 36, 36, 36, 51, 52, 36, + 53, 54, 55, 36, 36, 36, 36, 36, + 59, 60, 61, 63, 36, 36, 36, 36, + 41, 36, 39, 36, 36, 36, 36, 36, + 36, 36, 36, 41, 42, 43, 44, 36, + 36, 36, 36, 36, 36, 36, 36, 52, + 36, 53, 54, 55, 36, 36, 36, 36, + 36, 59, 60, 61, 63, 36, 36, 36, + 36, 41, 36, 65, 36, 39, 36, 36, + 36, 36, 36, 36, 36, 40, 41, 42, + 43, 44, 36, 46, 47, 36, 36, 36, + 50, 51, 52, 36, 53, 54, 55, 36, + 36, 36, 36, 36, 59, 60, 61, 63, + 36, 36, 36, 36, 41, 36, 39, 36, + 36, 36, 36, 36, 36, 36, 36, 41, + 42, 43, 44, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 53, 54, 55, + 36, 36, 36, 36, 36, 59, 60, 61, + 63, 36, 36, 36, 36, 41, 36, 65, + 36, 39, 36, 36, 36, 36, 36, 36, + 36, 40, 41, 42, 43, 44, 36, 36, + 47, 36, 36, 36, 50, 51, 52, 36, + 53, 54, 55, 36, 36, 36, 36, 36, + 59, 60, 61, 63, 36, 36, 36, 36, + 41, 36, 65, 36, 39, 36, 36, 36, + 36, 36, 36, 36, 40, 41, 42, 43, + 44, 36, 36, 36, 36, 36, 36, 50, + 51, 52, 36, 53, 54, 55, 36, 36, + 36, 36, 36, 59, 60, 61, 63, 36, + 36, 36, 36, 41, 36, 65, 36, 39, + 36, 36, 36, 36, 36, 36, 36, 40, + 41, 42, 43, 44, 45, 46, 47, 36, + 36, 36, 50, 51, 52, 36, 53, 54, + 55, 36, 36, 36, 36, 36, 59, 60, + 61, 63, 36, 36, 36, 36, 41, 36, + 37, 38, 36, 39, 36, 36, 36, 36, + 36, 36, 36, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 36, 49, 50, 51, + 52, 36, 53, 54, 55, 36, 36, 36, + 36, 58, 59, 60, 61, 58, 36, 36, + 36, 36, 62, 36, 37, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 39, 36, 37, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 39, 36, 36, 36, 36, 36, 36, 36, + 36, 41, 42, 43, 44, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 53, + 54, 55, 36, 36, 36, 36, 36, 59, + 60, 61, 63, 36, 39, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 56, + 57, 36, 39, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 57, 36, + 1, 67, 66, 68, 66, 66, 66, 66, + 66, 66, 66, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 1, 78, 79, 80, + 81, 66, 82, 83, 84, 66, 66, 66, + 66, 85, 86, 87, 88, 89, 66, 66, + 66, 66, 90, 66, 1, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 68, 66, 66, 66, 66, 66, 66, + 66, 66, 70, 71, 72, 73, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 82, 83, 84, 66, 66, 66, 66, 66, + 86, 87, 88, 91, 66, 66, 66, 66, + 70, 66, 68, 66, 66, 66, 66, 66, + 66, 66, 66, 70, 71, 72, 73, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 82, 83, 84, 66, 66, 66, 66, + 66, 86, 87, 88, 91, 66, 68, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 71, 72, 73, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 86, 87, 88, + 66, 68, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 72, 73, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 86, 87, 88, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 73, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 86, 87, 88, 66, 68, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 86, 87, + 66, 68, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 87, 66, 68, 66, 68, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 71, + 72, 73, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 82, 83, 84, 66, + 66, 66, 66, 66, 86, 87, 88, 91, + 66, 68, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 71, 72, 73, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 83, 84, 66, 66, 66, 66, 66, + 86, 87, 88, 91, 66, 68, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 71, + 72, 73, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 84, 66, + 66, 66, 66, 66, 86, 87, 88, 91, + 66, 93, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 94, 92, + 68, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 71, 72, 73, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 86, + 87, 88, 91, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 69, 70, 71, 72, + 73, 66, 66, 66, 66, 66, 66, 79, + 80, 81, 66, 82, 83, 84, 66, 66, + 66, 66, 66, 86, 87, 88, 91, 66, + 66, 66, 66, 70, 66, 68, 66, 66, + 66, 66, 66, 66, 66, 66, 70, 71, + 72, 73, 66, 66, 66, 66, 66, 66, + 79, 80, 81, 66, 82, 83, 84, 66, + 66, 66, 66, 66, 86, 87, 88, 91, + 66, 66, 66, 66, 70, 66, 68, 66, + 66, 66, 66, 66, 66, 66, 66, 70, + 71, 72, 73, 66, 66, 66, 66, 66, + 66, 66, 80, 81, 66, 82, 83, 84, + 66, 66, 66, 66, 66, 86, 87, 88, + 91, 66, 66, 66, 66, 70, 66, 68, + 66, 66, 66, 66, 66, 66, 66, 66, + 70, 71, 72, 73, 66, 66, 66, 66, + 66, 66, 66, 66, 81, 66, 82, 83, + 84, 66, 66, 66, 66, 66, 86, 87, + 88, 91, 66, 66, 66, 66, 70, 66, + 95, 66, 68, 66, 66, 66, 66, 66, + 66, 66, 69, 70, 71, 72, 73, 66, + 75, 76, 66, 66, 66, 79, 80, 81, + 66, 82, 83, 84, 66, 66, 66, 66, + 66, 86, 87, 88, 91, 66, 66, 66, + 66, 70, 66, 68, 66, 66, 66, 66, + 66, 66, 66, 66, 70, 71, 72, 73, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 82, 83, 84, 66, 66, 66, + 66, 66, 86, 87, 88, 91, 66, 66, + 66, 66, 70, 66, 95, 66, 68, 66, + 66, 66, 66, 66, 66, 66, 69, 70, + 71, 72, 73, 66, 66, 76, 66, 66, + 66, 79, 80, 81, 66, 82, 83, 84, + 66, 66, 66, 66, 66, 86, 87, 88, + 91, 66, 66, 66, 66, 70, 66, 95, + 66, 68, 66, 66, 66, 66, 66, 66, + 66, 69, 70, 71, 72, 73, 66, 66, + 66, 66, 66, 66, 79, 80, 81, 66, + 82, 83, 84, 66, 66, 66, 66, 66, + 86, 87, 88, 91, 66, 66, 66, 66, + 70, 66, 95, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 69, 70, 71, 72, + 73, 74, 75, 76, 66, 66, 66, 79, + 80, 81, 66, 82, 83, 84, 66, 66, + 66, 66, 66, 86, 87, 88, 91, 66, + 66, 66, 66, 70, 66, 1, 67, 66, + 68, 66, 66, 66, 66, 66, 66, 66, + 69, 70, 71, 72, 73, 74, 75, 76, + 77, 66, 78, 79, 80, 81, 66, 82, + 83, 84, 66, 66, 66, 66, 85, 86, + 87, 88, 89, 66, 66, 66, 66, 90, + 66, 1, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 97, 96, + 1, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 94, 92, 1, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 66, 70, 71, 72, + 73, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 82, 83, 84, 66, 66, + 66, 66, 66, 86, 87, 88, 91, 66, + 99, 100, 98, 3, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 102, 101, 103, + 104, 66, 68, 66, 66, 66, 66, 66, + 66, 66, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 103, 114, 115, 116, 117, + 66, 118, 119, 120, 66, 56, 57, 66, + 121, 122, 123, 124, 125, 66, 66, 66, + 66, 126, 66, 103, 104, 66, 68, 66, + 66, 66, 66, 66, 66, 66, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 103, + 114, 115, 116, 117, 66, 118, 119, 120, + 66, 66, 66, 66, 121, 122, 123, 124, + 125, 66, 66, 66, 66, 126, 66, 103, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 66, 106, 107, 108, + 109, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 118, 119, 120, 66, 66, + 66, 66, 66, 122, 123, 124, 127, 66, + 66, 66, 66, 106, 66, 68, 66, 66, + 66, 66, 66, 66, 66, 66, 106, 107, + 108, 109, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 118, 119, 120, 66, + 66, 66, 66, 66, 122, 123, 124, 127, + 66, 68, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 107, 108, 109, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 122, 123, 124, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 108, + 109, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 122, 123, 124, 66, 68, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 109, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 122, 123, + 124, 66, 68, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 122, 123, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 123, 66, 68, 66, + 68, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 107, 108, 109, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 118, + 119, 120, 66, 66, 66, 66, 66, 122, + 123, 124, 127, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 107, 108, + 109, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 119, 120, 66, 66, + 66, 66, 66, 122, 123, 124, 127, 66, + 68, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 107, 108, 109, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 120, 66, 66, 66, 66, 66, 122, + 123, 124, 127, 66, 128, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, + 92, 94, 92, 68, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 107, 108, 109, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 122, 123, 124, 127, 66, 68, + 66, 66, 66, 66, 66, 66, 66, 105, + 106, 107, 108, 109, 66, 66, 66, 66, + 66, 66, 115, 116, 117, 66, 118, 119, + 120, 66, 66, 66, 66, 66, 122, 123, + 124, 127, 66, 66, 66, 66, 106, 66, + 68, 66, 66, 66, 66, 66, 66, 66, + 66, 106, 107, 108, 109, 66, 66, 66, + 66, 66, 66, 115, 116, 117, 66, 118, + 119, 120, 66, 66, 66, 66, 66, 122, + 123, 124, 127, 66, 66, 66, 66, 106, + 66, 68, 66, 66, 66, 66, 66, 66, + 66, 66, 106, 107, 108, 109, 66, 66, + 66, 66, 66, 66, 66, 116, 117, 66, + 118, 119, 120, 66, 66, 66, 66, 66, + 122, 123, 124, 127, 66, 66, 66, 66, + 106, 66, 68, 66, 66, 66, 66, 66, + 66, 66, 66, 106, 107, 108, 109, 66, + 66, 66, 66, 66, 66, 66, 66, 117, + 66, 118, 119, 120, 66, 66, 66, 66, + 66, 122, 123, 124, 127, 66, 66, 66, + 66, 106, 66, 129, 66, 68, 66, 66, + 66, 66, 66, 66, 66, 105, 106, 107, + 108, 109, 66, 111, 112, 66, 66, 66, + 115, 116, 117, 66, 118, 119, 120, 66, + 66, 66, 66, 66, 122, 123, 124, 127, + 66, 66, 66, 66, 106, 66, 68, 66, + 66, 66, 66, 66, 66, 66, 66, 106, + 107, 108, 109, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 118, 119, 120, + 66, 66, 66, 66, 66, 122, 123, 124, + 127, 66, 66, 66, 66, 106, 66, 129, + 66, 68, 66, 66, 66, 66, 66, 66, + 66, 105, 106, 107, 108, 109, 66, 66, + 112, 66, 66, 66, 115, 116, 117, 66, + 118, 119, 120, 66, 66, 66, 66, 66, + 122, 123, 124, 127, 66, 66, 66, 66, + 106, 66, 129, 66, 68, 66, 66, 66, + 66, 66, 66, 66, 105, 106, 107, 108, + 109, 66, 66, 66, 66, 66, 66, 115, + 116, 117, 66, 118, 119, 120, 66, 66, + 66, 66, 66, 122, 123, 124, 127, 66, + 66, 66, 66, 106, 66, 129, 66, 68, + 66, 66, 66, 66, 66, 66, 66, 105, + 106, 107, 108, 109, 110, 111, 112, 66, + 66, 66, 115, 116, 117, 66, 118, 119, + 120, 66, 66, 66, 66, 66, 122, 123, + 124, 127, 66, 66, 66, 66, 106, 66, + 103, 104, 66, 68, 66, 66, 66, 66, + 66, 66, 66, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 66, 114, 115, 116, + 117, 66, 118, 119, 120, 66, 66, 66, + 66, 121, 122, 123, 124, 125, 66, 66, + 66, 66, 126, 66, 103, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 97, 96, 103, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 92, + 94, 92, 103, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 68, + 66, 66, 66, 66, 66, 66, 66, 66, + 106, 107, 108, 109, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 118, 119, + 120, 66, 66, 66, 66, 66, 122, 123, + 124, 127, 66, 5, 6, 130, 8, 130, + 130, 130, 130, 130, 130, 130, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 5, + 19, 20, 21, 22, 130, 23, 24, 25, + 130, 130, 130, 130, 29, 30, 31, 32, + 29, 130, 130, 130, 130, 35, 130, 5, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 8, 130, 130, 130, + 130, 130, 130, 130, 130, 11, 12, 13, + 14, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 23, 24, 25, 130, 130, + 130, 130, 130, 30, 31, 32, 131, 130, + 130, 130, 130, 11, 130, 8, 130, 130, + 130, 130, 130, 130, 130, 130, 11, 12, + 13, 14, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 23, 24, 25, 130, + 130, 130, 130, 130, 30, 31, 32, 131, + 130, 8, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 12, 13, 14, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 30, 31, 32, 130, 8, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 13, + 14, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 30, 31, 32, 130, 8, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 14, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 30, 31, + 32, 130, 8, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 30, 31, 130, 8, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 31, 130, 8, 130, + 8, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 12, 13, 14, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 23, + 24, 25, 130, 130, 130, 130, 130, 30, + 31, 32, 131, 130, 8, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 12, 13, + 14, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 24, 25, 130, 130, + 130, 130, 130, 30, 31, 32, 131, 130, + 8, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 12, 13, 14, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 25, 130, 130, 130, 130, 130, 30, + 31, 32, 131, 130, 132, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 8, 130, 8, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 12, 13, 14, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 30, 31, 32, 131, 130, 8, + 130, 130, 130, 130, 130, 130, 130, 10, + 11, 12, 13, 14, 130, 130, 130, 130, + 130, 130, 20, 21, 22, 130, 23, 24, + 25, 130, 130, 130, 130, 130, 30, 31, + 32, 131, 130, 130, 130, 130, 11, 130, + 8, 130, 130, 130, 130, 130, 130, 130, + 130, 11, 12, 13, 14, 130, 130, 130, + 130, 130, 130, 20, 21, 22, 130, 23, + 24, 25, 130, 130, 130, 130, 130, 30, + 31, 32, 131, 130, 130, 130, 130, 11, + 130, 8, 130, 130, 130, 130, 130, 130, + 130, 130, 11, 12, 13, 14, 130, 130, + 130, 130, 130, 130, 130, 21, 22, 130, + 23, 24, 25, 130, 130, 130, 130, 130, + 30, 31, 32, 131, 130, 130, 130, 130, + 11, 130, 8, 130, 130, 130, 130, 130, + 130, 130, 130, 11, 12, 13, 14, 130, + 130, 130, 130, 130, 130, 130, 130, 22, + 130, 23, 24, 25, 130, 130, 130, 130, + 130, 30, 31, 32, 131, 130, 130, 130, + 130, 11, 130, 133, 130, 8, 130, 130, + 130, 130, 130, 130, 130, 10, 11, 12, + 13, 14, 130, 16, 17, 130, 130, 130, + 20, 21, 22, 130, 23, 24, 25, 130, + 130, 130, 130, 130, 30, 31, 32, 131, + 130, 130, 130, 130, 11, 130, 8, 130, + 130, 130, 130, 130, 130, 130, 130, 11, + 12, 13, 14, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 23, 24, 25, + 130, 130, 130, 130, 130, 30, 31, 32, + 131, 130, 130, 130, 130, 11, 130, 133, + 130, 8, 130, 130, 130, 130, 130, 130, + 130, 10, 11, 12, 13, 14, 130, 130, + 17, 130, 130, 130, 20, 21, 22, 130, + 23, 24, 25, 130, 130, 130, 130, 130, + 30, 31, 32, 131, 130, 130, 130, 130, + 11, 130, 133, 130, 8, 130, 130, 130, + 130, 130, 130, 130, 10, 11, 12, 13, + 14, 130, 130, 130, 130, 130, 130, 20, + 21, 22, 130, 23, 24, 25, 130, 130, + 130, 130, 130, 30, 31, 32, 131, 130, + 130, 130, 130, 11, 130, 133, 130, 8, + 130, 130, 130, 130, 130, 130, 130, 10, + 11, 12, 13, 14, 15, 16, 17, 130, + 130, 130, 20, 21, 22, 130, 23, 24, + 25, 130, 130, 130, 130, 130, 30, 31, + 32, 131, 130, 130, 130, 130, 11, 130, + 5, 6, 130, 8, 130, 130, 130, 130, + 130, 130, 130, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 130, 19, 20, 21, + 22, 130, 23, 24, 25, 130, 130, 130, + 130, 29, 30, 31, 32, 29, 130, 130, + 130, 130, 35, 130, 5, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 8, 130, 5, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 8, 130, 130, 130, 130, 130, 130, 130, + 130, 11, 12, 13, 14, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 23, + 24, 25, 130, 130, 130, 130, 130, 30, + 31, 32, 131, 130, 134, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 8, 130, + 7, 8, 130, 1, 130, 130, 130, 1, + 130, 130, 130, 130, 130, 5, 6, 7, + 8, 130, 130, 130, 130, 130, 130, 130, + 10, 11, 12, 13, 14, 15, 16, 17, + 18, 5, 19, 20, 21, 22, 130, 23, + 24, 25, 130, 26, 27, 130, 29, 30, + 31, 32, 29, 130, 130, 130, 130, 35, + 130, 8, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 26, 27, 130, 8, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 27, 130, 1, 135, 135, + 135, 1, 135, 137, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 138, + 136, 33, 136, 137, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 33, 138, + 136, 138, 136, 137, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 136, 33, 136, + 34, 136, 0 }; -static const signed char _use_syllable_machine_cond_targs[] = { - 0, 1, 30, 0, 57, 59, 87, 88, - 113, 0, 115, 101, 89, 90, 91, 92, - 105, 107, 108, 109, 110, 102, 103, 104, - 96, 97, 98, 116, 117, 118, 111, 93, - 94, 95, 119, 121, 112, 0, 2, 3, - 0, 16, 4, 5, 6, 7, 20, 22, - 23, 24, 25, 17, 18, 19, 11, 12, - 13, 28, 29, 26, 8, 9, 10, 27, - 14, 15, 21, 0, 31, 0, 44, 32, - 33, 34, 35, 48, 50, 51, 52, 53, - 45, 46, 47, 39, 40, 41, 54, 36, - 37, 38, 55, 56, 42, 0, 43, 0, - 49, 0, 0, 0, 58, 0, 0, 0, - 60, 61, 74, 62, 63, 64, 65, 78, - 80, 81, 82, 83, 75, 76, 77, 69, - 70, 71, 84, 66, 67, 68, 85, 86, - 72, 73, 79, 0, 99, 100, 106, 114, - 0, 0, 0, 120, 0 +static const char _use_syllable_machine_trans_targs[] = { + 1, 30, 0, 57, 59, 87, 88, 113, + 0, 115, 101, 89, 90, 91, 92, 105, + 107, 108, 109, 110, 102, 103, 104, 96, + 97, 98, 116, 117, 118, 111, 93, 94, + 95, 119, 121, 112, 0, 2, 3, 0, + 16, 4, 5, 6, 7, 20, 22, 23, + 24, 25, 17, 18, 19, 11, 12, 13, + 28, 29, 26, 8, 9, 10, 27, 14, + 15, 21, 0, 31, 0, 44, 32, 33, + 34, 35, 48, 50, 51, 52, 53, 45, + 46, 47, 39, 40, 41, 54, 36, 37, + 38, 55, 56, 42, 0, 43, 0, 49, + 0, 0, 0, 58, 0, 0, 0, 60, + 61, 74, 62, 63, 64, 65, 78, 80, + 81, 82, 83, 75, 76, 77, 69, 70, + 71, 84, 66, 67, 68, 85, 86, 72, + 73, 79, 0, 99, 100, 106, 114, 0, + 0, 0, 120 }; -static const signed char _use_syllable_machine_cond_actions[] = { - 0, 0, 0, 3, 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, 5, 0, 0, - 6, 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, 7, 0, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 10, - 0, 11, 12, 13, 0, 14, 15, 16, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 0, 0, 0, 0, - 18, 19, 20, 0, 0 +static const char _use_syllable_machine_trans_actions[] = { + 0, 0, 3, 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, 5, 0, 0, 6, + 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, 7, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 10, 0, + 11, 12, 13, 0, 14, 15, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 0, 0, 0, 18, + 19, 20, 0 }; -static const signed char _use_syllable_machine_to_state_actions[] = { - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 +static const char _use_syllable_machine_to_state_actions[] = { + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; -static const signed char _use_syllable_machine_from_state_actions[] = { - 2, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 +static const char _use_syllable_machine_from_state_actions[] = { + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 1, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 94, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 98, 94, - 68, 100, 103, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, - 94, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 98, 94, 68, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 132, 132, 132, 137, 138, - 138, 138, 0 + 0, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 93, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 97, 93, + 67, 99, 102, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, + 93, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 97, 93, 67, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 136, 137, + 137, 137 }; static const int use_syllable_machine_start = 0; @@ -701,65 +812,65 @@ static const int use_syllable_machine_en_main = 0; #define found_syllable(syllable_type) \ -HB_STMT_START { \ - if (0) fprintf (stderr, "syllable %u..%u %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \ - for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \ - info[i].syllable() = (syllable_serial << 4) | syllable_type; \ - syllable_serial++; \ - if (syllable_serial == 16) syllable_serial = 1; \ - } HB_STMT_END + HB_STMT_START { \ + if (0) fprintf (stderr, "syllable %u..%u %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \ + for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \ + info[i].syllable() = (syllable_serial << 4) | syllable_type; \ + syllable_serial++; \ + if (syllable_serial == 16) syllable_serial = 1; \ + } HB_STMT_END template struct machine_index_t : -hb_iter_with_fallback_t, -typename Iter::item_t> + hb_iter_with_fallback_t, + typename Iter::item_t> { - machine_index_t (const Iter& it) : it (it) {} - machine_index_t (const machine_index_t& o) : hb_iter_with_fallback_t, - typename Iter::item_t> (), - it (o.it), is_null (o.is_null) {} - - static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; - static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; - - typename Iter::item_t __item__ () const { return *it; } - typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; } - unsigned __len__ () const { return it.len (); } - void __next__ () { ++it; } - void __forward__ (unsigned n) { it += n; } - void __prev__ () { --it; } - void __rewind__ (unsigned n) { it -= n; } - - void operator = (unsigned n) - { - assert (n == 0); - is_null = true; - } - explicit operator bool () { return !is_null; } - - void operator = (const machine_index_t& o) - { - is_null = o.is_null; - unsigned index = (*it).first; - unsigned n = (*o.it).first; - if (index < n) it += n - index; else if (index > n) it -= index - n; - } - bool operator == (const machine_index_t& o) const - { return is_null ? o.is_null : !o.is_null && (*it).first == (*o.it).first; } - bool operator != (const machine_index_t& o) const { return !(*this == o); } - - private: - Iter it; - bool is_null = false; + machine_index_t (const Iter& it) : it (it) {} + machine_index_t (const machine_index_t& o) : hb_iter_with_fallback_t, + typename Iter::item_t> (), + it (o.it), is_null (o.is_null) {} + + static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator; + static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator; + + typename Iter::item_t __item__ () const { return *it; } + typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; } + unsigned __len__ () const { return it.len (); } + void __next__ () { ++it; } + void __forward__ (unsigned n) { it += n; } + void __prev__ () { --it; } + void __rewind__ (unsigned n) { it -= n; } + + void operator = (unsigned n) + { + assert (n == 0); + is_null = true; + } + explicit operator bool () { return !is_null; } + + void operator = (const machine_index_t& o) + { + is_null = o.is_null; + unsigned index = (*it).first; + unsigned n = (*o.it).first; + if (index < n) it += n - index; else if (index > n) it -= index - n; + } + bool operator == (const machine_index_t& o) const + { return is_null ? o.is_null : !o.is_null && (*it).first == (*o.it).first; } + bool operator != (const machine_index_t& o) const { return !(*this == o); } + + private: + Iter it; + bool is_null = false; }; struct { - template - machine_index_t> - operator () (Iter&& it) const - { return machine_index_t> (hb_iter (it)); } + template + machine_index_t> + operator () (Iter&& it) const + { return machine_index_t> (hb_iter (it)); } } HB_FUNCOBJ (machine_index); @@ -772,352 +883,172 @@ not_ccs_default_ignorable (const hb_glyph_info_t &i) static inline void find_syllables_use (hb_buffer_t *buffer) { - hb_glyph_info_t *info = buffer->info; - auto p = - + hb_iter (info, buffer->len) - | hb_enumerate - | hb_filter ([] (const hb_glyph_info_t &i) { return not_ccs_default_ignorable (i); }, - hb_second) - | hb_filter ([&] (const hb_pair_t p) - { - if (p.second.use_category() == USE(ZWNJ)) - for (unsigned i = p.first + 1; i < buffer->len; ++i) - if (not_ccs_default_ignorable (info[i])) - return !_hb_glyph_info_is_unicode_mark (&info[i]); - return true; - }) - | hb_enumerate - | machine_index - ; - auto pe = p + p.len (); - auto eof = +pe; - auto ts = +p; - auto te = +p; - unsigned int act HB_UNUSED; - int cs; - -#line 792 "hb-ot-shaper-use-machine.hh" + hb_glyph_info_t *info = buffer->info; + auto p = + + hb_iter (info, buffer->len) + | hb_enumerate + | hb_filter ([] (const hb_glyph_info_t &i) { return not_ccs_default_ignorable (i); }, + hb_second) + | hb_filter ([&] (const hb_pair_t p) + { + if (p.second.use_category() == USE(ZWNJ)) + for (unsigned i = p.first + 1; i < buffer->len; ++i) + if (not_ccs_default_ignorable (info[i])) + return !_hb_glyph_info_is_unicode_mark (&info[i]); + return true; + }) + | hb_enumerate + | machine_index + ; + auto pe = p + p.len (); + auto eof = +pe; + auto ts = +p; + auto te = +p; + unsigned int act HB_UNUSED; + int cs; + +#line 911 "hb-ot-shaper-use-machine.hh" { - cs = (int)use_syllable_machine_start; - ts = 0; - te = 0; + cs = use_syllable_machine_start; + ts = 0; + te = 0; + act = 0; } - + #line 282 "hb-ot-shaper-use-machine.rl" - - unsigned int syllable_serial = 1; -#line 801 "hb-ot-shaper-use-machine.hh" + unsigned int syllable_serial = 1; + +#line 924 "hb-ot-shaper-use-machine.hh" { - unsigned int _trans = 0; - const unsigned char * _keys; - const short * _inds; - int _ic; - _resume: {} - if ( p == pe && p != eof ) - goto _out; - switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 2: { - { + int _slen; + int _trans; + const unsigned char *_keys; + const unsigned char *_inds; + if ( p == pe ) + goto _test_eof; +_resume: + switch ( _use_syllable_machine_from_state_actions[cs] ) { + case 2: #line 1 "NONE" - {ts = p;}} - -#line 815 "hb-ot-shaper-use-machine.hh" + {ts = p;} + break; +#line 938 "hb-ot-shaper-use-machine.hh" + } - - break; - } - } - - if ( p == eof ) { - if ( _use_syllable_machine_eof_trans[cs] > 0 ) { - _trans = (unsigned int)_use_syllable_machine_eof_trans[cs] - 1; - } - } - else { - _keys = ( _use_syllable_machine_trans_keys + ((cs<<1))); - _inds = ( _use_syllable_machine_indicies + (_use_syllable_machine_index_offsets[cs])); - - if ( ((*p).second.second.use_category()) <= 53 ) { - _ic = (int)_use_syllable_machine_char_class[(int)((*p).second.second.use_category()) - 0]; - if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) ) - _trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); - else - _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; - } - else { - _trans = (unsigned int)_use_syllable_machine_index_defaults[cs]; - } - - } - cs = (int)_use_syllable_machine_cond_targs[_trans]; - - if ( _use_syllable_machine_cond_actions[_trans] != 0 ) { - - switch ( _use_syllable_machine_cond_actions[_trans] ) { - case 12: { - { -#line 170 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ -#line 170 "hb-ot-shaper-use-machine.rl" - found_syllable (use_virama_terminated_cluster); } - }} - -#line 855 "hb-ot-shaper-use-machine.hh" + _keys = _use_syllable_machine_trans_keys + (cs<<1); + _inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs]; - - break; - } - case 10: { - { -#line 171 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ -#line 171 "hb-ot-shaper-use-machine.rl" - found_syllable (use_sakot_terminated_cluster); } - }} - -#line 867 "hb-ot-shaper-use-machine.hh" + _slen = _use_syllable_machine_key_spans[cs]; + _trans = _inds[ _slen > 0 && _keys[0] <=( (*p).second.second.use_category()) && + ( (*p).second.second.use_category()) <= _keys[1] ? + ( (*p).second.second.use_category()) - _keys[0] : _slen ]; - - break; - } - case 8: { - { -#line 172 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ -#line 172 "hb-ot-shaper-use-machine.rl" - found_syllable (use_standard_cluster); } - }} - -#line 879 "hb-ot-shaper-use-machine.hh" +_eof_trans: + cs = _use_syllable_machine_trans_targs[_trans]; - - break; - } - case 16: { - { -#line 173 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ -#line 173 "hb-ot-shaper-use-machine.rl" - found_syllable (use_number_joiner_terminated_cluster); } - }} - -#line 891 "hb-ot-shaper-use-machine.hh" + if ( _use_syllable_machine_trans_actions[_trans] == 0 ) + goto _again; - - break; - } - case 14: { - { -#line 174 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ + switch ( _use_syllable_machine_trans_actions[_trans] ) { + case 12: +#line 170 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_virama_terminated_cluster); }} + break; + case 10: +#line 171 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_sakot_terminated_cluster); }} + break; + case 8: +#line 172 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_standard_cluster); }} + break; + case 16: +#line 173 "hb-ot-shaper-use-machine.rl" + {te = p+1;{ found_syllable (use_number_joiner_terminated_cluster); }} + break; + case 14: #line 174 "hb-ot-shaper-use-machine.rl" - found_syllable (use_numeral_cluster); } - }} - -#line 903 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 6: { - { -#line 175 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ + {te = p+1;{ found_syllable (use_numeral_cluster); }} + break; + case 6: #line 175 "hb-ot-shaper-use-machine.rl" - found_syllable (use_symbol_cluster); } - }} - -#line 915 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 20: { - { + {te = p+1;{ found_syllable (use_symbol_cluster); }} + break; + case 20: #line 176 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ -#line 176 "hb-ot-shaper-use-machine.rl" - found_syllable (use_hieroglyph_cluster); } - }} - -#line 927 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 4: { - { + {te = p+1;{ found_syllable (use_hieroglyph_cluster); }} + break; + case 4: #line 177 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ -#line 177 "hb-ot-shaper-use-machine.rl" - found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; } - }} - -#line 939 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 3: { - { + {te = p+1;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} + break; + case 3: #line 178 "hb-ot-shaper-use-machine.rl" - {te = p+1;{ -#line 178 "hb-ot-shaper-use-machine.rl" - found_syllable (use_non_cluster); } - }} - -#line 951 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 11: { - { + {te = p+1;{ found_syllable (use_non_cluster); }} + break; + case 11: #line 170 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ -#line 170 "hb-ot-shaper-use-machine.rl" - found_syllable (use_virama_terminated_cluster); } - }} - -#line 963 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 9: { - { + {te = p;p--;{ found_syllable (use_virama_terminated_cluster); }} + break; + case 9: #line 171 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ -#line 171 "hb-ot-shaper-use-machine.rl" - found_syllable (use_sakot_terminated_cluster); } - }} - -#line 975 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 7: { - { + {te = p;p--;{ found_syllable (use_sakot_terminated_cluster); }} + break; + case 7: #line 172 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ -#line 172 "hb-ot-shaper-use-machine.rl" - found_syllable (use_standard_cluster); } - }} - -#line 987 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 15: { - { + {te = p;p--;{ found_syllable (use_standard_cluster); }} + break; + case 15: #line 173 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ -#line 173 "hb-ot-shaper-use-machine.rl" - found_syllable (use_number_joiner_terminated_cluster); } - }} - -#line 999 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 13: { - { -#line 174 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ + {te = p;p--;{ found_syllable (use_number_joiner_terminated_cluster); }} + break; + case 13: #line 174 "hb-ot-shaper-use-machine.rl" - found_syllable (use_numeral_cluster); } - }} - -#line 1011 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 5: { - { -#line 175 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ + {te = p;p--;{ found_syllable (use_numeral_cluster); }} + break; + case 5: #line 175 "hb-ot-shaper-use-machine.rl" - found_syllable (use_symbol_cluster); } - }} - -#line 1023 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 19: { - { -#line 176 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ + {te = p;p--;{ found_syllable (use_symbol_cluster); }} + break; + case 19: #line 176 "hb-ot-shaper-use-machine.rl" - found_syllable (use_hieroglyph_cluster); } - }} - -#line 1035 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 17: { - { -#line 177 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ + {te = p;p--;{ found_syllable (use_hieroglyph_cluster); }} + break; + case 17: #line 177 "hb-ot-shaper-use-machine.rl" - found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; } - }} - -#line 1047 "hb-ot-shaper-use-machine.hh" - - - break; - } - case 18: { - { -#line 178 "hb-ot-shaper-use-machine.rl" - {te = p;p = p - 1;{ + {te = p;p--;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} + break; + case 18: #line 178 "hb-ot-shaper-use-machine.rl" - found_syllable (use_non_cluster); } - }} - -#line 1059 "hb-ot-shaper-use-machine.hh" + {te = p;p--;{ found_syllable (use_non_cluster); }} + break; +#line 1028 "hb-ot-shaper-use-machine.hh" + } - - break; - } - } - - } - - if ( p == eof ) { - if ( cs >= 0 ) - goto _out; - } - else { - switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 1: { - { +_again: + switch ( _use_syllable_machine_to_state_actions[cs] ) { + case 1: #line 1 "NONE" - {ts = 0;}} - -#line 1078 "hb-ot-shaper-use-machine.hh" + {ts = 0;} + break; +#line 1037 "hb-ot-shaper-use-machine.hh" + } - - break; - } - } - - p += 1; - goto _resume; - } - _out: {} + if ( ++p != pe ) + goto _resume; + _test_eof: {} + if ( p == eof ) + { + if ( _use_syllable_machine_eof_trans[cs] > 0 ) { + _trans = _use_syllable_machine_eof_trans[cs] - 1; + goto _eof_trans; + } } - + + } + #line 287 "hb-ot-shaper-use-machine.rl" } -- cgit v1.2.3 From 767f937833f82257169dc278e4aaa22c44bfebf8 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Fri, 15 Sep 2023 23:11:26 -0400 Subject: [USE] Update the data files This uses the data files from and closes #4404. --- src/gen-use-table.py | 16 +- src/hb-ot-shaper-use-machine.hh | 1381 +++++++++++---------- src/hb-ot-shaper-use-machine.rl | 6 +- src/hb-ot-shaper-use-table.hh | 940 +++++++------- src/ms-use/IndicPositionalCategory-Additional.txt | 1 + src/ms-use/IndicSyllabicCategory-Additional.txt | 57 +- 6 files changed, 1223 insertions(+), 1178 deletions(-) diff --git a/src/gen-use-table.py b/src/gen-use-table.py index e8b76dfb5..4e87b8450 100755 --- a/src/gen-use-table.py +++ b/src/gen-use-table.py @@ -140,6 +140,10 @@ property_names = [ 'Symbol_Modifier', 'Hieroglyph', 'Hieroglyph_Joiner', + 'Hieroglyph_Mark_Begin', + 'Hieroglyph_Mark_End', + 'Hieroglyph_Mirror', + 'Hieroglyph_Modifier', 'Hieroglyph_Segment_Begin', 'Hieroglyph_Segment_End', # Indic_Positional_Category @@ -234,10 +238,14 @@ def is_HIEROGLYPH(U, UISC, UDI, UGC, AJT): return UISC == Hieroglyph def is_HIEROGLYPH_JOINER(U, UISC, UDI, UGC, AJT): return UISC == Hieroglyph_Joiner +def is_HIEROGLYPH_MIRROR(U, UISC, UDI, UGC, AJT): + return UISC == Hieroglyph_Mirror +def is_HIEROGLYPH_MOD(U, UISC, UDI, UGC, AJT): + return UISC == Hieroglyph_Modifier def is_HIEROGLYPH_SEGMENT_BEGIN(U, UISC, UDI, UGC, AJT): - return UISC == Hieroglyph_Segment_Begin + return UISC in [Hieroglyph_Mark_Begin, Hieroglyph_Segment_Begin] def is_HIEROGLYPH_SEGMENT_END(U, UISC, UDI, UGC, AJT): - return UISC == Hieroglyph_Segment_End + return UISC in [Hieroglyph_Mark_End, Hieroglyph_Segment_End] def is_INVISIBLE_STACKER(U, UISC, UDI, UGC, AJT): # Split off of HALANT return (UISC == Invisible_Stacker @@ -290,6 +298,8 @@ use_mapping = { 'HN': is_HALANT_NUM, 'IS': is_INVISIBLE_STACKER, 'G': is_HIEROGLYPH, + 'HM': is_HIEROGLYPH_MOD, + 'HR': is_HIEROGLYPH_MIRROR, 'J': is_HIEROGLYPH_JOINER, 'SB': is_HIEROGLYPH_SEGMENT_BEGIN, 'SE': is_HIEROGLYPH_SEGMENT_END, @@ -336,6 +346,8 @@ use_positions = { 'Blw': [Bottom], }, 'H': None, + 'HM': None, + 'HR': None, 'HVM': None, 'IS': None, 'B': None, diff --git a/src/hb-ot-shaper-use-machine.hh b/src/hb-ot-shaper-use-machine.hh index 307bb1ce1..be0a2539b 100644 --- a/src/hb-ot-shaper-use-machine.hh +++ b/src/hb-ot-shaper-use-machine.hh @@ -68,7 +68,9 @@ enum use_syllable_type_t { #define use_syllable_machine_ex_G 49u #define use_syllable_machine_ex_GB 5u #define use_syllable_machine_ex_H 12u +#define use_syllable_machine_ex_HM 54u #define use_syllable_machine_ex_HN 13u +#define use_syllable_machine_ex_HR 55u #define use_syllable_machine_ex_HVM 53u #define use_syllable_machine_ex_IS 44u #define use_syllable_machine_ex_J 50u @@ -97,651 +99,662 @@ enum use_syllable_type_t { #define use_syllable_machine_ex_ZWNJ 14u -#line 101 "hb-ot-shaper-use-machine.hh" +#line 103 "hb-ot-shaper-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, - 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, - 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, - 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 14u, 42u, 14u, 42u, 11u, 53u, 1u, 53u, - 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, - 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, - 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, - 1u, 48u, 13u, 14u, 4u, 14u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, - 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, - 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, - 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, 1u, 48u, 11u, 53u, + 49u, 51u, 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, + 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, + 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, + 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 48u, 14u, 42u, 14u, 42u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, - 1u, 48u, 4u, 14u, 13u, 14u, 1u, 53u, 14u, 42u, 14u, 42u, 1u, 5u, 14u, 52u, - 14u, 52u, 14u, 51u, 0 + 1u, 14u, 1u, 48u, 13u, 14u, 4u, 14u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, + 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, + 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, 14u, 53u, 14u, 53u, 12u, 53u, + 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, 1u, 14u, 1u, 14u, 1u, 48u, + 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, + 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, 14u, 53u, 14u, 53u, + 14u, 53u, 14u, 53u, 12u, 53u, 14u, 53u, 12u, 53u, 12u, 53u, 12u, 53u, 11u, 53u, + 1u, 14u, 1u, 48u, 4u, 14u, 13u, 14u, 1u, 53u, 14u, 42u, 14u, 42u, 1u, 5u, + 14u, 55u, 14u, 51u, 14u, 52u, 14u, 54u, 11u, 53u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 54, 43, 43, 53, 35, 34, 34, 34, - 33, 33, 1, 35, 35, 35, 14, 35, - 40, 40, 40, 40, 42, 40, 42, 42, - 42, 43, 14, 48, 29, 29, 43, 53, - 35, 34, 34, 34, 33, 33, 1, 35, - 35, 35, 14, 35, 40, 40, 40, 40, - 42, 40, 42, 42, 42, 43, 14, 14, - 48, 2, 11, 43, 43, 53, 35, 34, - 34, 34, 33, 33, 1, 35, 35, 35, - 14, 35, 40, 40, 40, 40, 42, 40, - 42, 42, 42, 43, 14, 14, 48, 43, + 3, 54, 43, 43, 53, 35, 34, 34, + 34, 33, 33, 1, 35, 35, 35, 14, + 35, 40, 40, 40, 40, 42, 40, 42, + 42, 42, 43, 14, 48, 29, 29, 43, 53, 35, 34, 34, 34, 33, 33, 1, 35, 35, 35, 14, 35, 40, 40, 40, 40, 42, 40, 42, 42, 42, 43, 14, - 48, 11, 2, 53, 29, 29, 5, 39, - 39, 38 + 14, 48, 2, 11, 43, 43, 53, 35, + 34, 34, 34, 33, 33, 1, 35, 35, + 35, 14, 35, 40, 40, 40, 40, 42, + 40, 42, 42, 42, 43, 14, 14, 48, + 43, 53, 35, 34, 34, 34, 33, 33, + 1, 35, 35, 35, 14, 35, 40, 40, + 40, 40, 42, 40, 42, 42, 42, 43, + 14, 48, 11, 2, 53, 29, 29, 5, + 42, 38, 39, 41, 43 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 55, 99, 143, 197, 233, 268, 303, - 338, 372, 406, 408, 444, 480, 516, 531, - 567, 608, 649, 690, 731, 774, 815, 858, - 901, 944, 988, 1003, 1052, 1082, 1112, 1156, - 1210, 1246, 1281, 1316, 1351, 1385, 1419, 1421, - 1457, 1493, 1529, 1544, 1580, 1621, 1662, 1703, - 1744, 1787, 1828, 1871, 1914, 1957, 2001, 2016, - 2031, 2080, 2083, 2095, 2139, 2183, 2237, 2273, - 2308, 2343, 2378, 2412, 2446, 2448, 2484, 2520, - 2556, 2571, 2607, 2648, 2689, 2730, 2771, 2814, - 2855, 2898, 2941, 2984, 3028, 3043, 3058, 3107, - 3151, 3205, 3241, 3276, 3311, 3346, 3380, 3414, - 3416, 3452, 3488, 3524, 3539, 3575, 3616, 3657, - 3698, 3739, 3782, 3823, 3866, 3909, 3952, 3996, - 4011, 4060, 4072, 4075, 4129, 4159, 4189, 4195, - 4235, 4275 + 0, 4, 59, 103, 147, 201, 237, 272, + 307, 342, 376, 410, 412, 448, 484, 520, + 535, 571, 612, 653, 694, 735, 778, 819, + 862, 905, 948, 992, 1007, 1056, 1086, 1116, + 1160, 1214, 1250, 1285, 1320, 1355, 1389, 1423, + 1425, 1461, 1497, 1533, 1548, 1584, 1625, 1666, + 1707, 1748, 1791, 1832, 1875, 1918, 1961, 2005, + 2020, 2035, 2084, 2087, 2099, 2143, 2187, 2241, + 2277, 2312, 2347, 2382, 2416, 2450, 2452, 2488, + 2524, 2560, 2575, 2611, 2652, 2693, 2734, 2775, + 2818, 2859, 2902, 2945, 2988, 3032, 3047, 3062, + 3111, 3155, 3209, 3245, 3280, 3315, 3350, 3384, + 3418, 3420, 3456, 3492, 3528, 3543, 3579, 3620, + 3661, 3702, 3743, 3786, 3827, 3870, 3913, 3956, + 4000, 4015, 4064, 4076, 4079, 4133, 4163, 4193, + 4199, 4242, 4281, 4321, 4363 }; static const unsigned char _use_syllable_machine_indicies[] = { - 0, 1, 2, 2, 3, 4, 2, 2, - 2, 2, 2, 5, 6, 7, 8, 2, - 2, 2, 9, 2, 2, 2, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 5, - 19, 20, 21, 22, 2, 23, 24, 25, - 2, 26, 27, 28, 29, 30, 31, 32, - 29, 33, 2, 34, 2, 35, 2, 37, - 38, 36, 39, 36, 36, 36, 36, 36, - 36, 36, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 37, 49, 50, 51, 52, - 36, 53, 54, 55, 36, 56, 57, 36, - 58, 59, 60, 61, 58, 36, 36, 36, - 36, 62, 36, 37, 38, 36, 39, 36, - 36, 36, 36, 36, 36, 36, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 37, - 49, 50, 51, 52, 36, 53, 54, 55, - 36, 36, 36, 36, 58, 59, 60, 61, - 58, 36, 36, 36, 36, 62, 36, 37, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 39, 36, 36, 36, - 36, 36, 36, 36, 36, 41, 42, 43, - 44, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 53, 54, 55, 36, 36, - 36, 36, 36, 59, 60, 61, 63, 36, - 36, 36, 36, 41, 36, 39, 36, 36, - 36, 36, 36, 36, 36, 36, 41, 42, - 43, 44, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 53, 54, 55, 36, - 36, 36, 36, 36, 59, 60, 61, 63, - 36, 39, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 42, 43, 44, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 59, 60, 61, 36, 39, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 43, - 44, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 59, 60, 61, 36, 39, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 44, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 59, 60, - 61, 36, 39, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 59, 60, 36, 39, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 60, 36, 39, 36, - 39, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 42, 43, 44, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 53, - 54, 55, 36, 36, 36, 36, 36, 59, - 60, 61, 63, 36, 39, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 42, 43, - 44, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 54, 55, 36, 36, - 36, 36, 36, 59, 60, 61, 63, 36, - 39, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 42, 43, 44, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 55, 36, 36, 36, 36, 36, 59, - 60, 61, 63, 36, 64, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 39, 36, 39, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 42, 43, 44, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 59, 60, 61, 63, 36, 39, - 36, 36, 36, 36, 36, 36, 36, 40, - 41, 42, 43, 44, 36, 36, 36, 36, - 36, 36, 50, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 41, 36, - 39, 36, 36, 36, 36, 36, 36, 36, - 36, 41, 42, 43, 44, 36, 36, 36, - 36, 36, 36, 50, 51, 52, 36, 53, - 54, 55, 36, 36, 36, 36, 36, 59, - 60, 61, 63, 36, 36, 36, 36, 41, - 36, 39, 36, 36, 36, 36, 36, 36, - 36, 36, 41, 42, 43, 44, 36, 36, - 36, 36, 36, 36, 36, 51, 52, 36, - 53, 54, 55, 36, 36, 36, 36, 36, - 59, 60, 61, 63, 36, 36, 36, 36, - 41, 36, 39, 36, 36, 36, 36, 36, - 36, 36, 36, 41, 42, 43, 44, 36, - 36, 36, 36, 36, 36, 36, 36, 52, - 36, 53, 54, 55, 36, 36, 36, 36, - 36, 59, 60, 61, 63, 36, 36, 36, - 36, 41, 36, 65, 36, 39, 36, 36, - 36, 36, 36, 36, 36, 40, 41, 42, - 43, 44, 36, 46, 47, 36, 36, 36, - 50, 51, 52, 36, 53, 54, 55, 36, - 36, 36, 36, 36, 59, 60, 61, 63, - 36, 36, 36, 36, 41, 36, 39, 36, - 36, 36, 36, 36, 36, 36, 36, 41, - 42, 43, 44, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 53, 54, 55, - 36, 36, 36, 36, 36, 59, 60, 61, - 63, 36, 36, 36, 36, 41, 36, 65, - 36, 39, 36, 36, 36, 36, 36, 36, - 36, 40, 41, 42, 43, 44, 36, 36, - 47, 36, 36, 36, 50, 51, 52, 36, - 53, 54, 55, 36, 36, 36, 36, 36, - 59, 60, 61, 63, 36, 36, 36, 36, - 41, 36, 65, 36, 39, 36, 36, 36, - 36, 36, 36, 36, 40, 41, 42, 43, - 44, 36, 36, 36, 36, 36, 36, 50, - 51, 52, 36, 53, 54, 55, 36, 36, - 36, 36, 36, 59, 60, 61, 63, 36, - 36, 36, 36, 41, 36, 65, 36, 39, - 36, 36, 36, 36, 36, 36, 36, 40, - 41, 42, 43, 44, 45, 46, 47, 36, - 36, 36, 50, 51, 52, 36, 53, 54, - 55, 36, 36, 36, 36, 36, 59, 60, - 61, 63, 36, 36, 36, 36, 41, 36, - 37, 38, 36, 39, 36, 36, 36, 36, - 36, 36, 36, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 36, 49, 50, 51, - 52, 36, 53, 54, 55, 36, 36, 36, - 36, 58, 59, 60, 61, 58, 36, 36, - 36, 36, 62, 36, 37, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 39, 36, 37, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 39, 36, 36, 36, 36, 36, 36, 36, - 36, 41, 42, 43, 44, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 53, - 54, 55, 36, 36, 36, 36, 36, 59, - 60, 61, 63, 36, 39, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 56, - 57, 36, 39, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 57, 36, - 1, 67, 66, 68, 66, 66, 66, 66, - 66, 66, 66, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 1, 78, 79, 80, - 81, 66, 82, 83, 84, 66, 66, 66, - 66, 85, 86, 87, 88, 89, 66, 66, - 66, 66, 90, 66, 1, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 68, 66, 66, 66, 66, 66, 66, - 66, 66, 70, 71, 72, 73, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 82, 83, 84, 66, 66, 66, 66, 66, - 86, 87, 88, 91, 66, 66, 66, 66, - 70, 66, 68, 66, 66, 66, 66, 66, - 66, 66, 66, 70, 71, 72, 73, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 82, 83, 84, 66, 66, 66, 66, - 66, 86, 87, 88, 91, 66, 68, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 71, 72, 73, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 86, 87, 88, - 66, 68, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 72, 73, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 86, 87, 88, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 73, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 86, 87, 88, 66, 68, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 86, 87, - 66, 68, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 87, 66, 68, 66, 68, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 71, - 72, 73, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 82, 83, 84, 66, - 66, 66, 66, 66, 86, 87, 88, 91, - 66, 68, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 71, 72, 73, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 83, 84, 66, 66, 66, 66, 66, - 86, 87, 88, 91, 66, 68, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 71, - 72, 73, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 84, 66, - 66, 66, 66, 66, 86, 87, 88, 91, - 66, 93, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 94, 92, - 68, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 71, 72, 73, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 86, - 87, 88, 91, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 69, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 79, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 68, 66, 66, - 66, 66, 66, 66, 66, 66, 70, 71, - 72, 73, 66, 66, 66, 66, 66, 66, - 79, 80, 81, 66, 82, 83, 84, 66, - 66, 66, 66, 66, 86, 87, 88, 91, - 66, 66, 66, 66, 70, 66, 68, 66, - 66, 66, 66, 66, 66, 66, 66, 70, - 71, 72, 73, 66, 66, 66, 66, 66, - 66, 66, 80, 81, 66, 82, 83, 84, - 66, 66, 66, 66, 66, 86, 87, 88, - 91, 66, 66, 66, 66, 70, 66, 68, - 66, 66, 66, 66, 66, 66, 66, 66, - 70, 71, 72, 73, 66, 66, 66, 66, - 66, 66, 66, 66, 81, 66, 82, 83, - 84, 66, 66, 66, 66, 66, 86, 87, - 88, 91, 66, 66, 66, 66, 70, 66, - 95, 66, 68, 66, 66, 66, 66, 66, - 66, 66, 69, 70, 71, 72, 73, 66, - 75, 76, 66, 66, 66, 79, 80, 81, - 66, 82, 83, 84, 66, 66, 66, 66, - 66, 86, 87, 88, 91, 66, 66, 66, - 66, 70, 66, 68, 66, 66, 66, 66, - 66, 66, 66, 66, 70, 71, 72, 73, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 82, 83, 84, 66, 66, 66, - 66, 66, 86, 87, 88, 91, 66, 66, - 66, 66, 70, 66, 95, 66, 68, 66, - 66, 66, 66, 66, 66, 66, 69, 70, - 71, 72, 73, 66, 66, 76, 66, 66, - 66, 79, 80, 81, 66, 82, 83, 84, - 66, 66, 66, 66, 66, 86, 87, 88, - 91, 66, 66, 66, 66, 70, 66, 95, - 66, 68, 66, 66, 66, 66, 66, 66, - 66, 69, 70, 71, 72, 73, 66, 66, - 66, 66, 66, 66, 79, 80, 81, 66, - 82, 83, 84, 66, 66, 66, 66, 66, - 86, 87, 88, 91, 66, 66, 66, 66, - 70, 66, 95, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 69, 70, 71, 72, - 73, 74, 75, 76, 66, 66, 66, 79, - 80, 81, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 66, 66, 66, 70, 66, 1, 67, 66, - 68, 66, 66, 66, 66, 66, 66, 66, - 69, 70, 71, 72, 73, 74, 75, 76, - 77, 66, 78, 79, 80, 81, 66, 82, - 83, 84, 66, 66, 66, 66, 85, 86, - 87, 88, 89, 66, 66, 66, 66, 90, - 66, 1, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 97, 96, - 1, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 94, 92, 1, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 66, 70, 71, 72, - 73, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 82, 83, 84, 66, 66, - 66, 66, 66, 86, 87, 88, 91, 66, - 99, 100, 98, 3, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 102, 101, 103, - 104, 66, 68, 66, 66, 66, 66, 66, - 66, 66, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 103, 114, 115, 116, 117, - 66, 118, 119, 120, 66, 56, 57, 66, - 121, 122, 123, 124, 125, 66, 66, 66, - 66, 126, 66, 103, 104, 66, 68, 66, - 66, 66, 66, 66, 66, 66, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 103, - 114, 115, 116, 117, 66, 118, 119, 120, - 66, 66, 66, 66, 121, 122, 123, 124, - 125, 66, 66, 66, 66, 126, 66, 103, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 66, 106, 107, 108, - 109, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 118, 119, 120, 66, 66, - 66, 66, 66, 122, 123, 124, 127, 66, - 66, 66, 66, 106, 66, 68, 66, 66, - 66, 66, 66, 66, 66, 66, 106, 107, - 108, 109, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 118, 119, 120, 66, - 66, 66, 66, 66, 122, 123, 124, 127, - 66, 68, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 107, 108, 109, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 122, 123, 124, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 108, - 109, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 122, 123, 124, 66, 68, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 109, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 122, 123, - 124, 66, 68, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 122, 123, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 123, 66, 68, 66, - 68, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 107, 108, 109, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 118, - 119, 120, 66, 66, 66, 66, 66, 122, - 123, 124, 127, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 107, 108, - 109, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 119, 120, 66, 66, - 66, 66, 66, 122, 123, 124, 127, 66, - 68, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 107, 108, 109, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 120, 66, 66, 66, 66, 66, 122, - 123, 124, 127, 66, 128, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, - 92, 94, 92, 68, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 107, 108, 109, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 122, 123, 124, 127, 66, 68, - 66, 66, 66, 66, 66, 66, 66, 105, - 106, 107, 108, 109, 66, 66, 66, 66, - 66, 66, 115, 116, 117, 66, 118, 119, - 120, 66, 66, 66, 66, 66, 122, 123, - 124, 127, 66, 66, 66, 66, 106, 66, - 68, 66, 66, 66, 66, 66, 66, 66, - 66, 106, 107, 108, 109, 66, 66, 66, - 66, 66, 66, 115, 116, 117, 66, 118, - 119, 120, 66, 66, 66, 66, 66, 122, - 123, 124, 127, 66, 66, 66, 66, 106, - 66, 68, 66, 66, 66, 66, 66, 66, - 66, 66, 106, 107, 108, 109, 66, 66, - 66, 66, 66, 66, 66, 116, 117, 66, - 118, 119, 120, 66, 66, 66, 66, 66, - 122, 123, 124, 127, 66, 66, 66, 66, - 106, 66, 68, 66, 66, 66, 66, 66, - 66, 66, 66, 106, 107, 108, 109, 66, - 66, 66, 66, 66, 66, 66, 66, 117, - 66, 118, 119, 120, 66, 66, 66, 66, - 66, 122, 123, 124, 127, 66, 66, 66, - 66, 106, 66, 129, 66, 68, 66, 66, - 66, 66, 66, 66, 66, 105, 106, 107, - 108, 109, 66, 111, 112, 66, 66, 66, - 115, 116, 117, 66, 118, 119, 120, 66, - 66, 66, 66, 66, 122, 123, 124, 127, - 66, 66, 66, 66, 106, 66, 68, 66, - 66, 66, 66, 66, 66, 66, 66, 106, - 107, 108, 109, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 118, 119, 120, - 66, 66, 66, 66, 66, 122, 123, 124, - 127, 66, 66, 66, 66, 106, 66, 129, - 66, 68, 66, 66, 66, 66, 66, 66, - 66, 105, 106, 107, 108, 109, 66, 66, - 112, 66, 66, 66, 115, 116, 117, 66, - 118, 119, 120, 66, 66, 66, 66, 66, - 122, 123, 124, 127, 66, 66, 66, 66, - 106, 66, 129, 66, 68, 66, 66, 66, - 66, 66, 66, 66, 105, 106, 107, 108, - 109, 66, 66, 66, 66, 66, 66, 115, - 116, 117, 66, 118, 119, 120, 66, 66, - 66, 66, 66, 122, 123, 124, 127, 66, - 66, 66, 66, 106, 66, 129, 66, 68, - 66, 66, 66, 66, 66, 66, 66, 105, - 106, 107, 108, 109, 110, 111, 112, 66, - 66, 66, 115, 116, 117, 66, 118, 119, - 120, 66, 66, 66, 66, 66, 122, 123, - 124, 127, 66, 66, 66, 66, 106, 66, - 103, 104, 66, 68, 66, 66, 66, 66, - 66, 66, 66, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 66, 114, 115, 116, - 117, 66, 118, 119, 120, 66, 66, 66, - 66, 121, 122, 123, 124, 125, 66, 66, - 66, 66, 126, 66, 103, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 97, 96, 103, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, - 94, 92, 103, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 68, - 66, 66, 66, 66, 66, 66, 66, 66, - 106, 107, 108, 109, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 118, 119, - 120, 66, 66, 66, 66, 66, 122, 123, - 124, 127, 66, 5, 6, 130, 8, 130, - 130, 130, 130, 130, 130, 130, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 5, - 19, 20, 21, 22, 130, 23, 24, 25, - 130, 130, 130, 130, 29, 30, 31, 32, - 29, 130, 130, 130, 130, 35, 130, 5, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 8, 130, 130, 130, - 130, 130, 130, 130, 130, 11, 12, 13, - 14, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 23, 24, 25, 130, 130, - 130, 130, 130, 30, 31, 32, 131, 130, - 130, 130, 130, 11, 130, 8, 130, 130, - 130, 130, 130, 130, 130, 130, 11, 12, - 13, 14, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 23, 24, 25, 130, - 130, 130, 130, 130, 30, 31, 32, 131, - 130, 8, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 12, 13, 14, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 30, 31, 32, 130, 8, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 13, - 14, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 30, 31, 32, 130, 8, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 14, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 30, 31, - 32, 130, 8, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 30, 31, 130, 8, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 31, 130, 8, 130, - 8, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 12, 13, 14, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 23, - 24, 25, 130, 130, 130, 130, 130, 30, - 31, 32, 131, 130, 8, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 12, 13, - 14, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 24, 25, 130, 130, - 130, 130, 130, 30, 31, 32, 131, 130, - 8, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 12, 13, 14, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 25, 130, 130, 130, 130, 130, 30, - 31, 32, 131, 130, 132, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 8, 130, 8, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 12, 13, 14, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 30, 31, 32, 131, 130, 8, - 130, 130, 130, 130, 130, 130, 130, 10, - 11, 12, 13, 14, 130, 130, 130, 130, - 130, 130, 20, 21, 22, 130, 23, 24, - 25, 130, 130, 130, 130, 130, 30, 31, - 32, 131, 130, 130, 130, 130, 11, 130, - 8, 130, 130, 130, 130, 130, 130, 130, - 130, 11, 12, 13, 14, 130, 130, 130, - 130, 130, 130, 20, 21, 22, 130, 23, - 24, 25, 130, 130, 130, 130, 130, 30, - 31, 32, 131, 130, 130, 130, 130, 11, - 130, 8, 130, 130, 130, 130, 130, 130, - 130, 130, 11, 12, 13, 14, 130, 130, - 130, 130, 130, 130, 130, 21, 22, 130, - 23, 24, 25, 130, 130, 130, 130, 130, - 30, 31, 32, 131, 130, 130, 130, 130, - 11, 130, 8, 130, 130, 130, 130, 130, - 130, 130, 130, 11, 12, 13, 14, 130, - 130, 130, 130, 130, 130, 130, 130, 22, - 130, 23, 24, 25, 130, 130, 130, 130, - 130, 30, 31, 32, 131, 130, 130, 130, - 130, 11, 130, 133, 130, 8, 130, 130, - 130, 130, 130, 130, 130, 10, 11, 12, - 13, 14, 130, 16, 17, 130, 130, 130, - 20, 21, 22, 130, 23, 24, 25, 130, - 130, 130, 130, 130, 30, 31, 32, 131, - 130, 130, 130, 130, 11, 130, 8, 130, - 130, 130, 130, 130, 130, 130, 130, 11, - 12, 13, 14, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 23, 24, 25, - 130, 130, 130, 130, 130, 30, 31, 32, - 131, 130, 130, 130, 130, 11, 130, 133, - 130, 8, 130, 130, 130, 130, 130, 130, - 130, 10, 11, 12, 13, 14, 130, 130, - 17, 130, 130, 130, 20, 21, 22, 130, - 23, 24, 25, 130, 130, 130, 130, 130, - 30, 31, 32, 131, 130, 130, 130, 130, - 11, 130, 133, 130, 8, 130, 130, 130, - 130, 130, 130, 130, 10, 11, 12, 13, - 14, 130, 130, 130, 130, 130, 130, 20, - 21, 22, 130, 23, 24, 25, 130, 130, - 130, 130, 130, 30, 31, 32, 131, 130, - 130, 130, 130, 11, 130, 133, 130, 8, - 130, 130, 130, 130, 130, 130, 130, 10, - 11, 12, 13, 14, 15, 16, 17, 130, - 130, 130, 20, 21, 22, 130, 23, 24, - 25, 130, 130, 130, 130, 130, 30, 31, - 32, 131, 130, 130, 130, 130, 11, 130, - 5, 6, 130, 8, 130, 130, 130, 130, - 130, 130, 130, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 130, 19, 20, 21, - 22, 130, 23, 24, 25, 130, 130, 130, - 130, 29, 30, 31, 32, 29, 130, 130, - 130, 130, 35, 130, 5, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 8, 130, 5, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 8, 130, 130, 130, 130, 130, 130, 130, - 130, 11, 12, 13, 14, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 23, - 24, 25, 130, 130, 130, 130, 130, 30, - 31, 32, 131, 130, 134, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 8, 130, - 7, 8, 130, 1, 130, 130, 130, 1, - 130, 130, 130, 130, 130, 5, 6, 7, - 8, 130, 130, 130, 130, 130, 130, 130, - 10, 11, 12, 13, 14, 15, 16, 17, - 18, 5, 19, 20, 21, 22, 130, 23, - 24, 25, 130, 26, 27, 130, 29, 30, - 31, 32, 29, 130, 130, 130, 130, 35, - 130, 8, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 26, 27, 130, 8, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 27, 130, 1, 135, 135, - 135, 1, 135, 137, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 138, - 136, 33, 136, 137, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 33, 138, - 136, 138, 136, 137, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 136, 136, - 136, 136, 136, 136, 136, 136, 33, 136, - 34, 136, 0 + 1, 0, 2, 0, 3, 4, 5, 5, + 6, 7, 5, 5, 5, 5, 5, 8, + 9, 10, 11, 5, 5, 5, 12, 5, + 5, 5, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 8, 22, 23, 24, 25, + 5, 26, 27, 28, 5, 29, 30, 31, + 32, 33, 34, 35, 32, 1, 5, 36, + 5, 37, 5, 39, 40, 38, 41, 38, + 38, 38, 38, 38, 38, 38, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 39, + 51, 52, 53, 54, 38, 55, 56, 57, + 38, 58, 59, 38, 60, 61, 62, 63, + 60, 38, 38, 38, 38, 64, 38, 39, + 40, 38, 41, 38, 38, 38, 38, 38, + 38, 38, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 39, 51, 52, 53, 54, + 38, 55, 56, 57, 38, 38, 38, 38, + 60, 61, 62, 63, 60, 38, 38, 38, + 38, 64, 38, 39, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 41, 38, 38, 38, 38, 38, 38, 38, + 38, 43, 44, 45, 46, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 55, + 56, 57, 38, 38, 38, 38, 38, 61, + 62, 63, 65, 38, 38, 38, 38, 43, + 38, 41, 38, 38, 38, 38, 38, 38, + 38, 38, 43, 44, 45, 46, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 55, 56, 57, 38, 38, 38, 38, 38, + 61, 62, 63, 65, 38, 41, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 44, + 45, 46, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 61, 62, 63, 38, + 41, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 45, 46, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 61, + 62, 63, 38, 41, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 46, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 61, 62, 63, 38, 41, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 61, 62, 38, + 41, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 62, 38, 41, 38, 41, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 44, 45, + 46, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 55, 56, 57, 38, 38, + 38, 38, 38, 61, 62, 63, 65, 38, + 41, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 44, 45, 46, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 56, 57, 38, 38, 38, 38, 38, 61, + 62, 63, 65, 38, 41, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 44, 45, + 46, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 57, 38, 38, + 38, 38, 38, 61, 62, 63, 65, 38, + 66, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 41, 38, 41, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 44, 45, 46, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 61, 62, + 63, 65, 38, 41, 38, 38, 38, 38, + 38, 38, 38, 42, 43, 44, 45, 46, + 38, 38, 38, 38, 38, 38, 52, 53, + 54, 38, 55, 56, 57, 38, 38, 38, + 38, 38, 61, 62, 63, 65, 38, 38, + 38, 38, 43, 38, 41, 38, 38, 38, + 38, 38, 38, 38, 38, 43, 44, 45, + 46, 38, 38, 38, 38, 38, 38, 52, + 53, 54, 38, 55, 56, 57, 38, 38, + 38, 38, 38, 61, 62, 63, 65, 38, + 38, 38, 38, 43, 38, 41, 38, 38, + 38, 38, 38, 38, 38, 38, 43, 44, + 45, 46, 38, 38, 38, 38, 38, 38, + 38, 53, 54, 38, 55, 56, 57, 38, + 38, 38, 38, 38, 61, 62, 63, 65, + 38, 38, 38, 38, 43, 38, 41, 38, + 38, 38, 38, 38, 38, 38, 38, 43, + 44, 45, 46, 38, 38, 38, 38, 38, + 38, 38, 38, 54, 38, 55, 56, 57, + 38, 38, 38, 38, 38, 61, 62, 63, + 65, 38, 38, 38, 38, 43, 38, 67, + 38, 41, 38, 38, 38, 38, 38, 38, + 38, 42, 43, 44, 45, 46, 38, 48, + 49, 38, 38, 38, 52, 53, 54, 38, + 55, 56, 57, 38, 38, 38, 38, 38, + 61, 62, 63, 65, 38, 38, 38, 38, + 43, 38, 41, 38, 38, 38, 38, 38, + 38, 38, 38, 43, 44, 45, 46, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 55, 56, 57, 38, 38, 38, 38, + 38, 61, 62, 63, 65, 38, 38, 38, + 38, 43, 38, 67, 38, 41, 38, 38, + 38, 38, 38, 38, 38, 42, 43, 44, + 45, 46, 38, 38, 49, 38, 38, 38, + 52, 53, 54, 38, 55, 56, 57, 38, + 38, 38, 38, 38, 61, 62, 63, 65, + 38, 38, 38, 38, 43, 38, 67, 38, + 41, 38, 38, 38, 38, 38, 38, 38, + 42, 43, 44, 45, 46, 38, 38, 38, + 38, 38, 38, 52, 53, 54, 38, 55, + 56, 57, 38, 38, 38, 38, 38, 61, + 62, 63, 65, 38, 38, 38, 38, 43, + 38, 67, 38, 41, 38, 38, 38, 38, + 38, 38, 38, 42, 43, 44, 45, 46, + 47, 48, 49, 38, 38, 38, 52, 53, + 54, 38, 55, 56, 57, 38, 38, 38, + 38, 38, 61, 62, 63, 65, 38, 38, + 38, 38, 43, 38, 39, 40, 38, 41, + 38, 38, 38, 38, 38, 38, 38, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 38, 51, 52, 53, 54, 38, 55, 56, + 57, 38, 38, 38, 38, 60, 61, 62, + 63, 60, 38, 38, 38, 38, 64, 38, + 39, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 41, 38, 39, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 41, 38, 38, 38, + 38, 38, 38, 38, 38, 43, 44, 45, + 46, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 55, 56, 57, 38, 38, + 38, 38, 38, 61, 62, 63, 65, 38, + 41, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 58, 59, 38, 41, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 59, 38, 4, 69, 68, 70, + 68, 68, 68, 68, 68, 68, 68, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 4, 80, 81, 82, 83, 68, 84, 85, + 86, 68, 68, 68, 68, 87, 88, 89, + 90, 91, 68, 68, 68, 68, 92, 68, + 4, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 70, 68, 68, + 68, 68, 68, 68, 68, 68, 72, 73, + 74, 75, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 84, 85, 86, 68, + 68, 68, 68, 68, 88, 89, 90, 93, + 68, 68, 68, 68, 72, 68, 70, 68, + 68, 68, 68, 68, 68, 68, 68, 72, + 73, 74, 75, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 84, 85, 86, + 68, 68, 68, 68, 68, 88, 89, 90, + 93, 68, 70, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 73, 74, 75, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 88, 89, 90, 68, 70, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 74, 75, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 88, 89, 90, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 75, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 88, + 89, 90, 68, 70, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 88, 89, 68, 70, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 89, 68, 70, + 68, 70, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 73, 74, 75, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 84, 85, 86, 68, 68, 68, 68, 68, + 88, 89, 90, 93, 68, 70, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 73, + 74, 75, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 85, 86, 68, + 68, 68, 68, 68, 88, 89, 90, 93, + 68, 70, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 73, 74, 75, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 86, 68, 68, 68, 68, 68, + 88, 89, 90, 93, 68, 95, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 96, 94, 70, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 73, 74, + 75, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 88, 89, 90, 93, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 71, 72, 73, 74, 75, 68, 68, 68, + 68, 68, 68, 81, 82, 83, 68, 84, + 85, 86, 68, 68, 68, 68, 68, 88, + 89, 90, 93, 68, 68, 68, 68, 72, + 68, 70, 68, 68, 68, 68, 68, 68, + 68, 68, 72, 73, 74, 75, 68, 68, + 68, 68, 68, 68, 81, 82, 83, 68, + 84, 85, 86, 68, 68, 68, 68, 68, + 88, 89, 90, 93, 68, 68, 68, 68, + 72, 68, 70, 68, 68, 68, 68, 68, + 68, 68, 68, 72, 73, 74, 75, 68, + 68, 68, 68, 68, 68, 68, 82, 83, + 68, 84, 85, 86, 68, 68, 68, 68, + 68, 88, 89, 90, 93, 68, 68, 68, + 68, 72, 68, 70, 68, 68, 68, 68, + 68, 68, 68, 68, 72, 73, 74, 75, + 68, 68, 68, 68, 68, 68, 68, 68, + 83, 68, 84, 85, 86, 68, 68, 68, + 68, 68, 88, 89, 90, 93, 68, 68, + 68, 68, 72, 68, 97, 68, 70, 68, + 68, 68, 68, 68, 68, 68, 71, 72, + 73, 74, 75, 68, 77, 78, 68, 68, + 68, 81, 82, 83, 68, 84, 85, 86, + 68, 68, 68, 68, 68, 88, 89, 90, + 93, 68, 68, 68, 68, 72, 68, 70, + 68, 68, 68, 68, 68, 68, 68, 68, + 72, 73, 74, 75, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 84, 85, + 86, 68, 68, 68, 68, 68, 88, 89, + 90, 93, 68, 68, 68, 68, 72, 68, + 97, 68, 70, 68, 68, 68, 68, 68, + 68, 68, 71, 72, 73, 74, 75, 68, + 68, 78, 68, 68, 68, 81, 82, 83, + 68, 84, 85, 86, 68, 68, 68, 68, + 68, 88, 89, 90, 93, 68, 68, 68, + 68, 72, 68, 97, 68, 70, 68, 68, + 68, 68, 68, 68, 68, 71, 72, 73, + 74, 75, 68, 68, 68, 68, 68, 68, + 81, 82, 83, 68, 84, 85, 86, 68, + 68, 68, 68, 68, 88, 89, 90, 93, + 68, 68, 68, 68, 72, 68, 97, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 71, 72, 73, 74, 75, 76, 77, 78, + 68, 68, 68, 81, 82, 83, 68, 84, + 85, 86, 68, 68, 68, 68, 68, 88, + 89, 90, 93, 68, 68, 68, 68, 72, + 68, 4, 69, 68, 70, 68, 68, 68, + 68, 68, 68, 68, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 68, 80, 81, + 82, 83, 68, 84, 85, 86, 68, 68, + 68, 68, 87, 88, 89, 90, 91, 68, + 68, 68, 68, 92, 68, 4, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 99, 98, 4, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 96, 94, 4, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 68, 72, 73, 74, 75, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 84, + 85, 86, 68, 68, 68, 68, 68, 88, + 89, 90, 93, 68, 101, 102, 100, 6, + 103, 103, 103, 103, 103, 103, 103, 103, + 103, 104, 103, 105, 106, 68, 70, 68, + 68, 68, 68, 68, 68, 68, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 105, + 116, 117, 118, 119, 68, 120, 121, 122, + 68, 58, 59, 68, 123, 124, 125, 126, + 127, 68, 68, 68, 68, 128, 68, 105, + 106, 68, 70, 68, 68, 68, 68, 68, + 68, 68, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 105, 116, 117, 118, 119, + 68, 120, 121, 122, 68, 68, 68, 68, + 123, 124, 125, 126, 127, 68, 68, 68, + 68, 128, 68, 105, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 68, 108, 109, 110, 111, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 120, + 121, 122, 68, 68, 68, 68, 68, 124, + 125, 126, 129, 68, 68, 68, 68, 108, + 68, 70, 68, 68, 68, 68, 68, 68, + 68, 68, 108, 109, 110, 111, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 120, 121, 122, 68, 68, 68, 68, 68, + 124, 125, 126, 129, 68, 70, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 109, + 110, 111, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 124, 125, 126, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 110, 111, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 124, + 125, 126, 68, 70, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 111, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 124, 125, 126, 68, 70, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 124, 125, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 125, 68, 70, 68, 70, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 109, 110, + 111, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 120, 121, 122, 68, 68, + 68, 68, 68, 124, 125, 126, 129, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 109, 110, 111, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 121, 122, 68, 68, 68, 68, 68, 124, + 125, 126, 129, 68, 70, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 109, 110, + 111, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 122, 68, 68, + 68, 68, 68, 124, 125, 126, 129, 68, + 130, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 96, 94, 70, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 109, 110, 111, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 124, 125, + 126, 129, 68, 70, 68, 68, 68, 68, + 68, 68, 68, 107, 108, 109, 110, 111, + 68, 68, 68, 68, 68, 68, 117, 118, + 119, 68, 120, 121, 122, 68, 68, 68, + 68, 68, 124, 125, 126, 129, 68, 68, + 68, 68, 108, 68, 70, 68, 68, 68, + 68, 68, 68, 68, 68, 108, 109, 110, + 111, 68, 68, 68, 68, 68, 68, 117, + 118, 119, 68, 120, 121, 122, 68, 68, + 68, 68, 68, 124, 125, 126, 129, 68, + 68, 68, 68, 108, 68, 70, 68, 68, + 68, 68, 68, 68, 68, 68, 108, 109, + 110, 111, 68, 68, 68, 68, 68, 68, + 68, 118, 119, 68, 120, 121, 122, 68, + 68, 68, 68, 68, 124, 125, 126, 129, + 68, 68, 68, 68, 108, 68, 70, 68, + 68, 68, 68, 68, 68, 68, 68, 108, + 109, 110, 111, 68, 68, 68, 68, 68, + 68, 68, 68, 119, 68, 120, 121, 122, + 68, 68, 68, 68, 68, 124, 125, 126, + 129, 68, 68, 68, 68, 108, 68, 131, + 68, 70, 68, 68, 68, 68, 68, 68, + 68, 107, 108, 109, 110, 111, 68, 113, + 114, 68, 68, 68, 117, 118, 119, 68, + 120, 121, 122, 68, 68, 68, 68, 68, + 124, 125, 126, 129, 68, 68, 68, 68, + 108, 68, 70, 68, 68, 68, 68, 68, + 68, 68, 68, 108, 109, 110, 111, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 120, 121, 122, 68, 68, 68, 68, + 68, 124, 125, 126, 129, 68, 68, 68, + 68, 108, 68, 131, 68, 70, 68, 68, + 68, 68, 68, 68, 68, 107, 108, 109, + 110, 111, 68, 68, 114, 68, 68, 68, + 117, 118, 119, 68, 120, 121, 122, 68, + 68, 68, 68, 68, 124, 125, 126, 129, + 68, 68, 68, 68, 108, 68, 131, 68, + 70, 68, 68, 68, 68, 68, 68, 68, + 107, 108, 109, 110, 111, 68, 68, 68, + 68, 68, 68, 117, 118, 119, 68, 120, + 121, 122, 68, 68, 68, 68, 68, 124, + 125, 126, 129, 68, 68, 68, 68, 108, + 68, 131, 68, 70, 68, 68, 68, 68, + 68, 68, 68, 107, 108, 109, 110, 111, + 112, 113, 114, 68, 68, 68, 117, 118, + 119, 68, 120, 121, 122, 68, 68, 68, + 68, 68, 124, 125, 126, 129, 68, 68, + 68, 68, 108, 68, 105, 106, 68, 70, + 68, 68, 68, 68, 68, 68, 68, 107, + 108, 109, 110, 111, 112, 113, 114, 115, + 68, 116, 117, 118, 119, 68, 120, 121, + 122, 68, 68, 68, 68, 123, 124, 125, + 126, 127, 68, 68, 68, 68, 128, 68, + 105, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 99, 98, 105, + 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 96, 94, 105, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 70, 68, 68, 68, 68, + 68, 68, 68, 68, 108, 109, 110, 111, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 120, 121, 122, 68, 68, 68, + 68, 68, 124, 125, 126, 129, 68, 8, + 9, 132, 11, 132, 132, 132, 132, 132, + 132, 132, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 8, 22, 23, 24, 25, + 132, 26, 27, 28, 132, 132, 132, 132, + 32, 33, 34, 35, 32, 132, 132, 132, + 132, 37, 132, 8, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 11, 132, 132, 132, 132, 132, 132, 132, + 132, 14, 15, 16, 17, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 26, + 27, 28, 132, 132, 132, 132, 132, 33, + 34, 35, 133, 132, 132, 132, 132, 14, + 132, 11, 132, 132, 132, 132, 132, 132, + 132, 132, 14, 15, 16, 17, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 26, 27, 28, 132, 132, 132, 132, 132, + 33, 34, 35, 133, 132, 11, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 15, + 16, 17, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 33, 34, 35, 132, + 11, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 16, 17, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 33, + 34, 35, 132, 11, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 17, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 33, 34, 35, 132, 11, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 33, 34, 132, + 11, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 34, 132, 11, 132, 11, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 15, 16, + 17, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 26, 27, 28, 132, 132, + 132, 132, 132, 33, 34, 35, 133, 132, + 11, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 15, 16, 17, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 27, 28, 132, 132, 132, 132, 132, 33, + 34, 35, 133, 132, 11, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 15, 16, + 17, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 28, 132, 132, + 132, 132, 132, 33, 34, 35, 133, 132, + 134, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 11, 132, 11, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 15, 16, 17, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 33, 34, + 35, 133, 132, 11, 132, 132, 132, 132, + 132, 132, 132, 13, 14, 15, 16, 17, + 132, 132, 132, 132, 132, 132, 23, 24, + 25, 132, 26, 27, 28, 132, 132, 132, + 132, 132, 33, 34, 35, 133, 132, 132, + 132, 132, 14, 132, 11, 132, 132, 132, + 132, 132, 132, 132, 132, 14, 15, 16, + 17, 132, 132, 132, 132, 132, 132, 23, + 24, 25, 132, 26, 27, 28, 132, 132, + 132, 132, 132, 33, 34, 35, 133, 132, + 132, 132, 132, 14, 132, 11, 132, 132, + 132, 132, 132, 132, 132, 132, 14, 15, + 16, 17, 132, 132, 132, 132, 132, 132, + 132, 24, 25, 132, 26, 27, 28, 132, + 132, 132, 132, 132, 33, 34, 35, 133, + 132, 132, 132, 132, 14, 132, 11, 132, + 132, 132, 132, 132, 132, 132, 132, 14, + 15, 16, 17, 132, 132, 132, 132, 132, + 132, 132, 132, 25, 132, 26, 27, 28, + 132, 132, 132, 132, 132, 33, 34, 35, + 133, 132, 132, 132, 132, 14, 132, 135, + 132, 11, 132, 132, 132, 132, 132, 132, + 132, 13, 14, 15, 16, 17, 132, 19, + 20, 132, 132, 132, 23, 24, 25, 132, + 26, 27, 28, 132, 132, 132, 132, 132, + 33, 34, 35, 133, 132, 132, 132, 132, + 14, 132, 11, 132, 132, 132, 132, 132, + 132, 132, 132, 14, 15, 16, 17, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 26, 27, 28, 132, 132, 132, 132, + 132, 33, 34, 35, 133, 132, 132, 132, + 132, 14, 132, 135, 132, 11, 132, 132, + 132, 132, 132, 132, 132, 13, 14, 15, + 16, 17, 132, 132, 20, 132, 132, 132, + 23, 24, 25, 132, 26, 27, 28, 132, + 132, 132, 132, 132, 33, 34, 35, 133, + 132, 132, 132, 132, 14, 132, 135, 132, + 11, 132, 132, 132, 132, 132, 132, 132, + 13, 14, 15, 16, 17, 132, 132, 132, + 132, 132, 132, 23, 24, 25, 132, 26, + 27, 28, 132, 132, 132, 132, 132, 33, + 34, 35, 133, 132, 132, 132, 132, 14, + 132, 135, 132, 11, 132, 132, 132, 132, + 132, 132, 132, 13, 14, 15, 16, 17, + 18, 19, 20, 132, 132, 132, 23, 24, + 25, 132, 26, 27, 28, 132, 132, 132, + 132, 132, 33, 34, 35, 133, 132, 132, + 132, 132, 14, 132, 8, 9, 132, 11, + 132, 132, 132, 132, 132, 132, 132, 13, + 14, 15, 16, 17, 18, 19, 20, 21, + 132, 22, 23, 24, 25, 132, 26, 27, + 28, 132, 132, 132, 132, 32, 33, 34, + 35, 32, 132, 132, 132, 132, 37, 132, + 8, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 11, 132, 8, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 11, 132, 132, 132, + 132, 132, 132, 132, 132, 14, 15, 16, + 17, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 26, 27, 28, 132, 132, + 132, 132, 132, 33, 34, 35, 133, 132, + 136, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 11, 132, 10, 11, 132, 4, + 132, 132, 132, 4, 132, 132, 132, 132, + 132, 8, 9, 10, 11, 132, 132, 132, + 132, 132, 132, 132, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 8, 22, 23, + 24, 25, 132, 26, 27, 28, 132, 29, + 30, 132, 32, 33, 34, 35, 32, 132, + 132, 132, 132, 37, 132, 11, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 29, 30, 132, 11, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 30, + 132, 4, 137, 137, 137, 4, 137, 139, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 140, 138, 141, 138, 141, + 142, 138, 139, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 1, 140, 140, + 138, 139, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 140, 138, 141, + 138, 139, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 140, 138, 141, + 138, 141, 138, 39, 40, 38, 41, 38, + 38, 38, 38, 38, 38, 38, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 39, + 51, 52, 53, 54, 38, 55, 56, 57, + 38, 58, 59, 38, 60, 61, 62, 63, + 60, 1, 38, 2, 38, 64, 38, 0 }; static const char _use_syllable_machine_trans_targs[] = { - 1, 30, 0, 57, 59, 87, 88, 113, - 0, 115, 101, 89, 90, 91, 92, 105, - 107, 108, 109, 110, 102, 103, 104, 96, - 97, 98, 116, 117, 118, 111, 93, 94, - 95, 119, 121, 112, 0, 2, 3, 0, - 16, 4, 5, 6, 7, 20, 22, 23, - 24, 25, 17, 18, 19, 11, 12, 13, - 28, 29, 26, 8, 9, 10, 27, 14, - 15, 21, 0, 31, 0, 44, 32, 33, - 34, 35, 48, 50, 51, 52, 53, 45, - 46, 47, 39, 40, 41, 54, 36, 37, - 38, 55, 56, 42, 0, 43, 0, 49, - 0, 0, 0, 58, 0, 0, 0, 60, - 61, 74, 62, 63, 64, 65, 78, 80, - 81, 82, 83, 75, 76, 77, 69, 70, - 71, 84, 66, 67, 68, 85, 86, 72, - 73, 79, 0, 99, 100, 106, 114, 0, - 0, 0, 120 + 1, 120, 0, 2, 31, 1, 58, 60, + 88, 89, 114, 1, 116, 102, 90, 91, + 92, 93, 106, 108, 109, 110, 111, 103, + 104, 105, 97, 98, 99, 117, 118, 119, + 112, 94, 95, 96, 124, 113, 1, 3, + 4, 1, 17, 5, 6, 7, 8, 21, + 23, 24, 25, 26, 18, 19, 20, 12, + 13, 14, 29, 30, 27, 9, 10, 11, + 28, 15, 16, 22, 1, 32, 1, 45, + 33, 34, 35, 36, 49, 51, 52, 53, + 54, 46, 47, 48, 40, 41, 42, 55, + 37, 38, 39, 56, 57, 43, 1, 44, + 1, 50, 1, 1, 1, 59, 1, 1, + 1, 61, 62, 75, 63, 64, 65, 66, + 79, 81, 82, 83, 84, 76, 77, 78, + 70, 71, 72, 85, 67, 68, 69, 86, + 87, 73, 74, 80, 1, 100, 101, 107, + 115, 1, 1, 1, 121, 122, 123 }; static const char _use_syllable_machine_trans_actions[] = { - 0, 0, 3, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 4, 0, 0, + 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, 0, 0, 0, 5, 0, 0, 6, - 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, 7, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 7, 0, + 0, 8, 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, 9, 0, 10, 0, - 11, 12, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 0, + 12, 0, 13, 14, 15, 0, 16, 17, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 0, 0, 18, - 19, 20, 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, + 0, 20, 21, 22, 0, 0, 0 }; static const char _use_syllable_machine_to_state_actions[] = { - 1, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 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, @@ -756,11 +769,11 @@ static const char _use_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 }; static const char _use_syllable_machine_from_state_actions[] = { - 2, 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, @@ -775,40 +788,40 @@ static const char _use_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 }; static const short _use_syllable_machine_eof_trans[] = { - 0, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 93, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 97, 93, - 67, 99, 102, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 93, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 97, 93, 67, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 136, 137, - 137, 137 + 1, 0, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 95, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 99, + 95, 69, 101, 104, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, + 69, 95, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 99, 95, 69, + 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 138, + 139, 139, 139, 139, 39 }; -static const int use_syllable_machine_start = 0; -static const int use_syllable_machine_first_final = 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 = 0; +static const int use_syllable_machine_en_main = 1; #line 58 "hb-ot-shaper-use-machine.rl" -#line 182 "hb-ot-shaper-use-machine.rl" +#line 184 "hb-ot-shaper-use-machine.rl" #define found_syllable(syllable_type) \ @@ -907,7 +920,7 @@ find_syllables_use (hb_buffer_t *buffer) unsigned int act HB_UNUSED; int cs; -#line 911 "hb-ot-shaper-use-machine.hh" +#line 924 "hb-ot-shaper-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -915,12 +928,12 @@ find_syllables_use (hb_buffer_t *buffer) act = 0; } -#line 282 "hb-ot-shaper-use-machine.rl" +#line 284 "hb-ot-shaper-use-machine.rl" unsigned int syllable_serial = 1; -#line 924 "hb-ot-shaper-use-machine.hh" +#line 937 "hb-ot-shaper-use-machine.hh" { int _slen; int _trans; @@ -930,11 +943,11 @@ find_syllables_use (hb_buffer_t *buffer) goto _test_eof; _resume: switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 2: + case 3: #line 1 "NONE" {ts = p;} break; -#line 938 "hb-ot-shaper-use-machine.hh" +#line 951 "hb-ot-shaper-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -952,88 +965,96 @@ _eof_trans: goto _again; switch ( _use_syllable_machine_trans_actions[_trans] ) { - case 12: -#line 170 "hb-ot-shaper-use-machine.rl" + case 6: +#line 1 "NONE" + {te = p+1;} + break; + case 14: +#line 172 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_virama_terminated_cluster); }} break; - case 10: -#line 171 "hb-ot-shaper-use-machine.rl" + case 12: +#line 173 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_sakot_terminated_cluster); }} break; - case 8: -#line 172 "hb-ot-shaper-use-machine.rl" + case 10: +#line 174 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_standard_cluster); }} break; - case 16: -#line 173 "hb-ot-shaper-use-machine.rl" + case 18: +#line 175 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_number_joiner_terminated_cluster); }} break; - case 14: -#line 174 "hb-ot-shaper-use-machine.rl" + case 16: +#line 176 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_numeral_cluster); }} break; - case 6: -#line 175 "hb-ot-shaper-use-machine.rl" + case 8: +#line 177 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_symbol_cluster); }} break; - case 20: -#line 176 "hb-ot-shaper-use-machine.rl" + case 22: +#line 178 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_hieroglyph_cluster); }} break; - case 4: -#line 177 "hb-ot-shaper-use-machine.rl" + case 5: +#line 179 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; - case 3: -#line 178 "hb-ot-shaper-use-machine.rl" + case 4: +#line 180 "hb-ot-shaper-use-machine.rl" {te = p+1;{ found_syllable (use_non_cluster); }} break; - case 11: -#line 170 "hb-ot-shaper-use-machine.rl" + case 13: +#line 172 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_virama_terminated_cluster); }} break; - case 9: -#line 171 "hb-ot-shaper-use-machine.rl" + case 11: +#line 173 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_sakot_terminated_cluster); }} break; - case 7: -#line 172 "hb-ot-shaper-use-machine.rl" + case 9: +#line 174 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_standard_cluster); }} break; - case 15: -#line 173 "hb-ot-shaper-use-machine.rl" + case 17: +#line 175 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_number_joiner_terminated_cluster); }} break; - case 13: -#line 174 "hb-ot-shaper-use-machine.rl" + case 15: +#line 176 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_numeral_cluster); }} break; - case 5: -#line 175 "hb-ot-shaper-use-machine.rl" + case 7: +#line 177 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_symbol_cluster); }} break; - case 19: -#line 176 "hb-ot-shaper-use-machine.rl" + case 21: +#line 178 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_hieroglyph_cluster); }} break; - case 17: -#line 177 "hb-ot-shaper-use-machine.rl" + case 19: +#line 179 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; - case 18: -#line 178 "hb-ot-shaper-use-machine.rl" + case 20: +#line 180 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_non_cluster); }} break; -#line 1028 "hb-ot-shaper-use-machine.hh" + case 1: +#line 177 "hb-ot-shaper-use-machine.rl" + {{p = ((te))-1;}{ found_syllable (use_symbol_cluster); }} + break; +#line 1049 "hb-ot-shaper-use-machine.hh" } _again: switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 1: + case 2: #line 1 "NONE" {ts = 0;} break; -#line 1037 "hb-ot-shaper-use-machine.hh" +#line 1058 "hb-ot-shaper-use-machine.hh" } if ( ++p != pe ) @@ -1049,7 +1070,7 @@ _again: } -#line 287 "hb-ot-shaper-use-machine.rl" +#line 289 "hb-ot-shaper-use-machine.rl" } diff --git a/src/hb-ot-shaper-use-machine.rl b/src/hb-ot-shaper-use-machine.rl index bd55380ab..374fcad9f 100644 --- a/src/hb-ot-shaper-use-machine.rl +++ b/src/hb-ot-shaper-use-machine.rl @@ -83,6 +83,8 @@ export J = 50; # HIEROGLYPH_JOINER export SB = 51; # HIEROGLYPH_SEGMENT_BEGIN export SE = 52; # HIEROGLYPH_SEGMENT_END export HVM = 53; # HALANT_OR_VOWEL_MODIFIER +export HM = 54; # HIEROGLYPH_MOD +export HR = 55; # HIEROGLYPH_MIRROR export FAbv = 24; # CONS_FINAL_ABOVE export FBlw = 25; # CONS_FINAL_BELOW @@ -162,8 +164,8 @@ broken_cluster = number_joiner_terminated_cluster = N number_joiner_terminated_cluster_tail; numeral_cluster = N numeral_cluster_tail?; -symbol_cluster = (O | GB) tail?; -hieroglyph_cluster = SB+ | SB* G SE* (J SE* (G SE*)?)*; +symbol_cluster = (O | GB | SB) tail?; +hieroglyph_cluster = SB* G HR? HM? SE* (J SB* (G HR? HM? SE*)?)*; other = any; main := |* diff --git a/src/hb-ot-shaper-use-table.hh b/src/hb-ot-shaper-use-table.hh index 6b6b552ee..66fba6b92 100644 --- a/src/hb-ot-shaper-use-table.hh +++ b/src/hb-ot-shaper-use-table.hh @@ -26,6 +26,7 @@ * # Updated for Unicode 13.0 by Andrew Glass 2020-07-28 * # Updated for Unicode 14.0 by Andrew Glass 2021-09-25 * # Updated for Unicode 15.0 by Andrew Glass 2022-09-16 + * # Updated for Unicode 15.1 by Andrew Glass 2023-09-14 * # Override values For Indic_Positional_Category * # Not derivable * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17 @@ -36,6 +37,7 @@ * # Updated for Unicode 13.0 by Andrew Glass 2020-07-28 * # Updated for Unicode 14.0 by Andrew Glass 2021-09-28 * # Updated for Unicode 15.0 by Andrew Glass 2022-09-16 + * # Updated for Unicode 15.1 by Andrew Glass 2023-09-14 * UnicodeData.txt does not have a header. */ @@ -54,7 +56,9 @@ #define G USE(G) /* HIEROGLYPH */ #define GB USE(GB) /* BASE_OTHER */ #define H USE(H) /* HALANT */ +#define HM USE(HM) /* HIEROGLYPH_MOD */ #define HN USE(HN) /* HALANT_NUM */ +#define HR USE(HR) /* HIEROGLYPH_MIRROR */ #define HVM USE(HVM) /* HALANT_OR_VOWEL_MODIFIER */ #define IS USE(IS) /* INVISIBLE_STACKER */ #define J USE(J) /* HIEROGLYPH_JOINER */ @@ -95,7 +99,7 @@ #ifndef HB_OPTIMIZE_SIZE static const uint8_t -hb_use_u8[3141] = +hb_use_u8[3187] = { 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 51, 57, 58, 179, 195, 61, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, @@ -109,244 +113,249 @@ hb_use_u8[3141] = 18, 19, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 2, 33, 2, 2, 2, 2, 34, 35, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 37, 2, 2, 2, 2, + 37, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 38, 2, 39, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 38, 39, 40, 41, 42, 43, 2, 44, 2, 2, 2, 2, 2, 2, 2, + 2, 40, 41, 42, 43, 44, 45, 2, 46, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 46, 2, - 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 49, 2, 2, 2, - 2, 2, 2, 2, 2, 50, 51, 2, 52, 2, 2, 53, 2, 2, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 2, 64, 65, 2, 66, 67, 68, 69, - 2, 70, 2, 71, 72, 73, 74, 2, 2, 75, 76, 77, 78, 2, 79, 80, - 2, 81, 81, 81, 81, 81, 81, 81, 81, 82, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 47, 48, 2, + 49, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 51, 2, 2, 2, + 2, 2, 2, 2, 2, 52, 53, 2, 54, 2, 2, 55, 2, 2, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 2, 66, 67, 2, 68, 69, 70, 71, + 2, 72, 2, 73, 74, 75, 76, 2, 2, 77, 78, 79, 80, 2, 81, 82, + 2, 83, 83, 83, 83, 83, 83, 83, 83, 84, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 83, 84, 2, 2, 2, 2, 2, 2, 2, 85, - 86, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 81, 81, 81, 87, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 85, 86, 2, 2, 2, 2, 2, 2, 2, 87, + 88, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 89, 89, 89, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 88, 89, 2, 2, 2, 2, 2, - 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 91, 92, 2, 2, 2, 2, 2, + 2, 2, 2, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 91, 2, 2, 92, 2, 2, 2, 93, 2, 2, 2, 2, 2, - 2, 2, 2, 94, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 95, 95, 96, 97, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 2, 2, 2, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, - 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 8, 9, 9, 9, 9, 0, 0, 0, 7, 10, - 0, 2, 2, 2, 2, 11, 12, 0, 0, 9, 13, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 14, 15, 16, 17, 18, 19, 20, 14, 21, 22, - 23, 10, 24, 25, 18, 2, 2, 2, 2, 2, 18, 0, 2, 2, 2, 2, - 2, 0, 2, 2, 2, 2, 2, 2, 2, 26, 27, 28, 2, 2, 2, 7, - 28, 7, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, - 2, 7, 7, 0, 2, 2, 0, 15, 16, 17, 18, 29, 30, 31, 30, 32, - 0, 0, 0, 0, 33, 0, 0, 2, 28, 2, 0, 0, 0, 0, 0, 7, - 34, 10, 13, 28, 2, 2, 7, 0, 28, 7, 2, 28, 7, 2, 0, 35, - 16, 17, 29, 0, 25, 36, 25, 37, 0, 38, 0, 0, 0, 28, 2, 7, - 7, 0, 0, 0, 2, 2, 2, 2, 2, 39, 40, 41, 0, 0, 0, 0, - 0, 10, 13, 28, 2, 2, 2, 2, 28, 2, 28, 2, 2, 2, 2, 2, - 2, 7, 2, 28, 2, 2, 0, 15, 16, 17, 18, 19, 25, 20, 33, 22, - 0, 0, 0, 0, 0, 28, 39, 39, 42, 10, 27, 28, 2, 2, 2, 7, - 28, 7, 2, 28, 2, 2, 0, 15, 43, 0, 0, 25, 20, 0, 0, 2, - 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 44, 28, 2, 2, 7, 0, - 2, 7, 2, 2, 0, 28, 7, 7, 2, 0, 28, 7, 0, 2, 7, 0, - 2, 2, 2, 2, 2, 2, 0, 0, 21, 14, 45, 0, 46, 31, 46, 32, - 0, 0, 0, 0, 33, 0, 0, 0, 0, 13, 27, 47, 2, 2, 2, 7, - 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 15, - 20, 14, 21, 45, 20, 36, 20, 37, 0, 0, 0, 25, 29, 2, 7, 0, - 0, 8, 27, 28, 2, 2, 2, 7, 2, 2, 2, 28, 2, 2, 0, 15, - 43, 0, 0, 33, 45, 0, 0, 0, 7, 48, 49, 0, 0, 0, 0, 0, - 0, 9, 27, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 50, 51, - 21, 21, 17, 29, 46, 31, 46, 32, 52, 0, 0, 0, 33, 0, 0, 0, - 28, 10, 27, 28, 2, 2, 2, 2, 2, 2, 2, 2, 7, 0, 2, 2, - 2, 2, 28, 2, 2, 2, 2, 28, 0, 2, 2, 2, 7, 0, 53, 0, - 33, 21, 20, 29, 29, 16, 46, 46, 23, 0, 21, 0, 0, 0, 0, 0, - 0, 2, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, - 0, 2, 2, 54, 54, 55, 0, 0, 16, 2, 2, 2, 2, 28, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 7, 0, 56, 19, 57, 20, 20, 18, 18, - 44, 19, 9, 29, 9, 2, 2, 58, 59, 59, 59, 59, 59, 60, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, - 0, 0, 0, 0, 62, 0, 0, 0, 0, 2, 2, 2, 2, 2, 63, 43, - 57, 64, 20, 20, 65, 66, 67, 68, 69, 2, 2, 2, 2, 2, 1, 0, - 3, 2, 2, 2, 21, 18, 2, 2, 70, 69, 71, 72, 63, 71, 27, 27, - 2, 50, 20, 51, 2, 2, 2, 2, 2, 2, 73, 74, 75, 27, 27, 76, - 77, 2, 2, 2, 2, 2, 27, 43, 0, 2, 57, 78, 0, 0, 0, 0, - 28, 2, 57, 45, 0, 0, 0, 0, 0, 2, 57, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 7, 2, 7, 57, 0, 0, 0, 0, 0, - 0, 2, 2, 79, 43, 20, 57, 18, 46, 46, 46, 46, 13, 80, 81, 82, - 83, 84, 85, 0, 0, 0, 0, 86, 0, 7, 0, 0, 28, 0, 87, 79, - 88, 2, 2, 2, 2, 7, 0, 0, 0, 40, 40, 89, 90, 2, 2, 2, - 2, 2, 2, 2, 2, 11, 7, 0, 0, 91, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 7, 20, 78, 43, 20, 92, 59, 0, - 0, 93, 94, 93, 93, 95, 96, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 0, 2, 2, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, - 0, 2, 2, 2, 2, 27, 0, 0, 0, 2, 2, 2, 2, 2, 7, 0, - 0, 2, 2, 2, 50, 97, 43, 0, 0, 2, 2, 98, 99, 100, 101, 59, - 61, 102, 14, 43, 20, 57, 19, 78, 46, 46, 74, 9, 9, 9, 103, 44, - 38, 9, 104, 72, 2, 2, 2, 2, 2, 2, 2, 105, 20, 18, 18, 20, - 46, 46, 20, 106, 2, 2, 2, 7, 0, 0, 0, 0, 0, 0, 107, 108, - 109, 109, 109, 0, 0, 0, 0, 0, 0, 104, 72, 2, 2, 2, 2, 2, - 2, 58, 59, 57, 23, 20, 110, 59, 2, 2, 2, 2, 105, 20, 21, 43, - 43, 100, 12, 0, 0, 0, 0, 0, 0, 2, 2, 59, 16, 46, 21, 111, - 100, 100, 100, 112, 113, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 28, - 2, 9, 44, 114, 114, 114, 9, 114, 114, 13, 114, 114, 114, 24, 0, 38, - 0, 0, 0, 115, 49, 9, 3, 0, 0, 0, 0, 0, 0, 0, 116, 0, - 0, 0, 0, 0, 0, 0, 4, 117, 118, 40, 40, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 118, 118, 119, 118, 118, 118, 118, 118, 118, 118, - 118, 0, 0, 120, 0, 0, 0, 0, 0, 0, 5, 120, 0, 0, 0, 0, - 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 2, 2, 2, 2, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, - 121, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29, - 0, 2, 2, 0, 0, 0, 0, 0, 0, 27, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 122, 21, 21, 21, 21, 21, 21, 21, 123, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, - 50, 2, 2, 2, 20, 20, 124, 114, 0, 2, 2, 2, 125, 18, 57, 18, - 111, 100, 126, 0, 0, 0, 0, 0, 0, 9, 127, 2, 2, 2, 2, 2, - 2, 2, 128, 21, 20, 18, 46, 129, 130, 131, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 50, 28, 2, 2, 2, 2, 2, 2, 2, 2, 8, 20, 57, - 97, 74, 132, 133, 134, 0, 0, 0, 0, 2, 135, 2, 2, 2, 2, 136, - 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 137, 50, 51, 2, 2, - 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 138, 19, - 23, 0, 0, 139, 140, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 141, - 0, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, - 4, 118, 118, 118, 118, 119, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2, - 2, 2, 7, 2, 28, 2, 2, 2, 2, 2, 28, 2, 2, 2, 28, 7, - 0, 125, 18, 25, 29, 0, 0, 142, 143, 2, 2, 28, 2, 28, 2, 2, - 2, 2, 2, 2, 0, 12, 35, 0, 144, 2, 2, 11, 35, 0, 28, 2, - 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 2, - 7, 2, 2, 9, 39, 0, 0, 0, 0, 2, 2, 2, 2, 2, 25, 36, - 0, 2, 2, 2, 114, 114, 114, 114, 114, 145, 2, 7, 0, 0, 0, 0, - 0, 2, 12, 12, 0, 0, 0, 0, 0, 7, 2, 2, 7, 2, 2, 2, - 2, 28, 2, 7, 0, 28, 2, 0, 0, 146, 147, 148, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 131, 0, 0, 0, - 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 2, 2, 2, 2, - 2, 51, 50, 51, 0, 0, 0, 0, 150, 9, 72, 2, 2, 2, 2, 2, - 2, 16, 17, 19, 14, 22, 35, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 18, 20, 151, - 20, 19, 152, 153, 2, 2, 2, 2, 2, 0, 0, 63, 154, 0, 0, 0, - 0, 2, 11, 0, 0, 0, 0, 0, 0, 2, 63, 23, 18, 18, 18, 20, - 20, 106, 155, 0, 0, 54, 156, 29, 157, 28, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 158, 42, 0, 0, 0, - 47, 125, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 7, 7, 2, 2, - 28, 2, 2, 2, 2, 2, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2, - 8, 16, 17, 19, 20, 159, 29, 0, 0, 9, 9, 28, 2, 2, 2, 7, - 28, 7, 2, 28, 2, 2, 56, 15, 21, 14, 21, 45, 30, 31, 30, 32, - 0, 0, 0, 0, 33, 0, 0, 0, 2, 2, 21, 0, 9, 9, 9, 44, - 0, 9, 9, 44, 0, 0, 0, 0, 0, 2, 2, 63, 23, 18, 18, 18, - 20, 21, 123, 13, 15, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, - 160, 161, 0, 0, 0, 0, 0, 0, 0, 16, 17, 18, 18, 64, 97, 23, - 157, 9, 162, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 63, 23, 18, 18, 0, 46, 46, 9, 163, 35, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 18, 0, 21, 17, 18, 18, 19, 14, 80, - 163, 36, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 8, 164, - 23, 18, 20, 20, 162, 7, 0, 0, 0, 2, 2, 2, 2, 2, 7, 41, - 133, 21, 20, 18, 74, 19, 20, 0, 0, 2, 2, 2, 7, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 16, 17, 18, 19, 20, 103, 163, 35, 0, - 0, 2, 2, 2, 7, 28, 0, 2, 2, 2, 2, 28, 7, 2, 2, 2, - 2, 21, 21, 16, 30, 31, 10, 165, 166, 167, 168, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 0, 2, 2, 2, 63, 23, 18, 18, 0, 20, 21, - 27, 106, 0, 31, 0, 0, 0, 0, 0, 50, 18, 20, 20, 20, 137, 2, - 2, 2, 169, 170, 9, 13, 171, 70, 172, 0, 0, 1, 144, 0, 0, 0, - 0, 50, 18, 20, 14, 17, 18, 2, 2, 2, 2, 155, 155, 155, 173, 173, - 173, 173, 173, 173, 13, 174, 0, 28, 0, 20, 18, 18, 29, 20, 20, 9, - 163, 0, 59, 59, 59, 59, 59, 59, 59, 64, 19, 80, 44, 0, 0, 0, - 0, 2, 2, 2, 7, 2, 28, 2, 2, 50, 20, 20, 29, 0, 36, 20, - 25, 9, 156, 175, 171, 0, 0, 0, 0, 2, 2, 2, 28, 7, 2, 2, - 2, 2, 2, 2, 2, 2, 21, 21, 45, 20, 33, 80, 66, 0, 0, 0, - 0, 2, 176, 64, 45, 0, 0, 0, 0, 9, 177, 2, 2, 2, 2, 2, - 2, 2, 2, 21, 20, 18, 29, 0, 46, 14, 140, 0, 0, 0, 0, 0, - 0, 178, 178, 178, 106, 179, 178, 0, 0, 145, 2, 2, 180, 114, 114, 114, - 114, 114, 114, 114, 0, 0, 0, 0, 0, 9, 9, 9, 44, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 7, 0, 56, 181, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, - 38, 114, 24, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 56, - 35, 0, 4, 118, 118, 118, 119, 0, 0, 9, 9, 9, 47, 2, 2, 2, + 2, 2, 2, 94, 2, 2, 95, 2, 2, 2, 96, 2, 2, 2, 2, 2, + 2, 2, 2, 97, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 98, 98, 99, 100, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, + 0, 5, 0, 0, 0, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 11, + 11, 11, 11, 0, 0, 0, 9, 12, 0, 2, 2, 2, 2, 13, 14, 0, + 0, 11, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 17, + 18, 19, 20, 21, 22, 16, 23, 24, 25, 12, 26, 27, 20, 2, 2, 2, + 2, 2, 20, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, + 2, 28, 29, 30, 2, 2, 2, 9, 30, 9, 30, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 9, 2, 2, 2, 9, 9, 0, 2, 2, 0, 17, + 18, 19, 20, 31, 32, 33, 32, 34, 0, 0, 0, 0, 35, 0, 0, 2, + 30, 2, 0, 0, 0, 0, 0, 9, 36, 12, 15, 30, 2, 2, 9, 0, + 30, 9, 2, 30, 9, 2, 0, 37, 18, 19, 31, 0, 27, 38, 27, 39, + 0, 40, 0, 0, 0, 30, 2, 9, 9, 0, 0, 0, 2, 2, 2, 2, + 2, 41, 42, 43, 0, 0, 0, 0, 0, 12, 15, 30, 2, 2, 2, 2, + 30, 2, 30, 2, 2, 2, 2, 2, 2, 9, 2, 30, 2, 2, 0, 17, + 18, 19, 20, 21, 27, 22, 35, 24, 0, 0, 0, 0, 0, 30, 41, 41, + 44, 12, 29, 30, 2, 2, 2, 9, 30, 9, 2, 30, 2, 2, 0, 17, + 45, 0, 0, 27, 22, 0, 0, 2, 30, 30, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 30, 2, 2, 9, 0, 2, 9, 2, 2, 0, 30, 9, 9, + 2, 0, 30, 9, 0, 2, 9, 0, 2, 2, 2, 2, 2, 2, 0, 0, + 23, 16, 47, 0, 48, 33, 48, 34, 0, 0, 0, 0, 35, 0, 0, 0, + 0, 15, 29, 49, 2, 2, 2, 9, 2, 9, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 17, 22, 16, 23, 47, 22, 38, 22, 39, + 0, 0, 0, 27, 31, 2, 9, 0, 0, 10, 29, 30, 2, 2, 2, 9, + 2, 2, 2, 30, 2, 2, 0, 17, 45, 0, 0, 35, 47, 0, 0, 0, + 9, 50, 51, 0, 0, 0, 0, 0, 0, 11, 29, 2, 2, 2, 2, 9, + 2, 2, 2, 2, 2, 2, 52, 53, 23, 23, 19, 31, 48, 33, 48, 34, + 54, 0, 0, 0, 35, 0, 0, 0, 30, 12, 29, 30, 2, 2, 2, 2, + 2, 2, 2, 2, 9, 0, 2, 2, 2, 2, 30, 2, 2, 2, 2, 30, + 0, 2, 2, 2, 9, 0, 55, 0, 35, 23, 22, 31, 31, 18, 48, 48, + 25, 0, 23, 0, 0, 0, 0, 0, 0, 2, 0, 2, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 2, 56, 56, 57, 0, 0, + 18, 2, 2, 2, 2, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, + 0, 58, 21, 59, 22, 22, 20, 20, 46, 21, 11, 31, 11, 2, 2, 60, + 61, 61, 61, 61, 61, 62, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 63, 0, 0, 0, 0, 64, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 65, 45, 59, 66, 22, 22, 67, 68, 69, 70, + 71, 2, 2, 2, 2, 2, 1, 0, 5, 2, 2, 2, 23, 20, 2, 2, + 72, 71, 73, 74, 65, 73, 29, 29, 2, 52, 22, 53, 2, 2, 2, 2, + 2, 2, 75, 76, 77, 29, 29, 78, 79, 2, 2, 2, 2, 2, 29, 45, + 0, 2, 59, 80, 0, 0, 0, 0, 30, 2, 59, 47, 0, 0, 0, 0, + 0, 2, 59, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 9, + 2, 9, 59, 0, 0, 0, 0, 0, 0, 2, 2, 81, 45, 22, 59, 20, + 48, 48, 48, 48, 15, 82, 83, 84, 85, 86, 87, 0, 0, 0, 0, 88, + 0, 9, 0, 0, 30, 0, 89, 81, 90, 2, 2, 2, 2, 9, 0, 0, + 0, 42, 42, 91, 92, 2, 2, 2, 2, 2, 2, 2, 2, 13, 9, 0, + 0, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 9, 22, 80, 45, 22, 94, 61, 0, 0, 95, 96, 95, 95, 97, 98, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 9, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 29, 0, 0, + 0, 2, 2, 2, 2, 2, 9, 0, 0, 2, 2, 2, 52, 99, 45, 0, + 0, 2, 2, 100, 101, 102, 103, 61, 63, 104, 16, 45, 22, 59, 21, 80, + 48, 48, 76, 11, 11, 11, 105, 46, 40, 11, 106, 74, 2, 2, 2, 2, + 2, 2, 2, 107, 22, 20, 20, 22, 48, 48, 22, 108, 2, 2, 2, 9, + 0, 0, 0, 0, 0, 0, 109, 110, 111, 111, 111, 0, 0, 0, 0, 0, + 0, 106, 74, 2, 2, 2, 2, 2, 2, 60, 61, 59, 25, 22, 112, 61, + 2, 2, 2, 2, 107, 22, 23, 45, 45, 102, 14, 0, 0, 0, 0, 0, + 0, 2, 2, 61, 18, 48, 23, 113, 102, 102, 102, 114, 115, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 0, 30, 2, 11, 46, 116, 116, 116, 11, 116, + 116, 15, 116, 116, 116, 26, 0, 40, 0, 0, 0, 117, 51, 11, 5, 0, + 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 6, 119, + 120, 42, 42, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 120, + 121, 120, 120, 120, 120, 120, 120, 120, 120, 0, 0, 122, 0, 0, 0, 0, + 0, 0, 7, 122, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 123, 123, 0, 0, + 0, 2, 2, 2, 2, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, + 124, 0, 123, 123, 0, 0, 0, 0, 0, 2, 53, 2, 108, 2, 10, 2, + 2, 2, 65, 19, 16, 0, 0, 31, 0, 2, 2, 0, 0, 0, 0, 0, + 0, 29, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 23, 23, 23, 23, + 23, 23, 23, 126, 0, 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 2, 0, 0, 0, 0, 0, 52, 2, 2, 2, 22, 22, 127, 116, + 0, 2, 2, 2, 128, 20, 59, 20, 113, 102, 129, 0, 0, 0, 0, 0, + 0, 11, 130, 2, 2, 2, 2, 2, 2, 2, 131, 23, 22, 20, 48, 132, + 133, 134, 0, 0, 0, 0, 0, 0, 0, 2, 2, 52, 30, 2, 2, 2, + 2, 2, 2, 2, 2, 10, 22, 59, 99, 76, 135, 136, 137, 0, 0, 0, + 0, 2, 138, 2, 2, 2, 2, 139, 0, 30, 2, 42, 5, 0, 79, 15, + 2, 53, 22, 140, 52, 53, 2, 2, 105, 10, 9, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 141, 21, 25, 0, 0, 142, 143, 0, 0, 0, + 0, 2, 65, 45, 23, 80, 47, 144, 0, 81, 81, 81, 81, 81, 81, 81, + 81, 0, 0, 0, 0, 0, 0, 0, 6, 120, 120, 120, 120, 121, 0, 0, + 0, 2, 2, 2, 2, 2, 9, 2, 2, 2, 9, 2, 30, 2, 2, 2, + 2, 2, 30, 2, 2, 2, 30, 9, 0, 128, 20, 27, 31, 0, 0, 145, + 146, 2, 2, 30, 2, 30, 2, 2, 2, 2, 2, 2, 0, 14, 37, 0, + 147, 2, 2, 13, 37, 0, 30, 2, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 30, 2, 2, 9, 2, 2, 11, 41, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 27, 38, 0, 2, 2, 2, 116, 116, 116, 116, + 116, 148, 2, 9, 0, 0, 0, 0, 0, 2, 14, 14, 0, 0, 0, 0, + 0, 9, 2, 2, 9, 2, 2, 2, 2, 30, 2, 9, 0, 30, 2, 0, + 0, 149, 150, 151, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 22, 20, + 20, 20, 22, 22, 134, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 2, 2, 2, 2, 2, 53, 52, 53, 0, 0, 0, 0, + 153, 11, 74, 2, 2, 2, 2, 2, 2, 18, 19, 21, 16, 24, 37, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 11, 49, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 128, 20, 22, 154, 22, 21, 155, 156, 2, 2, 2, 2, + 2, 0, 0, 65, 157, 0, 0, 0, 0, 2, 13, 0, 0, 0, 0, 0, + 0, 2, 65, 25, 20, 20, 20, 22, 22, 108, 158, 0, 0, 56, 159, 31, + 160, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 23, + 19, 22, 22, 161, 44, 0, 0, 0, 49, 128, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 9, 9, 2, 2, 30, 2, 2, 2, 2, 2, 2, 2, + 30, 2, 2, 2, 2, 2, 2, 2, 10, 18, 19, 21, 22, 162, 31, 0, + 0, 11, 11, 30, 2, 2, 2, 9, 30, 9, 2, 30, 2, 2, 58, 17, + 23, 16, 23, 47, 32, 33, 32, 34, 0, 0, 0, 0, 35, 0, 0, 0, + 2, 2, 23, 0, 11, 11, 11, 46, 0, 11, 11, 46, 0, 0, 0, 0, + 0, 2, 2, 65, 25, 20, 20, 20, 22, 23, 126, 15, 17, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 0, 0, 163, 164, 0, 0, 0, 0, 0, 0, + 0, 18, 19, 20, 20, 66, 99, 25, 160, 11, 165, 9, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 65, 25, 20, 20, 0, 48, 48, 11, + 166, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 20, + 0, 23, 19, 20, 20, 21, 16, 82, 166, 38, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 10, 167, 25, 20, 22, 22, 165, 9, 0, 0, + 0, 2, 2, 2, 2, 2, 9, 43, 136, 23, 22, 20, 76, 21, 22, 0, + 0, 2, 2, 2, 9, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 18, + 19, 20, 21, 22, 105, 166, 37, 0, 0, 2, 2, 2, 9, 30, 0, 2, + 2, 2, 2, 30, 9, 2, 2, 2, 2, 23, 23, 18, 32, 33, 12, 168, + 169, 170, 171, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, + 2, 65, 25, 20, 20, 0, 22, 23, 29, 108, 0, 33, 0, 0, 0, 0, + 0, 52, 20, 22, 22, 22, 140, 2, 2, 2, 172, 173, 11, 15, 174, 72, + 175, 0, 0, 1, 147, 0, 0, 0, 0, 52, 20, 22, 16, 19, 20, 2, + 2, 2, 2, 158, 158, 158, 176, 176, 176, 176, 176, 176, 15, 177, 0, 30, + 0, 22, 20, 20, 31, 22, 22, 11, 166, 0, 61, 61, 61, 61, 61, 61, + 61, 66, 21, 82, 46, 0, 0, 0, 0, 2, 2, 2, 9, 2, 30, 2, + 2, 52, 22, 22, 31, 0, 38, 22, 27, 11, 159, 178, 174, 0, 0, 0, + 0, 2, 2, 2, 30, 9, 2, 2, 2, 2, 2, 2, 2, 2, 23, 23, + 47, 22, 35, 82, 68, 0, 0, 0, 0, 2, 179, 66, 47, 0, 0, 0, + 0, 11, 180, 2, 2, 2, 2, 2, 2, 2, 2, 23, 22, 20, 31, 0, + 48, 16, 143, 0, 0, 0, 0, 0, 0, 181, 181, 181, 181, 181, 181, 181, + 181, 182, 182, 182, 183, 184, 182, 181, 181, 185, 181, 181, 186, 187, 187, 187, + 187, 187, 187, 187, 0, 0, 0, 0, 0, 11, 11, 11, 46, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 9, 0, 58, 188, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, + 40, 116, 26, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, + 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 58, + 37, 0, 6, 120, 120, 120, 121, 0, 0, 11, 11, 11, 49, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, - 44, 2, 2, 2, 2, 2, 2, 9, 9, 2, 2, 2, 2, 2, 2, 20, - 20, 2, 2, 42, 42, 42, 90, 0, 0, O, O, O, GB, B, B, GB, - O, O, WJ,FMPst,FMPst, O, CGJ, B, O, B,VMAbv,VMAbv,VMAbv, O,VMAbv, B, - CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, - VAbv, VAbv, VAbv, VPst, VPst, VPst, H, VPre, VPst,VMBlw, O, O, VAbv, GB,VMAbv,VMPst, - VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O, VPst,FMAbv, O,CMBlw, - O, VAbv, O, VAbv, H, O,VMBlw,VMAbv,CMAbv, GB, GB, O, MBlw,CMAbv,CMAbv, VPst, - VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, B, O, CS, CS,VMPst, B, VAbv, VAbv, - B, R, O, HVM, O, O,FMBlw, O,CMAbv, O,CMBlw, VAbv, VBlw, B, SUB, SUB, - SUB, O, SUB, SUB, O,FMBlw, O, B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst, IS, VAbv, - MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst,VMPst,VMPst, B, MBlw, VPst, VPre, VAbv, VAbv, - VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv, - VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, B, CGJ, WJ, CGJ, GB,CMAbv,CMAbv, B, GB, - B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B, MPre, MBlw, - SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, H, B, O, - SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst, IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, - CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, O,FMPst, O, O, H, MPst, VPst, H, - VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv,VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, - O, VBlw, MPst, MPre, MAbv, MBlw, O, B, FAbv, FAbv, FPst, VBlw, B, B, VPre, O, - VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, - CS, CS, B, N, N, O, HN, VPre, VBlw, VAbv, IS,CMAbv, O, VPst, B, R, - R,CMBlw, VAbv, VPre,VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, - H,VMPst, VAbv,VMAbv, VPst, IS, R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, - MBlw, MBlw, GB, FBlw, FBlw,CMAbv, IS, VBlw, IS, GB, VAbv, R,VMPst, H, H, B, - H, B,VMBlw, O, VBlw, + 46, 2, 2, 2, 2, 2, 2, 11, 11, 2, 2, 2, 2, 2, 2, 22, + 22, 2, 2, 44, 44, 44, 92, 0, 0, O, O, O, GB, B, B, O, + SB, O, SE, GB, O, O, WJ,FMPst,FMPst, O, CGJ, B, O, B,VMAbv,VMAbv, + VMAbv, O,VMAbv, B,CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw, B, VPst, VPre, VPst, + VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VPst, H, VPre, VPst,VMBlw, O, O, + VAbv, GB,VMAbv,VMPst,VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O, + VPst,FMAbv, O,CMBlw, O, VAbv, O, VAbv, H, O,VMBlw,VMAbv,CMAbv, GB, GB, O, + MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, B, O, CS, CS, + VMPst, B, VAbv, VAbv, B, R, O, HVM, O, O,FMBlw, O,CMAbv, O,CMBlw, VAbv, + VBlw, B, SUB, SUB, SUB, O, SUB, SUB, O,FMBlw, O, B, VPst, VBlw, VPre,VMAbv, + VMBlw,VMPst, IS, VAbv, MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst,VMPst,VMPst, B, MBlw, + VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, CGJ, VPst,VMAbv,VMAbv, + FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, B, CGJ, WJ, CGJ, GB, + CMAbv,CMAbv, B, GB, B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, + VPre, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, + VPst, H, B, O,SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst, IS, VBlw, FAbv,VMPre,VMPre,FMAbv, + CMBlw,VMBlw,VMBlw,VMAbv, CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, O,FMPst, O, SB, + SE, O, H, MPst, VPst, H,VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv,VMPst, B, + CMAbv, VAbv, MBlw, MPst, MBlw, H, O, VBlw, MPst, MPre, MAbv, MBlw, O, B, FAbv, FAbv, + FPst, VBlw, B, B, VPre, O,VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv, O, + IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, B, N, N, O, HN, VPre, VBlw, VAbv, + IS,CMAbv, O, VPst, B, R, R,CMBlw, VAbv, VPre,VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, + B, CS, CS, H,CMBlw,VMPst, H,VMPst, VAbv,VMAbv, VPst, IS, R, MPst, R, MPst, + CMBlw, B,FMBlw, VBlw,VMAbv, R, MBlw, MBlw, GB, FBlw, FBlw,CMAbv, IS, VBlw, IS, GB, + VAbv, R,VMPst, G, G, J, J, J, SB, SE, J, HR, G, G, HM, HM, + HM, O, VBlw, }; static const uint16_t -hb_use_u16[784] = +hb_use_u16[808] = { - 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 11, - 0, 0, 0, 0, 9, 12, 0, 0, 13, 9, 9, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 17, 25, 26, 20, 21, 27, 28, 29, 30, 31, - 32, 33, 21, 34, 35, 0, 17, 36, 37, 20, 21, 38, 23, 39, 17, 40, - 41, 42, 43, 44, 45, 46, 30, 0, 47, 48, 21, 49, 50, 51, 17, 0, - 52, 48, 21, 53, 50, 54, 17, 55, 56, 48, 9, 57, 58, 59, 17, 0, - 60, 61, 9, 62, 63, 64, 30, 65, 66, 67, 9, 68, 69, 9, 70, 71, - 72, 73, 74, 75, 76, 0, 0, 0, 9, 9, 77, 78, 79, 80, 81, 82, - 83, 84, 0, 0, 0, 0, 0, 0, 9, 85, 9, 86, 9, 87, 88, 89, - 9, 9, 9, 90, 91, 92, 2, 0, 93, 0, 9, 9, 9, 9, 9, 94, - 95, 9, 96, 0, 0, 0, 0, 0, 97, 98, 99,100, 30, 9,101,102, - 9, 9,103, 9,104,105, 0, 0, 9,106, 9, 9, 9,107,108,109, - 2, 2, 0, 0, 0, 0, 0, 0,110, 9, 9,111,112, 2,113,114, - 115, 9,116, 9, 9, 9,117,118, 9, 9,119,120,121, 0, 0, 0, - 0, 0, 0, 0, 0,122,123,124, 0, 0, 0, 0, 0, 0, 0,125, - 126,127,128, 0, 0, 0,129,130,131, 0, 0, 0, 0, 0, 0,132, - 0, 0, 0, 0,133, 0, 0, 0, 0, 0, 0, 9, 9, 9,134,135, - 136, 9,137, 0, 9, 9, 9,138,139, 9, 9,140,141, 2,142,143, - 9, 9,144, 9,145,146, 0, 0,147, 9, 9,148,149, 2,150, 98, - 9, 9,151,152,153, 2, 9,154, 9, 9, 9,155,156, 0,157,158, - 0, 0, 0, 0, 9, 9,159, 2,160, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 0,162, - 0, 0, 0, 0, 0, 0, 0,163,163,164, 33,165, 0, 0, 0, 0, - 166,167, 9,168, 94, 0, 0, 0, 0, 0, 0, 0, 69, 9,169, 0, - 9,170,171, 0, 0, 0, 0, 0, 9, 9,172, 2, 0, 0, 0, 0, - 9, 9,173,170, 0, 0, 0, 0, 0, 0, 0, 9,174,175, 0, 9, - 176, 0, 0,177,178, 0, 0, 0,179, 9, 9,180,181,182,183,184, - 185, 9, 9,186,187, 0, 0, 0,188, 9,189,190,191, 9, 9,192, - 185, 9, 9,193,194,105,195,102, 9, 33,196,197,198, 0, 0, 0, - 199,200, 94, 9, 9,201,202, 2,203, 20, 21,204,205,206,207,208, - 9, 9, 9,209,210,211,212, 0,195, 9, 9,213,214, 2, 0, 0, - 9, 9,215,216,217,218, 0, 0, 9, 9, 9,219,220, 2, 0, 0, - 9, 9,221,222, 2, 0, 0, 0, 9,223,224,103,225, 0, 0, 0, - 9, 9,226,227, 0, 0, 0, 0,228,229, 9,230,231, 2, 0, 0, - 0, 0,232, 9, 9,233,234, 0,235, 9, 9,236,237,238, 9, 9, - 239,240, 0, 0, 0, 0, 0, 0, 21, 9,215,241, 7, 9, 70, 18, - 9,242, 73,243, 0, 0, 0, 0,244, 9, 9,245,246, 2,247, 9, - 248,249, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,250, - 251, 48, 9,252,253, 2, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,254,255,256, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 9, 9, 9,257, 0, 0, 0, 0, 9, 9, 9, 9,258,259,260,260, - 261,262, 0, 0, 0, 0,263, 0, 9, 9, 9, 9, 9,264, 0, 0, - 9, 9, 9, 9, 9, 9,105, 70, 94,265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,266, 9, 9, 70,267,268, 0, 0, 0, - 0, 9,269, 0, 9, 9,270, 2, 0, 0, 0, 0, 0, 9,271, 2, - 9, 9, 9, 9,272, 2, 0, 0,129,129,129,129,129,129,129,129, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,129, + 0, 0, 1, 2, 0, 3, 0, 3, 0, 0, 4, 5, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 12, + 0, 0, 0, 0, 10, 13, 0, 0, 14, 10, 10, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 18, 26, 27, 21, 22, 28, 29, 30, 31, 32, + 33, 34, 22, 35, 36, 0, 18, 37, 38, 21, 22, 39, 24, 40, 18, 41, + 42, 43, 44, 45, 46, 47, 31, 0, 48, 49, 22, 50, 51, 52, 18, 0, + 53, 49, 22, 54, 51, 55, 18, 56, 57, 49, 10, 58, 59, 60, 18, 0, + 61, 62, 10, 63, 64, 65, 31, 66, 67, 68, 10, 69, 70, 10, 71, 72, + 73, 74, 75, 76, 77, 0, 0, 0, 10, 10, 78, 79, 80, 81, 82, 83, + 84, 85, 0, 0, 0, 0, 0, 0, 10, 86, 10, 87, 10, 88, 89, 90, + 10, 10, 10, 91, 92, 93, 2, 0, 94, 0, 10, 10, 10, 10, 10, 95, + 96, 10, 97, 0, 0, 0, 0, 0, 98, 99,100,101, 31, 10,102,103, + 10, 10,104, 10,105,106, 0, 0, 10,107, 10, 10, 10,108,109,110, + 2, 2, 0, 0, 0, 0, 0, 0,111, 10, 10,112,113, 2,114,115, + 116, 10,117, 10, 10, 10,118,119, 10, 10,120,121,122, 0, 0, 0, + 0, 0, 0, 0, 0,123,124,125, 0, 0, 0, 0, 0, 0, 0,126, + 127,128,129, 0, 0, 0,130,131,132, 0, 0, 0, 0, 0, 0,133, + 0, 0, 0, 0,134, 0, 0, 0, 0, 0, 0, 0, 0, 0,135, 0, + 0, 0, 0, 10, 10, 10,136,137, 0, 0,138, 0, 0, 0, 0, 0, + 139, 10,140, 0, 10, 10, 10,141,142, 10, 10,143,144, 2,145,146, + 10, 10,147, 10,148,149, 0, 0,150, 10, 10,151,152, 2,153, 99, + 10, 10,154,155,156, 2, 10,157, 10, 10, 10,158,159, 0,160,161, + 0, 0, 0, 0, 10, 10,162, 2,163, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0,165, + 0, 0, 0, 0, 0, 0, 0,166,166,167, 34,168, 0, 0, 0, 0, + 169,170, 10,171, 95, 0, 0, 0, 0, 0, 0, 0, 70, 10,172, 0, + 10,173,174, 0, 0, 0, 0, 0, 10, 10,175, 2, 0, 0, 0, 0, + 10, 10,176,173, 0, 0, 0, 0, 0, 0, 0, 10,177,178, 0, 10, + 179, 0, 0,180,181, 0, 0, 0,182, 10, 10,183,184,185,186,187, + 188, 10, 10,189,190, 0, 0, 0,191, 10,192,193,194, 10, 10,195, + 188, 10, 10,196,197,106,198,103, 10, 34,199,200,201, 0, 0, 0, + 202,203, 95, 10, 10,204,205, 2,206, 21, 22,207,208,209,210,211, + 10, 10, 10,212,213,214,215, 0,198, 10, 10,216,217, 2, 0, 0, + 10, 10,218,219,220,221, 0, 0, 10, 10, 10,222,223, 2, 0, 0, + 10, 10,224,225, 2, 0, 0, 0, 10,226,227,104,228, 0, 0, 0, + 10, 10,229,230, 0, 0, 0, 0,231,232, 10,233,234, 2, 0, 0, + 0, 0,235, 10, 10,236,237, 0,238, 10, 10,239,240,241, 10, 10, + 242,243, 0, 0, 0, 0, 0, 0, 22, 10,218,244, 8, 10, 71, 19, + 10,245, 74,246, 0, 0, 0, 0,247, 10, 10,248,249, 2,250, 10, + 251,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, + 254, 49, 10,255,256, 2, 0, 0,257,257,257,257,257,257,257,257, + 257,257,257,258,259,260, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, + 10, 10, 10,261, 0, 0, 0, 0, 10, 10, 10, 10,262,263,264,264, + 265,266, 0, 0, 0, 0,267, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10,268, 0, 0, 10, 10, 10, 10, 10, 10,106, 71, + 95,269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,270, + 10, 10, 71,271,272, 0, 0, 0, 0, 10,273, 0, 10, 10,274, 2, + 0, 0, 0, 0, 0, 10,275, 2, 10, 10, 10, 10,276, 2, 0, 0, + 130,130,130,130,130,130,130,130,163,163,163,163,163,163,163,163, + 163,163,163,163,163,163,163,130, }; static inline unsigned @@ -357,14 +366,14 @@ hb_use_b4 (const uint8_t* a, unsigned i) static inline uint_fast8_t hb_use_get_category (unsigned u) { - return u<921600u?hb_use_u8[2777+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; + return u<921600u?hb_use_u8[2809+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; } #else static const uint8_t -hb_use_u8[3413] = +hb_use_u8[3483] = { 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 51, 57, 58, 179, 195, 61, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, @@ -375,243 +384,248 @@ hb_use_u8[3413] = 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 14, 0, 1, 1, 2, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, 11, 12, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 17, 18, 19, 1, - 1, 20, 1, 1, 1, 1, 21, 1, 1, 1, 1, 1, 1, 1, 22, 1, + 1, 20, 1, 1, 1, 1, 21, 1, 22, 1, 1, 1, 1, 1, 23, 24, 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, 23, 24, 25, 26, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, - 28, 1, 1, 1, 1, 1, 29, 1, 1, 1, 1, 30, 31, 1, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 1, 46, 47, 48, - 49, 50, 50, 50, 50, 51, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 53, 1, 1, 1, - 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 55, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, 1, 1, - 1, 1, 57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 58, 59, 1, 60, 1, 1, 1, 1, 61, 1, 1, 1, 1, 1, - 1, 62, 63, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 8, 0, 0, 0, 0, - 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 0, 55, 56, 57, 58, 59, 0, 0, 0, 60, 61, 62, 63, 55, 64, 65, - 66, 67, 55, 55, 68, 69, 70, 0, 0, 71, 72, 73, 74, 55, 75, 76, - 0, 77, 55, 78, 79, 80, 0, 0, 0, 81, 82, 83, 84, 85, 86, 55, - 87, 55, 88, 89, 0, 0, 0, 90, 91, 0, 0, 0, 0, 0, 0, 0, - 92, 93, 94, 0, 95, 96, 0, 0, 97, 0, 0, 0, 0, 0, 0, 98, - 0, 0, 99, 55, 100, 0, 0, 0, 0, 101, 102, 55, 103, 104, 105, 106, - 107, 55, 108, 109, 0, 110, 111, 112, 113, 55, 114, 115, 116, 55, 117, 118, - 119, 0, 0, 0, 0, 0, 0, 55, 120, 121, 0, 0, 0, 0, 0, 0, - 122, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 124, 125, 126, 0, - 0, 127, 128, 129, 0, 0, 0, 50, 130, 0, 0, 0, 0, 131, 132, 0, - 0, 55, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 134, 0, - 0, 0, 99, 135, 99, 136, 137, 138, 0, 139, 140, 141, 142, 143, 144, 145, - 0, 146, 147, 148, 149, 143, 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, - 159, 160, 161, 162, 163, 0, 0, 0, 0, 55, 164, 165, 166, 167, 168, 169, - 0, 0, 0, 0, 0, 55, 170, 171, 0, 55, 172, 173, 0, 55, 174, 66, - 0, 175, 176, 177, 0, 0, 0, 0, 0, 55, 178, 0, 0, 0, 0, 0, - 0, 179, 180, 181, 0, 0, 182, 183, 184, 185, 186, 187, 55, 188, 0, 0, - 0, 189, 190, 191, 192, 193, 194, 0, 0, 195, 196, 197, 198, 199, 66, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 200, 201, 202, 203, 0, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 204, 205, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 66, 0, 55, 206, 0, 0, 0, 0, 0, - 0, 55, 55, 207, 208, 209, 0, 0, 210, 55, 55, 55, 55, 55, 55, 211, - 0, 55, 55, 55, 212, 213, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, - 0, 55, 215, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 217, 55, - 218, 0, 0, 0, 0, 0, 0, 99, 219, 55, 55, 220, 0, 0, 0, 0, - 0, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, 222, - 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 2, 2, 2, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, - 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 25, 26, 27, 28, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 29, + 30, 1, 1, 1, 1, 1, 31, 1, 1, 1, 1, 32, 33, 1, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 1, 48, 49, 50, + 51, 52, 52, 52, 52, 53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 54, 55, 1, 1, 1, + 56, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 57, 58, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 59, 1, 1, + 1, 1, 60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 61, 62, 1, 63, 1, 1, 1, 1, 64, 1, 1, 1, 1, 1, + 1, 65, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 0, 1, 2, 2, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 9, 0, 0, 0, 0, + 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 37, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 0, 56, 57, 58, 59, 60, 0, 0, 0, 61, 62, 63, 64, 56, 65, 66, + 67, 68, 56, 56, 69, 70, 71, 0, 0, 72, 73, 74, 75, 56, 76, 77, + 0, 78, 56, 79, 80, 81, 0, 0, 0, 82, 83, 84, 85, 86, 87, 56, + 88, 56, 89, 90, 0, 0, 0, 91, 92, 0, 0, 0, 0, 0, 0, 0, + 93, 94, 95, 0, 96, 97, 0, 0, 98, 0, 0, 0, 0, 0, 0, 99, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 101, 56, 102, 0, 0, 0, + 0, 0, 103, 0, 0, 0, 0, 0, 0, 104, 105, 56, 106, 107, 108, 109, + 110, 56, 111, 112, 0, 113, 114, 115, 116, 56, 117, 118, 119, 56, 120, 121, + 122, 0, 0, 0, 0, 0, 0, 56, 123, 124, 0, 0, 0, 0, 0, 0, + 125, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 127, 128, 129, 0, + 0, 130, 131, 132, 0, 0, 0, 51, 133, 0, 0, 0, 0, 134, 135, 0, + 0, 56, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 137, 0, + 0, 0, 101, 138, 101, 139, 140, 141, 0, 142, 143, 144, 145, 146, 147, 148, + 0, 149, 150, 151, 152, 146, 153, 154, 155, 156, 157, 158, 0, 159, 160, 161, + 162, 163, 164, 165, 166, 0, 0, 0, 0, 56, 167, 168, 169, 170, 171, 172, + 0, 0, 0, 0, 0, 56, 173, 174, 0, 56, 175, 176, 0, 56, 177, 67, + 0, 178, 179, 180, 0, 0, 0, 0, 0, 56, 181, 0, 0, 0, 0, 0, + 0, 182, 183, 184, 0, 0, 185, 186, 187, 188, 189, 190, 56, 191, 0, 0, + 0, 192, 193, 194, 195, 196, 197, 0, 0, 198, 199, 200, 201, 202, 67, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 203, 204, 205, 206, 0, 0, 0, 0, + 0, 207, 207, 207, 207, 207, 207, 207, 207, 207, 208, 209, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 67, 0, 56, 210, 0, 0, 0, 0, 0, + 0, 56, 56, 211, 212, 213, 0, 0, 214, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 215, 0, 56, 56, 56, 216, 217, 0, 0, + 0, 0, 0, 0, 218, 0, 0, 0, 0, 56, 219, 220, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 101, 221, 56, 222, 0, 0, 0, 0, 0, 0, 101, + 223, 56, 56, 224, 0, 0, 0, 0, 0, 225, 225, 225, 225, 225, 225, 225, + 225, 226, 226, 226, 226, 226, 226, 226, 227, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 4, 0, 5, 0, 0, 0, 0, 0, 6, + 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 8, 9, 9, 9, 9, 0, 0, 0, 7, 10, - 0, 2, 2, 2, 2, 11, 12, 0, 0, 9, 13, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 14, 15, 16, 17, 18, 19, 20, 14, 21, 22, - 23, 10, 24, 25, 18, 2, 2, 2, 2, 2, 18, 0, 2, 2, 2, 2, - 2, 0, 2, 2, 2, 2, 2, 2, 2, 26, 27, 28, 2, 2, 2, 7, - 28, 7, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, - 2, 7, 7, 0, 2, 2, 0, 15, 16, 17, 18, 29, 30, 31, 30, 32, - 0, 0, 0, 0, 33, 0, 0, 2, 28, 2, 0, 0, 0, 0, 0, 7, - 34, 10, 13, 28, 2, 2, 7, 0, 28, 7, 2, 28, 7, 2, 0, 35, - 16, 17, 29, 0, 25, 36, 25, 37, 0, 38, 0, 0, 0, 28, 2, 7, - 7, 0, 0, 0, 2, 2, 2, 2, 2, 39, 40, 41, 0, 0, 0, 0, - 0, 10, 13, 28, 2, 2, 2, 2, 28, 2, 28, 2, 2, 2, 2, 2, - 2, 7, 2, 28, 2, 2, 0, 15, 16, 17, 18, 19, 25, 20, 33, 22, - 0, 0, 0, 0, 0, 28, 39, 39, 42, 10, 27, 28, 2, 2, 2, 7, - 28, 7, 2, 28, 2, 2, 0, 15, 43, 0, 0, 25, 20, 0, 0, 2, - 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 44, 28, 2, 2, 7, 0, - 2, 7, 2, 2, 0, 28, 7, 7, 2, 0, 28, 7, 0, 2, 7, 0, - 2, 2, 2, 2, 2, 2, 0, 0, 21, 14, 45, 0, 46, 31, 46, 32, - 0, 0, 0, 0, 33, 0, 0, 0, 0, 13, 27, 47, 2, 2, 2, 7, - 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 15, - 20, 14, 21, 45, 20, 36, 20, 37, 0, 0, 0, 25, 29, 2, 7, 0, - 0, 8, 27, 28, 2, 2, 2, 7, 2, 2, 2, 28, 2, 2, 0, 15, - 43, 0, 0, 33, 45, 0, 0, 0, 7, 48, 49, 0, 0, 0, 0, 0, - 0, 9, 27, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 50, 51, - 21, 21, 17, 29, 46, 31, 46, 32, 52, 0, 0, 0, 33, 0, 0, 0, - 28, 10, 27, 28, 2, 2, 2, 2, 2, 2, 2, 2, 7, 0, 2, 2, - 2, 2, 28, 2, 2, 2, 2, 28, 0, 2, 2, 2, 7, 0, 53, 0, - 33, 21, 20, 29, 29, 16, 46, 46, 23, 0, 21, 0, 0, 0, 0, 0, - 0, 2, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, - 0, 2, 2, 54, 54, 55, 0, 0, 16, 2, 2, 2, 2, 28, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 7, 0, 56, 19, 57, 20, 20, 18, 18, - 44, 19, 9, 29, 9, 2, 2, 58, 59, 59, 59, 59, 59, 60, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, - 0, 0, 0, 0, 62, 0, 0, 0, 0, 2, 2, 2, 2, 2, 63, 43, - 57, 64, 20, 20, 65, 66, 67, 68, 69, 2, 2, 2, 2, 2, 1, 0, - 3, 2, 2, 2, 21, 18, 2, 2, 70, 69, 71, 72, 63, 71, 27, 27, - 2, 50, 20, 51, 2, 2, 2, 2, 2, 2, 73, 74, 75, 27, 27, 76, - 77, 2, 2, 2, 2, 2, 27, 43, 0, 2, 57, 78, 0, 0, 0, 0, - 28, 2, 57, 45, 0, 0, 0, 0, 0, 2, 57, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 7, 2, 7, 57, 0, 0, 0, 0, 0, - 0, 2, 2, 79, 43, 20, 57, 18, 46, 46, 46, 46, 13, 80, 81, 82, - 83, 84, 85, 0, 0, 0, 0, 86, 0, 7, 0, 0, 28, 0, 87, 79, - 88, 2, 2, 2, 2, 7, 0, 0, 0, 40, 40, 89, 90, 2, 2, 2, - 2, 2, 2, 2, 2, 11, 7, 0, 0, 91, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 7, 20, 78, 43, 20, 92, 59, 0, - 0, 93, 94, 93, 93, 95, 96, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 0, 2, 2, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, - 0, 2, 2, 2, 2, 27, 0, 0, 0, 2, 2, 2, 2, 2, 7, 0, - 0, 2, 2, 2, 50, 97, 43, 0, 0, 2, 2, 98, 99, 100, 101, 59, - 61, 102, 14, 43, 20, 57, 19, 78, 46, 46, 74, 9, 9, 9, 103, 44, - 38, 9, 104, 72, 2, 2, 2, 2, 2, 2, 2, 105, 20, 18, 18, 20, - 46, 46, 20, 106, 2, 2, 2, 7, 0, 0, 0, 0, 0, 0, 107, 108, - 109, 109, 109, 0, 0, 0, 0, 0, 0, 104, 72, 2, 2, 2, 2, 2, - 2, 58, 59, 57, 23, 20, 110, 59, 2, 2, 2, 2, 105, 20, 21, 43, - 43, 100, 12, 0, 0, 0, 0, 0, 0, 2, 2, 59, 16, 46, 21, 111, - 100, 100, 100, 112, 113, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 28, - 2, 9, 44, 114, 114, 114, 9, 114, 114, 13, 114, 114, 114, 24, 0, 38, - 0, 0, 0, 115, 49, 9, 3, 0, 0, 0, 0, 0, 0, 0, 116, 0, - 0, 0, 0, 0, 0, 0, 4, 117, 118, 40, 40, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 118, 118, 119, 118, 118, 118, 118, 118, 118, 118, - 118, 0, 0, 120, 0, 0, 0, 0, 0, 0, 5, 120, 0, 0, 0, 0, - 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 0, 2, 2, 2, 2, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, - 121, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29, - 0, 2, 2, 0, 0, 0, 0, 0, 0, 27, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 122, 21, 21, 21, 21, 21, 21, 21, 123, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, - 50, 2, 2, 2, 20, 20, 124, 114, 0, 2, 2, 2, 125, 18, 57, 18, - 111, 100, 126, 0, 0, 0, 0, 0, 0, 9, 127, 2, 2, 2, 2, 2, - 2, 2, 128, 21, 20, 18, 46, 129, 130, 131, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 50, 28, 2, 2, 2, 2, 2, 2, 2, 2, 8, 20, 57, - 97, 74, 132, 133, 134, 0, 0, 0, 0, 2, 135, 2, 2, 2, 2, 136, - 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 137, 50, 51, 2, 2, - 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 138, 19, - 23, 0, 0, 139, 140, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 141, - 0, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, - 4, 118, 118, 118, 118, 119, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2, - 2, 2, 7, 2, 28, 2, 2, 2, 2, 2, 28, 2, 2, 2, 28, 7, - 0, 125, 18, 25, 29, 0, 0, 142, 143, 2, 2, 28, 2, 28, 2, 2, - 2, 2, 2, 2, 0, 12, 35, 0, 144, 2, 2, 11, 35, 0, 28, 2, - 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 2, - 7, 2, 2, 9, 39, 0, 0, 0, 0, 2, 2, 2, 2, 2, 25, 36, - 0, 2, 2, 2, 114, 114, 114, 114, 114, 145, 2, 7, 0, 0, 0, 0, - 0, 2, 12, 12, 0, 0, 0, 0, 0, 7, 2, 2, 7, 2, 2, 2, - 2, 28, 2, 7, 0, 28, 2, 0, 0, 146, 147, 148, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 131, 0, 0, 0, - 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 2, 2, 2, 2, - 2, 51, 50, 51, 0, 0, 0, 0, 150, 9, 72, 2, 2, 2, 2, 2, - 2, 16, 17, 19, 14, 22, 35, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 18, 20, 151, - 20, 19, 152, 153, 2, 2, 2, 2, 2, 0, 0, 63, 154, 0, 0, 0, - 0, 2, 11, 0, 0, 0, 0, 0, 0, 2, 63, 23, 18, 18, 18, 20, - 20, 106, 155, 0, 0, 54, 156, 29, 157, 28, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 158, 42, 0, 0, 0, - 47, 125, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 7, 7, 2, 2, - 28, 2, 2, 2, 2, 2, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2, - 8, 16, 17, 19, 20, 159, 29, 0, 0, 9, 9, 28, 2, 2, 2, 7, - 28, 7, 2, 28, 2, 2, 56, 15, 21, 14, 21, 45, 30, 31, 30, 32, - 0, 0, 0, 0, 33, 0, 0, 0, 2, 2, 21, 0, 9, 9, 9, 44, - 0, 9, 9, 44, 0, 0, 0, 0, 0, 2, 2, 63, 23, 18, 18, 18, - 20, 21, 123, 13, 15, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, - 160, 161, 0, 0, 0, 0, 0, 0, 0, 16, 17, 18, 18, 64, 97, 23, - 157, 9, 162, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 63, 23, 18, 18, 0, 46, 46, 9, 163, 35, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 18, 0, 21, 17, 18, 18, 19, 14, 80, - 163, 36, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 8, 164, - 23, 18, 20, 20, 162, 7, 0, 0, 0, 2, 2, 2, 2, 2, 7, 41, - 133, 21, 20, 18, 74, 19, 20, 0, 0, 2, 2, 2, 7, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 2, 16, 17, 18, 19, 20, 103, 163, 35, 0, - 0, 2, 2, 2, 7, 28, 0, 2, 2, 2, 2, 28, 7, 2, 2, 2, - 2, 21, 21, 16, 30, 31, 10, 165, 166, 167, 168, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 0, 2, 2, 2, 63, 23, 18, 18, 0, 20, 21, - 27, 106, 0, 31, 0, 0, 0, 0, 0, 50, 18, 20, 20, 20, 137, 2, - 2, 2, 169, 170, 9, 13, 171, 70, 172, 0, 0, 1, 144, 0, 0, 0, - 0, 50, 18, 20, 14, 17, 18, 2, 2, 2, 2, 155, 155, 155, 173, 173, - 173, 173, 173, 173, 13, 174, 0, 28, 0, 20, 18, 18, 29, 20, 20, 9, - 163, 0, 59, 59, 59, 59, 59, 59, 59, 64, 19, 80, 44, 0, 0, 0, - 0, 2, 2, 2, 7, 2, 28, 2, 2, 50, 20, 20, 29, 0, 36, 20, - 25, 9, 156, 175, 171, 0, 0, 0, 0, 2, 2, 2, 28, 7, 2, 2, - 2, 2, 2, 2, 2, 2, 21, 21, 45, 20, 33, 80, 66, 0, 0, 0, - 0, 2, 176, 64, 45, 0, 0, 0, 0, 9, 177, 2, 2, 2, 2, 2, - 2, 2, 2, 21, 20, 18, 29, 0, 46, 14, 140, 0, 0, 0, 0, 0, - 0, 178, 178, 178, 106, 179, 178, 0, 0, 145, 2, 2, 180, 114, 114, 114, - 114, 114, 114, 114, 0, 0, 0, 0, 0, 9, 9, 9, 44, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 7, 0, 56, 181, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, - 38, 114, 24, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 56, - 35, 0, 4, 118, 118, 118, 119, 0, 0, 9, 9, 9, 47, 2, 2, 2, - 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, - 44, 2, 2, 2, 2, 2, 2, 9, 9, 2, 2, 2, 2, 2, 2, 20, - 20, 2, 2, 42, 42, 42, 90, 0, 0, O, O, O, GB, B, B, GB, - O, O, WJ,FMPst,FMPst, O, CGJ, B, O, B,VMAbv,VMAbv,VMAbv, O,VMAbv, B, - CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, - VAbv, VAbv, VAbv, VPst, VPst, VPst, H, VPre, VPst,VMBlw, O, O, VAbv, GB,VMAbv,VMPst, - VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O, VPst,FMAbv, O,CMBlw, - O, VAbv, O, VAbv, H, O,VMBlw,VMAbv,CMAbv, GB, GB, O, MBlw,CMAbv,CMAbv, VPst, - VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, B, O, CS, CS,VMPst, B, VAbv, VAbv, - B, R, O, HVM, O, O,FMBlw, O,CMAbv, O,CMBlw, VAbv, VBlw, B, SUB, SUB, - SUB, O, SUB, SUB, O,FMBlw, O, B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst, IS, VAbv, - MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst,VMPst,VMPst, B, MBlw, VPst, VPre, VAbv, VAbv, - VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv, - VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, B, CGJ, WJ, CGJ, GB,CMAbv,CMAbv, B, GB, - B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B, MPre, MBlw, - SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, H, B, O, - SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst, IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, - CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, O,FMPst, O, O, H, MPst, VPst, H, - VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv,VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, - O, VBlw, MPst, MPre, MAbv, MBlw, O, B, FAbv, FAbv, FPst, VBlw, B, B, VPre, O, - VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, - CS, CS, B, N, N, O, HN, VPre, VBlw, VAbv, IS,CMAbv, O, VPst, B, R, - R,CMBlw, VAbv, VPre,VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, - H,VMPst, VAbv,VMAbv, VPst, IS, R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, - MBlw, MBlw, GB, FBlw, FBlw,CMAbv, IS, VBlw, IS, GB, VAbv, R,VMPst, H, H, B, - H, B,VMBlw, O, VBlw, + 2, 2, 2, 2, 2, 2, 10, 11, 11, 11, 11, 0, 0, 0, 9, 12, + 0, 2, 2, 2, 2, 13, 14, 0, 0, 11, 15, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 16, 17, 18, 19, 20, 21, 22, 16, 23, 24, + 25, 12, 26, 27, 20, 2, 2, 2, 2, 2, 20, 0, 2, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 28, 29, 30, 2, 2, 2, 9, + 30, 9, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 9, 2, 2, + 2, 9, 9, 0, 2, 2, 0, 17, 18, 19, 20, 31, 32, 33, 32, 34, + 0, 0, 0, 0, 35, 0, 0, 2, 30, 2, 0, 0, 0, 0, 0, 9, + 36, 12, 15, 30, 2, 2, 9, 0, 30, 9, 2, 30, 9, 2, 0, 37, + 18, 19, 31, 0, 27, 38, 27, 39, 0, 40, 0, 0, 0, 30, 2, 9, + 9, 0, 0, 0, 2, 2, 2, 2, 2, 41, 42, 43, 0, 0, 0, 0, + 0, 12, 15, 30, 2, 2, 2, 2, 30, 2, 30, 2, 2, 2, 2, 2, + 2, 9, 2, 30, 2, 2, 0, 17, 18, 19, 20, 21, 27, 22, 35, 24, + 0, 0, 0, 0, 0, 30, 41, 41, 44, 12, 29, 30, 2, 2, 2, 9, + 30, 9, 2, 30, 2, 2, 0, 17, 45, 0, 0, 27, 22, 0, 0, 2, + 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 46, 30, 2, 2, 9, 0, + 2, 9, 2, 2, 0, 30, 9, 9, 2, 0, 30, 9, 0, 2, 9, 0, + 2, 2, 2, 2, 2, 2, 0, 0, 23, 16, 47, 0, 48, 33, 48, 34, + 0, 0, 0, 0, 35, 0, 0, 0, 0, 15, 29, 49, 2, 2, 2, 9, + 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 17, + 22, 16, 23, 47, 22, 38, 22, 39, 0, 0, 0, 27, 31, 2, 9, 0, + 0, 10, 29, 30, 2, 2, 2, 9, 2, 2, 2, 30, 2, 2, 0, 17, + 45, 0, 0, 35, 47, 0, 0, 0, 9, 50, 51, 0, 0, 0, 0, 0, + 0, 11, 29, 2, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 52, 53, + 23, 23, 19, 31, 48, 33, 48, 34, 54, 0, 0, 0, 35, 0, 0, 0, + 30, 12, 29, 30, 2, 2, 2, 2, 2, 2, 2, 2, 9, 0, 2, 2, + 2, 2, 30, 2, 2, 2, 2, 30, 0, 2, 2, 2, 9, 0, 55, 0, + 35, 23, 22, 31, 31, 18, 48, 48, 25, 0, 23, 0, 0, 0, 0, 0, + 0, 2, 0, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, + 0, 2, 2, 56, 56, 57, 0, 0, 18, 2, 2, 2, 2, 30, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 9, 0, 58, 21, 59, 22, 22, 20, 20, + 46, 21, 11, 31, 11, 2, 2, 60, 61, 61, 61, 61, 61, 62, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 63, + 0, 0, 0, 0, 64, 0, 0, 0, 0, 2, 2, 2, 2, 2, 65, 45, + 59, 66, 22, 22, 67, 68, 69, 70, 71, 2, 2, 2, 2, 2, 1, 0, + 5, 2, 2, 2, 23, 20, 2, 2, 72, 71, 73, 74, 65, 73, 29, 29, + 2, 52, 22, 53, 2, 2, 2, 2, 2, 2, 75, 76, 77, 29, 29, 78, + 79, 2, 2, 2, 2, 2, 29, 45, 0, 2, 59, 80, 0, 0, 0, 0, + 30, 2, 59, 47, 0, 0, 0, 0, 0, 2, 59, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 9, 2, 9, 59, 0, 0, 0, 0, 0, + 0, 2, 2, 81, 45, 22, 59, 20, 48, 48, 48, 48, 15, 82, 83, 84, + 85, 86, 87, 0, 0, 0, 0, 88, 0, 9, 0, 0, 30, 0, 89, 81, + 90, 2, 2, 2, 2, 9, 0, 0, 0, 42, 42, 91, 92, 2, 2, 2, + 2, 2, 2, 2, 2, 13, 9, 0, 0, 93, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 9, 22, 80, 45, 22, 94, 61, 0, + 0, 95, 96, 95, 95, 97, 98, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 2, 9, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, + 0, 2, 2, 2, 2, 29, 0, 0, 0, 2, 2, 2, 2, 2, 9, 0, + 0, 2, 2, 2, 52, 99, 45, 0, 0, 2, 2, 100, 101, 102, 103, 61, + 63, 104, 16, 45, 22, 59, 21, 80, 48, 48, 76, 11, 11, 11, 105, 46, + 40, 11, 106, 74, 2, 2, 2, 2, 2, 2, 2, 107, 22, 20, 20, 22, + 48, 48, 22, 108, 2, 2, 2, 9, 0, 0, 0, 0, 0, 0, 109, 110, + 111, 111, 111, 0, 0, 0, 0, 0, 0, 106, 74, 2, 2, 2, 2, 2, + 2, 60, 61, 59, 25, 22, 112, 61, 2, 2, 2, 2, 107, 22, 23, 45, + 45, 102, 14, 0, 0, 0, 0, 0, 0, 2, 2, 61, 18, 48, 23, 113, + 102, 102, 102, 114, 115, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 30, + 2, 11, 46, 116, 116, 116, 11, 116, 116, 15, 116, 116, 116, 26, 0, 40, + 0, 0, 0, 117, 51, 11, 5, 0, 0, 0, 0, 0, 0, 0, 118, 0, + 0, 0, 0, 0, 0, 0, 6, 119, 120, 42, 42, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 120, 120, 121, 120, 120, 120, 120, 120, 120, 120, + 120, 0, 0, 122, 0, 0, 0, 0, 0, 0, 7, 122, 0, 0, 0, 0, + 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, 123, 123, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, + 30, 0, 0, 0, 0, 0, 0, 0, 124, 0, 123, 123, 0, 0, 0, 0, + 0, 2, 53, 2, 108, 2, 10, 2, 2, 2, 65, 19, 16, 0, 0, 31, + 0, 2, 2, 0, 0, 0, 0, 0, 0, 29, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 125, 23, 23, 23, 23, 23, 23, 23, 126, 0, 0, 0, 0, + 0, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 0, 0, 0, 0, 0, + 52, 2, 2, 2, 22, 22, 127, 116, 0, 2, 2, 2, 128, 20, 59, 20, + 113, 102, 129, 0, 0, 0, 0, 0, 0, 11, 130, 2, 2, 2, 2, 2, + 2, 2, 131, 23, 22, 20, 48, 132, 133, 134, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 52, 30, 2, 2, 2, 2, 2, 2, 2, 2, 10, 22, 59, + 99, 76, 135, 136, 137, 0, 0, 0, 0, 2, 138, 2, 2, 2, 2, 139, + 0, 30, 2, 42, 5, 0, 79, 15, 2, 53, 22, 140, 52, 53, 2, 2, + 105, 10, 9, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 141, 21, + 25, 0, 0, 142, 143, 0, 0, 0, 0, 2, 65, 45, 23, 80, 47, 144, + 0, 81, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, + 6, 120, 120, 120, 120, 121, 0, 0, 0, 2, 2, 2, 2, 2, 9, 2, + 2, 2, 9, 2, 30, 2, 2, 2, 2, 2, 30, 2, 2, 2, 30, 9, + 0, 128, 20, 27, 31, 0, 0, 145, 146, 2, 2, 30, 2, 30, 2, 2, + 2, 2, 2, 2, 0, 14, 37, 0, 147, 2, 2, 13, 37, 0, 30, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 2, 2, + 9, 2, 2, 11, 41, 0, 0, 0, 0, 2, 2, 2, 2, 2, 27, 38, + 0, 2, 2, 2, 116, 116, 116, 116, 116, 148, 2, 9, 0, 0, 0, 0, + 0, 2, 14, 14, 0, 0, 0, 0, 0, 9, 2, 2, 9, 2, 2, 2, + 2, 30, 2, 9, 0, 30, 2, 0, 0, 149, 150, 151, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 22, 22, 20, 20, 20, 22, 22, 134, 0, 0, 0, + 0, 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 2, 2, 2, 2, + 2, 53, 52, 53, 0, 0, 0, 0, 153, 11, 74, 2, 2, 2, 2, 2, + 2, 18, 19, 21, 16, 24, 37, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 11, 49, 2, 2, 2, 2, 2, 2, 2, 2, 2, 128, 20, 22, 154, + 22, 21, 155, 156, 2, 2, 2, 2, 2, 0, 0, 65, 157, 0, 0, 0, + 0, 2, 13, 0, 0, 0, 0, 0, 0, 2, 65, 25, 20, 20, 20, 22, + 22, 108, 158, 0, 0, 56, 159, 31, 160, 30, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 23, 19, 22, 22, 161, 44, 0, 0, 0, + 49, 128, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 9, 2, 2, + 30, 2, 2, 2, 2, 2, 2, 2, 30, 2, 2, 2, 2, 2, 2, 2, + 10, 18, 19, 21, 22, 162, 31, 0, 0, 11, 11, 30, 2, 2, 2, 9, + 30, 9, 2, 30, 2, 2, 58, 17, 23, 16, 23, 47, 32, 33, 32, 34, + 0, 0, 0, 0, 35, 0, 0, 0, 2, 2, 23, 0, 11, 11, 11, 46, + 0, 11, 11, 46, 0, 0, 0, 0, 0, 2, 2, 65, 25, 20, 20, 20, + 22, 23, 126, 15, 17, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, + 163, 164, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 20, 66, 99, 25, + 160, 11, 165, 9, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 65, 25, 20, 20, 0, 48, 48, 11, 166, 37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 20, 0, 23, 19, 20, 20, 21, 16, 82, + 166, 38, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 10, 167, + 25, 20, 22, 22, 165, 9, 0, 0, 0, 2, 2, 2, 2, 2, 9, 43, + 136, 23, 22, 20, 76, 21, 22, 0, 0, 2, 2, 2, 9, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 18, 19, 20, 21, 22, 105, 166, 37, 0, + 0, 2, 2, 2, 9, 30, 0, 2, 2, 2, 2, 30, 9, 2, 2, 2, + 2, 23, 23, 18, 32, 33, 12, 168, 169, 170, 171, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 0, 2, 2, 2, 65, 25, 20, 20, 0, 22, 23, + 29, 108, 0, 33, 0, 0, 0, 0, 0, 52, 20, 22, 22, 22, 140, 2, + 2, 2, 172, 173, 11, 15, 174, 72, 175, 0, 0, 1, 147, 0, 0, 0, + 0, 52, 20, 22, 16, 19, 20, 2, 2, 2, 2, 158, 158, 158, 176, 176, + 176, 176, 176, 176, 15, 177, 0, 30, 0, 22, 20, 20, 31, 22, 22, 11, + 166, 0, 61, 61, 61, 61, 61, 61, 61, 66, 21, 82, 46, 0, 0, 0, + 0, 2, 2, 2, 9, 2, 30, 2, 2, 52, 22, 22, 31, 0, 38, 22, + 27, 11, 159, 178, 174, 0, 0, 0, 0, 2, 2, 2, 30, 9, 2, 2, + 2, 2, 2, 2, 2, 2, 23, 23, 47, 22, 35, 82, 68, 0, 0, 0, + 0, 2, 179, 66, 47, 0, 0, 0, 0, 11, 180, 2, 2, 2, 2, 2, + 2, 2, 2, 23, 22, 20, 31, 0, 48, 16, 143, 0, 0, 0, 0, 0, + 0, 181, 181, 181, 181, 181, 181, 181, 181, 182, 182, 182, 183, 184, 182, 181, + 181, 185, 181, 181, 186, 187, 187, 187, 187, 187, 187, 187, 0, 0, 0, 0, + 0, 11, 11, 11, 46, 0, 0, 0, 0, 2, 2, 2, 2, 2, 9, 0, + 58, 188, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 0, 0, 0, 40, 116, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 0, 58, 37, 0, 6, 120, 120, 120, 121, 0, + 0, 11, 11, 11, 49, 2, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 46, 2, 2, 2, 2, 2, 2, 11, + 11, 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 44, 44, 44, 92, 0, + 0, O, O, O, GB, B, B, O, SB, O, SE, GB, O, O, WJ,FMPst, + FMPst, O, CGJ, B, O, B,VMAbv,VMAbv,VMAbv, O,VMAbv, B,CMBlw,CMBlw,CMBlw,VMAbv, + VMPst, VAbv, VPst,CMBlw, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, + VPst, VPst, H, VPre, VPst,VMBlw, O, O, VAbv, GB,VMAbv,VMPst,VMPst, O, B, VBlw, + O, O, VPre, VPre, O, VPre, H, O, VPst,FMAbv, O,CMBlw, O, VAbv, O, VAbv, + H, O,VMBlw,VMAbv,CMAbv, GB, GB, O, MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv, O, VPst, + O, VPre, VPre,VMAbv, B, O, CS, CS,VMPst, B, VAbv, VAbv, B, R, O, HVM, + O, O,FMBlw, O,CMAbv, O,CMBlw, VAbv, VBlw, B, SUB, SUB, SUB, O, SUB, SUB, + O,FMBlw, O, B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst, IS, VAbv, MPst, MPre, MBlw, MBlw, + B, MBlw, MBlw, VPst,VMPst,VMPst, B, MBlw, VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw, B, + VMPst, VBlw, VPst, CGJ, CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv, IS, + FMAbv, B,FMAbv, B, CGJ, WJ, CGJ, GB,CMAbv,CMAbv, B, GB, B, VAbv, SUB, FPst, + FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, + SUB, Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, H, B, O,SMAbv,SMBlw,SMAbv,SMAbv, + SMAbv, VPst, IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, CS, O,FMAbv, ZWNJ, + CGJ, WJ, WJ, WJ, O,FMPst, O, SB, SE, O, H, MPst, VPst, H,VMAbv, VAbv, + VMBlw, B, VBlw, FPst, VPst, FAbv,VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, O, VBlw, + MPst, MPre, MAbv, MBlw, O, B, FAbv, FAbv, FPst, VBlw, B, B, VPre, O,VMPst, IS, + O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, + B, N, N, O, HN, VPre, VBlw, VAbv, IS,CMAbv, O, VPst, B, R, R,CMBlw, + VAbv, VPre,VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, H,VMPst, + VAbv,VMAbv, VPst, IS, R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, MBlw, MBlw, + GB, FBlw, FBlw,CMAbv, IS, VBlw, IS, GB, VAbv, R,VMPst, G, G, J, J, J, + SB, SE, J, HR, G, G, HM, HM, HM, O, VBlw, }; static const uint16_t -hb_use_u16[448] = +hb_use_u16[456] = { - 0, 0, 1, 2, 3, 4, 0, 5, 6, 0, 7, 0, 8, 9, 10, 11, - 9, 12, 13, 9, 9, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 17, 25, 26, 20, 21, 27, 28, 29, 30, 31, 32, 33, 21, 34, 35, 0, - 17, 36, 37, 20, 21, 38, 23, 39, 17, 40, 41, 42, 43, 44, 45, 46, - 30, 0, 47, 48, 21, 49, 50, 51, 17, 0, 52, 48, 21, 53, 50, 54, - 17, 55, 56, 48, 9, 57, 58, 59, 60, 61, 9, 62, 63, 64, 30, 65, - 66, 67, 9, 68, 69, 9, 70, 71, 72, 73, 74, 75, 76, 0, 9, 9, - 77, 78, 79, 80, 81, 82, 83, 84, 9, 85, 9, 86, 9, 87, 88, 89, - 9, 90, 91, 92, 2, 0, 93, 0, 9, 94, 95, 9, 96, 0, 97, 98, - 99,100, 30, 9,101,102,103, 9,104,105, 9,106, 9,107,108,109, - 2, 2,110, 9, 9,111,112, 2,113,114,115, 9,116, 9,117,118, - 119,120,121, 0, 0,122,123,124, 0,125,126,127,128, 0,129,130, - 131, 0, 0,132,133, 0, 0, 9,134,135,136, 9,137, 0, 9,138, - 139, 9, 9,140,141, 2,142,143,144, 9,145,146,147, 9, 9,148, - 149, 2,150, 98,151,152,153, 2, 9,154, 9,155,156, 0,157,158, - 159, 2,160, 0, 0,161, 0,162, 0,163,163,164, 33,165,166,167, - 9,168, 94, 0,169, 0, 9,170,171, 0,172, 2,173,170,174,175, - 176, 0, 0,177,178, 0,179, 9, 9,180,181,182,183,184,185, 9, - 9,186,187, 0,188, 9,189,190,191, 9, 9,192, 9,193,194,105, - 195,102, 9, 33,196,197,198, 0,199,200, 94, 9, 9,201,202, 2, - 203, 20, 21,204,205,206,207,208, 9,209,210,211,212, 0,195, 9, - 9,213,214, 2,215,216,217,218, 9,219,220, 2,221,222, 9,223, - 224,103,225, 0,226,227,228,229, 9,230,231, 2,232, 9, 9,233, - 234, 0,235, 9, 9,236,237,238,239,240, 21, 9,215,241, 7, 9, - 70, 18, 9,242, 73,243,244, 9, 9,245,246, 2,247, 9,248,249, - 9,250,251, 48, 9,252,253, 2, 9,254,255,256, 9,257,258,259, - 260,260,261,262,263, 0, 9,264,105, 70, 94,265, 0,266, 70,267, - 268, 0,269, 0,270, 2,271, 2,272, 2,129,129,160,160,160,129, + 0, 0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 0, 8, 0, 9, 10, + 11, 12, 10, 13, 14, 10, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 18, 26, 27, 21, 22, 28, 29, 30, 31, 32, 33, 34, 22, 35, + 36, 0, 18, 37, 38, 21, 22, 39, 24, 40, 18, 41, 42, 43, 44, 45, + 46, 47, 31, 0, 48, 49, 22, 50, 51, 52, 18, 0, 53, 49, 22, 54, + 51, 55, 18, 56, 57, 49, 10, 58, 59, 60, 61, 62, 10, 63, 64, 65, + 31, 66, 67, 68, 10, 69, 70, 10, 71, 72, 73, 74, 75, 76, 77, 0, + 10, 10, 78, 79, 80, 81, 82, 83, 84, 85, 10, 86, 10, 87, 10, 88, + 89, 90, 10, 91, 92, 93, 2, 0, 94, 0, 10, 95, 96, 10, 97, 0, + 98, 99,100,101, 31, 10,102,103,104, 10,105,106, 10,107, 10,108, + 109,110, 2, 2,111, 10, 10,112,113, 2,114,115,116, 10,117, 10, + 118,119,120,121,122, 0, 0,123,124,125, 0,126,127,128,129, 0, + 130,131,132, 0, 0,133,134, 0,135, 0, 0, 10,136,137,138, 0, + 139, 10,140, 0, 10,141,142, 10, 10,143,144, 2,145,146,147, 10, + 148,149,150, 10, 10,151,152, 2,153, 99,154,155,156, 2, 10,157, + 10,158,159, 0,160,161,162, 2,163, 0, 0,164, 0,165, 0,166, + 166,167, 34,168,169,170, 10,171, 95, 0,172, 0, 10,173,174, 0, + 175, 2,176,173,177,178,179, 0, 0,180,181, 0,182, 10, 10,183, + 184,185,186,187,188, 10, 10,189,190, 0,191, 10,192,193,194, 10, + 10,195, 10,196,197,106,198,103, 10, 34,199,200,201, 0,202,203, + 95, 10, 10,204,205, 2,206, 21, 22,207,208,209,210,211, 10,212, + 213,214,215, 0,198, 10, 10,216,217, 2,218,219,220,221, 10,222, + 223, 2,224,225, 10,226,227,104,228, 0,229,230,231,232, 10,233, + 234, 2,235, 10, 10,236,237, 0,238, 10, 10,239,240,241,242,243, + 22, 10,218,244, 8, 10, 71, 19, 10,245, 74,246,247, 10, 10,248, + 249, 2,250, 10,251,252, 10,253,254, 49, 10,255,256, 2,257,257, + 257,258,259,260, 10,261,262,263,264,264,265,266,267, 0, 10,268, + 106, 71, 95,269, 0,270, 71,271,272, 0,273, 0,274, 2,275, 2, + 276, 2,130,130,163,163,163,130, }; static inline unsigned @@ -622,7 +636,7 @@ hb_use_b4 (const uint8_t* a, unsigned i) static inline uint_fast8_t hb_use_get_category (unsigned u) { - return u<921600u?hb_use_u8[3049+(((hb_use_u8[865+(((hb_use_u16[((hb_use_u8[353+(((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>1>>3>>4))<<4)+((u>>1>>3>>1>>3)&15u))])<<3)+((u>>1>>3>>1)&7u))])<<1)+((u>>1>>3)&1u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; + return u<921600u?hb_use_u8[3105+(((hb_use_u8[889+(((hb_use_u16[((hb_use_u8[353+(((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>1>>3>>4))<<4)+((u>>1>>3>>1>>3)&15u))])<<3)+((u>>1>>3>>1)&7u))])<<1)+((u>>1>>3)&1u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; } #endif @@ -633,7 +647,9 @@ hb_use_get_category (unsigned u) #undef G #undef GB #undef H +#undef HM #undef HN +#undef HR #undef HVM #undef IS #undef J diff --git a/src/ms-use/IndicPositionalCategory-Additional.txt b/src/ms-use/IndicPositionalCategory-Additional.txt index 884fee590..cb07643bb 100644 --- a/src/ms-use/IndicPositionalCategory-Additional.txt +++ b/src/ms-use/IndicPositionalCategory-Additional.txt @@ -8,6 +8,7 @@ # Updated for Unicode 13.0 by Andrew Glass 2020-07-28 # Updated for Unicode 14.0 by Andrew Glass 2021-09-28 # Updated for Unicode 15.0 by Andrew Glass 2022-09-16 +# Updated for Unicode 15.1 by Andrew Glass 2023-09-14 # ================================================ # ================================================ diff --git a/src/ms-use/IndicSyllabicCategory-Additional.txt b/src/ms-use/IndicSyllabicCategory-Additional.txt index 0ca2aad10..43326c12d 100644 --- a/src/ms-use/IndicSyllabicCategory-Additional.txt +++ b/src/ms-use/IndicSyllabicCategory-Additional.txt @@ -6,6 +6,7 @@ # Updated for Unicode 13.0 by Andrew Glass 2020-07-28 # Updated for Unicode 14.0 by Andrew Glass 2021-09-25 # Updated for Unicode 15.0 by Andrew Glass 2022-09-16 +# Updated for Unicode 15.1 by Andrew Glass 2023-09-14 # ================================================ # OVERRIDES TO ASSIGNED VALUES @@ -13,7 +14,7 @@ # Indic_Syllabic_Category=Bindu 193A ; Bindu # Mn LIMBU SIGN KEMPHRENG -AA29 ; Bindu # Mn  CHAM VOWEL SIGN AA +AA29 ; Bindu # Mn CHAM VOWEL SIGN AA 10A0D ; Bindu # Mn KHAROSHTHI SIGN DOUBLE RING BELOW # ================================================ @@ -90,11 +91,6 @@ AABD ; Vowel_Independent # Lo TAI VIET VOWEL AN 10F30..10F45 ; Consonant # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN 10F70..10F81 ; Consonant # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH 111DA ; Consonant # Lo SHARADA EKAM -#HIEROGLYPHS to be moved to new category -13000..1342F ; Consonant # Lo [1071] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D -#For the Begin and End segment to be handled fully correctly, the cluster model needs to be modified. -13437..13438 ; Consonant # Lo [2] EGYPTIAN HIEROGLYPH BEGIN SEGMENT..EGYPTIAN HIEROGLYPH END SEGMENT -13441..13446 ; Consonant # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..HIEROGLYPH WIDE LOST SIGN 16B00..16B2F ; Consonant # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU 16F00..16F4A ; Consonant # Lo [75] MIAO LETTER PA..MIAO LETTER RTE 16FE4 ; Consonant # Mn KHITAN SMALL SCRIPT FILLER # Avoids Mn pushing this into VOWEL class @@ -174,9 +170,6 @@ FE00..FE0F ; Modifying_Letter # Mn [16] VARIATION SELECTOR-1..VARIATION SEL # Indic_Syllabic_Category=Virama 2D7F ; Virama # Mn TIFINAGH CONSONANT JOINER -#HIEROGLYPHS to be moved to new category -13430..13436 ; Virama # Cf [7] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH OVERLAY MIDDLE -13439..1343B ; Virama # Cf [3] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH INSERT AT BOTTOM # ================================================ @@ -198,9 +191,6 @@ AABD ; Vowel_Independent # Lo TAI VIET VOWEL AN # Indic_Syllabic_Category=Cantillation_Mark 1CF8..1CF9 ; Cantillation_Mark # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE -#HIEROGLYPHS to be moved to new category -13440 ; Cantillation_Mark # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY -13447..13455 ; Cantillation_Mark # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED # ================================================ @@ -214,55 +204,58 @@ AABD ; Vowel_Independent # Lo TAI VIET VOWEL AN # ================================================ # USE, Extended_Syllabic_Category=Hieroglyph -# 13000..1342F ; Hieroglyph # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D -# 13441..13446 ; Hieroglyph # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..HIEROGLYPH WIDE LOST SIGN +13000..1342F ; Hieroglyph # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +1343C..1343F ; Hieroglyph # Cf [4] EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE..END WALLED ENCLOSURE +13441..13446 ; Hieroglyph # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..HIEROGLYPH WIDE LOST SIGN # ================================================ # USE, Extended_Syllabic_Category=Hieroglyph_Joiner -# 13430..13436 ; Hieroglyph_Joiner # Cf [7] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH OVERLAY MIDDLE -# 13439..1343B ; Hieroglyph_Joiner # Cf [3] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH INSERT AT BOTTOM +13430..13436 ; Hieroglyph_Joiner # Cf [7] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH OVERLAY MIDDLE +13439..1343B ; Hieroglyph_Joiner # Cf [3] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH INSERT AT BOTTOM # ================================================ # USE, Extended_Syllabic_Category=Hieroglyph_Mark_Begin -# 005B ; Hieroglyph_Mark_Begin # Ps LEFT SQUARE BRACKET -# 007B ; Hieroglyph_Mark_Begin # Ps LEFT CURLY BRACKET -# 27E6 ; Hieroglyph_Mark_Begin # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET -# 27E8 ; Hieroglyph_Mark_Begin # Ps MATHEMATICAL LEFT ANGLE BRACKET -# 2E22 ; Hieroglyph_Mark_Begin # Ps TOP LEFT HALF BRACKET -# 2E24 ; Hieroglyph_Mark_Begin # Ps BOTTOM LEFT HALF BRACKET +005B ; Hieroglyph_Mark_Begin # Ps LEFT SQUARE BRACKET +007B ; Hieroglyph_Mark_Begin # Ps LEFT CURLY BRACKET +27E6 ; Hieroglyph_Mark_Begin # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E8 ; Hieroglyph_Mark_Begin # Ps MATHEMATICAL LEFT ANGLE BRACKET +2E22 ; Hieroglyph_Mark_Begin # Ps TOP LEFT HALF BRACKET +2E24 ; Hieroglyph_Mark_Begin # Ps BOTTOM LEFT HALF BRACKET # ================================================ # USE, Extended_Syllabic_Category=Hieroglyph_Mark_End -# 005D ; Hieroglyph_Mark_Begin # Pe RIGHT SQUARE BRACKET -# 007D ; Hieroglyph_Mark_Begin # Pe RIGHT CURLY BRACKET -# 27E7 ; Hieroglyph_Mark_Begin # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET -# 27E9 ; Hieroglyph_Mark_Begin # Pe MATHEMATICAL RIGHT ANGLE BRACKET -# 2E23 ; Hieroglyph_Mark_Begin # Pe TOP RIGHT HALF BRACKET -# 2E25 ; Hieroglyph_Mark_Begin # Pe BOTTOM RIGHT HALF BRACKET +005D ; Hieroglyph_Mark_End # Pe RIGHT SQUARE BRACKET +007D ; Hieroglyph_Mark_End # Pe RIGHT CURLY BRACKET +27E7 ; Hieroglyph_Mark_End # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E9 ; Hieroglyph_Mark_End # Pe MATHEMATICAL RIGHT ANGLE BRACKET +2E23 ; Hieroglyph_Mark_End # Pe TOP RIGHT HALF BRACKET +2E25 ; Hieroglyph_Mark_End # Pe BOTTOM RIGHT HALF BRACKET # ================================================ # USE, Extended_Syllabic_Category=Hieroglyph_Segment_Begin -# 13437 ; Hieroglyph_Segment_Begin # Cf EGYPTIAN HIEROGLYPH BEGIN SEGMENT +13437 ; Hieroglyph_Segment_Begin # Cf EGYPTIAN HIEROGLYPH BEGIN SEGMENT # ================================================ # USE, Extended_Syllabic_Category=Hieroglyph_Segment_End -# 13438 ; Hieroglyph_Segment_End # Cf EGYPTIAN HIEROGLYPH END SEGMENT +13438 ; Hieroglyph_Segment_End # Cf EGYPTIAN HIEROGLYPH END SEGMENT # ================================================ # USE, Extended_Syllabic_Category=Hieroglyph_Mirror -# 13440 ; Hieroglyph_Mirror # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13440 ; Hieroglyph_Mirror # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY # ================================================ # USE, Extended_Syllabic_Category=Hieroglyph_Modifier -# 13447..13455 ; Hieroglyph_Modifier # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +13447..13455 ; Hieroglyph_Modifier # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED # ================================================ # eof + + -- cgit v1.2.3 From b3705cbf070d3dc984c5b3e18c7657aadd2b1a0f Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 09:40:56 -0400 Subject: [Unicode 15.1] Update the UCD table --- src/hb-ucd-table.hh | 3450 ++++++++++++++++++++++++++------------------------- 1 file changed, 1727 insertions(+), 1723 deletions(-) diff --git a/src/hb-ucd-table.hh b/src/hb-ucd-table.hh index f7d76eee1..8d3807a80 100644 --- a/src/hb-ucd-table.hh +++ b/src/hb-ucd-table.hh @@ -4,7 +4,7 @@ * * ./gen-ucd-table.py ucd.nounihan.grouped.xml * - * on file with this description: Unicode 15.0.0 + * on file with this description: Unicode 15.1.0 */ #ifndef HB_UCD_TABLE_HH @@ -1069,7 +1069,7 @@ _hb_ucd_dm2_u64_map[388] = #ifndef HB_OPTIMIZE_SIZE static const uint8_t -_hb_ucd_u8[17868] = +_hb_ucd_u8[17884] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, @@ -1146,13 +1146,13 @@ _hb_ucd_u8[17868] = 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,243, 34, 244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,245, 34, 34, - 34, 34, 34, 34, 34, 34, 34,246,122,122,122,122,122,122,122,122, - 34, 34, 34, 34,247,122,122,122,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34,248, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34,249,122,122,122,122,122,122,122,122, - 250,122,251,252,122,122,122,122,122,122,122,122,122,122,122,122, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,253, + 34, 34, 34, 34, 34, 34, 34,246, 34, 34, 34, 34,247,122,122,122, + 34, 34, 34, 34,248,122,122,122,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34,249, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34,250,122,122,122,122,122,122,122,122, + 251,122,252,253,122,122,122,122,122,122,122,122,122,122,122,122, 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,254, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,255, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, @@ -1315,11 +1315,11 @@ _hb_ucd_u8[17868] = 121, 4, 4, 4, 4, 2, 2, 88, 2, 2, 2, 2, 2,120, 2, 2, 108,151, 2, 2, 2, 2, 2, 2, 67, 2,152,148,148,148,153, 44, 67, 67, 67, 67, 67, 55, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44, - 1, 2,154,155, 4, 4, 4, 4, 4, 67, 4, 4, 4, 4,156,157, - 158,105,105,105,105, 43, 43, 86,159, 40, 40, 67,105,160, 63, 67, - 36, 36, 36, 61, 57,161,162, 69, 36, 36, 36, 36, 36, 63, 40, 69, - 44, 44, 62, 36, 36, 36, 36, 36, 67, 27, 27, 67, 67, 67, 67, 67, + 67, 67, 67, 44, 44, 44, 44, 44, 1, 2,154,155, 4, 4, 4, 4, + 4, 67, 4, 4, 4, 4,156,157,158,105,105,105,105, 43, 43, 86, + 159, 40, 40, 67,105,160, 63, 67, 36, 36, 36, 61, 57,161,162, 69, + 36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36, + 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67, 92, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27,163, 27, 27, 27, 27, 27, 27, 27, 36, 36, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,164, 2, @@ -1487,215 +1487,215 @@ _hb_ucd_u8[17868] = 44, 61, 44, 62, 62, 62, 62, 36, 62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36, 36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36, 62, 36, 62, 36, 36, 62, 36, 36, - 8, 44, 44, 44, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67, - 27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44, - 44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67, - 67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 44, 44, 44, 44, 67, - 67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44, - 171,171,171,171,171,171,171, 44,171,171,171,171,171,171,171, 0, - 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, - 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, - 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, - 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, - 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, - 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2, - 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26, - 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21, - 21, 2, 1, 1, 21, 23, 26, 26, 1, 21, 6, 7, 7, 12, 12, 7, - 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1, - 12, 2, 6, 2, 24, 7, 7, 6, 1, 12, 12, 10, 10, 10, 10, 12, - 21, 6, 2, 10, 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, - 2, 23, 21, 26, 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, - 18, 2, 14, 14, 14, 7, 10, 21, 17, 21, 11, 12, 5, 2, 5, 6, - 8, 8, 8, 24, 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, - 17, 17, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, - 16, 21, 25, 22, 18, 21, 21, 29, 1, 2, 15, 6, 18, 6, 23, 2, - 12, 11, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, - 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, - 21, 22, 18, 17, 26, 6, 7, 14, 17, 22, 18, 18, 26, 14, 17, 6, - 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, 11, 21, 24, 9, 6, 9, - 23, 26, 6, 10, 4, 4, 3, 3, 7, 25, 17, 16, 16, 22, 16, 16, - 25, 17, 25, 2, 25, 24, 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, - 12, 17, 21, 1, 26, 10, 10, 1, 23, 15, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 0, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 0, - 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44, + 55, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, 27, 27, 91, 67, + 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, + 67, 92, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 92, 44, 44, 44, + 67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41, + 67, 67, 67, 67, 44, 44, 67, 67, 67, 67, 67, 92, 44, 55, 67, 67, + 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 55, + 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 67, 67, 67, 67, 67, 67, + 79, 44, 44, 44, 44, 44, 44, 44,171,171,171,171,171,171,171, 44, + 171,171,171,171,171,171,171, 0, 0, 0, 29, 21, 21, 21, 23, 21, + 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, + 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, + 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, + 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, + 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, + 2, 2, 6, 5, 9, 21, 9, 2, 2, 9, 25, 9, 26, 12, 11, 11, + 2, 6, 5, 21, 17, 2, 2, 26, 26, 23, 2, 12, 17, 12, 21, 12, + 12, 21, 7, 2, 2, 7, 7, 21, 21, 2, 1, 1, 21, 23, 26, 26, + 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, + 12, 26, 7, 26, 26, 7, 2, 1, 12, 2, 6, 2, 24, 7, 7, 6, + 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, 10, 2, 15, 26, + 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, 10, 7, 21, 15, + 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, 14, 7, 10, 21, + 17, 21, 11, 12, 5, 2, 5, 6, 8, 8, 8, 24, 5, 24, 2, 24, + 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, 22, 20, 27, 28, + 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, + 1, 2, 15, 6, 18, 6, 23, 2, 12, 11, 9, 26, 26, 9, 26, 5, + 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, + 18, 22, 5, 12, 2, 5, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, + 17, 22, 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, + 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, + 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 2, 15, + 12, 15, 14, 2, 21, 14, 7, 15, 12, 17, 21, 1, 26, 10, 10, 1, + 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, + 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 18, 19, 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, 20, 0, 21, 22, 23, 0, 0, 0, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 35, 0, 36, 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, 37, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 0, 43, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, - 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, - 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19, 0, 19, - 16, 20, 16, 19, 21, 19, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, - 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 37, 0, 0, 0, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, 47, 0, 0, 0, 48, - 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 52, - 53, 0, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, - 58, 0, 0, 59, 60, 61, 62, 63, 0, 0, 64, 65, 0, 0, 0, 66, - 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 0, - 72, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, - 0, 0, 75, 76, 0, 77, 78, 0, 0, 79, 80, 0, 81, 62, 0, 82, - 83, 0, 0, 84, 85, 86, 0, 0, 0, 87, 0, 88, 0, 0, 51, 89, - 51, 0, 90, 0, 91, 0, 0, 0, 80, 0, 0, 0, 92, 93, 0, 94, - 95, 96, 97, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 98, 99, 0, - 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0,101,102, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,103, 0, 0,104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,105,106, 0, 0,107, 0, 0, 0, 0, 0, 0, - 108, 0,109, 0,102, 0, 0, 0, 0, 0,110,111, 0, 0, 0, 0, - 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, - 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, - 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, - 0, 24, 25, 0, 0, 26, 0, 0, 0, 27, 0, 0, 28, 29, 30, 31, - 0, 0, 0, 32, 33, 34, 0, 0, 33, 0, 0, 35, 33, 0, 0, 0, - 33, 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, - 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 43, 0, 44, - 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48, - 49, 0, 0, 0, 0, 50, 0, 0, 0, 51, 0, 52, 0, 53, 0, 0, - 0, 0, 54, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, - 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 61, 52, 0, 62, 63, - 0, 0, 64, 0, 0, 0, 65, 66, 0, 0, 0, 67, 0, 68, 69, 70, - 71, 72, 1, 73, 0, 74, 75, 76, 0, 0, 77, 78, 0, 0, 0, 79, - 0, 0, 1, 1, 0, 0, 80, 0, 0, 81, 0, 0, 0, 0, 77, 82, - 0, 83, 0, 0, 0, 0, 0, 78, 84, 0, 85, 0, 52, 0, 1, 78, - 0, 0, 86, 0, 0, 87, 0, 0, 0, 0, 0, 88, 57, 0, 0, 0, - 0, 0, 0, 89, 90, 0, 0, 84, 0, 0, 33, 0, 0, 91, 0, 0, - 0, 0, 92, 0, 0, 0, 0, 49, 0, 0, 93, 0, 0, 0, 0, 94, - 95, 0, 0, 96, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0, - 0, 0, 0,100,101, 93, 0, 0,102, 0, 0, 0, 84, 0, 0,103, - 0, 0, 0,104,105, 0, 0,106,107, 0, 0, 0, 0, 0, 0,108, - 0, 0,109, 0, 0, 0, 0,110, 33, 0,111,112,113, 35, 0, 0, - 114, 0, 0, 0,115, 0, 0, 0, 0, 0, 0,116, 0, 0,117, 0, - 0, 0, 0,118, 88, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 52, - 119, 0, 0, 0, 0,120, 0, 0,121, 0, 0, 0, 0,119, 0, 0, - 122, 0, 0, 0, 0, 0, 0,123, 0, 0, 0,124, 0, 0, 0,125, - 0,126, 0, 0, 0, 0,127,128,129, 0,130, 0,131, 0, 0, 0, - 132,133,134, 0, 77, 0, 0, 0, 0, 0, 35, 0, 0, 0,135, 0, - 0, 0,136, 0, 0,137, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, - 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, - 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, - 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, - 0, 38, 1, 39, 14, 39, 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, - 21, 45, 46, 0, 0, 0, 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, - 1, 49, 49, 50, 0, 0, 51, 0, 0, 0, 52, 1, 0, 0, 38, 14, - 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 55, - 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 59, 0, 60, 0, 0, - 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 65, 0, - 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 69, 70, 0, - 71, 72, 73, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 78, 79, 0, - 0, 0, 0, 47, 0, 0, 0, 49, 0, 80, 0, 0, 0, 62, 0, 0, - 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, - 62, 0, 0, 0, 0, 49, 1, 85, 1, 52, 15, 86, 36, 10, 21, 87, - 0, 55, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, - 0, 89, 0, 0, 88, 0, 0, 0, 0, 78, 0, 0, 87, 9, 12, 4, - 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, - 1, 94, 95, 96, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, - 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 61, 0, 0,101,102, - 0, 0,103, 0, 0, 1, 1, 50, 0, 0, 0, 38, 0, 63, 0, 0, - 0, 0, 0, 62, 0, 0,104, 68, 61, 0, 0, 0, 78, 0, 0, 0, - 105,106, 58, 38, 81, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, - 84, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0,109, 61, - 0,110, 0, 0, 0, 1, 0, 0, 0, 0, 19, 58, 0, 0, 0, 51, - 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, 0, 0,113, 0, - 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0,113, 0, 0, - 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, 1, 58, 0, 0, - 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, 0,115, 0, 0, - 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, 0, 0, 56, 0, - 89, 80, 0, 0, 79, 0, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0, - 116, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4, - 122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1, - 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 0, 0, 0,123, - 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0,230,230,230,230, - 230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220, - 220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220,220,220, - 220,230,230,230,230,240,230,220,220,220,230,230,230,220,220, 0, - 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233, - 234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230,220,230, - 230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, - 230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, - 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, 0, 0, - 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, 0, 0, - 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230,220,230, - 220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230,230,230, - 230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, 0,220, - 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230, - 230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107,107,107, - 118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, 0,220, - 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130, - 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, - 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, - 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, 0,220, - 230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0, - 230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,230,230, - 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1, - 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228, - 232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230, - 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, - 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, - 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, - 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, - 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 17, - 17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113, - 129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, + 0, 0, 40, 41, 42, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 5, + 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, 14, 15, 16, 17, 16, 18, + 16, 19, 16, 19, 16, 19, 0, 19, 16, 20, 16, 19, 21, 19, 0, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, + 0, 0, 36, 0, 37, 0, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, + 0, 0, 0, 50, 0, 51, 0, 52, 53, 0, 54, 0, 0, 0, 0, 0, + 0, 55, 56, 57, 0, 0, 0, 0, 58, 0, 0, 59, 60, 61, 62, 63, + 0, 0, 64, 65, 0, 0, 0, 66, 0, 0, 0, 0, 67, 0, 0, 0, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 0, 0, 0, 70, 0, 71, 0, 0, 72, 0, 0, 73, 0, 0, 0, 0, + 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 75, 76, 0, 77, 78, 0, + 0, 79, 80, 0, 81, 62, 0, 82, 83, 0, 0, 84, 85, 86, 0, 0, + 0, 87, 0, 88, 0, 0, 51, 89, 51, 0, 90, 0, 91, 0, 0, 0, + 80, 0, 0, 0, 92, 93, 0, 94, 95, 96, 97, 0, 0, 0, 0, 0, + 51, 0, 0, 0, 0, 98, 99, 0, 0, 0, 0, 0, 0,100, 0, 0, + 0, 0, 0,101,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103, + 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,106, 0, + 0,107, 0, 0, 0, 0, 0, 0,108, 0,109, 0,102, 0, 0, 0, + 0, 0,110,111, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0, 0, + 0, 0, 0,113, 0,114, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, + 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19, 0, 20, + 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, 0, 0, + 0, 27, 0, 0, 28, 29, 30, 31, 0, 0, 0, 32, 33, 34, 0, 0, + 33, 0, 0, 35, 33, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 37, + 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 41, + 42, 0, 0, 0, 0, 43, 0, 44, 0, 0, 0, 45, 46, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 50, 0, 0, + 0, 51, 0, 52, 0, 53, 0, 0, 0, 0, 54, 0, 0, 0, 0, 55, + 0, 56, 0, 0, 0, 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, + 0, 0, 0, 61, 52, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 66, + 0, 0, 0, 67, 0, 68, 69, 70, 71, 72, 1, 73, 0, 74, 75, 76, + 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 1, 1, 0, 0, 80, 0, + 0, 81, 0, 0, 0, 0, 77, 82, 0, 83, 0, 0, 0, 0, 0, 78, + 84, 0, 85, 0, 52, 0, 1, 78, 0, 0, 86, 0, 0, 87, 0, 0, + 0, 0, 0, 88, 57, 0, 0, 0, 0, 0, 0, 89, 90, 0, 0, 84, + 0, 0, 33, 0, 0, 91, 0, 0, 0, 0, 92, 0, 0, 0, 0, 49, + 0, 0, 93, 0, 0, 0, 0, 94, 95, 0, 0, 96, 0, 0, 97, 0, + 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0,100,101, 93, 0, 0, + 102, 0, 0, 0, 84, 0, 0,103, 0, 0, 0,104,105, 0, 0,106, + 107, 0, 0, 0, 0, 0, 0,108, 0, 0,109, 0, 0, 0, 0,110, + 33, 0,111,112,113, 35, 0, 0,114, 0, 0, 0,115, 0, 0, 0, + 0, 0, 0,116, 0, 0,117, 0, 0, 0, 0,118, 88, 0, 0, 0, + 0, 0, 57, 0, 0, 0, 0, 52,119, 0, 0, 0, 0,120, 0, 0, + 121, 0, 0, 0, 0,119, 0, 0,122, 0, 0, 0, 0, 0, 0,123, + 0, 0, 0,124, 0, 0, 0,125, 0,126, 0, 0, 0, 0,127,128, + 129, 0,130, 0,131, 0, 0, 0,132,133,134, 0, 77, 0, 0, 0, + 0, 0, 35, 0, 0, 0,135, 0, 0, 0,136, 0, 0,137, 0, 0, + 138, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, + 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, + 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, + 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, + 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, + 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 19, 1, + 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 51, 0, + 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, + 54, 21, 35, 1, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, + 0, 0, 0, 59, 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, + 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 67, 0, + 0, 0, 68, 0, 0, 69, 70, 0, 71, 72, 73, 74, 75, 76, 0, 0, + 0, 77, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 49, + 0, 80, 0, 0, 0, 62, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, + 0, 0, 83, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, + 1, 52, 15, 86, 36, 10, 21, 87, 0, 55, 0, 0, 0, 0, 19, 10, + 1, 0, 0, 0, 0, 0, 88, 0, 0, 89, 0, 0, 88, 0, 0, 0, + 0, 78, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, + 21, 1, 21, 92, 93, 1, 1, 1, 1, 94, 95, 96, 97, 1, 98, 58, + 81, 99,100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, + 0, 0, 0, 61, 0, 0,101,102, 0, 0,103, 0, 0, 1, 1, 50, + 0, 0, 0, 38, 0, 63, 0, 0, 0, 0, 0, 62, 0, 0,104, 68, + 61, 0, 0, 0, 78, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, + 0, 0, 0,107, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 87, 0, + 0, 0, 0,108, 0, 0,109, 61, 0,110, 0, 0, 0, 1, 0, 0, + 0, 0, 19, 58, 0, 0, 0, 51, 0,111, 14, 52,112, 41, 0, 0, + 62, 0, 0, 61, 0, 0,113, 0, 87, 0, 0, 0, 61, 62, 0, 0, + 62, 0, 89, 0, 0,113, 0, 0, 0, 0,114, 0, 0, 0, 78, 55, + 0, 38, 1, 58, 1, 58, 0, 0, 63, 89, 0, 0,115, 0, 0, 0, + 55, 0, 0, 0, 0,115, 0, 0, 0, 0, 61, 0, 0, 0, 0, 79, + 0, 61, 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 79, 0, 0, 0, + 8, 91, 0, 0, 1, 87, 0, 0,116, 0, 0, 0, 0, 0, 0,117, + 0,118,119,120,121, 0,104, 4,122, 49, 23, 0, 0, 0, 38, 50, + 38, 58, 0, 0, 1, 87, 1, 1, 1, 1, 39, 1, 48,105, 87, 0, + 0, 0, 0, 1, 0, 0, 0,123, 4,122, 0, 0, 0, 1,124, 0, + 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216, + 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220, + 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220, + 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230, + 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, + 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220, + 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, + 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, + 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230, + 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230, + 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230, + 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0, + 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, + 230,220,220,220,230,230, 0,220, 27, 28, 29,230, 7, 0, 0, 0, + 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,230, 0, + 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 0, + 103,103, 9, 0,107,107,107,107,118,118, 9, 0,122,122,122,122, + 220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,130, 0, + 132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, + 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, 9, 0, + 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220, + 220, 0, 0, 0,230, 0, 0,220,230,220, 0,220,230,230,230, 0, + 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, 1, 0, 0, 0, + 230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230, + 233,220,230,220,230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230, + 220,230, 1, 1, 0, 0,218,228,232,222,224,224, 0, 8, 8, 0, + 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, 0, 0, 26, 0, + 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, 0, 0,220,220, + 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, + 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, + 0,226,216,216,216,216,216, 0,220,220,220, 0,232,232,220,230, + 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, + 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8, - 9, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0, - 23, 24, 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, - 0, 0, 0, 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41, - 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, - 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, - 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, - 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, - 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, - 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4, - 0, 10, 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35, - 36, 34, 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, - 21, 1, 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21, - 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 21, 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, - 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20, - 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13, - 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, - 13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, - 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, - 7, 41, 13, 42, 7, 7, 43, 7, 44, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 36, 0, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, + 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, + 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, + 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, + 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, + 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, + 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, + 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, + 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, + 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, + 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0, + 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, + 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, + 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 7, + 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, @@ -1716,201 +1716,202 @@ _hb_ucd_u8[17868] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 45, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, - 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, - 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 0, 0, 1, + 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, + 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, + 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, - 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101, - 102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116, - 117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131, - 132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145, - 96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158, - 159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164, - 167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171, - 171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96, - 96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182, - 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, - 182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185, - 186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204, - 205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96, - 96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215, - 96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221, - 222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59, - 59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96, - 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, + 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, + 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, + 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, + 152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164, + 164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169, + 169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173, + 173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182, + 182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189, + 190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197, + 198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208, + 208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212, + 213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218, + 219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226, + 59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233, + 59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 96, 96, - 96, 96, 96, 96, 96, 96, 70, 70, 70, 70,242, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,243, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,244, 96, 96, - 96, 96, 96, 96, 96, 96,245, 96,246,247, 0, 1, 2, 2, 0, 1, - 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, - 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, - 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, - 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, - 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, - 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, - 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, - 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, - 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, - 2, 2, 2, 2, 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7, - 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, - 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, - 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, - 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, - 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11, - 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, - 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2, - 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, - 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, - 10, 10, 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, - 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, - 10, 10, 2, 2, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10, - 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21, - 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, - 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2, - 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2, - 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, - 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, - 22, 22, 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, - 2, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 2, 2, 2, 2, 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2, - 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, - 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2, - 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23, - 23, 2, 2, 23, 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2, - 2, 2, 2, 2, 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2, - 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16, - 16, 16, 2, 2, 16, 16, 2, 16, 16, 16, 2, 2, 2, 2, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, - 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, - 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, - 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 2, 36, 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, - 36, 36, 36, 2, 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2, - 36, 36, 36, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, - 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, - 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, - 18, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 18, 18, - 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25, - 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, - 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2, - 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, - 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, - 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, - 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, - 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2, - 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, - 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, - 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32, - 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, 2, 2, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48, - 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, 48, 48, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52, - 52, 52, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 2, 2, 2, 2, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58, - 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91, - 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, 62, 2, 76, 76, - 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70, - 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70, - 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73, 6, 2, - 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 8, 8, 8, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, - 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, - 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, - 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 6, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, - 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, - 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, - 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, - 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, - 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27, - 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55, - 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, - 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 2, 2, 0, 0, - 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, 0, 13, 0, 13, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70, + 70, 70, 70, 70, 70,241, 70, 70, 70, 70,242, 96, 96, 96, 70, 70, + 70, 70,243, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70,244, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70,245, 96, 96, 96, 96, 96, 96, 96, 96,246, 96, + 247,248, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, + 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, + 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, + 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 2, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, + 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, + 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, + 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, + 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, + 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, + 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, + 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, + 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, + 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, + 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, + 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, + 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, + 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, + 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, + 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, + 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, + 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, + 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, + 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, + 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, + 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, + 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, + 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, + 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, + 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, + 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, + 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, + 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, + 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, + 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 23, 23, + 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, + 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, + 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 2, 16, + 16, 16, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, + 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 36, + 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, + 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, + 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, + 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, + 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, + 18, 18, 18, 18, 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, + 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 2, 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, + 25, 25, 25, 0, 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, + 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, + 8, 0, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, + 30, 30, 30, 30, 30, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, + 30, 30, 30, 2, 2, 2, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, + 28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 0, 0, 0, 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 0, 0, 2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 2, 2, 2, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 2, 46, 46, 46, 2, 46, 46, 2, 2, 2, 2, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, + 2, 2, 2, 2, 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, + 28, 28, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, + 2, 2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, + 2, 2, 2, 2, 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, + 91, 91, 91, 2, 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, + 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 62, 62, + 62, 62, 62, 62, 62, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, + 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, + 2, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, + 73, 73, 73, 73, 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, + 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, + 19, 19, 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, + 9, 19, 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, + 2, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, + 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, + 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 19, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 2, 19, 19, 19, 19, 19, 2, 2, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 56, 56, + 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 2, 2, 2, 2, 2, 55, + 55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 2, 2, + 2, 2, 2, 2, 2, 61, 61, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, + 13, 13, 13, 13, 2, 2, 0, 0, 0, 0, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 0, 0, + 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77, @@ -2190,7 +2191,7 @@ _hb_ucd_u8[17868] = 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[9320] = +_hb_ucd_u16[9344] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -2233,9 +2234,9 @@ _hb_ucd_u16[9320] = 209, 306, 209, 209, 209, 209, 209, 209, 9, 9, 9, 11, 11, 11, 307, 308, 13, 13, 13, 13, 13, 13, 309, 310, 11, 11, 311, 48, 48, 48, 312, 313, 48, 314, 315, 315, 315, 315, 32, 32, 316, 317, 318, 319, 320, 321, 140, 140, - 209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 325, - 326, 327, 328, 329, 136, 48, 48, 48, 48, 330, 178, 48, 48, 48, 48, 331, - 332, 48, 48, 136, 48, 48, 48, 48, 200, 333, 48, 48, 209, 209, 323, 48, + 209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 209, + 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 178, 48, 48, 48, 48, 330, + 331, 48, 48, 136, 48, 48, 48, 48, 200, 332, 48, 48, 209, 209, 333, 48, 209, 334, 335, 209, 336, 337, 209, 209, 335, 209, 209, 337, 209, 209, 209, 209, 48, 48, 48, 48, 209, 209, 209, 209, 48, 338, 48, 48, 48, 48, 48, 48, 151, 209, 209, 209, 287, 48, 48, 229, 339, 48, 340, 140, 13, 13, 341, 342, @@ -2306,475 +2307,476 @@ _hb_ucd_u16[9320] = 9, 9, 607, 11, 654, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 499, 271, 271, 655, 656, 140, 140, 140, 140, 499, 271, 657, 658, 140, 140, 140, 140, 659, 48, 660, 661, 662, 663, 664, 665, 666, 206, 667, 206, 140, 140, 140, 668, - 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 669, 669, 669, 209, 324, - 670, 209, 209, 209, 209, 209, 209, 209, 209, 209, 671, 140, 140, 140, 672, 209, - 673, 209, 209, 325, 674, 675, 324, 140, 209, 209, 209, 209, 209, 209, 209, 676, - 209, 209, 209, 209, 209, 677, 426, 426, 209, 209, 209, 209, 209, 209, 209, 678, - 209, 209, 209, 209, 209, 176, 325, 427, 325, 209, 209, 209, 679, 176, 209, 209, - 679, 209, 671, 675, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 671, 426, - 674, 209, 209, 680, 681, 325, 674, 674, 209, 682, 209, 209, 288, 140, 140, 192, + 209, 209, 669, 209, 209, 209, 209, 209, 209, 323, 334, 670, 670, 670, 209, 324, + 671, 209, 209, 209, 209, 209, 209, 209, 209, 209, 672, 140, 140, 140, 673, 209, + 674, 209, 209, 669, 675, 676, 324, 140, 209, 209, 209, 209, 209, 209, 209, 677, + 209, 209, 209, 209, 209, 678, 426, 426, 209, 209, 209, 209, 209, 209, 209, 679, + 209, 209, 209, 209, 209, 176, 669, 427, 669, 209, 209, 209, 680, 176, 209, 209, + 680, 209, 672, 676, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 672, 426, + 675, 209, 209, 681, 682, 669, 675, 675, 209, 683, 209, 209, 288, 140, 140, 192, 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 207, 48, 48, 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 478, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 100, 140, 48, 204, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 71, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, - 683, 140, 570, 570, 570, 570, 570, 570, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 140, 391, 391, 391, 391, 391, 391, 391, 684, - 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 4, 0, 4, - 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, - 0, 0, 0, 0, 7, 8, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 11, 12, 13, 14, 14, 15, 14, 14, 14, - 14, 14, 14, 14, 16, 17, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 19, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 20, 21, - 21, 21, 22, 20, 21, 21, 21, 21, 21, 23, 24, 25, 25, 25, 25, 25, - 25, 26, 25, 25, 25, 27, 28, 26, 29, 30, 31, 32, 31, 31, 31, 31, - 33, 34, 35, 31, 31, 31, 36, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 29, 31, 31, 31, 31, 37, 38, 37, 37, 37, 37, 37, 37, - 37, 39, 31, 31, 31, 31, 31, 31, 40, 40, 40, 40, 40, 40, 41, 26, - 42, 42, 42, 42, 42, 42, 42, 43, 44, 44, 44, 44, 44, 45, 44, 46, - 47, 47, 47, 48, 37, 49, 31, 31, 31, 50, 51, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 52, 31, 31, 31, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 54, 53, 55, 53, 53, 53, 56, 57, 58, 59, 59, 60, 61, 62, - 57, 63, 64, 65, 66, 59, 59, 67, 68, 69, 70, 71, 71, 72, 73, 74, - 69, 75, 76, 77, 78, 71, 79, 26, 80, 81, 82, 83, 83, 84, 85, 86, - 81, 87, 88, 26, 89, 83, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, - 93, 99, 100, 101, 102, 95, 95, 26, 103, 104, 105, 106, 107, 104, 108, 109, - 104, 105, 110, 26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116, - 114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126, - 123, 127, 128, 128, 129, 122, 130, 26, 131, 132, 133, 131, 131, 131, 131, 131, - 132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141, - 138, 142, 143, 137, 144, 137, 145, 26, 146, 147, 147, 147, 147, 147, 147, 148, - 147, 147, 147, 149, 26, 26, 26, 26, 150, 151, 152, 152, 153, 152, 152, 154, - 155, 156, 152, 157, 26, 26, 26, 26, 158, 158, 158, 158, 158, 158, 158, 158, - 158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161, - 158, 161, 162, 163, 26, 26, 26, 26, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, - 166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172, - 171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170, - 170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181, - 181, 181, 181, 181, 181, 182, 181, 183, 184, 184, 185, 186, 187, 187, 188, 26, - 189, 189, 190, 26, 191, 192, 193, 26, 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 200, 198, 198, 198, 198, 198, 201, 178, 178, - 178, 178, 178, 178, 178, 178, 202, 26, 203, 203, 203, 204, 203, 205, 203, 205, - 206, 203, 207, 207, 207, 208, 209, 26, 210, 210, 210, 210, 210, 211, 210, 210, - 210, 212, 210, 213, 194, 194, 194, 194, 214, 214, 214, 215, 216, 216, 216, 216, - 216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219, 216, 220, 9, 9, - 9, 221, 26, 26, 26, 26, 26, 26, 222, 222, 222, 222, 222, 222, 222, 222, - 222, 223, 222, 222, 222, 222, 222, 224, 225, 225, 225, 225, 225, 225, 225, 225, - 226, 226, 226, 226, 226, 226, 227, 228, 229, 229, 229, 229, 229, 229, 229, 230, - 229, 231, 232, 232, 232, 232, 232, 232, 18, 233, 165, 165, 165, 165, 165, 234, - 225, 26, 235, 9, 236, 237, 238, 239, 2, 2, 2, 2, 240, 241, 2, 2, - 2, 2, 2, 242, 243, 244, 2, 245, 2, 2, 2, 2, 2, 2, 2, 246, - 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 247, 247, 14, 14, 14, 14, - 247, 247, 14, 248, 14, 14, 14, 247, 14, 14, 14, 14, 14, 14, 249, 14, - 249, 14, 250, 251, 14, 14, 252, 253, 0, 254, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 256, 257, 0, 258, 2, 259, 0, 0, 0, 0, - 260, 26, 9, 9, 9, 9, 261, 26, 0, 0, 0, 0, 262, 263, 4, 0, - 0, 264, 0, 0, 2, 2, 2, 2, 2, 265, 0, 0, 0, 0, 0, 0, + 48, 48, 48, 48, 48, 48, 100, 48, 48, 48, 48, 48, 48, 204, 140, 140, + 48, 204, 140, 140, 140, 140, 140, 140, 48, 48, 48, 48, 71, 48, 48, 48, + 48, 48, 48, 140, 140, 140, 140, 140, 684, 140, 570, 570, 570, 570, 570, 570, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, + 391, 391, 391, 391, 391, 391, 391, 685, 391, 391, 391, 391, 391, 391, 391, 686, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, + 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, + 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, + 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, + 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, + 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, + 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, + 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 31, 31, + 31, 50, 51, 31, 31, 31, 31, 31, 31, 31, 31, 31, 52, 31, 31, 31, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 55, 53, 53, 53, + 56, 57, 58, 59, 59, 60, 61, 62, 57, 63, 64, 65, 66, 59, 59, 67, + 68, 69, 70, 71, 71, 72, 73, 74, 69, 75, 76, 77, 78, 71, 79, 26, + 80, 81, 82, 83, 83, 84, 85, 86, 81, 87, 88, 26, 89, 83, 90, 91, + 92, 93, 94, 95, 95, 96, 97, 98, 93, 99, 100, 101, 102, 95, 95, 26, + 103, 104, 105, 106, 107, 104, 108, 109, 104, 105, 110, 26, 111, 108, 108, 112, + 113, 114, 115, 113, 113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113, + 122, 123, 124, 122, 122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130, 26, + 131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131, + 136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145, 26, + 146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149, 26, 26, 26, 26, + 150, 151, 152, 152, 153, 152, 152, 154, 155, 156, 152, 157, 26, 26, 26, 26, + 158, 158, 158, 158, 158, 158, 158, 158, 158, 159, 158, 158, 158, 160, 159, 158, + 158, 158, 158, 159, 158, 158, 158, 161, 158, 161, 162, 163, 26, 26, 26, 26, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 165, 165, 165, 165, 166, 167, 165, 165, 165, 165, 165, 168, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 171, 172, 171, 170, 170, 170, 170, + 170, 171, 170, 170, 170, 170, 171, 172, 171, 170, 172, 170, 170, 170, 170, 170, + 170, 170, 171, 170, 170, 170, 170, 170, 170, 170, 170, 173, 170, 170, 170, 174, + 170, 170, 170, 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 179, 179, 179, 180, 181, 181, 181, 181, 181, 181, 181, 181, 181, 182, 181, 183, + 184, 184, 185, 186, 187, 187, 188, 26, 189, 189, 190, 26, 191, 192, 193, 26, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 195, 194, 196, 194, 196, + 197, 198, 198, 199, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 200, + 198, 198, 198, 198, 198, 201, 178, 178, 178, 178, 178, 178, 178, 178, 202, 26, + 203, 203, 203, 204, 203, 205, 203, 205, 206, 203, 207, 207, 207, 208, 209, 26, + 210, 210, 210, 210, 210, 211, 210, 210, 210, 212, 210, 213, 194, 194, 194, 194, + 214, 214, 214, 215, 216, 216, 216, 216, 216, 216, 216, 217, 216, 216, 216, 218, + 216, 219, 216, 219, 216, 220, 9, 9, 9, 221, 26, 26, 26, 26, 26, 26, + 222, 222, 222, 222, 222, 222, 222, 222, 222, 223, 222, 222, 222, 222, 222, 224, + 225, 225, 225, 225, 225, 225, 225, 225, 226, 226, 226, 226, 226, 226, 227, 228, + 229, 229, 229, 229, 229, 229, 229, 230, 229, 231, 232, 232, 232, 232, 232, 232, + 18, 233, 165, 165, 165, 165, 165, 234, 225, 26, 235, 9, 236, 237, 238, 239, + 2, 2, 2, 2, 240, 241, 2, 2, 2, 2, 2, 242, 243, 244, 2, 245, + 2, 2, 2, 2, 2, 2, 2, 246, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 14, 247, 247, 14, 14, 14, 14, 247, 247, 14, 248, 14, 14, 14, 247, + 14, 14, 14, 14, 14, 14, 249, 14, 249, 14, 250, 251, 14, 14, 252, 253, + 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 256, 257, + 0, 258, 2, 259, 0, 0, 0, 0, 260, 26, 9, 9, 9, 9, 261, 26, + 0, 0, 0, 0, 262, 263, 4, 0, 0, 264, 0, 0, 2, 2, 2, 2, + 2, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 26, 26, 26, - 0, 266, 26, 26, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 2, 2, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273, - 273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172, 26, 172, 172, 172, 172, - 172, 172, 172, 172, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 276, 26, 26, 26, 26, 277, 277, 277, 278, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 279, 26, 277, 277, 277, 277, 277, 277, 277, 277, + 0, 0, 0, 0, 258, 26, 26, 26, 0, 266, 26, 26, 0, 0, 0, 0, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, + 0, 0, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 2, 2, 2, 2, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 271, 272, + 165, 165, 165, 165, 166, 167, 273, 273, 273, 273, 273, 273, 273, 274, 275, 274, + 170, 170, 172, 26, 172, 172, 172, 172, 172, 172, 172, 172, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 26, 26, 26, 26, + 277, 277, 277, 278, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 279, 26, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 280, 26, 26, 26, 0, 281, 282, 0, 0, 0, 283, 284, 0, 285, - 286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 296, 0, 0, 294, 294, 294, 294, - 0, 0, 0, 0, 281, 26, 291, 291, 169, 169, 169, 296, 0, 0, 0, 0, - 0, 0, 0, 0, 169, 169, 169, 297, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, - 0, 0, 0, 0, 0, 0, 0, 0, 299, 299, 299, 299, 299, 299, 299, 299, - 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299, - 301, 26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 26, 26, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 26, 0, 0, 0, 0, 306, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 307, 2, 2, 2, 2, 2, 2, - 2, 308, 309, 310, 26, 26, 311, 2, 312, 312, 312, 312, 312, 313, 0, 314, - 315, 315, 315, 315, 315, 315, 315, 26, 316, 316, 316, 316, 316, 316, 316, 316, - 317, 318, 316, 319, 53, 53, 53, 53, 320, 320, 320, 320, 320, 321, 322, 322, - 322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326, - 326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331, 26, - 330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334, - 335, 26, 26, 336, 337, 337, 338, 26, 339, 339, 339, 26, 172, 172, 2, 2, - 2, 2, 2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345, 26, 169, 169, - 296, 346, 169, 169, 169, 169, 169, 345, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 347, 26, 26, 26, 26, 348, 26, 349, 350, 25, 25, 351, 352, - 353, 25, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 354, 26, 355, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 356, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 357, 31, 31, 31, 31, 31, - 31, 358, 26, 26, 26, 26, 31, 31, 9, 9, 0, 314, 9, 359, 0, 0, - 0, 0, 360, 0, 258, 281, 361, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 362, 363, 0, 0, 0, 1, 2, 2, 3, - 1, 2, 2, 3, 364, 291, 290, 291, 291, 291, 291, 365, 169, 169, 169, 296, - 366, 366, 366, 367, 258, 258, 26, 368, 369, 370, 369, 369, 371, 369, 369, 372, - 369, 373, 369, 373, 26, 26, 26, 26, 369, 369, 369, 369, 369, 369, 369, 369, - 369, 369, 369, 369, 369, 369, 369, 374, 375, 0, 0, 0, 0, 0, 376, 0, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 253, 0, 377, 378, 26, 26, 26, - 26, 26, 0, 0, 0, 0, 0, 379, 380, 380, 380, 381, 382, 382, 382, 382, - 382, 382, 383, 26, 384, 0, 0, 281, 385, 385, 385, 385, 386, 387, 388, 388, - 388, 389, 390, 390, 390, 390, 390, 391, 392, 392, 392, 393, 394, 394, 394, 394, - 395, 394, 396, 26, 26, 26, 26, 26, 397, 397, 397, 397, 397, 397, 397, 397, - 397, 397, 398, 398, 398, 398, 398, 398, 399, 399, 399, 400, 399, 401, 402, 402, - 402, 402, 403, 402, 402, 402, 402, 403, 404, 404, 404, 404, 404, 26, 405, 405, - 405, 405, 405, 405, 406, 407, 408, 409, 408, 409, 410, 408, 411, 408, 411, 412, - 26, 26, 26, 26, 26, 26, 26, 26, 413, 413, 413, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, 26, - 413, 413, 415, 26, 413, 26, 26, 26, 416, 2, 2, 2, 2, 2, 417, 308, - 26, 26, 26, 26, 26, 26, 26, 26, 418, 419, 420, 420, 420, 420, 421, 422, - 423, 423, 424, 423, 425, 425, 425, 425, 426, 426, 426, 427, 428, 426, 26, 26, - 26, 26, 26, 26, 429, 429, 430, 431, 432, 432, 432, 433, 434, 434, 434, 435, - 26, 26, 26, 26, 26, 26, 26, 26, 436, 436, 436, 436, 437, 437, 437, 438, - 437, 437, 439, 437, 437, 437, 437, 437, 440, 441, 442, 443, 444, 444, 445, 446, - 444, 447, 444, 447, 448, 448, 448, 448, 449, 449, 449, 449, 26, 26, 26, 26, - 450, 450, 450, 450, 451, 452, 451, 26, 453, 453, 453, 453, 453, 453, 454, 455, - 456, 456, 457, 456, 458, 458, 459, 458, 460, 460, 461, 462, 26, 463, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 464, 464, 464, 464, 464, 464, 464, 464, - 464, 465, 26, 26, 26, 26, 26, 26, 466, 466, 466, 466, 466, 466, 467, 26, - 466, 466, 466, 466, 466, 466, 467, 468, 469, 469, 469, 469, 469, 26, 469, 470, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 31, 31, 31, 50, 471, 471, 471, 471, 471, 472, 473, 26, - 26, 26, 26, 26, 26, 26, 26, 474, 475, 475, 475, 475, 475, 26, 476, 476, - 476, 476, 476, 477, 26, 26, 478, 478, 478, 479, 26, 26, 26, 26, 480, 480, - 480, 481, 26, 26, 482, 482, 483, 26, 484, 484, 484, 484, 484, 484, 484, 484, - 484, 485, 486, 484, 484, 484, 485, 487, 488, 488, 488, 488, 488, 488, 488, 488, - 489, 490, 491, 491, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 495, 494, - 494, 26, 496, 496, 496, 496, 497, 26, 498, 498, 498, 498, 498, 498, 498, 498, - 498, 498, 498, 498, 499, 137, 500, 26, 501, 501, 502, 501, 501, 501, 501, 501, - 503, 26, 26, 26, 26, 26, 26, 26, 504, 505, 506, 507, 506, 508, 509, 509, - 509, 509, 509, 509, 509, 510, 509, 511, 512, 513, 514, 515, 515, 516, 517, 518, - 513, 519, 520, 521, 522, 523, 523, 26, 524, 524, 524, 524, 524, 524, 524, 524, - 524, 524, 524, 525, 526, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, - 527, 26, 527, 528, 26, 26, 26, 26, 529, 529, 529, 529, 529, 529, 530, 529, - 529, 529, 529, 530, 26, 26, 26, 26, 531, 531, 531, 531, 531, 531, 531, 531, - 532, 26, 531, 533, 198, 534, 26, 26, 535, 535, 535, 535, 535, 535, 535, 536, - 535, 536, 26, 26, 26, 26, 26, 26, 537, 537, 537, 538, 537, 539, 537, 537, - 540, 26, 26, 26, 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 542, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 543, 543, 543, 543, - 543, 543, 543, 543, 543, 543, 544, 545, 546, 547, 548, 549, 549, 549, 550, 551, - 546, 26, 549, 552, 26, 26, 26, 26, 26, 26, 26, 26, 553, 554, 553, 553, - 553, 553, 553, 554, 555, 26, 26, 26, 556, 556, 556, 556, 556, 556, 556, 556, - 556, 26, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558, 26, 178, 178, - 559, 559, 559, 559, 559, 559, 559, 560, 53, 561, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 562, 563, 562, 562, 562, 562, 564, 562, - 565, 26, 562, 562, 562, 566, 567, 567, 567, 567, 568, 567, 567, 569, 570, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 571, 572, 573, 573, 573, 573, 571, 574, - 573, 26, 573, 575, 576, 577, 578, 578, 578, 579, 580, 581, 578, 582, 26, 26, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 26, 26, 26, 0, 0, + 281, 0, 0, 0, 282, 283, 0, 284, 285, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291, + 292, 293, 293, 293, 293, 293, 294, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 295, 0, 0, 293, 293, 293, 293, 0, 0, 0, 0, 296, 297, 290, 290, + 169, 169, 169, 295, 0, 0, 0, 0, 0, 0, 0, 0, 169, 169, 169, 298, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 290, 290, 290, 290, 299, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 0, 0, 0, 0, 0, + 277, 277, 277, 277, 277, 277, 277, 277, 0, 0, 0, 0, 0, 0, 0, 0, + 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, + 300, 301, 300, 300, 300, 300, 300, 300, 302, 26, 303, 303, 303, 303, 303, 303, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 305, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 26, + 0, 0, 0, 0, 307, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 308, 2, 2, 2, 2, 2, 2, 2, 309, 310, 311, 26, 26, 312, 2, + 313, 313, 313, 313, 313, 314, 0, 315, 316, 316, 316, 316, 316, 316, 316, 26, + 317, 317, 317, 317, 317, 317, 317, 317, 318, 319, 317, 320, 53, 53, 53, 53, + 321, 321, 321, 321, 321, 322, 323, 323, 323, 323, 324, 325, 169, 169, 169, 326, + 327, 327, 327, 327, 327, 327, 327, 327, 327, 328, 327, 329, 164, 164, 164, 330, + 331, 331, 331, 331, 331, 331, 332, 26, 331, 333, 331, 334, 164, 164, 164, 164, + 335, 335, 335, 335, 335, 335, 335, 335, 336, 26, 26, 337, 338, 338, 339, 26, + 340, 340, 340, 26, 172, 172, 2, 2, 2, 2, 2, 341, 342, 343, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 338, 338, 338, 338, 338, 344, 338, 345, + 169, 169, 169, 169, 346, 26, 169, 169, 295, 347, 169, 169, 169, 169, 169, 346, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 583, 583, 583, 584, 585, 585, 586, 585, 585, 585, 585, 587, - 585, 585, 585, 588, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 589, 26, - 108, 108, 108, 108, 108, 108, 590, 591, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 594, 595, 26, 592, 592, 592, 592, 592, 592, 592, 592, - 596, 26, 26, 26, 26, 26, 26, 26, 26, 26, 597, 597, 597, 597, 597, 597, - 597, 597, 597, 597, 597, 597, 598, 26, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 600, 26, 26, 26, 26, 26, 601, 601, 601, 601, 601, 601, 601, 601, - 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, - 602, 26, 26, 26, 26, 26, 26, 26, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 603, - 604, 604, 604, 605, 604, 606, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, - 607, 609, 610, 610, 610, 611, 611, 26, 612, 612, 612, 612, 612, 612, 612, 612, - 613, 26, 612, 614, 614, 612, 612, 615, 612, 612, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 618, 618, 618, 618, 618, 618, 618, 618, - 618, 619, 618, 618, 618, 618, 618, 618, 618, 620, 618, 618, 26, 26, 26, 26, - 26, 26, 26, 26, 621, 26, 347, 26, 622, 622, 622, 622, 622, 622, 622, 622, - 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, - 622, 622, 622, 622, 622, 622, 622, 26, 623, 623, 623, 623, 623, 623, 623, 623, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 348, 26, 26, 26, 26, + 349, 26, 350, 351, 25, 25, 352, 353, 354, 25, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 355, 26, 356, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 357, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 358, 31, 31, 31, 31, 31, 31, 359, 26, 26, 26, 26, 31, 31, + 9, 9, 0, 315, 9, 360, 0, 0, 0, 0, 361, 0, 258, 296, 362, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 363, + 364, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 365, 290, 289, 290, + 290, 290, 290, 366, 169, 169, 169, 295, 367, 367, 367, 368, 258, 258, 26, 369, + 370, 371, 370, 370, 372, 370, 370, 373, 370, 374, 370, 374, 26, 26, 26, 26, + 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 375, + 376, 0, 0, 0, 0, 0, 377, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 253, 0, 378, 379, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 380, + 381, 381, 381, 382, 383, 383, 383, 383, 383, 383, 384, 26, 385, 0, 0, 296, + 386, 386, 386, 386, 387, 388, 389, 389, 389, 390, 391, 391, 391, 391, 391, 392, + 393, 393, 393, 394, 395, 395, 395, 395, 396, 395, 397, 26, 26, 26, 26, 26, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 399, 399, 399, 399, 399, 399, + 400, 400, 400, 401, 400, 402, 403, 403, 403, 403, 404, 403, 403, 403, 403, 404, + 405, 405, 405, 405, 405, 26, 406, 406, 406, 406, 406, 406, 407, 408, 409, 410, + 409, 410, 411, 409, 412, 409, 412, 413, 26, 26, 26, 26, 26, 26, 26, 26, + 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, 414, + 414, 414, 414, 414, 414, 414, 415, 26, 414, 414, 416, 26, 414, 26, 26, 26, + 417, 2, 2, 2, 2, 2, 418, 309, 26, 26, 26, 26, 26, 26, 26, 26, + 419, 420, 421, 421, 421, 421, 422, 423, 424, 424, 425, 424, 426, 426, 426, 426, + 427, 427, 427, 428, 429, 427, 26, 26, 26, 26, 26, 26, 430, 430, 431, 432, + 433, 433, 433, 434, 435, 435, 435, 436, 26, 26, 26, 26, 26, 26, 26, 26, + 437, 437, 437, 437, 438, 438, 438, 439, 438, 438, 440, 438, 438, 438, 438, 438, + 441, 442, 443, 444, 445, 445, 446, 447, 445, 448, 445, 448, 449, 449, 449, 449, + 450, 450, 450, 450, 26, 26, 26, 26, 451, 451, 451, 451, 452, 453, 452, 26, + 454, 454, 454, 454, 454, 454, 455, 456, 457, 457, 458, 457, 459, 459, 460, 459, + 461, 461, 462, 463, 26, 464, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 465, 465, 465, 465, 465, 465, 465, 465, 465, 466, 26, 26, 26, 26, 26, 26, + 467, 467, 467, 467, 467, 467, 468, 26, 467, 467, 467, 467, 467, 467, 468, 469, + 470, 470, 470, 470, 470, 26, 470, 471, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 50, + 472, 472, 472, 472, 472, 473, 474, 26, 26, 26, 26, 26, 26, 26, 26, 475, + 476, 476, 476, 476, 476, 26, 477, 477, 477, 477, 477, 478, 26, 26, 479, 479, + 479, 480, 26, 26, 26, 26, 481, 481, 481, 482, 26, 26, 483, 483, 484, 26, + 485, 485, 485, 485, 485, 485, 485, 485, 485, 486, 487, 485, 485, 485, 486, 488, + 489, 489, 489, 489, 489, 489, 489, 489, 490, 491, 492, 492, 492, 493, 492, 494, + 495, 495, 495, 495, 495, 495, 496, 495, 495, 26, 497, 497, 497, 497, 498, 26, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 500, 137, 501, 26, + 502, 502, 503, 502, 502, 502, 502, 502, 504, 26, 26, 26, 26, 26, 26, 26, + 505, 506, 507, 508, 507, 509, 510, 510, 510, 510, 510, 510, 510, 511, 510, 512, + 513, 514, 515, 516, 516, 517, 518, 519, 514, 520, 521, 522, 523, 524, 524, 26, + 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 526, 527, 26, 26, 26, + 528, 528, 528, 528, 528, 528, 528, 528, 528, 26, 528, 529, 26, 26, 26, 26, + 530, 530, 530, 530, 530, 530, 531, 530, 530, 530, 530, 531, 26, 26, 26, 26, + 532, 532, 532, 532, 532, 532, 532, 532, 533, 26, 532, 534, 198, 535, 26, 26, + 536, 536, 536, 536, 536, 536, 536, 537, 536, 537, 26, 26, 26, 26, 26, 26, + 538, 538, 538, 539, 538, 540, 538, 538, 541, 26, 26, 26, 26, 26, 26, 26, + 542, 542, 542, 542, 542, 542, 542, 543, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, 545, 546, + 547, 548, 549, 550, 550, 550, 551, 552, 547, 26, 550, 553, 26, 26, 26, 26, + 26, 26, 26, 26, 554, 555, 554, 554, 554, 554, 554, 555, 556, 26, 26, 26, + 557, 557, 557, 557, 557, 557, 557, 557, 557, 26, 558, 558, 558, 558, 558, 558, + 558, 558, 558, 558, 559, 26, 178, 178, 560, 560, 560, 560, 560, 560, 560, 561, + 53, 562, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 563, 564, 563, 563, 563, 563, 565, 563, 566, 26, 563, 563, 563, 567, 568, 568, + 568, 568, 569, 568, 568, 570, 571, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 572, 573, 574, 574, 574, 574, 572, 575, 574, 26, 574, 576, 577, 578, 579, 579, + 579, 580, 581, 582, 579, 583, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 584, 584, 584, 585, + 586, 586, 587, 586, 586, 586, 586, 588, 586, 586, 586, 589, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 590, 26, 108, 108, 108, 108, 108, 108, 591, 592, + 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, + 593, 593, 593, 594, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 595, 596, 26, + 593, 593, 593, 593, 593, 593, 593, 593, 597, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 599, 26, + 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 601, 26, 26, 26, 26, 26, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 603, 26, 26, 26, 26, 26, 26, 26, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 604, 605, 605, 605, 606, 605, 607, 608, 608, + 608, 608, 608, 608, 608, 608, 608, 609, 608, 610, 611, 611, 611, 612, 612, 26, + 613, 613, 613, 613, 613, 613, 613, 613, 614, 26, 613, 615, 615, 613, 613, 616, + 613, 613, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 617, 617, 617, 617, 617, 617, 617, 617, + 617, 617, 617, 618, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 619, 619, 619, 619, 619, 619, 619, 619, 619, 620, 619, 619, 619, 619, 619, 619, + 619, 621, 619, 619, 26, 26, 26, 26, 26, 26, 26, 26, 622, 26, 348, 26, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, - 623, 623, 624, 26, 26, 26, 26, 26, 622, 625, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 626, 627, 628, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 629, 26, 630, 26, - 26, 26, 631, 26, 632, 26, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, - 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, - 633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 635, 635, 635, 635, 635, 635, - 635, 635, 635, 635, 635, 636, 635, 637, 635, 638, 635, 639, 281, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 9, 9, 9, 9, 9, 640, 9, 9, - 221, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 281, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 26, 0, 0, 0, 0, 258, 363, 0, 0, - 0, 0, 0, 0, 641, 642, 0, 643, 644, 645, 0, 0, 0, 646, 0, 0, - 0, 0, 0, 0, 0, 266, 26, 26, 14, 14, 14, 14, 14, 14, 14, 14, - 247, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 281, 26, 0, 0, 281, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 258, 26, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 647, 648, 0, 649, - 650, 0, 0, 0, 0, 0, 0, 0, 269, 651, 255, 255, 0, 0, 0, 652, - 653, 654, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 0, 0, 0, 0, 0, 656, 656, 656, 656, 656, 656, 656, 656, - 656, 656, 656, 656, 656, 656, 656, 656, 656, 657, 26, 658, 659, 656, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 348, 660, 308, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 661, 270, 270, 662, 663, 664, 18, 18, - 18, 18, 18, 18, 18, 665, 26, 26, 26, 666, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 667, 667, 667, 667, 667, 668, 667, 669, - 667, 670, 26, 26, 26, 26, 26, 26, 26, 26, 671, 671, 671, 672, 26, 26, - 673, 673, 673, 673, 673, 673, 673, 674, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 675, 675, 675, 675, 675, 676, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 172, 677, 170, 172, 678, 678, 678, 678, 678, 678, 678, 678, - 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, - 679, 678, 680, 26, 26, 26, 26, 26, 681, 681, 681, 681, 681, 681, 681, 681, - 681, 682, 681, 683, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 0, 377, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 276, - 26, 26, 26, 26, 26, 26, 26, 26, 684, 31, 31, 31, 685, 686, 687, 688, - 689, 690, 685, 691, 685, 687, 687, 692, 31, 693, 31, 694, 695, 693, 31, 694, - 26, 26, 26, 26, 26, 26, 51, 26, 0, 0, 0, 0, 0, 281, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 26, 0, 258, 363, 0, - 363, 0, 363, 0, 0, 0, 276, 26, 0, 0, 0, 0, 0, 276, 26, 26, - 26, 26, 26, 26, 696, 0, 0, 0, 697, 26, 0, 0, 0, 0, 0, 281, - 0, 260, 314, 26, 276, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 698, 0, 377, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 258, 699, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 314, 0, 281, 260, 26, 0, 281, 0, 0, 0, 0, 0, 0, - 0, 26, 0, 314, 0, 0, 0, 0, 0, 26, 0, 0, 0, 276, 314, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 281, 26, 0, 276, 0, 377, 0, 260, 0, 0, 0, 0, 0, 269, - 276, 696, 0, 281, 0, 260, 0, 260, 0, 0, 360, 0, 0, 0, 0, 0, - 0, 266, 26, 26, 26, 26, 0, 314, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 347, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347, 26, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 700, 26, 26, 26, 277, 277, 277, 280, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 701, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 702, 26, 26, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 26, + 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, + 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 625, 26, 26, 26, 26, 26, + 623, 626, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 627, 628, + 629, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 630, 26, 631, 26, 26, 26, 632, 26, 633, 26, 634, 634, + 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, + 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 635, + 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 637, 636, 638, + 636, 639, 636, 640, 296, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 9, 9, 9, 9, 9, 641, 9, 9, 221, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 296, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 26, + 0, 0, 0, 0, 258, 364, 0, 0, 0, 0, 0, 0, 642, 643, 0, 644, + 645, 646, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 0, 266, 26, 26, + 14, 14, 14, 14, 14, 14, 14, 14, 247, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 296, 26, 0, 0, 296, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 26, 0, 0, 0, 260, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 648, 649, 0, 650, 651, 0, 0, 0, 0, 0, 0, 0, + 269, 652, 255, 255, 0, 0, 0, 653, 654, 655, 656, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 0, + 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, + 657, 658, 26, 659, 660, 657, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 2, 2, 2, 349, 661, 309, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 662, 270, 270, 663, 664, 665, 18, 18, 18, 18, 18, 18, 18, 666, 26, 26, + 26, 667, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 668, 668, 668, 668, 668, 669, 668, 670, 668, 671, 26, 26, 26, 26, 26, 26, + 26, 26, 672, 672, 672, 673, 26, 26, 674, 674, 674, 674, 674, 674, 674, 675, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 676, 676, 676, 676, 676, 677, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 172, 678, 170, 172, + 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, + 679, 679, 679, 679, 679, 679, 679, 679, 680, 679, 681, 26, 26, 26, 26, 26, + 682, 682, 682, 682, 682, 682, 682, 682, 682, 683, 682, 684, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 364, 0, + 0, 0, 0, 0, 0, 0, 378, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 364, 0, 0, 0, 0, 0, 0, 276, 26, 26, 26, 26, 26, 26, 26, 26, + 685, 31, 31, 31, 686, 687, 688, 689, 690, 691, 686, 692, 686, 688, 688, 693, + 31, 694, 31, 695, 696, 694, 31, 695, 26, 26, 26, 26, 26, 26, 51, 26, + 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 296, 26, 0, 258, 364, 0, 364, 0, 364, 0, 0, 0, 276, 26, + 0, 0, 0, 0, 0, 276, 26, 26, 26, 26, 26, 26, 697, 0, 0, 0, + 698, 26, 0, 0, 0, 0, 0, 296, 0, 260, 315, 26, 276, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 699, 0, 378, 0, 378, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 700, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 315, 0, 296, 260, 26, + 0, 296, 0, 0, 0, 0, 0, 0, 0, 26, 0, 315, 0, 0, 0, 0, + 0, 26, 0, 0, 0, 276, 315, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 26, 0, 276, 0, 378, + 0, 260, 0, 0, 0, 0, 0, 269, 276, 697, 0, 296, 0, 260, 0, 260, + 0, 0, 361, 0, 0, 0, 0, 0, 0, 266, 26, 26, 26, 26, 0, 315, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 26, 26, 26, + 277, 277, 277, 277, 277, 277, 277, 348, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 348, 26, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 701, 26, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 26, 26, 26, 26, + 277, 277, 277, 280, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 702, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 703, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, - 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, - 0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127,1131,1133, 0,1147, - 1154,1155,1156,1161,1187,1188,1189,1193, 0,1219,1226,1227,1228,1229,1233, 0, - 0,1267,1268,1269,1273,1298, 0,1303, 943,1128, 944,1129, 954,1139, 958,1143, - 959,1144, 960,1145, 961,1146, 964,1149, 0, 0, 973,1158, 974,1159, 975,1160, - 983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179, 0, 0, - 1004,1190,1005,1191,1006,1192,1014,1199,1007, 0, 0, 0,1016,1201,1020,1206, - 0,1022,1208,1025,1211,1023,1209, 0, 0, 0, 0,1032,1218,1037,1223,1035, - 1221, 0, 0, 0,1044,1230,1045,1231,1049,1235, 0, 0,1058,1244,1064,1250, - 1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261, 0, 0, - 1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299, - 1115,1118,1307,1120,1309,1121,1310, 0,1053,1239, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,1093,1280, 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, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340, - 1367,1342,1369,1339,1366, 0,1320,1347,1418,1419,1323,1350, 0, 0, 992,1177, - 1018,1204,1055,1241,1416,1417,1415,1424,1202, 0, 0, 0, 987,1172, 0, 0, - 1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165, - 1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279, - 1071,1257,1076,1263, 0, 0, 997,1182, 0, 0, 0, 0, 0, 0, 945,1130, - 982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10,1425, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,1314,1427, 5, - 1434,1438,1443, 0,1450, 0,1455,1461,1514, 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,1446,1458,1468,1476,1480,1486,1517, 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,1489,1503,1494,1500,1508, 0, 0, 0, 0,1520,1521, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1526,1528, 0,1525, 0, 0, 0,1522, - 0, 0, 0, 0,1536,1532,1539, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1556, 0, 0, 0, 0, 0, 0,1548,1550, 0,1547, 0, 0, 0,1567, - 0, 0, 0, 0,1558,1554,1561, 0, 0, 0, 0, 0, 0, 0,1568,1569, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1529,1551, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1523,1545,1524,1546, 0, 0,1527,1549, - 0, 0,1570,1571,1530,1552,1531,1553, 0, 0,1533,1555,1535,1557,1537,1559, - 0, 0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564, 0, 0, - 1543,1565, 0, 0, 0, 0, 0, 0, 0, 0,1606,1607,1609,1608,1610, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1613, 0,1611, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1612, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1620, 0, 0, 0, 0, 0, 0, 0,1623, 0, 0,1624, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1614,1615,1616,1617,1618,1619,1621,1622, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1628,1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1625,1626, 0,1627, 0, 0, 0,1634, 0, 0,1635, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1630,1631,1632, 0, 0,1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1639, 0, 0,1638,1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1636,1637, 0, 0, 0, 0, 0, 0,1641, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1642,1644,1643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1645, 0, 0, 0, 0, 0, 0, 0,1646, 0, 0, 0, 0, 0, 0,1648, - 1649, 0,1647,1650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1651,1653,1652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1654, 0,1655,1657,1656, 0, 0, 0, 0,1659, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1660, 0, 0, 0, 0,1661, 0, 0, 0, 0,1662, - 0, 0, 0, 0,1663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1658, 0, 0, 0, 0, 0, 0, 0, 0, 0,1664, 0,1665,1673, 0, - 1674, 0, 0, 0, 0, 0, 0, 0, 0,1666, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1668, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1669, 0, 0, 0, 0,1670, 0, 0, 0, 0,1671, - 0, 0, 0, 0,1672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1675, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1676, 0, - 1677, 0,1678, 0,1679, 0,1680, 0, 0, 0,1681, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1682, 0,1683, 0, 0,1684,1685, 0,1686, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 953,1138, 955,1140, 956,1141, 957,1142, - 1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381, - 984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181, - 999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210, - 1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222, - 1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243, - 1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389, - 1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284, - 1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291, - 1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260, - 1293,1305, 0,1394, 0, 0, 0, 0, 952,1137, 947,1132,1317,1344,1316,1343, - 1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696, - 981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698, - 1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359, - 1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274, - 1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304, - 1112,1300, 0, 0, 0, 0, 0, 0,1471,1472,1701,1705,1702,1706,1703,1707, - 1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732, 0, 0, - 1435,1436,1733,1735,1734,1736, 0, 0,1481,1482,1737,1741,1738,1742,1739,1743, - 1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770, - 1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780, 0, 0, - 1451,1452,1781,1783,1782,1784, 0, 0,1504,1505,1785,1788,1786,1789,1787,1790, - 0,1459, 0,1791, 0,1792, 0,1793,1509,1510,1794,1798,1795,1799,1796,1800, - 1462,1463,1808,1812,1809,1813,1810,1814,1467, 21,1475, 22,1479, 23,1485, 24, - 1493, 27,1499, 28,1507, 29, 0, 0,1704,1708,1709,1710,1711,1712,1713,1714, - 1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750, - 1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807, - 1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465, 0,1473,1825, - 1429,1428,1426, 12,1432, 0, 26, 0, 0,1315,1823,1484,1466, 0,1483,1829, - 1433, 13,1437, 14,1441,1826,1827,1828,1488,1487,1513, 19, 0, 0,1492,1515, - 1445,1444,1442, 15, 0,1831,1832,1833,1502,1501,1516, 25,1497,1498,1506,1518, - 1457,1456,1454, 17,1453,1313, 11, 3, 0, 0,1824,1512,1519, 0,1511,1830, - 1449, 16,1460, 18,1464, 4, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, - 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1834,1835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1836, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1837,1839,1838, 0, 0, 0, 0,1840, 0, 0, 0, - 0,1841, 0, 0,1842, 0, 0, 0, 0, 0, 0, 0,1843, 0,1844, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1845, 0, 0,1846, 0, 0,1847, - 0,1848, 0, 0, 0, 0, 0, 0, 937, 0,1850, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1849, 936, 938,1851,1852, 0, 0,1853,1854, 0, 0, - 1855,1856, 0, 0, 0, 0, 0, 0,1857,1858, 0, 0,1861,1862, 0, 0, - 1863,1864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1867,1868,1869,1870,1859,1860,1865,1866, 0, 0, 0, 0, - 0, 0,1871,1872,1873,1874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1877, 0,1878, 0,1879, 0,1880, 0,1881, 0,1882, 0, - 1883, 0,1884, 0,1885, 0,1886, 0,1887, 0,1888, 0, 0,1889, 0,1890, - 0,1891, 0, 0, 0, 0, 0, 0,1892,1893, 0,1894,1895, 0,1896,1897, - 0,1898,1899, 0,1900,1901, 0, 0, 0, 0, 0, 0,1876, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1902, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1904, 0,1905, 0,1906, 0,1907, 0,1908, 0,1909, 0, - 1910, 0,1911, 0,1912, 0,1913, 0,1914, 0,1915, 0, 0,1916, 0,1917, - 0,1918, 0, 0, 0, 0, 0, 0,1919,1920, 0,1921,1922, 0,1923,1924, - 0,1925,1926, 0,1927,1928, 0, 0, 0, 0, 0, 0,1903, 0, 0,1929, - 1930,1931,1932, 0, 0, 0,1933, 0, 710, 385, 724, 715, 455, 103, 186, 825, - 825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500, - 649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679, - 293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722, - 781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540, - 714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589, - 648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101, - 430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110, - 135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801, - 812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610, - 726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494, - 113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748, - 774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161, - 395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727, - 305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684, - 687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566, - 568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729, - 680, 767, 694, 295, 128, 210, 0, 0, 227, 0, 379, 0, 0, 150, 493, 525, - 544, 551, 552, 556, 783, 576, 604, 0, 661, 0, 703, 0, 0, 735, 743, 0, - 0, 0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213, - 215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458, - 477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591, - 593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735, - 777, 786, 790, 315, 869, 623, 0, 0, 102, 145, 134, 115, 129, 138, 165, 171, - 207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325, - 321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438, - 456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526, - 528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693, - 695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777, - 783, 784, 786, 787, 790, 802, 825, 848, 847, 857, 55, 65, 66, 883, 892, 916, - 822, 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1586, 0,1605, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584, 0, - 1585,1587,1588,1589,1591, 0,1592, 0,1593,1594, 0,1595,1596, 0,1598,1599, - 1600,1601,1604,1582,1578,1590,1597, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1936, 0,1937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1939,1940, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1941,1942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1944,1943, 0,1945, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1946,1947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1949,1950,1951,1952,1953,1954,1955, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1956,1957,1958,1960,1959,1961, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 106, 104, 107, 826, 114, 118, 119, 121, - 123, 124, 127, 125, 34, 830, 130, 131, 132, 137, 827, 35, 133, 139, 829, 142, - 143, 112, 144, 145, 924, 151, 152, 37, 157, 158, 159, 160, 38, 165, 166, 169, - 171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185, - 834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206, - 208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224, - 230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251, 39, - 40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264, 41, 266, - 270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282, 42, 283, 284, 285, 286, - 43, 843, 44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300, 45, 852, - 894, 302, 304, 46, 306, 309, 310, 312, 316, 48, 47, 317, 846, 318, 323, 324, - 325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351, - 849, 350, 348, 352, 354, 359, 850, 361, 358, 356, 49, 363, 365, 367, 364, 50, - 369, 371, 851, 376, 386, 378, 53, 381, 52, 51, 140, 141, 387, 382, 614, 78, - 388, 389, 390, 394, 392, 856, 54, 399, 396, 402, 404, 858, 405, 401, 407, 55, - 408, 409, 410, 413, 859, 415, 56, 417, 860, 418, 57, 419, 422, 424, 425, 861, - 840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436, - 449, 450, 58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464, 59, 467, - 470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873, - 495, 497, 60, 498, 61, 61, 504, 505, 507, 508, 511, 62, 513, 874, 515, 875, - 518, 844, 520, 876, 877, 878, 63, 64, 528, 880, 879, 881, 882, 530, 531, 531, - 533, 66, 534, 67, 68, 884, 536, 538, 541, 69, 885, 549, 886, 887, 556, 559, - 70, 561, 562, 563, 888, 889, 889, 567, 71, 890, 570, 571, 72, 891, 577, 73, - 581, 579, 582, 893, 587, 74, 590, 592, 596, 75, 895, 896, 76, 897, 600, 898, - 602, 605, 607, 899, 900, 609, 901, 611, 853, 77, 615, 616, 79, 617, 252, 902, - 903, 854, 855, 621, 622, 731, 80, 627, 626, 628, 164, 629, 630, 631, 633, 904, - 632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906, 81, - 653, 654, 656, 911, 657, 908, 82, 83, 909, 910, 84, 664, 665, 666, 667, 669, - 668, 671, 670, 674, 672, 673, 675, 85, 677, 678, 86, 681, 682, 912, 685, 686, - 87, 689, 36, 913, 914, 88, 89, 696, 702, 709, 711, 915, 712, 713, 718, 719, - 917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753, - 756, 757, 755, 760, 761, 921, 762, 90, 764, 922, 91, 775, 279, 780, 923, 925, - 92, 93, 785, 926, 94, 927, 787, 787, 789, 928, 792, 95, 796, 797, 798, 800, - 96, 929, 802, 804, 806, 97, 98, 807, 930, 99, 931, 932, 933, 814, 100, 816, - 817, 818, 819, 820, 821, 935, 0, 0, + 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, + 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, + 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, + 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, + 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, + 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, + 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, + 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, + 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, + 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, + 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, + 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, + 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, + 1280, 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, 949,1134,1010, + 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, + 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, + 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, + 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, + 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, + 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, + 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, + 1514, 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,1446,1458,1468,1476,1480,1486, + 1517, 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,1489,1503,1494,1500,1508, 0, + 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, + 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, + 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, + 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, + 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, + 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, + 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, + 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, + 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, + 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, + 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, + 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, + 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, + 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, + 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, + 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, + 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, + 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, + 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, + 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, + 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, + 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, + 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, + 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, + 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, + 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, + 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, + 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, + 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, + 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, + 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, + 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, + 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, + 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, + 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, + 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, + 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, + 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, + 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, + 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, + 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, + 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, + 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, + 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, + 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, + 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, + 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, + 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, + 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, + 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, + 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, + 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, + 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, + 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, + 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, + 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, + 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, + 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, + 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, + 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, + 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, + 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, + 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, + 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, + 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, + 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, + 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, + 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, + 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, + 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, + 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, + 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, + 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, + 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, + 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, + 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, + 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, + 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, + 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, + 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, + 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, + 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, + 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, + 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, + 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, + 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, + 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, + 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, + 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, + 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, + 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, + 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, + 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, + 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1948, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1949,1950, + 1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1956,1957,1958,1960,1959, + 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, + 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, + 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, + 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, + 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, + 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, + 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, + 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, + 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, + 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, + 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, + 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, + 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, + 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, + 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, + 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, + 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, + 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, + 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, + 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, + 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, + 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, + 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, + 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, + 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, + 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, + 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, + 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, + 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, + 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, + 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, + 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, + 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, + 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, }; static const int16_t _hb_ucd_i16[196] = @@ -2797,12 +2799,12 @@ _hb_ucd_i16[196] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114110u?_hb_ucd_u8[6800+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114110u?_hb_ucd_u8[6808+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[8792+(((_hb_ucd_u8[8236+(((_hb_ucd_u8[7776+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[8800+(((_hb_ucd_u8[8244+(((_hb_ucd_u8[7784+(((_hb_ucd_u8[7432+(((_hb_ucd_u8[7186+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -2812,24 +2814,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9540+(((_hb_ucd_u8[9420+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9548+(((_hb_ucd_u8[9428+(((_hb_ucd_b4(9300+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918000u?_hb_ucd_u8[11062+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10326+(((_hb_ucd_u8[9876+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; + return u<918000u?_hb_ucd_u8[11070+(((_hb_ucd_u16[2048+(((_hb_ucd_u8[10334+(((_hb_ucd_u8[9884+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17068+(((_hb_ucd_u8[16686+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[6032+(((_hb_ucd_u8[17084+(((_hb_ucd_u8[16702+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #elif !defined(HB_NO_UCD_UNASSIGNED) static const uint8_t -_hb_ucd_u8[14744] = +_hb_ucd_u8[14752] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, @@ -2906,13 +2908,13 @@ _hb_ucd_u8[14744] = 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,243, 34, 244, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,245, 34, 34, - 34, 34, 34, 34, 34, 34, 34,246,122,122,122,122,122,122,122,122, - 34, 34, 34, 34,247,122,122,122,122,122,122,122,122,122,122,122, - 34, 34, 34, 34, 34, 34,248, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34,249,122,122,122,122,122,122,122,122, - 250,122,251,252,122,122,122,122,122,122,122,122,122,122,122,122, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,253, + 34, 34, 34, 34, 34, 34, 34,246, 34, 34, 34, 34,247,122,122,122, + 34, 34, 34, 34,248,122,122,122,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34,249, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34,250,122,122,122,122,122,122,122,122, + 251,122,252,253,122,122,122,122,122,122,122,122,122,122,122,122, 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,254, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,255, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, @@ -3075,11 +3077,11 @@ _hb_ucd_u8[14744] = 121, 4, 4, 4, 4, 2, 2, 88, 2, 2, 2, 2, 2,120, 2, 2, 108,151, 2, 2, 2, 2, 2, 2, 67, 2,152,148,148,148,153, 44, 67, 67, 67, 67, 67, 55, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44, - 1, 2,154,155, 4, 4, 4, 4, 4, 67, 4, 4, 4, 4,156,157, - 158,105,105,105,105, 43, 43, 86,159, 40, 40, 67,105,160, 63, 67, - 36, 36, 36, 61, 57,161,162, 69, 36, 36, 36, 36, 36, 63, 40, 69, - 44, 44, 62, 36, 36, 36, 36, 36, 67, 27, 27, 67, 67, 67, 67, 67, + 67, 67, 67, 44, 44, 44, 44, 44, 1, 2,154,155, 4, 4, 4, 4, + 4, 67, 4, 4, 4, 4,156,157,158,105,105,105,105, 43, 43, 86, + 159, 40, 40, 67,105,160, 63, 67, 36, 36, 36, 61, 57,161,162, 69, + 36, 36, 36, 36, 36, 63, 40, 69, 44, 44, 62, 36, 36, 36, 36, 36, + 67, 27, 27, 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67, 92, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27,163, 27, 27, 27, 27, 27, 27, 27, 36, 36, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,164, 2, @@ -3247,218 +3249,218 @@ _hb_ucd_u8[14744] = 44, 61, 44, 62, 62, 62, 62, 36, 62, 61, 61, 62, 62, 62, 62, 62, 62, 61, 61, 62, 36, 61, 36, 36, 36, 61, 36, 36, 62, 36, 61, 61, 36, 36, 36, 36, 36, 62, 36, 36, 62, 36, 62, 36, 36, 62, 36, 36, - 8, 44, 44, 44, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67, - 27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44, - 44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 67, 67, - 67, 67, 67, 92, 44, 55, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, - 67, 67, 67, 67, 67, 67, 67, 55, 67, 67, 67, 44, 44, 44, 44, 67, - 67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44, - 171,171,171,171,171,171,171, 44,171,171,171,171,171,171,171, 0, - 0, 0, 29, 21, 21, 21, 23, 21, 22, 18, 21, 25, 21, 17, 13, 13, - 25, 25, 25, 21, 21, 9, 9, 9, 9, 22, 21, 18, 24, 16, 24, 5, - 5, 5, 5, 22, 25, 18, 25, 0, 23, 23, 26, 21, 24, 26, 7, 20, - 25, 1, 26, 24, 26, 25, 15, 15, 24, 15, 7, 19, 15, 21, 9, 25, - 9, 5, 5, 25, 5, 9, 5, 7, 7, 7, 9, 8, 8, 5, 7, 5, - 6, 6, 24, 24, 6, 24, 12, 12, 2, 2, 6, 5, 9, 21, 9, 2, - 2, 9, 25, 9, 26, 12, 11, 11, 2, 6, 5, 21, 17, 2, 2, 26, - 26, 23, 2, 12, 17, 12, 21, 12, 12, 21, 7, 2, 2, 7, 7, 21, - 21, 2, 1, 1, 21, 23, 26, 26, 1, 21, 6, 7, 7, 12, 12, 7, - 21, 7, 12, 1, 12, 6, 6, 12, 12, 26, 7, 26, 26, 7, 2, 1, - 12, 2, 6, 2, 24, 7, 7, 6, 1, 12, 12, 10, 10, 10, 10, 12, - 21, 6, 2, 10, 10, 2, 15, 26, 26, 2, 2, 21, 7, 10, 15, 7, - 2, 23, 21, 26, 10, 7, 21, 15, 15, 2, 17, 7, 29, 7, 7, 22, - 18, 2, 14, 14, 14, 7, 10, 21, 17, 21, 11, 12, 5, 2, 5, 6, - 8, 8, 8, 24, 5, 24, 2, 24, 9, 24, 24, 2, 29, 29, 29, 1, - 17, 17, 20, 19, 22, 20, 27, 28, 1, 29, 21, 20, 19, 21, 21, 16, - 16, 21, 25, 22, 18, 21, 21, 29, 1, 2, 15, 6, 18, 6, 23, 2, - 12, 11, 9, 26, 26, 9, 26, 5, 5, 26, 14, 9, 5, 14, 14, 15, - 25, 26, 26, 22, 18, 26, 18, 25, 18, 22, 5, 12, 2, 5, 22, 21, - 21, 22, 18, 17, 26, 6, 7, 14, 17, 22, 18, 18, 26, 14, 17, 6, - 14, 6, 12, 24, 24, 6, 26, 15, 6, 21, 11, 21, 24, 9, 6, 9, - 23, 26, 6, 10, 4, 4, 3, 3, 7, 25, 17, 16, 16, 22, 16, 16, - 25, 17, 25, 2, 25, 24, 2, 15, 12, 15, 14, 2, 21, 14, 7, 15, - 12, 17, 21, 1, 26, 10, 10, 1, 23, 15, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 0, 10, 11, 12, 13, 0, 14, 0, 0, 0, 0, 0, - 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44, + 55, 67, 67, 67, 67, 67, 67, 67, 27, 27, 27, 27, 27, 27, 91, 67, + 67, 67, 67, 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, + 67, 92, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 92, 44, 44, 44, + 67, 44, 44, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 25, 41, 41, + 67, 67, 67, 67, 44, 44, 67, 67, 67, 67, 67, 92, 44, 55, 67, 67, + 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 67, 55, + 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 67, 67, 67, 67, 67, 67, + 79, 44, 44, 44, 44, 44, 44, 44,171,171,171,171,171,171,171, 44, + 171,171,171,171,171,171,171, 0, 0, 0, 29, 21, 21, 21, 23, 21, + 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, + 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, + 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, + 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, + 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, + 2, 2, 6, 5, 9, 21, 9, 2, 2, 9, 25, 9, 26, 12, 11, 11, + 2, 6, 5, 21, 17, 2, 2, 26, 26, 23, 2, 12, 17, 12, 21, 12, + 12, 21, 7, 2, 2, 7, 7, 21, 21, 2, 1, 1, 21, 23, 26, 26, + 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, + 12, 26, 7, 26, 26, 7, 2, 1, 12, 2, 6, 2, 24, 7, 7, 6, + 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, 10, 2, 15, 26, + 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, 10, 7, 21, 15, + 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, 14, 7, 10, 21, + 17, 21, 11, 12, 5, 2, 5, 6, 8, 8, 8, 24, 5, 24, 2, 24, + 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, 22, 20, 27, 28, + 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, + 1, 2, 15, 6, 18, 6, 23, 2, 12, 11, 9, 26, 26, 9, 26, 5, + 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, + 18, 22, 5, 12, 2, 5, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, + 17, 22, 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, + 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, + 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 2, 15, + 12, 15, 14, 2, 21, 14, 7, 15, 12, 17, 21, 1, 26, 10, 10, 1, + 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, + 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, + 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 0, 21, 22, 23, 0, 0, 0, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 0, 43, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, - 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, - 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19, 0, 19, - 16, 20, 16, 19, 21, 19, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, - 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 37, 0, 0, 0, - 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, 47, 0, 0, 0, 48, - 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 52, - 53, 0, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, - 58, 0, 0, 59, 60, 61, 62, 63, 0, 0, 64, 65, 0, 0, 0, 66, - 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 0, - 72, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, - 0, 0, 75, 76, 0, 77, 78, 0, 0, 79, 80, 0, 81, 62, 0, 82, - 83, 0, 0, 84, 85, 86, 0, 0, 0, 87, 0, 88, 0, 0, 51, 89, - 51, 0, 90, 0, 91, 0, 0, 0, 80, 0, 0, 0, 92, 93, 0, 94, - 95, 96, 97, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 98, 99, 0, - 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0,101,102, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,103, 0, 0,104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,105,106, 0, 0,107, 0, 0, 0, 0, 0, 0, - 108, 0,109, 0,102, 0, 0, 0, 0, 0,110,111, 0, 0, 0, 0, - 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, - 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, - 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, - 0, 24, 25, 0, 0, 26, 0, 0, 0, 27, 0, 0, 28, 29, 30, 31, - 0, 0, 0, 32, 33, 34, 0, 0, 33, 0, 0, 35, 33, 0, 0, 0, - 33, 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, - 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 43, 0, 44, - 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48, - 49, 0, 0, 0, 0, 50, 0, 0, 0, 51, 0, 52, 0, 53, 0, 0, - 0, 0, 54, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, - 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 61, 52, 0, 62, 63, - 0, 0, 64, 0, 0, 0, 65, 66, 0, 0, 0, 67, 0, 68, 69, 70, - 71, 72, 1, 73, 0, 74, 75, 76, 0, 0, 77, 78, 0, 0, 0, 79, - 0, 0, 1, 1, 0, 0, 80, 0, 0, 81, 0, 0, 0, 0, 77, 82, - 0, 83, 0, 0, 0, 0, 0, 78, 84, 0, 85, 0, 52, 0, 1, 78, - 0, 0, 86, 0, 0, 87, 0, 0, 0, 0, 0, 88, 57, 0, 0, 0, - 0, 0, 0, 89, 90, 0, 0, 84, 0, 0, 33, 0, 0, 91, 0, 0, - 0, 0, 92, 0, 0, 0, 0, 49, 0, 0, 93, 0, 0, 0, 0, 94, - 95, 0, 0, 96, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0, - 0, 0, 0,100,101, 93, 0, 0,102, 0, 0, 0, 84, 0, 0,103, - 0, 0, 0,104,105, 0, 0,106,107, 0, 0, 0, 0, 0, 0,108, - 0, 0,109, 0, 0, 0, 0,110, 33, 0,111,112,113, 35, 0, 0, - 114, 0, 0, 0,115, 0, 0, 0, 0, 0, 0,116, 0, 0,117, 0, - 0, 0, 0,118, 88, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 52, - 119, 0, 0, 0, 0,120, 0, 0,121, 0, 0, 0, 0,119, 0, 0, - 122, 0, 0, 0, 0, 0, 0,123, 0, 0, 0,124, 0, 0, 0,125, - 0,126, 0, 0, 0, 0,127,128,129, 0,130, 0,131, 0, 0, 0, - 132,133,134, 0, 77, 0, 0, 0, 0, 0, 35, 0, 0, 0,135, 0, - 0, 0,136, 0, 0,137, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, - 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, - 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, - 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, - 0, 38, 1, 39, 14, 39, 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, - 21, 45, 46, 0, 0, 0, 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, - 1, 49, 49, 50, 0, 0, 51, 0, 0, 0, 52, 1, 0, 0, 38, 14, - 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 55, - 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 59, 0, 60, 0, 0, - 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 65, 0, - 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 69, 70, 0, - 71, 72, 73, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 78, 79, 0, - 0, 0, 0, 47, 0, 0, 0, 49, 0, 80, 0, 0, 0, 62, 0, 0, - 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, - 62, 0, 0, 0, 0, 49, 1, 85, 1, 52, 15, 86, 36, 10, 21, 87, - 0, 55, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, - 0, 89, 0, 0, 88, 0, 0, 0, 0, 78, 0, 0, 87, 9, 12, 4, - 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, - 1, 94, 95, 96, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, - 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 61, 0, 0,101,102, - 0, 0,103, 0, 0, 1, 1, 50, 0, 0, 0, 38, 0, 63, 0, 0, - 0, 0, 0, 62, 0, 0,104, 68, 61, 0, 0, 0, 78, 0, 0, 0, - 105,106, 58, 38, 81, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, - 84, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0,109, 61, - 0,110, 0, 0, 0, 1, 0, 0, 0, 0, 19, 58, 0, 0, 0, 51, - 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, 0, 0,113, 0, - 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0,113, 0, 0, - 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, 1, 58, 0, 0, - 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, 0,115, 0, 0, - 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, 0, 0, 56, 0, - 89, 80, 0, 0, 79, 0, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0, - 116, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4, - 122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1, - 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 0, 0, 0,123, - 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0,230,230,230,230, - 230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220, - 220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220,220,220, - 220,230,230,230,230,240,230,220,220,220,230,230,230,220,220, 0, - 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233, - 234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230,220,230, - 230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, - 230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, - 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, 0, 0, - 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, 0, 0, - 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230,220,230, - 220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230,230,230, - 230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, 0,220, - 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230, - 230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107,107,107, - 118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, 0,220, - 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130, - 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, - 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, - 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, 0,220, - 230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0, - 230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,230,230, - 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1, - 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228, - 232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230, - 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, - 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, - 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, - 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, - 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 33, - 17, 49, 17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, + 0, 0, 40, 41, 42, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 5, + 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, 14, 15, 16, 17, 16, 18, + 16, 19, 16, 19, 16, 19, 0, 19, 16, 20, 16, 19, 21, 19, 0, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, + 0, 0, 36, 0, 37, 0, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, + 0, 0, 0, 50, 0, 51, 0, 52, 53, 0, 54, 0, 0, 0, 0, 0, + 0, 55, 56, 57, 0, 0, 0, 0, 58, 0, 0, 59, 60, 61, 62, 63, + 0, 0, 64, 65, 0, 0, 0, 66, 0, 0, 0, 0, 67, 0, 0, 0, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 0, 0, 0, 70, 0, 71, 0, 0, 72, 0, 0, 73, 0, 0, 0, 0, + 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 75, 76, 0, 77, 78, 0, + 0, 79, 80, 0, 81, 62, 0, 82, 83, 0, 0, 84, 85, 86, 0, 0, + 0, 87, 0, 88, 0, 0, 51, 89, 51, 0, 90, 0, 91, 0, 0, 0, + 80, 0, 0, 0, 92, 93, 0, 94, 95, 96, 97, 0, 0, 0, 0, 0, + 51, 0, 0, 0, 0, 98, 99, 0, 0, 0, 0, 0, 0,100, 0, 0, + 0, 0, 0,101,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103, + 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,106, 0, + 0,107, 0, 0, 0, 0, 0, 0,108, 0,109, 0,102, 0, 0, 0, + 0, 0,110,111, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0, 0, + 0, 0, 0,113, 0,114, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, + 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19, 0, 20, + 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, 0, 0, + 0, 27, 0, 0, 28, 29, 30, 31, 0, 0, 0, 32, 33, 34, 0, 0, + 33, 0, 0, 35, 33, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 37, + 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 41, + 42, 0, 0, 0, 0, 43, 0, 44, 0, 0, 0, 45, 46, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 50, 0, 0, + 0, 51, 0, 52, 0, 53, 0, 0, 0, 0, 54, 0, 0, 0, 0, 55, + 0, 56, 0, 0, 0, 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, + 0, 0, 0, 61, 52, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 66, + 0, 0, 0, 67, 0, 68, 69, 70, 71, 72, 1, 73, 0, 74, 75, 76, + 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 1, 1, 0, 0, 80, 0, + 0, 81, 0, 0, 0, 0, 77, 82, 0, 83, 0, 0, 0, 0, 0, 78, + 84, 0, 85, 0, 52, 0, 1, 78, 0, 0, 86, 0, 0, 87, 0, 0, + 0, 0, 0, 88, 57, 0, 0, 0, 0, 0, 0, 89, 90, 0, 0, 84, + 0, 0, 33, 0, 0, 91, 0, 0, 0, 0, 92, 0, 0, 0, 0, 49, + 0, 0, 93, 0, 0, 0, 0, 94, 95, 0, 0, 96, 0, 0, 97, 0, + 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0,100,101, 93, 0, 0, + 102, 0, 0, 0, 84, 0, 0,103, 0, 0, 0,104,105, 0, 0,106, + 107, 0, 0, 0, 0, 0, 0,108, 0, 0,109, 0, 0, 0, 0,110, + 33, 0,111,112,113, 35, 0, 0,114, 0, 0, 0,115, 0, 0, 0, + 0, 0, 0,116, 0, 0,117, 0, 0, 0, 0,118, 88, 0, 0, 0, + 0, 0, 57, 0, 0, 0, 0, 52,119, 0, 0, 0, 0,120, 0, 0, + 121, 0, 0, 0, 0,119, 0, 0,122, 0, 0, 0, 0, 0, 0,123, + 0, 0, 0,124, 0, 0, 0,125, 0,126, 0, 0, 0, 0,127,128, + 129, 0,130, 0,131, 0, 0, 0,132,133,134, 0, 77, 0, 0, 0, + 0, 0, 35, 0, 0, 0,135, 0, 0, 0,136, 0, 0,137, 0, 0, + 138, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, + 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, + 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, + 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, + 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, + 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 19, 1, + 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 51, 0, + 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, + 54, 21, 35, 1, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, + 0, 0, 0, 59, 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, + 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 67, 0, + 0, 0, 68, 0, 0, 69, 70, 0, 71, 72, 73, 74, 75, 76, 0, 0, + 0, 77, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 49, + 0, 80, 0, 0, 0, 62, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, + 0, 0, 83, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, + 1, 52, 15, 86, 36, 10, 21, 87, 0, 55, 0, 0, 0, 0, 19, 10, + 1, 0, 0, 0, 0, 0, 88, 0, 0, 89, 0, 0, 88, 0, 0, 0, + 0, 78, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, + 21, 1, 21, 92, 93, 1, 1, 1, 1, 94, 95, 96, 97, 1, 98, 58, + 81, 99,100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, + 0, 0, 0, 61, 0, 0,101,102, 0, 0,103, 0, 0, 1, 1, 50, + 0, 0, 0, 38, 0, 63, 0, 0, 0, 0, 0, 62, 0, 0,104, 68, + 61, 0, 0, 0, 78, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, + 0, 0, 0,107, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 87, 0, + 0, 0, 0,108, 0, 0,109, 61, 0,110, 0, 0, 0, 1, 0, 0, + 0, 0, 19, 58, 0, 0, 0, 51, 0,111, 14, 52,112, 41, 0, 0, + 62, 0, 0, 61, 0, 0,113, 0, 87, 0, 0, 0, 61, 62, 0, 0, + 62, 0, 89, 0, 0,113, 0, 0, 0, 0,114, 0, 0, 0, 78, 55, + 0, 38, 1, 58, 1, 58, 0, 0, 63, 89, 0, 0,115, 0, 0, 0, + 55, 0, 0, 0, 0,115, 0, 0, 0, 0, 61, 0, 0, 0, 0, 79, + 0, 61, 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 79, 0, 0, 0, + 8, 91, 0, 0, 1, 87, 0, 0,116, 0, 0, 0, 0, 0, 0,117, + 0,118,119,120,121, 0,104, 4,122, 49, 23, 0, 0, 0, 38, 50, + 38, 58, 0, 0, 1, 87, 1, 1, 1, 1, 39, 1, 48,105, 87, 0, + 0, 0, 0, 1, 0, 0, 0,123, 4,122, 0, 0, 0, 1,124, 0, + 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216, + 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220, + 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220, + 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230, + 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, + 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220, + 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, + 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, + 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230, + 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230, + 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230, + 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0, + 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, + 230,220,220,220,230,230, 0,220, 27, 28, 29,230, 7, 0, 0, 0, + 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,230, 0, + 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 0, + 103,103, 9, 0,107,107,107,107,118,118, 9, 0,122,122,122,122, + 220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,130, 0, + 132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, + 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, 9, 0, + 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220, + 220, 0, 0, 0,230, 0, 0,220,230,220, 0,220,230,230,230, 0, + 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, 1, 0, 0, 0, + 230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230, + 233,220,230,220,230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230, + 220,230, 1, 1, 0, 0,218,228,232,222,224,224, 0, 8, 8, 0, + 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, 0, 0, 26, 0, + 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, 0, 0,220,220, + 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, + 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, + 0,226,216,216,216,216,216, 0,220,220,220, 0,232,232,220,230, + 230,230, 7, 0, 16, 17, 17, 33, 17, 49, 17, 17, 84, 97,135,145, + 26, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,177, 0, 1, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 6, 7, 8, 3, - 3, 3, 3, 3, 9, 10, 11, 12, 13, 3, 3, 3, 3, 3, 3, 3, - 3, 14, 3, 15, 3, 3, 3, 3, 3, 3, 16, 17, 18, 19, 20, 21, - 3, 3, 3, 22, 23, 24, 3, 3, 3, 3, 3, 3, 25, 3, 3, 3, - 3, 3, 3, 3, 3, 26, 3, 3, 27, 28, 0, 1, 0, 0, 0, 0, - 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 10, 11, 12, 13, 0, 0, 14, 15, 16, 6, 0, - 17, 18, 19, 19, 19, 20, 21, 22, 23, 24, 19, 25, 0, 26, 27, 19, - 19, 28, 29, 30, 0, 31, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, - 0, 19, 28, 0, 32, 33, 9, 34, 35, 19, 0, 0, 36, 37, 38, 39, - 40, 19, 0, 41, 42, 43, 44, 31, 0, 1, 45, 42, 0, 0, 0, 0, - 0, 32, 14, 14, 0, 0, 0, 0, 14, 0, 0, 46, 47, 47, 47, 47, - 48, 49, 47, 47, 47, 47, 50, 51, 52, 53, 43, 21, 0, 0, 0, 0, - 0, 0, 0, 54, 6, 55, 0, 14, 19, 1, 0, 0, 0, 0, 56, 57, - 0, 0, 0, 0, 0, 19, 58, 31, 0, 0, 0, 0, 0, 0, 0, 59, - 14, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 60, - 61, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 3, - 0, 4, 5, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 1, 1, 0, - 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, - 0, 0, 13, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 1, 0, - 0, 18, 19, 0, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 0, 8, 21, 9, 0, 0, 22, 0, 0, 0, - 0, 1, 0, 23, 24, 25, 0, 0, 26, 0, 0, 0, 8, 21, 27, 0, - 1, 0, 0, 1, 1, 1, 1, 0, 1, 28, 29, 30, 0, 31, 32, 20, - 1, 1, 0, 0, 0, 8, 21, 9, 1, 4, 5, 0, 0, 0, 33, 9, - 0, 1, 1, 1, 0, 8, 21, 21, 21, 21, 34, 1, 35, 21, 21, 21, - 9, 36, 0, 0, 37, 38, 1, 0, 39, 0, 0, 0, 1, 0, 1, 0, - 0, 0, 0, 8, 21, 9, 1, 0, 0, 0, 40, 0, 8, 21, 21, 21, - 21, 21, 21, 21, 21, 9, 0, 1, 1, 1, 1, 8, 21, 21, 21, 9, - 0, 0, 0, 41, 0, 42, 43, 0, 0, 0, 1, 44, 0, 0, 0, 45, - 8, 9, 1, 0, 0, 0, 8, 21, 21, 21, 9, 0, 1, 0, 1, 1, - 8, 21, 21, 9, 0, 4, 5, 8, 9, 1, 0, 0, 0, 1, 2, 3, - 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, - 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 7, - 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 17, 17, 17,177, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 5, 3, + 3, 3, 3, 3, 6, 7, 8, 3, 3, 3, 3, 3, 9, 10, 11, 12, + 13, 3, 3, 3, 3, 3, 3, 3, 3, 14, 3, 15, 3, 3, 3, 3, + 3, 3, 16, 17, 18, 19, 20, 21, 3, 3, 3, 22, 23, 24, 3, 3, + 3, 3, 3, 3, 25, 3, 3, 3, 3, 3, 3, 3, 3, 26, 3, 3, + 27, 28, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, + 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, + 13, 0, 0, 14, 15, 16, 6, 0, 17, 18, 19, 19, 19, 20, 21, 22, + 23, 24, 19, 25, 0, 26, 27, 19, 19, 28, 29, 30, 0, 31, 0, 0, + 0, 8, 0, 0, 0, 0, 0, 0, 0, 19, 28, 0, 32, 33, 9, 34, + 35, 19, 0, 0, 36, 37, 38, 39, 40, 19, 0, 41, 42, 43, 44, 31, + 0, 1, 45, 42, 0, 0, 0, 0, 0, 32, 14, 14, 0, 0, 0, 0, + 14, 0, 0, 46, 47, 47, 47, 47, 48, 49, 47, 47, 47, 47, 50, 51, + 52, 53, 43, 21, 0, 0, 0, 0, 0, 0, 0, 54, 6, 55, 0, 14, + 19, 1, 0, 0, 0, 0, 56, 57, 0, 0, 0, 0, 0, 19, 58, 31, + 0, 0, 0, 0, 0, 0, 0, 59, 14, 0, 0, 0, 0, 1, 0, 2, + 0, 0, 0, 3, 0, 0, 0, 60, 61, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 2, 3, 0, 4, 5, 0, 0, 6, 0, 0, + 0, 7, 0, 0, 0, 1, 1, 0, 0, 8, 9, 0, 8, 9, 0, 0, + 0, 0, 8, 9, 10, 11, 12, 0, 0, 0, 13, 0, 0, 0, 0, 14, + 15, 16, 17, 0, 0, 0, 1, 0, 0, 18, 19, 0, 0, 0, 20, 0, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 8, + 21, 9, 0, 0, 22, 0, 0, 0, 0, 1, 0, 23, 24, 25, 0, 0, + 26, 0, 0, 0, 8, 21, 27, 0, 1, 0, 0, 1, 1, 1, 1, 0, + 1, 28, 29, 30, 0, 31, 32, 20, 1, 1, 0, 0, 0, 8, 21, 9, + 1, 4, 5, 0, 0, 0, 33, 9, 0, 1, 1, 1, 0, 8, 21, 21, + 21, 21, 34, 1, 35, 21, 21, 21, 9, 36, 0, 0, 37, 38, 1, 0, + 39, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 8, 21, 9, 1, 0, + 0, 0, 40, 0, 8, 21, 21, 21, 21, 21, 21, 21, 21, 9, 0, 1, + 1, 1, 1, 8, 21, 21, 21, 9, 0, 0, 0, 41, 0, 42, 43, 0, + 0, 0, 1, 44, 0, 0, 0, 45, 8, 9, 1, 0, 0, 0, 8, 21, + 21, 21, 9, 0, 1, 0, 1, 1, 8, 21, 21, 9, 0, 4, 5, 8, + 9, 1, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13, + 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, + 13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, + 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, + 7, 41, 13, 42, 7, 7, 43, 7, 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, @@ -3479,221 +3481,221 @@ _hb_ucd_u8[14744] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 0, 0, 1, - 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, - 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, - 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 45, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, + 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, + 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, + 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, - 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, - 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, - 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, - 152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164, - 164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169, - 169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173, - 173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101, + 102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116, + 117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131, + 132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145, + 96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158, + 159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164, + 167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171, + 171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96, + 96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182, 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, - 182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182, - 182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189, - 190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197, - 198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208, - 208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212, - 213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218, - 219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226, - 59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233, - 59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70, + 182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185, + 186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204, + 205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96, + 96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215, + 96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221, + 222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59, + 59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70, - 70, 70, 70, 70, 70,241, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70,242, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70, 70, 70,243, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70,244, 96, 96, 96, 96, 96, 96, 96, 96,245, 96, - 246,247, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, - 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, - 19, 0, 19, 0, 0, 0, 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, - 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, - 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, - 2, 9, 9, 9, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 1, - 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 14, 14, 2, - 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, - 3, 0, 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 3, 37, 37, - 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, - 38, 38, 38, 38, 2, 2, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, - 64, 64, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, 90, 2, 95, 95, - 95, 95, 2, 2, 95, 2, 3, 3, 3, 2, 3, 3, 2, 2, 3, 3, - 0, 3, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 0, 0, - 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 2, 2, 5, 5, 2, - 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, - 5, 2, 2, 2, 2, 5, 5, 5, 2, 5, 2, 11, 11, 11, 11, 11, - 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 2, - 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 2, 11, 2, 2, 11, 2, - 11, 2, 2, 2, 11, 11, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 2, 10, 10, 2, 10, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, - 10, 10, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, - 21, 21, 21, 21, 2, 2, 21, 21, 2, 21, 2, 2, 21, 21, 2, 2, - 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 22, 2, 22, 22, 22, 22, - 2, 2, 2, 22, 22, 2, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, - 22, 22, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 23, - 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 2, 2, 23, 23, 2, 2, - 2, 23, 16, 16, 16, 16, 16, 2, 16, 16, 2, 16, 16, 16, 16, 16, - 2, 2, 2, 16, 16, 2, 2, 2, 16, 16, 20, 20, 20, 20, 20, 2, - 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 2, 2, 2, 36, 36, 36, 36, 2, 36, 2, 36, 2, 2, 2, 2, - 36, 2, 2, 2, 2, 36, 36, 2, 36, 2, 36, 2, 2, 2, 2, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 2, 18, - 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 2, 18, - 2, 18, 18, 18, 2, 2, 18, 2, 18, 2, 25, 25, 25, 25, 2, 25, - 25, 25, 25, 2, 2, 2, 25, 2, 25, 25, 25, 0, 0, 0, 0, 25, - 25, 2, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 2, 8, 2, 8, - 2, 2, 8, 8, 8, 0, 12, 12, 12, 12, 30, 30, 30, 30, 30, 2, - 30, 30, 30, 30, 2, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 2, - 2, 2, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 34, 34, - 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, - 35, 35, 35, 2, 2, 2, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, - 2, 45, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, 43, 43, 46, 46, - 46, 46, 46, 2, 46, 46, 31, 31, 31, 31, 31, 31, 2, 2, 32, 32, - 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 32, 2, - 2, 2, 32, 32, 32, 2, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, - 48, 2, 48, 2, 2, 2, 52, 52, 52, 52, 52, 52, 2, 2, 52, 2, - 2, 2, 58, 58, 58, 58, 58, 58, 2, 2, 58, 58, 58, 2, 2, 2, - 58, 58, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, - 91, 2, 91, 2, 2, 91, 91, 91, 2, 2, 1, 1, 1, 2, 62, 62, - 62, 62, 62, 2, 2, 2, 62, 62, 62, 2, 76, 76, 76, 76, 93, 93, - 93, 93, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 2, 2, 2, 70, - 70, 70, 73, 73, 73, 73, 6, 2, 2, 2, 8, 8, 8, 2, 2, 8, - 8, 8, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, - 0, 0, 1, 1, 0, 2, 19, 19, 9, 9, 9, 9, 9, 6, 19, 9, - 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, 6, 19, 19, 19, 19, 19, - 19, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 9, 9, 1, 1, - 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 19, 0, 0, - 0, 2, 19, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2, 0, 0, - 9, 0, 0, 0, 19, 19, 27, 27, 27, 27, 2, 2, 0, 0, 0, 0, - 2, 0, 56, 56, 56, 56, 2, 55, 55, 55, 61, 61, 61, 61, 2, 2, - 2, 61, 61, 2, 2, 2, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13, - 2, 13, 13, 13, 2, 2, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, - 1, 1, 1, 1, 12, 12, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 0, 2, 26, 26, 26, 26, 26, 26, 26, 2, 12, - 12, 12, 12, 12, 12, 2, 12, 12, 12, 0, 39, 39, 39, 39, 39, 2, - 2, 2, 39, 39, 39, 2, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, - 79, 79, 19, 19, 19, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19, - 2, 2, 2, 2, 19, 19, 60, 60, 60, 60, 60, 2, 2, 2, 65, 65, - 65, 65, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, 75, 75, 69, 69, - 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 2, 2, 2, 74, 12, 2, - 2, 2, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, - 84, 84, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68, - 2, 2, 92, 92, 92, 92, 92, 92, 92, 2, 2, 2, 2, 92, 87, 87, - 87, 87, 87, 87, 87, 2, 19, 9, 19, 19, 19, 19, 0, 0, 87, 87, - 2, 2, 2, 2, 2, 12, 2, 2, 2, 4, 14, 2, 14, 2, 14, 14, - 2, 14, 14, 2, 14, 14, 2, 2, 2, 3, 3, 3, 0, 0, 2, 2, - 3, 3, 1, 1, 6, 6, 3, 2, 3, 3, 3, 2, 2, 0, 2, 0, - 0, 0, 0, 0, 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 49, 49, - 49, 49, 2, 49, 49, 49, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, - 2, 2, 9, 2, 2, 2, 0, 1, 2, 2, 71, 71, 71, 71, 71, 2, - 2, 2, 67, 67, 67, 67, 67, 2, 2, 2, 42, 42, 42, 42, 2, 42, - 42, 42, 41, 41, 41, 41, 41, 41, 41, 2,118,118,118,118,118,118, - 118, 2, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, - 2, 2, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, - 2, 2,135,135,135,135,106,106,106,106,104,104,104,104, 2, 2, - 2,104,161,161,161,161,161,161,161, 2,161,161, 2,161,161, 2, - 2, 2,110,110,110,110,110,110,110, 2,110,110, 2, 2, 19, 2, - 19, 19, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, - 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, 81, 81, - 2, 81,120,120,120,120,116,116,116,116,116,116,116, 2, 2, 2, - 2,116,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2, - 2,128, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, - 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 97, 97, 97, 97, 2, 2, - 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 57, 57, 57, 57, 57, - 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2, 2, 2, 88, 88, - 88, 88,117,117,117,117,112,112,112,112,112,112,112, 2, 2, 2, - 2,112, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, 78, 78, 83, 83, - 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 2,122,122, - 122,122,122,122, 2, 2, 2,122,122,122,122, 2, 2, 2, 89, 89, - 89, 89, 89, 2, 2, 2,130,130,130,130,130,130,130, 2, 2, 2, - 130,130,144,144,144,144,144,144, 2, 2,156,156,156,156,156,156, - 2,156,156,156, 2, 2, 2, 3, 3, 3,147,147,147,147,148,148, - 148,148,148,148, 2, 2,158,158,158,158,158,158, 2, 2,153,153, - 153,153,149,149,149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94, - 2, 2, 2, 2, 94, 94, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, - 85, 2, 2, 85, 2, 2,101,101,101,101,101, 2, 2, 2,101,101, - 2, 2, 96, 96, 96, 96, 96, 2, 96, 96,111,111,111,111,111,111, - 111, 2,100,100,100,100,108,108,108,108,108,108, 2,108,108,108, - 2, 2,129,129,129,129,129,129,129, 2,129, 2,129,129,129,129, - 2,129,129,129, 2, 2,109,109,109,109,109,109,109, 2,109,109, - 2, 2,107,107,107,107, 2,107,107,107,107, 2, 2,107,107, 2, - 107,107,107,107, 2, 1,107,107, 2, 2,107, 2, 2, 2, 2, 2, - 2,107, 2, 2,107,107,137,137,137,137, 2,137,137,137,137,137, - 2, 2,124,124,124,124,124,124, 2, 2,123,123,123,123,123,123, - 2, 2,114,114,114,114,114, 2, 2, 2,114,114, 2, 2,102,102, - 102,102,102,102, 2, 2,126,126,126,126,126,126,126, 2, 2,126, - 126,126,142,142,142,142,125,125,125,125,125,125,125, 2, 2, 2, - 2,125,154,154,154,154,154,154,154, 2, 2,154, 2, 2, 2,154, - 154, 2,154,154, 2,154,154, 2, 2,154,154,154, 2, 2,150,150, - 150,150, 2, 2,150,150,150, 2, 2, 2,141,141,141,141,140,140, - 140,140,140,140,140, 2,121,121,121,121,121, 2, 2, 2, 7, 7, - 2, 2,133,133,133,133,133, 2,133,133,133,133,133, 2,133,133, - 2, 2,133, 2, 2, 2,134,134,134,134, 2, 2,134,134, 2,134, - 134,134,134,134,134, 2,138,138,138,138,138,138,138, 2,138,138, - 2,138, 2, 2,138, 2,138,138, 2, 2,143,143,143,143,143,143, - 2,143,143, 2,143,143,143,143,143, 2,143, 2, 2, 2,143,143, - 2, 2,145,145,145,145,145, 2, 2, 2,163,163,163,163,163, 2, - 163,163,163,163,163, 2, 2, 2,163,163,163,163, 2, 2, 86, 2, - 2, 2, 63, 63, 63, 63, 63, 63, 2, 2, 63, 63, 63, 2, 63, 2, - 2, 2,157,157,157,157,157,157,157, 2, 80, 80, 80, 80, 80, 80, - 2, 2,127,127,127,127,127,127,127, 2, 79, 2, 2, 2,115,115, - 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,159,159, - 159,159,159,159,159, 2,159,159, 2, 2,103,103,103,103,103,103, - 2, 2,119,119,119,119,119,119, 2, 2,119,119, 2,119, 2,119, - 119,119,146,146,146,146,146,146,146, 2, 99, 99, 99, 99, 99, 99, - 99, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136, - 136,136,155,155,155,155,155,155, 2, 2,136, 2, 2, 2, 2, 17, - 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 17, 17, 17, 2, 2, 2, - 15, 2, 2, 17, 2, 2,139,139,139,139,105,105,105,105,105,105, - 105, 2,105, 2, 2, 2,105,105, 2, 2, 1, 1, 2, 2, 0, 0, - 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 2, 2, 0, 2, 2, 0, - 0, 2, 0, 2, 0, 2,131,131,131,131, 2, 2, 2,131, 2,131, - 131,131, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 2, 56, 56, 2, - 56, 56, 6, 6, 2, 2, 2, 2, 2, 6,151,151,151,151,151, 2, - 2, 2,151,151, 2, 2, 2, 2,151,151,160,160,160,160,160,160, - 160, 2,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164, - 164,164,164,164, 2, 2, 2, 30, 30, 2,113,113,113,113,113, 2, - 2,113,113,113,113, 2,132,132,132,132,132,132, 2, 2, 2, 2, - 132,132, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, 2, 3, 2, 2, - 3, 2, 3, 2, 3, 2, 3, 3, 2, 3, 15, 0, 0, 2, 13, 2, - 2, 2, 13, 13, 13, 2, 2, 0, 2, 2, 0, 1, 2, 3, 4, 5, - 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, - 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 70, 70, + 70, 70,242, 96, 96, 96, 70, 70, 70, 70,243, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,244, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,245, 96, 96, + 96, 96, 96, 96, 96, 96,246, 96,247,248, 0, 1, 2, 2, 0, 1, + 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, + 26, 26, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, + 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, + 9, 2, 9, 2, 9, 9, 9, 9, 2, 9, 9, 9, 55, 55, 55, 55, + 55, 55, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 2, 2, 2, 2, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, + 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 1, 1, 1, + 3, 3, 1, 3, 3, 3, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, + 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 2, 2, 64, 64, + 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, + 2, 2, 90, 90, 90, 2, 95, 95, 95, 95, 2, 2, 95, 2, 3, 3, + 3, 2, 3, 3, 2, 2, 3, 3, 0, 3, 7, 7, 7, 7, 7, 1, + 1, 1, 1, 7, 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 2, 5, + 5, 5, 5, 2, 2, 5, 5, 2, 5, 5, 5, 2, 5, 2, 2, 2, + 5, 5, 5, 5, 2, 2, 5, 5, 5, 2, 2, 2, 2, 5, 5, 5, + 2, 5, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, + 2, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, + 2, 2, 2, 11, 2, 2, 11, 2, 11, 2, 2, 2, 11, 11, 2, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, + 2, 2, 10, 2, 2, 2, 2, 2, 10, 10, 2, 21, 21, 21, 21, 21, + 21, 21, 21, 2, 2, 21, 21, 2, 21, 21, 21, 21, 2, 2, 21, 21, + 2, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, + 22, 2, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, + 2, 22, 22, 2, 2, 2, 22, 22, 22, 22, 23, 23, 23, 23, 23, 2, + 23, 23, 23, 23, 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, + 2, 2, 2, 2, 23, 23, 2, 2, 2, 23, 16, 16, 16, 16, 16, 2, + 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 2, 16, 16, 2, 2, 2, + 16, 16, 20, 20, 20, 20, 20, 2, 20, 20, 2, 2, 20, 20, 2, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, + 2, 36, 2, 36, 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 2, + 36, 2, 36, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 2, 2, 2, 2, 0, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, + 18, 2, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, 2, 2, 18, 2, + 18, 2, 25, 25, 25, 25, 2, 25, 25, 25, 25, 2, 2, 2, 25, 2, + 25, 25, 25, 0, 0, 0, 0, 25, 25, 2, 33, 33, 33, 33, 8, 8, + 8, 8, 8, 8, 2, 8, 2, 8, 2, 2, 8, 8, 8, 0, 12, 12, + 12, 12, 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, + 30, 2, 2, 30, 30, 30, 30, 2, 2, 2, 29, 29, 29, 29, 29, 29, + 2, 2, 28, 28, 28, 28, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, + 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2, 2, 2, 45, 45, + 45, 45, 45, 45, 2, 2, 2, 2, 2, 45, 44, 44, 44, 44, 44, 0, + 0, 2, 43, 43, 43, 43, 46, 46, 46, 46, 46, 2, 46, 46, 31, 31, + 31, 31, 31, 31, 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, + 32, 32, 32, 32, 2, 2, 32, 2, 2, 2, 32, 32, 32, 2, 28, 28, + 2, 2, 48, 48, 48, 48, 48, 48, 48, 2, 48, 2, 2, 2, 52, 52, + 52, 52, 52, 52, 2, 2, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, + 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 2, 2, + 54, 54, 91, 91, 91, 91, 91, 91, 91, 2, 91, 2, 2, 91, 91, 91, + 2, 2, 1, 1, 1, 2, 62, 62, 62, 62, 62, 2, 2, 2, 62, 62, + 62, 2, 76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, 2, 2, + 2, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 6, 2, + 2, 2, 8, 8, 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 0, + 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 2, 19, 19, + 9, 9, 9, 9, 9, 6, 19, 9, 9, 9, 9, 9, 19, 19, 9, 9, + 9, 19, 6, 19, 19, 19, 19, 19, 19, 9, 9, 9, 2, 2, 2, 9, + 2, 9, 2, 9, 9, 9, 1, 1, 0, 0, 0, 2, 0, 0, 0, 19, + 2, 2, 0, 0, 0, 19, 0, 0, 0, 2, 19, 2, 2, 2, 0, 2, + 2, 2, 1, 2, 2, 2, 0, 0, 9, 0, 0, 0, 19, 19, 27, 27, + 27, 27, 2, 2, 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 2, 55, + 55, 55, 61, 61, 61, 61, 2, 2, 2, 61, 61, 2, 2, 2, 0, 0, + 2, 2, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 2, 2, 0, 13, + 0, 13, 0, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 2, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, + 15, 15, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 2, 26, + 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 2, 12, 12, + 12, 0, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, 39, 2, 86, 86, + 86, 86, 77, 77, 77, 77, 79, 79, 79, 79, 19, 19, 19, 2, 19, 19, + 2, 19, 2, 19, 19, 19, 19, 19, 2, 2, 2, 2, 19, 19, 60, 60, + 60, 60, 60, 2, 2, 2, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, + 2, 2, 2, 2, 75, 75, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, + 74, 74, 2, 2, 2, 74, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, + 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, 33, 2, 68, 68, + 68, 68, 68, 68, 68, 2, 68, 68, 2, 2, 92, 92, 92, 92, 92, 92, + 92, 2, 2, 2, 2, 92, 87, 87, 87, 87, 87, 87, 87, 2, 19, 9, + 19, 19, 19, 19, 0, 0, 87, 87, 2, 2, 2, 2, 2, 12, 2, 2, + 2, 4, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 2, 2, + 2, 3, 3, 3, 0, 0, 2, 2, 3, 3, 1, 1, 6, 6, 3, 2, + 3, 3, 3, 2, 2, 0, 2, 0, 0, 0, 0, 0, 17, 17, 17, 17, + 0, 0, 2, 2, 12, 12, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, + 49, 2, 49, 49, 2, 49, 49, 49, 2, 2, 9, 2, 2, 2, 0, 1, + 2, 2, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 2, + 2, 2, 42, 42, 42, 42, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, + 41, 2,118,118,118,118,118,118,118, 2, 53, 53, 53, 53, 53, 53, + 2, 53, 59, 59, 59, 59, 59, 59, 2, 2, 40, 40, 40, 40, 51, 51, + 51, 51, 50, 50, 50, 50, 50, 50, 2, 2,135,135,135,135,106,106, + 106,106,104,104,104,104, 2, 2, 2,104,161,161,161,161,161,161, + 161, 2,161,161, 2,161,161, 2, 2, 2,110,110,110,110,110,110, + 110, 2,110,110, 2, 2, 19, 2, 19, 19, 47, 47, 47, 47, 47, 47, + 2, 2, 47, 2, 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, + 2, 47, 81, 81, 81, 81, 81, 81, 2, 81,120,120,120,120,116,116, + 116,116,116,116,116, 2, 2, 2, 2,116,128,128,128,128,128,128, + 128, 2,128,128, 2, 2, 2, 2, 2,128, 66, 66, 66, 66, 2, 2, + 2, 66, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, + 98, 98, 97, 97, 97, 97, 2, 2, 97, 97, 57, 57, 57, 57, 2, 57, + 57, 2, 2, 57, 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, + 2, 57, 57, 2, 2, 2, 88, 88, 88, 88,117,117,117,117,112,112, + 112,112,112,112,112, 2, 2, 2, 2,112, 78, 78, 78, 78, 78, 78, + 2, 2, 2, 78, 78, 78, 83, 83, 83, 83, 83, 83, 2, 2, 82, 82, + 82, 82, 82, 82, 82, 2,122,122,122,122,122,122, 2, 2, 2,122, + 122,122,122, 2, 2, 2, 89, 89, 89, 89, 89, 2, 2, 2,130,130, + 130,130,130,130,130, 2, 2, 2,130,130,144,144,144,144,144,144, + 2, 2,156,156,156,156,156,156, 2,156,156,156, 2, 2, 2, 3, + 3, 3,147,147,147,147,148,148,148,148,148,148, 2, 2,158,158, + 158,158,158,158, 2, 2,153,153,153,153,149,149,149,149,149,149, + 149, 2, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 2, 2, + 2, 94, 85, 85, 85, 85, 85, 85, 85, 2, 2, 85, 2, 2,101,101, + 101,101,101, 2, 2, 2,101,101, 2, 2, 96, 96, 96, 96, 96, 2, + 96, 96,111,111,111,111,111,111,111, 2,100,100,100,100,108,108, + 108,108,108,108, 2,108,108,108, 2, 2,129,129,129,129,129,129, + 129, 2,129, 2,129,129,129,129, 2,129,129,129, 2, 2,109,109, + 109,109,109,109,109, 2,109,109, 2, 2,107,107,107,107, 2,107, + 107,107,107, 2, 2,107,107, 2,107,107,107,107, 2, 1,107,107, + 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2,107,107,137,137, + 137,137, 2,137,137,137,137,137, 2, 2,124,124,124,124,124,124, + 2, 2,123,123,123,123,123,123, 2, 2,114,114,114,114,114, 2, + 2, 2,114,114, 2, 2,102,102,102,102,102,102, 2, 2,126,126, + 126,126,126,126,126, 2, 2,126,126,126,142,142,142,142,125,125, + 125,125,125,125,125, 2, 2, 2, 2,125,154,154,154,154,154,154, + 154, 2, 2,154, 2, 2, 2,154,154, 2,154,154, 2,154,154, 2, + 2,154,154,154, 2, 2,150,150,150,150, 2, 2,150,150,150, 2, + 2, 2,141,141,141,141,140,140,140,140,140,140,140, 2,121,121, + 121,121,121, 2, 2, 2, 7, 7, 2, 2,133,133,133,133,133, 2, + 133,133,133,133,133, 2,133,133, 2, 2,133, 2, 2, 2,134,134, + 134,134, 2, 2,134,134, 2,134,134,134,134,134,134, 2,138,138, + 138,138,138,138,138, 2,138,138, 2,138, 2, 2,138, 2,138,138, + 2, 2,143,143,143,143,143,143, 2,143,143, 2,143,143,143,143, + 143, 2,143, 2, 2, 2,143,143, 2, 2,145,145,145,145,145, 2, + 2, 2,163,163,163,163,163, 2,163,163,163,163,163, 2, 2, 2, + 163,163,163,163, 2, 2, 86, 2, 2, 2, 63, 63, 63, 63, 63, 63, + 2, 2, 63, 63, 63, 2, 63, 2, 2, 2,157,157,157,157,157,157, + 157, 2, 80, 80, 80, 80, 80, 80, 2, 2,127,127,127,127,127,127, + 127, 2, 79, 2, 2, 2,115,115,115,115,115,115,115, 2,115,115, + 2, 2, 2, 2,115,115,159,159,159,159,159,159,159, 2,159,159, + 2, 2,103,103,103,103,103,103, 2, 2,119,119,119,119,119,119, + 2, 2,119,119, 2,119, 2,119,119,119,146,146,146,146,146,146, + 146, 2, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99,136,139, + 13, 13,155, 2, 2, 2,136,136,136,136,155,155,155,155,155,155, + 2, 2,136, 2, 2, 2, 2, 17, 17, 17, 2, 17, 17, 2, 17, 15, + 15, 15, 17, 17, 17, 2, 2, 2, 15, 2, 2, 17, 2, 2,139,139, + 139,139,105,105,105,105,105,105,105, 2,105, 2, 2, 2,105,105, + 2, 2, 1, 1, 2, 2, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, + 1, 1, 2, 2, 0, 2, 2, 0, 0, 2, 0, 2, 0, 2,131,131, + 131,131, 2, 2, 2,131, 2,131,131,131, 56, 56, 56, 2, 56, 2, + 2, 56, 56, 56, 2, 56, 56, 2, 56, 56, 6, 6, 2, 2, 2, 2, + 2, 6,151,151,151,151,151, 2, 2, 2,151,151, 2, 2, 2, 2, + 151,151,160,160,160,160,160,160,160, 2,152,152,152,152,152,152, + 2, 2, 2, 2, 2,152,164,164,164,164,164,164, 2, 2, 2, 30, + 30, 2,113,113,113,113,113, 2, 2,113,113,113,113, 2,132,132, + 132,132,132,132, 2, 2, 2, 2,132,132, 2, 3, 3, 2, 3, 2, + 2, 3, 2, 3, 2, 3, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, + 2, 3, 15, 0, 0, 2, 13, 2, 2, 2, 13, 13, 13, 2, 2, 0, + 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, + 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -3702,60 +3704,60 @@ _hb_ucd_u8[14744] = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, - 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, - 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, + 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, - 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, - 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, - 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, - 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, - 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, + 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, + 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, + 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, + 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, + 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, - 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0,111,112, - 113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 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,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, - 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, + 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102, + 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0, + 108, 0,109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, + 0, 0,116, 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,117, 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,128,129,130,131,132,133,134,135, - 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151, - 152,153,154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, + 0, 0, 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 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,165, 0, 0, 0, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, + 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, + 0, 0,164, 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,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0, + 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 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,169,170, 0, - 0, 0, 0,171,172, 0, 0, 0,173,174,175,176,177,178,179,180, - 181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196, - 197,198,199,200,201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, + 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 2, 3, 4, + 0, 0, 0, 0, 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0, + 173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188, + 189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204, + 205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[10040] = +_hb_ucd_u16[10060] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -3798,9 +3800,9 @@ _hb_ucd_u16[10040] = 209, 306, 209, 209, 209, 209, 209, 209, 9, 9, 9, 11, 11, 11, 307, 308, 13, 13, 13, 13, 13, 13, 309, 310, 11, 11, 311, 48, 48, 48, 312, 313, 48, 314, 315, 315, 315, 315, 32, 32, 316, 317, 318, 319, 320, 321, 140, 140, - 209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 325, - 326, 327, 328, 329, 136, 48, 48, 48, 48, 330, 178, 48, 48, 48, 48, 331, - 332, 48, 48, 136, 48, 48, 48, 48, 200, 333, 48, 48, 209, 209, 323, 48, + 209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 209, + 325, 326, 327, 328, 136, 48, 48, 48, 48, 329, 178, 48, 48, 48, 48, 330, + 331, 48, 48, 136, 48, 48, 48, 48, 200, 332, 48, 48, 209, 209, 333, 48, 209, 334, 335, 209, 336, 337, 209, 209, 335, 209, 209, 337, 209, 209, 209, 209, 48, 48, 48, 48, 209, 209, 209, 209, 48, 338, 48, 48, 48, 48, 48, 48, 151, 209, 209, 209, 287, 48, 48, 229, 339, 48, 340, 140, 13, 13, 341, 342, @@ -3871,143 +3873,144 @@ _hb_ucd_u16[10040] = 9, 9, 607, 11, 654, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 499, 271, 271, 655, 656, 140, 140, 140, 140, 499, 271, 657, 658, 140, 140, 140, 140, 659, 48, 660, 661, 662, 663, 664, 665, 666, 206, 667, 206, 140, 140, 140, 668, - 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 669, 669, 669, 209, 324, - 670, 209, 209, 209, 209, 209, 209, 209, 209, 209, 671, 140, 140, 140, 672, 209, - 673, 209, 209, 325, 674, 675, 324, 140, 209, 209, 209, 209, 209, 209, 209, 676, - 209, 209, 209, 209, 209, 677, 426, 426, 209, 209, 209, 209, 209, 209, 209, 678, - 209, 209, 209, 209, 209, 176, 325, 427, 325, 209, 209, 209, 679, 176, 209, 209, - 679, 209, 671, 675, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 671, 426, - 674, 209, 209, 680, 681, 325, 674, 674, 209, 682, 209, 209, 288, 140, 140, 192, + 209, 209, 669, 209, 209, 209, 209, 209, 209, 323, 334, 670, 670, 670, 209, 324, + 671, 209, 209, 209, 209, 209, 209, 209, 209, 209, 672, 140, 140, 140, 673, 209, + 674, 209, 209, 669, 675, 676, 324, 140, 209, 209, 209, 209, 209, 209, 209, 677, + 209, 209, 209, 209, 209, 678, 426, 426, 209, 209, 209, 209, 209, 209, 209, 679, + 209, 209, 209, 209, 209, 176, 669, 427, 669, 209, 209, 209, 680, 176, 209, 209, + 680, 209, 672, 676, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 672, 426, + 675, 209, 209, 681, 682, 669, 675, 675, 209, 683, 209, 209, 288, 140, 140, 192, 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 207, 48, 48, 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 478, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 100, 140, 48, 204, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 71, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, - 683, 140, 570, 570, 570, 570, 570, 570, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 140, 391, 391, 391, 391, 391, 391, 391, 684, - 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 1, 2, 1, 2, - 0, 0, 3, 3, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 6, 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, - 10, 11, 12, 11, 11, 11, 13, 11, 14, 14, 14, 14, 14, 14, 14, 14, - 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 17, 18, 17, 17, - 19, 20, 21, 21, 22, 21, 23, 24, 25, 26, 27, 27, 28, 29, 27, 30, - 27, 27, 27, 27, 27, 31, 27, 27, 32, 33, 33, 33, 34, 27, 27, 27, - 35, 35, 35, 36, 37, 37, 37, 38, 39, 39, 40, 41, 42, 43, 44, 27, - 45, 46, 27, 27, 27, 27, 47, 27, 48, 48, 48, 48, 48, 49, 50, 48, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 109, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 122, 124, 125, 125, - 126, 127, 128, 129, 130, 131, 125, 125, 132, 132, 132, 132, 133, 132, 134, 135, - 132, 133, 132, 136, 136, 137, 125, 125, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 139, 139, 140, 139, 139, 141, 142, 142, 142, 142, 142, 142, 142, 142, - 143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143, - 143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153, - 154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170, - 171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176, - 177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168, - 188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194, 8, 195, 125, 125, 125, - 196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201, - 202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211, - 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 8, 8, - 11, 217, 11, 11, 217, 218, 11, 219, 11, 11, 11, 220, 220, 221, 11, 222, - 223, 0, 0, 0, 0, 0, 224, 225, 226, 227, 0, 0, 228, 8, 8, 229, - 0, 0, 230, 231, 232, 0, 4, 4, 233, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 125, 235, 125, 0, 0, - 236, 236, 236, 236, 236, 236, 236, 236, 0, 0, 0, 0, 0, 0, 0, 237, - 0, 238, 0, 0, 0, 0, 0, 0, 239, 239, 239, 239, 239, 239, 4, 4, - 240, 240, 240, 240, 240, 240, 240, 241, 139, 139, 140, 242, 242, 242, 243, 244, - 143, 245, 246, 246, 246, 246, 14, 14, 0, 0, 0, 0, 0, 247, 125, 125, - 248, 249, 248, 248, 248, 248, 248, 250, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 251, 125, 252, 253, 0, 254, 255, 256, 257, 257, 257, - 257, 258, 259, 260, 260, 260, 260, 261, 262, 263, 263, 264, 142, 142, 142, 142, - 265, 0, 263, 263, 0, 0, 266, 260, 142, 265, 0, 0, 0, 0, 142, 267, - 0, 0, 0, 0, 0, 260, 260, 268, 260, 260, 260, 260, 260, 269, 0, 0, - 248, 248, 248, 248, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270, - 271, 270, 270, 270, 272, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 275, 125, 14, 14, 14, 14, 14, 14, 276, 276, 276, 276, 276, 277, - 0, 0, 278, 4, 4, 4, 4, 4, 279, 4, 4, 4, 280, 281, 125, 282, - 283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290, 48, 48, - 291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299, - 300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308, - 309, 310, 246, 4, 4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314, - 142, 142, 315, 142, 316, 142, 142, 317, 125, 125, 125, 125, 125, 125, 125, 125, - 248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 125, 125, - 320, 321, 21, 322, 323, 27, 27, 27, 27, 27, 27, 27, 324, 325, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 326, 27, 27, 27, 27, - 27, 327, 27, 27, 328, 125, 125, 27, 8, 285, 329, 0, 0, 330, 331, 332, - 27, 27, 27, 27, 27, 27, 27, 333, 334, 0, 1, 2, 1, 2, 335, 259, - 260, 336, 142, 265, 337, 338, 339, 340, 341, 342, 343, 344, 345, 345, 125, 125, - 342, 342, 342, 342, 342, 342, 342, 346, 347, 0, 0, 348, 11, 11, 11, 11, - 349, 350, 351, 125, 125, 0, 0, 352, 353, 354, 355, 355, 355, 356, 357, 252, - 358, 358, 359, 360, 361, 362, 362, 363, 364, 365, 366, 366, 367, 368, 125, 125, - 369, 369, 369, 369, 369, 370, 370, 370, 371, 372, 373, 374, 374, 375, 374, 376, - 377, 377, 378, 379, 379, 379, 380, 381, 381, 382, 383, 384, 125, 125, 125, 125, - 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 386, 385, 387, 388, 125, - 389, 4, 4, 390, 125, 125, 125, 125, 391, 392, 392, 393, 394, 395, 396, 396, - 397, 398, 399, 125, 125, 125, 400, 401, 402, 403, 404, 405, 125, 125, 125, 125, - 406, 406, 407, 408, 407, 409, 407, 407, 410, 411, 412, 413, 414, 414, 415, 415, - 416, 416, 125, 125, 417, 417, 418, 419, 420, 420, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 125, 125, 125, 125, 125, 429, 429, 429, 429, 430, 125, 125, 125, - 431, 431, 431, 432, 431, 431, 431, 433, 434, 434, 435, 436, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 27, 45, 437, 437, 438, 439, 125, 125, 125, 440, - 441, 441, 442, 443, 443, 444, 125, 445, 446, 125, 125, 447, 448, 125, 449, 450, - 451, 451, 451, 451, 452, 453, 451, 454, 455, 455, 455, 455, 456, 457, 458, 459, - 460, 460, 460, 461, 462, 463, 463, 464, 465, 465, 465, 465, 465, 465, 466, 467, - 468, 469, 468, 468, 470, 125, 125, 125, 471, 472, 473, 474, 474, 474, 475, 476, - 477, 478, 479, 480, 481, 482, 483, 484, 485, 485, 485, 485, 485, 486, 487, 125, - 488, 488, 488, 488, 489, 490, 125, 125, 491, 491, 491, 492, 491, 493, 125, 125, - 494, 494, 494, 494, 495, 496, 497, 125, 498, 498, 498, 499, 499, 125, 125, 125, - 500, 501, 502, 500, 503, 125, 125, 125, 504, 504, 504, 505, 125, 125, 125, 125, - 125, 125, 506, 506, 506, 506, 506, 507, 508, 509, 510, 511, 512, 513, 125, 125, - 125, 125, 514, 515, 515, 514, 516, 125, 517, 517, 517, 517, 518, 519, 519, 519, - 519, 519, 520, 154, 521, 521, 521, 522, 523, 125, 125, 125, 125, 125, 125, 125, - 524, 525, 525, 526, 527, 525, 528, 529, 529, 530, 531, 532, 125, 125, 125, 125, - 533, 534, 534, 535, 536, 537, 538, 539, 540, 541, 542, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 543, 544, 545, 546, 545, 547, 545, 548, 125, 125, - 125, 125, 125, 549, 550, 550, 550, 551, 552, 552, 552, 552, 552, 552, 552, 552, - 552, 553, 125, 125, 125, 125, 125, 125, 552, 552, 552, 552, 552, 552, 554, 555, - 552, 552, 552, 552, 556, 125, 125, 125, 125, 557, 557, 557, 557, 557, 557, 558, - 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 560, 125, 125, - 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 562, 125, 125, 125, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 563, 564, 565, 566, 567, - 567, 567, 567, 568, 569, 570, 571, 572, 573, 573, 573, 573, 574, 575, 576, 577, - 573, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 578, 578, 578, 578, - 578, 579, 125, 125, 125, 125, 125, 125, 580, 580, 580, 580, 581, 580, 580, 580, - 582, 580, 125, 125, 125, 125, 583, 584, 585, 585, 585, 585, 585, 585, 585, 585, - 585, 585, 585, 585, 585, 585, 585, 586, 587, 587, 587, 587, 587, 587, 587, 587, - 587, 587, 587, 587, 587, 588, 125, 125, 589, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 590, 591, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 592, 593, 125, 594, 595, 596, - 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, - 598, 598, 598, 598, 598, 598, 599, 600, 601, 602, 266, 125, 125, 125, 125, 125, - 8, 8, 603, 8, 604, 0, 0, 0, 0, 0, 0, 0, 266, 125, 125, 125, - 0, 0, 0, 0, 0, 0, 0, 605, 0, 0, 606, 0, 0, 0, 607, 608, - 609, 0, 610, 0, 0, 0, 235, 125, 11, 11, 11, 11, 611, 125, 125, 125, - 125, 125, 125, 125, 0, 266, 0, 266, 0, 0, 0, 0, 0, 234, 0, 612, - 0, 0, 0, 0, 0, 224, 0, 0, 0, 613, 614, 615, 616, 0, 0, 0, - 617, 618, 0, 619, 620, 621, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 623, 0, 0, 0, 624, 624, 624, 624, 624, 624, 624, 624, - 625, 626, 627, 125, 125, 125, 125, 125, 4, 628, 629, 125, 125, 125, 125, 125, - 630, 631, 632, 14, 14, 14, 633, 125, 634, 125, 125, 125, 125, 125, 125, 125, - 635, 635, 636, 637, 638, 125, 125, 125, 125, 639, 640, 125, 641, 641, 641, 642, - 125, 125, 125, 125, 125, 643, 643, 644, 125, 125, 125, 125, 125, 125, 645, 646, - 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 648, 649, 125, 125, - 650, 650, 650, 650, 651, 652, 125, 125, 125, 125, 125, 125, 125, 125, 125, 334, - 0, 0, 0, 653, 125, 125, 125, 125, 334, 0, 0, 247, 125, 125, 125, 125, - 654, 27, 655, 656, 657, 658, 659, 660, 661, 662, 663, 662, 125, 125, 125, 664, - 0, 0, 252, 0, 0, 0, 0, 0, 0, 266, 226, 334, 334, 334, 0, 605, - 0, 0, 247, 125, 125, 125, 665, 0, 666, 0, 0, 252, 612, 667, 605, 125, - 0, 0, 0, 0, 0, 668, 350, 350, 0, 0, 0, 0, 0, 0, 0, 669, - 0, 0, 0, 0, 0, 285, 252, 228, 252, 0, 0, 0, 670, 285, 0, 0, - 670, 0, 247, 667, 125, 125, 125, 125, 0, 0, 0, 0, 0, 266, 247, 350, - 612, 0, 0, 671, 672, 252, 612, 612, 0, 330, 0, 0, 235, 125, 125, 285, - 248, 248, 248, 248, 248, 248, 125, 125, 248, 248, 248, 319, 248, 248, 248, 248, - 248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 584, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 673, 125, 248, 318, 125, 125, 125, 125, 125, 125, - 248, 248, 248, 248, 674, 248, 248, 248, 248, 248, 248, 125, 125, 125, 125, 125, - 675, 125, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, + 48, 48, 48, 48, 48, 48, 100, 48, 48, 48, 48, 48, 48, 204, 140, 140, + 48, 204, 140, 140, 140, 140, 140, 140, 48, 48, 48, 48, 71, 48, 48, 48, + 48, 48, 48, 140, 140, 140, 140, 140, 684, 140, 570, 570, 570, 570, 570, 570, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, + 391, 391, 391, 391, 391, 391, 391, 685, 391, 391, 391, 391, 391, 391, 391, 686, + 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 11, 11, 11, 13, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 16, 17, 18, 17, 17, 19, 20, 21, 21, 22, 21, 23, 24, + 25, 26, 27, 27, 28, 29, 27, 30, 27, 27, 27, 27, 27, 31, 27, 27, + 32, 33, 33, 33, 34, 27, 27, 27, 35, 35, 35, 36, 37, 37, 37, 38, + 39, 39, 40, 41, 42, 43, 44, 27, 45, 46, 27, 27, 27, 27, 47, 27, + 48, 48, 48, 48, 48, 49, 50, 48, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 109, 110, 111, 112, 109, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 122, 123, 122, 124, 125, 125, 126, 127, 128, 129, 130, 131, 125, 125, + 132, 132, 132, 132, 133, 132, 134, 135, 132, 133, 132, 136, 136, 137, 125, 125, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 139, 139, 141, + 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 144, 145, 143, 143, + 144, 143, 143, 146, 147, 148, 143, 143, 143, 147, 143, 143, 143, 149, 143, 150, + 143, 151, 152, 152, 152, 152, 152, 153, 154, 154, 154, 154, 154, 154, 154, 154, + 155, 156, 157, 157, 157, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 168, 168, 168, 168, 169, 170, 170, 171, 172, 173, 173, 173, 173, 173, 174, + 173, 173, 175, 154, 154, 154, 154, 176, 177, 178, 179, 179, 180, 181, 182, 183, + 184, 184, 185, 184, 186, 187, 168, 168, 188, 189, 190, 190, 190, 191, 190, 192, + 193, 193, 194, 8, 195, 125, 125, 125, 196, 196, 196, 196, 197, 196, 196, 198, + 199, 199, 199, 199, 200, 200, 200, 201, 202, 202, 202, 203, 204, 205, 205, 205, + 206, 139, 139, 207, 208, 209, 210, 211, 4, 4, 212, 4, 4, 213, 214, 215, + 4, 4, 4, 216, 8, 8, 8, 8, 11, 217, 11, 11, 217, 218, 11, 219, + 11, 11, 11, 220, 220, 221, 11, 222, 223, 0, 0, 0, 0, 0, 224, 225, + 226, 227, 0, 0, 228, 8, 8, 229, 0, 0, 230, 231, 232, 0, 4, 4, + 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 234, 125, 235, 125, 0, 0, 236, 236, 236, 236, 236, 236, 236, 236, + 0, 0, 0, 0, 0, 0, 0, 237, 0, 238, 0, 0, 0, 0, 0, 0, + 239, 239, 239, 239, 239, 239, 4, 4, 240, 240, 240, 240, 240, 240, 240, 241, + 139, 139, 140, 242, 242, 242, 243, 244, 143, 245, 246, 246, 246, 246, 14, 14, + 0, 0, 0, 0, 0, 247, 125, 125, 248, 249, 248, 248, 248, 248, 248, 250, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 125, 0, + 252, 0, 253, 254, 255, 256, 256, 256, 256, 257, 258, 259, 259, 259, 259, 260, + 261, 262, 262, 263, 142, 142, 142, 142, 264, 0, 262, 262, 0, 0, 265, 259, + 142, 264, 0, 0, 0, 0, 142, 266, 0, 0, 0, 0, 0, 259, 259, 267, + 259, 259, 259, 259, 259, 268, 0, 0, 248, 248, 248, 248, 0, 0, 0, 0, + 269, 269, 269, 269, 269, 269, 269, 269, 270, 269, 269, 269, 271, 272, 272, 272, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 274, 125, 14, 14, 14, 14, + 14, 14, 275, 275, 275, 275, 275, 276, 0, 0, 277, 4, 4, 4, 4, 4, + 278, 4, 4, 4, 279, 280, 125, 281, 282, 282, 283, 284, 285, 285, 285, 286, + 287, 287, 287, 287, 288, 289, 48, 48, 290, 290, 291, 292, 292, 293, 142, 294, + 295, 295, 295, 295, 296, 297, 138, 298, 299, 299, 299, 300, 301, 302, 138, 138, + 303, 303, 303, 303, 304, 305, 306, 307, 308, 309, 246, 4, 4, 310, 311, 152, + 152, 152, 152, 152, 306, 306, 312, 313, 142, 142, 314, 142, 315, 142, 142, 316, + 125, 125, 125, 125, 125, 125, 125, 125, 248, 248, 248, 248, 248, 248, 317, 248, + 248, 248, 248, 248, 248, 318, 125, 125, 319, 320, 21, 321, 322, 27, 27, 27, + 27, 27, 27, 27, 323, 324, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 325, 27, 27, 27, 27, 27, 326, 27, 27, 327, 125, 125, 27, + 8, 284, 328, 0, 0, 329, 330, 331, 27, 27, 27, 27, 27, 27, 27, 332, + 333, 0, 1, 2, 1, 2, 334, 258, 259, 335, 142, 264, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 344, 125, 125, 341, 341, 341, 341, 341, 341, 341, 345, + 346, 0, 0, 347, 11, 11, 11, 11, 348, 349, 350, 125, 125, 0, 0, 351, + 352, 353, 354, 354, 354, 355, 356, 357, 358, 358, 359, 360, 361, 362, 362, 363, + 364, 365, 366, 366, 367, 368, 125, 125, 369, 369, 369, 369, 369, 370, 370, 370, + 371, 372, 373, 374, 374, 375, 374, 376, 377, 377, 378, 379, 379, 379, 380, 381, + 381, 382, 383, 384, 125, 125, 125, 125, 385, 385, 385, 385, 385, 385, 385, 385, + 385, 385, 385, 386, 385, 387, 388, 125, 389, 4, 4, 390, 125, 125, 125, 125, + 391, 392, 392, 393, 394, 395, 396, 396, 397, 398, 399, 125, 125, 125, 400, 401, + 402, 403, 404, 405, 125, 125, 125, 125, 406, 406, 407, 408, 407, 409, 407, 407, + 410, 411, 412, 413, 414, 414, 415, 415, 416, 416, 125, 125, 417, 417, 418, 419, + 420, 420, 420, 421, 422, 423, 424, 425, 426, 427, 428, 125, 125, 125, 125, 125, + 429, 429, 429, 429, 430, 125, 125, 125, 431, 431, 431, 432, 431, 431, 431, 433, + 434, 434, 435, 436, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 27, 45, + 437, 437, 438, 439, 125, 125, 125, 440, 441, 441, 442, 443, 443, 444, 125, 445, + 446, 125, 125, 447, 448, 125, 449, 450, 451, 451, 451, 451, 452, 453, 451, 454, + 455, 455, 455, 455, 456, 457, 458, 459, 460, 460, 460, 461, 462, 463, 463, 464, + 465, 465, 465, 465, 465, 465, 466, 467, 468, 469, 468, 468, 470, 125, 125, 125, + 471, 472, 473, 474, 474, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 485, 485, 485, 485, 486, 487, 125, 488, 488, 488, 488, 489, 490, 125, 125, + 491, 491, 491, 492, 491, 493, 125, 125, 494, 494, 494, 494, 495, 496, 497, 125, + 498, 498, 498, 499, 499, 125, 125, 125, 500, 501, 502, 500, 503, 125, 125, 125, + 504, 504, 504, 505, 125, 125, 125, 125, 125, 125, 506, 506, 506, 506, 506, 507, + 508, 509, 510, 511, 512, 513, 125, 125, 125, 125, 514, 515, 515, 514, 516, 125, + 517, 517, 517, 517, 518, 519, 519, 519, 519, 519, 520, 154, 521, 521, 521, 522, + 523, 125, 125, 125, 125, 125, 125, 125, 524, 525, 525, 526, 527, 525, 528, 529, + 529, 530, 531, 532, 125, 125, 125, 125, 533, 534, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 543, 544, + 545, 546, 545, 547, 545, 548, 125, 125, 125, 125, 125, 549, 550, 550, 550, 551, + 552, 552, 552, 552, 552, 552, 552, 552, 552, 553, 125, 125, 125, 125, 125, 125, + 552, 552, 552, 552, 552, 552, 554, 555, 552, 552, 552, 552, 556, 125, 125, 125, + 125, 557, 557, 557, 557, 557, 557, 558, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 559, 559, 559, 559, 560, 125, 125, 561, 561, 561, 561, 561, 561, 561, 561, + 561, 561, 561, 561, 562, 125, 125, 125, 275, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 275, 563, 564, 565, 566, 567, 567, 567, 567, 568, 569, 570, 571, 572, + 573, 573, 573, 573, 574, 575, 576, 577, 573, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 578, 578, 578, 578, 578, 579, 125, 125, 125, 125, 125, 125, + 580, 580, 580, 580, 581, 580, 580, 580, 582, 580, 125, 125, 125, 125, 583, 584, + 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 586, + 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 588, 125, 125, + 589, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 590, + 591, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 592, 593, 125, 594, 595, 596, 596, 596, 596, 596, 596, 596, 596, 596, + 596, 596, 596, 596, 596, 596, 596, 597, 598, 598, 598, 598, 598, 598, 599, 600, + 601, 602, 603, 125, 125, 125, 125, 125, 8, 8, 604, 8, 605, 0, 0, 0, + 0, 0, 0, 0, 603, 125, 125, 125, 0, 0, 0, 0, 0, 0, 0, 606, + 0, 0, 607, 0, 0, 0, 608, 609, 610, 0, 611, 0, 0, 0, 235, 125, + 11, 11, 11, 11, 612, 125, 125, 125, 125, 125, 125, 125, 0, 603, 0, 603, + 0, 0, 0, 0, 0, 234, 0, 613, 0, 0, 0, 0, 0, 224, 0, 0, + 0, 614, 615, 616, 617, 0, 0, 0, 618, 619, 0, 620, 621, 622, 0, 0, + 0, 0, 623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, + 625, 625, 625, 625, 625, 625, 625, 625, 626, 627, 628, 125, 125, 125, 125, 125, + 4, 629, 630, 125, 125, 125, 125, 125, 631, 632, 633, 14, 14, 14, 634, 125, + 635, 125, 125, 125, 125, 125, 125, 125, 636, 636, 637, 638, 639, 125, 125, 125, + 125, 640, 641, 125, 642, 642, 642, 643, 125, 125, 125, 125, 125, 644, 644, 645, + 125, 125, 125, 125, 125, 125, 646, 647, 648, 648, 648, 648, 648, 648, 648, 648, + 648, 648, 648, 648, 649, 650, 125, 125, 651, 651, 651, 651, 652, 653, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 333, 0, 0, 0, 654, 125, 125, 125, 125, + 333, 0, 0, 247, 125, 125, 125, 125, 655, 27, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 663, 125, 125, 125, 665, 0, 0, 357, 0, 0, 0, 0, 0, + 0, 603, 226, 333, 333, 333, 0, 606, 0, 0, 247, 125, 125, 125, 666, 0, + 667, 0, 0, 357, 613, 668, 606, 125, 0, 0, 0, 0, 0, 669, 349, 349, + 0, 0, 0, 0, 0, 0, 0, 670, 0, 0, 0, 0, 0, 284, 357, 228, + 357, 0, 0, 0, 671, 284, 0, 0, 671, 0, 247, 668, 125, 125, 125, 125, + 0, 0, 0, 0, 0, 603, 247, 349, 613, 0, 0, 672, 673, 357, 613, 613, + 0, 329, 0, 0, 235, 125, 125, 284, 248, 248, 248, 248, 248, 248, 125, 125, + 248, 248, 248, 318, 248, 248, 248, 248, 248, 317, 248, 248, 248, 248, 248, 248, + 248, 248, 584, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 674, 248, + 248, 248, 248, 248, 248, 317, 125, 125, 248, 317, 125, 125, 125, 125, 125, 125, + 248, 248, 248, 248, 675, 248, 248, 248, 248, 248, 248, 125, 125, 125, 125, 125, + 676, 125, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 3, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 5, 0, 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 10, 11, @@ -4071,33 +4074,33 @@ _hb_ucd_u16[10040] = 0, 240, 0, 0, 241, 241, 241, 241, 18, 18, 18, 18, 18, 12, 242, 18, 243, 243, 243, 243, 243, 243, 12, 244, 245, 12, 12, 244, 151, 154, 12, 12, 151, 154, 151, 154, 0, 0, 0, 246, 247, 247, 247, 247, 247, 247, 248, 247, - 247, 12, 12, 12, 247, 249, 12, 12, 0, 0, 0, 12, 0, 250, 0, 0, - 251, 247, 252, 253, 0, 0, 247, 0, 254, 255, 255, 255, 255, 255, 255, 255, - 255, 256, 257, 258, 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 259, - 12, 262, 263, 263, 263, 263, 263, 263, 264, 150, 150, 150, 150, 150, 150, 265, - 0, 12, 12, 12, 150, 150, 150, 266, 260, 260, 260, 261, 260, 260, 0, 0, - 267, 267, 267, 267, 267, 267, 267, 268, 267, 269, 12, 12, 270, 270, 270, 270, - 271, 271, 271, 271, 271, 271, 271, 12, 272, 272, 272, 272, 272, 272, 12, 12, - 237, 2, 2, 2, 2, 2, 231, 2, 2, 2, 273, 12, 274, 275, 276, 12, - 277, 2, 2, 2, 278, 278, 278, 278, 278, 278, 278, 279, 0, 0, 246, 12, - 280, 280, 280, 280, 280, 280, 12, 12, 281, 281, 281, 281, 281, 282, 12, 283, - 281, 281, 282, 12, 284, 284, 284, 284, 284, 284, 284, 285, 286, 286, 286, 286, - 286, 12, 12, 287, 150, 150, 150, 288, 289, 289, 289, 289, 289, 289, 289, 290, - 289, 289, 291, 292, 145, 145, 145, 293, 294, 294, 294, 294, 294, 295, 12, 12, - 294, 294, 294, 296, 294, 294, 296, 294, 297, 297, 297, 297, 298, 12, 12, 12, - 12, 12, 299, 297, 300, 300, 300, 300, 300, 301, 12, 12, 155, 154, 155, 154, - 155, 154, 12, 12, 2, 2, 3, 2, 2, 302, 303, 12, 300, 300, 300, 304, - 300, 300, 304, 12, 150, 12, 12, 12, 150, 265, 305, 150, 150, 150, 150, 12, - 247, 247, 247, 249, 247, 247, 249, 12, 2, 273, 12, 12, 306, 22, 12, 24, - 25, 26, 25, 307, 308, 309, 25, 25, 50, 12, 12, 12, 310, 29, 29, 29, - 29, 29, 29, 311, 312, 29, 29, 29, 29, 29, 12, 310, 7, 7, 7, 313, - 232, 0, 0, 0, 0, 232, 0, 12, 29, 314, 29, 29, 29, 29, 29, 315, - 316, 0, 0, 0, 0, 317, 260, 260, 260, 260, 260, 318, 319, 150, 319, 150, - 319, 150, 319, 288, 0, 232, 0, 232, 12, 12, 316, 246, 320, 320, 320, 321, - 320, 320, 320, 320, 320, 322, 320, 320, 320, 320, 322, 323, 320, 320, 320, 324, - 320, 320, 322, 12, 232, 131, 0, 0, 0, 131, 0, 0, 8, 8, 8, 14, - 0, 0, 0, 234, 325, 12, 12, 12, 0, 0, 0, 326, 327, 327, 327, 327, - 327, 327, 327, 328, 329, 329, 329, 329, 330, 12, 12, 12, 215, 0, 0, 0, + 247, 12, 12, 12, 247, 249, 12, 12, 0, 250, 0, 0, 251, 247, 252, 253, + 0, 0, 247, 0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 256, 257, 258, + 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 259, 12, 262, 263, 263, + 263, 263, 263, 263, 264, 150, 150, 150, 150, 150, 150, 265, 0, 12, 12, 131, + 150, 150, 150, 266, 260, 260, 260, 261, 260, 260, 0, 0, 267, 267, 267, 267, + 267, 267, 267, 268, 267, 269, 12, 12, 270, 270, 270, 270, 271, 271, 271, 271, + 271, 271, 271, 12, 272, 272, 272, 272, 272, 272, 12, 12, 237, 2, 2, 2, + 2, 2, 231, 2, 2, 2, 273, 12, 274, 275, 276, 12, 277, 2, 2, 2, + 278, 278, 278, 278, 278, 278, 278, 279, 0, 0, 246, 12, 280, 280, 280, 280, + 280, 280, 12, 12, 281, 281, 281, 281, 281, 282, 12, 283, 281, 281, 282, 12, + 284, 284, 284, 284, 284, 284, 284, 285, 286, 286, 286, 286, 286, 12, 12, 287, + 150, 150, 150, 288, 289, 289, 289, 289, 289, 289, 289, 290, 289, 289, 291, 292, + 145, 145, 145, 293, 294, 294, 294, 294, 294, 295, 12, 12, 294, 294, 294, 296, + 294, 294, 296, 294, 297, 297, 297, 297, 298, 12, 12, 12, 12, 12, 299, 297, + 300, 300, 300, 300, 300, 301, 12, 12, 155, 154, 155, 154, 155, 154, 12, 12, + 2, 2, 3, 2, 2, 302, 303, 12, 300, 300, 300, 304, 300, 300, 304, 12, + 150, 12, 12, 12, 150, 265, 305, 150, 150, 150, 150, 12, 247, 247, 247, 249, + 247, 247, 249, 12, 2, 273, 12, 12, 306, 22, 12, 24, 25, 26, 25, 307, + 308, 309, 25, 25, 50, 12, 12, 12, 310, 29, 29, 29, 29, 29, 29, 311, + 312, 29, 29, 29, 29, 29, 12, 310, 7, 7, 7, 313, 232, 0, 0, 0, + 0, 232, 0, 12, 29, 314, 29, 29, 29, 29, 29, 315, 316, 0, 0, 0, + 0, 317, 260, 260, 260, 260, 260, 318, 319, 150, 319, 150, 319, 150, 319, 288, + 0, 232, 0, 232, 12, 12, 316, 246, 320, 320, 320, 321, 320, 320, 320, 320, + 320, 322, 320, 320, 320, 320, 322, 323, 320, 320, 320, 324, 320, 320, 322, 12, + 232, 131, 0, 0, 0, 131, 0, 0, 8, 8, 8, 14, 0, 0, 0, 234, + 325, 12, 12, 12, 0, 0, 0, 326, 327, 327, 327, 327, 327, 327, 327, 328, + 329, 329, 329, 329, 330, 12, 12, 12, 215, 0, 0, 0, 0, 0, 0, 12, 331, 331, 331, 331, 331, 12, 12, 332, 333, 333, 333, 333, 333, 333, 334, 12, 335, 335, 335, 335, 335, 335, 336, 12, 337, 337, 337, 337, 337, 337, 337, 338, 339, 339, 339, 339, 339, 12, 339, 339, 339, 340, 12, 12, 341, 341, 341, 341, @@ -4159,232 +4162,232 @@ _hb_ucd_u16[10040] = 260, 556, 260, 557, 558, 255, 255, 255, 559, 12, 12, 12, 560, 12, 12, 12, 256, 561, 12, 12, 12, 260, 12, 12, 562, 562, 562, 562, 562, 562, 562, 12, 563, 563, 563, 563, 563, 563, 564, 12, 563, 563, 563, 565, 563, 563, 565, 12, - 563, 563, 566, 563, 7, 7, 7, 567, 7, 199, 12, 12, 0, 246, 12, 12, - 0, 232, 316, 0, 0, 568, 228, 0, 0, 0, 568, 7, 213, 569, 7, 0, - 0, 0, 570, 228, 8, 225, 12, 12, 0, 0, 234, 12, 0, 0, 0, 229, - 571, 572, 316, 229, 0, 0, 240, 316, 0, 316, 0, 0, 0, 240, 232, 316, - 0, 229, 0, 229, 0, 0, 240, 232, 0, 573, 239, 0, 229, 0, 0, 0, - 0, 246, 0, 0, 0, 0, 0, 239, 574, 574, 574, 574, 574, 574, 574, 12, - 12, 12, 575, 574, 576, 574, 574, 574, 2, 2, 2, 273, 12, 275, 273, 12, - 241, 577, 241, 241, 241, 241, 578, 241, 579, 580, 577, 12, 19, 19, 19, 581, - 12, 12, 12, 582, 583, 583, 583, 583, 583, 583, 583, 584, 583, 583, 583, 585, - 583, 583, 585, 586, 587, 587, 587, 587, 587, 587, 587, 588, 589, 589, 589, 589, - 589, 589, 590, 591, 592, 592, 592, 592, 592, 592, 593, 12, 151, 154, 151, 594, - 151, 151, 151, 154, 595, 595, 595, 595, 595, 596, 595, 595, 595, 597, 12, 12, - 598, 598, 598, 598, 598, 598, 598, 12, 598, 598, 599, 600, 0, 234, 12, 12, - 29, 414, 29, 29, 601, 602, 414, 29, 50, 29, 603, 12, 604, 310, 603, 414, - 601, 602, 603, 603, 601, 602, 50, 29, 50, 29, 414, 605, 29, 29, 606, 29, - 29, 29, 29, 12, 414, 414, 606, 29, 51, 12, 12, 12, 12, 239, 0, 0, - 607, 12, 12, 12, 246, 12, 12, 12, 0, 0, 12, 0, 0, 232, 131, 0, - 0, 0, 12, 12, 0, 0, 0, 240, 0, 246, 12, 239, 608, 12, 12, 12, - 247, 247, 609, 12, 610, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, - 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, - 0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127,1131,1133, 0,1147, - 1154,1155,1156,1161,1187,1188,1189,1193, 0,1219,1226,1227,1228,1229,1233, 0, - 0,1267,1268,1269,1273,1298, 0,1303, 943,1128, 944,1129, 954,1139, 958,1143, - 959,1144, 960,1145, 961,1146, 964,1149, 0, 0, 973,1158, 974,1159, 975,1160, - 983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, 994,1179, 0, 0, - 1004,1190,1005,1191,1006,1192,1014,1199,1007, 0, 0, 0,1016,1201,1020,1206, - 0,1022,1208,1025,1211,1023,1209, 0, 0, 0, 0,1032,1218,1037,1223,1035, - 1221, 0, 0, 0,1044,1230,1045,1231,1049,1235, 0, 0,1058,1244,1064,1250, - 1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264,1074,1261, 0, 0, - 1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283,1103,1290,1111,1299, - 1115,1118,1307,1120,1309,1121,1310, 0,1053,1239, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,1093,1280, 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, 949,1134,1010,1195,1050,1236,1090,1277,1341,1368,1340, - 1367,1342,1369,1339,1366, 0,1320,1347,1418,1419,1323,1350, 0, 0, 992,1177, - 1018,1204,1055,1241,1416,1417,1415,1424,1202, 0, 0, 0, 987,1172, 0, 0, - 1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, 979,1164, 980,1165, - 1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248,1091,1278,1092,1279, - 1071,1257,1076,1263, 0, 0, 997,1182, 0, 0, 0, 0, 0, 0, 945,1130, - 982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10,1425, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,1314,1427, 5, - 1434,1438,1443, 0,1450, 0,1455,1461,1514, 0, 0, 0, 0, 0, 0, 0, + 563, 563, 566, 563, 0, 12, 12, 12, 7, 7, 7, 567, 7, 199, 12, 12, + 0, 246, 12, 12, 0, 232, 316, 0, 0, 568, 228, 0, 0, 0, 568, 7, + 213, 569, 7, 0, 0, 0, 570, 228, 8, 225, 12, 12, 0, 0, 234, 12, + 0, 0, 0, 229, 571, 572, 316, 229, 0, 0, 240, 316, 0, 316, 0, 0, + 0, 240, 232, 316, 0, 229, 0, 229, 0, 0, 240, 232, 0, 573, 239, 0, + 229, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 239, 574, 574, 574, 574, + 574, 574, 574, 12, 12, 12, 575, 574, 576, 574, 574, 574, 2, 2, 2, 273, + 12, 275, 273, 12, 241, 577, 241, 241, 241, 241, 578, 241, 579, 580, 577, 12, + 19, 19, 19, 581, 12, 12, 12, 582, 583, 583, 583, 583, 583, 583, 583, 584, + 583, 583, 583, 585, 583, 583, 585, 586, 587, 587, 587, 587, 587, 587, 587, 588, + 589, 589, 589, 589, 589, 589, 590, 591, 592, 592, 592, 592, 592, 592, 593, 12, + 151, 154, 151, 594, 151, 151, 151, 154, 595, 595, 595, 595, 595, 596, 595, 595, + 595, 597, 12, 12, 598, 598, 598, 598, 598, 598, 598, 12, 598, 598, 599, 600, + 0, 234, 12, 12, 29, 414, 29, 29, 601, 602, 414, 29, 50, 29, 603, 12, + 604, 310, 603, 414, 601, 602, 603, 603, 601, 602, 50, 29, 50, 29, 414, 605, + 29, 29, 606, 29, 29, 29, 29, 12, 414, 414, 606, 29, 51, 12, 12, 12, + 12, 239, 0, 0, 607, 12, 12, 12, 246, 12, 12, 12, 0, 0, 12, 0, + 0, 232, 131, 0, 0, 0, 12, 12, 0, 0, 0, 240, 0, 246, 12, 239, + 608, 12, 12, 12, 247, 247, 609, 12, 610, 12, 12, 12, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, + 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041, + 1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127, + 1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, 0,1219,1226,1227, + 1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, 943,1128, 944,1129, + 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, 0, 0, 973,1158, + 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, 991,1176, 993,1178, + 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199,1007, 0, 0, 0, + 1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, 0, 0, 0,1032, + 1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231,1049,1235, 0, 0, + 1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258,1069,1255,1077,1264, + 1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275,1089,1276,1096,1283, + 1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0,1053,1239, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093,1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1446,1458,1468,1476,1480,1486,1517, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010,1195,1050,1236,1090, + 1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347,1418,1419,1323,1350, + 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424,1202, 0, 0, 0, + 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, 950,1135, 951,1136, + 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238,1061,1247,1062,1248, + 1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, 0, 0, 0, 0, + 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232,1422,1423,1113,1301, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 10, + 1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461,1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1489,1503,1494,1500,1508, 0, 0, 0, 0,1520,1521, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1526,1528, 0,1525, 0, 0, 0,1522, - 0, 0, 0, 0,1536,1532,1539, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1556, 0, 0, 0, 0, 0, 0,1548,1550, 0,1547, 0, 0, 0,1567, - 0, 0, 0, 0,1558,1554,1561, 0, 0, 0, 0, 0, 0, 0,1568,1569, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1529,1551, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1523,1545,1524,1546, 0, 0,1527,1549, - 0, 0,1570,1571,1530,1552,1531,1553, 0, 0,1533,1555,1535,1557,1537,1559, - 0, 0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563,1542,1564, 0, 0, - 1543,1565, 0, 0, 0, 0, 0, 0, 0, 0,1606,1607,1609,1608,1610, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1613, 0,1611, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1612, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486,1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1620, 0, 0, 0, 0, 0, 0, 0,1623, 0, 0,1624, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1614,1615,1616,1617,1618,1619,1621,1622, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1628,1629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1625,1626, 0,1627, 0, 0, 0,1634, 0, 0,1635, 0, + 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, 0, 0, 0,1520, + 1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1526,1528, 0,1525, + 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0,1548,1550, 0,1547, + 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, 0, 0, 0, 0, + 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, 0,1529,1551, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1523,1545,1524,1546, + 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, 0, 0,1533,1555, + 1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560,1540,1562,1541,1563, + 1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, 0, 0,1606,1607, + 1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0,1613, 0,1611, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1630,1631,1632, 0, 0,1633, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1639, 0, 0,1638,1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1636,1637, 0, 0, 0, 0, 0, 0,1641, 0, 0, 0, + 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, 0,1623, 0, 0, + 1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, 0, 0, 0,1634, + 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, 0, 0, 0, 0, + 1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0,1646, 0, 0, 0, + 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, 0, 0, 0,1659, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, 0, 0,1661, 0, + 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, 0, 0, 0,1664, + 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, 0,1666, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1668, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, 0, 0,1670, 0, + 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1642,1644,1643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1645, 0, 0, 0, 0, 0, 0, 0,1646, 0, 0, 0, 0, 0, 0,1648, - 1649, 0,1647,1650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1651,1653,1652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1654, 0,1655,1657,1656, 0, 0, 0, 0,1659, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1660, 0, 0, 0, 0,1661, 0, 0, 0, 0,1662, - 0, 0, 0, 0,1663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1658, 0, 0, 0, 0, 0, 0, 0, 0, 0,1664, 0,1665,1673, 0, - 1674, 0, 0, 0, 0, 0, 0, 0, 0,1666, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1668, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1669, 0, 0, 0, 0,1670, 0, 0, 0, 0,1671, - 0, 0, 0, 0,1672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1667, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1675, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1676, 0, - 1677, 0,1678, 0,1679, 0,1680, 0, 0, 0,1681, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0,1684,1685, 0,1686, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 953,1138, 955,1140, + 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152, + 1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, + 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205, + 1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216, + 1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385, + 1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256, + 1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282, + 1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289, + 1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311, + 1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, 952,1137, 947,1132, + 1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377, + 1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355, + 1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357, + 1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404, + 1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297, + 1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0,1471,1472,1701,1705, + 1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731, + 1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0,1481,1482,1737,1741, + 1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768, + 1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779, + 1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0,1504,1505,1785,1788, + 1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793,1509,1510,1794,1798, + 1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814,1467, 21,1475, 22, + 1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0,1704,1708,1709,1710, + 1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746, + 1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803, + 1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474, + 1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, 0,1315,1823,1484, + 1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828,1488,1487,1513, 19, + 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833,1502,1501,1516, 25, + 1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, 0, 0,1824,1512, + 1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1682, 0,1683, 0, 0,1684,1685, 0,1686, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 953,1138, 955,1140, 956,1141, 957,1142, - 1324,1351, 963,1148, 965,1150, 968,1153, 966,1151, 967,1152,1378,1380,1379,1381, - 984,1169, 985,1170,1420,1421, 986,1171, 989,1174, 995,1180, 998,1183, 996,1181, - 999,1184,1000,1185,1015,1200,1329,1356,1017,1203,1019,1205,1021,1207,1024,1210, - 1687,1688,1027,1213,1026,1212,1028,1214,1029,1215,1030,1216,1034,1220,1036,1222, - 1039,1225,1038,1224,1334,1361,1336,1363,1382,1384,1383,1385,1056,1242,1057,1243, - 1059,1245,1063,1249,1689,1690,1065,1251,1068,1254,1070,1256,1386,1387,1388,1389, - 1691,1692,1073,1259,1075,1262,1079,1266,1078,1265,1095,1282,1098,1285,1097,1284, - 1390,1391,1392,1393,1099,1286,1100,1287,1101,1288,1102,1289,1105,1292,1104,1291, - 1106,1294,1107,1295,1108,1296,1114,1302,1119,1308,1122,1311,1123,1312,1186,1260, - 1293,1305, 0,1394, 0, 0, 0, 0, 952,1137, 947,1132,1317,1344,1316,1343, - 1319,1346,1318,1345,1693,1695,1371,1375,1370,1374,1373,1377,1372,1376,1694,1696, - 981,1166, 977,1162, 972,1157,1326,1353,1325,1352,1328,1355,1327,1354,1697,1698, - 1009,1194,1013,1198,1054,1240,1048,1234,1331,1358,1330,1357,1333,1360,1332,1359, - 1699,1700,1396,1401,1395,1400,1398,1403,1397,1402,1399,1404,1094,1281,1087,1274, - 1406,1411,1405,1410,1408,1413,1407,1412,1409,1414,1109,1297,1117,1306,1116,1304, - 1112,1300, 0, 0, 0, 0, 0, 0,1471,1472,1701,1705,1702,1706,1703,1707, - 1430,1431,1715,1719,1716,1720,1717,1721,1477,1478,1729,1731,1730,1732, 0, 0, - 1435,1436,1733,1735,1734,1736, 0, 0,1481,1482,1737,1741,1738,1742,1739,1743, - 1439,1440,1751,1755,1752,1756,1753,1757,1490,1491,1765,1768,1766,1769,1767,1770, - 1447,1448,1771,1774,1772,1775,1773,1776,1495,1496,1777,1779,1778,1780, 0, 0, - 1451,1452,1781,1783,1782,1784, 0, 0,1504,1505,1785,1788,1786,1789,1787,1790, - 0,1459, 0,1791, 0,1792, 0,1793,1509,1510,1794,1798,1795,1799,1796,1800, - 1462,1463,1808,1812,1809,1813,1810,1814,1467, 21,1475, 22,1479, 23,1485, 24, - 1493, 27,1499, 28,1507, 29, 0, 0,1704,1708,1709,1710,1711,1712,1713,1714, - 1718,1722,1723,1724,1725,1726,1727,1728,1740,1744,1745,1746,1747,1748,1749,1750, - 1754,1758,1759,1760,1761,1762,1763,1764,1797,1801,1802,1803,1804,1805,1806,1807, - 1811,1815,1816,1817,1818,1819,1820,1821,1470,1469,1822,1474,1465, 0,1473,1825, - 1429,1428,1426, 12,1432, 0, 26, 0, 0,1315,1823,1484,1466, 0,1483,1829, - 1433, 13,1437, 14,1441,1826,1827,1828,1488,1487,1513, 19, 0, 0,1492,1515, - 1445,1444,1442, 15, 0,1831,1832,1833,1502,1501,1516, 25,1497,1498,1506,1518, - 1457,1456,1454, 17,1453,1313, 11, 3, 0, 0,1824,1512,1519, 0,1511,1830, - 1449, 16,1460, 18,1464, 4, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, - 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1834,1835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1836, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1837,1839,1838, 0, 0, 0, 0,1840, 0, 0, 0, - 0,1841, 0, 0,1842, 0, 0, 0, 0, 0, 0, 0,1843, 0,1844, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1845, 0, 0,1846, 0, 0,1847, - 0,1848, 0, 0, 0, 0, 0, 0, 937, 0,1850, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1849, 936, 938,1851,1852, 0, 0,1853,1854, 0, 0, - 1855,1856, 0, 0, 0, 0, 0, 0,1857,1858, 0, 0,1861,1862, 0, 0, - 1863,1864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1867,1868,1869,1870,1859,1860,1865,1866, 0, 0, 0, 0, - 0, 0,1871,1872,1873,1874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1877, 0,1878, 0,1879, 0,1880, 0,1881, 0,1882, 0, - 1883, 0,1884, 0,1885, 0,1886, 0,1887, 0,1888, 0, 0,1889, 0,1890, - 0,1891, 0, 0, 0, 0, 0, 0,1892,1893, 0,1894,1895, 0,1896,1897, - 0,1898,1899, 0,1900,1901, 0, 0, 0, 0, 0, 0,1876, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1902, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1904, 0,1905, 0,1906, 0,1907, 0,1908, 0,1909, 0, - 1910, 0,1911, 0,1912, 0,1913, 0,1914, 0,1915, 0, 0,1916, 0,1917, - 0,1918, 0, 0, 0, 0, 0, 0,1919,1920, 0,1921,1922, 0,1923,1924, - 0,1925,1926, 0,1927,1928, 0, 0, 0, 0, 0, 0,1903, 0, 0,1929, - 1930,1931,1932, 0, 0, 0,1933, 0, 710, 385, 724, 715, 455, 103, 186, 825, - 825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, 411, 434, 474, 500, - 649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, 692, 344, 618, 679, - 293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, 606, 660, 665, 722, - 781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, 573, 612, 487, 540, - 714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, 149, 148, 560, 589, - 648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, 542, 120, 307, 101, - 430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, 632, 355, 517, 110, - 135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, 463, 543, 763, 801, - 812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, 509, 558, 591, 610, - 726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, 353, 423, 572, 494, - 113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, 788, 117, 557, 748, - 774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, 823, 380, 765, 161, - 395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, 122, 273, 446, 727, - 305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, 501, 519, 599, 684, - 687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, 397, 444, 619, 566, - 568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, 256, 435, 383, 729, - 680, 767, 694, 295, 128, 210, 0, 0, 227, 0, 379, 0, 0, 150, 493, 525, - 544, 551, 552, 556, 783, 576, 604, 0, 661, 0, 703, 0, 0, 735, 743, 0, - 0, 0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, 169, 177, 207, 213, - 215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, 404, 441, 448, 458, - 477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, 561, 564, 569, 591, - 593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, 716, 717, 733, 735, - 777, 786, 790, 315, 869, 623, 0, 0, 102, 145, 134, 115, 129, 138, 165, 171, - 207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, 303, 308, 319, 325, - 321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, 393, 421, 424, 438, - 456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, 521, 522, 525, 526, - 528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, 647, 674, 691, 693, - 695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, 747, 754, 770, 777, - 783, 784, 786, 787, 790, 802, 825, 848, 847, 857, 55, 65, 66, 883, 892, 916, - 822, 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,1586, 0,1605, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580,1581,1583,1584, 0, - 1585,1587,1588,1589,1591, 0,1592, 0,1593,1594, 0,1595,1596, 0,1598,1599, - 1600,1601,1604,1582,1578,1590,1597, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1936, 0,1937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1939,1940, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1941,1942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1944,1943, 0,1945, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1946,1947, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1949,1950,1951,1952,1953,1954,1955, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1956,1957,1958,1960,1959,1961, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 106, 104, 107, 826, 114, 118, 119, 121, - 123, 124, 127, 125, 34, 830, 130, 131, 132, 137, 827, 35, 133, 139, 829, 142, - 143, 112, 144, 145, 924, 151, 152, 37, 157, 158, 159, 160, 38, 165, 166, 169, - 171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, 833, 468, 184, 185, - 834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, 203, 204, 204, 206, - 208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, 223, 220, 225, 224, - 230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, 249, 246, 251, 39, - 40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, 301, 264, 41, 266, - 270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282, 42, 283, 284, 285, 286, - 43, 843, 44, 289, 290, 291, 293, 934, 298, 845, 845, 621, 300, 300, 45, 852, - 894, 302, 304, 46, 306, 309, 310, 312, 316, 48, 47, 317, 846, 318, 323, 324, - 325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, 342, 343, 347, 351, - 849, 350, 348, 352, 354, 359, 850, 361, 358, 356, 49, 363, 365, 367, 364, 50, - 369, 371, 851, 376, 386, 378, 53, 381, 52, 51, 140, 141, 387, 382, 614, 78, - 388, 389, 390, 394, 392, 856, 54, 399, 396, 402, 404, 858, 405, 401, 407, 55, - 408, 409, 410, 413, 859, 415, 56, 417, 860, 418, 57, 419, 422, 424, 425, 861, - 840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, 442, 443, 864, 436, - 449, 450, 58, 454, 453, 865, 447, 460, 866, 867, 461, 466, 465, 464, 59, 467, - 470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, 488, 489, 872, 873, - 495, 497, 60, 498, 61, 61, 504, 505, 507, 508, 511, 62, 513, 874, 515, 875, - 518, 844, 520, 876, 877, 878, 63, 64, 528, 880, 879, 881, 882, 530, 531, 531, - 533, 66, 534, 67, 68, 884, 536, 538, 541, 69, 885, 549, 886, 887, 556, 559, - 70, 561, 562, 563, 888, 889, 889, 567, 71, 890, 570, 571, 72, 891, 577, 73, - 581, 579, 582, 893, 587, 74, 590, 592, 596, 75, 895, 896, 76, 897, 600, 898, - 602, 605, 607, 899, 900, 609, 901, 611, 853, 77, 615, 616, 79, 617, 252, 902, - 903, 854, 855, 621, 622, 731, 80, 627, 626, 628, 164, 629, 630, 631, 633, 904, - 632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, 905, 907, 906, 81, - 653, 654, 656, 911, 657, 908, 82, 83, 909, 910, 84, 664, 665, 666, 667, 669, - 668, 671, 670, 674, 672, 673, 675, 85, 677, 678, 86, 681, 682, 912, 685, 686, - 87, 689, 36, 913, 914, 88, 89, 696, 702, 709, 711, 915, 712, 713, 718, 719, - 917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, 744, 920, 745, 753, - 756, 757, 755, 760, 761, 921, 762, 90, 764, 922, 91, 775, 279, 780, 923, 925, - 92, 93, 785, 926, 94, 927, 787, 787, 789, 928, 792, 95, 796, 797, 798, 800, - 96, 929, 802, 804, 806, 97, 98, 807, 930, 99, 931, 932, 933, 814, 100, 816, - 817, 818, 819, 820, 821, 935, 0, 0, + 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, 0, 0, 0, 0, + 1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, 0, 0, 0, 0, + 1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1845, 0, 0, + 1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, 937, 0,1850, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938,1851,1852, 0, 0, + 1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0,1857,1858, 0, 0, + 1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870,1859,1860,1865,1866, + 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0,1879, 0,1880, 0, + 1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0,1887, 0,1888, 0, + 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0,1892,1893, 0,1894, + 1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, 0, 0, 0, 0, + 1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0,1906, 0,1907, 0, + 1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0,1914, 0,1915, 0, + 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0,1919,1920, 0,1921, + 1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, 0, 0, 0, 0, + 1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, 710, 385, 724, 715, + 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, 663, 676, 688, 738, + 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, 810, 275, 462, 658, + 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, 368, 414, 481, 527, + 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, 811, 701, 233, 299, + 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, 594, 766, 167, 613, + 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, 313, 496, 518, 174, + 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, 424, 732, 428, 349, + 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, 193, 245, 297, 374, + 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, 337, 366, 459, 476, + 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, 683, 697, 292, 311, + 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, 608, 752, 778, 782, + 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, 479, 523, 655, 737, + 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, 791, 136, 340, 769, + 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, 377, 391, 406, 432, + 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, 659, 772, 805, 813, + 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, 153, 288, 346, 578, + 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, 227, 0, 379, 0, + 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, 661, 0, 703, 0, + 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, 118, 127, 130, 166, + 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, 335, 369, 375, 381, + 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, 549, 550, 554, 555, + 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, 690, 695, 705, 706, + 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, 102, 145, 134, 115, + 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, 250, 254, 294, 296, + 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, 370, 379, 388, 389, + 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, 493, 507, 512, 514, + 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, 591, 597, 607, 637, + 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, 709, 717, 728, 736, + 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, 847, 857, 55, 65, + 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575,1576,1577,1579,1580, + 1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0,1593,1594, 0,1595, + 1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,1948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1949,1950,1951,1952,1953,1954, + 1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,1956,1957,1958,1960,1959,1961, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 104, 107, 826, + 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, 132, 137, 827, 35, + 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, 157, 158, 159, 160, + 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, 181, 182, 182, 182, + 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, 197, 199, 200, 201, + 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, 153, 234, 221, 222, + 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, 836, 837, 247, 248, + 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, 261, 839, 262, 263, + 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, 278, 281, 282, 42, + 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, 298, 845, 845, 621, + 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, 316, 48, 47, 317, + 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, 335, 336, 338, 339, + 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, 358, 356, 49, 363, + 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, 52, 51, 140, 141, + 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, 396, 402, 404, 858, + 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, 860, 418, 57, 419, + 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, 437, 441, 438, 439, + 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, 866, 867, 461, 466, + 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, 483, 485, 486, 871, + 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, 507, 508, 511, 62, + 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, 528, 880, 879, 881, + 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, 541, 69, 885, 549, + 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, 71, 890, 570, 571, + 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, 596, 75, 895, 896, + 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, 853, 77, 615, 616, + 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, 626, 628, 164, 629, + 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, 638, 643, 644, 645, + 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, 909, 910, 84, 664, + 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, 677, 678, 86, 681, + 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, 702, 709, 711, 915, + 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, 918, 919, 739, 742, + 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, 764, 922, 91, 775, + 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, 789, 928, 792, 95, + 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, 930, 99, 931, 932, + 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, }; static const int16_t _hb_ucd_i16[92] = @@ -4400,12 +4403,12 @@ _hb_ucd_i16[92] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114110u?_hb_ucd_u8[6800+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114110u?_hb_ucd_u8[6808+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[8792+(((_hb_ucd_u8[8236+(((_hb_ucd_u8[7776+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[8800+(((_hb_ucd_u8[8244+(((_hb_ucd_u8[7784+(((_hb_ucd_u8[7432+(((_hb_ucd_u8[7186+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -4415,24 +4418,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9684+(((_hb_ucd_u8[9452+(((_hb_ucd_u8[9356+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9692+(((_hb_ucd_u8[9460+(((_hb_ucd_u8[9364+(((_hb_ucd_b4(9300+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918000u?_hb_ucd_u8[11118+(((_hb_ucd_u16[4024+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10382+(((_hb_ucd_u8[9932+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; + return u<918000u?_hb_ucd_u8[11126+(((_hb_ucd_u16[4040+(((_hb_ucd_u16[2048+(((_hb_ucd_u8[10390+(((_hb_ucd_u8[9940+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[6728+(((_hb_ucd_u8[13944+(((_hb_ucd_u8[13562+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[6748+(((_hb_ucd_u8[13952+(((_hb_ucd_u8[13570+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #else static const uint8_t -_hb_ucd_u8[13370] = +_hb_ucd_u8[13386] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 7, 11, 12, 12, 12, 13, @@ -4440,7 +4443,7 @@ _hb_ucd_u8[13370] = 7, 24, 21, 21, 21, 25, 26, 27, 21, 28, 29, 30, 31, 32, 33, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 21, 36, - 7, 7, 7, 7, 35, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 7, 7, 7, 7, 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -4462,7 +4465,7 @@ _hb_ucd_u8[13370] = 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 37, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 38, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, @@ -4503,8 +4506,9 @@ _hb_ucd_u8[13370] = 34,192,193,111,111,111,111,111,130,194,195,111, 34,196,111,111, 67, 67,197, 67, 67,111, 67,198, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67,199,111,111,111,111,111,111,111,111, - 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,111,111,111, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111,111,111,111, + 34, 34, 34, 34, 34, 34, 34, 34,111,111,111,111,111,111,111,111, 200,111,188,188,111,111,111,111,111,111,111,111,111,111,111,111, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, @@ -4967,7 +4971,7 @@ _hb_ucd_u8[13370] = 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 65, 66, 67, 31, 31, 31, 31, 68, 31, 31, 31, 31, 31, 31, 31, 31, 69, 70, 71, 17, 17, 72, 73, 31, 74, 75, 76, 77, 78, 79, 31, 80, 81, 17, 82, 17, 17, - 17, 17, 31, 31, 23, 23, 23, 23, 23, 23, 31, 31, 31, 31, 31, 31, + 17, 17, 31, 31, 23, 23, 23, 23, 23, 23, 23, 83, 31, 31, 31, 31, 23, 83, 31, 31, 23, 23, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 84, 0, 0, 1, 0, 1, 2, 3, 0, 1, 2, 3, @@ -5597,12 +5601,12 @@ _hb_ucd_i16[92] = static inline uint_fast8_t _hb_ucd_gc (unsigned u) { - return u<1114112u?_hb_ucd_u8[5080+(((_hb_ucd_u8[1152+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; + return u<1114112u?_hb_ucd_u8[5096+(((_hb_ucd_u8[1168+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; } static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[7038+(((_hb_ucd_u8[6482+(((_hb_ucd_u8[6022+(((_hb_ucd_u8[5670+(((_hb_ucd_u8[5424+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[7054+(((_hb_ucd_u8[6498+(((_hb_ucd_u8[6038+(((_hb_ucd_u8[5686+(((_hb_ucd_u8[5440+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -5612,17 +5616,17 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7930+(((_hb_ucd_u8[7698+(((_hb_ucd_u8[7602+(((_hb_ucd_b4(7538+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7946+(((_hb_ucd_u8[7714+(((_hb_ucd_u8[7618+(((_hb_ucd_b4(7554+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918016u?_hb_ucd_u8[11228+(((_hb_ucd_u8[10264+(((_hb_ucd_u8[9276+(((_hb_ucd_u8[8596+(((_hb_ucd_u8[8292+(((_hb_ucd_u8[8178+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; + return u<918016u?_hb_ucd_u8[11244+(((_hb_ucd_u8[10280+(((_hb_ucd_u8[9292+(((_hb_ucd_u8[8612+(((_hb_ucd_u8[8308+(((_hb_ucd_u8[8194+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[1608+(((_hb_ucd_u8[12570+(((_hb_ucd_u8[12188+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[1608+(((_hb_ucd_u8[12586+(((_hb_ucd_u8[12204+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #endif -- cgit v1.2.3 From f15fe524423c61dede0b35a148ca917b3746935f Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 09:45:51 -0400 Subject: [Unicode 15.1] Update the Arabic table --- src/hb-ot-shaper-arabic-table.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-shaper-arabic-table.hh b/src/hb-ot-shaper-arabic-table.hh index d7670f2f9..336a1391e 100644 --- a/src/hb-ot-shaper-arabic-table.hh +++ b/src/hb-ot-shaper-arabic-table.hh @@ -6,10 +6,10 @@ * * on files with these headers: * - * # ArabicShaping-15.0.0.txt - * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] - * # Blocks-15.0.0.txt - * # Date: 2022-01-28, 20:58:00 GMT [KW] + * # ArabicShaping-15.1.0.txt + * # Date: 2023-01-05 + * # Blocks-15.1.0.txt + * # Date: 2023-07-28, 15:47:20 GMT * UnicodeData.txt does not have a header. */ -- cgit v1.2.3 From f485b6a9c05b852cafea890069ce87bd5a76c20e Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 09:49:29 -0400 Subject: [Unicode 15.1] Update the Arabic joining script list --- src/hb-ot-shaper-arabic-joining-list.hh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-shaper-arabic-joining-list.hh b/src/hb-ot-shaper-arabic-joining-list.hh index c7b57820a..a5a7b84af 100644 --- a/src/hb-ot-shaper-arabic-joining-list.hh +++ b/src/hb-ot-shaper-arabic-joining-list.hh @@ -6,10 +6,10 @@ * * on files with these headers: * - * # ArabicShaping-15.0.0.txt - * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] - * # Scripts-15.0.0.txt - * # Date: 2022-04-26, 23:15:02 GMT + * # ArabicShaping-15.1.0.txt + * # Date: 2023-01-05 + * # Scripts-15.1.0.txt + * # Date: 2023-07-28, 16:01:07 GMT */ #ifndef HB_OT_SHAPER_ARABIC_JOINING_LIST_HH -- cgit v1.2.3 From 6ed6ccac4c6f650ef6abba3929bc48dff12e328d Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 09:54:21 -0400 Subject: [Unicode 15.1] Update the USE table --- src/hb-ot-shaper-use-table.hh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/hb-ot-shaper-use-table.hh b/src/hb-ot-shaper-use-table.hh index 66fba6b92..d581b65c0 100644 --- a/src/hb-ot-shaper-use-table.hh +++ b/src/hb-ot-shaper-use-table.hh @@ -6,18 +6,18 @@ * * on files with these headers: * - * # IndicSyllabicCategory-15.0.0.txt - * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] - * # IndicPositionalCategory-15.0.0.txt - * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] - * # ArabicShaping-15.0.0.txt - * # Date: 2022-02-14, 18:50:00 GMT [KW, RP] - * # DerivedCoreProperties-15.0.0.txt - * # Date: 2022-08-05, 22:17:05 GMT - * # Blocks-15.0.0.txt - * # Date: 2022-01-28, 20:58:00 GMT [KW] - * # Scripts-15.0.0.txt - * # Date: 2022-04-26, 23:15:02 GMT + * # IndicSyllabicCategory-15.1.0.txt + * # Date: 2023-01-05 + * # IndicPositionalCategory-15.1.0.txt + * # Date: 2023-01-05 + * # ArabicShaping-15.1.0.txt + * # Date: 2023-01-05 + * # DerivedCoreProperties-15.1.0.txt + * # Date: 2023-08-07, 15:21:24 GMT + * # Blocks-15.1.0.txt + * # Date: 2023-07-28, 15:47:20 GMT + * # Scripts-15.1.0.txt + * # Date: 2023-07-28, 16:01:07 GMT * # Override values For Indic_Syllabic_Category * # Not derivable * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17 -- cgit v1.2.3 From d8d4a192bdd0b3e0307046dc25ff813850a910c9 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 10:00:07 -0400 Subject: Update IANA Language Subtag Registry to 2023-08-02 --- src/hb-ot-tag-table.hh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-tag-table.hh b/src/hb-ot-tag-table.hh index 9394b90ee..032a7c866 100644 --- a/src/hb-ot-tag-table.hh +++ b/src/hb-ot-tag-table.hh @@ -6,8 +6,8 @@ * * on files with these headers: * - * - * File-Date: 2022-03-02 + * + * File-Date: 2023-08-02 */ #ifndef HB_OT_TAG_TABLE_HH @@ -257,7 +257,7 @@ static const LangTag ot_languages3[] = { {HB_TAG('a','i','i',' '), HB_TAG('S','Y','R',' ')}, /* Assyrian Neo-Aramaic -> Syriac */ /*{HB_TAG('a','i','o',' '), HB_TAG('A','I','O',' ')},*/ /* Aiton */ {HB_TAG('a','i','w',' '), HB_TAG('A','R','I',' ')}, /* Aari */ - {HB_TAG('a','j','p',' '), HB_TAG('A','R','A',' ')}, /* South Levantine Arabic -> Arabic */ + {HB_TAG('a','j','p',' '), HB_TAG('A','R','A',' ')}, /* South Levantine Arabic (retired code) -> Arabic */ {HB_TAG('a','j','t',' '), HB_TAG('A','R','A',' ')}, /* Judeo-Tunisian Arabic (retired code) -> Arabic */ {HB_TAG('a','k','b',' '), HB_TAG('A','K','B',' ')}, /* Batak Angkola */ {HB_TAG('a','k','b',' '), HB_TAG('B','T','K',' ')}, /* Batak Angkola -> Batak */ @@ -269,7 +269,7 @@ static const LangTag ot_languages3[] = { /*{HB_TAG('a','n','g',' '), HB_TAG('A','N','G',' ')},*/ /* Old English (ca. 450-1100) -> Anglo-Saxon */ {HB_TAG('a','o','a',' '), HB_TAG('C','P','P',' ')}, /* Angolar -> Creoles */ {HB_TAG('a','p','a',' '), HB_TAG('A','T','H',' ')}, /* Apache [collection] -> Athapaskan */ - {HB_TAG('a','p','c',' '), HB_TAG('A','R','A',' ')}, /* North Levantine Arabic -> Arabic */ + {HB_TAG('a','p','c',' '), HB_TAG('A','R','A',' ')}, /* Levantine Arabic -> Arabic */ {HB_TAG('a','p','d',' '), HB_TAG('A','R','A',' ')}, /* Sudanese Arabic -> Arabic */ {HB_TAG('a','p','j',' '), HB_TAG('A','T','H',' ')}, /* Jicarilla Apache -> Athapaskan */ {HB_TAG('a','p','k',' '), HB_TAG('A','T','H',' ')}, /* Kiowa Apache -> Athapaskan */ @@ -1211,6 +1211,7 @@ static const LangTag ot_languages3[] = { {HB_TAG('p','p','a',' '), HB_TAG('B','A','G',' ')}, /* Pao (retired code) -> Baghelkhandi */ {HB_TAG('p','r','e',' '), HB_TAG('C','P','P',' ')}, /* Principense -> Creoles */ /*{HB_TAG('p','r','o',' '), HB_TAG('P','R','O',' ')},*/ /* Old Provençal (to 1500) -> Provençal / Old Provençal */ + {HB_TAG('p','r','p',' '), HB_TAG('G','U','J',' ')}, /* Parsi (retired code) -> Gujarati */ {HB_TAG('p','r','s',' '), HB_TAG('D','R','I',' ')}, /* Dari */ {HB_TAG('p','r','s',' '), HB_TAG('F','A','R',' ')}, /* Dari -> Persian */ {HB_TAG('p','s','e',' '), HB_TAG('M','L','Y',' ')}, /* Central Malay -> Malay */ @@ -1439,7 +1440,7 @@ static const LangTag ot_languages3[] = { {HB_TAG('t','c','h',' '), HB_TAG('C','P','P',' ')}, /* Turks And Caicos Creole English -> Creoles */ {HB_TAG('t','c','p',' '), HB_TAG('Q','I','N',' ')}, /* Tawr Chin -> Chin */ {HB_TAG('t','c','s',' '), HB_TAG('C','P','P',' ')}, /* Torres Strait Creole -> Creoles */ - {HB_TAG('t','c','y',' '), HB_TAG('T','U','L',' ')}, /* Tulu -> Tumbuka */ + {HB_TAG('t','c','y',' '), HB_TAG('T','U','L',' ')}, /* Tulu */ {HB_TAG('t','c','z',' '), HB_TAG('Q','I','N',' ')}, /* Thado Chin -> Chin */ /*{HB_TAG('t','d','d',' '), HB_TAG('T','D','D',' ')},*/ /* Tai Nüa -> Dehong Dai */ {HB_TAG('t','d','x',' '), HB_TAG('M','L','G',' ')}, /* Tandroy-Mahafaly Malagasy -> Malagasy */ @@ -1495,8 +1496,8 @@ static const LangTag ot_languages3[] = { {HB_TAG('t','t','q',' '), HB_TAG('T','M','H',' ')}, /* Tawallammat Tamajaq -> Tamashek */ {HB_TAG('t','t','q',' '), HB_TAG('B','B','R',' ')}, /* Tawallammat Tamajaq -> Berber */ {HB_TAG('t','u','a',' '), HB_TAG_NONE }, /* Wiarumus != Turoyo Aramaic */ - {HB_TAG('t','u','l',' '), HB_TAG_NONE }, /* Tula != Tumbuka */ -/*{HB_TAG('t','u','m',' '), HB_TAG('T','U','M',' ')},*/ /* Tumbuka -> Tulu */ + {HB_TAG('t','u','l',' '), HB_TAG_NONE }, /* Tula != Tulu */ +/*{HB_TAG('t','u','m',' '), HB_TAG('T','U','M',' ')},*/ /* Tumbuka */ {HB_TAG('t','u','u',' '), HB_TAG('A','T','H',' ')}, /* Tututni -> Athapaskan */ {HB_TAG('t','u','v',' '), HB_TAG_NONE }, /* Turkana != Tuvin */ {HB_TAG('t','u','y',' '), HB_TAG('K','A','L',' ')}, /* Tugen -> Kalenjin */ @@ -1581,6 +1582,7 @@ static const LangTag ot_languages3[] = { {HB_TAG('y','b','a',' '), HB_TAG_NONE }, /* Yala != Yoruba */ {HB_TAG('y','b','b',' '), HB_TAG('B','M','L',' ')}, /* Yemba -> Bamileke */ {HB_TAG('y','b','d',' '), HB_TAG('A','R','K',' ')}, /* Yangbye (retired code) -> Rakhine */ + {HB_TAG('y','c','r',' '), HB_TAG_NONE }, /* Yilan Creole != Y-Cree */ {HB_TAG('y','d','d',' '), HB_TAG('J','I','I',' ')}, /* Eastern Yiddish -> Yiddish */ /*{HB_TAG('y','g','p',' '), HB_TAG('Y','G','P',' ')},*/ /* Gepo */ {HB_TAG('y','i','h',' '), HB_TAG('J','I','I',' ')}, /* Western Yiddish -> Yiddish */ @@ -1602,6 +1604,7 @@ static const LangTag ot_languages3[] = { {HB_TAG('z','g','n',' '), HB_TAG('Z','H','A',' ')}, /* Guibian Zhuang -> Zhuang */ {HB_TAG('z','h','d',' '), HB_TAG('Z','H','A',' ')}, /* Dai Zhuang -> Zhuang */ {HB_TAG('z','h','n',' '), HB_TAG('Z','H','A',' ')}, /* Nong Zhuang -> Zhuang */ + {HB_TAG('z','k','b',' '), HB_TAG('K','H','A',' ')}, /* Koibal (retired code) -> Khakass */ {HB_TAG('z','l','j',' '), HB_TAG('Z','H','A',' ')}, /* Liujiang Zhuang -> Zhuang */ {HB_TAG('z','l','m',' '), HB_TAG('M','L','Y',' ')}, /* Malay */ {HB_TAG('z','l','n',' '), HB_TAG('Z','H','A',' ')}, /* Lianshan Zhuang -> Zhuang */ -- cgit v1.2.3 From c03e4c10a4bcab59b447a3d5416f26191c8af788 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 10:06:24 -0400 Subject: [Unicode 15.1] Update emoji table and cluster test --- src/hb-unicode-emoji-table.hh | 6 +- .../shape/data/in-house/tests/emoji-clusters.tests | 301 +++++++++++++++++++++ 2 files changed, 304 insertions(+), 3 deletions(-) diff --git a/src/hb-unicode-emoji-table.hh b/src/hb-unicode-emoji-table.hh index 13b1c4b1d..e607e8ca8 100644 --- a/src/hb-unicode-emoji-table.hh +++ b/src/hb-unicode-emoji-table.hh @@ -7,13 +7,13 @@ * on file with this header: * * # emoji-data.txt - * # Date: 2022-08-02, 00:26:10 GMT - * # © 2022 Unicode®, Inc. + * # Date: 2023-02-01, 02:22:54 GMT + * # © 2023 Unicode®, Inc. * # Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. * # For terms of use, see https://www.unicode.org/terms_of_use.html * # * # Emoji Data for UTS #51 - * # Used with Emoji Version 15.0 and subsequent minor revisions (if any) + * # Used with Emoji Version 15.1 and subsequent minor revisions (if any) * # * # For documentation and usage, see https://www.unicode.org/reports/tr51 */ diff --git a/test/shape/data/in-house/tests/emoji-clusters.tests b/test/shape/data/in-house/tests/emoji-clusters.tests index 82511a366..817ee2a96 100644 --- a/test/shape/data/in-house/tests/emoji-clusters.tests +++ b/test/shape/data/in-house/tests/emoji-clusters.tests @@ -2,6 +2,10 @@ ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F636,200D,1F32B,FE0F;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F636,200D,1F32B;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F62E,200D,1F4A8;[1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F642,200D,2194,FE0F;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F642,200D,2194;[1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F642,200D,2195,FE0F;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F642,200D,2195;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F635,200D,1F4AB;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2639,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2620,FE0F;[1=0|1=0] @@ -1695,6 +1699,66 @@ ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2640;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2640;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,27A1,FE0F;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,27A1;[1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FB,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FC,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FD,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FE,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6B6,1F3FF,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FB;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FC;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CD,1F3FD;[1=0|1=0] @@ -1753,60 +1817,228 @@ ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2640;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2640;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,27A1,FE0F;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,27A1;[1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FB,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FC,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FD,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FE,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9CE,1F3FF,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9AF;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9AF;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9AF;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9AF;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9AF;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9AF;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9AF;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9AF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9AF,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9BC;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9BC;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9BC;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9BC;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9BC;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9BC;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9BC;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9BC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9BC,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9BD;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9BD;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FB,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FC,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FD,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FE,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,1F3FF,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9BD;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9BD;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FB,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FC,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FD,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FE,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F468,1F3FF,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9BD;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9BD;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9BD;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FB,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FC,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FD,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FE,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9BD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,1F3FF,200D,1F9BD,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD;[1=0|1=0] @@ -1836,6 +2068,66 @@ ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2640;[1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2640,FE0F;[1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2640;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,27A1,FE0F;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,27A1;[1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,27A1;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2640,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2640,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2640,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2640,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FB,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FC,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FD,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FE,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2642,FE0F,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2642,200D,27A1,FE0F;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2642,FE0F,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3C3,1F3FF,200D,2642,200D,27A1;[1=0|1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F483,1F3FB;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F483,1F3FC;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F483,1F3FD;[1=0|1=0] @@ -2860,6 +3152,10 @@ ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F467,200D,1F466;[1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F469,200D,1F467,200D,1F467;[1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5E3,FE0F;[1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9D1,200D,1F9D2;[1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9D1,200D,1F9D2,200D,1F9D2;[1=0|1=0|1=0|1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9D2;[1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F9D1,200D,1F9D2,200D,1F9D2;[1=0|1=0|1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F415,200D,1F9BA;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F408,200D,2B1B;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F43F,FE0F;[1=0|1=0] @@ -2867,11 +3163,14 @@ ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F43B,200D,2744;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F54A,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F426,200D,2B1B;[1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F426,200D,1F525;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F577,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F578,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3F5,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2618,FE0F;[1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F34B,200D,1F7E9;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F336,FE0F;[1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F344,200D,1F7EB;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F37D,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5FA,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F3D4,FE0F;[1=0|1=0] @@ -2976,6 +3275,8 @@ ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2699,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F5DC,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2696,FE0F;[1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26D3,FE0F,200D,1F4A5;[1=0|1=0|1=0|1=0] +../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26D3,200D,1F4A5;[1=0|1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;26D3,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;2697,FE0F;[1=0|1=0] ../fonts/AdobeBlank2.ttf;--no-glyph-names --no-positions --font-funcs=ot;1F6CF,FE0F;[1=0|1=0] -- cgit v1.2.3 From f318e104be4c2c58daf92a792b96c6a9974201a1 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 10:20:14 -0400 Subject: [Unicode 15.1] Update the Indic table --- src/hb-ot-shaper-indic-table.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/hb-ot-shaper-indic-table.cc b/src/hb-ot-shaper-indic-table.cc index d9fb0510e..d9899a633 100644 --- a/src/hb-ot-shaper-indic-table.cc +++ b/src/hb-ot-shaper-indic-table.cc @@ -6,12 +6,12 @@ * * on files with these headers: * - * # IndicSyllabicCategory-15.0.0.txt - * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] - * # IndicPositionalCategory-15.0.0.txt - * # Date: 2022-05-26, 02:18:00 GMT [KW, RP] - * # Blocks-15.0.0.txt - * # Date: 2022-01-28, 20:58:00 GMT [KW] + * # IndicSyllabicCategory-15.1.0.txt + * # Date: 2023-01-05 + * # IndicPositionalCategory-15.1.0.txt + * # Date: 2023-01-05 + * # Blocks-15.1.0.txt + * # Date: 2023-07-28, 15:47:20 GMT */ #include "hb.hh" -- cgit v1.2.3 From c6d53ab570e564b8e0226a234d0fd307c297738b Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 10:21:11 -0400 Subject: [Unicode 15.1] Update the vowel constraint table --- src/hb-ot-shaper-vowel-constraints.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-shaper-vowel-constraints.cc b/src/hb-ot-shaper-vowel-constraints.cc index e76b554b0..d1ed89459 100644 --- a/src/hb-ot-shaper-vowel-constraints.cc +++ b/src/hb-ot-shaper-vowel-constraints.cc @@ -10,8 +10,8 @@ * # Date: 2015-03-12, 21:17:00 GMT [AG] * # Date: 2019-11-08, 23:22:00 GMT [AG] * - * # Scripts-15.0.0.txt - * # Date: 2022-04-26, 23:15:02 GMT + * # Scripts-15.1.0.txt + * # Date: 2023-07-28, 16:01:07 GMT */ #include "hb.hh" -- cgit v1.2.3 From c459b8a51acf96e0d83d9b961ee3409fb5849389 Mon Sep 17 00:00:00 2001 From: David Corbett Date: Sat, 16 Sep 2023 10:27:07 -0400 Subject: [Unicode 15.1] Add tests --- test/api/test-unicode.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/api/test-unicode.c b/test/api/test-unicode.c index 857308b33..f16eb531b 100644 --- a/test/api/test-unicode.c +++ b/test/api/test-unicode.c @@ -273,6 +273,9 @@ static const test_pair_t general_category_tests_more[] = /* Unicode-15.0 character additions */ { 0x0CF3, HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK }, + /* Unicode-15.1 character additions */ + { 0x31EF, HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL }, + { 0x111111, HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED } }; -- cgit v1.2.3 From eab4e07d6c7acce1f9eb26963c9d4d0d00b75ce2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 10:22:37 +0000 Subject: Bump github/codeql-action from 2.21.5 to 2.21.7 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.21.5 to 2.21.7. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/00e563ead9f72a8461b24876bee2d0c2e8bd2ee8...04daf014b50eaf774287bf3f0f1869d4b4c4b913) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 16b81766e..5150630c6 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@00e563ead9f72a8461b24876bee2d0c2e8bd2ee8 # v2.21.5 + uses: github/codeql-action/upload-sarif@04daf014b50eaf774287bf3f0f1869d4b4c4b913 # v2.21.7 with: sarif_file: results.sarif -- cgit v1.2.3 From 0967a3e24ab5d79cc55dbe224652d8aabd942def Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Mon, 18 Sep 2023 21:18:27 +0300 Subject: 8.2.1 --- NEWS | 6 ++++++ configure.ac | 2 +- meson.build | 2 +- src/hb-version.h | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 35e9eefdc..626dafe9a 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,9 @@ +Overview of changes leading to 8.2.1 +Monday, September 18, 2023 +==================================== +- Unicode 15.1 support. + + Overview of changes leading to 8.2.0 Friday, September 8, 2023 ==================================== diff --git a/configure.ac b/configure.ac index 6de79ae08..eece69107 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [8.2.0], + [8.2.1], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/meson.build b/meson.build index 3bc98e2be..324d1dd05 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('harfbuzz', 'c', 'cpp', meson_version: '>= 0.55.0', - version: '8.2.0', + version: '8.2.1', default_options: [ 'cpp_eh=none', # Just to support msvc, we are passing -fno-exceptions also anyway # 'cpp_rtti=false', # Do NOT enable, wraps inherit it and ICU needs RTTI diff --git a/src/hb-version.h b/src/hb-version.h index 902d51ec0..73fa16cd8 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -53,14 +53,14 @@ HB_BEGIN_DECLS * * The micro component of the library version available at compile-time. */ -#define HB_VERSION_MICRO 0 +#define HB_VERSION_MICRO 1 /** * HB_VERSION_STRING: * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "8.2.0" +#define HB_VERSION_STRING "8.2.1" /** * HB_VERSION_ATLEAST: -- cgit v1.2.3 From 152448881fffbe46ae6ffb884351b86dcc7354d8 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 12:40:30 -0700 Subject: [instancer] add struct definition item_variations_t And struct delta_row_encoding_t --- src/hb-ot-layout-common.hh | 141 +++++++++++++++++++++++++++++++++++++++++++++ src/hb-ot-var-common.hh | 47 +++++++++++++++ 2 files changed, 188 insertions(+) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 2cc509802..744684ebb 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2300,6 +2300,147 @@ static inline bool ClassDef_serialize (hb_serialize_context_t *c, * Item Variation Store */ +/* ported from fonttools (class _Encoding) */ +struct delta_row_encoding_t +{ + /* each byte represents a region, value is one of 0/1/2/4, which means bytes + * needed for this region */ + hb_vector_t chars; + unsigned width; + unsigned columns; + unsigned overhead; + hb_vector_t*> items; + + delta_row_encoding_t () = default; + delta_row_encoding_t (hb_vector_t&& chars_, + const hb_vector_t* row = nullptr) : + delta_row_encoding_t () + + { + chars = chars_; + width = get_width (); + columns = get_columns (); + overhead = get_chars_overhead (columns); + if (row) items.push (row); + } + + bool is_empty () const + { return !items; } + + static hb_vector_t get_row_chars (const hb_vector_t& row) + { + hb_vector_t ret; + if (!ret.alloc (row.length)) return ret; + + bool long_words = false; + + /* 0/1/2 byte encoding */ + for (int v: row) + { + if (v == 0) + ret.push (0); + else if (v > 32767 || v < -32768) + { + long_words = true; + break; + } + else if (v > 127 || v < -128) + ret.push (2); + else + ret.push (1); + } + + if (!long_words) + return ret; + + /* redo, 0/2/4 bytes encoding */ + ret.reset (); + for (int v: row) + { + if (v == 0) + ret.push (0); + else if (v > 32767 || v < -32768) + ret.push (4); + else + ret.push (2); + } + return ret; + } + + inline unsigned get_width () + { + unsigned ret = + hb_iter (chars) + | hb_reduce (hb_add, 0u) + ; + return ret; + } + + unsigned get_columns () + { + unsigned cols = 0; + unsigned i = 1; + for (auto v : chars) + { + if (v) + cols |= i; + i <<= 1; + } + return cols; + } + + static inline unsigned get_chars_overhead (unsigned cols) + { return 10 + hb_popcount (cols) * 2; } + + unsigned get_gain () const + { + int count = items.length; + return hb_max (0, (int) overhead - count); + } + + int gain_from_merging (const delta_row_encoding_t& other_encoding) const + { + int combined_width = 0; + for (unsigned i = 0; i < chars.length; i++) + combined_width += hb_max (chars.arrayZ[i], other_encoding.chars.arrayZ[i]); + + int combined_columns = columns | other_encoding.columns; + int combined_overhead = get_chars_overhead (combined_columns); + int combined_gain = (int) overhead + (int) other_encoding.overhead - combined_overhead + - (combined_width - (int) width) * items.length + - (combined_width - (int) other_encoding.width) * other_encoding.items.length; + + return combined_gain; + } + + static int cmp (const void *pa, const void *pb) + { + const delta_row_encoding_t *a = (const delta_row_encoding_t *)pa; + const delta_row_encoding_t *b = (const delta_row_encoding_t *)pb; + + int gain_a = a->get_gain (); + int gain_b = b->get_gain (); + + if (gain_a != gain_b) + return gain_a - gain_b; + + return (b->chars).as_array ().cmp ((a->chars).as_array ()); + } + + static int cmp_width (const void *pa, const void *pb) + { + const delta_row_encoding_t *a = (const delta_row_encoding_t *)pa; + const delta_row_encoding_t *b = (const delta_row_encoding_t *)pb; + + if (a->width != b->width) + return (int) a->width - (int) b->width; + + return (b->chars).as_array ().cmp ((a->chars).as_array ()); + } + + bool add_row (const hb_vector_t* row) + { return items.push (row); } +}; + struct VarRegionAxis { float evaluate (int coord) const diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 23d7f7cc3..d6bf44c1f 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1705,6 +1705,53 @@ struct TupleVariationData DEFINE_SIZE_MIN (4); }; +using tuple_variations_t = TupleVariationData::tuple_variations_t; +struct item_variations_t +{ + using region_t = const hb_hashmap_t*; + private: + /* each subtable is decompiled into a tuple_variations_t, in which all tuples + * have the same num of deltas (rows) */ + hb_vector_t vars; + + /* original region list, decompiled from item varstore, used when rebuilding + * region list after instantiation */ + hb_vector_t> orig_region_list; + + /* region list: vector of Regions, maintain the original order for the regions + * that existed before instantiate (), append the new regions at the end. + * Regions are stored in each tuple already, save pointers only. + * When converting back to item varstore, unused regions will be pruned */ + hb_vector_t region_list; + + /* region -> idx map after instantiation and pruning unused regions */ + hb_hashmap_t region_map; + + /* all delta rows after instantiation */ + hb_vector_t> delta_rows; + /* final optimized vector of encoding objects used to assemble the varstore */ + hb_vector_t encodings; + + /* old varidxes -> new var_idxes map */ + hb_map_t varidx_map; + + /* has long words */ + bool has_long = false; + + public: + bool has_long_word () const + { return has_long; } + + const hb_vector_t& get_region_list () const + { return region_list; } + + const hb_vector_t& get_vardata_encodings () const + { return encodings; } + + const hb_map_t& get_varidx_map () const + { return varidx_map; } +}; + } /* namespace OT */ -- cgit v1.2.3 From 5f058a93388caa0ce5c6d3800d7dbf97e3273dc8 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 12:55:04 -0700 Subject: [instancer] add create_from_item_varstore () method --- src/hb-ot-layout-common.hh | 63 +++++++++++++++++++++++++++++++++++++++++++++- src/hb-ot-var-common.hh | 62 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 744684ebb..2f73c5816 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2552,6 +2552,45 @@ struct VarRegionList return_trace (true); } + bool get_var_region (unsigned region_index, + const hb_map_t& axes_old_index_tag_map, + hb_hashmap_t& axis_tuples /* OUT */) const + { + if (region_index >= regionCount) return false; + const VarRegionAxis* axis_region = axesZ.arrayZ + (region_index * axisCount); + for (unsigned i = 0; i < axisCount; i++) + { + hb_tag_t *axis_tag; + if (!axes_old_index_tag_map.has (i, &axis_tag)) + return false; + + float min_val = axis_region->startCoord.to_float (); + float def_val = axis_region->peakCoord.to_float (); + float max_val = axis_region->endCoord.to_float (); + + if (def_val != 0.f) + axis_tuples.set (*axis_tag, Triple (min_val, def_val, max_val)); + axis_region++; + } + return !axis_tuples.in_error (); + } + + bool get_var_regions (const hb_map_t& axes_old_index_tag_map, + hb_vector_t>& regions /* OUT */) const + { + if (!regions.alloc (regionCount)) + return false; + + for (unsigned i = 0; i < regionCount; i++) + { + hb_hashmap_t axis_tuples; + if (!get_var_region (i, axes_old_index_tag_map, axis_tuples)) + return false; + regions.push (std::move (axis_tuples)); + } + return !regions.in_error (); + } + unsigned int get_size () const { return min_size + VarRegionAxis::static_size * axisCount * regionCount; } public: @@ -2571,6 +2610,9 @@ struct VarData unsigned int get_region_index_count () const { return regionIndices.len; } + + unsigned get_region_index (unsigned i) const + { return i >= regionIndices.len ? -1 : regionIndices[i]; } unsigned int get_row_size () const { return (wordCount () + regionIndices.len) * (longWords () ? 2 : 1); } @@ -2766,13 +2808,15 @@ struct VarData } } - protected: + public: const HBUINT8 *get_delta_bytes () const { return &StructAfter (regionIndices); } + protected: HBUINT8 *get_delta_bytes () { return &StructAfter (regionIndices); } + public: int32_t get_item_delta_fast (unsigned int item, unsigned int region, const HBUINT8 *delta_bytes, unsigned row_size) const { @@ -2845,6 +2889,7 @@ struct VarData struct VariationStore { + friend struct item_variations_t; using cache_t = VarRegionList::cache_t; cache_t *create_cache () const @@ -3044,6 +3089,22 @@ struct VariationStore return dataSets.len; } + const VarData& get_sub_table (unsigned i) const + { +#ifdef HB_NO_VAR + return Null (VarData); +#endif + return this+dataSets[i]; + } + + const VarRegionList& get_region_list () const + { +#ifdef HB_NO_VAR + return Null (VarRegionList); +#endif + return this+regions; + } + protected: HBUINT16 format; Offset32To regions; diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index d6bf44c1f..4a3eb03eb 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1171,6 +1171,45 @@ struct TupleVariationData return true; } + bool create_from_item_var_data (const VarData &var_data, + const hb_vector_t>& regions, + const hb_map_t& axes_old_index_tag_map) + { + /* NULL offset, to keep original varidx valid, just return */ + if (&var_data == &Null (VarData)) + return true; + + unsigned num_regions = var_data.get_region_index_count (); + if (!tuple_vars.alloc (num_regions)) return false; + + unsigned item_count = var_data.get_item_count (); + unsigned row_size = var_data.get_row_size (); + const HBUINT8 *delta_bytes = var_data.get_delta_bytes (); + + for (unsigned r = 0; r < num_regions; r++) + { + /* In VarData, deltas are organized in rows, convert them into + * column(region) based tuples, resize deltas_x first */ + tuple_delta_t tuple; + if (!tuple.deltas_x.resize (item_count, false) || + !tuple.indices.resize (item_count, false)) + return false; + + for (unsigned i = 0; i < item_count; i++) + { + tuple.indices.arrayZ[i] = true; + tuple.deltas_x.arrayZ[i] = var_data.get_item_delta_fast (i, r, delta_bytes, row_size); + } + + unsigned region_index = var_data.get_region_index (r); + if (region_index >= regions.length) return false; + tuple.axis_tuples = regions.arrayZ[region_index]; + + tuple_vars.push (std::move (tuple)); + } + return !tuple_vars.in_error (); + } + private: void change_tuple_variations_axis_limits (const hb_hashmap_t& normalized_axes_location, const hb_hashmap_t& axes_triple_distances) @@ -1750,6 +1789,29 @@ struct item_variations_t const hb_map_t& get_varidx_map () const { return varidx_map; } + + bool create_from_item_varstore (const VariationStore& varStore, + const hb_map_t& axes_old_index_tag_map) + { + const VarRegionList& regionList = varStore.get_region_list (); + if (!regionList.get_var_regions (axes_old_index_tag_map, orig_region_list)) + return false; + + unsigned num_var_data = varStore.get_sub_table_count (); + if (!vars.alloc (num_var_data)) return false; + + for (unsigned i = 0; i < num_var_data; i++) + { + tuple_variations_t var_data_tuples; + if (!var_data_tuples.create_from_item_var_data (varStore.get_sub_table (i), + orig_region_list, + axes_old_index_tag_map)) + return false; + + vars.push (std::move (var_data_tuples)); + } + return !vars.in_error (); + } }; } /* namespace OT */ -- cgit v1.2.3 From e4db29b102c78cec7c42469e01656c3ac5365863 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 12:59:39 -0700 Subject: [instancer] add instantiate() method Also make change_tuple_variations_axis_limits() deterministic, use sorted vector instead of iterating map keys --- src/hb-ot-var-common.hh | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 4a3eb03eb..3cc18509a 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1211,13 +1211,29 @@ struct TupleVariationData } private: - void change_tuple_variations_axis_limits (const hb_hashmap_t& normalized_axes_location, + static int _cmp_axis_tag (const void *pa, const void *pb) + { + const hb_tag_t *a = (const hb_tag_t*) pa; + const hb_tag_t *b = (const hb_tag_t*) pb; + return (int)(*a) - (int)(*b); + } + + bool change_tuple_variations_axis_limits (const hb_hashmap_t& normalized_axes_location, const hb_hashmap_t& axes_triple_distances) { - for (auto _ : normalized_axes_location) + /* sort axis_tag/axis_limits, make result deterministic */ + hb_vector_t axis_tags; + if (!axis_tags.alloc (normalized_axes_location.get_population ())) + return false; + for (auto t : normalized_axes_location.keys ()) + axis_tags.push (t); + + axis_tags.qsort (_cmp_axis_tag); + for (auto axis_tag : axis_tags) { - hb_tag_t axis_tag = _.first; - Triple axis_limit = _.second; + Triple *axis_limit; + if (!normalized_axes_location.has (axis_tag, &axis_limit)) + return false; TripleDistances axis_triple_distances{1.f, 1.f}; if (axes_triple_distances.has (axis_tag)) axis_triple_distances = axes_triple_distances.get (axis_tag); @@ -1225,12 +1241,13 @@ struct TupleVariationData hb_vector_t new_vars; for (const tuple_delta_t& var : tuple_vars) { - hb_vector_t out = var.change_tuple_var_axis_limit (axis_tag, axis_limit, axis_triple_distances); + hb_vector_t out = var.change_tuple_var_axis_limit (axis_tag, *axis_limit, axis_triple_distances); if (!out) continue; + unsigned new_len = new_vars.length + out.length; if (unlikely (!new_vars.alloc (new_len, false))) - { fini (); return;} + { fini (); return false;} for (unsigned i = 0; i < out.length; i++) new_vars.push (std::move (out[i])); @@ -1238,6 +1255,7 @@ struct TupleVariationData tuple_vars.fini (); tuple_vars = std::move (new_vars); } + return true; } /* merge tuple variations with overlapping tents */ @@ -1421,7 +1439,8 @@ struct TupleVariationData contour_point_vector_t* contour_points = nullptr) { if (!tuple_vars) return true; - change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances); + if (!change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances)) + return false; /* compute inferred deltas only for gvar */ if (contour_points) if (!calc_inferred_deltas (*contour_points)) @@ -1812,6 +1831,17 @@ struct item_variations_t } return !vars.in_error (); } + + bool instantiate (const hb_hashmap_t& normalized_axes_location, + const hb_hashmap_t& axes_triple_distances) + { + for (tuple_variations_t& tuple_vars : vars) + if (!tuple_vars.instantiate (normalized_axes_location, axes_triple_distances)) + return false; + return true; + } + + }; } /* namespace OT */ -- cgit v1.2.3 From 3565ad815009ff74fc42dc5ef23ad8a2bf8fdecf Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 13:07:54 -0700 Subject: [instancer] add build_region_list() method --- src/hb-ot-var-common.hh | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 3cc18509a..f06a16a95 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1838,9 +1838,82 @@ struct item_variations_t for (tuple_variations_t& tuple_vars : vars) if (!tuple_vars.instantiate (normalized_axes_location, axes_triple_distances)) return false; + + if (!build_region_list ()) return false; return true; } + bool build_region_list () + { + /* scan all tuples and collect all unique regions, prune unused regions */ + hb_hashmap_t all_regions; + hb_hashmap_t used_regions; + + /* use a vector when inserting new regions, make result deterministic */ + hb_vector_t all_unique_regions; + for (const tuple_variations_t& sub_table : vars) + { + for (const tuple_delta_t& tuple : sub_table.tuple_vars) + { + region_t r = &(tuple.axis_tuples); + if (!used_regions.has (r)) + { + bool all_zeros = true; + for (float d : tuple.deltas_x) + { + int delta = (int) roundf (d); + if (delta != 0) + { + all_zeros = false; + break; + } + } + if (!all_zeros) + { + if (!used_regions.set (r, 1)) + return false; + } + } + if (all_regions.has (r)) + continue; + if (!all_regions.set (r, 1)) + return false; + all_unique_regions.push (r); + } + } + + if (!all_regions || !all_unique_regions) return false; + if (!region_list.alloc (all_regions.get_population ())) + return false; + + unsigned idx = 0; + /* append the original regions that pre-existed */ + for (const auto& r : orig_region_list) + { + if (!all_regions.has (&r) || !used_regions.has (&r)) + continue; + + region_list.push (&r); + if (!region_map.set (&r, idx)) + return false; + all_regions.del (&r); + idx++; + } + + /* append the new regions at the end */ + for (const auto& r: all_unique_regions) + { + if (!all_regions.has (r) || !used_regions.has (r)) + continue; + region_list.push (r); + if (!region_map.set (r, idx)) + return false; + all_regions.del (r); + idx++; + } + return (!region_list.in_error ()) && (!region_map.in_error ()); + } + }; -- cgit v1.2.3 From b153af8553a8cce1c93682b63a2b4756e44986be Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 13:12:08 -0700 Subject: [instancer] add optimize(), which optimizes varstore's storage --- src/hb-ot-var-common.hh | 225 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index f06a16a95..61a739ef5 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -27,6 +27,7 @@ #define HB_OT_VAR_COMMON_HH #include "hb-ot-layout-common.hh" +#include "hb-priority-queue.hh" namespace OT { @@ -1914,7 +1915,231 @@ struct item_variations_t return (!region_list.in_error ()) && (!region_map.in_error ()); } + /* main algorithm ported from fonttools VarStore_optimize() method */ + bool optimize (bool use_no_variation_idx=true) + { + unsigned num_cols = region_list.length; + /* pre-alloc a 2D vector for all sub_table's VarData rows */ + unsigned total_rows = 0; + for (unsigned major = 0; major < vars.length; major++) + { + const tuple_variations_t& tuples = vars[major]; + /* all tuples in each sub_table should have same num of deltas(num rows) */ + total_rows += tuples.tuple_vars[0].deltas_x.length; + } + + if (!delta_rows.resize (total_rows)) return false; + /* init all rows to [0]*num_cols */ + for (unsigned i = 0; i < total_rows; i++) + if (!(delta_rows[i].resize (num_cols))) return false; + + /* old VarIdxes -> full encoding_row mapping */ + hb_hashmap_t*> front_mapping; + unsigned start_row = 0; + hb_vector_t encoding_objs; + hb_hashmap_t, unsigned> chars_idx_map; + for (unsigned major = 0; major < vars.length; major++) + { + /* deltas are stored in tuples(column based), convert them back into items + * (row based) delta */ + const tuple_variations_t& tuples = vars[major]; + unsigned num_rows = tuples.tuple_vars[0].deltas_x.length; + for (const tuple_delta_t& tuple: tuples.tuple_vars) + { + if (tuple.deltas_x.length != num_rows) + return false; + + /* skip unused regions */ + unsigned *col_idx; + if (!region_map.has (&(tuple.axis_tuples), &col_idx)) + continue; + + for (unsigned i = start_row; i < start_row + num_rows; i++) + { + int rounded_delta = roundf (tuple.deltas_x[i]); + delta_rows[i][*col_idx] += rounded_delta; + if ((!has_long) && (rounded_delta < -65536 || rounded_delta > 65535)) + has_long = true; + } + } + + for (unsigned minor = 0; minor < num_rows; minor++) + { + const hb_vector_t& row = delta_rows[start_row + minor]; + if (use_no_variation_idx) + { + bool all_zeros = true; + for (int delta : row) + { + if (delta != 0) + { + all_zeros = false; + break; + } + } + if (all_zeros) + continue; + } + hb_vector_t chars = delta_row_encoding_t::get_row_chars (row); + unsigned *obj_idx; + if (chars_idx_map.has (chars, &obj_idx)) + { + delta_row_encoding_t& obj = encoding_objs[*obj_idx]; + if (!obj.add_row (&row)) + return false; + } + else + { + delta_row_encoding_t obj (std::move (chars), &row); + encoding_objs.push (std::move (obj)); + if (!chars_idx_map.set (chars, encoding_objs.length - 1)) + return false; + } + if (!front_mapping.set ((major<<16) + minor, &row)) + return false; + } + + start_row += num_rows; + } + /* sort encoding_objs */ + encoding_objs.qsort (); + + /* main algorithm: repeatedly pick 2 best encodings to combine, and combine + * them */ + hb_priority_queue_t queue; + unsigned num_todos = encoding_objs.length; + for (unsigned i = 0; i < num_todos; i++) + { + for (unsigned j = i + 1; j < num_todos; j++) + { + int combining_gain = encoding_objs.arrayZ[i].gain_from_merging (encoding_objs.arrayZ[j]); + if (combining_gain > 0) + { + unsigned val = (i << 16) + j; + queue.insert (-combining_gain, val); + } + } + } + + hb_set_t removed_todo_idxes; + while (queue) + { + unsigned val = queue.pop_minimum ().second; + unsigned j = val & 0xFFFF; + unsigned i = (val >> 16) & 0xFFFF; + + if (removed_todo_idxes.has (i) || removed_todo_idxes.has (j)) + continue; + + delta_row_encoding_t& encoding = encoding_objs.arrayZ[i]; + delta_row_encoding_t& other_encoding = encoding_objs.arrayZ[j]; + removed_todo_idxes.add (i); + removed_todo_idxes.add (j); + + hb_vector_t combined_chars; + if (!combined_chars.alloc (encoding.chars.length)) + return false; + + for (unsigned idx = 0; idx < encoding.chars.length; idx++) + { + uint8_t v = hb_max (encoding.chars.arrayZ[idx], other_encoding.chars.arrayZ[idx]); + combined_chars.push (v); + } + + delta_row_encoding_t combined_encoding_obj (std::move (combined_chars)); + for (const auto& row : hb_concat (encoding.items, other_encoding.items)) + combined_encoding_obj.add_row (row); + + for (unsigned idx = 0; i < encoding_objs.length; i++) + { + if (removed_todo_idxes.has (idx)) continue; + + const delta_row_encoding_t& obj = encoding_objs.arrayZ[idx]; + if (obj.chars == combined_chars) + { + for (const auto& row : obj.items) + combined_encoding_obj.add_row (row); + + removed_todo_idxes.add (idx); + continue; + } + + int combined_gain = combined_encoding_obj.gain_from_merging (obj); + if (combined_gain > 0) + { + unsigned val = (idx << 16) + encoding_objs.length; + queue.insert (-combined_gain, val); + } + } + + encoding_objs.push (std::move (combined_encoding_obj)); + } + + int num_final_encodings = (int) encoding_objs.length - (int) removed_todo_idxes.get_population (); + if (num_final_encodings <= 0) return false; + + if (!encodings.alloc (num_final_encodings)) return false; + for (unsigned i = 0; i < encoding_objs.length; i++) + { + if (removed_todo_idxes.has (i)) continue; + encodings.push (std::move (encoding_objs.arrayZ[i])); + } + + /* sort again based on width, make result deterministic */ + encodings.qsort (delta_row_encoding_t::cmp_width); + + /* full encoding_row -> new VarIdxes mapping */ + hb_hashmap_t*, unsigned> back_mapping; + + for (unsigned major = 0; major < encodings.length; major++) + if (!compile_varidx_map (major, front_mapping, back_mapping)) + return false; + return true; + } + + private: + /* compile varidx_map for one VarData subtable (index specified by major) */ + bool compile_varidx_map (unsigned major, + const hb_hashmap_t*>& front_mapping, + hb_hashmap_t*, unsigned> back_mapping) + { + delta_row_encoding_t& encoding = encodings[major]; + /* just sanity check, this shouldn't happen */ + if (encoding.is_empty ()) + return false; + + unsigned num_rows = encoding.items.length; + /* sort rows, make result deterministic */ + encoding.items.qsort (_cmp_row); + + /* compile old to new var_idxes mapping */ + for (unsigned minor = 0; minor < num_rows; minor++) + { + unsigned new_varidx = (major << 16) + minor; + back_mapping.set (encoding.items.arrayZ[minor], new_varidx); + } + + for (auto _ : front_mapping.iter ()) + { + unsigned old_varidx = _.first; + unsigned *new_varidx; + if (back_mapping.has (_.second, &new_varidx)) + varidx_map.set (old_varidx, *new_varidx); + else + varidx_map.set (old_varidx, HB_OT_LAYOUT_NO_VARIATIONS_INDEX); + } + return !varidx_map.in_error (); + } + + static int _cmp_row (const void *pa, const void *pb) + { + /* compare pointers of vectors(const hb_vector_t*) that represent a row */ + const hb_vector_t** a = (const hb_vector_t**) pa; + const hb_vector_t** b = (const hb_vector_t**) pb; + + return ((*b)->as_array ()).cmp ((*a)->as_array ()); + } }; } /* namespace OT */ -- cgit v1.2.3 From 2326879229535f97ce099958e494005d1092ee5b Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 15:28:06 -0700 Subject: [instancer] add serialize() for VarRegionList The region list argument comes from item_variations_t.get_region_list() --- src/hb-ot-layout-common.hh | 47 +++++++++++++++++++++++++++++++++++++++ src/hb-subset-plan-member-list.hh | 2 ++ src/hb-subset-plan.cc | 1 + 3 files changed, 50 insertions(+) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 2f73c5816..fc374c5ad 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2475,6 +2475,12 @@ struct VarRegionAxis * have to do that at runtime. */ } + bool serialize (hb_serialize_context_t *c) const + { + TRACE_SERIALIZE (this); + return_trace (c->embed (this)); + } + public: F2DOT14 startCoord; F2DOT14 peakCoord; @@ -2532,6 +2538,47 @@ struct VarRegionList return_trace (c->check_struct (this) && axesZ.sanitize (c, axisCount * regionCount)); } + bool serialize (hb_serialize_context_t *c, + const hb_vector_t& axis_tags, + const hb_vector_t*>& regions) + { + TRACE_SERIALIZE (this); + unsigned axis_count = axis_tags.length; + unsigned region_count = regions.length; + if (!axis_count || !region_count) return_trace (false); + if (unlikely (hb_unsigned_mul_overflows (axis_count * region_count, + VarRegionAxis::static_size))) return_trace (false); + if (unlikely (!c->extend_min (this))) return_trace (false); + axisCount = axis_count; + regionCount = region_count; + + for (unsigned r = 0; r < region_count; r++) + { + const auto& region = regions[r]; + for (unsigned i = 0; i < axis_count; i++) + { + hb_tag_t tag = axis_tags.arrayZ[i]; + VarRegionAxis var_region_rec; + Triple *coords; + if (region->has (tag, &coords)) + { + var_region_rec.startCoord.set_float (coords->minimum); + var_region_rec.peakCoord.set_float (coords->middle); + var_region_rec.endCoord.set_float (coords->maximum); + } + else + { + var_region_rec.startCoord.set_int (0); + var_region_rec.peakCoord.set_int (0); + var_region_rec.endCoord.set_int (0); + } + if (!var_region_rec.serialize (c)) + return_trace (false); + } + } + return_trace (true); + } + bool serialize (hb_serialize_context_t *c, const VarRegionList *src, const hb_inc_bimap_t ®ion_map) { TRACE_SERIALIZE (this); diff --git a/src/hb-subset-plan-member-list.hh b/src/hb-subset-plan-member-list.hh index 01d8b0f8b..46837aded 100644 --- a/src/hb-subset-plan-member-list.hh +++ b/src/hb-subset-plan-member-list.hh @@ -113,6 +113,8 @@ HB_SUBSET_PLAN_MEMBER (hb_map_t, axes_index_map) //axis_index->axis_tag mapping in fvar axis array HB_SUBSET_PLAN_MEMBER (hb_map_t, axes_old_index_tag_map) +//vector of retained axis tags in the order of axes given in the 'fvar' table +HB_SUBSET_PLAN_MEMBER (hb_vector_t, axis_tags) //hmtx metrics map: new gid->(advance, lsb) HB_SUBSET_PLAN_MEMBER (mutable hb_hashmap_t E()>), hmtx_map) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index c293ba3ba..7cb306eb5 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -927,6 +927,7 @@ _normalize_axes_location (hb_face_t *face, hb_subset_plan_t *plan) { axis_not_pinned = true; plan->axes_index_map.set (old_axis_idx, new_axis_idx); + plan->axis_tags.push (axis_tag); new_axis_idx++; } -- cgit v1.2.3 From e4e1ac44f062078ed7da04321f8269df9f202c7b Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 15:34:26 -0700 Subject: [instancer] add serialize() for VariationStore Input region_list and encoding_rows are from item_variations_t --- src/hb-ot-layout-common.hh | 106 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index fc374c5ad..23c9008ff 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2735,6 +2735,81 @@ struct VarData get_row_size ())); } + bool serialize (hb_serialize_context_t *c, + bool has_long, + const hb_vector_t*>& rows) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (this))) return_trace (false); + unsigned row_count = rows.length; + itemCount = row_count; + + int min_threshold = has_long ? -65536 : -128; + int max_threshold = has_long ? +65535 : +127; + enum delta_size_t { kZero=0, kNonWord, kWord }; + hb_vector_t delta_sz; + unsigned num_regions = rows[0]->length; + if (!delta_sz.resize (num_regions)) + return_trace (false); + + unsigned word_count = 0; + for (unsigned r = 0; r < num_regions; r++) + { + for (unsigned i = 0; i < row_count; i++) + { + int delta = rows[i]->arrayZ[r]; + if (delta < min_threshold || delta > max_threshold) + { + delta_sz[r] = kWord; + word_count++; + break; + } + else if (delta != 0) + { + delta_sz[r] = kNonWord; + } + } + } + + /* reorder regions: words and then non-words*/ + unsigned word_index = 0; + unsigned non_word_index = word_count; + hb_map_t ri_map; + for (unsigned r = 0; r < num_regions; r++) + { + if (!delta_sz[r]) continue; + unsigned new_r = (delta_sz[r] == kWord)? word_index++ : non_word_index++; + if (!ri_map.set (new_r, r)) + return_trace (false); + } + + wordSizeCount = word_count | (has_long ? 0x8000u /* LONG_WORDS */ : 0); + + unsigned ri_count = ri_map.get_population (); + regionIndices.len = ri_count; + if (unlikely (!c->extend (this))) return_trace (false); + + for (unsigned r = 0; r < ri_count; r++) + { + hb_codepoint_t *idx; + if (!ri_map.has (r, &idx)) + return_trace (false); + regionIndices[r] = *idx; + } + + HBUINT8 *delta_bytes = get_delta_bytes (); + unsigned row_size = get_row_size (); + for (unsigned int i = 0; i < row_count; i++) + { + for (unsigned int r = 0; r < ri_count; r++) + { + int delta = rows[i]->arrayZ[ri_map[r]]; + set_item_delta_fast (i, r, delta, delta_bytes, row_size); + } + } + return_trace (true); + } + bool serialize (hb_serialize_context_t *c, const VarData *src, const hb_inc_bimap_t &inner_map, @@ -2894,6 +2969,7 @@ struct VarData get_row_size ()); } + protected: void set_item_delta_fast (unsigned int item, unsigned int region, int32_t delta, HBUINT8 *delta_bytes, unsigned row_size) { @@ -3007,6 +3083,36 @@ struct VariationStore dataSets.sanitize (c, this)); } + bool serialize (hb_serialize_context_t *c, + bool has_long, + const hb_vector_t& axis_tags, + const hb_vector_t*>& region_list, + const hb_vector_t& vardata_encodings) + { + TRACE_SERIALIZE (this); +#ifdef HB_NO_VAR + return_trace (false); +#endif + if (unlikely (!c->extend_min (this))) return_trace (false); + + format = 1; + if (!regions.serialize_serialize (c, axis_tags, region_list)) + return_trace (false); + + unsigned num_var_data = vardata_encodings.length; + if (!num_var_data) return_trace (false); + if (unlikely (!c->check_assign (dataSets.len, num_var_data, + HB_SERIALIZE_ERROR_INT_OVERFLOW))) + return_trace (false); + + if (unlikely (!c->extend (dataSets))) return_trace (false); + for (unsigned i = 0; i < num_var_data; i++) + if (!dataSets[i].serialize_serialize (c, has_long, vardata_encodings[i].items)) + return_trace (false); + + return_trace (true); + } + bool serialize (hb_serialize_context_t *c, const VariationStore *src, const hb_array_t &inner_maps) -- cgit v1.2.3 From 45c2d05d0068ebd4fe5a9ea6ca38af5d8bab57c9 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 15:45:22 -0700 Subject: [instancer] add subset() for MVAR --- src/hb-ot-var-mvar-table.hh | 61 ++++++++++++++++++++++++++++++++++++++++++++- src/hb-subset-input.cc | 1 - src/hb-subset.cc | 4 +++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-var-mvar-table.hh b/src/hb-ot-var-mvar-table.hh index d27ebb39c..a41e57880 100644 --- a/src/hb-ot-var-mvar-table.hh +++ b/src/hb-ot-var-mvar-table.hh @@ -27,7 +27,7 @@ #ifndef HB_OT_VAR_MVAR_TABLE_HH #define HB_OT_VAR_MVAR_TABLE_HH -#include "hb-ot-layout-common.hh" +#include "hb-ot-var-common.hh" namespace OT { @@ -41,6 +41,19 @@ struct VariationValueRecord return_trace (c->check_struct (this)); } + bool subset (hb_subset_context_t *c, + const hb_map_t& varidx_map) const + { + TRACE_SUBSET (this); + auto *out = c->serializer->embed (*this); + if (unlikely (!out)) return_trace (false); + + hb_codepoint_t *new_idx; + return_trace (c->serializer->check_assign (out->varIdx, + (varidx_map.has (varIdx, &new_idx)) ? *new_idx : HB_OT_LAYOUT_NO_VARIATIONS_INDEX, + HB_SERIALIZE_ERROR_INT_OVERFLOW)); + } + public: Tag valueTag; /* Four-byte tag identifying a font-wide measure. */ VarIdx varIdx; /* Outer/inner index into VariationStore item. */ @@ -73,6 +86,52 @@ struct MVAR valueRecordSize)); } + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); +#ifdef HB_NO_VAR + return_trace (false); +#endif + + if (c->plan->all_axes_pinned) + return_trace (false); + + MVAR *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->version = version; + out->reserved = reserved; + out->valueRecordSize = valueRecordSize; + out->valueRecordCount = valueRecordCount; + + item_variations_t item_vars; + const VariationStore& src_var_store = this+varStore; + if (!item_vars.create_from_item_varstore (src_var_store, c->plan->axes_old_index_tag_map)) + return_trace (false); + + if (!item_vars.instantiate (c->plan->axes_location, c->plan->axes_triple_distances)) + return_trace (false); + + if (!item_vars.optimize ()) + return_trace (false); + + /* serialize varstore */ + if (!out->varStore.serialize_serialize (c->serializer, item_vars.has_long_word (), + c->plan->axis_tags, + item_vars.get_region_list (), + item_vars.get_vardata_encodings ())) + return_trace (false); + + /* serialize value records array */ + unsigned value_rec_count = valueRecordCount; + const VariationValueRecord *record = reinterpret_cast (valuesZ.arrayZ); + for (unsigned i = 0; i < value_rec_count; i++) + { + if (!record->subset (c, item_vars.get_varidx_map ())) return_trace (false); + record++; + } + return_trace (true); + } + float get_var (hb_tag_t tag, const int *coords, unsigned int coord_count) const { diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index aade5585f..0277d3d3d 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -74,7 +74,6 @@ hb_subset_input_t::hb_subset_input_t () HB_TAG ('p', 'r', 'e', 'p'), HB_TAG ('V', 'D', 'M', 'X'), HB_TAG ('D', 'S', 'I', 'G'), - HB_TAG ('M', 'V', 'A', 'R'), }; sets.no_subset_tables->add_array (default_no_subset_tables, ARRAY_LENGTH (default_no_subset_tables)); diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 100ce87d5..de3e876f7 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -55,6 +55,7 @@ #include "hb-ot-var-fvar-table.hh" #include "hb-ot-var-gvar-table.hh" #include "hb-ot-var-hvar-table.hh" +#include "hb-ot-var-mvar-table.hh" #include "hb-ot-math-table.hh" #include "hb-ot-stat-table.hh" #include "hb-repacker.hh" @@ -523,6 +524,9 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_cvar: if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); return _subset (plan, buf); + case HB_OT_TAG_MVAR: + if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); + return _subset (plan, buf); case HB_OT_TAG_STAT: if (!plan->user_axes_location.is_empty ()) return _subset (plan, buf); else return _passthrough (plan, tag); -- cgit v1.2.3 From 7b5daff5eb347a29d9d9d59f2a41f938781d84de Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 31 Aug 2023 17:50:34 -0700 Subject: [instancer] add tests for mvar partial instancing --- ...-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf | Bin 0 -> 3800 bytes ...item-variations.retain-all-codepoint.wght=300-600.ttf | Bin 0 -> 6280 bytes ...item-variations.retain-all-codepoint.wght=500-800.ttf | Bin 0 -> 6760 bytes .../data/profiles/no-tables-with-item-variations.txt | 2 +- test/subset/data/tests/mvar_partial_instance.tests | 13 +++++++++++++ test/subset/meson.build | 2 +- 6 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf create mode 100644 test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf create mode 100644 test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf create mode 100644 test/subset/data/tests/mvar_partial_instance.tests diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf new file mode 100644 index 000000000..679e6c721 Binary files /dev/null and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf new file mode 100644 index 000000000..3508c732c Binary files /dev/null and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf new file mode 100644 index 000000000..a14e79ed7 Binary files /dev/null and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf differ diff --git a/test/subset/data/profiles/no-tables-with-item-variations.txt b/test/subset/data/profiles/no-tables-with-item-variations.txt index df2b423d1..2a5aa1892 100644 --- a/test/subset/data/profiles/no-tables-with-item-variations.txt +++ b/test/subset/data/profiles/no-tables-with-item-variations.txt @@ -1 +1 @@ ---drop-tables+=MVAR,HVAR,VVAR,GDEF,COLR,GPOS +--drop-tables+=HVAR,VVAR,GDEF,COLR,GPOS diff --git a/test/subset/data/tests/mvar_partial_instance.tests b/test/subset/data/tests/mvar_partial_instance.tests new file mode 100644 index 000000000..edf9296de --- /dev/null +++ b/test/subset/data/tests/mvar_partial_instance.tests @@ -0,0 +1,13 @@ +FONTS: +NotoSans-VF.abc.ttf + +PROFILES: +no-tables-with-item-variations.txt + +SUBSETS: +* + +INSTANCES: +wght=300:600 +wght=500:800 +wght=200:600,wdth=80:90,CTGR=20:60 diff --git a/test/subset/meson.build b/test/subset/meson.build index be4f69bbf..4b6db4120 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -68,7 +68,7 @@ tests = [ ] if get_option('experimental_api') - tests += 'glyf_partial_instancing' + tests += ['glyf_partial_instancing', 'mvar_partial_instance'] endif repack_tests = [ -- cgit v1.2.3 From 6e49128afda813238cfbccd304db1c55ed98f0e5 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 1 Sep 2023 10:27:40 -0700 Subject: [instancer] always check and update default wght/width/slnt if necessary Sometimes default values in original file are incorrect, and if default value for an axis is not changed, then these values won't be updated --- src/hb-ot-os2-table.hh | 23 ++++++++------------- src/hb-ot-post-table.hh | 10 ++++----- ...ariations.retain-all-codepoint.wght=300-600.ttf | Bin 0 -> 194432 bytes ...ariations.retain-all-codepoint.wght=500-800.ttf | Bin 0 -> 143840 bytes test/subset/data/tests/update_def_wght.tests | 12 +++++++++++ test/subset/meson.build | 6 +++++- 6 files changed, 31 insertions(+), 20 deletions(-) create mode 100644 test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf create mode 100644 test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf create mode 100644 test/subset/data/tests/update_def_wght.tests diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh index 72cb66247..19330b9bd 100644 --- a/src/hb-ot-os2-table.hh +++ b/src/hb-ot-os2-table.hh @@ -246,24 +246,19 @@ struct OS2 } #endif - if (c->plan->user_axes_location.has (HB_TAG ('w','g','h','t')) && - !c->plan->pinned_at_default) + Triple *axis_range; + if (c->plan->user_axes_location.has (HB_TAG ('w','g','h','t'), &axis_range)) { - float weight_class = c->plan->user_axes_location.get (HB_TAG ('w','g','h','t')).middle; - if (!c->serializer->check_assign (os2_prime->usWeightClass, - roundf (hb_clamp (weight_class, 1.0f, 1000.0f)), - HB_SERIALIZE_ERROR_INT_OVERFLOW)) - return_trace (false); + unsigned weight_class = static_cast (roundf (hb_clamp (axis_range->middle, 1.0f, 1000.0f))); + if (os2_prime->usWeightClass != weight_class) + os2_prime->usWeightClass = weight_class; } - if (c->plan->user_axes_location.has (HB_TAG ('w','d','t','h')) && - !c->plan->pinned_at_default) + if (c->plan->user_axes_location.has (HB_TAG ('w','d','t','h'), &axis_range)) { - float width = c->plan->user_axes_location.get (HB_TAG ('w','d','t','h')).middle; - if (!c->serializer->check_assign (os2_prime->usWidthClass, - roundf (map_wdth_to_widthclass (width)), - HB_SERIALIZE_ERROR_INT_OVERFLOW)) - return_trace (false); + unsigned width_class = static_cast (roundf (map_wdth_to_widthclass (axis_range->middle))); + if (os2_prime->usWidthClass != width_class) + os2_prime->usWidthClass = width_class; } if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES) diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 761e49d11..aaecc348e 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -113,12 +113,12 @@ struct post } #endif - if (c->plan->user_axes_location.has (HB_TAG ('s','l','n','t')) && - !c->plan->pinned_at_default) + Triple *axis_range; + if (c->plan->user_axes_location.has (HB_TAG ('s','l','n','t'), &axis_range)) { - float italic_angle = c->plan->user_axes_location.get (HB_TAG ('s','l','n','t')).middle; - italic_angle = hb_max (-90.f, hb_min (italic_angle, 90.f)); - post_prime->italicAngle.set_float (italic_angle); + float italic_angle = hb_max (-90.f, hb_min (axis_range->middle, 90.f)); + if (post_prime->italicAngle.to_float () != italic_angle) + post_prime->italicAngle.set_float (italic_angle); } if (glyph_names && version.major == 2) diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf new file mode 100644 index 000000000..5f6b2a0b4 Binary files /dev/null and b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf differ diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf new file mode 100644 index 000000000..edd451312 Binary files /dev/null and b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf differ diff --git a/test/subset/data/tests/update_def_wght.tests b/test/subset/data/tests/update_def_wght.tests new file mode 100644 index 000000000..9ff5fce48 --- /dev/null +++ b/test/subset/data/tests/update_def_wght.tests @@ -0,0 +1,12 @@ +FONTS: +SourceSerifVariable-Roman.ttf + +PROFILES: +no-tables-with-item-variations.txt + +SUBSETS: +* + +INSTANCES: +wght=300:600 +wght=500:800 diff --git a/test/subset/meson.build b/test/subset/meson.build index 4b6db4120..9c994236b 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -68,7 +68,11 @@ tests = [ ] if get_option('experimental_api') - tests += ['glyf_partial_instancing', 'mvar_partial_instance'] + tests += [ + 'glyf_partial_instancing', + 'mvar_partial_instance', + 'update_def_wght', + ] endif repack_tests = [ -- cgit v1.2.3 From 11cc47964695661c2a0e8ba24d80304ac1457ab6 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 11 Sep 2023 09:57:14 -0700 Subject: [instancer] fix columns and get_chars_overhead() in delta_row_encoding_t make columns a vector of uint8_t so it supports more than 32 columns --- src/hb-ot-layout-common.hh | 29 +++++++++++++++++++---------- src/hb-ot-var-common.hh | 1 + 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 23c9008ff..4a9f15774 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2307,7 +2307,7 @@ struct delta_row_encoding_t * needed for this region */ hb_vector_t chars; unsigned width; - unsigned columns; + hb_vector_t columns; unsigned overhead; hb_vector_t*> items; @@ -2375,21 +2375,26 @@ struct delta_row_encoding_t return ret; } - unsigned get_columns () + hb_vector_t get_columns () { - unsigned cols = 0; - unsigned i = 1; + hb_vector_t cols; + cols.alloc (chars.length); for (auto v : chars) { - if (v) - cols |= i; - i <<= 1; + uint8_t flag = v ? 1 : 0; + cols.push (flag); } return cols; } - static inline unsigned get_chars_overhead (unsigned cols) - { return 10 + hb_popcount (cols) * 2; } + static inline unsigned get_chars_overhead (const hb_vector_t& cols) + { + unsigned c = 4 + 6; // 4 bytes for LOffset, 6 bytes for VarData header + unsigned cols_bit_count = 0; + for (auto v : cols) + if (v) cols_bit_count++; + return c + cols_bit_count * 2; + } unsigned get_gain () const { @@ -2402,8 +2407,12 @@ struct delta_row_encoding_t int combined_width = 0; for (unsigned i = 0; i < chars.length; i++) combined_width += hb_max (chars.arrayZ[i], other_encoding.chars.arrayZ[i]); + + hb_vector_t combined_columns; + combined_columns.alloc (columns.length); + for (unsigned i = 0; i < columns.length; i++) + combined_columns.push (columns.arrayZ[i] | other_encoding.columns.arrayZ[i]); - int combined_columns = columns | other_encoding.columns; int combined_overhead = get_chars_overhead (combined_columns); int combined_gain = (int) overhead + (int) other_encoding.overhead - combined_overhead - (combined_width - (int) width) * items.length diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 61a739ef5..b639103df 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1981,6 +1981,7 @@ struct item_variations_t continue; } hb_vector_t chars = delta_row_encoding_t::get_row_chars (row); + if (!chars) return false; unsigned *obj_idx; if (chars_idx_map.has (chars, &obj_idx)) { -- cgit v1.2.3 From 6c658b410593e15416a800daf8fd0492c69d9ba5 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 15 Sep 2023 11:49:47 -0700 Subject: [instancer] bug fix --- src/hb-ot-var-common.hh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index b639103df..883bb32fb 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1954,10 +1954,10 @@ struct item_variations_t if (!region_map.has (&(tuple.axis_tuples), &col_idx)) continue; - for (unsigned i = start_row; i < start_row + num_rows; i++) + for (unsigned i = 0; i < num_rows; i++) { int rounded_delta = roundf (tuple.deltas_x[i]); - delta_rows[i][*col_idx] += rounded_delta; + delta_rows[start_row + i][*col_idx] += rounded_delta; if ((!has_long) && (rounded_delta < -65536 || rounded_delta > 65535)) has_long = true; } @@ -2052,7 +2052,7 @@ struct item_variations_t for (const auto& row : hb_concat (encoding.items, other_encoding.items)) combined_encoding_obj.add_row (row); - for (unsigned idx = 0; i < encoding_objs.length; i++) + for (unsigned idx = 0; idx < encoding_objs.length; idx++) { if (removed_todo_idxes.has (idx)) continue; -- cgit v1.2.3 From 7741fa329998f23ef1495f9828c919ae2f6ada1e Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 18 Sep 2023 10:44:47 -0700 Subject: [instancer] bug fix: dont add duplicate rows into delta_row_encoding_t Also fix compile_varidx_map() --- src/hb-ot-var-common.hh | 57 ++++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 883bb32fb..aeb0097ba 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1938,6 +1938,9 @@ struct item_variations_t unsigned start_row = 0; hb_vector_t encoding_objs; hb_hashmap_t, unsigned> chars_idx_map; + + /* delta_rows map, used for filtering out duplicate rows */ + hb_hashmap_t*, unsigned> delta_rows_map; for (unsigned major = 0; major < vars.length; major++) { /* deltas are stored in tuples(column based), convert them back into items @@ -1980,8 +1983,17 @@ struct item_variations_t if (all_zeros) continue; } + + if (!front_mapping.set ((major<<16) + minor, &row)) + return false; + hb_vector_t chars = delta_row_encoding_t::get_row_chars (row); if (!chars) return false; + + if (delta_rows_map.has (&row)) + continue; + + delta_rows_map.set (&row, 1); unsigned *obj_idx; if (chars_idx_map.has (chars, &obj_idx)) { @@ -1996,8 +2008,6 @@ struct item_variations_t if (!chars_idx_map.set (chars, encoding_objs.length - 1)) return false; } - if (!front_mapping.set ((major<<16) + minor, &row)) - return false; } start_row += num_rows; @@ -2090,35 +2100,34 @@ struct item_variations_t /* sort again based on width, make result deterministic */ encodings.qsort (delta_row_encoding_t::cmp_width); - /* full encoding_row -> new VarIdxes mapping */ - hb_hashmap_t*, unsigned> back_mapping; - - for (unsigned major = 0; major < encodings.length; major++) - if (!compile_varidx_map (major, front_mapping, back_mapping)) - return false; - return true; + return compile_varidx_map (front_mapping); } private: /* compile varidx_map for one VarData subtable (index specified by major) */ - bool compile_varidx_map (unsigned major, - const hb_hashmap_t*>& front_mapping, - hb_hashmap_t*, unsigned> back_mapping) + bool compile_varidx_map (const hb_hashmap_t*>& front_mapping) { - delta_row_encoding_t& encoding = encodings[major]; - /* just sanity check, this shouldn't happen */ - if (encoding.is_empty ()) - return false; - - unsigned num_rows = encoding.items.length; - /* sort rows, make result deterministic */ - encoding.items.qsort (_cmp_row); + /* full encoding_row -> new VarIdxes mapping */ + hb_hashmap_t*, unsigned> back_mapping; - /* compile old to new var_idxes mapping */ - for (unsigned minor = 0; minor < num_rows; minor++) + for (unsigned major = 0; major < encodings.length; major++) { - unsigned new_varidx = (major << 16) + minor; - back_mapping.set (encoding.items.arrayZ[minor], new_varidx); + delta_row_encoding_t& encoding = encodings[major]; + /* just sanity check, this shouldn't happen */ + if (encoding.is_empty ()) + return false; + + unsigned num_rows = encoding.items.length; + + /* sort rows, make result deterministic */ + encoding.items.qsort (_cmp_row); + + /* compile old to new var_idxes mapping */ + for (unsigned minor = 0; minor < num_rows; minor++) + { + unsigned new_varidx = (major << 16) + minor; + back_mapping.set (encoding.items.arrayZ[minor], new_varidx); + } } for (auto _ : front_mapping.iter ()) -- cgit v1.2.3 From c330c2917524ad8a15340e5fa1df5a57a1409efa Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 18 Sep 2023 12:14:21 -0700 Subject: [instancer] add a unit testcase for instantiating item variations --- src/Makefile.am | 5 ++++ src/meson.build | 1 + src/test-item-varstore.cc | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 src/test-item-varstore.cc diff --git a/src/Makefile.am b/src/Makefile.am index 430d44a45..de71a5d8f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -458,6 +458,7 @@ COMPILED_TESTS = \ test-classdef-graph \ test-instancer-solver \ test-tuple-varstore \ + test-item-varstore \ $(NULL) COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS) @@ -536,6 +537,10 @@ test_tuple_varstore_SOURCES = test-tuple-varstore.cc hb-subset-instancer-solver. test_tuple_varstore_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) test_tuple_varstore_LDADD = $(COMPILED_TESTS_LDADD) +test_item_varstore_SOURCES = test-item-varstore.cc hb-subset-instancer-solver.cc hb-static.cc +test_item_varstore_CPPFLAGS = $(COMPILED_TESTS_CPPFLAGS) +test_item_varstore_LDADD = $(COMPILED_TESTS_LDADD) + dist_check_SCRIPTS = \ check-c-linkage-decls.py \ check-externs.py \ diff --git a/src/meson.build b/src/meson.build index 87e8962d5..258aa4a73 100644 --- a/src/meson.build +++ b/src/meson.build @@ -703,6 +703,7 @@ if get_option('tests').enabled() 'test-serialize': ['test-serialize.cc', 'hb-static.cc'], 'test-set': ['test-set.cc', 'hb-static.cc'], 'test-tuple-varstore': ['test-tuple-varstore.cc', 'hb-subset-instancer-solver.cc', 'hb-static.cc'], + 'test-item-varstore': ['test-item-varstore.cc', 'hb-subset-instancer-solver.cc', 'hb-static.cc'], 'test-use-table': 'test-use-table.cc', 'test-vector': ['test-vector.cc', 'hb-static.cc'], } diff --git a/src/test-item-varstore.cc b/src/test-item-varstore.cc new file mode 100644 index 000000000..d1600d560 --- /dev/null +++ b/src/test-item-varstore.cc @@ -0,0 +1,66 @@ +/* + * Copyright © 2020 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. + * + */ +#include "hb-ot-var-common.hh" +#include "hb-ot-var-hvar-table.hh" +// HVAR table data from SourceSerif4Variable-Roman_subset.otf +const char hvar_data[] = "\x0\x1\x0\x0\x0\x0\x0\x14\x0\x0\x0\xc4\x0\x0\x0\x0\x0\x0\x0\x0\x0\x1\x0\x0\x0\x10\x0\x2\x0\x0\x0\x74\x0\x0\x0\x7a\x0\x2\x0\x8\xc0\x0\xc0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x40\x0\x40\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\xc0\x0\xc0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x40\x0\x40\x0\xc0\x0\xc0\x0\x0\x0\xc0\x0\xc0\x0\x0\x0\xc0\x0\xc0\x0\x0\x0\x0\x0\x40\x0\x40\x0\x0\x0\x40\x0\x40\x0\xc0\x0\xc0\x0\x0\x0\x0\x0\x40\x0\x40\x0\x0\x0\x40\x0\x40\x0\x0\x1\x0\x0\x0\x0\x0\x4\x0\x0\x0\x8\x0\x0\x0\x1\x0\x2\x0\x3\x0\x4\x0\x5\x0\x6\x0\x7\xf9\xf\x2f\xbf\xfb\xfb\x35\xf9\x4\x4\xf3\xb4\xf2\xfb\x2e\xf3\x4\x4\xe\xad\xfa\x1\x1a\x1\x15\x22\x59\xd6\xe3\xf6\x6\xf5\x0\x1\x0\x5\x0\x4\x7\x5\x6"; + +static void +test_item_variations () +{ + const OT::HVAR* hvar_table = reinterpret_cast (hvar_data); + + hb_tag_t axis_tag = HB_TAG ('w', 'g', 'h', 't'); + hb_map_t axis_idx_tag_map; + axis_idx_tag_map.set (0, axis_tag); + + axis_tag = HB_TAG ('o', 'p', 's', 'z'); + axis_idx_tag_map.set (1, axis_tag); + + OT::item_variations_t item_vars; + const OT::VariationStore& src_var_store = hvar_table+(hvar_table->varStore); + bool result = item_vars.create_from_item_varstore (src_var_store, axis_idx_tag_map); + + assert (result); + + /* partial instancing wght=300:800 */ + hb_hashmap_t normalized_axes_location; + normalized_axes_location.set (axis_tag, Triple (-0.512817f, 0.f, 0.700012f)); + + hb_hashmap_t axes_triple_distances; + axes_triple_distances.set (axis_tag, TripleDistances (200.f, 500.f)); + + result = item_vars.instantiate (normalized_axes_location, axes_triple_distances); + assert (result); + result = item_vars.optimize (); + assert (result); + assert (item_vars.get_region_list().length == 8); +} + +int +main (int argc, char **argv) +{ + test_item_variations (); +} -- cgit v1.2.3 From b5a1c2b483263896e563402cd285a46229e42f3c Mon Sep 17 00:00:00 2001 From: Marco Rebhan Date: Mon, 7 Aug 2023 01:55:10 +0200 Subject: Revert "Pass through absolute paths to cmake config directly" This reverts commit db292f6f0238581a489aa8cddc585129b6e920cd. --- src/harfbuzz-config.cmake.in | 44 ++++++++++++++++++++++++++++++++++++-------- src/meson.build | 4 ++-- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/harfbuzz-config.cmake.in b/src/harfbuzz-config.cmake.in index 95b5d0afd..b22077d04 100644 --- a/src/harfbuzz-config.cmake.in +++ b/src/harfbuzz-config.cmake.in @@ -1,5 +1,29 @@ +# Set these variables so that the `${prefix}/lib` expands to something we can +# remove. +set(_harfbuzz_remove_string "REMOVE_ME") +set(exec_prefix "${_harfbuzz_remove_string}") +set(prefix "${_harfbuzz_remove_string}") + +# Compute the installation prefix by stripping components from our current +# location. +get_filename_component(_harfbuzz_prefix "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY) +get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY) set(_harfbuzz_libdir "@libdir@") +string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}") +set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}") +while (_harfbuzz_libdir_iter) + set(_harfbuzz_libdir_prev_iter "${_harfbuzz_libdir_iter}") + get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY) + if (_harfbuzz_libdir_prev_iter STREQUAL _harfbuzz_libdir_iter) + break() + endif () + get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY) +endwhile () +unset(_harfbuzz_libdir_iter) + +# Get the include subdir. set(_harfbuzz_includedir "@includedir@") +string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_includedir "${_harfbuzz_includedir}") # Extract version information from libtool. set(_harfbuzz_version_info "@HB_LIBTOOL_VERSION_INFO@") @@ -34,29 +58,29 @@ endif () # Add the libraries. add_library(harfbuzz::harfbuzz SHARED IMPORTED) set_target_properties(harfbuzz::harfbuzz PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_includedir}/harfbuzz" - IMPORTED_LOCATION "${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz${_harfbuzz_lib_suffix}") + INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" + IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz${_harfbuzz_lib_suffix}") add_library(harfbuzz::icu SHARED IMPORTED) set_target_properties(harfbuzz::icu PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_includedir}/harfbuzz" + INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" - IMPORTED_LOCATION "${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-icu${_harfbuzz_lib_suffix}") + IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-icu${_harfbuzz_lib_suffix}") add_library(harfbuzz::subset SHARED IMPORTED) set_target_properties(harfbuzz::subset PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_includedir}/harfbuzz" + INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" - IMPORTED_LOCATION "${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-subset${_harfbuzz_lib_suffix}") + IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-subset${_harfbuzz_lib_suffix}") # Only add the gobject library if it was built. set(_harfbuzz_have_gobject "@have_gobject@") if (_harfbuzz_have_gobject) add_library(harfbuzz::gobject SHARED IMPORTED) set_target_properties(harfbuzz::gobject PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_includedir}/harfbuzz" + INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" - IMPORTED_LOCATION "${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-gobject${_harfbuzz_lib_suffix}") + IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-gobject${_harfbuzz_lib_suffix}") endif () # Clean out variables we used in our scope. @@ -67,3 +91,7 @@ unset(_harfbuzz_revision) unset(_harfbuzz_age) unset(_harfbuzz_includedir) unset(_harfbuzz_libdir) +unset(_harfbuzz_prefix) +unset(exec_prefix) +unset(prefix) +unset(_harfbuzz_remove_string) diff --git a/src/meson.build b/src/meson.build index 87e8962d5..91065fb06 100644 --- a/src/meson.build +++ b/src/meson.build @@ -790,8 +790,8 @@ endif have_gobject = conf.get('HAVE_GOBJECT', 0) == 1 cmake_config = configuration_data() -cmake_config.set('libdir', get_option('prefix') / get_option('libdir')) -cmake_config.set('includedir', get_option('prefix') / get_option('includedir')) +cmake_config.set('libdir', '${prefix}/@0@'.format(get_option('libdir'))) +cmake_config.set('includedir', '${prefix}/@0@'.format(get_option('includedir'))) cmake_config.set('HB_LIBTOOL_VERSION_INFO', hb_libtool_version_info) cmake_config.set('have_gobject', '@0@'.format(have_gobject)) configure_file(input: 'harfbuzz-config.cmake.in', -- cgit v1.2.3 From da9b838910e62825717a8b2de8ce9c92e396136e Mon Sep 17 00:00:00 2001 From: Marco Rebhan Date: Tue, 8 Aug 2023 14:33:03 +0200 Subject: Re-do and clean up CMake support, making it use relocatable paths Closes #4025. --- meson.build | 21 ++++++++++ meson_options.txt | 4 ++ src/Makefile.am | 2 +- src/harfbuzz-config.cmake.in | 97 ++++++++------------------------------------ src/meson.build | 92 ++++++++++++++++++++++++++++++++++++++--- src/relative_to.py | 6 +++ 6 files changed, 135 insertions(+), 87 deletions(-) create mode 100755 src/relative_to.py diff --git a/meson.build b/meson.build index 324d1dd05..fc0892bd4 100644 --- a/meson.build +++ b/meson.build @@ -385,6 +385,26 @@ foreach check : check_funcs endif endforeach +# CMake support (package install dir) + +# Equivalent to configure_package_config_file(INSTALL_DESTINATION ...), see +# https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html#command:configure_package_config_file. +# In certain unusual packaging layouts such as Nixpkgs, the Harfbuzz package +# is installed into two Nix store paths, "out" and "dev", where "out" contains +# libraries only (i.e. lib/libharfbuzz.so) and "dev" contains development +# files, i.e. include and lib/cmake. If CMake package files are installed to +# "out", Nixpkgs will move them to "dev", which breaks assumptions about +# our file paths. Since we need to figure out relative install paths here +# to make a relocatable package, we do need to know the final path of our +# CMake files to calculate the correct relative paths. +# Of course, this still defaults to $libdir/cmake if unset, which works for +# most packaging layouts. +cmake_package_install_dir = get_option('cmakepackagedir') + +if cmake_package_install_dir == '' + cmake_package_install_dir = get_option('libdir') / 'cmake' +endif + subdir('src') if not get_option('utilities').disabled() @@ -415,6 +435,7 @@ build_summary = { 'libdir': get_option('libdir'), 'includedir': get_option('includedir'), 'datadir': get_option('datadir'), + 'cmakepackagedir': cmake_package_install_dir }, 'Unicode callbacks (you want at least one)': {'Builtin': true, diff --git a/meson_options.txt b/meson_options.txt index ace50eb31..97d6daec1 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -46,3 +46,7 @@ option('ragel_subproject', type: 'boolean', value: false, description: 'Build Ragel subproject if no suitable version is found') option('fuzzer_ldflags', type: 'string', description: 'Extra LDFLAGS used during linking of fuzzing binaries') + +# Install directory options +option('cmakepackagedir', type: 'string', + description: 'CMake package configuration install directory') diff --git a/src/Makefile.am b/src/Makefile.am index 430d44a45..bc2a3de63 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -14,7 +14,7 @@ check_PROGRAMS = EXTRA_DIST += harfbuzz.cc harfbuzz-subset.cc EXTRA_DIST += meson.build -EXTRA_DIST += fix_get_types.py +EXTRA_DIST += fix_get_types.py relative_to.py # Convenience targets: lib: $(BUILT_SOURCES) libharfbuzz.la diff --git a/src/harfbuzz-config.cmake.in b/src/harfbuzz-config.cmake.in index b22077d04..6abe2d62d 100644 --- a/src/harfbuzz-config.cmake.in +++ b/src/harfbuzz-config.cmake.in @@ -1,97 +1,32 @@ -# Set these variables so that the `${prefix}/lib` expands to something we can -# remove. -set(_harfbuzz_remove_string "REMOVE_ME") -set(exec_prefix "${_harfbuzz_remove_string}") -set(prefix "${_harfbuzz_remove_string}") +@PACKAGE_INIT@ -# Compute the installation prefix by stripping components from our current -# location. -get_filename_component(_harfbuzz_prefix "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY) -get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY) -set(_harfbuzz_libdir "@libdir@") -string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}") -set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}") -while (_harfbuzz_libdir_iter) - set(_harfbuzz_libdir_prev_iter "${_harfbuzz_libdir_iter}") - get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY) - if (_harfbuzz_libdir_prev_iter STREQUAL _harfbuzz_libdir_iter) - break() - endif () - get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY) -endwhile () -unset(_harfbuzz_libdir_iter) - -# Get the include subdir. -set(_harfbuzz_includedir "@includedir@") -string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_includedir "${_harfbuzz_includedir}") - -# Extract version information from libtool. -set(_harfbuzz_version_info "@HB_LIBTOOL_VERSION_INFO@") -string(REPLACE ":" ";" _harfbuzz_version_info "${_harfbuzz_version_info}") -list(GET _harfbuzz_version_info 0 - _harfbuzz_current) -list(GET _harfbuzz_version_info 1 - _harfbuzz_revision) -list(GET _harfbuzz_version_info 2 - _harfbuzz_age) -unset(_harfbuzz_version_info) - -if ("@default_library@" MATCHES "static") - set(_harfbuzz_lib_prefix "lib") - set(_harfbuzz_lib_suffix ".a") -else () - if (APPLE) - set(_harfbuzz_lib_prefix "${CMAKE_SHARED_LIBRARY_PREFIX}") - set(_harfbuzz_lib_suffix ".0${CMAKE_SHARED_LIBRARY_SUFFIX}") - elseif (UNIX) - set(_harfbuzz_lib_prefix "${CMAKE_SHARED_LIBRARY_PREFIX}") - set(_harfbuzz_lib_suffix "${CMAKE_SHARED_LIBRARY_SUFFIX}.0.${_harfbuzz_current}.${_harfbuzz_revision}") - elseif (WIN32) - set(_harfbuzz_lib_prefix "${CMAKE_IMPORT_LIBRARY_PREFIX}") - set(_harfbuzz_lib_suffix "${CMAKE_IMPORT_LIBRARY_SUFFIX}") - else () - # Unsupported. - set(harfbuzz_FOUND 0) - endif () -endif () +set_and_check(HARFBUZZ_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") # Add the libraries. -add_library(harfbuzz::harfbuzz SHARED IMPORTED) +add_library(harfbuzz::harfbuzz @HB_LIBRARY_TYPE@ IMPORTED) set_target_properties(harfbuzz::harfbuzz PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" - IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz${_harfbuzz_lib_suffix}") + INTERFACE_INCLUDE_DIRECTORIES "@PACKAGE_INCLUDE_INSTALL_DIR@" + IMPORTED_LOCATION "@PACKAGE_CMAKE_INSTALL_LIBDIR@/@HB_LIB_PREFIX@harfbuzz@HB_LIB_SUFFIX@") -add_library(harfbuzz::icu SHARED IMPORTED) +add_library(harfbuzz::icu @HB_LIBRARY_TYPE@ IMPORTED) set_target_properties(harfbuzz::icu PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" + INTERFACE_INCLUDE_DIRECTORIES "@PACKAGE_INCLUDE_INSTALL_DIR@" INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" - IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-icu${_harfbuzz_lib_suffix}") + IMPORTED_LOCATION "@PACKAGE_CMAKE_INSTALL_LIBDIR@/@HB_LIB_PREFIX@harfbuzz-icu@HB_LIB_SUFFIX@") -add_library(harfbuzz::subset SHARED IMPORTED) +add_library(harfbuzz::subset @HB_LIBRARY_TYPE@ IMPORTED) set_target_properties(harfbuzz::subset PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" + INTERFACE_INCLUDE_DIRECTORIES "@PACKAGE_INCLUDE_INSTALL_DIR@" INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" - IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-subset${_harfbuzz_lib_suffix}") + IMPORTED_LOCATION "@PACKAGE_CMAKE_INSTALL_LIBDIR@/@HB_LIB_PREFIX@harfbuzz-subset@HB_LIB_SUFFIX@") # Only add the gobject library if it was built. -set(_harfbuzz_have_gobject "@have_gobject@") -if (_harfbuzz_have_gobject) - add_library(harfbuzz::gobject SHARED IMPORTED) +if (@HB_HAVE_GOBJECT@) + add_library(harfbuzz::gobject @HB_LIBRARY_TYPE@ IMPORTED) set_target_properties(harfbuzz::gobject PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz" + INTERFACE_INCLUDE_DIRECTORIES "@PACKAGE_INCLUDE_INSTALL_DIR@" INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz" - IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/${_harfbuzz_lib_prefix}harfbuzz-gobject${_harfbuzz_lib_suffix}") + IMPORTED_LOCATION "@PACKAGE_CMAKE_INSTALL_LIBDIR@/@HB_LIB_PREFIX@harfbuzz-gobject@HB_LIB_SUFFIX@") endif () -# Clean out variables we used in our scope. -unset(_harfbuzz_lib_prefix) -unset(_harfbuzz_lib_suffix) -unset(_harfbuzz_current) -unset(_harfbuzz_revision) -unset(_harfbuzz_age) -unset(_harfbuzz_includedir) -unset(_harfbuzz_libdir) -unset(_harfbuzz_prefix) -unset(exec_prefix) -unset(prefix) -unset(_harfbuzz_remove_string) +check_required_components(harfbuzz) diff --git a/src/meson.build b/src/meson.build index 91065fb06..19f7cf27e 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,3 +1,5 @@ +fs = import('fs') + hb_version_h = configure_file( command: [find_program('gen-hb-version.py'), meson.project_version(), '@OUTPUT@', '@INPUT@'], input: 'hb-version.h.in', @@ -789,15 +791,95 @@ endif have_gobject = conf.get('HAVE_GOBJECT', 0) == 1 +# This code (especially PACKAGE_INIT) kept similar to what CMake's own +# configure_package_config_file() generates, see +# https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html#command:configure_package_config_file + cmake_config = configuration_data() -cmake_config.set('libdir', '${prefix}/@0@'.format(get_option('libdir'))) -cmake_config.set('includedir', '${prefix}/@0@'.format(get_option('includedir'))) -cmake_config.set('HB_LIBTOOL_VERSION_INFO', hb_libtool_version_info) -cmake_config.set('have_gobject', '@0@'.format(have_gobject)) +cmake_config_dir = cmake_package_install_dir / 'harfbuzz' + +have_fs_relative_to = meson.version().version_compare('>=1.3.0') + +if not have_fs_relative_to + relative_to = find_program('relative_to.py') +endif + +if have_fs_relative_to + cmake_package_prefix_dir = fs.relative_to(get_option('prefix'), get_option('prefix') / cmake_config_dir) +else + cmake_package_prefix_dir = run_command(relative_to, get_option('prefix'), get_option('prefix') / cmake_config_dir, check: true).stdout().strip() +endif + +cmake_package_prefix_dir = '${CMAKE_CURRENT_LIST_DIR}/@0@'.format(cmake_package_prefix_dir) + +# Make all the relevant paths relative to our prefix, so we can later append +# them onto ${PACKAGE_PREFIX_DIR} to get the correct paths. + +cmake_install_includedir = get_option('includedir') + +if fs.is_absolute(cmake_install_includedir) + if have_fs_relative_to + cmake_install_includedir = fs.relative_to(cmake_install_includedir, get_option('prefix')) + else + cmake_install_includedir = run_command(relative_to, cmake_install_includedir, get_option('prefix'), check: true).stdout().strip() + endif +endif + +cmake_install_libdir = get_option('libdir') + +if fs.is_absolute(cmake_install_libdir) + if have_fs_relative_to + cmake_install_libdir = fs.relative_to(cmake_install_libdir, get_option('prefix')) + else + cmake_install_libdir = run_command(relative_to, cmake_install_libdir, get_option('prefix'), check: true).stdout().strip() + endif +endif + +cmake_config.set('PACKAGE_INIT', ''' +get_filename_component(PACKAGE_PREFIX_DIR "@0@" ABSOLUTE) + +macro(set_and_check _var _file) + set(${_var} "${_file}") + if(NOT EXISTS "${_file}") + message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !") + endif() +endmacro() + +macro(check_required_components _NAME) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(NOT ${_NAME}_${comp}_FOUND) + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + endif() + endif() + endforeach() +endmacro() +'''.format(cmake_package_prefix_dir)) + +cmake_config.set('PACKAGE_CMAKE_INSTALL_INCLUDEDIR', '${PACKAGE_PREFIX_DIR}/@0@'.format(cmake_install_includedir)) +cmake_config.set('PACKAGE_CMAKE_INSTALL_LIBDIR', '${PACKAGE_PREFIX_DIR}/@0@'.format(cmake_install_libdir)) +cmake_config.set('PACKAGE_INCLUDE_INSTALL_DIR', '${PACKAGE_PREFIX_DIR}/@0@/@1@'.format(cmake_install_includedir, meson.project_name())) +cmake_config.set('HB_HAVE_GOBJECT', have_gobject ? 'YES' : 'NO') +cmake_config.set('HB_LIBRARY_TYPE', get_option('default_library') == 'static' ? 'STATIC' : 'SHARED') + +if get_option('default_library') == 'static' + cmake_config.set('HB_LIB_PREFIX', '${CMAKE_STATIC_LIBRARY_PREFIX}') + cmake_config.set('HB_LIB_SUFFIX', '${CMAKE_STATIC_LIBRARY_SUFFIX}') +elif host_machine.system() == 'darwin' + cmake_config.set('HB_LIB_PREFIX', '${CMAKE_SHARED_LIBRARY_PREFIX}') + cmake_config.set('HB_LIB_SUFFIX', '.@0@.${CMAKE_SHARED_LIBRARY_SUFFIX}'.format(hb_so_version)) +elif host_machine.system() == 'windows' + cmake_config.set('HB_LIB_PREFIX', '${CMAKE_IMPORT_LIBRARY_PREFIX}') + cmake_config.set('HB_LIB_SUFFIX', '${CMAKE_IMPORT_LIBRARY_SUFFIX}') +else + cmake_config.set('HB_LIB_PREFIX', '${CMAKE_SHARED_LIBRARY_PREFIX}') + cmake_config.set('HB_LIB_SUFFIX', '${CMAKE_SHARED_LIBRARY_SUFFIX}.@0@'.format(version)) +endif + configure_file(input: 'harfbuzz-config.cmake.in', output: 'harfbuzz-config.cmake', configuration: cmake_config, - install_dir: get_option('libdir') / 'cmake' / 'harfbuzz', + install_dir: cmake_config_dir, ) gobject_enums_c = [] diff --git a/src/relative_to.py b/src/relative_to.py new file mode 100755 index 000000000..8a676bf8f --- /dev/null +++ b/src/relative_to.py @@ -0,0 +1,6 @@ +#!/usr/bin/python3 + +import sys +from os import path + +print(path.relpath(sys.argv[1], sys.argv[2])) -- cgit v1.2.3 From 97d0e7a19f5e341a77c156faaa37eed8df6d8db7 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 19 Sep 2023 11:25:14 -0700 Subject: [instancer] add inner_maps as optional argument when creating item_variations_t This allows that we create item_variations_t with only a subset of the original varstore --- src/hb-ot-var-common.hh | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index aeb0097ba..25b460243 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1174,7 +1174,8 @@ struct TupleVariationData bool create_from_item_var_data (const VarData &var_data, const hb_vector_t>& regions, - const hb_map_t& axes_old_index_tag_map) + const hb_map_t& axes_old_index_tag_map, + const hb_inc_bimap_t* inner_map = nullptr) { /* NULL offset, to keep original varidx valid, just return */ if (&var_data == &Null (VarData)) @@ -1183,7 +1184,7 @@ struct TupleVariationData unsigned num_regions = var_data.get_region_index_count (); if (!tuple_vars.alloc (num_regions)) return false; - unsigned item_count = var_data.get_item_count (); + unsigned item_count = inner_map ? inner_map->get_population () : var_data.get_item_count (); unsigned row_size = var_data.get_row_size (); const HBUINT8 *delta_bytes = var_data.get_delta_bytes (); @@ -1199,7 +1200,8 @@ struct TupleVariationData for (unsigned i = 0; i < item_count; i++) { tuple.indices.arrayZ[i] = true; - tuple.deltas_x.arrayZ[i] = var_data.get_item_delta_fast (i, r, delta_bytes, row_size); + tuple.deltas_x.arrayZ[i] = var_data.get_item_delta_fast (inner_map ? inner_map->backward (i) : i, + r, delta_bytes, row_size); } unsigned region_index = var_data.get_region_index (r); @@ -1811,21 +1813,26 @@ struct item_variations_t { return varidx_map; } bool create_from_item_varstore (const VariationStore& varStore, - const hb_map_t& axes_old_index_tag_map) + const hb_map_t& axes_old_index_tag_map, + const hb_array_t inner_maps = hb_array_t ()) { const VarRegionList& regionList = varStore.get_region_list (); if (!regionList.get_var_regions (axes_old_index_tag_map, orig_region_list)) return false; unsigned num_var_data = varStore.get_sub_table_count (); + if (inner_maps && inner_maps.length != num_var_data) return false; if (!vars.alloc (num_var_data)) return false; for (unsigned i = 0; i < num_var_data; i++) { + if (inner_maps && !inner_maps.arrayZ[i].get_population ()) + continue; tuple_variations_t var_data_tuples; if (!var_data_tuples.create_from_item_var_data (varStore.get_sub_table (i), orig_region_list, - axes_old_index_tag_map)) + axes_old_index_tag_map, + inner_maps ? &(inner_maps.arrayZ[i]) : nullptr)) return false; vars.push (std::move (var_data_tuples)); -- cgit v1.2.3 From e81ad14dba9ddc70aca11a46242cfc20b593e878 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 19 Sep 2023 13:23:58 -0700 Subject: [instancer] change optimize() to as_item_varstore() which allows another option to skip optimization --- src/hb-ot-var-common.hh | 23 +++++++++++++++++++++-- src/hb-ot-var-mvar-table.hh | 2 +- src/test-item-varstore.cc | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 25b460243..b9d59ad7a 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1922,8 +1922,9 @@ struct item_variations_t return (!region_list.in_error ()) && (!region_map.in_error ()); } - /* main algorithm ported from fonttools VarStore_optimize() method */ - bool optimize (bool use_no_variation_idx=true) + /* main algorithm ported from fonttools VarStore_optimize() method, optimize + * varstore by default */ + bool as_item_varstore (bool optimize=true, bool use_no_variation_idx=true) { unsigned num_cols = region_list.length; /* pre-alloc a 2D vector for all sub_table's VarData rows */ @@ -1973,6 +1974,19 @@ struct item_variations_t } } + if (!optimize) + { + /* assemble a delta_row_encoding_t for this subtable, skip optimization so + * chars is not initialized, we only need delta rows for serialization */ + delta_row_encoding_t obj; + for (unsigned r = start_row; r < start_row + num_rows; r++) + obj.add_row (&(delta_rows.arrayZ[r])); + + encodings.push (std::move (obj)); + start_row += num_rows; + continue; + } + for (unsigned minor = 0; minor < num_rows; minor++) { const hb_vector_t& row = delta_rows[start_row + minor]; @@ -2019,6 +2033,11 @@ struct item_variations_t start_row += num_rows; } + + /* return directly if no optimization, maintain original VariationIndex so + * varidx_map would be empty */ + if (!optimize) return encodings.in_error (); + /* sort encoding_objs */ encoding_objs.qsort (); diff --git a/src/hb-ot-var-mvar-table.hh b/src/hb-ot-var-mvar-table.hh index a41e57880..9bbd904c5 100644 --- a/src/hb-ot-var-mvar-table.hh +++ b/src/hb-ot-var-mvar-table.hh @@ -111,7 +111,7 @@ struct MVAR if (!item_vars.instantiate (c->plan->axes_location, c->plan->axes_triple_distances)) return_trace (false); - if (!item_vars.optimize ()) + if (!item_vars.as_item_varstore ()) return_trace (false); /* serialize varstore */ diff --git a/src/test-item-varstore.cc b/src/test-item-varstore.cc index d1600d560..60ba81280 100644 --- a/src/test-item-varstore.cc +++ b/src/test-item-varstore.cc @@ -54,7 +54,7 @@ test_item_variations () result = item_vars.instantiate (normalized_axes_location, axes_triple_distances); assert (result); - result = item_vars.optimize (); + result = item_vars.as_item_varstore (false); assert (result); assert (item_vars.get_region_list().length == 8); } -- cgit v1.2.3 From 58e5d45de886319104007249d7e6a2b5b6584247 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 19 Sep 2023 10:33:32 -0700 Subject: [instancer] instantiate HVAR/VVAR --- src/hb-ot-var-hvar-table.hh | 87 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-var-hvar-table.hh b/src/hb-ot-var-hvar-table.hh index 490f883fc..b0a636e05 100644 --- a/src/hb-ot-var-hvar-table.hh +++ b/src/hb-ot-var-hvar-table.hh @@ -134,6 +134,36 @@ struct index_map_subset_plan_t } } + bool remap_after_instantiation (const hb_subset_plan_t *plan, + const hb_map_t& varidx_map) + { + /* recalculate bit_count after remapping */ + outer_bit_count = 1; + inner_bit_count = 1; + + for (const auto &_ : plan->new_to_old_gid_list) + { + hb_codepoint_t new_gid = _.first; + if (unlikely (new_gid >= map_count)) break; + + unsigned v = output_map.arrayZ[new_gid]; + unsigned *new_varidx; + if (!varidx_map.has (v, &new_varidx)) + return false; + + output_map.arrayZ[new_gid] = *new_varidx; + + unsigned outer = (*new_varidx) >> 16; + unsigned bit_count = (outer == 0) ? 1 : hb_bit_storage (outer); + outer_bit_count = hb_max (bit_count, outer_bit_count); + + unsigned inner = (*new_varidx) & 0xFFFF; + bit_count = (inner == 0) ? 1 : hb_bit_storage (inner); + inner_bit_count = hb_max (bit_count, inner_bit_count); + } + return true; + } + unsigned int get_inner_bit_count () const { return inner_bit_count; } unsigned int get_width () const { return ((outer_bit_count + inner_bit_count + 7) / 8); } unsigned int get_map_count () const { return map_count; } @@ -211,6 +241,16 @@ struct hvarvvar_subset_plan_t index_map_plans[i].remap (index_maps[i], outer_map, inner_maps, plan); } + /* remap */ + bool remap_index_map_plans (const hb_subset_plan_t *plan, + const hb_map_t& varidx_map) + { + for (unsigned i = 0; i < index_map_plans.length; i++) + if (!index_map_plans[i].remap_after_instantiation (plan, varidx_map)) + return false; + return true; + } + void fini () { for (unsigned int i = 0; i < inner_sets.length; i++) @@ -289,6 +329,9 @@ struct HVARVVAR bool _subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); + if (c->plan->all_axes_pinned) + return_trace (false); + hvarvvar_subset_plan_t hvar_plan; hb_vector_t index_maps; @@ -302,11 +345,47 @@ struct HVARVVAR out->version.major = 1; out->version.minor = 0; - if (unlikely (!out->varStore - .serialize_serialize (c->serializer, - hvar_plan.var_store, - hvar_plan.inner_maps.as_array ()))) + if (c->plan->normalized_coords) + { + /* TODO: merge these 3 calls into 1 call that executes all 3 + * functions */ + item_variations_t item_vars; + if (!item_vars.create_from_item_varstore (this+varStore, + c->plan->axes_old_index_tag_map, + hvar_plan.inner_maps.as_array ())) + return_trace (false); + + if (!item_vars.instantiate (c->plan->axes_location, c->plan->axes_triple_distances)) + return_trace (false); + + /* if glyph indices are used as implicit delta-set indices, no need to + * optimiza varstore, maintain original variation indices */ + if (!item_vars.as_item_varstore (advMap == 0 ? false : true, + false /* use_no_variation_idx = false */)) + return_trace (false); + + if (!out->varStore.serialize_serialize (c->serializer, + item_vars.has_long_word (), + c->plan->axis_tags, + item_vars.get_region_list (), + item_vars.get_vardata_encodings ())) + return_trace (false); + + /* if varstore is optimized, remap output_map */ + if (advMap) + { + if (!hvar_plan.remap_index_map_plans (c->plan, item_vars.get_varidx_map ())) + return_trace (false); + } + } + else + { + if (unlikely (!out->varStore + .serialize_serialize (c->serializer, + hvar_plan.var_store, + hvar_plan.inner_maps.as_array ()))) return_trace (false); + } return_trace (out->T::serialize_index_maps (c->serializer, hvar_plan.index_map_plans.as_array ())); -- cgit v1.2.3 From 2d2818c0963d44cde07e612c5310ac2dc85cc846 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 20 Sep 2023 10:30:47 -0700 Subject: [instancer] update expected tests to include HVAR/VVAR tables --- ...n-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 8256 -> 8432 bytes ...s.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 7244 -> 7336 bytes ...n-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 7292 -> 7484 bytes ...s.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 6760 -> 6848 bytes ...odepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf | Bin 3800 -> 4108 bytes ...ariations.retain-all-codepoint.wght=300-600.ttf | Bin 6280 -> 6616 bytes ...ariations.retain-all-codepoint.wght=500-800.ttf | Bin 6760 -> 7096 bytes ...ariations.retain-all-codepoint.wght=300-600.ttf | Bin 194432 -> 197056 bytes ...ariations.retain-all-codepoint.wght=500-800.ttf | Bin 143840 -> 145004 bytes .../profiles/no-tables-with-item-variations.txt | 2 +- 10 files changed, 1 insertion(+), 1 deletion(-) diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf index 92b190bed..e2162ab6a 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf index 7fa245244..4c8a5a88e 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf index 2e5565305..7442e4298 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf index fc890fb96..16a99018c 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf index 679e6c721..35249b4e5 100644 Binary files a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf index 3508c732c..94a54b4fa 100644 Binary files a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf index a14e79ed7..b1564ad81 100644 Binary files a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf differ diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf index 5f6b2a0b4..1ea11a59c 100644 Binary files a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf and b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf differ diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf index edd451312..d6365c200 100644 Binary files a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf and b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf differ diff --git a/test/subset/data/profiles/no-tables-with-item-variations.txt b/test/subset/data/profiles/no-tables-with-item-variations.txt index 2a5aa1892..d4ed0585e 100644 --- a/test/subset/data/profiles/no-tables-with-item-variations.txt +++ b/test/subset/data/profiles/no-tables-with-item-variations.txt @@ -1 +1 @@ ---drop-tables+=HVAR,VVAR,GDEF,COLR,GPOS +--drop-tables+=GDEF,COLR,GPOS -- cgit v1.2.3 From 5ec21d4af4bc620cb58ff715e2a66288128c8d6f Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 20 Sep 2023 09:31:03 -0700 Subject: [instancer] fix delta_row_encoding_t constructor always move chars_ --- src/hb-ot-layout-common.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 4a9f15774..8d003a2b3 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2317,7 +2317,7 @@ struct delta_row_encoding_t delta_row_encoding_t () { - chars = chars_; + chars = std::move (chars_); width = get_width (); columns = get_columns (); overhead = get_chars_overhead (columns); -- cgit v1.2.3 From b5f7ca1ab49b3842d3c2ba4ac9fbd0531378d7b6 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 20 Sep 2023 11:28:15 -0700 Subject: [instancer] fix bots --- src/hb-ot-var-common.hh | 2 +- src/hb-ot-var-hvar-table.hh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index b9d59ad7a..b173fba17 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -2036,7 +2036,7 @@ struct item_variations_t /* return directly if no optimization, maintain original VariationIndex so * varidx_map would be empty */ - if (!optimize) return encodings.in_error (); + if (!optimize) return !encodings.in_error (); /* sort encoding_objs */ encoding_objs.qsort (); diff --git a/src/hb-ot-var-hvar-table.hh b/src/hb-ot-var-hvar-table.hh index b0a636e05..e944ff13a 100644 --- a/src/hb-ot-var-hvar-table.hh +++ b/src/hb-ot-var-hvar-table.hh @@ -146,8 +146,8 @@ struct index_map_subset_plan_t hb_codepoint_t new_gid = _.first; if (unlikely (new_gid >= map_count)) break; - unsigned v = output_map.arrayZ[new_gid]; - unsigned *new_varidx; + uint32_t v = output_map.arrayZ[new_gid]; + uint32_t *new_varidx; if (!varidx_map.has (v, &new_varidx)) return false; -- cgit v1.2.3 From ef4ff1d6a4f2343440e278ef1177b07f6af8f5dc Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 20 Sep 2023 11:35:33 -0700 Subject: [instancer] make varstore items sorting method match fonttool's Also update expected tests --- src/hb-ot-var-common.hh | 9 ++++++++- ...n-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 8432 -> 8432 bytes ...s.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 7336 -> 7336 bytes ...n-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 7484 -> 7484 bytes ...s.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 6848 -> 6848 bytes ...odepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf | Bin 4108 -> 4108 bytes ...ariations.retain-all-codepoint.wght=300-600.ttf | Bin 6616 -> 6616 bytes ...ariations.retain-all-codepoint.wght=300-600.ttf | Bin 197056 -> 197056 bytes ...ariations.retain-all-codepoint.wght=500-800.ttf | Bin 145004 -> 145004 bytes 9 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index b173fba17..00bea20ac 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -2174,7 +2174,14 @@ struct item_variations_t const hb_vector_t** a = (const hb_vector_t**) pa; const hb_vector_t** b = (const hb_vector_t**) pb; - return ((*b)->as_array ()).cmp ((*a)->as_array ()); + for (unsigned i = 0; i < (*b)->length; i++) + { + int va = (*a)->arrayZ[i]; + int vb = (*b)->arrayZ[i]; + if (va != vb) + return va < vb ? -1 : 1; + } + return 0; } }; diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf index e2162ab6a..0d9701714 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf index 4c8a5a88e..ef2b65b78 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf index 7442e4298..2e34bb887 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf index 16a99018c..95bf757e3 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf index 35249b4e5..2cf4eb41b 100644 Binary files a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf index 94a54b4fa..d09940a82 100644 Binary files a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf differ diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf index 1ea11a59c..b26b28aa2 100644 Binary files a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf and b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf differ diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf index d6365c200..c5d37c547 100644 Binary files a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf and b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf differ -- cgit v1.2.3 From 284889b0317c317ae00fe1a6e32db1f9213cb5e2 Mon Sep 17 00:00:00 2001 From: Thomas Petillon Date: Wed, 20 Sep 2023 20:17:48 +0200 Subject: [subset] Drop fvar, avar, cvar, MVAR tables when in HB_NO_VAR mode --- src/hb-subset.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hb-subset.cc b/src/hb-subset.cc index de3e876f7..2c0752170 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -515,6 +515,8 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_HVAR: return _subset (plan, buf); case HB_OT_TAG_VVAR: return _subset (plan, buf); #endif + +#ifndef HB_NO_VAR case HB_OT_TAG_fvar: if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); return _subset (plan, buf); @@ -527,6 +529,8 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_MVAR: if (plan->user_axes_location.is_empty ()) return _passthrough (plan, tag); return _subset (plan, buf); +#endif + case HB_OT_TAG_STAT: if (!plan->user_axes_location.is_empty ()) return _subset (plan, buf); else return _passthrough (plan, tag); -- cgit v1.2.3 From da2c59d71f687c38a29389d81d6d6f911994c403 Mon Sep 17 00:00:00 2001 From: Thomas Petillon Date: Tue, 19 Sep 2023 17:01:04 +0200 Subject: [instancer] Delete redundant code block in cvar subsetting That case is handled in hb-subset.cc. It also made compilation with HB_NO_VAR fail because it accessed table.fvar. --- src/hb-ot-var-cvar-table.hh | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/hb-ot-var-cvar-table.hh b/src/hb-ot-var-cvar-table.hh index adb81769b..0814940aa 100644 --- a/src/hb-ot-var-cvar-table.hh +++ b/src/hb-ot-var-cvar-table.hh @@ -143,19 +143,6 @@ struct cvar if (c->plan->all_axes_pinned) return_trace (false); - /* subset() for cvar is called by partial instancing only, we always pass - * through cvar table in other cases */ - if (!c->plan->normalized_coords) - { - unsigned axis_count = c->plan->source->table.fvar->get_axis_count (); - unsigned total_size = min_size + tupleVariationData.get_size (axis_count); - char *out = c->serializer->allocate_size (total_size); - if (unlikely (!out)) return_trace (false); - - hb_memcpy (out, this, total_size); - return_trace (true); - } - OT::TupleVariationData::tuple_variations_t tuple_variations; unsigned axis_count = c->plan->axes_old_index_tag_map.get_population (); -- cgit v1.2.3 From 5aa4865a86fd97e76e857823dd4b32c65d2fa0ad Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 20 Sep 2023 14:52:58 -0700 Subject: [instancer] fix compile warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In constructor ‘OT::delta_row_encoding_t::delta_row_encoding_t(OT::delta_row_encoding_t&&)’, inlined from ‘Type* hb_vector_t::push(Args&& ...) [with Args = {OT::delta_row_encoding_t}; Type = OT::delta_row_encoding_t; bool sorted = false]’ at ../src/hb-vector.hh:221:12, inlined from ‘bool OT::item_variations_t::as_item_varstore(bool, bool)’ at ../src/hb-ot-var-common.hh:1985:24: ../src/hb-ot-layout-common.hh:2304:8: warning: ‘obj.OT::delta_row_encoding_t::width’ may be used uninitialized [-Wmaybe-uninitialized] 2304 | struct delta_row_encoding_t | ^~~~~~~~~~~~~~~~~~~~ ../src/hb-ot-var-common.hh: In member function ‘bool OT::item_variations_t::as_item_varstore(bool, bool)’: ../src/hb-ot-var-common.hh:1981:30: note: ‘obj.OT::delta_row_encoding_t::width’ was declared here 1981 | delta_row_encoding_t obj; | ^~~ In constructor ‘OT::delta_row_encoding_t::delta_row_encoding_t(OT::delta_row_encoding_t&&)’, inlined from ‘Type* hb_vector_t::push(Args&& ...) [with Args = {OT::delta_row_encoding_t}; Type = OT::delta_row_encoding_t; bool sorted = false]’ at ../src/hb-vector.hh:221:12, inlined from ‘bool OT::item_variations_t::as_item_varstore(bool, bool)’ at ../src/hb-ot-var-common.hh:1985:24: ../src/hb-ot-layout-common.hh:2304:8: warning: ‘obj.OT::delta_row_encoding_t::overhead’ may be used uninitialized [-Wmaybe-uninitialized] 2304 | struct delta_row_encoding_t | ^~~~~~~~~~~~~~~~~~~~ ../src/hb-ot-var-common.hh: In member function ‘bool OT::item_variations_t::as_item_varstore(bool, bool)’: ../src/hb-ot-var-common.hh:1981:30: note: ‘obj.OT::delta_row_encoding_t::overhead’ was declared here 1981 | delta_row_encoding_t obj; --- src/hb-ot-layout-common.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 8d003a2b3..4c235ff44 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2306,9 +2306,9 @@ struct delta_row_encoding_t /* each byte represents a region, value is one of 0/1/2/4, which means bytes * needed for this region */ hb_vector_t chars; - unsigned width; + unsigned width = 0; hb_vector_t columns; - unsigned overhead; + unsigned overhead = 0; hb_vector_t*> items; delta_row_encoding_t () = default; -- cgit v1.2.3 From b8121ccbb687dc853118e81810cc0565ce0037d4 Mon Sep 17 00:00:00 2001 From: Duncan Overbruck Date: Thu, 21 Sep 2023 15:41:09 +0200 Subject: [meson] keep asserts in test programs --- src/meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meson.build b/src/meson.build index d6c353e13..5401e5df6 100644 --- a/src/meson.build +++ b/src/meson.build @@ -712,7 +712,7 @@ if get_option('tests').enabled() foreach name, source : noinst_programs executable(name, source, include_directories: incconfig, - cpp_args: cpp_args, + cpp_args: cpp_args + ['-UNDEBUG'], dependencies: libharfbuzz_dep, install: false, ) -- cgit v1.2.3 From 69da5aae028417dacf4c6617e49beb7dfbeb20e3 Mon Sep 17 00:00:00 2001 From: inobelar Date: Fri, 22 Sep 2023 21:27:12 +0000 Subject: Added minor fixes to build without errors with gcc 4.9.2 --- src/hb-map.hh | 22 +++++++++++----------- src/hb-vector.hh | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 6ea416658..2b5bbfb1b 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -106,10 +106,10 @@ struct hb_hashmap_t uint32_t total_hash () const { return (hash * 31) + hb_hash (value); } - static constexpr bool is_trivial = std::is_trivially_constructible::value && - std::is_trivially_destructible::value && - std::is_trivially_constructible::value && - std::is_trivially_destructible::value; + static constexpr bool is_trivial = hb_is_trivially_constructible(K) && + hb_is_trivially_destructible(K) && + hb_is_trivially_constructible(V) && + hb_is_trivially_destructible(V); }; hb_object_header_t header; @@ -398,37 +398,37 @@ struct hb_hashmap_t auto iter_items () const HB_AUTO_RETURN ( - + hb_iter (items, size ()) + + hb_iter (items, this->size ()) | hb_filter (&item_t::is_real) ) auto iter_ref () const HB_AUTO_RETURN ( - + iter_items () + + this->iter_items () | hb_map (&item_t::get_pair_ref) ) auto iter () const HB_AUTO_RETURN ( - + iter_items () + + this->iter_items () | hb_map (&item_t::get_pair) ) auto keys_ref () const HB_AUTO_RETURN ( - + iter_items () + + this->iter_items () | hb_map (&item_t::get_key) ) auto keys () const HB_AUTO_RETURN ( - + keys_ref () + + this->keys_ref () | hb_map (hb_ridentity) ) auto values_ref () const HB_AUTO_RETURN ( - + iter_items () + + this->iter_items () | hb_map (&item_t::get_value) ) auto values () const HB_AUTO_RETURN ( - + values_ref () + + this->values_ref () | hb_map (hb_ridentity) ) diff --git a/src/hb-vector.hh b/src/hb-vector.hh index 66e687a1a..13cfe56b5 100644 --- a/src/hb-vector.hh +++ b/src/hb-vector.hh @@ -460,7 +460,7 @@ struct hb_vector_t Type pop () { if (!length) return Null (Type); - Type v {std::move (arrayZ[length - 1])}; + Type v (std::move (arrayZ[length - 1])); arrayZ[length - 1].~Type (); length--; return v; -- cgit v1.2.3 From 42b8534b14419580dd35f865944081196217cb6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 10:25:08 +0000 Subject: Bump github/codeql-action from 2.21.7 to 2.21.8 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.21.7 to 2.21.8. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/04daf014b50eaf774287bf3f0f1869d4b4c4b913...6a28655e3dcb49cb0840ea372fd6d17733edd8a4) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 5150630c6..4f847304f 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@04daf014b50eaf774287bf3f0f1869d4b4c4b913 # v2.21.7 + uses: github/codeql-action/upload-sarif@6a28655e3dcb49cb0840ea372fd6d17733edd8a4 # v2.21.8 with: sarif_file: results.sarif -- cgit v1.2.3 From 00de5d0068d189a7dcbd1ccb10f55db95d240340 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 10:25:15 +0000 Subject: Bump actions/checkout from 4.0.0 to 4.1.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 4.0.0 to 4.1.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/3df4ab11eba7bda6032a0b82a6bb43b11571feac...8ade135a41bc03ea155e62e844d188df1ea18608) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/arm-ci.yml | 2 +- .github/workflows/configs-build.yml | 2 +- .github/workflows/coverity-scan.yml | 2 +- .github/workflows/linux-ci.yml | 2 +- .github/workflows/macos-ci.yml | 2 +- .github/workflows/msvc-ci.yml | 2 +- .github/workflows/msys2-ci.yml | 2 +- .github/workflows/scorecard.yml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/arm-ci.yml b/.github/workflows/arm-ci.yml index 9f3c70cb7..66f75ffc2 100644 --- a/.github/workflows/arm-ci.yml +++ b/.github/workflows/arm-ci.yml @@ -15,7 +15,7 @@ jobs: container: image: devkitpro/devkitarm:latest steps: - - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - name: Configure CMake run: | cmake -S . -B build \ diff --git a/.github/workflows/configs-build.yml b/.github/workflows/configs-build.yml index e9103137e..a1c8a8f05 100644 --- a/.github/workflows/configs-build.yml +++ b/.github/workflows/configs-build.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - name: install dependencies run: sudo apt-get install gcc - name: HB_DISABLE_DEPRECATED diff --git a/.github/workflows/coverity-scan.yml b/.github/workflows/coverity-scan.yml index 6f2e5a9dc..70f3fe291 100644 --- a/.github/workflows/coverity-scan.yml +++ b/.github/workflows/coverity-scan.yml @@ -11,7 +11,7 @@ jobs: latest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - run: sudo apt-get install gcc clang wget git curl pkg-config libfreetype6-dev libglib2.0-dev libicu-dev libgraphite2-dev diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 720bc1287..6eca1772e 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - name: Setup Ccache uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: diff --git a/.github/workflows/macos-ci.yml b/.github/workflows/macos-ci.yml index 9a1d4a87b..117f43153 100644 --- a/.github/workflows/macos-ci.yml +++ b/.github/workflows/macos-ci.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - name: Setup Ccache uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: diff --git a/.github/workflows/msvc-ci.yml b/.github/workflows/msvc-ci.yml index f9ef58420..ac6c68bc9 100644 --- a/.github/workflows/msvc-ci.yml +++ b/.github/workflows/msvc-ci.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - name: Setup Ccache uses: hendrikmuhs/ccache-action@6d1841ec156c39a52b1b23a810da917ab98da1f4 # v1.2.10 with: diff --git a/.github/workflows/msys2-ci.yml b/.github/workflows/msys2-ci.yml index 9677fd8a9..33fc703dd 100644 --- a/.github/workflows/msys2-ci.yml +++ b/.github/workflows/msys2-ci.yml @@ -33,7 +33,7 @@ jobs: shell: msys2 {0} steps: - name: Checkout - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - name: Setup MSYS2 uses: msys2/setup-msys2@cf96e00c0aab3788743aaf63b64146f0d383cee9 # v2 with: diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 4f847304f..29add1e2b 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 with: persist-credentials: false -- cgit v1.2.3 From c8c97864e8c810068123ef62947be13675df54c2 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 21 Sep 2023 11:29:43 -0700 Subject: [instancer] simplify item_variations_t API calls merge create,instantiate and as_item_varstore into one API --- src/hb-ot-var-common.hh | 19 +++++++++++++++++-- src/hb-ot-var-hvar-table.hh | 18 ++++-------------- src/hb-ot-var-mvar-table.hh | 7 +------ src/test-item-varstore.cc | 2 +- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 00bea20ac..ee6e35862 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1812,6 +1812,20 @@ struct item_variations_t const hb_map_t& get_varidx_map () const { return varidx_map; } + bool instantiate (const VariationStore& varStore, + const hb_subset_plan_t *plan, + bool optimize=true, + bool use_no_variation_idx=true, + const hb_array_t inner_maps = hb_array_t ()) + { + if (!create_from_item_varstore (varStore, plan->axes_old_index_tag_map, inner_maps)) + return false; + if (!instantiate_tuple_vars (plan->axes_location, plan->axes_triple_distances)) + return false; + return as_item_varstore (optimize, use_no_variation_idx); + } + + /* keep below APIs public only for unit test: test-item-varstore */ bool create_from_item_varstore (const VariationStore& varStore, const hb_map_t& axes_old_index_tag_map, const hb_array_t inner_maps = hb_array_t ()) @@ -1840,8 +1854,8 @@ struct item_variations_t return !vars.in_error (); } - bool instantiate (const hb_hashmap_t& normalized_axes_location, - const hb_hashmap_t& axes_triple_distances) + bool instantiate_tuple_vars (const hb_hashmap_t& normalized_axes_location, + const hb_hashmap_t& axes_triple_distances) { for (tuple_variations_t& tuple_vars : vars) if (!tuple_vars.instantiate (normalized_axes_location, axes_triple_distances)) @@ -1926,6 +1940,7 @@ struct item_variations_t * varstore by default */ bool as_item_varstore (bool optimize=true, bool use_no_variation_idx=true) { + if (!region_list) return false; unsigned num_cols = region_list.length; /* pre-alloc a 2D vector for all sub_table's VarData rows */ unsigned total_rows = 0; diff --git a/src/hb-ot-var-hvar-table.hh b/src/hb-ot-var-hvar-table.hh index e944ff13a..ca1ea1ca8 100644 --- a/src/hb-ot-var-hvar-table.hh +++ b/src/hb-ot-var-hvar-table.hh @@ -347,21 +347,11 @@ struct HVARVVAR if (c->plan->normalized_coords) { - /* TODO: merge these 3 calls into 1 call that executes all 3 - * functions */ item_variations_t item_vars; - if (!item_vars.create_from_item_varstore (this+varStore, - c->plan->axes_old_index_tag_map, - hvar_plan.inner_maps.as_array ())) - return_trace (false); - - if (!item_vars.instantiate (c->plan->axes_location, c->plan->axes_triple_distances)) - return_trace (false); - - /* if glyph indices are used as implicit delta-set indices, no need to - * optimiza varstore, maintain original variation indices */ - if (!item_vars.as_item_varstore (advMap == 0 ? false : true, - false /* use_no_variation_idx = false */)) + if (!item_vars.instantiate (this+varStore, c->plan, + advMap == 0 ? false : true, + false, /* use_no_variation_idx = false */ + hvar_plan.inner_maps.as_array ())) return_trace (false); if (!out->varStore.serialize_serialize (c->serializer, diff --git a/src/hb-ot-var-mvar-table.hh b/src/hb-ot-var-mvar-table.hh index 9bbd904c5..ceabc9a3e 100644 --- a/src/hb-ot-var-mvar-table.hh +++ b/src/hb-ot-var-mvar-table.hh @@ -105,13 +105,8 @@ struct MVAR item_variations_t item_vars; const VariationStore& src_var_store = this+varStore; - if (!item_vars.create_from_item_varstore (src_var_store, c->plan->axes_old_index_tag_map)) - return_trace (false); - - if (!item_vars.instantiate (c->plan->axes_location, c->plan->axes_triple_distances)) - return_trace (false); - if (!item_vars.as_item_varstore ()) + if (!item_vars.instantiate (src_var_store, c->plan)) return_trace (false); /* serialize varstore */ diff --git a/src/test-item-varstore.cc b/src/test-item-varstore.cc index 60ba81280..3e0875ecb 100644 --- a/src/test-item-varstore.cc +++ b/src/test-item-varstore.cc @@ -52,7 +52,7 @@ test_item_variations () hb_hashmap_t axes_triple_distances; axes_triple_distances.set (axis_tag, TripleDistances (200.f, 500.f)); - result = item_vars.instantiate (normalized_axes_location, axes_triple_distances); + result = item_vars.instantiate_tuple_vars (normalized_axes_location, axes_triple_distances); assert (result); result = item_vars.as_item_varstore (false); assert (result); -- cgit v1.2.3 From 77f24d822e726b0075d9aab4dc8600eb1b7dc481 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 22 Sep 2023 14:47:11 -0700 Subject: [instancer] remap layout var_idxes code update make hb_collect_variation_indices_context_t only collect layout variation indices. --- src/OT/Layout/GDEF/GDEF.hh | 26 +++++++++++++++++++------- src/hb-ot-layout-common.hh | 28 +++------------------------- src/hb-subset-plan.cc | 26 ++++++-------------------- 3 files changed, 28 insertions(+), 52 deletions(-) diff --git a/src/OT/Layout/GDEF/GDEF.hh b/src/OT/Layout/GDEF/GDEF.hh index 4f85d3ce5..ea2696d31 100644 --- a/src/OT/Layout/GDEF/GDEF.hh +++ b/src/OT/Layout/GDEF/GDEF.hh @@ -922,17 +922,32 @@ struct GDEF { get_lig_caret_list ().collect_variation_indices (c); } void remap_layout_variation_indices (const hb_set_t *layout_variation_indices, + const hb_vector_t& normalized_coords, + bool calculate_delta, /* not pinned at default */ + bool no_variations, /* all axes pinned */ hb_hashmap_t> *layout_variation_idx_delta_map /* OUT */) const { if (!has_var_store ()) return; - if (layout_variation_indices->is_empty ()) return; - + const VariationStore &var_store = get_var_store (); + float *store_cache = var_store.create_cache (); + unsigned new_major = 0, new_minor = 0; unsigned last_major = (layout_variation_indices->get_min ()) >> 16; for (unsigned idx : layout_variation_indices->iter ()) { + int delta = 0; + if (calculate_delta) + delta = roundf (var_store.get_delta (idx, normalized_coords.arrayZ, + normalized_coords.length, store_cache)); + + if (no_variations) + { + layout_variation_idx_delta_map->set (idx, hb_pair_t (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta)); + continue; + } + uint16_t major = idx >> 16; - if (major >= get_var_store ().get_sub_table_count ()) break; + if (major >= var_store.get_sub_table_count ()) break; if (major != last_major) { new_minor = 0; @@ -940,14 +955,11 @@ struct GDEF } unsigned new_idx = (new_major << 16) + new_minor; - if (!layout_variation_idx_delta_map->has (idx)) - continue; - int delta = hb_second (layout_variation_idx_delta_map->get (idx)); - layout_variation_idx_delta_map->set (idx, hb_pair_t (new_idx, delta)); ++new_minor; last_major = major; } + var_store.destroy_cache (store_cache); } protected: diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 4c235ff44..2146a1726 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -191,27 +191,15 @@ struct hb_collect_variation_indices_context_t : static return_t default_return_value () { return hb_empty_t (); } hb_set_t *layout_variation_indices; - hb_hashmap_t> *varidx_delta_map; - hb_vector_t *normalized_coords; - const VariationStore *var_store; const hb_set_t *glyph_set; const hb_map_t *gpos_lookups; - float *store_cache; hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_, - hb_hashmap_t> *varidx_delta_map_, - hb_vector_t *normalized_coords_, - const VariationStore *var_store_, const hb_set_t *glyph_set_, - const hb_map_t *gpos_lookups_, - float *store_cache_) : + const hb_map_t *gpos_lookups_) : layout_variation_indices (layout_variation_indices_), - varidx_delta_map (varidx_delta_map_), - normalized_coords (normalized_coords_), - var_store (var_store_), glyph_set (glyph_set_), - gpos_lookups (gpos_lookups_), - store_cache (store_cache_) {} + gpos_lookups (gpos_lookups_) {} }; template @@ -3984,17 +3972,7 @@ struct VariationDevice } void collect_variation_index (hb_collect_variation_indices_context_t *c) const - { - c->layout_variation_indices->add (varIdx); - int delta = 0; - if (c->normalized_coords && c->var_store) - delta = roundf (c->var_store->get_delta (varIdx, c->normalized_coords->arrayZ, - c->normalized_coords->length, c->store_cache)); - - /* set new varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX here, will remap - * varidx later*/ - c->varidx_delta_map->set (varIdx, hb_pair_t (HB_OT_LAYOUT_NO_VARIATIONS_INDEX, delta)); - } + { c->layout_variation_indices->add (varIdx); } bool sanitize (hb_sanitize_context_t *c) const { diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 7cb306eb5..c688b7187 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -399,34 +399,20 @@ _collect_layout_variation_indices (hb_subset_plan_t* plan) return; } - const OT::VariationStore *var_store = nullptr; hb_set_t varidx_set; - float *store_cache = nullptr; - bool collect_delta = plan->pinned_at_default ? false : true; - if (collect_delta) - { - if (gdef->has_var_store ()) - { - var_store = &(gdef->get_var_store ()); - store_cache = var_store->create_cache (); - } - } - OT::hb_collect_variation_indices_context_t c (&varidx_set, - &plan->layout_variation_idx_delta_map, - plan->normalized_coords ? &(plan->normalized_coords) : nullptr, - var_store, &plan->_glyphset_gsub, - &plan->gpos_lookups, - store_cache); + &plan->gpos_lookups); gdef->collect_variation_indices (&c); if (hb_ot_layout_has_positioning (plan->source)) gpos->collect_variation_indices (&c); - var_store->destroy_cache (store_cache); - - gdef->remap_layout_variation_indices (&varidx_set, &plan->layout_variation_idx_delta_map); + gdef->remap_layout_variation_indices (&varidx_set, + plan->normalized_coords, + !plan->pinned_at_default, + plan->all_axes_pinned, + &plan->layout_variation_idx_delta_map); unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0; _generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps); -- cgit v1.2.3 From c8594baa478d09b60e1553dacae32345efef4272 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 21 Sep 2023 11:45:01 -0700 Subject: [instancer] instantiate GDEF varStore And update layout var idxes accordingly --- src/OT/Layout/GDEF/GDEF.hh | 38 +++++++++++++++++++++++++++++++++++++- src/hb-subset-plan-member-list.hh | 2 +- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/OT/Layout/GDEF/GDEF.hh b/src/OT/Layout/GDEF/GDEF.hh index ea2696d31..62e0fb847 100644 --- a/src/OT/Layout/GDEF/GDEF.hh +++ b/src/OT/Layout/GDEF/GDEF.hh @@ -29,7 +29,7 @@ #ifndef OT_LAYOUT_GDEF_GDEF_HH #define OT_LAYOUT_GDEF_GDEF_HH -#include "../../../hb-ot-layout-common.hh" +#include "../../../hb-ot-var-common.hh" #include "../../../hb-font.hh" #include "../../../hb-cache.hh" @@ -602,6 +602,26 @@ struct GDEFVersion1_2 (version.to_int () < 0x00010003u || varStore.sanitize (c, this))); } + static void remap_varidx_after_instantiation (const hb_map_t& varidx_map, + hb_hashmap_t>& layout_variation_idx_delta_map /* IN/OUT */) + { + /* varidx_map is empty which means varstore is empty after instantiation, + * no variations, map all varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX. + * varidx_map doesn't have original varidx, indicating delta row is all + * zeros, map varidx to HB_OT_LAYOUT_NO_VARIATIONS_INDEX */ + for (auto _ : layout_variation_idx_delta_map.iter_ref ()) + { + /* old_varidx->(varidx, delta) mapping generated for subsetting, then this + * varidx is used as key of varidx_map during instantiation */ + uint32_t varidx = _.second.first; + uint32_t *new_varidx; + if (varidx_map.has (varidx, &new_varidx)) + _.second.first = *new_varidx; + else + _.second.first = HB_OT_LAYOUT_NO_VARIATIONS_INDEX; + } + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); @@ -624,6 +644,22 @@ struct GDEFVersion1_2 { if (c->plan->all_axes_pinned) out->varStore = 0; + else if (c->plan->normalized_coords) + { + if (varStore) + { + item_variations_t item_vars; + if (item_vars.instantiate (this+varStore, c->plan, true, true, + c->plan->gdef_varstore_inner_maps.as_array ())) + subset_varstore = out->varStore.serialize_serialize (c->serializer, + item_vars.has_long_word (), + c->plan->axis_tags, + item_vars.get_region_list (), + item_vars.get_vardata_encodings ()); + remap_varidx_after_instantiation (item_vars.get_varidx_map (), + c->plan->layout_variation_idx_delta_map); + } + } else subset_varstore = out->varStore.serialize_subset (c, varStore, this, c->plan->gdef_varstore_inner_maps.as_array ()); } diff --git a/src/hb-subset-plan-member-list.hh b/src/hb-subset-plan-member-list.hh index 46837aded..8bc1fcb56 100644 --- a/src/hb-subset-plan-member-list.hh +++ b/src/hb-subset-plan-member-list.hh @@ -92,7 +92,7 @@ HB_SUBSET_PLAN_MEMBER (hb_map_t, colrv1_layers) HB_SUBSET_PLAN_MEMBER (hb_map_t, colr_palettes) //Old layout item variation index -> (New varidx, delta) mapping -HB_SUBSET_PLAN_MEMBER (hb_hashmap_t E()>), layout_variation_idx_delta_map) +HB_SUBSET_PLAN_MEMBER (mutable hb_hashmap_t E()>), layout_variation_idx_delta_map) //gdef varstore retained varidx mapping HB_SUBSET_PLAN_MEMBER (hb_vector_t, gdef_varstore_inner_maps) -- cgit v1.2.3 From 5c6795e2701d7c2031bc3e7c6c1b356961350291 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 21 Sep 2023 12:04:03 -0700 Subject: [instancer] make GPOS depend on GDEF when partial instancing GPOS needs to wait for GDEF remapping layout var idxes --- src/hb-subset.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 2c0752170..229b1c308 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -461,6 +461,8 @@ _dependencies_satisfied (hb_subset_plan_t *plan, hb_tag_t tag, case HB_OT_TAG_vmtx: case HB_OT_TAG_maxp: return !plan->normalized_coords || !pending_subset_tags.has (HB_OT_TAG_glyf); + case HB_OT_TAG_GPOS: + return !plan->normalized_coords || plan->all_axes_pinned || !pending_subset_tags.has (HB_OT_TAG_GDEF); default: return true; } -- cgit v1.2.3 From f39e9bf1ed52140d2658b4d845f3bbacc215221b Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Mon, 25 Sep 2023 08:59:11 -0700 Subject: [instancer] instantiate GPOS Just need to update var_idxes and deltas --- src/OT/Layout/GDEF/GDEF.hh | 18 ++++++++++-------- src/OT/Layout/GPOS/AnchorFormat3.hh | 23 ++++++++++++++++++----- src/hb-ot-layout-common.hh | 4 ++-- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/OT/Layout/GDEF/GDEF.hh b/src/OT/Layout/GDEF/GDEF.hh index 62e0fb847..dd025c128 100644 --- a/src/OT/Layout/GDEF/GDEF.hh +++ b/src/OT/Layout/GDEF/GDEF.hh @@ -204,17 +204,19 @@ struct CaretValueFormat3 if (!c->serializer->embed (coordinate)) return_trace (false); unsigned varidx = (this+deviceTable).get_variation_index (); - if (c->plan->layout_variation_idx_delta_map.has (varidx)) + hb_pair_t *new_varidx_delta; + if (!c->plan->layout_variation_idx_delta_map.has (varidx, &new_varidx_delta)) + return_trace (false); + + uint32_t new_varidx = hb_first (*new_varidx_delta); + int delta = hb_second (*new_varidx_delta); + if (delta != 0) { - int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (varidx)); - if (delta != 0) - { - if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW)) - return_trace (false); - } + if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (false); } - if (c->plan->all_axes_pinned) + if (new_varidx == HB_OT_LAYOUT_NO_VARIATIONS_INDEX) return_trace (c->serializer->check_assign (out->caretValueFormat, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW)); if (!c->serializer->embed (deviceTable)) diff --git a/src/OT/Layout/GPOS/AnchorFormat3.hh b/src/OT/Layout/GPOS/AnchorFormat3.hh index 8684f60ca..56eda4a57 100644 --- a/src/OT/Layout/GPOS/AnchorFormat3.hh +++ b/src/OT/Layout/GPOS/AnchorFormat3.hh @@ -52,9 +52,14 @@ struct AnchorFormat3 if (unlikely (!c->serializer->embed (yCoordinate))) return_trace (false); unsigned x_varidx = xDeviceTable ? (this+xDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX; - if (c->plan->layout_variation_idx_delta_map.has (x_varidx)) + if (x_varidx != HB_OT_LAYOUT_NO_VARIATIONS_INDEX) { - int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (x_varidx)); + hb_pair_t *new_varidx_delta; + if (!c->plan->layout_variation_idx_delta_map.has (x_varidx, &new_varidx_delta)) + return_trace (false); + + x_varidx = hb_first (*new_varidx_delta); + int delta = hb_second (*new_varidx_delta); if (delta != 0) { if (!c->serializer->check_assign (out->xCoordinate, xCoordinate + delta, @@ -64,9 +69,14 @@ struct AnchorFormat3 } unsigned y_varidx = yDeviceTable ? (this+yDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX; - if (c->plan->layout_variation_idx_delta_map.has (y_varidx)) + if (y_varidx != HB_OT_LAYOUT_NO_VARIATIONS_INDEX) { - int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (y_varidx)); + hb_pair_t *new_varidx_delta; + if (!c->plan->layout_variation_idx_delta_map.has (y_varidx, &new_varidx_delta)) + return_trace (false); + + y_varidx = hb_first (*new_varidx_delta); + int delta = hb_second (*new_varidx_delta); if (delta != 0) { if (!c->serializer->check_assign (out->yCoordinate, yCoordinate + delta, @@ -75,7 +85,10 @@ struct AnchorFormat3 } } - if (c->plan->all_axes_pinned) + /* in case that all axes are pinned or no variations after instantiation, + * both var_idxes will be mapped to HB_OT_LAYOUT_NO_VARIATIONS_INDEX */ + if (x_varidx == HB_OT_LAYOUT_NO_VARIATIONS_INDEX && + y_varidx == HB_OT_LAYOUT_NO_VARIATIONS_INDEX) return_trace (c->serializer->check_assign (out->format, 1, HB_SERIALIZE_ERROR_INT_OVERFLOW)); if (!c->serializer->embed (xDeviceTable)) return_trace (false); diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 2146a1726..7125e99e4 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -3966,8 +3966,8 @@ struct VariationDevice auto *out = c->embed (this); if (unlikely (!out)) return_trace (nullptr); - unsigned new_idx = hb_first (*v); - out->varIdx = new_idx; + if (!c->check_assign (out->varIdx, hb_first (*v), HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return_trace (nullptr); return_trace (out); } -- cgit v1.2.3 From f9b04b2145a2021cc56868daca89c3514f6a8966 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 27 Sep 2023 09:36:52 -0700 Subject: [instancer] match fonttools'r order when calculating chars Also fix a bug, make sure map set is happening before std::move --- src/hb-ot-layout-common.hh | 6 ++++-- src/hb-ot-var-common.hh | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 7125e99e4..e869d8ece 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -2323,8 +2323,9 @@ struct delta_row_encoding_t bool long_words = false; /* 0/1/2 byte encoding */ - for (int v: row) + for (int i = row.length - 1; i >= 0; i--) { + int v = row.arrayZ[i]; if (v == 0) ret.push (0); else if (v > 32767 || v < -32768) @@ -2343,8 +2344,9 @@ struct delta_row_encoding_t /* redo, 0/2/4 bytes encoding */ ret.reset (); - for (int v: row) + for (int i = row.length - 1; i >= 0; i--) { + int v = row.arrayZ[i]; if (v == 0) ret.push (0); else if (v > 32767 || v < -32768) diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index ee6e35862..7a5227f1a 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -2039,10 +2039,10 @@ struct item_variations_t } else { + if (!chars_idx_map.set (chars, encoding_objs.length)) + return false; delta_row_encoding_t obj (std::move (chars), &row); encoding_objs.push (std::move (obj)); - if (!chars_idx_map.set (chars, encoding_objs.length - 1)) - return false; } } -- cgit v1.2.3 From 2415d5f23927cbfcd8a2928f7ecadf7e9626cd51 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 27 Sep 2023 13:33:09 -0700 Subject: [instancer] update tests to include GDEF/GPOS tables --- ...n-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 8432 -> 8728 bytes ...s.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 7336 -> 7612 bytes ...n-all-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 7484 -> 7592 bytes ...s.retain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 6848 -> 6956 bytes ...odepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf | Bin 4108 -> 4340 bytes ...ariations.retain-all-codepoint.wght=300-600.ttf | Bin 6616 -> 6848 bytes ...ariations.retain-all-codepoint.wght=500-800.ttf | Bin 7096 -> 7328 bytes ...ariations.retain-all-codepoint.wght=300-600.ttf | Bin 197056 -> 305092 bytes ...ariations.retain-all-codepoint.wght=500-800.ttf | Bin 145004 -> 250164 bytes .../profiles/no-tables-with-item-variations.txt | 2 +- 10 files changed, 1 insertion(+), 1 deletion(-) diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf index 0d9701714..3dbbb9106 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf index ef2b65b78..00dc29de3 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf index 2e34bb887..e8a85f463 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=200-300-500,wdth=80-90.ttf differ diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf index 95bf757e3..4fc562139 100644 Binary files a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf and b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.composite.no-tables-with-item-variations.retain-all-codepoint.wght=300-600,wdth=85.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf index 2cf4eb41b..78f0d69d4 100644 Binary files a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=200-600,wdth=80-90,CTGR=20-60.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf index d09940a82..8c5e3df5d 100644 Binary files a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf differ diff --git a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf index b1564ad81..fc18d5762 100644 Binary files a/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf and b/test/subset/data/expected/mvar_partial_instance/NotoSans-VF.abc.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf differ diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf index b26b28aa2..2c8f3e709 100644 Binary files a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf and b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=300-600.ttf differ diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf index c5d37c547..f50af5275 100644 Binary files a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf and b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.no-tables-with-item-variations.retain-all-codepoint.wght=500-800.ttf differ diff --git a/test/subset/data/profiles/no-tables-with-item-variations.txt b/test/subset/data/profiles/no-tables-with-item-variations.txt index d4ed0585e..d61fb717c 100644 --- a/test/subset/data/profiles/no-tables-with-item-variations.txt +++ b/test/subset/data/profiles/no-tables-with-item-variations.txt @@ -1 +1 @@ ---drop-tables+=GDEF,COLR,GPOS +--drop-tables+=COLR -- cgit v1.2.3 From 7cb7a7999b542cb4ae75a3d289a429a68df6a86a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 28 Sep 2023 09:24:06 -0600 Subject: [map] Fix undefined integer-overflow Fixes https://oss-fuzz.com/testcase-detail/5814850435284992 --- src/hb-map.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index 2b5bbfb1b..13d62054c 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -104,7 +104,7 @@ struct hb_hashmap_t hb_pair_t get_pair_ref() { return hb_pair_t (key, value); } uint32_t total_hash () const - { return (hash * 31) + hb_hash (value); } + { return (hash * 31u) + hb_hash (value); } static constexpr bool is_trivial = hb_is_trivially_constructible(K) && hb_is_trivially_destructible(K) && -- cgit v1.2.3 From 9ceb800ac26fd81a5eaf27ef366d5fce47e80447 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 28 Sep 2023 10:37:48 -0700 Subject: fuzzer fix https://oss-fuzz.com/testcase-detail/5842152921628672 Access TupleVariationData through blob, because we don't sanitize var_data --- src/hb-ot-var-cvar-table.hh | 7 ++++--- src/test-tuple-varstore.cc | 16 +++++++++++++++- ...testcase-minimized-hb-subset-fuzzer-5842152921628672 | Bin 0 -> 2501 bytes 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5842152921628672 diff --git a/src/hb-ot-var-cvar-table.hh b/src/hb-ot-var-cvar-table.hh index 0814940aa..381ae3c61 100644 --- a/src/hb-ot-var-cvar-table.hh +++ b/src/hb-ot-var-cvar-table.hh @@ -54,14 +54,14 @@ struct cvar bool decompile_tuple_variations (unsigned axis_count, unsigned point_count, + hb_blob_t *blob, bool is_gvar, const hb_map_t *axes_old_index_tag_map, TupleVariationData::tuple_variations_t& tuple_variations /* OUT */) const { hb_vector_t shared_indices; TupleVariationData::tuple_iterator_t iterator; - unsigned var_data_length = tupleVariationData.get_size (axis_count); - hb_bytes_t var_data_bytes = hb_bytes_t (reinterpret_cast (get_tuple_var_data ()), var_data_length); + hb_bytes_t var_data_bytes = blob->as_bytes ().sub_array (4); if (!TupleVariationData::get_tuple_iterator (var_data_bytes, axis_count, this, shared_indices, &iterator)) return false; @@ -151,7 +151,8 @@ struct cvar unsigned point_count = hb_blob_get_length (cvt_blob) / FWORD::static_size; hb_blob_destroy (cvt_blob); - if (!decompile_tuple_variations (axis_count, point_count, false, + if (!decompile_tuple_variations (axis_count, point_count, + c->source_blob, false, &(c->plan->axes_old_index_tag_map), tuple_variations)) return_trace (false); diff --git a/src/test-tuple-varstore.cc b/src/test-tuple-varstore.cc index f1286e749..e3787a243 100644 --- a/src/test-tuple-varstore.cc +++ b/src/test-tuple-varstore.cc @@ -39,7 +39,21 @@ test_decompile_cvar () axis_idx_tag_map.set (0, axis_tag); OT::TupleVariationData::tuple_variations_t tuple_variations; - bool result = cvar_table->decompile_tuple_variations (axis_count, point_count, false, &axis_idx_tag_map, tuple_variations); + hb_vector_t shared_indices; + OT::TupleVariationData::tuple_iterator_t iterator; + + const OT::TupleVariationData* tuple_var_data = reinterpret_cast (cvar_data + 4); + + unsigned len = strlen (cvar_data); + hb_bytes_t var_data_bytes{cvar_data+4, len - 4}; + bool result = OT::TupleVariationData::get_tuple_iterator (var_data_bytes, axis_count, cvar_table, + shared_indices, &iterator); + assert (result); + + result = tuple_var_data->decompile_tuple_variations (point_count, false, iterator, &axis_idx_tag_map, + shared_indices, hb_array (), + tuple_variations); + assert (result); assert (tuple_variations.tuple_vars.length == 2); for (unsigned i = 0; i < 2; i++) diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5842152921628672 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5842152921628672 new file mode 100644 index 000000000..c33e2b9ba Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5842152921628672 differ -- cgit v1.2.3 From 333946b00e849ff6722781bc5e46bd9fcc83311a Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 28 Sep 2023 19:02:37 +0000 Subject: [subset] Fix fuzzer timeout. Fixes https://oss-fuzz.com/testcase-detail/5458896606855168. Limit iteration over coverage in MarkLigPosFormat1 subsetting to the number of glyphs in the liga array. --- src/OT/Layout/GPOS/MarkLigPosFormat1.hh | 5 +++-- ...-testcase-minimized-hb-subset-fuzzer-5458896606855168 | Bin 0 -> 2410 bytes 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5458896606855168 diff --git a/src/OT/Layout/GPOS/MarkLigPosFormat1.hh b/src/OT/Layout/GPOS/MarkLigPosFormat1.hh index af8b4723a..d6bee277c 100644 --- a/src/OT/Layout/GPOS/MarkLigPosFormat1.hh +++ b/src/OT/Layout/GPOS/MarkLigPosFormat1.hh @@ -169,7 +169,7 @@ struct MarkLigPosFormat1_2 { TRACE_SUBSET (this); const hb_set_t &glyphset = *c->plan->glyphset_gsub (); - const hb_map_t &glyph_map = *c->plan->glyph_map; + const hb_map_t &glyph_map = c->plan->glyph_map_gsub; auto *out = c->serializer->start_embed (*this); if (unlikely (!c->serializer->extend_min (out))) return_trace (false); @@ -202,8 +202,9 @@ struct MarkLigPosFormat1_2 auto new_ligature_coverage = + hb_iter (this + ligatureCoverage) - | hb_filter (glyphset) + | hb_take ((this + ligatureArray).len) | hb_map_retains_sorting (glyph_map) + | hb_filter ([] (hb_codepoint_t glyph) { return glyph != HB_MAP_VALUE_INVALID; }) ; if (!out->ligatureCoverage.serialize_serialize (c->serializer, new_ligature_coverage)) diff --git a/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5458896606855168 b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5458896606855168 new file mode 100644 index 000000000..213b60fc2 Binary files /dev/null and b/test/fuzzing/fonts/clusterfuzz-testcase-minimized-hb-subset-fuzzer-5458896606855168 differ -- cgit v1.2.3 From f360d704fad6551dd05fe62bf9c4ce2f9a857e03 Mon Sep 17 00:00:00 2001 From: jfkthame Date: Fri, 29 Sep 2023 13:15:01 +0100 Subject: Check for closing quote in parse_tag Fixes #4414. --- src/hb-common.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-common.cc b/src/hb-common.cc index bd4cd88e3..0c13c7d17 100644 --- a/src/hb-common.cc +++ b/src/hb-common.cc @@ -815,7 +815,7 @@ parse_tag (const char **pp, const char *end, hb_tag_t *tag) } const char *p = *pp; - while (*pp < end && (**pp != ' ' && **pp != '=' && **pp != '[')) + while (*pp < end && (**pp != ' ' && **pp != '=' && **pp != '[' && **pp != quote)) (*pp)++; if (p == *pp || *pp - p > 4) -- cgit v1.2.3 From 6e06a193b3e6784b87380641d693fee1e507228e Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sat, 30 Sep 2023 01:12:16 +0300 Subject: Add some tests for hb_feature_[from|to]_string() --- test/api/test-common.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/test/api/test-common.c b/test/api/test-common.c index e9fae1351..f2ca82faa 100644 --- a/test/api/test-common.c +++ b/test/api/test-common.c @@ -210,6 +210,113 @@ test_types_language (void) g_assert (HB_LANGUAGE_INVALID != hb_language_get_default ()); } +static void +test_types_feature (void) +{ + hb_feature_t feature; + char buf[100]; + + g_assert (hb_feature_from_string ("abcd", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd", buf)); + + g_assert (hb_feature_from_string ("abcd=1", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd", buf)); + + g_assert (hb_feature_from_string ("+abcd", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd", buf)); + + g_assert (hb_feature_from_string ("abcd=0", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("-abcd", buf)); + + g_assert (hb_feature_from_string ("-abcd", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("-abcd", buf)); + + g_assert (hb_feature_from_string ("abcd=2", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd=2", buf)); + + g_assert (hb_feature_from_string ("+abcd=2", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd=2", buf)); + + g_assert (hb_feature_from_string ("-abcd=2", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd=2", buf)); + + g_assert (hb_feature_from_string ("\"abcd\" on", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd", buf)); + + g_assert (hb_feature_from_string ("\"abcd\" off", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("-abcd", buf)); + + g_assert (hb_feature_from_string ("\"abcd\" 1", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd", buf)); + + g_assert (hb_feature_from_string ("\"abcd\" 0", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("-abcd", buf)); + + g_assert (hb_feature_from_string ("\"abcd\" 2", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd=2", buf)); + + g_assert (hb_feature_from_string ("abcd[0]", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[]", buf)); + + g_assert (hb_feature_from_string ("abcd[1]", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[1]", buf)); + + g_assert (hb_feature_from_string ("abcd[1]=1", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[1]", buf)); + + g_assert (hb_feature_from_string ("abcd[1]=2", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[1]=2", buf)); + + g_assert (hb_feature_from_string ("abcd[1]=0", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("-abcd[1]", buf)); + + g_assert (hb_feature_from_string ("abcd[]", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd", buf)); + + g_assert (hb_feature_from_string ("abcd[:]", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd", buf)); + + g_assert (hb_feature_from_string ("abcd[1:]", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[1:]", buf)); + + g_assert (hb_feature_from_string ("abcd[:1]", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[]", buf)); + + g_assert (hb_feature_from_string ("abcd[1:3]", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[1:3]", buf)); + + g_assert (hb_feature_from_string ("abcd[1:2]=1", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[1]", buf)); + + g_assert (hb_feature_from_string ("abcd[1:4]=2", -1, &feature)); + hb_feature_to_string (&feature, buf, 100); + g_assert (0 == strcmp ("abcd[1:4]=2", buf)); +} + int main (int argc, char **argv) { @@ -220,6 +327,7 @@ main (int argc, char **argv) hb_test_add (test_types_tag); hb_test_add (test_types_script); hb_test_add (test_types_language); + hb_test_add (test_types_feature); return hb_test_run(); } -- cgit v1.2.3 From 2d67e52a47945e2563b12e681336ab9d04613aad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 10:47:40 +0000 Subject: Bump meson from 1.2.1 to 1.2.2 in /.ci Bumps [meson](https://github.com/mesonbuild/meson) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/mesonbuild/meson/releases) - [Commits](https://github.com/mesonbuild/meson/compare/1.2.1...1.2.2) --- updated-dependencies: - dependency-name: meson dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .ci/requirements.in | 2 +- .ci/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.ci/requirements.in b/.ci/requirements.in index 72fe69798..74371a1f4 100644 --- a/.ci/requirements.in +++ b/.ci/requirements.in @@ -1,4 +1,4 @@ -r requirements-fonttools.in -meson==1.2.1 +meson==1.2.2 gcovr==5.0 ninja diff --git a/.ci/requirements.txt b/.ci/requirements.txt index 173508e25..e76e2f5bf 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -179,9 +179,9 @@ markupsafe==2.1.3 \ --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 # via jinja2 -meson==1.2.1 \ - --hash=sha256:08f83fc17513e99cd6e82c7554c1f58af70425211887f8f9c7363b2a90209462 \ - --hash=sha256:b1db3a153087549497ee52b1c938d2134e0338214fe14f7efd16fecd57b639f5 +meson==1.2.2 \ + --hash=sha256:4a0f04de331fbc7af3b802a844fc8838f4ccd1ded1e792ba4f8f2faf8c5fe4d6 \ + --hash=sha256:6d0f9cb45aaf70bc032ecb894d5e22a512224b778837bc7e052588c7ce87571d # via -r requirements.in ninja==1.11.1 \ --hash=sha256:1c474326e11fba3f8c2582715d79216292e327d3335367c0e87e9647a002cc4a \ -- cgit v1.2.3 From 1522eb9199ed07b8fba9c3131806205834b0a18a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 10:48:02 +0000 Subject: Bump fonttools from 4.42.1 to 4.43.0 in /.ci Bumps [fonttools](https://github.com/fonttools/fonttools) from 4.42.1 to 4.43.0. - [Release notes](https://github.com/fonttools/fonttools/releases) - [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst) - [Commits](https://github.com/fonttools/fonttools/compare/4.42.1...4.43.0) --- updated-dependencies: - dependency-name: fonttools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .ci/requirements-fonttools.txt | 78 +++++++++++++++++++++++------------------- .ci/requirements.txt | 78 +++++++++++++++++++++++------------------- 2 files changed, 86 insertions(+), 70 deletions(-) diff --git a/.ci/requirements-fonttools.txt b/.ci/requirements-fonttools.txt index 754a2c844..11e89f174 100644 --- a/.ci/requirements-fonttools.txt +++ b/.ci/requirements-fonttools.txt @@ -4,39 +4,47 @@ # # pip-compile --generate-hashes .ci/requirements-fonttools.in # -fonttools==4.42.1 \ - --hash=sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64 \ - --hash=sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341 \ - --hash=sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca \ - --hash=sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a \ - --hash=sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e \ - --hash=sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35 \ - --hash=sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff \ - --hash=sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360 \ - --hash=sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d \ - --hash=sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967 \ - --hash=sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136 \ - --hash=sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40 \ - --hash=sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec \ - --hash=sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b \ - --hash=sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5 \ - --hash=sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd \ - --hash=sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861 \ - --hash=sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b \ - --hash=sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf \ - --hash=sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d \ - --hash=sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853 \ - --hash=sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71 \ - --hash=sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8 \ - --hash=sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd \ - --hash=sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249 \ - --hash=sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d \ - --hash=sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4 \ - --hash=sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760 \ - --hash=sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868 \ - --hash=sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa \ - --hash=sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c \ - --hash=sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c \ - --hash=sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0 \ - --hash=sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b +fonttools==4.43.0 \ + --hash=sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836 \ + --hash=sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38 \ + --hash=sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a \ + --hash=sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef \ + --hash=sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e \ + --hash=sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803 \ + --hash=sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f \ + --hash=sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe \ + --hash=sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92 \ + --hash=sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1 \ + --hash=sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7 \ + --hash=sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92 \ + --hash=sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662 \ + --hash=sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186 \ + --hash=sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da \ + --hash=sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c \ + --hash=sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69 \ + --hash=sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348 \ + --hash=sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb \ + --hash=sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213 \ + --hash=sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e \ + --hash=sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f \ + --hash=sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3 \ + --hash=sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3 \ + --hash=sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3 \ + --hash=sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646 \ + --hash=sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef \ + --hash=sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126 \ + --hash=sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce \ + --hash=sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9 \ + --hash=sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1 \ + --hash=sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a \ + --hash=sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e \ + --hash=sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84 \ + --hash=sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544 \ + --hash=sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465 \ + --hash=sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd \ + --hash=sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289 \ + --hash=sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384 \ + --hash=sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1 \ + --hash=sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64 \ + --hash=sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f # via -r requirements-fonttools.in diff --git a/.ci/requirements.txt b/.ci/requirements.txt index e76e2f5bf..925d55c2a 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -4,41 +4,49 @@ # # pip-compile --generate-hashes .ci/requirements.in # -fonttools==4.42.1 \ - --hash=sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64 \ - --hash=sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341 \ - --hash=sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca \ - --hash=sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a \ - --hash=sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e \ - --hash=sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35 \ - --hash=sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff \ - --hash=sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360 \ - --hash=sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d \ - --hash=sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967 \ - --hash=sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136 \ - --hash=sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40 \ - --hash=sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec \ - --hash=sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b \ - --hash=sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5 \ - --hash=sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd \ - --hash=sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861 \ - --hash=sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b \ - --hash=sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf \ - --hash=sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d \ - --hash=sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853 \ - --hash=sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71 \ - --hash=sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8 \ - --hash=sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd \ - --hash=sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249 \ - --hash=sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d \ - --hash=sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4 \ - --hash=sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760 \ - --hash=sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868 \ - --hash=sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa \ - --hash=sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c \ - --hash=sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c \ - --hash=sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0 \ - --hash=sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b +fonttools==4.43.0 \ + --hash=sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836 \ + --hash=sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38 \ + --hash=sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a \ + --hash=sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef \ + --hash=sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e \ + --hash=sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803 \ + --hash=sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f \ + --hash=sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe \ + --hash=sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92 \ + --hash=sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1 \ + --hash=sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7 \ + --hash=sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92 \ + --hash=sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662 \ + --hash=sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186 \ + --hash=sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da \ + --hash=sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c \ + --hash=sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69 \ + --hash=sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348 \ + --hash=sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb \ + --hash=sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213 \ + --hash=sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e \ + --hash=sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f \ + --hash=sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3 \ + --hash=sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3 \ + --hash=sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3 \ + --hash=sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646 \ + --hash=sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef \ + --hash=sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126 \ + --hash=sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce \ + --hash=sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9 \ + --hash=sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1 \ + --hash=sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a \ + --hash=sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e \ + --hash=sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84 \ + --hash=sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544 \ + --hash=sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465 \ + --hash=sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd \ + --hash=sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289 \ + --hash=sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384 \ + --hash=sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1 \ + --hash=sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64 \ + --hash=sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f # via -r requirements-fonttools.in gcovr==5.0 \ --hash=sha256:1d80264cbaadff356b3dda71b8c62b3aa803e5b3eb6d526a24932cd6660a2576 \ -- cgit v1.2.3 From f26fd69d858642d76413b8f4068eaf9b57c40a5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 10:06:40 +0000 Subject: Bump github/codeql-action from 2.21.8 to 2.21.9 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.21.8 to 2.21.9. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/6a28655e3dcb49cb0840ea372fd6d17733edd8a4...ddccb873888234080b77e9bc2d4764d5ccaaccf9) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 29add1e2b..b6b0e8649 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@6a28655e3dcb49cb0840ea372fd6d17733edd8a4 # v2.21.8 + uses: github/codeql-action/upload-sarif@ddccb873888234080b77e9bc2d4764d5ccaaccf9 # v2.21.9 with: sarif_file: results.sarif -- cgit v1.2.3 From a7b3fe3523891a81be501c907b6bf817615df174 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 5 Oct 2023 12:16:00 -0600 Subject: Fix test --- src/test-tuple-varstore.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test-tuple-varstore.cc b/src/test-tuple-varstore.cc index e3787a243..97fec25e7 100644 --- a/src/test-tuple-varstore.cc +++ b/src/test-tuple-varstore.cc @@ -44,7 +44,7 @@ test_decompile_cvar () const OT::TupleVariationData* tuple_var_data = reinterpret_cast (cvar_data + 4); - unsigned len = strlen (cvar_data); + unsigned len = sizeof (cvar_data); hb_bytes_t var_data_bytes{cvar_data+4, len - 4}; bool result = OT::TupleVariationData::get_tuple_iterator (var_data_bytes, axis_count, cvar_table, shared_indices, &iterator); -- cgit v1.2.3 From a317b5a7ea49c08e21a0e47beaaa5c31f52f28ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 10:06:13 +0000 Subject: Bump fonttools from 4.43.0 to 4.43.1 in /.ci Bumps [fonttools](https://github.com/fonttools/fonttools) from 4.43.0 to 4.43.1. - [Release notes](https://github.com/fonttools/fonttools/releases) - [Changelog](https://github.com/fonttools/fonttools/blob/main/NEWS.rst) - [Commits](https://github.com/fonttools/fonttools/compare/4.43.0...4.43.1) --- updated-dependencies: - dependency-name: fonttools dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .ci/requirements-fonttools.txt | 86 +++++++++++++++++++++--------------------- .ci/requirements.txt | 86 +++++++++++++++++++++--------------------- 2 files changed, 86 insertions(+), 86 deletions(-) diff --git a/.ci/requirements-fonttools.txt b/.ci/requirements-fonttools.txt index 11e89f174..508e384f9 100644 --- a/.ci/requirements-fonttools.txt +++ b/.ci/requirements-fonttools.txt @@ -4,47 +4,47 @@ # # pip-compile --generate-hashes .ci/requirements-fonttools.in # -fonttools==4.43.0 \ - --hash=sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836 \ - --hash=sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38 \ - --hash=sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a \ - --hash=sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef \ - --hash=sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e \ - --hash=sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803 \ - --hash=sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f \ - --hash=sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe \ - --hash=sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92 \ - --hash=sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1 \ - --hash=sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7 \ - --hash=sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92 \ - --hash=sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662 \ - --hash=sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186 \ - --hash=sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da \ - --hash=sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c \ - --hash=sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69 \ - --hash=sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348 \ - --hash=sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb \ - --hash=sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213 \ - --hash=sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e \ - --hash=sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f \ - --hash=sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3 \ - --hash=sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3 \ - --hash=sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3 \ - --hash=sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646 \ - --hash=sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef \ - --hash=sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126 \ - --hash=sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce \ - --hash=sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9 \ - --hash=sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1 \ - --hash=sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a \ - --hash=sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e \ - --hash=sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84 \ - --hash=sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544 \ - --hash=sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465 \ - --hash=sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd \ - --hash=sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289 \ - --hash=sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384 \ - --hash=sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1 \ - --hash=sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64 \ - --hash=sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f +fonttools==4.43.1 \ + --hash=sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad \ + --hash=sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c \ + --hash=sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba \ + --hash=sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212 \ + --hash=sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86 \ + --hash=sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477 \ + --hash=sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f \ + --hash=sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef \ + --hash=sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02 \ + --hash=sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860 \ + --hash=sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72 \ + --hash=sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3 \ + --hash=sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b \ + --hash=sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184 \ + --hash=sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7 \ + --hash=sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5 \ + --hash=sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9 \ + --hash=sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7 \ + --hash=sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b \ + --hash=sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933 \ + --hash=sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0 \ + --hash=sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6 \ + --hash=sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8 \ + --hash=sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c \ + --hash=sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590 \ + --hash=sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215 \ + --hash=sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680 \ + --hash=sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8 \ + --hash=sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0 \ + --hash=sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b \ + --hash=sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca \ + --hash=sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3 \ + --hash=sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6 \ + --hash=sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13 \ + --hash=sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204 \ + --hash=sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f \ + --hash=sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273 \ + --hash=sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b \ + --hash=sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd \ + --hash=sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a \ + --hash=sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d \ + --hash=sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896 # via -r requirements-fonttools.in diff --git a/.ci/requirements.txt b/.ci/requirements.txt index 925d55c2a..5048254a9 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -4,49 +4,49 @@ # # pip-compile --generate-hashes .ci/requirements.in # -fonttools==4.43.0 \ - --hash=sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836 \ - --hash=sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38 \ - --hash=sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a \ - --hash=sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef \ - --hash=sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e \ - --hash=sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803 \ - --hash=sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f \ - --hash=sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe \ - --hash=sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92 \ - --hash=sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1 \ - --hash=sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7 \ - --hash=sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92 \ - --hash=sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662 \ - --hash=sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186 \ - --hash=sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da \ - --hash=sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c \ - --hash=sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69 \ - --hash=sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348 \ - --hash=sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb \ - --hash=sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213 \ - --hash=sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e \ - --hash=sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f \ - --hash=sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3 \ - --hash=sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3 \ - --hash=sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3 \ - --hash=sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646 \ - --hash=sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef \ - --hash=sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126 \ - --hash=sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce \ - --hash=sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9 \ - --hash=sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1 \ - --hash=sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a \ - --hash=sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e \ - --hash=sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84 \ - --hash=sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544 \ - --hash=sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465 \ - --hash=sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd \ - --hash=sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289 \ - --hash=sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384 \ - --hash=sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1 \ - --hash=sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64 \ - --hash=sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f +fonttools==4.43.1 \ + --hash=sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad \ + --hash=sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c \ + --hash=sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba \ + --hash=sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212 \ + --hash=sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86 \ + --hash=sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477 \ + --hash=sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f \ + --hash=sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef \ + --hash=sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02 \ + --hash=sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860 \ + --hash=sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72 \ + --hash=sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3 \ + --hash=sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b \ + --hash=sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184 \ + --hash=sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7 \ + --hash=sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5 \ + --hash=sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9 \ + --hash=sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7 \ + --hash=sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b \ + --hash=sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933 \ + --hash=sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0 \ + --hash=sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6 \ + --hash=sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8 \ + --hash=sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c \ + --hash=sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590 \ + --hash=sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215 \ + --hash=sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680 \ + --hash=sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8 \ + --hash=sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0 \ + --hash=sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b \ + --hash=sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca \ + --hash=sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3 \ + --hash=sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6 \ + --hash=sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13 \ + --hash=sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204 \ + --hash=sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f \ + --hash=sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273 \ + --hash=sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b \ + --hash=sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd \ + --hash=sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a \ + --hash=sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d \ + --hash=sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896 # via -r requirements-fonttools.in gcovr==5.0 \ --hash=sha256:1d80264cbaadff356b3dda71b8c62b3aa803e5b3eb6d526a24932cd6660a2576 \ -- cgit v1.2.3 From 0cfc4ebfbade5b794956f0eae3939e7b1fade2b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 10:34:36 +0000 Subject: Bump github/codeql-action from 2.21.9 to 2.22.0 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.21.9 to 2.22.0. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/ddccb873888234080b77e9bc2d4764d5ccaaccf9...2cb752a87e96af96708ab57187ab6372ee1973ab) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index b6b0e8649..fcb125edd 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@ddccb873888234080b77e9bc2d4764d5ccaaccf9 # v2.21.9 + uses: github/codeql-action/upload-sarif@2cb752a87e96af96708ab57187ab6372ee1973ab # v2.22.0 with: sarif_file: results.sarif -- cgit v1.2.3 From cf930decce6cffabff55a8a314eb7f9f34cff322 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 10:34:42 +0000 Subject: Bump actions/setup-python from 4.7.0 to 4.7.1 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4.7.0 to 4.7.1. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/61a6322f88396a6271a6ee3565807d608ecaddd1...65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/msvc-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/msvc-ci.yml b/.github/workflows/msvc-ci.yml index ac6c68bc9..82ee4c223 100644 --- a/.github/workflows/msvc-ci.yml +++ b/.github/workflows/msvc-ci.yml @@ -35,7 +35,7 @@ jobs: variant: sccache key: ${{ github.job }}-${{ matrix.os }}-${{ matrix.ARCH }} - name: Setup Python - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4.7.0 + uses: actions/setup-python@65d7f2d534ac1bc67fcd62888c5f4f3d2cb2b236 # v4.7.1 with: python-version: '3.x' - name: Setup MSVC -- cgit v1.2.3 From 9648799e53edae7072505849fb551a6e621b8f6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Oct 2023 10:34:48 +0000 Subject: Bump ossf/scorecard-action from 2.2.0 to 2.3.0 Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.2.0 to 2.3.0. - [Release notes](https://github.com/ossf/scorecard-action/releases) - [Changelog](https://github.com/ossf/scorecard-action/blob/main/RELEASE.md) - [Commits](https://github.com/ossf/scorecard-action/compare/08b4669551908b1024bb425080c797723083c031...483ef80eb98fb506c348f7d62e28055e49fe2398) --- updated-dependencies: - dependency-name: ossf/scorecard-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index fcb125edd..f921a4329 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -34,7 +34,7 @@ jobs: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@08b4669551908b1024bb425080c797723083c031 # v2.2.0 + uses: ossf/scorecard-action@483ef80eb98fb506c348f7d62e28055e49fe2398 # v2.3.0 with: results_file: results.sarif results_format: sarif -- cgit v1.2.3 From bbd53fcfa49e9d4a8b3899ce2c109377886a3ba9 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 10 Oct 2023 21:41:42 +0000 Subject: Remove glyph_map test that uses retain gids. We no longer allow the use of glyph map + retain gids (see: https://github.com/harfbuzz/harfbuzz/blob/main/src/hb-subset-plan.cc#L817). Also add the test to the meson file so it will be run by default. --- test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ...gular.glyph_map_roboto_retain_gids.41,43,61,66,69.ttf | Bin 7936 -> 0 bytes .../data/profiles/glyph_map_roboto_retain_gids.txt | 4 ---- test/subset/data/tests/glyph_map.tests | 1 - test/subset/meson.build | 1 + 6 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 test/subset/data/expected/glyph_map/Roboto-Regular.glyph_map_roboto_retain_gids.41,43,61,66,69.ttf delete mode 100644 test/subset/data/profiles/glyph_map_roboto_retain_gids.txt diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 980bddb07..9a7d08ce0 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -56,6 +56,7 @@ EXTRA_DIST += \ expected/cbdt \ expected/variable \ expected/glyph_names \ + expected/glyph_map \ expected/math \ expected/math_coverage_offset \ expected/post \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 919ec7391..398f2b82a 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -47,6 +47,7 @@ TESTS = \ tests/sbix.tests \ tests/variable.tests \ tests/glyph_names.tests \ + tests/glyph_map.tests \ tests/math.tests \ tests/math_coverage_offset.tests \ tests/post.tests \ diff --git a/test/subset/data/expected/glyph_map/Roboto-Regular.glyph_map_roboto_retain_gids.41,43,61,66,69.ttf b/test/subset/data/expected/glyph_map/Roboto-Regular.glyph_map_roboto_retain_gids.41,43,61,66,69.ttf deleted file mode 100644 index f63599984..000000000 Binary files a/test/subset/data/expected/glyph_map/Roboto-Regular.glyph_map_roboto_retain_gids.41,43,61,66,69.ttf and /dev/null differ diff --git a/test/subset/data/profiles/glyph_map_roboto_retain_gids.txt b/test/subset/data/profiles/glyph_map_roboto_retain_gids.txt deleted file mode 100644 index 77a513cbb..000000000 --- a/test/subset/data/profiles/glyph_map_roboto_retain_gids.txt +++ /dev/null @@ -1,4 +0,0 @@ ---gid-map=37:37,39:39,69:69,74:74,77:77,444:444,446:446,561:561,563:563 ---gids=444,446,561,563 ---layout-features+=c2sc ---retain-gids diff --git a/test/subset/data/tests/glyph_map.tests b/test/subset/data/tests/glyph_map.tests index d222aceee..f2a3d17f4 100644 --- a/test/subset/data/tests/glyph_map.tests +++ b/test/subset/data/tests/glyph_map.tests @@ -3,7 +3,6 @@ Roboto-Regular.ttf PROFILES: glyph_map_roboto.txt -glyph_map_roboto_retain_gids.txt SUBSETS: ACafi diff --git a/test/subset/meson.build b/test/subset/meson.build index 9c994236b..827528a51 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -50,6 +50,7 @@ tests = [ 'cbdt', 'variable', 'glyph_names', + 'glyph_map', 'post', '32bit_var_store', 'pin_all_at_default', -- cgit v1.2.3 From 1f395cbaf91be284f443c27b8b35be0edd788c34 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 12 Oct 2023 10:06:00 -0700 Subject: [instancer] templatize the priority queue, use custom type for varstore when instantiating varstore, we need to pop a tuple like (combined_gain, i, j), if combined gain is the same then we compare the value of i, and then j. So we'd like to use custom type as the key when popping from the queue. This would match fonttool's algorithm cause it uses heappop(). --- src/graph/graph.hh | 4 ++-- src/hb-ot-var-common.hh | 47 ++++++++++++++++++++++++++++++++++------------ src/hb-priority-queue.hh | 5 +++-- src/test-priority-queue.cc | 4 ++-- 4 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 49424488e..2b4e1b2d3 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh @@ -566,7 +566,7 @@ struct graph_t update_distances (); - hb_priority_queue_t queue; + hb_priority_queue_t queue; hb_vector_t &sorted_graph = vertices_scratch_; if (unlikely (!check_success (sorted_graph.resize (vertices_.length)))) return; hb_vector_t id_map; @@ -1369,7 +1369,7 @@ struct graph_t vertices_.arrayZ[i].distance = hb_int_max (int64_t); vertices_.tail ().distance = 0; - hb_priority_queue_t queue; + hb_priority_queue_t queue; queue.insert (0, vertices_.length - 1); hb_vector_t visited; diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh index 7a5227f1a..b6fe13f11 100644 --- a/src/hb-ot-var-common.hh +++ b/src/hb-ot-var-common.hh @@ -1938,6 +1938,35 @@ struct item_variations_t /* main algorithm ported from fonttools VarStore_optimize() method, optimize * varstore by default */ + + struct combined_gain_idx_tuple_t + { + int gain; + unsigned idx_1; + unsigned idx_2; + + combined_gain_idx_tuple_t () = default; + combined_gain_idx_tuple_t (int gain_, unsigned i, unsigned j) + :gain (gain_), idx_1 (i), idx_2 (j) {} + + bool operator < (const combined_gain_idx_tuple_t& o) + { + if (gain != o.gain) + return gain < o.gain; + + if (idx_1 != o.idx_1) + return idx_1 < o.idx_1; + + return idx_2 < o.idx_2; + } + + bool operator <= (const combined_gain_idx_tuple_t& o) + { + if (*this < o) return true; + return gain == o.gain && idx_1 == o.idx_1 && idx_2 == o.idx_2; + } + }; + bool as_item_varstore (bool optimize=true, bool use_no_variation_idx=true) { if (!region_list) return false; @@ -2058,7 +2087,7 @@ struct item_variations_t /* main algorithm: repeatedly pick 2 best encodings to combine, and combine * them */ - hb_priority_queue_t queue; + hb_priority_queue_t queue; unsigned num_todos = encoding_objs.length; for (unsigned i = 0; i < num_todos; i++) { @@ -2066,19 +2095,16 @@ struct item_variations_t { int combining_gain = encoding_objs.arrayZ[i].gain_from_merging (encoding_objs.arrayZ[j]); if (combining_gain > 0) - { - unsigned val = (i << 16) + j; - queue.insert (-combining_gain, val); - } + queue.insert (combined_gain_idx_tuple_t (-combining_gain, i, j), 0); } } hb_set_t removed_todo_idxes; while (queue) { - unsigned val = queue.pop_minimum ().second; - unsigned j = val & 0xFFFF; - unsigned i = (val >> 16) & 0xFFFF; + auto t = queue.pop_minimum ().first; + unsigned i = t.idx_1; + unsigned j = t.idx_2; if (removed_todo_idxes.has (i) || removed_todo_idxes.has (j)) continue; @@ -2119,10 +2145,7 @@ struct item_variations_t int combined_gain = combined_encoding_obj.gain_from_merging (obj); if (combined_gain > 0) - { - unsigned val = (idx << 16) + encoding_objs.length; - queue.insert (-combined_gain, val); - } + queue.insert (combined_gain_idx_tuple_t (-combined_gain, idx, encoding_objs.length), 0); } encoding_objs.push (std::move (combined_encoding_obj)); diff --git a/src/hb-priority-queue.hh b/src/hb-priority-queue.hh index baac7e1e6..2c8ccbfb6 100644 --- a/src/hb-priority-queue.hh +++ b/src/hb-priority-queue.hh @@ -42,10 +42,11 @@ * priority of its children. The heap is stored in an array, with the * children of node i stored at indices 2i + 1 and 2i + 2. */ +template struct hb_priority_queue_t { private: - typedef hb_pair_t item_t; + typedef hb_pair_t item_t; hb_vector_t heap; public: @@ -57,7 +58,7 @@ struct hb_priority_queue_t #ifndef HB_OPTIMIZE_SIZE HB_ALWAYS_INLINE #endif - void insert (int64_t priority, unsigned value) + void insert (K priority, unsigned value) { heap.push (item_t (priority, value)); if (unlikely (heap.in_error ())) return; diff --git a/src/test-priority-queue.cc b/src/test-priority-queue.cc index e83d72c7e..67ee5ee4c 100644 --- a/src/test-priority-queue.cc +++ b/src/test-priority-queue.cc @@ -30,7 +30,7 @@ static void test_insert () { - hb_priority_queue_t queue; + hb_priority_queue_t queue; assert (queue.is_empty ()); queue.insert (10, 0); @@ -53,7 +53,7 @@ test_insert () static void test_extract () { - hb_priority_queue_t queue; + hb_priority_queue_t queue; queue.insert (0, 0); queue.insert (60, 6); queue.insert (30, 3); -- cgit v1.2.3 From 397b32e585cbb29349e0e97fad2e84cb57a9a6d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 10:29:00 +0000 Subject: Bump github/codeql-action from 2.22.0 to 2.22.3 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.22.0 to 2.22.3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/2cb752a87e96af96708ab57187ab6372ee1973ab...0116bc2df50751f9724a2e35ef1f24d22f90e4e1) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index f921a4329..cc1362e47 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,6 +59,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@2cb752a87e96af96708ab57187ab6372ee1973ab # v2.22.0 + uses: github/codeql-action/upload-sarif@0116bc2df50751f9724a2e35ef1f24d22f90e4e1 # v2.22.3 with: sarif_file: results.sarif -- cgit v1.2.3 From 4992456cfadabb6ecbc7b4efc5c1af9ec91f6dd3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Oct 2023 10:07:42 +0000 Subject: Bump ninja from 1.11.1 to 1.11.1.1 in /.ci Bumps [ninja](https://github.com/ninja-build/ninja) from 1.11.1 to 1.11.1.1. - [Release notes](https://github.com/ninja-build/ninja/releases) - [Commits](https://github.com/ninja-build/ninja/commits) --- updated-dependencies: - dependency-name: ninja dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .ci/requirements.txt | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/.ci/requirements.txt b/.ci/requirements.txt index 5048254a9..d8881c452 100644 --- a/.ci/requirements.txt +++ b/.ci/requirements.txt @@ -191,24 +191,22 @@ meson==1.2.2 \ --hash=sha256:4a0f04de331fbc7af3b802a844fc8838f4ccd1ded1e792ba4f8f2faf8c5fe4d6 \ --hash=sha256:6d0f9cb45aaf70bc032ecb894d5e22a512224b778837bc7e052588c7ce87571d # via -r requirements.in -ninja==1.11.1 \ - --hash=sha256:1c474326e11fba3f8c2582715d79216292e327d3335367c0e87e9647a002cc4a \ - --hash=sha256:3329b4b7c1694730772522a3ba0ba40fd15c012476ed3e1c9f0fd9e76190394e \ - --hash=sha256:34753459493543782d87267e4cad63dd4639b07f8394ffe6d4417e9eda05c8a8 \ - --hash=sha256:3b28b595ed580752240ade7821b6cb7a5a4c6a604c865dc474bd38f06e2eb7f5 \ - --hash=sha256:4e547bc759c570773d83d110c41fd5ca9a94c0a9a8388f5a3ea37bdf97d002b0 \ - --hash=sha256:60179bb4f22c88279c53a5402bb5fe81c97c627a28d93c737d1fa067d892115d \ - --hash=sha256:642cb64d859276998f14972724850e0c5b7febbc1bce3d2065b7e0cb7d3a0b79 \ - --hash=sha256:6f6465a7efe6473a2a34edab83633594de19d59406a727316e1367ebcc528908 \ - --hash=sha256:779f228e407c54a8b6e4cbf8f835489998dd250f67bf1b9bd7b8a8ab6bdcdc7b \ - --hash=sha256:817e2aee2a4d28a708a67bcfba1817ae502c32c6d8ef80e50d63b0f23adf3a08 \ - --hash=sha256:8cf96f92ccc851c600cb3e1251c34db06f1dd682de79188ad490c33cddc66981 \ - --hash=sha256:a7a564fe755ddfbdbccb07b0b758e3f8460e5f8ba1adaab40a5eaa2f8c01ce68 \ - --hash=sha256:ba50a32424912e5f3ee40d791b506a160dc0eeda7de5ad8faebe7aa8006244dc \ - --hash=sha256:c833a47d39b2d1eee3f9ca886fa1581efd5be6068b82734ac229961ee8748f90 \ - --hash=sha256:df11b8afea0501883e33faeb1c43d2ef67f466d5f4bd85f9c376e9a93a43a277 \ - --hash=sha256:edec1053e141253076b2df7ec03a246ff581e9270aa1ca9759397b21e2760e57 \ - --hash=sha256:f48c3c6eea204062f6bbf089dfc63e1ad41a08640e1da46ef2b30fa426f7ce23 +ninja==1.11.1.1 \ + --hash=sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd \ + --hash=sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a \ + --hash=sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee \ + --hash=sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f \ + --hash=sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a \ + --hash=sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249 \ + --hash=sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885 \ + --hash=sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b \ + --hash=sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1 \ + --hash=sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c \ + --hash=sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205 \ + --hash=sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef \ + --hash=sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea \ + --hash=sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877 \ + --hash=sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082 # via -r requirements.in pygments==2.15.1 \ --hash=sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c \ -- cgit v1.2.3 From 6190bb0b8ed8af3d182d1936fbe859c15fb0f817 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 16 Oct 2023 14:08:31 -0400 Subject: [layout] Change order of feature collection See comments for rationale. Fixes https://github.com/harfbuzz/harfbuzz/issues/4445 --- src/hb-ot-layout.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 5ce36693a..2eb8535db 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -1308,11 +1308,16 @@ hb_ot_layout_collect_features_map (hb_face_t *face, unsigned int count = l.get_feature_indexes (0, nullptr, nullptr); feature_map->alloc (count); - for (unsigned int i = 0; i < count; i++) + /* Loop in reverse, such that earlier entries win. That emulates + * a linear search, which seems to be what other implementations do. + * We found that with arialuni_t.ttf, the "ur" language system has + * duplicate features, and the earlier ones work but not later ones. + */ + for (unsigned int i = count; i; i--) { unsigned feature_index = 0; unsigned feature_count = 1; - l.get_feature_indexes (i, &feature_count, &feature_index); + l.get_feature_indexes (i - 1, &feature_count, &feature_index); if (!feature_count) break; hb_tag_t feature_tag = g.get_feature_tag (feature_index); -- cgit v1.2.3 From 52bc78e70de9f8288e3412a8017f88d2e0a31dea Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 10 Oct 2023 21:44:52 +0000 Subject: s/PairPos/MarkBasePos/ in MarkBasePos repacking implementation. --- src/graph/markbasepos-graph.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/graph/markbasepos-graph.hh b/src/graph/markbasepos-graph.hh index e10e1cf3e..ae5ebd0d1 100644 --- a/src/graph/markbasepos-graph.hh +++ b/src/graph/markbasepos-graph.hh @@ -217,7 +217,7 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2::min_size + + OT::Layout::GPOS_impl::MarkBasePosFormat1_2::min_size + MarkArray::min_size + AnchorMatrix::min_size + c.graph.vertices_[base_coverage_id].table_size (); @@ -484,7 +484,7 @@ struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index); #ifndef HB_NO_BEYOND_64K case 2: HB_FALLTHROUGH; - // Don't split 24bit PairPos's. + // Don't split 24bit MarkBasePos's. #endif default: return hb_vector_t (); -- cgit v1.2.3 From 18a6e78549e8e04a281129ea8ca784ce85f111b8 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Wed, 18 Oct 2023 01:10:44 +0300 Subject: 8.2.2 --- NEWS | 11 +++++++++++ configure.ac | 2 +- meson.build | 2 +- src/hb-version.h | 4 ++-- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 626dafe9a..9154938d7 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,14 @@ +Overview of changes leading to 8.2.2 +Wednesday, October 18, 2023 +“From the river to the sea, Palestine will be free” +==================================== +- Fix regression from 8.1.0 in shaping fonts with duplicate feature tags. +- Fix regression from 8.2.0 in parsing CSS-style feature strings. +- Variable fonts instanciation now handles more tables. +- Various CMake build improvements. +- various fixes to build without errors with gcc 4.9.2. + + Overview of changes leading to 8.2.1 Monday, September 18, 2023 ==================================== diff --git a/configure.ac b/configure.ac index eece69107..fbcd25747 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ([2.64]) AC_INIT([HarfBuzz], - [8.2.1], + [8.2.2], [https://github.com/harfbuzz/harfbuzz/issues/new], [harfbuzz], [http://harfbuzz.org/]) diff --git a/meson.build b/meson.build index fc0892bd4..05ab1abb9 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('harfbuzz', 'c', 'cpp', meson_version: '>= 0.55.0', - version: '8.2.1', + version: '8.2.2', default_options: [ 'cpp_eh=none', # Just to support msvc, we are passing -fno-exceptions also anyway # 'cpp_rtti=false', # Do NOT enable, wraps inherit it and ICU needs RTTI diff --git a/src/hb-version.h b/src/hb-version.h index 73fa16cd8..cd7257e45 100644 --- a/src/hb-version.h +++ b/src/hb-version.h @@ -53,14 +53,14 @@ HB_BEGIN_DECLS * * The micro component of the library version available at compile-time. */ -#define HB_VERSION_MICRO 1 +#define HB_VERSION_MICRO 2 /** * HB_VERSION_STRING: * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "8.2.1" +#define HB_VERSION_STRING "8.2.2" /** * HB_VERSION_ATLEAST: -- cgit v1.2.3